Compare commits
	
		
			33 Commits
		
	
	
		
			citadel-43
			...
			gtk3-ci
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					a6783692c5 | ||
| 
						 | 
					1c27b68bcc | ||
| 
						 | 
					717c05a288 | ||
| 
						 | 
					e68604b1aa | ||
| 
						 | 
					0368ad29e9 | ||
| 
						 | 
					b982ce394e | ||
| 
						 | 
					025647f585 | ||
| 
						 | 
					7125b726ad | ||
| 
						 | 
					aebfab7207 | ||
| 
						 | 
					698bd5b3a9 | ||
| 
						 | 
					51e9f19f2f | ||
| 
						 | 
					6d38a4a7b3 | ||
| 
						 | 
					dfcc5ffb1e | ||
| 
						 | 
					8b80a4cf4d | ||
| 
						 | 
					01e894c028 | ||
| 
						 | 
					856adfd1f1 | ||
| 
						 | 
					efee3aa749 | ||
| 
						 | 
					15e72da648 | ||
| 
						 | 
					3f8bd1db25 | ||
| 
						 | 
					3a863ee341 | ||
| 
						 | 
					654a7af929 | ||
| 
						 | 
					8dd9cbac7f | ||
| 
						 | 
					331db650dd | ||
| 
						 | 
					428d38179d | ||
| 
						 | 
					fe9708ebd8 | ||
| 
						 | 
					8398769321 | ||
| 
						 | 
					768c08ba9d | ||
| 
						 | 
					69426cbfda | ||
| 
						 | 
					9f968e7378 | ||
| 
						 | 
					1ab5e6973a | ||
| 
						 | 
					1dea3341ec | ||
| 
						 | 
					8fda054dc5 | ||
| 
						 | 
					e989684602 | 
@@ -1,8 +1,3 @@
 | 
			
		||||
extends:
 | 
			
		||||
 - ./lint/eslintrc-gjs.yml
 | 
			
		||||
 - ./lint/eslintrc-shell.yml
 | 
			
		||||
overrides:
 | 
			
		||||
  - files:
 | 
			
		||||
      - js/ui/init.js
 | 
			
		||||
    parserOptions:
 | 
			
		||||
      sourceType: module
 | 
			
		||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -60,6 +60,7 @@ src/calendar-server/evolution-calendar.desktop
 | 
			
		||||
src/calendar-server/org.gnome.Shell.CalendarServer.service
 | 
			
		||||
src/gnome-shell
 | 
			
		||||
src/gnome-shell-calendar-server
 | 
			
		||||
src/gnome-shell-extension-prefs
 | 
			
		||||
src/gnome-shell-extension-tool
 | 
			
		||||
src/gnome-shell-hotplug-sniffer
 | 
			
		||||
src/gnome-shell-perf-helper
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										378
									
								
								.gitlab-ci.yml
									
									
									
									
									
								
							
							
						
						@@ -1,289 +1,137 @@
 | 
			
		||||
include:
 | 
			
		||||
  - remote: 'https://gitlab.gnome.org/GNOME/citemplates/raw/HEAD/flatpak/flatpak_ci_initiative.yml'
 | 
			
		||||
  - remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/34f4ade99434043f88e164933f570301fd18b125/templates/fedora.yml'
 | 
			
		||||
  - remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/34f4ade99434043f88e164933f570301fd18b125/templates/ci-fairy.yml'
 | 
			
		||||
include: 'https://gitlab.gnome.org/GNOME/citemplates/raw/master/flatpak/flatpak_ci_initiative.yml'
 | 
			
		||||
 | 
			
		||||
stages:
 | 
			
		||||
  - pre_review
 | 
			
		||||
  - prep
 | 
			
		||||
  - review
 | 
			
		||||
  - build
 | 
			
		||||
  - test
 | 
			
		||||
  - analyze
 | 
			
		||||
  - deploy
 | 
			
		||||
 | 
			
		||||
default:
 | 
			
		||||
  image: registry.gitlab.gnome.org/gnome/mutter/fedora/36:x86_64-2022-09-01.0
 | 
			
		||||
  # Cancel jobs if newer commits are pushed to the branch
 | 
			
		||||
  interruptible: true
 | 
			
		||||
  # Auto-retry jobs in case of infra failures
 | 
			
		||||
  retry:
 | 
			
		||||
    max: 1
 | 
			
		||||
    when:
 | 
			
		||||
      - 'runner_system_failure'
 | 
			
		||||
      - 'stuck_or_timeout_failure'
 | 
			
		||||
      - 'scheduler_failure'
 | 
			
		||||
      - 'api_failure'
 | 
			
		||||
 - review
 | 
			
		||||
 - build
 | 
			
		||||
 - test
 | 
			
		||||
 - deploy
 | 
			
		||||
 | 
			
		||||
variables:
 | 
			
		||||
  FDO_UPSTREAM_REPO: GNOME/gnome-shell
 | 
			
		||||
  BUNDLE: "extensions-git.flatpak"
 | 
			
		||||
  JS_LOG: "js-report.txt"
 | 
			
		||||
  LINT_LOG: "eslint-report.xml"
 | 
			
		||||
  LINT_MR_LOG: "eslint-mr-report.xml"
 | 
			
		||||
    BUNDLE: "extensions-git.flatpak"
 | 
			
		||||
    JS_LOG: "js-report.txt"
 | 
			
		||||
    POT_LOG: "pot-update.txt"
 | 
			
		||||
 | 
			
		||||
workflow:
 | 
			
		||||
  rules:
 | 
			
		||||
    - if: '$CI_MERGE_REQUEST_IID'
 | 
			
		||||
    - if: '$CI_COMMIT_TAG'
 | 
			
		||||
    - if: '$CI_COMMIT_BRANCH'
 | 
			
		||||
 | 
			
		||||
.pipeline_guard: &pipeline_guard
 | 
			
		||||
  rules:
 | 
			
		||||
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
 | 
			
		||||
    - if: '$CI_COMMIT_TAG'
 | 
			
		||||
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
 | 
			
		||||
    - if: '$CI_COMMIT_BRANCH =~ /^gnome-[0-9-]+$/'
 | 
			
		||||
    - when: 'manual'
 | 
			
		||||
 | 
			
		||||
.gnome-shell.fedora:35:
 | 
			
		||||
  variables:
 | 
			
		||||
    FDO_DISTRIBUTION_VERSION: 35
 | 
			
		||||
    FDO_DISTRIBUTION_TAG: '2022-01-18.0'
 | 
			
		||||
    FDO_DISTRIBUTION_PACKAGES:
 | 
			
		||||
      findutils
 | 
			
		||||
      mozjs91-devel
 | 
			
		||||
      nodejs
 | 
			
		||||
      npm
 | 
			
		||||
      meson
 | 
			
		||||
      pkgconfig(gio-2.0)
 | 
			
		||||
      pkgconfig(gio-unix-2.0)
 | 
			
		||||
      pkgconfig(gnome-autoar-0)
 | 
			
		||||
      pkgconfig(json-glib-1.0)
 | 
			
		||||
    FDO_DISTRIBUTION_EXEC: |
 | 
			
		||||
      # For static analysis with eslint
 | 
			
		||||
      npm install -g eslint eslint-plugin-jsdoc &&
 | 
			
		||||
 | 
			
		||||
      dnf group install -y 'Development Tools' \
 | 
			
		||||
                 'C Development Tools and Libraries' &&
 | 
			
		||||
 | 
			
		||||
      ./.gitlab-ci/install-meson-project.sh \
 | 
			
		||||
        -Dman=false \
 | 
			
		||||
        https://gitlab.gnome.org/GNOME/gnome-shell.git \
 | 
			
		||||
        main \
 | 
			
		||||
        subprojects/extensions-tool/ \
 | 
			
		||||
        ./generate-translations.sh &&
 | 
			
		||||
 | 
			
		||||
      dnf clean all
 | 
			
		||||
.only_default: &only_default
 | 
			
		||||
    only:
 | 
			
		||||
        - branches
 | 
			
		||||
        - tags
 | 
			
		||||
        - merge_requests
 | 
			
		||||
 | 
			
		||||
check_commit_log:
 | 
			
		||||
  extends:
 | 
			
		||||
    - .fdo.ci-fairy
 | 
			
		||||
  stage: pre_review
 | 
			
		||||
  variables:
 | 
			
		||||
    GIT_DEPTH: "100"
 | 
			
		||||
  script:
 | 
			
		||||
    - if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ;
 | 
			
		||||
      then
 | 
			
		||||
        ci-fairy check-commits --junit-xml=commit-message-junit-report.xml ;
 | 
			
		||||
      else
 | 
			
		||||
        echo "Not a merge request" ;
 | 
			
		||||
      fi
 | 
			
		||||
  <<: *pipeline_guard
 | 
			
		||||
  artifacts:
 | 
			
		||||
    expire_in: 1 week
 | 
			
		||||
    paths:
 | 
			
		||||
      - commit-message-junit-report.xml
 | 
			
		||||
    reports:
 | 
			
		||||
      junit: commit-message-junit-report.xml
 | 
			
		||||
 | 
			
		||||
check-merge-request:
 | 
			
		||||
  extends:
 | 
			
		||||
    - .fdo.ci-fairy
 | 
			
		||||
  stage: pre_review
 | 
			
		||||
  script:
 | 
			
		||||
    - if [[ x"$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" != "x" ]] ;
 | 
			
		||||
      then
 | 
			
		||||
        ci-fairy check-merge-request --require-allow-collaboration --junit-xml=check-merge-request-report.xml ;
 | 
			
		||||
      else
 | 
			
		||||
        echo "Not a merge request" ;
 | 
			
		||||
      fi
 | 
			
		||||
  <<: *pipeline_guard
 | 
			
		||||
  artifacts:
 | 
			
		||||
    expire_in: 1 week
 | 
			
		||||
    paths:
 | 
			
		||||
      - check-merge-request-report.xml
 | 
			
		||||
    reports:
 | 
			
		||||
      junit: check-merge-request-report.xml
 | 
			
		||||
 | 
			
		||||
build-fedora-container:
 | 
			
		||||
  extends:
 | 
			
		||||
    - .fdo.container-build@fedora@x86_64
 | 
			
		||||
    - .gnome-shell.fedora:35
 | 
			
		||||
  stage: prep
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/mutter/master:v3
 | 
			
		||||
    stage: review
 | 
			
		||||
    variables:
 | 
			
		||||
        GIT_DEPTH: "100"
 | 
			
		||||
    script:
 | 
			
		||||
        - ./.gitlab-ci/check-commit-log.sh
 | 
			
		||||
    only:
 | 
			
		||||
        - merge_requests
 | 
			
		||||
 | 
			
		||||
js_check:
 | 
			
		||||
  extends:
 | 
			
		||||
      - .fdo.distribution-image@fedora
 | 
			
		||||
      - .gnome-shell.fedora:35
 | 
			
		||||
  stage: review
 | 
			
		||||
  script:
 | 
			
		||||
      - find js -name '*.js' $(printf "! -wholename %s " $(cat .jscheckignore)) -exec js91 -c '{}' ';' 2>&1 | tee $JS_LOG
 | 
			
		||||
      - (! grep -q . $JS_LOG)
 | 
			
		||||
  artifacts:
 | 
			
		||||
      paths:
 | 
			
		||||
          - ${JS_LOG}
 | 
			
		||||
      when: on_failure
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v1
 | 
			
		||||
    stage: review
 | 
			
		||||
    script:
 | 
			
		||||
        - find js -name '*.js' -exec js60 -c -s '{}' ';' 2>&1 | tee $JS_LOG
 | 
			
		||||
        - (! grep -q . $JS_LOG)
 | 
			
		||||
    <<: *only_default
 | 
			
		||||
    artifacts:
 | 
			
		||||
        paths:
 | 
			
		||||
            - ${JS_LOG}
 | 
			
		||||
        when: on_failure
 | 
			
		||||
 | 
			
		||||
eslint:
 | 
			
		||||
  extends:
 | 
			
		||||
    - .fdo.distribution-image@fedora
 | 
			
		||||
    - .gnome-shell.fedora:35
 | 
			
		||||
  stage: review
 | 
			
		||||
  script:
 | 
			
		||||
    - export NODE_PATH=$(npm root -g)
 | 
			
		||||
    - ./.gitlab-ci/run-eslint --output-file ${LINT_LOG} --format junit
 | 
			
		||||
  artifacts:
 | 
			
		||||
    reports:
 | 
			
		||||
      junit: ${LINT_LOG}
 | 
			
		||||
    when: always
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v1
 | 
			
		||||
    stage: review
 | 
			
		||||
    script:
 | 
			
		||||
        - ./.gitlab-ci/run-eslint.sh
 | 
			
		||||
    <<: *only_default
 | 
			
		||||
    artifacts:
 | 
			
		||||
        paths:
 | 
			
		||||
            - reports
 | 
			
		||||
        when: always
 | 
			
		||||
 | 
			
		||||
eslint_mr:
 | 
			
		||||
  extends:
 | 
			
		||||
    - .fdo.distribution-image@fedora
 | 
			
		||||
    - .gnome-shell.fedora:35
 | 
			
		||||
  stage: review
 | 
			
		||||
  script:
 | 
			
		||||
    - export NODE_PATH=$(npm root -g)
 | 
			
		||||
    - ./.gitlab-ci/run-eslint --output-file ${LINT_MR_LOG} --format junit
 | 
			
		||||
      --remote ${CI_MERGE_REQUEST_PROJECT_URL}.git
 | 
			
		||||
      --branch ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}
 | 
			
		||||
  only:
 | 
			
		||||
    - merge_requests
 | 
			
		||||
  artifacts:
 | 
			
		||||
    reports:
 | 
			
		||||
      junit: ${LINT_MR_LOG}
 | 
			
		||||
    when: always
 | 
			
		||||
potfile_check:
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v1
 | 
			
		||||
    stage: review
 | 
			
		||||
    script:
 | 
			
		||||
        - ./.gitlab-ci/check-potfiles.sh
 | 
			
		||||
    <<: *only_default
 | 
			
		||||
 | 
			
		||||
potfile_c_check:
 | 
			
		||||
  extends:
 | 
			
		||||
    - .fdo.distribution-image@fedora
 | 
			
		||||
    - .gnome-shell.fedora:35
 | 
			
		||||
  stage: review
 | 
			
		||||
  script:
 | 
			
		||||
    - ./.gitlab-ci/check-potfiles.sh
 | 
			
		||||
 | 
			
		||||
potfile_js_check:
 | 
			
		||||
  extends:
 | 
			
		||||
    - .fdo.distribution-image@fedora
 | 
			
		||||
    - .gnome-shell.fedora:35
 | 
			
		||||
  stage: review
 | 
			
		||||
  script:
 | 
			
		||||
    - js91 -m .gitlab-ci/check-potfiles.js
 | 
			
		||||
no_template_check:
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/gnome-shell/extension-ci:v1
 | 
			
		||||
    stage: review
 | 
			
		||||
    script:
 | 
			
		||||
        - ./.gitlab-ci/check-template-strings.sh
 | 
			
		||||
    <<: *only_default
 | 
			
		||||
 | 
			
		||||
build:
 | 
			
		||||
  stage: build
 | 
			
		||||
  needs: ["check_commit_log"]
 | 
			
		||||
  variables:
 | 
			
		||||
    GIT_SUBMODULE_STRATEGY: normal
 | 
			
		||||
  before_script:
 | 
			
		||||
    - .gitlab-ci/checkout-mutter.sh
 | 
			
		||||
    - meson mutter mutter/build --prefix=/usr
 | 
			
		||||
    - meson install -C mutter/build
 | 
			
		||||
  script:
 | 
			
		||||
    - meson . build -Dbuildtype=debugoptimized -Dman=false --werror
 | 
			
		||||
    - meson compile -C build
 | 
			
		||||
    - meson install -C build
 | 
			
		||||
  artifacts:
 | 
			
		||||
    expire_in: 1 day
 | 
			
		||||
    paths:
 | 
			
		||||
      - mutter
 | 
			
		||||
      - build
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/mutter/master:v3
 | 
			
		||||
    stage: build
 | 
			
		||||
    before_script:
 | 
			
		||||
        - .gitlab-ci/checkout-mutter.sh
 | 
			
		||||
        - meson mutter mutter/build --prefix=/usr -Dtests=false
 | 
			
		||||
        - ninja -C mutter/build install
 | 
			
		||||
    script:
 | 
			
		||||
        - meson . build -Dbuiltype=debugoptimized -Dman=false --werror
 | 
			
		||||
        - ninja -C build
 | 
			
		||||
        - ninja -C build install
 | 
			
		||||
    <<: *only_default
 | 
			
		||||
    artifacts:
 | 
			
		||||
        expire_in: 1 day
 | 
			
		||||
        paths:
 | 
			
		||||
            - mutter
 | 
			
		||||
            - build
 | 
			
		||||
 | 
			
		||||
test:
 | 
			
		||||
  stage: test
 | 
			
		||||
  needs: ["build"]
 | 
			
		||||
  variables:
 | 
			
		||||
    GIT_SUBMODULE_STRATEGY: normal
 | 
			
		||||
    XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
 | 
			
		||||
    NO_AT_BRIDGE: "1"
 | 
			
		||||
  before_script:
 | 
			
		||||
    - meson install -C mutter/build
 | 
			
		||||
  script:
 | 
			
		||||
    - dbus-run-session -- xvfb-run meson test -C build --no-rebuild
 | 
			
		||||
  artifacts:
 | 
			
		||||
    expire_in: 1 day
 | 
			
		||||
    paths:
 | 
			
		||||
      - build/meson-logs/testlog.txt
 | 
			
		||||
    reports:
 | 
			
		||||
      junit: build/meson-logs/testlog.junit.xml
 | 
			
		||||
    when: on_failure
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/mutter/master:v3
 | 
			
		||||
    stage: test
 | 
			
		||||
    variables:
 | 
			
		||||
        XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
 | 
			
		||||
        NO_AT_BRIDGE: "1"
 | 
			
		||||
    before_script:
 | 
			
		||||
        - ninja -C mutter/build install
 | 
			
		||||
    script:
 | 
			
		||||
        - dbus-run-session -- xvfb-run meson test -C build --no-rebuild
 | 
			
		||||
    <<: *only_default
 | 
			
		||||
    artifacts:
 | 
			
		||||
        expire_in: 1 day
 | 
			
		||||
        paths:
 | 
			
		||||
            - build/meson-logs/testlog.txt
 | 
			
		||||
        when: on_failure
 | 
			
		||||
 | 
			
		||||
test-coverity:
 | 
			
		||||
  rules:
 | 
			
		||||
    - if: '$CI_PIPELINE_SOURCE == "schedule" && $GNOME_SHELL_SCHEDULED_JOB == "coverity"'
 | 
			
		||||
      when: always
 | 
			
		||||
    - when: manual
 | 
			
		||||
  needs: ["build"]
 | 
			
		||||
  stage: analyze
 | 
			
		||||
  allow_failure: true
 | 
			
		||||
  variables:
 | 
			
		||||
    GIT_SUBMODULE_STRATEGY: normal
 | 
			
		||||
  before_script:
 | 
			
		||||
    - meson install -C mutter/build
 | 
			
		||||
  script:
 | 
			
		||||
    - .gitlab-ci/download-coverity-tarball.sh
 | 
			
		||||
    - CC=clang meson coverity-build -Dman=false
 | 
			
		||||
    - ./coverity/cov-analysis-linux64-*/bin/cov-build --fs-capture-search js --dir cov-int meson compile -C coverity-build
 | 
			
		||||
    - tar czf cov-int.tar.gz cov-int
 | 
			
		||||
    - curl https://scan.coverity.com/builds?project=GNOME+Shell
 | 
			
		||||
      --form token=$COVERITY_TOKEN --form email=carlosg@gnome.org
 | 
			
		||||
      --form file=@cov-int.tar.gz --form version="`git describe --tags`"
 | 
			
		||||
      --form description="GitLab CI build"
 | 
			
		||||
  cache:
 | 
			
		||||
    key: coverity-tarball
 | 
			
		||||
    paths:
 | 
			
		||||
      - coverity
 | 
			
		||||
test-pot:
 | 
			
		||||
    image: registry.gitlab.gnome.org/gnome/mutter/master:v3
 | 
			
		||||
    stage: test
 | 
			
		||||
    before_script:
 | 
			
		||||
        - ninja -C mutter/build install
 | 
			
		||||
    script:
 | 
			
		||||
        # Check that pot files are generated correctly:
 | 
			
		||||
        # https://savannah.gnu.org/bugs/?50920#comment5
 | 
			
		||||
        - ninja -C build gnome-shell-pot 2>&1 | awk '
 | 
			
		||||
            BEGIN { start=0; }
 | 
			
		||||
            start==1 { print $0; }
 | 
			
		||||
            /gnome-shell-pot/ { start=1; }
 | 
			
		||||
          ' | tee $POT_LOG
 | 
			
		||||
        - (! grep -q . $POT_LOG)
 | 
			
		||||
    <<: *only_default
 | 
			
		||||
 | 
			
		||||
flatpak:
 | 
			
		||||
  stage: build
 | 
			
		||||
  needs: ["check_commit_log"]
 | 
			
		||||
  variables:
 | 
			
		||||
    SUBPROJECT: "subprojects/extensions-app"
 | 
			
		||||
    # Your manifest path
 | 
			
		||||
    MANIFEST_PATH: "$SUBPROJECT/build-aux/flatpak/org.gnome.Extensions.json"
 | 
			
		||||
    RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo"
 | 
			
		||||
    FLATPAK_MODULE: "gnome-extensions-app"
 | 
			
		||||
    APP_ID: "org.gnome.Extensions.Devel"
 | 
			
		||||
  extends: .flatpak
 | 
			
		||||
    stage: build
 | 
			
		||||
    variables:
 | 
			
		||||
        SUBPROJECT: "subprojects/extensions-app"
 | 
			
		||||
        # Your manifest path
 | 
			
		||||
        MANIFEST_PATH: "$SUBPROJECT/build-aux/flatpak/org.gnome.Extensions.json"
 | 
			
		||||
        RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo"
 | 
			
		||||
        FLATPAK_MODULE: "gnome-extensions-app"
 | 
			
		||||
        APP_ID: "org.gnome.Extensions"
 | 
			
		||||
        MESON_ARGS: "$SUBPROJECT"
 | 
			
		||||
    extends: .flatpak
 | 
			
		||||
    before_script:
 | 
			
		||||
        - flatpak run --command=$SUBPROJECT/generate-translations.sh
 | 
			
		||||
                      --filesystem=host org.gnome.Sdk//master
 | 
			
		||||
    <<: *only_default
 | 
			
		||||
 | 
			
		||||
nightly:
 | 
			
		||||
  extends: '.publish_nightly'
 | 
			
		||||
 | 
			
		||||
dist:
 | 
			
		||||
  variables:
 | 
			
		||||
    XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
 | 
			
		||||
    NO_AT_BRIDGE: "1"
 | 
			
		||||
    GIT_SUBMODULE_STRATEGY: normal
 | 
			
		||||
  stage: deploy
 | 
			
		||||
  needs: ["build"]
 | 
			
		||||
  before_script:
 | 
			
		||||
    - meson install -C mutter/build
 | 
			
		||||
    - mkdir -m 700 $XDG_RUNTIME_DIR
 | 
			
		||||
  script:
 | 
			
		||||
    - dbus-run-session xvfb-run meson dist -C build
 | 
			
		||||
  rules:
 | 
			
		||||
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
 | 
			
		||||
      changes:
 | 
			
		||||
        - "**/meson.build"
 | 
			
		||||
        - meson/*
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
dist-tarball:
 | 
			
		||||
  extends: dist
 | 
			
		||||
  artifacts:
 | 
			
		||||
    expose_as: 'Get tarball here'
 | 
			
		||||
    paths:
 | 
			
		||||
      - build/meson-dist/$CI_PROJECT_NAME-$CI_COMMIT_TAG.tar.xz
 | 
			
		||||
  rules:
 | 
			
		||||
    - if: '$CI_COMMIT_TAG'
 | 
			
		||||
    BUNDLES: '$BUNDLE'
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								.gitlab-ci/Dockerfile.extension-ci
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,18 @@
 | 
			
		||||
FROM registry.fedoraproject.org/fedora:latest
 | 
			
		||||
 | 
			
		||||
RUN dnf -y update && dnf -y upgrade && \
 | 
			
		||||
    dnf install -y 'dnf-command(copr)' git && \
 | 
			
		||||
 | 
			
		||||
    # For syntax checks with `find . -name '*.js' -exec js60 -c -s '{}' ';'`
 | 
			
		||||
    dnf install -y findutils mozjs60-devel && \
 | 
			
		||||
 | 
			
		||||
    # For static analysis with eslint
 | 
			
		||||
    dnf install -y nodejs && \
 | 
			
		||||
    npm install -g eslint && \
 | 
			
		||||
 | 
			
		||||
    # Shameless plug for my own tooling; useful for generating zip
 | 
			
		||||
    dnf copr enable -y fmuellner/gnome-shell-ci && \
 | 
			
		||||
    dnf install -y gnome-extensions-tool meson && \
 | 
			
		||||
 | 
			
		||||
    dnf clean all && \
 | 
			
		||||
    rm -rf /var/cache/dnf
 | 
			
		||||
							
								
								
									
										31
									
								
								.gitlab-ci/check-commit-log.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,31 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
if [ -z "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
 | 
			
		||||
  echo Cannot review non-merge request
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
git fetch $CI_MERGE_REQUEST_PROJECT_URL.git $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
 | 
			
		||||
 | 
			
		||||
branch_point=$(git merge-base HEAD FETCH_HEAD)
 | 
			
		||||
 | 
			
		||||
commits=$(git log --format='format:%H' $branch_point..$CI_COMMIT_SHA)
 | 
			
		||||
 | 
			
		||||
if [ -z "$commits" ]; then
 | 
			
		||||
  echo Commit range empty
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
function commit_message_has_url() {
 | 
			
		||||
  commit=$1
 | 
			
		||||
  commit_message=$(git show -s --format='format:%b' $commit)
 | 
			
		||||
  echo "$commit_message" | grep -qe "\($CI_MERGE_REQUEST_PROJECT_URL/\(-/\)\?\(issues\|merge_requests\)/[0-9]\+\|https://bugzilla.gnome.org/show_bug.cgi?id=[0-9]\+\)"
 | 
			
		||||
  return $?
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
for commit in $commits; do
 | 
			
		||||
  if ! commit_message_has_url $commit; then
 | 
			
		||||
    echo "Missing merge request or issue URL on commit $(echo $commit | cut -c -8)"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
done
 | 
			
		||||
@@ -1,207 +0,0 @@
 | 
			
		||||
const gettextFuncs = new Set([
 | 
			
		||||
    '_',
 | 
			
		||||
    'N_',
 | 
			
		||||
    'C_',
 | 
			
		||||
    'NC_',
 | 
			
		||||
    'dcgettext',
 | 
			
		||||
    'dgettext',
 | 
			
		||||
    'dngettext',
 | 
			
		||||
    'dpgettext',
 | 
			
		||||
    'gettext',
 | 
			
		||||
    'ngettext',
 | 
			
		||||
    'pgettext',
 | 
			
		||||
]);
 | 
			
		||||
 | 
			
		||||
function dirname(file) {
 | 
			
		||||
    const split = file.split('/');
 | 
			
		||||
    split.pop();
 | 
			
		||||
    return split.join('/');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const scriptDir = dirname(import.meta.url);
 | 
			
		||||
const root = dirname(scriptDir);
 | 
			
		||||
 | 
			
		||||
const excludedFiles = new Set();
 | 
			
		||||
const foundFiles = new Set()
 | 
			
		||||
 | 
			
		||||
function addExcludes(filename) {
 | 
			
		||||
    const contents = os.file.readFile(filename);
 | 
			
		||||
    const lines = contents.split('\n')
 | 
			
		||||
        .filter(l => l && !l.startsWith('#'));
 | 
			
		||||
   lines.forEach(line => excludedFiles.add(line));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
addExcludes(`${root}/po/POTFILES.in`);
 | 
			
		||||
addExcludes(`${root}/po/POTFILES.skip`);
 | 
			
		||||
 | 
			
		||||
function walkAst(node, func) {
 | 
			
		||||
    func(node);
 | 
			
		||||
    nodesToWalk(node).forEach(n => walkAst(n, func));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function findGettextCalls(node) {
 | 
			
		||||
    switch(node.type) {
 | 
			
		||||
    case 'CallExpression':
 | 
			
		||||
        if (node.callee.type === 'Identifier' &&
 | 
			
		||||
            gettextFuncs.has(node.callee.name))
 | 
			
		||||
            throw new Error();
 | 
			
		||||
        if (node.callee.type === 'MemberExpression' &&
 | 
			
		||||
            node.callee.object.type === 'Identifier' &&
 | 
			
		||||
            node.callee.object.name === 'Gettext' &&
 | 
			
		||||
            node.callee.property.type === 'Identifier' &&
 | 
			
		||||
            gettextFuncs.has(node.callee.property.name))
 | 
			
		||||
            throw new Error();
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function nodesToWalk(node) {
 | 
			
		||||
    switch(node.type) {
 | 
			
		||||
    case 'ArrayPattern':
 | 
			
		||||
    case 'BreakStatement':
 | 
			
		||||
    case 'CallSiteObject':  // i.e. strings passed to template
 | 
			
		||||
    case 'ContinueStatement':
 | 
			
		||||
    case 'DebuggerStatement':
 | 
			
		||||
    case 'EmptyStatement':
 | 
			
		||||
    case 'Identifier':
 | 
			
		||||
    case 'Literal':
 | 
			
		||||
    case 'MetaProperty':  // i.e. new.target
 | 
			
		||||
    case 'Super':
 | 
			
		||||
    case 'ThisExpression':
 | 
			
		||||
        return [];
 | 
			
		||||
    case 'ArrowFunctionExpression':
 | 
			
		||||
    case 'FunctionDeclaration':
 | 
			
		||||
    case 'FunctionExpression':
 | 
			
		||||
        return [...node.defaults, node.body].filter(n => !!n);
 | 
			
		||||
    case 'AssignmentExpression':
 | 
			
		||||
    case 'BinaryExpression':
 | 
			
		||||
    case 'ComprehensionBlock':
 | 
			
		||||
    case 'LogicalExpression':
 | 
			
		||||
        return [node.left, node.right];
 | 
			
		||||
    case 'ArrayExpression':
 | 
			
		||||
    case 'TemplateLiteral':
 | 
			
		||||
        return node.elements.filter(n => !!n);
 | 
			
		||||
    case 'BlockStatement':
 | 
			
		||||
    case 'Program':
 | 
			
		||||
        return node.body;
 | 
			
		||||
    case 'StaticClassBlock':
 | 
			
		||||
        return [node.body];
 | 
			
		||||
    case 'ClassField':
 | 
			
		||||
        return [node.name, node.init];
 | 
			
		||||
    case 'CallExpression':
 | 
			
		||||
    case 'NewExpression':
 | 
			
		||||
    case 'OptionalCallExpression':
 | 
			
		||||
    case 'TaggedTemplate':
 | 
			
		||||
        return [node.callee, ...node.arguments];
 | 
			
		||||
    case 'CatchClause':
 | 
			
		||||
        return [node.body, node.guard].filter(n => !!n);
 | 
			
		||||
    case 'ClassExpression':
 | 
			
		||||
    case 'ClassStatement':
 | 
			
		||||
        return [...node.body, node.superClass].filter(n => !!n);
 | 
			
		||||
    case 'ClassMethod':
 | 
			
		||||
        return [node.name, node.body];
 | 
			
		||||
    case 'ComprehensionExpression':
 | 
			
		||||
    case 'GeneratorExpression':
 | 
			
		||||
        return [node.body, ...node.blocks, node.filter].filter(n => !!n);
 | 
			
		||||
    case 'ComprehensionIf':
 | 
			
		||||
        return [node.test];
 | 
			
		||||
    case 'ComputedName':
 | 
			
		||||
        return [node.name];
 | 
			
		||||
    case 'ConditionalExpression':
 | 
			
		||||
    case 'IfStatement':
 | 
			
		||||
        return [node.test, node.consequent, node.alternate].filter(n => !!n);
 | 
			
		||||
    case 'DoWhileStatement':
 | 
			
		||||
    case 'WhileStatement':
 | 
			
		||||
        return [node.body, node.test];
 | 
			
		||||
    case 'ExportDeclaration':
 | 
			
		||||
        return [node.declaration, node.source].filter(n => !!n);
 | 
			
		||||
    case 'ImportDeclaration':
 | 
			
		||||
        return [...node.specifiers, node.source];
 | 
			
		||||
    case 'LetStatement':
 | 
			
		||||
        return [...node.head, node.body];
 | 
			
		||||
    case 'ExpressionStatement':
 | 
			
		||||
        return [node.expression];
 | 
			
		||||
    case 'ForInStatement':
 | 
			
		||||
    case 'ForOfStatement':
 | 
			
		||||
        return [node.body, node.left, node.right];
 | 
			
		||||
    case 'ForStatement':
 | 
			
		||||
        return [node.init, node.test, node.update, node.body].filter(n => !!n);
 | 
			
		||||
    case 'LabeledStatement':
 | 
			
		||||
        return [node.body];
 | 
			
		||||
    case 'MemberExpression':
 | 
			
		||||
        return [node.object, node.property];
 | 
			
		||||
    case 'ObjectExpression':
 | 
			
		||||
    case 'ObjectPattern':
 | 
			
		||||
        return node.properties;
 | 
			
		||||
    case 'OptionalExpression':
 | 
			
		||||
        return [node.expression];
 | 
			
		||||
    case 'OptionalMemberExpression':
 | 
			
		||||
        return [node.object, node.property];
 | 
			
		||||
    case 'Property':
 | 
			
		||||
    case 'PrototypeMutation':
 | 
			
		||||
        return [node.value];
 | 
			
		||||
    case 'ReturnStatement':
 | 
			
		||||
    case 'ThrowStatement':
 | 
			
		||||
    case 'UnaryExpression':
 | 
			
		||||
    case 'UpdateExpression':
 | 
			
		||||
    case 'YieldExpression':
 | 
			
		||||
        return node.argument ? [node.argument] : [];
 | 
			
		||||
    case 'SequenceExpression':
 | 
			
		||||
        return node.expressions;
 | 
			
		||||
    case 'SpreadExpression':
 | 
			
		||||
        return [node.expression];
 | 
			
		||||
    case 'SwitchCase':
 | 
			
		||||
        return [node.test, ...node.consequent].filter(n => !!n);
 | 
			
		||||
    case 'SwitchStatement':
 | 
			
		||||
        return [node.discriminant, ...node.cases];
 | 
			
		||||
    case 'TryStatement':
 | 
			
		||||
        return [node.block, node.handler, node.finalizer].filter(n => !!n);
 | 
			
		||||
    case 'VariableDeclaration':
 | 
			
		||||
        return node.declarations;
 | 
			
		||||
    case 'VariableDeclarator':
 | 
			
		||||
        return node.init ? [node.init] : [];
 | 
			
		||||
    case 'WithStatement':
 | 
			
		||||
        return [node.object, node.body];
 | 
			
		||||
    default:
 | 
			
		||||
        print(`Ignoring ${node.type}, you should probably fix this in the script`);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function walkDir(dir) {
 | 
			
		||||
    os.file.listDir(dir).forEach(child => {
 | 
			
		||||
        if (child.startsWith('.'))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        const path = os.path.join(dir, child);
 | 
			
		||||
        const relativePath = path.replace(`${root}/`, '');
 | 
			
		||||
        if (excludedFiles.has(relativePath))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (!child.endsWith('.js')) {
 | 
			
		||||
            try {
 | 
			
		||||
                walkDir(path);
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
                // not a directory
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            const script = os.file.readFile(path);
 | 
			
		||||
            const ast = Reflect.parse(script);
 | 
			
		||||
            walkAst(ast, findGettextCalls);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            foundFiles.add(path);
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
walkDir(root);
 | 
			
		||||
 | 
			
		||||
if (foundFiles.size === 0)
 | 
			
		||||
    quit(0);
 | 
			
		||||
 | 
			
		||||
print('The following files are missing from po/POTFILES.in:')
 | 
			
		||||
foundFiles.forEach(f => print(`  ${f}`));
 | 
			
		||||
quit(1);
 | 
			
		||||
@@ -1,18 +1,10 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
srcdirs="src subprojects/extensions-tool"
 | 
			
		||||
uidirs="js subprojects/extensions-app"
 | 
			
		||||
srcdirs="js src subprojects/extensions-tool"
 | 
			
		||||
globs=('*.js' '*.c')
 | 
			
		||||
 | 
			
		||||
# find source files that contain gettext keywords
 | 
			
		||||
files=$(grep -lR --include='*.c' '\(gettext\|[^I_)]_\)(' $srcdirs)
 | 
			
		||||
 | 
			
		||||
# find ui files that contain translatable string
 | 
			
		||||
files="$files "$(grep -lRi --include='*.ui' 'translatable="[ty1]' $uidirs)
 | 
			
		||||
 | 
			
		||||
# filter out excluded files
 | 
			
		||||
if [ -f po/POTFILES.skip ]; then
 | 
			
		||||
  files=$(for f in $files; do ! grep -q ^$f po/POTFILES.skip && echo $f; done)
 | 
			
		||||
fi
 | 
			
		||||
files=$(grep -lR ${globs[@]/#/--include=} '\(gettext\|[^I_)]_\)(' $srcdirs)
 | 
			
		||||
 | 
			
		||||
# find those that aren't listed in POTFILES.in
 | 
			
		||||
missing=$(for f in $files; do ! grep -q ^$f po/POTFILES.in && echo $f; done)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								.gitlab-ci/check-template-strings.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,23 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
# find files from POTFILES.in that use js template strings
 | 
			
		||||
baddies=$(grep -l '${' $(grep ^js po/POTFILES.in))
 | 
			
		||||
 | 
			
		||||
if [ ${#baddies} -eq 0 ]; then
 | 
			
		||||
  exit 0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
cat >&2 <<EOT
 | 
			
		||||
 | 
			
		||||
xgettext cannot handle template strings properly, so we ban their use
 | 
			
		||||
in files with translatable strings.
 | 
			
		||||
 | 
			
		||||
The following files are listed in po/POTFILES.in and use template strings:
 | 
			
		||||
 | 
			
		||||
EOT
 | 
			
		||||
for f in $baddies; do
 | 
			
		||||
  echo "  $f" >&2
 | 
			
		||||
done
 | 
			
		||||
echo >&2
 | 
			
		||||
 | 
			
		||||
exit 1
 | 
			
		||||
@@ -1,19 +1,11 @@
 | 
			
		||||
#!/usr/bin/bash
 | 
			
		||||
 | 
			
		||||
fetch() {
 | 
			
		||||
  local remote=$1
 | 
			
		||||
  local ref=$2
 | 
			
		||||
 | 
			
		||||
  git fetch --quiet --depth=1 $remote $ref 2>/dev/null
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mutter_target=
 | 
			
		||||
 | 
			
		||||
echo -n Cloning into mutter ...
 | 
			
		||||
if git clone --quiet --depth=1 https://gitlab.gnome.org/GNOME/mutter.git; then
 | 
			
		||||
  echo \ done
 | 
			
		||||
else
 | 
			
		||||
  echo \ failed
 | 
			
		||||
git clone https://gitlab.gnome.org/GNOME/mutter.git
 | 
			
		||||
 | 
			
		||||
if [ $? -ne 0 ]; then
 | 
			
		||||
  echo Checkout failed
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@@ -23,46 +15,18 @@ if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
 | 
			
		||||
  merge_request_remote=${CI_MERGE_REQUEST_SOURCE_PROJECT_URL//gnome-shell/mutter}
 | 
			
		||||
  merge_request_branch=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
 | 
			
		||||
 | 
			
		||||
  echo -n Looking for $merge_request_branch on remote ...
 | 
			
		||||
  if fetch $merge_request_remote $merge_request_branch; then
 | 
			
		||||
    echo \ found
 | 
			
		||||
  echo Looking for $merge_request_branch on remote ...
 | 
			
		||||
  if git fetch -q $merge_request_remote $merge_request_branch 2>/dev/null; then
 | 
			
		||||
    mutter_target=FETCH_HEAD
 | 
			
		||||
  else
 | 
			
		||||
    echo \ not found
 | 
			
		||||
 | 
			
		||||
    echo -n Looking for $CI_MERGE_REQUEST_TARGET_BRANCH_NAME instead ...
 | 
			
		||||
    if fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME; then
 | 
			
		||||
      echo \ found
 | 
			
		||||
      mutter_target=FETCH_HEAD
 | 
			
		||||
    else
 | 
			
		||||
      echo \ not found
 | 
			
		||||
    fi
 | 
			
		||||
    mutter_target=origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME
 | 
			
		||||
    echo Using $mutter_target instead
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -z "$mutter_target" ]; then
 | 
			
		||||
  echo -n Looking for $CI_COMMIT_REF_NAME on remote ...
 | 
			
		||||
  if fetch origin $CI_COMMIT_REF_NAME; then
 | 
			
		||||
    echo \ found
 | 
			
		||||
    mutter_target=FETCH_HEAD
 | 
			
		||||
  else
 | 
			
		||||
    echo \ not found
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
fallback_branch=${CI_COMMIT_TAG:+gnome-}${CI_COMMIT_TAG%%.*}
 | 
			
		||||
if [ -z "$mutter_target" -a "$fallback_branch" ]; then
 | 
			
		||||
  echo -n Looking for $fallback_branch instead ...
 | 
			
		||||
  if fetch origin $fallback_branch; then
 | 
			
		||||
    echo \ found
 | 
			
		||||
    mutter_target=FETCH_HEAD
 | 
			
		||||
  else
 | 
			
		||||
    echo \ not found
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -z "$mutter_target" ]; then
 | 
			
		||||
  mutter_target=HEAD
 | 
			
		||||
  mutter_target=$(git branch -r -l origin/$CI_COMMIT_REF_NAME)
 | 
			
		||||
  mutter_target=${mutter_target:-origin/master}
 | 
			
		||||
  echo Using $mutter_target instead
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +0,0 @@
 | 
			
		||||
patterns:
 | 
			
		||||
  deny:
 | 
			
		||||
    - regex: '^$CI_MERGE_REQUEST_PROJECT_URL/(-/)?merge_requests/$CI_MERGE_REQUEST_IID$'
 | 
			
		||||
      message: Commit message must not contain a link to its own merge request
 | 
			
		||||
    - regex: '^(st-|St)'
 | 
			
		||||
      message: Commit message subject should not be prefixed with 'st-' or 'St', use 'st/' instead
 | 
			
		||||
      where: subject
 | 
			
		||||
    - regex: '^[^:]+: [a-z]'
 | 
			
		||||
      message: "Commit message subject should be properly Capitalized. E.g. 'window: Marginalize extradicity'"
 | 
			
		||||
      where: subject
 | 
			
		||||
    - regex: '^\S*\.(js|c|h):'
 | 
			
		||||
      message: Commit message subject prefix should not include .c, .h etc.
 | 
			
		||||
      where: subject
 | 
			
		||||
    - regex: '([^.]\.|[:,;])\s*$'
 | 
			
		||||
      message: Commit message subject should not end with punctuation
 | 
			
		||||
      where: subject
 | 
			
		||||
@@ -1,38 +0,0 @@
 | 
			
		||||
#!/usr/bin/bash
 | 
			
		||||
 | 
			
		||||
# We need a coverity token to fetch the tarball
 | 
			
		||||
if [ -x $COVERITY_TOKEN ]
 | 
			
		||||
then
 | 
			
		||||
  echo "No coverity token. Run this job from a protected branch."
 | 
			
		||||
  exit -1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
mkdir -p coverity
 | 
			
		||||
 | 
			
		||||
# Download and check MD5 first
 | 
			
		||||
curl https://scan.coverity.com/download/linux64 \
 | 
			
		||||
  --data "token=$COVERITY_TOKEN&project=GNOME+Shell&md5=1" \
 | 
			
		||||
  --output /tmp/coverity_tool.md5
 | 
			
		||||
 | 
			
		||||
diff /tmp/coverity_tool.md5 coverity/coverity_tool.md5 >/dev/null 2>&1
 | 
			
		||||
 | 
			
		||||
if [ $? -eq 0 -a -d coverity/cov-analysis* ]
 | 
			
		||||
then
 | 
			
		||||
  echo "Coverity tarball is up-to-date"
 | 
			
		||||
  exit 0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Download and extract coverity tarball
 | 
			
		||||
curl https://scan.coverity.com/download/linux64 \
 | 
			
		||||
  --data "token=$COVERITY_TOKEN&project=GNOME+Shell" \
 | 
			
		||||
  --output /tmp/coverity_tool.tgz
 | 
			
		||||
 | 
			
		||||
rm -rf ./coverity/cov-analysis*
 | 
			
		||||
 | 
			
		||||
tar zxf /tmp/coverity_tool.tgz -C coverity/
 | 
			
		||||
if [ $? -eq 0 ]
 | 
			
		||||
then
 | 
			
		||||
  mv /tmp/coverity_tool.md5 coverity/
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
rm /tmp/coverity_tool.tgz
 | 
			
		||||
@@ -1,34 +0,0 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
if [[ $# -lt 4 ]]; then
 | 
			
		||||
  echo Usage: $0 [options] [repo-url] [commit] [subdir]
 | 
			
		||||
  echo  Options:
 | 
			
		||||
  echo    -Dkey=val
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
MESON_OPTIONS=()
 | 
			
		||||
 | 
			
		||||
while [[ $1 =~ ^-D ]]; do
 | 
			
		||||
  MESON_OPTIONS+=( "$1" )
 | 
			
		||||
  shift
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
REPO_URL="$1"
 | 
			
		||||
COMMIT="$2"
 | 
			
		||||
SUBDIR="$3"
 | 
			
		||||
PREPARE="$4"
 | 
			
		||||
 | 
			
		||||
REPO_DIR="$(basename ${REPO_URL%.git})"
 | 
			
		||||
 | 
			
		||||
git clone --depth 1 "$REPO_URL" -b "$COMMIT"
 | 
			
		||||
pushd "$REPO_DIR"
 | 
			
		||||
pushd "$SUBDIR"
 | 
			
		||||
sh -c "$PREPARE"
 | 
			
		||||
meson --prefix=/usr _build "${MESON_OPTIONS[@]}"
 | 
			
		||||
meson install -C _build
 | 
			
		||||
popd
 | 
			
		||||
popd
 | 
			
		||||
rm -rf "$REPO_DIR"
 | 
			
		||||
@@ -1,128 +0,0 @@
 | 
			
		||||
#!/usr/bin/env node
 | 
			
		||||
 | 
			
		||||
const { ESLint } = require('eslint');
 | 
			
		||||
const fs = require('fs');
 | 
			
		||||
const path = require('path');
 | 
			
		||||
const { spawn } = require('child_process');
 | 
			
		||||
 | 
			
		||||
function createConfig(config) {
 | 
			
		||||
    const options = {
 | 
			
		||||
        cache: true,
 | 
			
		||||
        cacheLocation: `.eslintcache-${config}`,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    if (config === 'legacy')
 | 
			
		||||
        options.overrideConfigFile='lint/eslintrc-legacy.yml';
 | 
			
		||||
 | 
			
		||||
    return new ESLint(options);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function git(...args) {
 | 
			
		||||
    const git = spawn('git', args, { stdio: ['ignore', null, 'ignore'] });
 | 
			
		||||
    git.stdout.setEncoding('utf8');
 | 
			
		||||
 | 
			
		||||
    return new Promise(resolve => {
 | 
			
		||||
        let out = '';
 | 
			
		||||
        git.stdout.on('data', chunk => out += chunk);
 | 
			
		||||
        git.stdout.on('end', () => resolve(out.trim()));
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function createCommon(report1, report2, ignoreColumn=false) {
 | 
			
		||||
    return report1.map(result => {
 | 
			
		||||
        const { filePath, messages } = result;
 | 
			
		||||
        const match =
 | 
			
		||||
            report2.find(r => r.filePath === filePath) || { messages: [] };
 | 
			
		||||
 | 
			
		||||
        const filteredMessages = messages.filter(
 | 
			
		||||
            msg => match.messages.some(
 | 
			
		||||
                m => m.line === msg.line && (ignoreColumn || m.column === msg.column)));
 | 
			
		||||
 | 
			
		||||
        const [errorCount, warningCount] = filteredMessages.reduce(
 | 
			
		||||
            ([e, w], msg) => {
 | 
			
		||||
                return [
 | 
			
		||||
                    e + Number(msg.severity === 2),
 | 
			
		||||
                    w + Number(msg.severity === 1)];
 | 
			
		||||
            }, [0, 0]);
 | 
			
		||||
 | 
			
		||||
        return {
 | 
			
		||||
            filePath,
 | 
			
		||||
            messages: filteredMessages,
 | 
			
		||||
            errorCount,
 | 
			
		||||
            warningCount,
 | 
			
		||||
        };
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function getMergeRequestChanges(remote, branch) {
 | 
			
		||||
    await git('fetch', remote, branch);
 | 
			
		||||
    const branchPoint = await git('merge-base', 'HEAD', 'FETCH_HEAD');
 | 
			
		||||
    const diff = await git('diff', '-U0', `${branchPoint}...HEAD`);
 | 
			
		||||
 | 
			
		||||
    const report = [];
 | 
			
		||||
    let messages = null;
 | 
			
		||||
    for (const line of diff.split('\n')) {
 | 
			
		||||
        if (line.startsWith('+++ b/')) {
 | 
			
		||||
            const filePath = path.resolve(line.substring(6));
 | 
			
		||||
            messages = filePath.endsWith('.js') ? [] : null;
 | 
			
		||||
            if (messages)
 | 
			
		||||
                report.push({ filePath, messages });
 | 
			
		||||
        } else if (messages && line.startsWith('@@ ')) {
 | 
			
		||||
            [, , changes] = line.split(' ');
 | 
			
		||||
            [start, count] = `${changes},1`.split(',').map(i => parseInt(i));
 | 
			
		||||
            for (let i = start; i < start + count; i++)
 | 
			
		||||
                messages.push({ line: i });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return report;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getOption(...names) {
 | 
			
		||||
    const optIndex =
 | 
			
		||||
        process.argv.findIndex(arg => names.includes(arg)) + 1;
 | 
			
		||||
 | 
			
		||||
    if (optIndex === 0)
 | 
			
		||||
        return undefined;
 | 
			
		||||
 | 
			
		||||
    return process.argv[optIndex];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
(async function main() {
 | 
			
		||||
    const outputOption = getOption('--output-file', '-o');
 | 
			
		||||
    const outputPath = outputOption ? path.resolve(outputOption) : null;
 | 
			
		||||
 | 
			
		||||
    const sourceDir = path.dirname(process.argv[1]);
 | 
			
		||||
    process.chdir(path.resolve(sourceDir, '..'));
 | 
			
		||||
 | 
			
		||||
    const remote = getOption('--remote') || 'origin';
 | 
			
		||||
    const branch = getOption('--branch', '-b');
 | 
			
		||||
 | 
			
		||||
    const sources = ['js', 'subprojects/extensions-app/js'];
 | 
			
		||||
    const regular = createConfig('regular');
 | 
			
		||||
 | 
			
		||||
    const ops = [];
 | 
			
		||||
    ops.push(regular.lintFiles(sources));
 | 
			
		||||
    if (branch)
 | 
			
		||||
        ops.push(getMergeRequestChanges(remote, branch));
 | 
			
		||||
    else
 | 
			
		||||
        ops.push(createConfig('legacy').lintFiles(sources));
 | 
			
		||||
 | 
			
		||||
    const results = await Promise.all(ops);
 | 
			
		||||
    const commonResults = createCommon(...results, branch !== undefined);
 | 
			
		||||
 | 
			
		||||
    const formatter = await regular.loadFormatter(getOption('--format', '-f'));
 | 
			
		||||
    const resultText = formatter.format(commonResults);
 | 
			
		||||
 | 
			
		||||
    if (outputPath) {
 | 
			
		||||
        fs.mkdirSync(path.dirname(outputPath), { recursive: true });
 | 
			
		||||
        fs.writeFileSync(outputPath, resultText);
 | 
			
		||||
    } else {
 | 
			
		||||
        console.log(resultText);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    process.exitCode = commonResults.some(r => r.errorCount > 0) ? 1 : 0;
 | 
			
		||||
})().catch((error) => {
 | 
			
		||||
    process.exitCode = 1;
 | 
			
		||||
    console.error(error);
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										114
									
								
								.gitlab-ci/run-eslint.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,114 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
OUTPUT_REGULAR=reports/lint-regular-report.txt
 | 
			
		||||
OUTPUT_LEGACY=reports/lint-legacy-report.txt
 | 
			
		||||
OUTPUT_FINAL=reports/lint-common-report.txt
 | 
			
		||||
 | 
			
		||||
OUTPUT_MR=reports/lint-mr-report.txt
 | 
			
		||||
 | 
			
		||||
LINE_CHANGES=changed-lines.txt
 | 
			
		||||
 | 
			
		||||
is_empty() {
 | 
			
		||||
  (! grep -q . $1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
run_eslint() {
 | 
			
		||||
  ARGS_LEGACY='--config lint/eslintrc-legacy.yml'
 | 
			
		||||
 | 
			
		||||
  local extra_args=ARGS_$1
 | 
			
		||||
  local output_var=OUTPUT_$1
 | 
			
		||||
  local output=${!output_var}
 | 
			
		||||
 | 
			
		||||
  # ensure output exists even if eslint doesn't report any errors
 | 
			
		||||
  mkdir -p $(dirname $output)
 | 
			
		||||
  touch $output
 | 
			
		||||
 | 
			
		||||
  eslint -f unix ${!extra_args} -o $output js subprojects/extensions-app/js
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
list_commit_range_additions() {
 | 
			
		||||
  # Turn raw context-less git-diff into a list of
 | 
			
		||||
  # filename:lineno pairs of new (+) lines
 | 
			
		||||
  git diff -U0 "$@" -- js |
 | 
			
		||||
  awk '
 | 
			
		||||
    BEGIN { file=""; }
 | 
			
		||||
    /^+++ b/ { file=substr($0,7); }
 | 
			
		||||
    /^@@ / {
 | 
			
		||||
        len = split($3,a,",")
 | 
			
		||||
        start=a[1]
 | 
			
		||||
        count=(len > 1) ? a[2] : 1
 | 
			
		||||
 | 
			
		||||
        for (line=start; line<start+count; line++)
 | 
			
		||||
            printf "%s/%s:%d:\n",ENVIRON["PWD"],file,line;
 | 
			
		||||
    }'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
copy_matched_lines() {
 | 
			
		||||
  local source=$1
 | 
			
		||||
  local matches=$2
 | 
			
		||||
  local target=$3
 | 
			
		||||
 | 
			
		||||
  echo -n > $target
 | 
			
		||||
  for l in $(<$matches); do
 | 
			
		||||
    grep $l $source >> $target
 | 
			
		||||
  done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
create_common() {
 | 
			
		||||
  # comm requires sorted input;
 | 
			
		||||
  # we also strip the error message to make the following a "common" error:
 | 
			
		||||
  # regular:
 | 
			
		||||
  #  file.js:42:23 Indentation of 55, expected 42
 | 
			
		||||
  # legacy:
 | 
			
		||||
  #  file.js:42:23 Indentation of 55, extected 24
 | 
			
		||||
  prepare() {
 | 
			
		||||
    sed 's: .*::' $1 | sort
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  comm -12 <(prepare $OUTPUT_REGULAR) <(prepare $OUTPUT_LEGACY) >$OUTPUT_FINAL.tmp
 | 
			
		||||
 | 
			
		||||
  # Now add back the stripped error messages
 | 
			
		||||
  copy_matched_lines $OUTPUT_REGULAR $OUTPUT_FINAL.tmp $OUTPUT_FINAL
 | 
			
		||||
  rm $OUTPUT_FINAL.tmp
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Disable MR handling for now. We aren't ready to enforce
 | 
			
		||||
# non-legacy style just yet ...
 | 
			
		||||
unset CI_MERGE_REQUEST_TARGET_BRANCH_NAME
 | 
			
		||||
 | 
			
		||||
REMOTE=${1:-$CI_MERGE_REQUEST_PROJECT_URL.git}
 | 
			
		||||
BRANCH_NAME=${2:-$CI_MERGE_REQUEST_TARGET_BRANCH_NAME}
 | 
			
		||||
 | 
			
		||||
if [ "$BRANCH_NAME" ]; then
 | 
			
		||||
  git fetch $REMOTE $BRANCH_NAME
 | 
			
		||||
  branch_point=$(git merge-base HEAD FETCH_HEAD)
 | 
			
		||||
  commit_range=$branch_point...HEAD
 | 
			
		||||
 | 
			
		||||
  list_commit_range_additions $commit_range > $LINE_CHANGES
 | 
			
		||||
 | 
			
		||||
  # Don't bother with running lint when no JS changed
 | 
			
		||||
  if is_empty $LINE_CHANGES; then
 | 
			
		||||
    exit 0
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo Generating lint report using regular configuration
 | 
			
		||||
run_eslint REGULAR
 | 
			
		||||
echo Generating lint report using legacy configuration
 | 
			
		||||
run_eslint LEGACY
 | 
			
		||||
echo Done.
 | 
			
		||||
create_common
 | 
			
		||||
 | 
			
		||||
if ! is_empty $OUTPUT_FINAL; then
 | 
			
		||||
  cat $OUTPUT_FINAL
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Just show the report and succeed when not testing a MR
 | 
			
		||||
if [ -z "$BRANCH_NAME" ]; then
 | 
			
		||||
  exit 0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
copy_matched_lines $OUTPUT_REGULAR $LINE_CHANGES $OUTPUT_MR
 | 
			
		||||
cat $OUTPUT_MR
 | 
			
		||||
is_empty $OUTPUT_MR
 | 
			
		||||
@@ -8,7 +8,7 @@ first to ensure that you create a clear and specific issue.
 | 
			
		||||
<!--
 | 
			
		||||
Provide at least the following information:
 | 
			
		||||
* Your OS and version
 | 
			
		||||
* Affected GNOME Shell version (see https://wiki.gnome.org/Schedule for currently supported versions)
 | 
			
		||||
* Affected GNOME Shell version
 | 
			
		||||
* Does this issue appear in XOrg and/or Wayland
 | 
			
		||||
-->
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1,3 +1,3 @@
 | 
			
		||||
[submodule "subprojects/gvc"]
 | 
			
		||||
	path = subprojects/gvc
 | 
			
		||||
	url = ../../GNOME/libgnome-volume-control.git
 | 
			
		||||
	url = https://gitlab.gnome.org/GNOME/libgnome-volume-control.git
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
js/ui/init.js
 | 
			
		||||
@@ -131,7 +131,7 @@ whenever possible, that is when not inheriting from GObjects.
 | 
			
		||||
    };
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
For GObject inheritance, we use the GObject.registerClass() function provided
 | 
			
		||||
For GObject inheritence, we use the GObject.registerClass() function provided
 | 
			
		||||
by gjs.
 | 
			
		||||
```javascript
 | 
			
		||||
    var MyActor = GObject.registerClass(
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								README.md
									
									
									
									
									
								
							
							
						
						@@ -1,5 +1,5 @@
 | 
			
		||||
# GNOME Shell
 | 
			
		||||
GNOME Shell provides core user interface functions for the GNOME desktop,
 | 
			
		||||
GNOME Shell provides core user interface functions for the GNOME 3 desktop,
 | 
			
		||||
like switching to windows and launching applications. GNOME Shell takes
 | 
			
		||||
advantage of the capabilities of modern graphics hardware and introduces
 | 
			
		||||
innovative user interface concepts to provide a visually attractive and
 | 
			
		||||
@@ -10,7 +10,6 @@ to build GNOME Shell from source and how to get involved with the project,
 | 
			
		||||
see the [project wiki][project-wiki].
 | 
			
		||||
 | 
			
		||||
Bugs should be reported to the GNOME [bug tracking system][bug-tracker].
 | 
			
		||||
Please refer to the [*Schedule* wiki page][schedule] to see the supported versions.
 | 
			
		||||
 | 
			
		||||
## Contributing
 | 
			
		||||
 | 
			
		||||
@@ -20,24 +19,10 @@ Commit messages should follow the [GNOME commit message
 | 
			
		||||
guidelines](https://wiki.gnome.org/Git/CommitMessages). We require an URL
 | 
			
		||||
to either an issue or a merge request in each commit.
 | 
			
		||||
 | 
			
		||||
## Default branch
 | 
			
		||||
 | 
			
		||||
The default development branch is `main`. If you still have a local
 | 
			
		||||
checkout under the old name, use:
 | 
			
		||||
```sh
 | 
			
		||||
git checkout master
 | 
			
		||||
git branch -m master main
 | 
			
		||||
git fetch
 | 
			
		||||
git branch --unset-upstream
 | 
			
		||||
git branch -u origin/main
 | 
			
		||||
git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
GNOME Shell is distributed under the terms of the GNU General Public License,
 | 
			
		||||
version 2 or later. See the [COPYING][license] file for details.
 | 
			
		||||
 | 
			
		||||
[project-wiki]: https://wiki.gnome.org/Projects/GnomeShell
 | 
			
		||||
[bug-tracker]: https://gitlab.gnome.org/GNOME/gnome-shell/issues
 | 
			
		||||
[schedule]: https://wiki.gnome.org/Schedule
 | 
			
		||||
[license]: COPYING
 | 
			
		||||
 
 | 
			
		||||
@@ -13,9 +13,6 @@
 | 
			
		||||
/* Define to 1 if you have the `mallinfo' function. */
 | 
			
		||||
#mesondefine HAVE_MALLINFO
 | 
			
		||||
 | 
			
		||||
/* Define to 1 if you have the `mallinfo2' function. */
 | 
			
		||||
#mesondefine HAVE_MALLINFO2
 | 
			
		||||
 | 
			
		||||
/* Define to 1 fi you have the <sys/resource.h> header file. */
 | 
			
		||||
#mesondefine HAVE_SYS_RESOURCE_H
 | 
			
		||||
 | 
			
		||||
@@ -33,6 +30,3 @@
 | 
			
		||||
 | 
			
		||||
/* Define if fdwalk is available in libc */
 | 
			
		||||
#mesondefine HAVE_FDWALK
 | 
			
		||||
 | 
			
		||||
/* Define if polkit defines autocleanup functions */
 | 
			
		||||
#mesondefine HAVE_POLKIT_AUTOCLEANUP
 | 
			
		||||
 
 | 
			
		||||
@@ -1,45 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" ?>
 | 
			
		||||
<KeyListEntries schema="org.gnome.shell.keybindings"
 | 
			
		||||
                group="system"
 | 
			
		||||
                name="Launchers"
 | 
			
		||||
                wm_name="GNOME Shell"
 | 
			
		||||
                package="gnome-shell">
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-application-1"
 | 
			
		||||
                      description="Activate favorite application 1"
 | 
			
		||||
                      hidden="true"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-application-2"
 | 
			
		||||
                      description="Activate favorite application 2"
 | 
			
		||||
                      hidden="true"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-application-3"
 | 
			
		||||
                      description="Activate favorite application 3"
 | 
			
		||||
                      hidden="true"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-application-4"
 | 
			
		||||
                      description="Activate favorite application 4"
 | 
			
		||||
                      hidden="true"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-application-5"
 | 
			
		||||
                      description="Activate favorite application 5"
 | 
			
		||||
                      hidden="true"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-application-6"
 | 
			
		||||
                      description="Activate favorite application 6"
 | 
			
		||||
                      hidden="true"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-application-7"
 | 
			
		||||
                      description="Activate favorite application 7"
 | 
			
		||||
                      hidden="true"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-application-8"
 | 
			
		||||
                      description="Activate favorite application 8"
 | 
			
		||||
                      hidden="true"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-application-9"
 | 
			
		||||
                      description="Activate favorite application 9"
 | 
			
		||||
                      hidden="true"/>
 | 
			
		||||
 | 
			
		||||
</KeyListEntries>
 | 
			
		||||
 | 
			
		||||
@@ -1,20 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" ?>
 | 
			
		||||
<KeyListEntries schema="org.gnome.shell.keybindings"
 | 
			
		||||
                group="system"
 | 
			
		||||
                name="Screenshots"
 | 
			
		||||
                wm_name="GNOME Shell"
 | 
			
		||||
                package="gnome-shell">
 | 
			
		||||
 | 
			
		||||
    <KeyListEntry name="show-screenshot-ui"
 | 
			
		||||
                  description="Take a screenshot interactively"/>
 | 
			
		||||
 | 
			
		||||
    <KeyListEntry name="screenshot"
 | 
			
		||||
                  description="Take a screenshot"/>
 | 
			
		||||
 | 
			
		||||
    <KeyListEntry name="screenshot-window"
 | 
			
		||||
                  description="Take a screenshot of a window"/>
 | 
			
		||||
 | 
			
		||||
    <KeyListEntry name="show-screen-recording-ui"
 | 
			
		||||
                  description="Record a screencast interactively"/>
 | 
			
		||||
 | 
			
		||||
</KeyListEntries>
 | 
			
		||||
@@ -1,75 +1,33 @@
 | 
			
		||||
Gnome-shell OSK layouts are extracted from CLDR layout definitions:
 | 
			
		||||
https://www.unicode.org/cldr/charts/latest/keyboards/layouts/index.html
 | 
			
		||||
 | 
			
		||||
To add new layouts from CLDR:
 | 
			
		||||
Updating these involves several steps:
 | 
			
		||||
 | 
			
		||||
1) Downloading and unzipping the tarball found at:
 | 
			
		||||
   http://www.unicode.org/Public/cldr/latest/keyboards.zip
 | 
			
		||||
 | 
			
		||||
   This file contains XML files describing the keyboard layouts.
 | 
			
		||||
 | 
			
		||||
2) Cloning the cldr2json script at:
 | 
			
		||||
   git://repo.or.cz/cldr2json.git
 | 
			
		||||
 | 
			
		||||
   It will be used to convert the XML files into JSON that can be
 | 
			
		||||
   directly consumed by gnome-shell.
 | 
			
		||||
 | 
			
		||||
3) Running the script to produce the files:
 | 
			
		||||
   ./cldr2json <input-directory> <output-directory>
 | 
			
		||||
 | 
			
		||||
   We shall usually use the "android" folder, since that's most
 | 
			
		||||
   complete, and similar to our UI and target sizes. And the target
 | 
			
		||||
   directory must be data/osk-layouts in this repository.
 | 
			
		||||
 | 
			
		||||
4) Modify gnome-shell-osk-layouts.gresource.xml to include the files
 | 
			
		||||
 | 
			
		||||
5) Do git add on the updated/new files, and git commit.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Or alternatively:
 | 
			
		||||
 | 
			
		||||
1) Run update-osk-layouts.sh
 | 
			
		||||
 | 
			
		||||
2) Modify JSON files to add extra keys, tweak appearance...
 | 
			
		||||
 | 
			
		||||
2) Do git add and git commit
 | 
			
		||||
 | 
			
		||||
JSON file format
 | 
			
		||||
================
 | 
			
		||||
 | 
			
		||||
Each JSON file describes a keymap for a certain language and layout,
 | 
			
		||||
it has the following structure:
 | 
			
		||||
 | 
			
		||||
- Root (Object)
 | 
			
		||||
 | 
			
		||||
  Root object of a layout, has the following properties:
 | 
			
		||||
 | 
			
		||||
  - levels (Array of Level): Levels in the keymap
 | 
			
		||||
  - locale (String): Locale name for this keymap
 | 
			
		||||
  - name (String): Human readable name for this keymap
 | 
			
		||||
 | 
			
		||||
- Level (Object)
 | 
			
		||||
 | 
			
		||||
  A level defines the keys available on a keyboard level,
 | 
			
		||||
  these are the key panels visible at a time. E.g. to type
 | 
			
		||||
  uppercase levels or symbols.
 | 
			
		||||
 | 
			
		||||
  Levels have the following properties:
 | 
			
		||||
 | 
			
		||||
  - level (String): Name of the level, common names are
 | 
			
		||||
    "", "shift", "opt" and "opt+shift".
 | 
			
		||||
  - mode (String): Mode for this level, common modes are
 | 
			
		||||
    "default", "latched" and "locked".
 | 
			
		||||
  - rows (Array of Row): Array of rows of keys.
 | 
			
		||||
 | 
			
		||||
- Row (Array)
 | 
			
		||||
 | 
			
		||||
  A row is an Array of Key.
 | 
			
		||||
 | 
			
		||||
- Key (Object)
 | 
			
		||||
 | 
			
		||||
  A keyboard key. Keys have the following properties:
 | 
			
		||||
 | 
			
		||||
  - iconName (String): Icon name to show on the key.
 | 
			
		||||
    Keys with an icon name do not have a label.
 | 
			
		||||
  - label (String): Label to show on the key.
 | 
			
		||||
  - strings (Array of String): Strings to commit. If
 | 
			
		||||
    label property does not exist, the first element
 | 
			
		||||
    will be also the label. Extra elements are shown
 | 
			
		||||
    in the extra keys popover.
 | 
			
		||||
  - keyval (String): Hexadecimal keyval to emit as
 | 
			
		||||
    emulated key presses. Committed strings are
 | 
			
		||||
    preferred.
 | 
			
		||||
  - width (Double): Relative width of the key in the
 | 
			
		||||
    row. 1 is for a square key. Multiples of 0.5 are
 | 
			
		||||
    accepted.
 | 
			
		||||
  - level (Integer): Level that the key switches to.
 | 
			
		||||
    See the levelSwitch action.
 | 
			
		||||
  - action (string): Action performed by the key,
 | 
			
		||||
    accepted actions are:
 | 
			
		||||
 | 
			
		||||
    - hide: Hides the OSK
 | 
			
		||||
    - languageMenu: Pops up the language selection
 | 
			
		||||
      menu
 | 
			
		||||
    - emoji: Switches to the emoji selection panel
 | 
			
		||||
    - modifier: Handles the keyval as a modifier
 | 
			
		||||
      key. This handles e.g. Ctrl+A as a sequence
 | 
			
		||||
      of Ctrl press, A press, A release, Ctrl
 | 
			
		||||
      release.
 | 
			
		||||
    - delete: Deletes text backwards
 | 
			
		||||
    - levelSwitch: Switches OSK to a different level
 | 
			
		||||
 
 | 
			
		||||
@@ -79,7 +79,7 @@ def parse_rows(keymap):
 | 
			
		||||
                       reverse=True):
 | 
			
		||||
        row = []
 | 
			
		||||
        for key in sorted(v, key=lambda x: x):
 | 
			
		||||
            row.append({ 'strings': key[1] })
 | 
			
		||||
            row.append(key[1])
 | 
			
		||||
        rows.append(row)
 | 
			
		||||
 | 
			
		||||
    return rows
 | 
			
		||||
@@ -123,7 +123,7 @@ def locale_to_xkb(locale, name):
 | 
			
		||||
        if xkb:
 | 
			
		||||
            return xkb
 | 
			
		||||
        else:
 | 
			
		||||
            raise KeyError("layout %s explicitly disabled in overrides"
 | 
			
		||||
            raise KeyError("layout %s explicitely disabled in overrides"
 | 
			
		||||
                           % locale)
 | 
			
		||||
    xkb_names = sorted(name_to_xkb.keys())
 | 
			
		||||
    if name in xkb_names:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,76 +0,0 @@
 | 
			
		||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
 | 
			
		||||
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
 | 
			
		||||
 | 
			
		||||
<node>
 | 
			
		||||
 | 
			
		||||
  <!--
 | 
			
		||||
      net.hadess.PowerProfiles:
 | 
			
		||||
      @short_description: Power Profiles daemon
 | 
			
		||||
 | 
			
		||||
      The power-profiles-daemon API is meant to be used by parts of the OS or
 | 
			
		||||
      desktop environment to switch system power profiles based on user choice,
 | 
			
		||||
      or user intent.
 | 
			
		||||
 | 
			
		||||
      OS components would typically use the "Profiles" property to construct
 | 
			
		||||
      their UI (2 or 3 profiles available), and monitor the "ActiveProfile"
 | 
			
		||||
      and the "PerformanceInhibited" properties to update that UI. The UI
 | 
			
		||||
      would try to set the "ActiveProfile" property if the user selected
 | 
			
		||||
      a different one.
 | 
			
		||||
 | 
			
		||||
      Note that the reason why the project exists and how it is different from
 | 
			
		||||
      existing projects is explained <ulink href=" https://gitlab.freedesktop.org/hadess/power-profiles-daemon/-/blob/master/README.md">
 | 
			
		||||
      in the project's README file</ulink>.
 | 
			
		||||
 | 
			
		||||
      The object path will be "/net/hadess/PowerProfiles".
 | 
			
		||||
  -->
 | 
			
		||||
  <interface name="net.hadess.PowerProfiles">
 | 
			
		||||
    <!--
 | 
			
		||||
        ActiveProfile:
 | 
			
		||||
 | 
			
		||||
        The type of the currently active profile. It might change automatically
 | 
			
		||||
        if the "performance" profile was selected but it got inhibited, in which
 | 
			
		||||
        case the "PerformanceInhibited" property will reflect the reason.
 | 
			
		||||
    -->
 | 
			
		||||
    <property name="ActiveProfile" type="s" access="readwrite"/>
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
        PerformanceInhibited:
 | 
			
		||||
 | 
			
		||||
        This will be set if the performance power profile is unavailable, with
 | 
			
		||||
        the value being used to identify the reason for unavailability. As new
 | 
			
		||||
        reasons can be added, it is recommended that front-ends show a generic
 | 
			
		||||
        reason if they do not recognise the value. Possible values are:
 | 
			
		||||
        - "lap-detected" (the computer is sitting on the user's lap)
 | 
			
		||||
        - "high-operating-temperature" (the computer is close to overheating)
 | 
			
		||||
        - "" (the empty string, if not inhibited)
 | 
			
		||||
    -->
 | 
			
		||||
    <property name="PerformanceInhibited" type="s" access="read"/>
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
        Profiles:
 | 
			
		||||
 | 
			
		||||
        An array of key-pair values representing each profile. The key named
 | 
			
		||||
        "Driver" (s) identifies the power-profiles-daemon backend code used to
 | 
			
		||||
        implement the profile.
 | 
			
		||||
 | 
			
		||||
        The key named "Profile" (s) will be one of:
 | 
			
		||||
        - "power-saver" (battery saving profile)
 | 
			
		||||
        - "balanced" (the default  profile)
 | 
			
		||||
        - "performance" (a profile that does not care about noise or battery consumption)
 | 
			
		||||
 | 
			
		||||
        Only one of each type of profile will be listed, with the daemon choosing the
 | 
			
		||||
        more appropriate "driver" for each profile type.
 | 
			
		||||
    -->
 | 
			
		||||
    <property name="Profiles" type="aa{sv}" access="read"/>
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
        Actions:
 | 
			
		||||
 | 
			
		||||
        An array of strings listing each one of the "actions" implemented in
 | 
			
		||||
        the running daemon. This is used by API users to figure out whether
 | 
			
		||||
        particular functionality is available in a version of the daemon.
 | 
			
		||||
    -->
 | 
			
		||||
    <property name="Actions" type="as" access="read"/>
 | 
			
		||||
 | 
			
		||||
  </interface>
 | 
			
		||||
</node>
 | 
			
		||||
@@ -1,78 +0,0 @@
 | 
			
		||||
<!DOCTYPE node PUBLIC
 | 
			
		||||
"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
 | 
			
		||||
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
 | 
			
		||||
 | 
			
		||||
<node>
 | 
			
		||||
	<interface name="net.reactivated.Fprint.Device">
 | 
			
		||||
		<method name="ListEnrolledFingers">
 | 
			
		||||
			<arg type="s" name="username" direction="in">
 | 
			
		||||
			</arg>
 | 
			
		||||
			<arg type="as" name="enrolled_fingers" direction="out">
 | 
			
		||||
			</arg>
 | 
			
		||||
		</method>
 | 
			
		||||
 | 
			
		||||
		<method name="DeleteEnrolledFingers">
 | 
			
		||||
			<arg type="s" name="username" direction="in">
 | 
			
		||||
			</arg>
 | 
			
		||||
		</method>
 | 
			
		||||
 | 
			
		||||
		<method name="DeleteEnrolledFingers2">
 | 
			
		||||
		</method>
 | 
			
		||||
 | 
			
		||||
		<method name="Claim">
 | 
			
		||||
			<arg type="s" name="username" direction="in">
 | 
			
		||||
			</arg>
 | 
			
		||||
		</method>
 | 
			
		||||
 | 
			
		||||
		<method name="Release">
 | 
			
		||||
		</method>
 | 
			
		||||
 | 
			
		||||
		<method name="VerifyStart">
 | 
			
		||||
			<arg type="s" name="finger_name" direction="in">
 | 
			
		||||
			</arg>
 | 
			
		||||
		</method>
 | 
			
		||||
 | 
			
		||||
		<method name="VerifyStop">
 | 
			
		||||
		</method>
 | 
			
		||||
 | 
			
		||||
		<signal name="VerifyFingerSelected">
 | 
			
		||||
			<arg type="s" name="finger_name">
 | 
			
		||||
			</arg>
 | 
			
		||||
		</signal>
 | 
			
		||||
 | 
			
		||||
		<signal name="VerifyStatus">
 | 
			
		||||
			<arg type="s" name="result">
 | 
			
		||||
			</arg>
 | 
			
		||||
 | 
			
		||||
			<arg type="b" name="done">
 | 
			
		||||
			</arg>
 | 
			
		||||
 | 
			
		||||
		</signal>
 | 
			
		||||
 | 
			
		||||
		<method name="EnrollStart">
 | 
			
		||||
			<arg type="s" name="finger_name" direction="in">
 | 
			
		||||
			</arg>
 | 
			
		||||
		</method>
 | 
			
		||||
 | 
			
		||||
		<method name="EnrollStop">
 | 
			
		||||
		</method>
 | 
			
		||||
 | 
			
		||||
		<signal name="EnrollStatus">
 | 
			
		||||
			<arg type="s" name="result">
 | 
			
		||||
			</arg>
 | 
			
		||||
 | 
			
		||||
			<arg type="b" name="done">
 | 
			
		||||
			</arg>
 | 
			
		||||
		</signal>
 | 
			
		||||
 | 
			
		||||
		<property name="name" type="s" access="read">
 | 
			
		||||
		</property>
 | 
			
		||||
 | 
			
		||||
		<property name="num-enroll-stages" type="i" access="read">
 | 
			
		||||
		</property>
 | 
			
		||||
 | 
			
		||||
		<property name="scan-type" type="s" access="read">
 | 
			
		||||
		</property>
 | 
			
		||||
 | 
			
		||||
	</interface>
 | 
			
		||||
</node>
 | 
			
		||||
@@ -1,18 +0,0 @@
 | 
			
		||||
<!DOCTYPE node PUBLIC
 | 
			
		||||
"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
 | 
			
		||||
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
 | 
			
		||||
<node>
 | 
			
		||||
	<interface name="net.reactivated.Fprint.Manager">
 | 
			
		||||
 | 
			
		||||
		<method name="GetDevices">
 | 
			
		||||
			<arg type="ao" name="devices" direction="out">
 | 
			
		||||
			</arg>
 | 
			
		||||
		</method>
 | 
			
		||||
 | 
			
		||||
		<method name="GetDefaultDevice">
 | 
			
		||||
			<arg type="o" name="device" direction="out">
 | 
			
		||||
			</arg>
 | 
			
		||||
		</method>
 | 
			
		||||
 | 
			
		||||
	</interface>
 | 
			
		||||
</node>
 | 
			
		||||
@@ -20,12 +20,6 @@
 | 
			
		||||
    <method name="ListSessions">
 | 
			
		||||
      <arg name="sessions" type="a(susso)" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="CanRebootToBootLoaderMenu">
 | 
			
		||||
      <arg type="s" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="SetRebootToBootLoaderMenu">
 | 
			
		||||
      <arg type="t" direction="in"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <signal name="PrepareForSleep">
 | 
			
		||||
      <arg type="b" direction="out"/>
 | 
			
		||||
    </signal>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								data/dbus-interfaces/org.gnome.Magnifier.ZoomRegion.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,26 @@
 | 
			
		||||
<node>
 | 
			
		||||
  <interface name="org.gnome.Magnifier.ZoomRegion">
 | 
			
		||||
    <method name="setMagFactor">
 | 
			
		||||
      <arg type="d" direction="in"/>
 | 
			
		||||
      <arg type="d" direction="in"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="getMagFactor">
 | 
			
		||||
      <arg type="d" direction="out"/>
 | 
			
		||||
      <arg type="d" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="setRoi">
 | 
			
		||||
      <arg type="ai" direction="in"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="getRoi">
 | 
			
		||||
      <arg type="ai" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="shiftContentsTo">
 | 
			
		||||
      <arg type="i" direction="in"/>
 | 
			
		||||
      <arg type="i" direction="in"/>
 | 
			
		||||
      <arg type="b" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="moveResize">
 | 
			
		||||
      <arg type="ai" direction="in"/>
 | 
			
		||||
    </method>
 | 
			
		||||
  </interface>
 | 
			
		||||
</node>
 | 
			
		||||
							
								
								
									
										54
									
								
								data/dbus-interfaces/org.gnome.Magnifier.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,54 @@
 | 
			
		||||
<node>
 | 
			
		||||
  <interface name="org.gnome.Magnifier">
 | 
			
		||||
    <method name="setActive">
 | 
			
		||||
      <arg type="b" direction="in"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="isActive">
 | 
			
		||||
      <arg type="b" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="showCursor"/>
 | 
			
		||||
    <method name="hideCursor"/>
 | 
			
		||||
    <method name="createZoomRegion">
 | 
			
		||||
      <arg type="d" direction="in"/>
 | 
			
		||||
      <arg type="d" direction="in"/>
 | 
			
		||||
      <arg type="ai" direction="in"/>
 | 
			
		||||
      <arg type="ai" direction="in"/>
 | 
			
		||||
      <arg type="o" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="addZoomRegion">
 | 
			
		||||
      <arg type="o" direction="in"/>
 | 
			
		||||
      <arg type="b" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="getZoomRegions">
 | 
			
		||||
      <arg type="ao" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="clearAllZoomRegions"/>
 | 
			
		||||
    <method name="fullScreenCapable">
 | 
			
		||||
      <arg type="b" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="setCrosswireSize">
 | 
			
		||||
      <arg type="i" direction="in"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="getCrosswireSize">
 | 
			
		||||
      <arg type="i" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="setCrosswireLength">
 | 
			
		||||
      <arg type="i" direction="in"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="getCrosswireLength">
 | 
			
		||||
      <arg type="i" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="setCrosswireClip">
 | 
			
		||||
      <arg type="b" direction="in"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="getCrosswireClip">
 | 
			
		||||
      <arg type="b" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="setCrosswireColor">
 | 
			
		||||
      <arg type="u" direction="in"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="getCrosswireColor">
 | 
			
		||||
      <arg type="u" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
  </interface>
 | 
			
		||||
</node>
 | 
			
		||||
@@ -1,191 +0,0 @@
 | 
			
		||||
<!DOCTYPE node PUBLIC
 | 
			
		||||
'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
 | 
			
		||||
'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
 | 
			
		||||
<node>
 | 
			
		||||
 | 
			
		||||
  <!--
 | 
			
		||||
      org.gnome.Mutter.ScreenCast:
 | 
			
		||||
      @short_description: Screen cast interface
 | 
			
		||||
 | 
			
		||||
      This API is private and not intended to be used outside of the integrated
 | 
			
		||||
      system that uses libmutter. No compatibility between versions are
 | 
			
		||||
      promised.
 | 
			
		||||
  -->
 | 
			
		||||
  <interface name="org.gnome.Mutter.ScreenCast">
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
	CreateSession:
 | 
			
		||||
	@properties: Properties
 | 
			
		||||
	@session_path: Path to the new session object
 | 
			
		||||
 | 
			
		||||
	* "remote-desktop-session-id" (s): The ID of a remote desktop session.
 | 
			
		||||
					   Remote desktop driven screen casts
 | 
			
		||||
					   are started and stopped by the remote
 | 
			
		||||
					   desktop session.
 | 
			
		||||
	* "disable-animations" (b): Set to "true" if the screen cast application
 | 
			
		||||
				    would prefer animations to be globally
 | 
			
		||||
				    disabled, while the session is running. Default
 | 
			
		||||
				    is "false". Available since version 3.
 | 
			
		||||
    -->
 | 
			
		||||
    <method name="CreateSession">
 | 
			
		||||
      <arg name="properties" type="a{sv}" direction="in" />
 | 
			
		||||
      <arg name="session_path" type="o" direction="out" />
 | 
			
		||||
    </method>
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
        Version:
 | 
			
		||||
        @short_description: API version
 | 
			
		||||
    -->
 | 
			
		||||
    <property name="Version" type="i" access="read" />
 | 
			
		||||
 | 
			
		||||
  </interface>
 | 
			
		||||
 | 
			
		||||
  <!--
 | 
			
		||||
       org.gnome.Mutter.ScreenCast.Session:
 | 
			
		||||
       @short_description: Screen cast session
 | 
			
		||||
  -->
 | 
			
		||||
  <interface name="org.gnome.Mutter.ScreenCast.Session">
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
	Start:
 | 
			
		||||
 | 
			
		||||
	Start the screen cast session
 | 
			
		||||
    -->
 | 
			
		||||
    <method name="Start" />
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
	Stop:
 | 
			
		||||
 | 
			
		||||
	Stop the screen cast session
 | 
			
		||||
    -->
 | 
			
		||||
    <method name="Stop" />
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
	Closed:
 | 
			
		||||
 | 
			
		||||
	The session has closed.
 | 
			
		||||
    -->
 | 
			
		||||
    <signal name="Closed" />
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
	RecordMonitor:
 | 
			
		||||
	@connector: Connector of the monitor to record
 | 
			
		||||
	@properties: Properties
 | 
			
		||||
	@stream_path: Path to the new stream object
 | 
			
		||||
 | 
			
		||||
	Record a single monitor.
 | 
			
		||||
 | 
			
		||||
	Available @properties include:
 | 
			
		||||
 | 
			
		||||
	* "cursor-mode" (u): Cursor mode. Default: 'hidden' (see below)
 | 
			
		||||
	                     Available since API version 2.
 | 
			
		||||
	* "is-recording" (b): Whether this is a screen recording. May be
 | 
			
		||||
			      be used for choosing panel icon.
 | 
			
		||||
			      Default: false. Available since API version 4.
 | 
			
		||||
 | 
			
		||||
	Available cursor mode values:
 | 
			
		||||
 | 
			
		||||
	0: hidden - cursor is not included in the stream
 | 
			
		||||
	1: embedded - cursor is included in the framebuffer
 | 
			
		||||
	2: metadata - cursor is included as metadata in the PipeWire stream
 | 
			
		||||
    -->
 | 
			
		||||
    <method name="RecordMonitor">
 | 
			
		||||
      <arg name="connector" type="s" direction="in" />
 | 
			
		||||
      <arg name="properties" type="a{sv}" direction="in" />
 | 
			
		||||
      <arg name="stream_path" type="o" direction="out" />
 | 
			
		||||
    </method>
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
	RecordWindow:
 | 
			
		||||
	@properties: Properties used determining what window to select
 | 
			
		||||
	@stream_path: Path to the new stream object
 | 
			
		||||
 | 
			
		||||
	Supported since API version 2.
 | 
			
		||||
 | 
			
		||||
	Record a single window. The cursor will not be included.
 | 
			
		||||
 | 
			
		||||
	Available @properties include:
 | 
			
		||||
 | 
			
		||||
	* "window-id" (t): Id of the window to record.
 | 
			
		||||
	* "cursor-mode" (u): Cursor mode. Default: 'hidden' (see RecordMonitor).
 | 
			
		||||
	* "is-recording" (b): Whether this is a screen recording. May be
 | 
			
		||||
			      be used for choosing panel icon.
 | 
			
		||||
			      Default: false. Available since API version 4.
 | 
			
		||||
 | 
			
		||||
    -->
 | 
			
		||||
    <method name="RecordWindow">
 | 
			
		||||
      <arg name="properties" type="a{sv}" direction="in" />
 | 
			
		||||
      <arg name="stream_path" type="o" direction="out" />
 | 
			
		||||
    </method>
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
	RecordArea:
 | 
			
		||||
	@x: X position of the recorded area
 | 
			
		||||
	@y: Y position of the recorded area
 | 
			
		||||
	@width: width of the recorded area
 | 
			
		||||
	@height: height of the recorded area
 | 
			
		||||
	@properties: Properties
 | 
			
		||||
	@stream_path: Path to the new stream object
 | 
			
		||||
 | 
			
		||||
	Record an area of the stage. The coordinates are in stage coordinates.
 | 
			
		||||
	The size of the stream does not necessarily match the size of the
 | 
			
		||||
	recorded area, and will depend on DPI scale of the affected monitors.
 | 
			
		||||
 | 
			
		||||
	Available @properties include:
 | 
			
		||||
 | 
			
		||||
	* "cursor-mode" (u): Cursor mode. Default: 'hidden' (see below)
 | 
			
		||||
	                     Available since API version 2.
 | 
			
		||||
	* "is-recording" (b): Whether this is a screen recording. May be
 | 
			
		||||
			      be used for choosing panel icon.
 | 
			
		||||
			      Default: false. Available since API version 4.
 | 
			
		||||
 | 
			
		||||
	Available cursor mode values:
 | 
			
		||||
 | 
			
		||||
	0: hidden - cursor is not included in the stream
 | 
			
		||||
	1: embedded - cursor is included in the framebuffer
 | 
			
		||||
	2: metadata - cursor is included as metadata in the PipeWire stream
 | 
			
		||||
    -->
 | 
			
		||||
    <method name="RecordArea">
 | 
			
		||||
      <arg name="x" type="i" direction="in" />
 | 
			
		||||
      <arg name="y" type="i" direction="in" />
 | 
			
		||||
      <arg name="width" type="i" direction="in" />
 | 
			
		||||
      <arg name="height" type="i" direction="in" />
 | 
			
		||||
      <arg name="properties" type="a{sv}" direction="in" />
 | 
			
		||||
      <arg name="stream_path" type="o" direction="out" />
 | 
			
		||||
    </method>
 | 
			
		||||
  </interface>
 | 
			
		||||
 | 
			
		||||
  <!--
 | 
			
		||||
       org.gnome.Mutter.ScreenCast.Stream:
 | 
			
		||||
       @short_description: Screen cast stream
 | 
			
		||||
  -->
 | 
			
		||||
  <interface name="org.gnome.Mutter.ScreenCast.Stream">
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
	PipeWireStreamAdded:
 | 
			
		||||
	@short_description: Pipewire stream added
 | 
			
		||||
 | 
			
		||||
	A signal emitted when PipeWire stream for the screen cast stream has
 | 
			
		||||
	been created. The @node_id corresponds to the PipeWire stream node.
 | 
			
		||||
    -->
 | 
			
		||||
    <signal name="PipeWireStreamAdded">
 | 
			
		||||
      <annotation name="org.gtk.GDBus.C.Name" value="pipewire-stream-added"/>
 | 
			
		||||
      <arg name="node_id" type="u" direction="out" />
 | 
			
		||||
    </signal>
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
	Parameters:
 | 
			
		||||
	@short_description: Optional stream parameters
 | 
			
		||||
 | 
			
		||||
	Available parameters include:
 | 
			
		||||
 | 
			
		||||
	* "position" (ii): Position of the source of the stream in the
 | 
			
		||||
	                   compositor coordinate space.
 | 
			
		||||
	* "size" (ii): Size of the source of the stream in the compositor
 | 
			
		||||
		       coordinate space.
 | 
			
		||||
    -->
 | 
			
		||||
    <property name="Parameters" type="a{sv}" access="read" />
 | 
			
		||||
 | 
			
		||||
  </interface>
 | 
			
		||||
 | 
			
		||||
</node>
 | 
			
		||||
@@ -3,9 +3,6 @@
 | 
			
		||||
    <method name="GetAppId">
 | 
			
		||||
      <arg type="s" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="GetFlags">
 | 
			
		||||
      <arg type="u" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="GetReason">
 | 
			
		||||
      <arg type="s" direction="out"/>
 | 
			
		||||
    </method>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
<node>
 | 
			
		||||
  <interface name="org.gnome.SettingsDaemon.Rfkill">
 | 
			
		||||
    <property name="AirplaneMode" type="b" access="readwrite"/>
 | 
			
		||||
    <property name="HasAirplaneMode" type="b" access="read"/>
 | 
			
		||||
    <property name="HardwareAirplaneMode" type="b" access="read"/>
 | 
			
		||||
    <property name="BluetoothAirplaneMode" type="b" access="readwrite"/>
 | 
			
		||||
    <property name="BluetoothHasAirplaneMode" type="b" access="read"/>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,12 @@
 | 
			
		||||
<node>
 | 
			
		||||
  <interface name="org.gnome.Shell.CalendarServer">
 | 
			
		||||
    <method name="SetTimeRange">
 | 
			
		||||
      <arg type="x" name="since" direction="in"/>
 | 
			
		||||
      <arg type="x" name="until" direction="in"/>
 | 
			
		||||
      <arg type="b" name="force_reload" direction="in"/>
 | 
			
		||||
    <method name="GetEvents">
 | 
			
		||||
      <arg type="x" direction="in" />
 | 
			
		||||
      <arg type="x" direction="in" />
 | 
			
		||||
      <arg type="b" direction="in" />
 | 
			
		||||
      <arg type="a(sssbxxa{sv})" direction="out" />
 | 
			
		||||
    </method>
 | 
			
		||||
    <signal name="EventsAddedOrUpdated">
 | 
			
		||||
      <arg type="a(ssxxa{sv})" name="events" direction="out"/>
 | 
			
		||||
    </signal>
 | 
			
		||||
    <signal name="EventsRemoved">
 | 
			
		||||
      <arg type="as" name="ids" direction="out"/>
 | 
			
		||||
    </signal>
 | 
			
		||||
    <signal name="ClientDisappeared">
 | 
			
		||||
      <arg type="s" name="source_uid" direction="out"/>
 | 
			
		||||
    </signal>
 | 
			
		||||
    <property name="HasCalendars" type="b" access="read" />
 | 
			
		||||
    <signal name="Changed" />
 | 
			
		||||
  </interface>
 | 
			
		||||
</node>
 | 
			
		||||
 
 | 
			
		||||
@@ -180,10 +180,10 @@
 | 
			
		||||
 | 
			
		||||
        Enable an extension.
 | 
			
		||||
    -->
 | 
			
		||||
    <method name="EnableExtension">
 | 
			
		||||
      <arg type="s" direction="in" name="uuid"/>
 | 
			
		||||
      <arg type="b" direction="out" name="success"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="EnableExtension"> \
 | 
			
		||||
      <arg type="s" direction="in" name="uuid"/> \
 | 
			
		||||
      <arg type="b" direction="out" name="success"/> \
 | 
			
		||||
    </method> \
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
        DisableExtension:
 | 
			
		||||
@@ -192,10 +192,10 @@
 | 
			
		||||
 | 
			
		||||
        Disable an extension.
 | 
			
		||||
    -->
 | 
			
		||||
    <method name="DisableExtension">
 | 
			
		||||
      <arg type="s" direction="in" name="uuid"/>
 | 
			
		||||
      <arg type="b" direction="out" name="success"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="DisableExtension"> \
 | 
			
		||||
      <arg type="s" direction="in" name="uuid"/> \
 | 
			
		||||
      <arg type="b" direction="out" name="success"/> \
 | 
			
		||||
    </method> \
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
        LaunchExtensionPrefs:
 | 
			
		||||
 
 | 
			
		||||
@@ -18,12 +18,6 @@
 | 
			
		||||
    -->
 | 
			
		||||
    <signal name="RunningApplicationsChanged" />
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
        WindowsChanged:
 | 
			
		||||
        @short_description: Notifies when any window opens or closes
 | 
			
		||||
    -->
 | 
			
		||||
    <signal name="WindowsChanged" />
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
        GetRunningApplications:
 | 
			
		||||
        @short_description: Retrieves the description of all running applications
 | 
			
		||||
@@ -76,14 +70,6 @@
 | 
			
		||||
    -->
 | 
			
		||||
    <property name="AnimationsEnabled" type="b" access="read"/>
 | 
			
		||||
 | 
			
		||||
    <!--
 | 
			
		||||
       ScreenSize:
 | 
			
		||||
       @short_description: The size of the screen
 | 
			
		||||
 | 
			
		||||
       Since: 3
 | 
			
		||||
    -->
 | 
			
		||||
    <property name="ScreenSize" type="(ii)" access="read"/>
 | 
			
		||||
 | 
			
		||||
    <property name="version" type="u" access="read"/>
 | 
			
		||||
  </interface>
 | 
			
		||||
</node>
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,6 @@
 | 
			
		||||
      <arg type="au" direction="in" name="action"/>
 | 
			
		||||
      <arg type="b" direction="out" name="success"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="ScreenTransition"/>
 | 
			
		||||
    <signal name="AcceleratorActivated">
 | 
			
		||||
      <arg name="action" type="u"/>
 | 
			
		||||
      <arg name="parameters" type="a{sv}"/>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,13 @@
 | 
			
		||||
<node>
 | 
			
		||||
  <interface name="org.gtk.Notifications">
 | 
			
		||||
    <method name="AddNotification">
 | 
			
		||||
      <arg name="app_id" type="s" direction="in"/>
 | 
			
		||||
      <arg name="id" type="s" direction="in"/>
 | 
			
		||||
      <arg name="notification" type="a{sv}" direction="in"/>
 | 
			
		||||
      <arg type="s" direction="in"/>
 | 
			
		||||
      <arg type="s" direction="in"/>
 | 
			
		||||
      <arg type="a{sv}" direction="in"/>
 | 
			
		||||
    </method>
 | 
			
		||||
    <method name="RemoveNotification">
 | 
			
		||||
      <arg name="app_id" type="s" direction="in"/>
 | 
			
		||||
      <arg name="id" type="s" direction="in"/>
 | 
			
		||||
      <arg type="s" direction="in"/>
 | 
			
		||||
      <arg type="s" direction="in"/>
 | 
			
		||||
    </method>
 | 
			
		||||
  </interface>
 | 
			
		||||
</node>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +1,8 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<gresources>
 | 
			
		||||
  <gresource prefix="/org/gnome/shell/dbus-interfaces">
 | 
			
		||||
    <file preprocess="xml-stripblanks">net.hadess.PowerProfiles.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">net.hadess.SensorProxy.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">net.reactivated.Fprint.Device.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">net.reactivated.Fprint.Manager.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">net.hadess.SwitcherooControl.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">org.freedesktop.Application.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">org.freedesktop.bolt1.Device.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">org.freedesktop.bolt1.Manager.xml</file>
 | 
			
		||||
@@ -29,7 +27,8 @@
 | 
			
		||||
    <file preprocess="xml-stripblanks">org.freedesktop.realmd.Service.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">org.freedesktop.UPower.Device.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">org.freedesktop.UPower.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">org.gnome.Mutter.ScreenCast.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">org.gnome.Magnifier.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">org.gnome.Magnifier.ZoomRegion.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">org.gnome.ScreenSaver.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">org.gnome.SessionManager.EndSessionDialog.xml</file>
 | 
			
		||||
    <file preprocess="xml-stripblanks">org.gnome.SessionManager.Inhibitor.xml</file>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,33 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<gresources>
 | 
			
		||||
  <gresource prefix="/org/gnome/shell/icons">
 | 
			
		||||
    <file>scalable/actions/color-pick.svg</file>
 | 
			
		||||
    <file>scalable/actions/carousel-arrow-next-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/actions/carousel-arrow-previous-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/actions/dark-mode-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/actions/pointer-double-click-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/actions/pointer-drag-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/actions/pointer-primary-click-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/actions/pointer-secondary-click-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/actions/preview-close-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/actions/screenshot-ui-area-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/actions/screenshot-ui-display-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/actions/screenshot-ui-show-pointer-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/actions/screenshot-ui-window-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/actions/record-screen-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/actions/screencast-recorded-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/actions/screenshot-recorded-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/status/keyboard-caps-lock-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/status/keyboard-enter-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/status/keyboard-hide-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/status/keyboard-layout-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/status/keyboard-shift-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/status/message-indicator-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/status/no-events-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/status/no-notifications-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/status/screen-privacy-disabled-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/status/screen-privacy-symbolic.svg</file>
 | 
			
		||||
    <file>scalable/status/stop-symbolic.svg</file>
 | 
			
		||||
  </gresource>
 | 
			
		||||
</gresources>
 | 
			
		||||
 | 
			
		||||
@@ -3,13 +3,10 @@
 | 
			
		||||
  <gresource prefix="/org/gnome/shell/osk-layouts">
 | 
			
		||||
    <file>am.json</file>
 | 
			
		||||
    <file>ara.json</file>
 | 
			
		||||
    <file>at.json</file>
 | 
			
		||||
    <file>be.json</file>
 | 
			
		||||
    <file>bg.json</file>
 | 
			
		||||
    <file>by.json</file>
 | 
			
		||||
    <file>ca.json</file>
 | 
			
		||||
    <file>ch.json</file>
 | 
			
		||||
    <file>ch+fr.json</file>
 | 
			
		||||
    <file>cz.json</file>
 | 
			
		||||
    <file>de.json</file>
 | 
			
		||||
    <file>dk.json</file>
 | 
			
		||||
@@ -33,7 +30,6 @@
 | 
			
		||||
    <file>ke.json</file>
 | 
			
		||||
    <file>kg.json</file>
 | 
			
		||||
    <file>kh.json</file>
 | 
			
		||||
    <file>kr.json</file>
 | 
			
		||||
    <file>la.json</file>
 | 
			
		||||
    <file>latam.json</file>
 | 
			
		||||
    <file>lt.json</file>
 | 
			
		||||
@@ -57,7 +53,6 @@
 | 
			
		||||
    <file>ua.json</file>
 | 
			
		||||
    <file>uk.json</file>
 | 
			
		||||
    <file>us.json</file>
 | 
			
		||||
    <file>us-extended.json</file>
 | 
			
		||||
    <file>vn.json</file>
 | 
			
		||||
    <file>za.json</file>
 | 
			
		||||
    <file>emoji.json</file>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								data/gnome-shell-overrides.convert
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,4 @@
 | 
			
		||||
[org.gnome.shell.overrides]
 | 
			
		||||
attach-modal-dialogs = /desktop/gnome/shell/windows/attach_modal_dialogs
 | 
			
		||||
edge-tiling = /desktop/gnome/shell/windows/edge_tiling
 | 
			
		||||
workspaces-only-on-primary = /desktop/gnome/shell/windows/workspaces_only_on_primary
 | 
			
		||||
@@ -2,24 +2,34 @@
 | 
			
		||||
<gresources>
 | 
			
		||||
  <gresource prefix="/org/gnome/shell/theme">
 | 
			
		||||
    <file>calendar-today.svg</file>
 | 
			
		||||
    <file>calendar-today-light.svg</file>
 | 
			
		||||
    <file>checkbox.svg</file>
 | 
			
		||||
    <file>checkbox-focused.svg</file>
 | 
			
		||||
    <file>checkbox-off-focused-light.svg</file>
 | 
			
		||||
    <file>checkbox-off-focused.svg</file>
 | 
			
		||||
    <file>checkbox-off-light.svg</file>
 | 
			
		||||
    <file>checkbox-off.svg</file>
 | 
			
		||||
    <file>checkbox.svg</file>
 | 
			
		||||
    <file>dash-placeholder.svg</file>
 | 
			
		||||
    <file>gnome-shell.css</file>
 | 
			
		||||
    <file>gnome-shell-high-contrast.css</file>
 | 
			
		||||
    <file>gnome-shell-start.svg</file>
 | 
			
		||||
    <file alias="icons/message-indicator-symbolic.svg">message-indicator-symbolic.svg</file>
 | 
			
		||||
    <file>no-events.svg</file>
 | 
			
		||||
    <file>no-notifications.svg</file>
 | 
			
		||||
    <file>pad-osd.css</file>
 | 
			
		||||
    <file alias="icons/eye-open-negative-filled-symbolic.svg">eye-open-negative-filled-symbolic.svg</file>
 | 
			
		||||
    <file alias="icons/eye-not-looking-symbolic.svg">eye-not-looking-symbolic.svg</file>
 | 
			
		||||
    <file alias="icons/pointer-double-click-symbolic.svg">pointer-double-click-symbolic.svg</file>
 | 
			
		||||
    <file alias="icons/pointer-drag-symbolic.svg">pointer-drag-symbolic.svg</file>
 | 
			
		||||
    <file alias="icons/pointer-primary-click-symbolic.svg">pointer-primary-click-symbolic.svg</file>
 | 
			
		||||
    <file alias="icons/pointer-secondary-click-symbolic.svg">pointer-secondary-click-symbolic.svg</file>
 | 
			
		||||
    <file alias="icons/keyboard-caps-lock-filled-symbolic.svg">keyboard-caps-lock-filled-symbolic.svg</file>
 | 
			
		||||
    <file alias="icons/keyboard-enter-symbolic.svg">keyboard-enter-symbolic.svg</file>
 | 
			
		||||
    <file alias="icons/keyboard-hide-symbolic.svg">keyboard-hide-symbolic.svg</file>
 | 
			
		||||
    <file alias="icons/keyboard-layout-filled-symbolic.svg">keyboard-layout-filled-symbolic.svg</file>
 | 
			
		||||
    <file alias="icons/keyboard-shift-filled-symbolic.svg">keyboard-shift-filled-symbolic.svg</file>
 | 
			
		||||
    <file>process-working.svg</file>
 | 
			
		||||
    <file>toggle-off.svg</file>
 | 
			
		||||
    <file>toggle-off-dark.svg</file>
 | 
			
		||||
    <file>toggle-off-hc.svg</file>
 | 
			
		||||
    <file>toggle-off-light.svg</file>
 | 
			
		||||
    <file>toggle-on.svg</file>
 | 
			
		||||
    <file>toggle-on-dark.svg</file>
 | 
			
		||||
    <file>toggle-on-hc.svg</file>
 | 
			
		||||
    <file>toggle-on-light.svg</file>
 | 
			
		||||
    <file>workspace-placeholder.svg</file>
 | 
			
		||||
  </gresource>
 | 
			
		||||
</gresources>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=GNOME Shell on Wayland
 | 
			
		||||
# On wayland, force a session shutdown
 | 
			
		||||
OnFailure=org.gnome.Shell-disable-extensions.service gnome-session-shutdown.target
 | 
			
		||||
OnFailure=gnome-shell-disable-extensions.service gnome-session-shutdown.target
 | 
			
		||||
OnFailureJobMode=replace-irreversibly
 | 
			
		||||
CollectMode=inactive-or-failed
 | 
			
		||||
RefuseManualStart=on
 | 
			
		||||
@@ -13,21 +13,18 @@ Requisite=gnome-session-initialized.target
 | 
			
		||||
PartOf=gnome-session-initialized.target
 | 
			
		||||
Before=gnome-session-initialized.target
 | 
			
		||||
 | 
			
		||||
# The units already conflict because they use the same BusName
 | 
			
		||||
#Conflicts=gnome-shell-x11.service
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Slice=session.slice
 | 
			
		||||
Type=notify
 | 
			
		||||
# NOTE: This can be replaced with ConditionEnvironment=XDG_SESSION_TYPE=%I in
 | 
			
		||||
#       the [Unit] section with systemd >= 246. Also, the current solution is
 | 
			
		||||
#       kind of painful as systemd had a bug where it retries the condition.
 | 
			
		||||
# Only start if the template instance matches the session type.
 | 
			
		||||
ExecCondition=/bin/sh -c 'test "$XDG_SESSION_TYPE" = "%I" || exit 2'
 | 
			
		||||
ExecStart=@bindir@/gnome-shell
 | 
			
		||||
# Exit code 1 means we are probably *not* dealing with an extension failure
 | 
			
		||||
SuccessExitStatus=1
 | 
			
		||||
 | 
			
		||||
# unset some environment variables that were set by the shell and won't work now that the shell is gone
 | 
			
		||||
ExecStopPost=-/bin/sh -c 'test "$SERVICE_RESULT" != "exec-condition" && systemctl --user unset-environment GNOME_SETUP_DISPLAY WAYLAND_DISPLAY DISPLAY XAUTHORITY'
 | 
			
		||||
ExecStopPost=-systemctl --user unset-environment GNOME_SETUP_DISPLAY WAYLAND_DISPLAY DISPLAY XAUTHORITY
 | 
			
		||||
 | 
			
		||||
# Exit code 1 means we are probably *not* dealing with an extension failure
 | 
			
		||||
SuccessExitStatus=1
 | 
			
		||||
# On wayland we cannot restart
 | 
			
		||||
Restart=no
 | 
			
		||||
# Kill any stubborn child processes after this long
 | 
			
		||||
							
								
								
									
										10
									
								
								data/gnome-shell-wayland.target
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,10 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=GNOME Shell on Wayland
 | 
			
		||||
DefaultDependencies=no
 | 
			
		||||
 | 
			
		||||
Requisite=gnome-session-initialized.target
 | 
			
		||||
PartOf=gnome-session-initialized.target
 | 
			
		||||
Before=gnome-session-initialized.target
 | 
			
		||||
 | 
			
		||||
Requires=gnome-shell-wayland.service
 | 
			
		||||
After=gnome-shell-wayland.service
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=GNOME Shell on X11
 | 
			
		||||
# On X11, try to show the GNOME Session Failed screen
 | 
			
		||||
OnFailure=org.gnome.Shell-disable-extensions.service gnome-session-failed.target
 | 
			
		||||
OnFailure=gnome-shell-disable-extensions.service gnome-session-failed.target
 | 
			
		||||
OnFailureJobMode=replace
 | 
			
		||||
CollectMode=inactive-or-failed
 | 
			
		||||
RefuseManualStart=on
 | 
			
		||||
@@ -13,24 +13,18 @@ Requisite=gnome-session-initialized.target
 | 
			
		||||
PartOf=gnome-session-initialized.target
 | 
			
		||||
Before=gnome-session-initialized.target
 | 
			
		||||
 | 
			
		||||
# The units already conflict because they use the same BusName
 | 
			
		||||
#Conflicts=gnome-shell-wayland.service
 | 
			
		||||
 | 
			
		||||
# Limit startup frequency more than the default
 | 
			
		||||
StartLimitIntervalSec=15s
 | 
			
		||||
StartLimitBurst=3
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Slice=session.slice
 | 
			
		||||
Type=notify
 | 
			
		||||
# NOTE: This can be replaced with ConditionEnvironment=XDG_SESSION_TYPE=%I in
 | 
			
		||||
#       the [Unit] section with systemd >= 246. Also, the current solution is
 | 
			
		||||
#       kind of painful as systemd had a bug where it retries the condition.
 | 
			
		||||
# Only start if the template instance matches the session type.
 | 
			
		||||
ExecCondition=/bin/sh -c 'test "$XDG_SESSION_TYPE" = "%I" || exit 2'
 | 
			
		||||
ExecStart=@bindir@/gnome-shell
 | 
			
		||||
# Exit code 1 means we are probably *not* dealing with an extension failure
 | 
			
		||||
SuccessExitStatus=1
 | 
			
		||||
 | 
			
		||||
# On X11 we do not need to unset any variables
 | 
			
		||||
 | 
			
		||||
# On X11 we want to restart on-success (Alt+F2 + r) and on-failure.
 | 
			
		||||
Restart=always
 | 
			
		||||
# Do not wait before restarting the shell
 | 
			
		||||
@@ -1,10 +1,10 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=GNOME Shell
 | 
			
		||||
Description=GNOME Shell on X11
 | 
			
		||||
DefaultDependencies=no
 | 
			
		||||
 | 
			
		||||
Requisite=gnome-session-initialized.target
 | 
			
		||||
PartOf=gnome-session-initialized.target
 | 
			
		||||
Before=gnome-session-initialized.target
 | 
			
		||||
 | 
			
		||||
Wants=org.gnome.Shell@wayland.service
 | 
			
		||||
Wants=org.gnome.Shell@x11.service
 | 
			
		||||
Requires=gnome-shell-x11.service
 | 
			
		||||
After=gnome-shell-x11.service
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
[portal]
 | 
			
		||||
DBusName=org.gnome.Shell.Portal
 | 
			
		||||
DBusName=org.freedesktop.impl.portal.desktop.gnome
 | 
			
		||||
Interfaces=org.freedesktop.impl.portal.Access
 | 
			
		||||
UseIn=gnome
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="24px" viewBox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 10.832031 1.039062 c 0.386719 0.085938 0.722657 0.324219 0.9375 0.660157 l 6 9.5 c 0.339844 0.558593 0.308594 1.113281 0 1.601562 l -6 9.5 c -0.445312 0.699219 -1.371093 0.910157 -2.070312 0.46875 c -0.699219 -0.445312 -0.90625 -1.371093 -0.464844 -2.070312 l 5.492187 -8.699219 l -5.492187 -8.699219 c -0.441406 -0.699219 -0.234375 -1.625 0.464844 -2.070312 c 0.335937 -0.210938 0.742187 -0.28125 1.132812 -0.191407 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 592 B  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="24px" viewBox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 13.167969 1.035156 c -0.386719 0.089844 -0.722657 0.328125 -0.9375 0.664063 l -6 9.5 c -0.308594 0.488281 -0.308594 1.113281 0 1.601562 l 6 9.5 c 0.445312 0.699219 1.371093 0.910157 2.070312 0.464844 c 0.699219 -0.441406 0.90625 -1.367187 0.464844 -2.066406 l -5.492187 -8.699219 l 5.492187 -8.699219 c 0.441406 -0.699219 0.234375 -1.625 -0.464844 -2.070312 c -0.335937 -0.210938 -0.742187 -0.28125 -1.132812 -0.195313 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 594 B  | 
@@ -1,94 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
			
		||||
   xmlns:cc="http://creativecommons.org/ns#"
 | 
			
		||||
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   width="5.4116011mm"
 | 
			
		||||
   height="5.1374583mm"
 | 
			
		||||
   viewBox="0 0 5.4116011 5.1374583"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   id="svg5595"
 | 
			
		||||
   inkscape:version="0.92.4 (unknown)"
 | 
			
		||||
   sodipodi:docname="color-pick.svg">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs5589">
 | 
			
		||||
    <filter
 | 
			
		||||
       inkscape:collect="always"
 | 
			
		||||
       x="-0.10291173"
 | 
			
		||||
       width="1.2058235"
 | 
			
		||||
       y="-0.065432459"
 | 
			
		||||
       height="1.1308649"
 | 
			
		||||
       id="filter5601"
 | 
			
		||||
       style="color-interpolation-filters:sRGB">
 | 
			
		||||
      <feGaussianBlur
 | 
			
		||||
         inkscape:collect="always"
 | 
			
		||||
         stdDeviation="0.610872"
 | 
			
		||||
         id="feGaussianBlur5603" />
 | 
			
		||||
    </filter>
 | 
			
		||||
  </defs>
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#ffffff"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="0.0"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="15.839192"
 | 
			
		||||
     inkscape:cx="39.387731"
 | 
			
		||||
     inkscape:cy="12.554326"
 | 
			
		||||
     inkscape:document-units="mm"
 | 
			
		||||
     inkscape:current-layer="layer1"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1016"
 | 
			
		||||
     inkscape:window-x="0"
 | 
			
		||||
     inkscape:window-y="27"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     fit-margin-top="0"
 | 
			
		||||
     fit-margin-left="0"
 | 
			
		||||
     fit-margin-right="0"
 | 
			
		||||
     fit-margin-bottom="0" />
 | 
			
		||||
  <metadata
 | 
			
		||||
     id="metadata5592">
 | 
			
		||||
    <rdf:RDF>
 | 
			
		||||
      <cc:Work
 | 
			
		||||
         rdf:about="">
 | 
			
		||||
        <dc:format>image/svg+xml</dc:format>
 | 
			
		||||
        <dc:type
 | 
			
		||||
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
			
		||||
        <dc:title></dc:title>
 | 
			
		||||
      </cc:Work>
 | 
			
		||||
    </rdf:RDF>
 | 
			
		||||
  </metadata>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="Layer 1"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(-103.12753,-146.26461)">
 | 
			
		||||
    <circle
 | 
			
		||||
       r="8.4810486"
 | 
			
		||||
       cy="9.82623"
 | 
			
		||||
       cx="10.226647"
 | 
			
		||||
       id="circle7584"
 | 
			
		||||
       style="color:#000000;display:inline;overflow:visible;opacity:0.6;vector-effect:none;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;filter:url(#filter5601)"
 | 
			
		||||
       transform="matrix(0.26458333,0,0,0.26458333,103.12753,146.26461)" />
 | 
			
		||||
    <path
 | 
			
		||||
       style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.26399338;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
 | 
			
		||||
       d="m 108.07728,148.64122 c 0,1.2393 -1.00465,2.24394 -2.24395,2.24394 -1.23929,0 -2.24716,-1.00465 -2.25221,-2.24394 l -0.009,-2.24458 2.26136,6.4e-4 c 1.2393,3.4e-4 2.24395,1.00464 2.24395,2.24394 z"
 | 
			
		||||
       id="path7523-7"
 | 
			
		||||
       inkscape:connector-curvature="0"
 | 
			
		||||
       sodipodi:nodetypes="ssscss" />
 | 
			
		||||
    <circle
 | 
			
		||||
       style="color:#000000;display:inline;overflow:visible;opacity:1;vector-effect:none;fill:#50dbb5;fill-opacity:1;stroke:none;stroke-width:0.36885914;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal"
 | 
			
		||||
       id="path7482-1"
 | 
			
		||||
       cx="105.83707"
 | 
			
		||||
       cy="148.64352"
 | 
			
		||||
       r="1.844296" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 3.7 KiB  | 
@@ -1,2 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 8 0 c -4.40625 0 -8 3.59375 -8 8 s 3.59375 8 8 8 s 8 -3.59375 8 -8 s -3.59375 -8 -8 -8 z m 0 1.941406 c 3.359375 0 6.058594 2.699219 6.058594 6.058594 s -2.699219 6.058594 -6.058594 6.058594 z m 0 0" fill="#222222"/></svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 360 B  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="20px" viewBox="0 0 20 20" width="20px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 1 0 v 19.707031 l 4.242188 -4.144531 c 0.589843 1.191406 1.160156 2.386719 1.761718 3.570312 c 1.105469 1.640626 4.15625 0.464844 3.898438 -1.496093 c 0.007812 -0.46875 -0.40625 -0.90625 -0.4375 -1.3125 l 0.78125 -0.761719 c 0.585937 1.191406 1.15625 2.386719 1.757812 3.570312 c 1.105469 1.640626 4.15625 0.464844 3.898438 -1.496093 c -0.195313 -0.902344 -0.71875 -1.695313 -1.070313 -2.546875 l -0.714843 -1.539063 h 4.828124 l -12.945312 -13.550781 v 6.242188 z m 1.5 3.726562 l 6 6.242188 v -6.242188 l 7.921875 8.324219 h -3.664063 c 0.886719 1.902344 1.785157 3.800781 2.65625 5.707031 c 0.007813 0.625 -1.226562 0.980469 -1.324218 0.207032 l -2.410156 -4.917969 l -3.0625 2.984375 c 0.261718 0.609375 0.597656 1.191406 0.816406 1.816406 c -0.183594 0.601563 -1.269532 0.835938 -1.367188 0.066406 l -2.386718 -4.867187 l -3.179688 3.101563 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 1021 B  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="20px" viewBox="0 0 20 20" width="20px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 10.925781 2.320312 c -0.835937 0.074219 -1.816406 -0.136718 -2.445312 0.574219 c -0.179688 0.503907 -0.394531 0.730469 -0.945313 0.617188 c -0.796875 -0.050781 -1.703125 0.054687 -2.1875 0.773437 c -0.554687 0.832032 -0.316406 1.859375 -0.367187 2.792969 v 1.503906 c -0.511719 -0.320312 -1.132813 -0.132812 -1.699219 -0.183593 c -0.445312 -0.019532 -0.882812 0.027343 -1.320312 0.09375 c 0.058593 2.683593 0.074218 5.371093 0.121093 8.058593 c 0.09375 1.300781 1.230469 2.402344 2.546875 2.421875 c 0.632813 0.015625 1.480469 0.007813 2.222656 0.011719 c 3.222657 -0.011719 6.445313 0.050781 9.667969 -0.054687 c 1.160157 -0.121094 2.210938 -1.1875 2.070313 -2.398438 v -9.480469 c -0.707032 -0.9375 -1.816406 -1.78125 -3.058594 -1.570312 c -0.300781 -0.453125 -0.488281 -1.472657 -1.226562 -1.796875 c -0.355469 -0.292969 -0.839844 -0.109375 -1.261719 -0.164063 c -0.296875 -0.070312 -0.855469 0.195313 -0.867188 -0.25 c -0.160156 -0.523437 -0.71875 -0.910156 -1.25 -0.949219 z m -0.105469 1.503907 c 0.164063 0.269531 0.183594 0.753906 0.21875 1.125 c 0.007813 0.007812 0.019532 0.003906 0.027344 0.011719 c -0.007812 0 -0.019531 0 -0.027344 0 l 0.496094 5.898437 l 0.664063 -5.839844 l 1.34375 0.003907 c 0.535156 0.390624 0.414062 1.140624 0.554687 1.722656 c -0.011718 0.066406 0.007813 0.09375 0.015625 0.136718 l 0.011719 0.085938 l 0.480469 3.863281 l 0.664062 -3.917969 c 0.574219 -0.039062 1.15625 0.039063 1.558594 0.5 c 0.410156 0.21875 0.214844 0.691407 0.261719 1.058594 v 8.34375 c -0.339844 0.964844 -1.601563 0.546875 -2.375 0.660156 c -3.371094 0.011719 -6.742188 0.035157 -10.113282 -0.015624 c -0.976562 -0.027344 -1.140624 -1.070313 -1.039062 -1.839844 c -0.011719 -1.90625 -0.046875 -3.816406 -0.078125 -5.722656 c 0.324219 0.007812 0.675781 -0.011719 0.988281 0.011718 c 0.492188 0.914063 0.484375 2 0.507813 3.015625 c 0.492187 -0.007812 1.042969 0.039063 1.5 0 c 0.007812 -2.519531 -0.019531 -5.039062 0.011719 -7.558593 c 0.105468 -0.519532 0.730468 -0.308594 1.113281 -0.355469 h 0.675781 l 0.488281 5.847656 l 0.667969 -5.875 h -0.003906 c 0.03125 -0.382813 -0.148438 -0.894531 0.25 -1.121094 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 2.2 KiB  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="20px" viewBox="0 0 20 20" width="20px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 4 0 v 19.644531 l 4.242188 -4.140625 c 0.613281 1.214844 1.175781 2.460938 1.820312 3.65625 c 1.144531 1.476563 3.976562 0.390625 3.847656 -1.472656 c -0.09375 -0.824219 -0.59375 -1.523438 -0.898437 -2.277344 l -0.898438 -1.921875 h 5.269531 z m 1.5 3.726562 l 8.359375 8.261719 h -4.101563 c 0.886719 1.902344 1.78125 3.800781 2.660157 5.707031 c 0.035156 0.566407 -1.148438 0.988282 -1.28125 0.296876 l -2.457031 -5.011719 l -3.179688 3.105469 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 621 B  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="20px" viewBox="0 0 20 20" width="20px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 16 0 v 19.769531 l -4.242188 -4.140625 c -0.613281 1.214844 -1.175781 2.460938 -1.820312 3.65625 c -1.144531 1.476563 -3.976562 0.390625 -3.847656 -1.472656 c 0.09375 -0.824219 0.59375 -1.523438 0.898437 -2.277344 l 0.898438 -1.921875 h -5.269531 z m -1.5 3.726562 l -8.359375 8.386719 h 4.101563 c -0.886719 1.902344 -1.78125 3.800781 -2.660157 5.707031 c -0.035156 0.566407 1.148438 0.988282 1.28125 0.296876 l 2.457031 -5.011719 l 3.179688 3.105469 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 627 B  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="24px" viewBox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 7 6 c -0.265625 0 -0.519531 0.105469 -0.707031 0.292969 c -0.390625 0.390625 -0.390625 1.023437 0 1.414062 l 4.292969 4.292969 l -4.292969 4.292969 c -0.390625 0.390625 -0.390625 1.023437 0 1.414062 s 1.023437 0.390625 1.414062 0 l 4.292969 -4.292969 l 4.292969 4.292969 c 0.390625 0.390625 1.023437 0.390625 1.414062 0 s 0.390625 -1.023437 0 -1.414062 l -4.292969 -4.292969 l 4.292969 -4.292969 c 0.390625 -0.390625 0.390625 -1.023437 0 -1.414062 c -0.1875 -0.1875 -0.441406 -0.292969 -0.707031 -0.292969 s -0.519531 0.105469 -0.707031 0.292969 l -4.292969 4.292969 l -4.292969 -4.292969 c -0.1875 -0.1875 -0.441406 -0.292969 -0.707031 -0.292969 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 822 B  | 
@@ -1,9 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <g fill="#2e3436">
 | 
			
		||||
        <path d="m 2.175781 0 h 3.648438 c 1.203125 0 2.175781 0.972656 2.175781 2.175781 v 2.648438 c 0 1.203125 -0.972656 2.175781 -2.175781 2.175781 h -3.648438 c -1.203125 0 -2.175781 -0.972656 -2.175781 -2.175781 v -2.648438 c 0 -1.203125 0.972656 -2.175781 2.175781 -2.175781 z m 0 0"/>
 | 
			
		||||
        <path d="m 7.796875 2.652344 l 2.050781 -1.523438 c 0.214844 -0.160156 0.503906 -0.1875 0.742188 -0.066406 c 0.242187 0.121094 0.394531 0.367188 0.394531 0.636719 v 3.605469 c 0 0.265624 -0.152344 0.511718 -0.394531 0.632812 c -0.238282 0.121094 -0.523438 0.09375 -0.742188 -0.066406 l -2.050781 -1.53125 c -0.265625 -0.199219 -0.421875 -0.511719 -0.421875 -0.84375 c 0 -0.332032 0.15625 -0.644532 0.421875 -0.84375 z m 0 0"/>
 | 
			
		||||
        <path d="m 9.042969 7 h 2.914062 c 0.574219 0 1.042969 0.449219 1.042969 1 s -0.46875 1 -1.042969 1 h -2.914062 c -0.574219 0 -1.042969 -0.449219 -1.042969 -1 s 0.46875 -1 1.042969 -1 z m 0 0"/>
 | 
			
		||||
        <path d="m 7.011719 8 c -1.113281 0 -2.011719 0.898438 -2.011719 2.011719 v 3.976562 c 0 1.113281 0.898438 2.011719 2.011719 2.011719 h 6.976562 c 1.113281 0 2.011719 -0.898438 2.011719 -2.011719 v -3.976562 c 0 -1.113281 -0.898438 -2.011719 -2.011719 -2.011719 z m 3.488281 1 c 1.378906 0 2.5 1.121094 2.5 2.5 s -1.121094 2.5 -2.5 2.5 s -2.5 -1.121094 -2.5 -2.5 s 1.121094 -2.5 2.5 -2.5 z m 0 0"/>
 | 
			
		||||
    </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 1.5 KiB  | 
@@ -1,8 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <g fill="#2e3436">
 | 
			
		||||
        <path d="m 6.929688 8.011719 h 4.140624 c 1.066407 0 1.929688 0.863281 1.929688 1.929687 v 3.140625 c 0 1.066407 -0.863281 1.929688 -1.929688 1.929688 h -4.140624 c -1.066407 0 -1.929688 -0.863281 -1.929688 -1.929688 v -3.140625 c 0 -1.066406 0.863281 -1.929687 1.929688 -1.929687 z m 0 0"/>
 | 
			
		||||
        <path d="m 12.796875 10.664062 l 2.050781 -1.523437 c 0.214844 -0.160156 0.503906 -0.1875 0.742188 -0.066406 c 0.242187 0.121093 0.394531 0.367187 0.394531 0.636719 v 3.605468 c 0 0.265625 -0.152344 0.511719 -0.394531 0.632813 c -0.238282 0.121093 -0.523438 0.09375 -0.742188 -0.066407 l -2.050781 -1.53125 c -0.265625 -0.199218 -0.421875 -0.511718 -0.421875 -0.84375 c 0 -0.332031 0.15625 -0.644531 0.421875 -0.84375 z m 0 0"/>
 | 
			
		||||
        <path d="m 0 4.011719 c 0 -1.652344 1.359375 -3.011719 3.011719 -3.011719 h 7.976562 c 1.652344 0 3.011719 1.359375 3.011719 3.011719 v 1.953125 c 0 0.554687 -0.449219 1 -1 1 s -1 -0.445313 -1 -1 v -1.953125 c 0 -0.578125 -0.433594 -1.011719 -1.011719 -1.011719 h -7.976562 c -0.578125 0 -1.011719 0.433594 -1.011719 1.011719 v 4.976562 c 0 0.578125 0.433594 1.011719 1.011719 1.011719 c 0.550781 0 1 0.449219 1 1 s -0.449219 1 -1 1 c -1.652344 0 -3.011719 -1.359375 -3.011719 -3.011719 z m 0 0"/>
 | 
			
		||||
    </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 1.4 KiB  | 
@@ -1,8 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <g fill="#2e3436">
 | 
			
		||||
        <path d="m 9.042969 6 h 1.914062 c 0.574219 0 1.042969 0.449219 1.042969 1 s -0.46875 1 -1.042969 1 h -1.914062 c -0.574219 0 -1.042969 -0.449219 -1.042969 -1 s 0.46875 -1 1.042969 -1 z m 0 0"/>
 | 
			
		||||
        <path d="m 7.011719 6.964844 c -1.113281 0 -2.011719 0.898437 -2.011719 2.011718 v 4.011719 c 0 1.113281 0.898438 2.011719 2.011719 2.011719 h 5.976562 c 1.113281 0 2.011719 -0.898438 2.011719 -2.011719 v -4.011719 c 0 -1.113281 -0.898438 -2.011718 -2.011719 -2.011718 z m 2.988281 2.035156 c 1.105469 0 2 0.894531 2 2 s -0.894531 2 -2 2 s -2 -0.894531 -2 -2 s 0.894531 -2 2 -2 z m 0 0"/>
 | 
			
		||||
        <path d="m 0 4.011719 c 0 -1.652344 1.359375 -3.011719 3.011719 -3.011719 h 7.976562 c 1.652344 0 3.011719 1.359375 3.011719 3.011719 v 0.988281 c 0 0.550781 -0.449219 1 -1 1 s -1 -0.449219 -1 -1 v -0.988281 c 0 -0.578125 -0.433594 -1.011719 -1.011719 -1.011719 h -7.976562 c -0.578125 0 -1.011719 0.433594 -1.011719 1.011719 v 4.976562 c 0 0.578125 0.433594 1.011719 1.011719 1.011719 c 0.550781 0 1 0.449219 1 1 s -0.449219 1 -1 1 c -1.652344 0 -3.011719 -1.359375 -3.011719 -3.011719 z m 0 0"/>
 | 
			
		||||
    </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 1.2 KiB  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="32px" viewBox="0 0 32 32" width="32px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 3.5 2 c -1.929688 0.007812 -3.4921875 1.570312 -3.5 3.5 c 0 1.386719 0.820312 2.59375 2 3.15625 v 3.34375 h 2 v -3.035156 c 1.53125 -0.230469 2.734375 -1.433594 2.964844 -2.964844 h 2.035156 v -2 h -2.34375 c -0.578125 -1.21875 -1.808594 -1.996094 -3.15625 -2 z m 25 0 c -1.347656 0.003906 -2.578125 0.78125 -3.15625 2 h -2.34375 v 2 h 2.035156 c 0.230469 1.53125 1.433594 2.734375 2.964844 2.964844 v 3.035156 h 2 v -3.34375 c 1.21875 -0.578125 1.996094 -1.808594 2 -3.15625 c 0 -1.921875 -1.578125 -3.5 -3.5 -3.5 z m -25 2 c 0.839844 0 1.5 0.660156 1.5 1.5 s -0.660156 1.5 -1.5 1.5 s -1.5 -0.660156 -1.5 -1.5 s 0.660156 -1.5 1.5 -1.5 z m 7.5 0 v 2 h 4 v -2 z m 6 0 v 2 h 4 v -2 z m 11.5 0 c 0.839844 0 1.5 0.660156 1.5 1.5 s -0.660156 1.5 -1.5 1.5 s -1.5 -0.660156 -1.5 -1.5 s 0.660156 -1.5 1.5 -1.5 z m -26.5 10 v 4 h 2 v -4 z m 26 0 v 4 h 2 v -4 z m -26 6 v 3.34375 c -1.21875 0.578125 -1.99609375 1.808594 -2 3.15625 c 0 1.921875 1.578125 3.5 3.5 3.5 c 1.347656 -0.003906 2.578125 -0.78125 3.15625 -2 h 2.34375 v -2 h -2.035156 c -0.230469 -1.53125 -1.433594 -2.734375 -2.964844 -2.964844 v -3.035156 z m 26 0 v 3.035156 c -1.53125 0.230469 -2.734375 1.433594 -2.964844 2.964844 h -2.035156 v 2 h 2.34375 c 0.578125 1.21875 1.808594 1.996094 3.15625 2 c 1.921875 0 3.5 -1.578125 3.5 -3.5 c -0.003906 -1.347656 -0.78125 -2.578125 -2 -3.15625 v -3.34375 z m -24.5 5 c 0.839844 0 1.5 0.660156 1.5 1.5 s -0.660156 1.5 -1.5 1.5 s -1.5 -0.660156 -1.5 -1.5 s 0.660156 -1.5 1.5 -1.5 z m 25 0 c 0.839844 0 1.5 0.660156 1.5 1.5 s -0.660156 1.5 -1.5 1.5 s -1.5 -0.660156 -1.5 -1.5 s 0.660156 -1.5 1.5 -1.5 z m -17.5 1 v 2 h 4 v -2 z m 6 0 v 2 h 4 v -2 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 1.8 KiB  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="32px" viewBox="0 0 32 32" width="32px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 4 4 c -1.660156 0 -3 1.339844 -3 3 v 14 c 0 1.660156 1.339844 3 3 3 h 10 v 3 h -3 c -1.09375 -0.003906 -2 0.90625 -2 2 h 14 c 0 -1.09375 -0.910156 -2 -2 -2 h -3 v -3 h 10 c 1.660156 0 3 -1.339844 3 -3 v -14 c 0 -1.660156 -1.339844 -3 -3 -3 z m 0 2 h 24 c 0.554688 0 1 0.445312 1 1 v 14 c 0 0.554688 -0.445312 1 -1 1 h -24 c -0.554688 0 -1 -0.445312 -1 -1 v -14 c 0 -0.554688 0.445312 -1 1 -1 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 567 B  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 2.953125 1.074219 l 2.417969 13.210937 l 3.238281 -2.398437 l 2.054687 2.648437 c 1.03125 1.433594 3.148438 -0.210937 2.011719 -1.5625 l -2.015625 -2.59375 l 2.984375 -2.175781 z m 0 0" fill="#2e3436"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 352 B  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="32px" viewBox="0 0 32 32" width="32px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 3 3 c -1.644531 0 -3 1.355469 -3 3 v 14 c 0 1.644531 1.355469 3 3 3 h 4 v 3 c 0 1.644531 1.351562 3 3 3 h 18.996094 c 1.644531 0 3 -1.355469 3 -3 v -14 c 0 -1.644531 -1.355469 -3 -3 -3 h -4 v -3 c 0 -1.644531 -1.355469 -3 -3 -3 z m 0 2 h 18.996094 c 0.570312 0 1 0.429688 1 1 v 3 h -12.996094 c -1.648438 0 -3 1.355469 -3 3 v 9 h -4 c -0.570312 0 -1 -0.429688 -1 -1 v -14 c 0 -0.570312 0.429688 -1 1 -1 z m 7 6 h 18.996094 c 0.570312 0 1 0.429688 1 1 v 14 c 0 0.570312 -0.429688 1 -1 1 h -18.996094 c -0.574219 0 -1 -0.429688 -1 -1 v -14 c 0 -0.570312 0.425781 -1 1 -1 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 744 B  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="24px" viewBox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 12 2 l -7.5 8 h 4.5 v 5 h 6 v -5 h 4.5 z m -3 16 v 3 h 6 v -3 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 237 B  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="24px" viewBox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 19 6 v 6.003906 c 0.007812 0.996094 -1 0.996094 -1 0.996094 h -11.585938 l 1.292969 -1.292969 c 0.390625 -0.390625 0.390625 -1.023437 0 -1.414062 c -0.1875 -0.1875 -0.441406 -0.292969 -0.707031 -0.292969 s -0.519531 0.105469 -0.707031 0.292969 l -3 3 c -0.390625 0.390625 -0.390625 1.023437 0 1.414062 l 3 3 c 0.390625 0.390625 1.023437 0.390625 1.414062 0 s 0.390625 -1.023437 0 -1.414062 l -1.289062 -1.292969 h 11.582031 c 3.007812 0 3 -3 3 -3 v -6 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 627 B  | 
@@ -1,5 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="24px" viewBox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 2.49705,2.00665 c -0.554,0 -1,0.446 -1,1 v 11 c 0,0.554 0.446,1 1,1 h 19.0059 c 0.554,0 1,-0.446 1,-1 v -11 c 0,-0.554 -0.446,-1 -1,-1 z m 1.3653,2 h 1.6562 v 2 h -2 v -1.6074 c 0,-0.218 0.1538,-0.3926 0.3438,-0.3926 z m 2.6562,0 h 2 v 2 h -2 z m 3,0 h 2 v 2 h -2 z m 3,0 h 1.6563 c 0.19,0 0.3437,0.1746 0.3437,0.3926 v 1.6074 h -2 z m 2.9844,0 h 2 v 2 h -2 z m 3,0 h 2 v 2 h -2 z m -13.9844,3 h 2 v 2 h -2 z m 3,0 h 2 v 2 h -2 z m 3,0 h 2 v 2 h -2 z m 2.9844,0 h 2 v 2 h -2 z m 3,0 h 2 v 2 h -2 z m -9.6621,4 h 10.3125 c 0.19,0 0.3437,0.1746 0.3437,0.3926 v 1.2148 c 0,0.218 -0.1537,0.3926 -0.3437,0.3926 H 6.84085 c -0.19,0 -0.3438,-0.1746 -0.3438,-0.3926 v -1.2148 c 0,-0.218 0.1538,-0.3926 0.3438,-0.3926 z" fill="#241f31"/>
 | 
			
		||||
    <path d="m 17,17.99335 -4.99512,4 -5.00488,-4 z" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 948 B  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="24px" viewBox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 2985,-2801.6382 c -0.2187,0 -0.4414,0.012 -0.6562,0.031 l -0.4063,2.0938 c -0.332,0.07 -0.6562,0.1758 -0.9687,0.3125 l -1.5313,-1.4648 c -0.3867,0.2265 -0.7266,0.5117 -1.0625,0.8085 l 0.9063,1.9063 c -0.2227,0.25 -0.4219,0.5234 -0.5938,0.8125 l -2.0937,-0.2773 c -0.1758,0.4101 -0.3125,0.8398 -0.4063,1.2773 l 1.8438,1 c -0.02,0.168 -0.027,0.332 -0.031,0.5 0,0.1719 0.016,0.332 0.031,0.5 l -1.8438,1 c 0.098,0.4453 0.2266,0.8711 0.4063,1.2812 l 2.0937,-0.2812 c 0.1719,0.2891 0.3711,0.5625 0.5938,0.8125 l -0.9063,1.9062 c 0.3359,0.3008 0.6758,0.5821 1.0625,0.8125 l 1.5313,-1.4687 c 0.3046,0.1367 0.6328,0.2383 0.9687,0.3125 l 0.4063,2.0937 c 0.4375,0.043 0.875,0.043 1.3125,0 l 0.4062,-2.0937 c 0.3359,-0.074 0.6641,-0.1758 0.9688,-0.3125 l 1.5312,1.4687 c 0.3867,-0.2304 0.7266,-0.5117 1.0625,-0.8125 l -0.9062,-1.9062 c 0.2226,-0.25 0.4218,-0.5234 0.5937,-0.8125 l 2.0938,0.2812 c 0.1757,-0.414 0.3125,-0.8398 0.4062,-1.2812 l -1.8437,-1 c 0.016,-0.168 0.031,-0.3281 0.031,-0.5 0,-0.1719 -0.016,-0.332 -0.031,-0.5 l 1.8437,-1 c -0.094,-0.4375 -0.2305,-0.8672 -0.4062,-1.2813 l -2.0938,0.2813 c -0.1719,-0.2891 -0.3672,-0.5625 -0.5937,-0.8125 l 0.9062,-1.9063 c -0.3359,-0.2968 -0.6758,-0.582 -1.0625,-0.8125 l -1.5312,1.4688 c -0.3125,-0.1367 -0.6368,-0.2422 -0.9688,-0.3125 l -0.4062,-2.0938 c -0.2188,-0.019 -0.4375,-0.031 -0.6563,-0.031 z m 0,4 c 1.6563,0 3,1.3437 3,3 0,1.6562 -1.3437,3 -3,3 -1.6562,0 -3,-1.3438 -3,-3 0,-1.6563 1.3438,-3 3,-3 z m 0,0" transform="matrix(1.5,0,0,1.5,-4465.5,4203.9569)" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 1.6 KiB  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="24px" viewBox="0 0 24 24" width="24px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 12 4 l -7.5 8 h 4.5 v 7 h 6 v -7 h 4.5 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 214 B  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 12 8 c 0 2.210938 -1.789062 4 -4 4 s -4 -1.789062 -4 -4 s 1.789062 -4 4 -4 s 4 1.789062 4 4 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 267 B  | 
@@ -1,7 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="64px" viewBox="0 0 64 64" width="64px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <g fill="#241f31">
 | 
			
		||||
        <path d="m 12 4 c -4.210938 0 -8 3.378906 -8 7.75 v 40.5 c 0 4.371094 3.789062 7.75 8 7.75 h 40 c 4.210938 0 8 -3.378906 8 -7.75 v -40.5 c 0 -4.371094 -3.789062 -7.75 -8 -7.75 z m -2 18 h 12 v 8 h -12 z m 16.125 0 h 11.875 v 8 h -11.875 z m 15.875 0 h 12 v 8 h -12 z m -32 12 h 12 v 8 h -12 z m 16.125 0 h 11.875 v 8 h -11.875 z m 15.875 0 h 12 v 8 h -12 z m -32 12 h 12 v 8 h -12 z m 16.125 0 h 11.875 v 8 h -11.875 z m 15.875 0 h 12 v 8 h -12 z m 0 0" fill-opacity="0.35"/>
 | 
			
		||||
        <path d="m 42 34 h 12 v 8 h -12 z m 0 0" fill-opacity="0.1"/>
 | 
			
		||||
    </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 720 B  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="64px" viewBox="0 0 64 64" width="64px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 32 0 c -3.3125 0 -6 2.6875 -6 6 c 0 0.304688 0.023438 0.601562 0.066406 0.894531 c -8.148437 2.527344 -14.066406 10.125 -14.066406 19.105469 v 18 h -2 c -2.203125 0 -4 1.796875 -4 4 s 1.796875 4 4 4 h 44 c 2.203125 0 4 -1.796875 4 -4 s -1.796875 -4 -4 -4 h -2 v -18 c 0 -8.980469 -5.917969 -16.578125 -14.066406 -19.105469 c 0.042968 -0.292969 0.066406 -0.589843 0.066406 -0.894531 c 0 -3.3125 -2.6875 -6 -6 -6 z m -8 56 c 0 2.859375 1.53125 5.5 4 6.921875 c 2.46875 1.4375 5.53125 1.4375 8 0 c 2.46875 -1.421875 4 -4.0625 4 -6.921875 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 710 B  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 1.53125 0.46875 l -1.0625 1.0625 l 14 14 l 1.0625 -1.0625 l -1.945312 -1.945312 c 0.847656 -0.527344 1.414062 -1.449219 1.414062 -2.523438 v -6 c 0 -1.660156 -1.339844 -3 -3 -3 h -8 c -0.554688 0 -1.070312 0.160156 -1.515625 0.421875 z m 2.53125 2.53125 h 0.199219 l -0.097657 0.097656 z m 2.675781 0 h 0.699219 l -1.6875 1.6875 l -0.351562 -0.351562 z m 2.824219 0 h 1.230469 l -3.367188 3.363281 l -0.613281 -0.613281 z m 2.609375 0.035156 c 0.316406 0.054688 0.578125 0.246094 0.714844 0.523438 l -4.132813 4.132812 l -0.617187 -0.617187 z m -11.171875 1.023438 v 5.941406 c 0 1.660156 1.339844 3 3 3 h 5.941406 l -2 -2 h -1.785156 l 0.894531 -0.894531 l -0.355469 -0.355469 l -1.25 1.25 h -1.238281 l 1.867188 -1.867188 l -0.707031 -0.707031 l -2.160157 2.15625 c -0.121093 -0.164062 -0.207031 -0.359375 -0.207031 -0.582031 v -0.4375 l 1.75 -1.75 l -1.0625 -1.0625 l -0.6875 0.6875 v -0.699219 l 0.339844 -0.339843 z m 12 0.09375 v 5.847656 c 0 0.535156 -0.417969 0.960938 -0.949219 0.988281 l -2.941406 -2.941406 z m -5 9.847656 c -5 0 -5 1 -5 1 c 0 1 1 1 1 1 h 8 c 0.328125 0 0.539062 -0.109375 0.6875 -0.253906 l -1.542969 -1.546875 c -0.730469 -0.113281 -1.71875 -0.199219 -3.144531 -0.199219 z m 0 0" fill="#241f31" fill-rule="evenodd"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 1.4 KiB  | 
@@ -1,4 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
    <path d="m 4 1 c -1.660156 0 -3 1.339844 -3 3 v 6 c 0 1.660156 1.339844 3 3 3 h 8 c 1.660156 0 3 -1.339844 3 -3 v -6 c 0 -1.660156 -1.339844 -3 -3 -3 z m 0 2 h 0.261719 l -1.261719 1.261719 v -0.261719 c 0 -0.554688 0.445312 -1 1 -1 z m 2.738281 0 h 0.699219 l -4.4375 4.4375 v -0.699219 z m 2.824219 0 h 1.230469 l -7.585938 7.582031 c -0.121093 -0.164062 -0.207031 -0.359375 -0.207031 -0.582031 v -0.4375 z m 2.609375 0.035156 c 0.316406 0.054688 0.578125 0.246094 0.714844 0.523438 l -7.441407 7.441406 h -1.238281 z m 0.828125 1.121094 v 5.84375 c 0 0.554688 -0.445312 1 -1 1 h -5.84375 z m -5 9.84375 c -5 0 -5 1 -5 1 c 0 1 1 1 1 1 h 8 c 1 0 1 -1 1 -1 s 0 -1 -5 -1 z m 0 0" fill="#241f31"/>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 834 B  | 
@@ -1,2 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<svg xmlns="http://www.w3.org/2000/svg" height="16px" viewBox="0 0 16 16" width="16px"><path d="m 4 4 h 8 v 8 h -8 z m 0 0" fill="#2e3436"/></svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 186 B  | 
@@ -16,7 +16,7 @@ desktopconf.set('bindir', bindir)
 | 
			
		||||
desktopconf.set('systemd_hidden', have_systemd ? 'true' : 'false')
 | 
			
		||||
 | 
			
		||||
foreach desktop_file : desktop_files
 | 
			
		||||
  i18n.merge_file(
 | 
			
		||||
  i18n.merge_file('desktop',
 | 
			
		||||
    input: configure_file(
 | 
			
		||||
      input: desktop_file + '.in.in',
 | 
			
		||||
      output: desktop_file + '.in',
 | 
			
		||||
@@ -41,27 +41,22 @@ foreach service_file : service_files
 | 
			
		||||
  )
 | 
			
		||||
endforeach
 | 
			
		||||
 | 
			
		||||
theme_deps = []
 | 
			
		||||
 | 
			
		||||
subdir('dbus-interfaces')
 | 
			
		||||
subdir('icons')
 | 
			
		||||
subdir('theme')
 | 
			
		||||
 | 
			
		||||
data_resources = [
 | 
			
		||||
  {'name': 'dbus-interfaces'},
 | 
			
		||||
  {'name': 'icons'},
 | 
			
		||||
  {'name': 'osk-layouts'},
 | 
			
		||||
  {'name': 'theme', 'deps': theme_deps}
 | 
			
		||||
  ['dbus-interfaces', []],
 | 
			
		||||
  ['osk-layouts', []],
 | 
			
		||||
  ['theme', theme_deps]
 | 
			
		||||
]
 | 
			
		||||
foreach resource : data_resources
 | 
			
		||||
  name = resource.get('name')
 | 
			
		||||
  deps = resource.get('deps', [])
 | 
			
		||||
 | 
			
		||||
  gnome.compile_resources(
 | 
			
		||||
    'gnome-shell-' + name,
 | 
			
		||||
    'gnome-shell-@0@.gresource.xml'.format(name),
 | 
			
		||||
    source_dir: name,
 | 
			
		||||
    dependencies: deps,
 | 
			
		||||
    'gnome-shell-' + resource[0],
 | 
			
		||||
    'gnome-shell-@0@.gresource.xml'.format(resource[0]),
 | 
			
		||||
    source_dir: resource[0],
 | 
			
		||||
    dependencies: resource[1],
 | 
			
		||||
    gresource_bundle: true,
 | 
			
		||||
    install: true,
 | 
			
		||||
    install_dir: pkgdatadir
 | 
			
		||||
@@ -77,14 +72,9 @@ configure_file(
 | 
			
		||||
  install_dir: pkgdatadir
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
keybinding_files = [
 | 
			
		||||
  '50-gnome-shell-launchers.xml',
 | 
			
		||||
  '50-gnome-shell-screenshots.xml',
 | 
			
		||||
  '50-gnome-shell-system.xml',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
install_data('gnome-shell.portal', install_dir: portaldir)
 | 
			
		||||
install_data(keybinding_files, install_dir: keysdir)
 | 
			
		||||
install_data('50-gnome-shell-system.xml', install_dir: keysdir)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
schemaconf = configuration_data()
 | 
			
		||||
@@ -111,21 +101,22 @@ if have_systemd
 | 
			
		||||
  unitconf.set('bindir', bindir)
 | 
			
		||||
 | 
			
		||||
  configure_file(
 | 
			
		||||
    input: 'org.gnome.Shell@x11.service.in',
 | 
			
		||||
    output: 'org.gnome.Shell@x11.service',
 | 
			
		||||
    input: 'gnome-shell-x11.service.in',
 | 
			
		||||
    output: 'gnome-shell-x11.service',
 | 
			
		||||
    configuration: unitconf,
 | 
			
		||||
    install_dir: systemduserunitdir
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
  configure_file(
 | 
			
		||||
    input: 'org.gnome.Shell@wayland.service.in',
 | 
			
		||||
    output: 'org.gnome.Shell@wayland.service',
 | 
			
		||||
    input: 'gnome-shell-wayland.service.in',
 | 
			
		||||
    output: 'gnome-shell-wayland.service',
 | 
			
		||||
    configuration: unitconf,
 | 
			
		||||
    install_dir: systemduserunitdir
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
  units = files('org.gnome.Shell.target',
 | 
			
		||||
                'org.gnome.Shell-disable-extensions.service')
 | 
			
		||||
  units = files('gnome-shell-x11.target',
 | 
			
		||||
                'gnome-shell-wayland.target',
 | 
			
		||||
                'gnome-shell-disable-extensions.service')
 | 
			
		||||
 | 
			
		||||
  install_data(units, install_dir: systemduserunitdir)
 | 
			
		||||
endif
 | 
			
		||||
@@ -136,3 +127,5 @@ custom_target('compile-schemas',
 | 
			
		||||
  output: 'gschemas.compiled',
 | 
			
		||||
  command: [find_program('glib-compile-schemas'), meson.current_build_dir()],
 | 
			
		||||
  build_by_default: true)
 | 
			
		||||
 | 
			
		||||
install_data('gnome-shell-overrides.convert', install_dir: convertdir)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,511 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
			
		||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
			
		||||
 | 
			
		||||
<svg
 | 
			
		||||
   width="64"
 | 
			
		||||
   height="64"
 | 
			
		||||
   viewBox="0 0 64 64"
 | 
			
		||||
   id="svg2"
 | 
			
		||||
   version="1.1"
 | 
			
		||||
   inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
 | 
			
		||||
   sodipodi:docname="org.gnome.Shell-symbolic.Source.svg"
 | 
			
		||||
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
			
		||||
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
			
		||||
   xmlns="http://www.w3.org/2000/svg"
 | 
			
		||||
   xmlns:svg="http://www.w3.org/2000/svg">
 | 
			
		||||
  <defs
 | 
			
		||||
     id="defs4" />
 | 
			
		||||
  <sodipodi:namedview
 | 
			
		||||
     id="base"
 | 
			
		||||
     pagecolor="#ffffff"
 | 
			
		||||
     bordercolor="#666666"
 | 
			
		||||
     borderopacity="1.0"
 | 
			
		||||
     inkscape:pageopacity="1"
 | 
			
		||||
     inkscape:pageshadow="2"
 | 
			
		||||
     inkscape:zoom="1"
 | 
			
		||||
     inkscape:cx="51.5"
 | 
			
		||||
     inkscape:cy="258"
 | 
			
		||||
     inkscape:document-units="px"
 | 
			
		||||
     inkscape:current-layer="layer2"
 | 
			
		||||
     showgrid="false"
 | 
			
		||||
     units="px"
 | 
			
		||||
     inkscape:window-width="1920"
 | 
			
		||||
     inkscape:window-height="1011"
 | 
			
		||||
     inkscape:window-x="0"
 | 
			
		||||
     inkscape:window-y="32"
 | 
			
		||||
     inkscape:window-maximized="1"
 | 
			
		||||
     inkscape:snap-bbox="true"
 | 
			
		||||
     inkscape:bbox-paths="true"
 | 
			
		||||
     inkscape:snap-bbox-midpoints="true"
 | 
			
		||||
     inkscape:snap-intersection-paths="false"
 | 
			
		||||
     inkscape:object-paths="true"
 | 
			
		||||
     inkscape:object-nodes="true"
 | 
			
		||||
     inkscape:snap-smooth-nodes="true"
 | 
			
		||||
     inkscape:snap-midpoints="true"
 | 
			
		||||
     inkscape:bbox-nodes="false"
 | 
			
		||||
     inkscape:snap-global="true"
 | 
			
		||||
     inkscape:pagecheckerboard="false"
 | 
			
		||||
     showborder="false"
 | 
			
		||||
     inkscape:snap-nodes="true"
 | 
			
		||||
     inkscape:snap-others="false">
 | 
			
		||||
    <inkscape:grid
 | 
			
		||||
       type="xygrid"
 | 
			
		||||
       id="grid4514"
 | 
			
		||||
       empspacing="4"
 | 
			
		||||
       color="#5e57ff"
 | 
			
		||||
       opacity="0.1254902"
 | 
			
		||||
       empcolor="#5e57ff"
 | 
			
		||||
       empopacity="0.25098039" />
 | 
			
		||||
  </sodipodi:namedview>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:label="status"
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer1"
 | 
			
		||||
     transform="translate(0,-161.53331)">
 | 
			
		||||
    <text
 | 
			
		||||
       xml:space="preserve"
 | 
			
		||||
       style="font-style:normal;font-weight:normal;font-size:16px;line-height:1.25;font-family:sans-serif;fill:#241f31;fill-opacity:1;stroke:none"
 | 
			
		||||
       x="-4"
 | 
			
		||||
       y="145.53331"
 | 
			
		||||
       id="text12175"><tspan
 | 
			
		||||
         sodipodi:role="line"
 | 
			
		||||
         id="tspan12173"
 | 
			
		||||
         x="-4"
 | 
			
		||||
         y="145.53331"
 | 
			
		||||
         style="font-size:16px;fill:#241f31;fill-opacity:1">status</tspan></text>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g16183"
 | 
			
		||||
       transform="translate(-288,-312)"
 | 
			
		||||
       inkscape:label="notifications alerts calendar events">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title20651">no-notifications</title>
 | 
			
		||||
      <path
 | 
			
		||||
         id="path81"
 | 
			
		||||
         d="m 320,473.53331 c -3.3125,0 -6,2.6875 -6,6 0,0.30385 0.0228,0.60279 0.0664,0.89453 C 305.91768,482.95558 300,490.55273 300,499.53331 v 18 h -2 c -2.20312,0 -4,1.79688 -4,4 0,2.20312 1.79688,4 4,4 h 44 c 2.20312,0 4,-1.79688 4,-4 0,-2.20312 -1.79688,-4 -4,-4 h -2 v -18 c 0,-8.98058 -5.91768,-16.57773 -14.06641,-19.10547 0.0436,-0.29174 0.0664,-0.59068 0.0664,-0.89453 0,-3.3125 -2.6875,-6 -6,-6 z m -8,56 c 0,2.85938 1.53125,5.5 4,6.92188 2.46875,1.43749 5.53125,1.43749 8,0 2.46875,-1.42188 4,-4.0625 4,-6.92188 z"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
      <rect
 | 
			
		||||
         transform="scale(-1,1)"
 | 
			
		||||
         y="473.53333"
 | 
			
		||||
         x="-352"
 | 
			
		||||
         height="64"
 | 
			
		||||
         width="64"
 | 
			
		||||
         id="rect15794"
 | 
			
		||||
         style="fill:none" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g21075"
 | 
			
		||||
       transform="translate(0,-320)"
 | 
			
		||||
       inkscape:label="notifications alerts calendar events">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title36429">message-indicator</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         transform="scale(-1,1)"
 | 
			
		||||
         y="601.53333"
 | 
			
		||||
         x="-16"
 | 
			
		||||
         height="16"
 | 
			
		||||
         width="16"
 | 
			
		||||
         id="rect20973"
 | 
			
		||||
         style="fill:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="M 12,609.53332 A 3.9999999,3.9999999 0 0 1 8.0000002,613.53331 3.9999999,3.9999999 0 0 1 4.0000003,609.53332 3.9999999,3.9999999 0 0 1 8.0000002,605.53334 3.9999999,3.9999999 0 0 1 12,609.53332 Z"
 | 
			
		||||
         id="path4485"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1;stroke-width:3.77953" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g36685"
 | 
			
		||||
       inkscape:label="screen shield privacy active"
 | 
			
		||||
       transform="translate(-40,-382)">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title41631">screen-privacy</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         transform="scale(-1,1)"
 | 
			
		||||
         y="663.53333"
 | 
			
		||||
         x="-76"
 | 
			
		||||
         height="16"
 | 
			
		||||
         width="16"
 | 
			
		||||
         id="rect36558"
 | 
			
		||||
         style="fill:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         id="path113"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1"
 | 
			
		||||
         d="m 64,664.53331 c -1.660156,0 -3,1.33984 -3,3 v 6 c 0,1.66016 1.339844,3 3,3 h 8 c 1.660156,0 3,-1.33984 3,-3 v -6 c 0,-1.66016 -1.339844,-3 -3,-3 z m 0,2 h 0.261719 L 63,667.79503 v -0.26172 c 0,-0.55469 0.445312,-1 1,-1 z m 2.738281,0 H 67.4375 L 63,670.97081 v -0.69922 z m 2.824219,0 h 1.230469 l -7.585938,7.58203 C 63.085938,673.95128 63,673.75597 63,673.53331 v -0.4375 z m 2.609375,0.0352 c 0.316406,0.0547 0.578125,0.24609 0.714844,0.52343 l -7.441407,7.44141 H 64.207031 Z M 73,667.68956 v 5.84375 c 0,0.55469 -0.445312,1 -1,1 h -5.84375 z m -5,9.84375 c -5,0 -5,1 -5,1 0,1 1,1 1,1 h 8 c 1,0 1,-1 1,-1 0,0 0,-1 -5,-1 z" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g41416"
 | 
			
		||||
       inkscape:label="status"
 | 
			
		||||
       transform="translate(-40,-382)">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title41633">screen-privacy-disabled</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         transform="scale(-1,1)"
 | 
			
		||||
         y="663.53333"
 | 
			
		||||
         x="-96"
 | 
			
		||||
         height="16"
 | 
			
		||||
         width="16"
 | 
			
		||||
         id="rect36687"
 | 
			
		||||
         style="fill:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 81.53125,664.00213 -1.0625,1.0625 14,14 1.0625,-1.0625 -1.945312,-1.94531 C 94.433594,675.52947 95,674.6076 95,673.53338 v -6 c 0,-1.66016 -1.339844,-3 -3,-3 h -8 c -0.554688,0 -1.070312,0.16016 -1.515625,0.42188 z m 2.53125,2.53125 h 0.199219 l -0.09766,0.0977 z m 2.675781,0 H 87.4375 l -1.6875,1.6875 -0.351562,-0.35156 z m 2.824219,0 h 1.230469 l -3.367188,3.36328 -0.613281,-0.61328 z m 2.609375,0.0352 c 0.316406,0.0547 0.578125,0.24609 0.714844,0.52343 l -4.132813,4.13282 -0.617187,-0.61719 z M 81,667.59197 v 5.94141 c 0,1.66016 1.339844,3 3,3 h 5.941406 l -2,-2 H 86.15625 l 0.894531,-0.89453 -0.355469,-0.35547 -1.25,1.25 h -1.238281 l 1.867188,-1.86719 -0.707031,-0.70703 -2.160157,2.15625 C 83.085938,673.95135 83,673.75604 83,673.53338 v -0.4375 l 1.75,-1.75 -1.0625,-1.0625 -0.6875,0.6875 v -0.69922 l 0.339844,-0.33984 z m 12,0.0937 v 5.84766 c 0,0.53516 -0.417969,0.96094 -0.949219,0.98828 l -2.941406,-2.9414 z m -5,9.84766 c -5,0 -5,1 -5,1 0,1 1,1 1,1 h 8 c 0.328125,0 0.539062,-0.10937 0.6875,-0.25391 l -1.542969,-1.54687 C 90.414062,677.61927 89.425781,677.53333 88,677.53333 Z m 0,0"
 | 
			
		||||
         fill="#2e3436"
 | 
			
		||||
         fill-rule="evenodd"
 | 
			
		||||
         id="path113-6"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g53379"
 | 
			
		||||
       inkscape:label="notifications alerts calendar events"
 | 
			
		||||
       transform="translate(0,-360)">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title58232">no-events</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         transform="scale(-1,1)"
 | 
			
		||||
         y="521.53333"
 | 
			
		||||
         x="-144"
 | 
			
		||||
         height="64"
 | 
			
		||||
         width="64"
 | 
			
		||||
         id="rect53237"
 | 
			
		||||
         style="fill:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 92,525.53331 c -4.20948,0 -8,3.38032 -8,7.75 v 40.5 c 0,4.36968 3.79052,7.75 8,7.75 h 40 c 4.20948,0 8,-3.38032 8,-7.75 v -40.5 c 0,-4.36968 -3.79052,-7.75 -8,-7.75 z m -2,18 h 12 v 8 H 90 Z m 16.125,0 H 118 v 8 h -11.875 z m 15.875,0 h 12 v 8 h -12 z m -32,12 h 12 v 8 H 90 Z m 16.125,0 H 118 v 8 h -11.875 z m 15.875,0 h 12 v 8 h -12 z m -32,12 h 12 v 8 H 90 Z m 16.125,0 H 118 v 8 h -11.875 z m 15.875,0 h 12 v 8 h -12 z"
 | 
			
		||||
         id="path19157"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:0.35" />
 | 
			
		||||
      <rect
 | 
			
		||||
         height="7.9999971"
 | 
			
		||||
         id="rect19159"
 | 
			
		||||
         width="11.999997"
 | 
			
		||||
         x="121.99993"
 | 
			
		||||
         y="555.53333"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:0.1" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g8970"
 | 
			
		||||
       transform="translate(-24,-194.46669)"
 | 
			
		||||
       inkscape:label="on-screen keyboard keys">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title14941">keyboard-shift</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         width="23.999996"
 | 
			
		||||
         height="23.999996"
 | 
			
		||||
         x="23.99999"
 | 
			
		||||
         y="443.99997"
 | 
			
		||||
         id="rect8636"
 | 
			
		||||
         style="fill:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 36,448 -7.5,8 H 33 v 7 h 6 v -7 h 4.5 z"
 | 
			
		||||
         id="path1150"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1;stroke-width:0.666667" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g8978"
 | 
			
		||||
       transform="translate(8,-194.46669)"
 | 
			
		||||
       inkscape:label="on-screen keyboard keys">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title14939">keyboard-caps-lock</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         width="23.999996"
 | 
			
		||||
         height="23.999996"
 | 
			
		||||
         x="23.99999"
 | 
			
		||||
         y="443.99997"
 | 
			
		||||
         id="rect8972"
 | 
			
		||||
         style="fill:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         id="path8974"
 | 
			
		||||
         d="m 36,446 -7.5,8 H 33 v 5 h 6 v -5 h 4.5 z m -3,16 v 3 h 6 v -3 z"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g13560"
 | 
			
		||||
       inkscape:label="on-screen keyboard keys"
 | 
			
		||||
       transform="translate(-40,-214.46669)">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title14945">keyboard-layout</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         width="23.999996"
 | 
			
		||||
         height="23.999996"
 | 
			
		||||
         x="103.99999"
 | 
			
		||||
         y="463.99997"
 | 
			
		||||
         id="rect13441"
 | 
			
		||||
         style="fill:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 109,467 v 19 h 2 v -8 h 4.383 l 0.722,1.447 c 0.16942,0.33905 0.51597,0.55318 0.895,0.553 h 7 c 0.55228,0 1,-0.44772 1,-1 v -9 c 0,-0.55228 -0.44772,-1 -1,-1 h -5.383 l -0.722,-1.447 C 117.72558,467.21395 117.37903,466.99982 117,467 h -7 z"
 | 
			
		||||
         id="path1085"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g13678"
 | 
			
		||||
       inkscape:label="keyboard keys hide "
 | 
			
		||||
       transform="translate(-40,-214.46669)">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title14947">keyboard-hide</title>
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 139.99985,472 a 1,1 0 0 0 -0.70703,0.29297 1,1 0 0 0 0,1.41406 l 8,8 a 1.0001,1.0001 0 0 0 1.41406,0 l 8,-8 a 1,1 0 0 0 0,-1.41406 1,1 0 0 0 -1.41406,0 l -7.29297,7.29297 -7.29297,-7.29297 A 1,1 0 0 0 139.99985,472 Z"
 | 
			
		||||
         id="path4931"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
      <rect
 | 
			
		||||
         width="23.999996"
 | 
			
		||||
         height="23.999996"
 | 
			
		||||
         x="-487.99997"
 | 
			
		||||
         y="-159.99998"
 | 
			
		||||
         id="rect13562"
 | 
			
		||||
         transform="matrix(0,-1,-1,0,0,0)"
 | 
			
		||||
         style="fill:none" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g13796"
 | 
			
		||||
       inkscape:label="on-screen keyboard keys"
 | 
			
		||||
       transform="translate(-40,-214.46669)">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title14943">keyboard-enter</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         width="23.999996"
 | 
			
		||||
         height="23.999996"
 | 
			
		||||
         x="-487.99997"
 | 
			
		||||
         y="-191.99998"
 | 
			
		||||
         id="rect13680"
 | 
			
		||||
         transform="matrix(0,-1,-1,0,0,0)"
 | 
			
		||||
         style="fill:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         id="path955"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1"
 | 
			
		||||
         d="m 187,470 v 6.00391 c 0.006,0.996 -1,0.99609 -1,0.99609 h -11.58594 l 1.29297,-1.29297 a 1,1 0 0 0 0,-1.41406 A 1,1 0 0 0 175,474 a 1,1 0 0 0 -0.70703,0.29297 l -3,3 a 1.0001,1.0001 0 0 0 0,1.41406 l 3,3 a 1,1 0 0 0 1.41406,0 1,1 0 0 0 0,-1.41406 L 174.41602,479 H 186 c 3.006,0 3,-3 3,-3 v -6 z" />
 | 
			
		||||
    </g>
 | 
			
		||||
  </g>
 | 
			
		||||
  <g
 | 
			
		||||
     inkscape:groupmode="layer"
 | 
			
		||||
     id="layer2"
 | 
			
		||||
     inkscape:label="actions">
 | 
			
		||||
    <text
 | 
			
		||||
       xml:space="preserve"
 | 
			
		||||
       style="font-style:normal;font-weight:normal;font-size:16px;line-height:1.25;font-family:sans-serif;fill:#241f31;fill-opacity:1;stroke:none"
 | 
			
		||||
       x="-4"
 | 
			
		||||
       y="184"
 | 
			
		||||
       id="text12715"><tspan
 | 
			
		||||
         sodipodi:role="line"
 | 
			
		||||
         id="tspan12713"
 | 
			
		||||
         x="-4"
 | 
			
		||||
         y="184"
 | 
			
		||||
         style="font-size:16px;fill:#241f31;fill-opacity:1">actions</tspan></text>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g13433"
 | 
			
		||||
       inkscape:label="overview previous left backward"
 | 
			
		||||
       transform="translate(-40,-240)">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title15448">carousel-arrow-previous</title>
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 53.169107,497.03665 a 1.5,1.5 0 0 0 -0.9375,0.66211 l -6,9.5 a 1.50015,1.50015 0 0 0 0,1.60156 l 6,9.5 a 1.5,1.5 0 0 0 2.068359,0.4668 1.5,1.5 0 0 0 0.466797,-2.06836 l -5.49414,-8.69922 5.49414,-8.69922 a 1.5,1.5 0 0 0 -0.466797,-2.06836 1.5,1.5 0 0 0 -1.130859,-0.19531 z"
 | 
			
		||||
         id="path13468"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
      <rect
 | 
			
		||||
         width="23.999996"
 | 
			
		||||
         height="23.999996"
 | 
			
		||||
         x="39.999992"
 | 
			
		||||
         y="495.99997"
 | 
			
		||||
         id="rect12821"
 | 
			
		||||
         style="fill:none" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g13439"
 | 
			
		||||
       transform="matrix(-1,0,0,1,95.99998,-240)"
 | 
			
		||||
       inkscape:label="overview next right forward">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title15446">carousel-arrow-next</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         width="23.999996"
 | 
			
		||||
         height="23.999996"
 | 
			
		||||
         x="39.999992"
 | 
			
		||||
         y="495.99997"
 | 
			
		||||
         id="rect13435"
 | 
			
		||||
         style="fill:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 53.169235,497.03711 c -0.387918,0.0877 -0.725132,0.32585 -0.9375,0.66211 l -6,9.5 c -0.34001,0.56012 -0.308809,1.11236 0,1.60156 l 6,9.5 c 0.442487,0.69974 1.368227,0.90867 2.068359,0.4668 0.69974,-0.44249 0.908665,-1.36823 0.466797,-2.06836 L 49.272751,508 l 5.49414,-8.69922 c 0.441868,-0.70013 0.232943,-1.62587 -0.466797,-2.06836 -0.336162,-0.21243 -0.742919,-0.28268 -1.130859,-0.19531 z"
 | 
			
		||||
         id="path13468-5"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g29998"
 | 
			
		||||
       inkscape:label="mouse pointer dwell click"
 | 
			
		||||
       transform="translate(28,-344)">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title39373">pointer-secondary-click</title>
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 16,640 v 19.77148 l -4.24414,-4.14258 c -0.612408,1.21538 -1.173049,2.46023 -1.819709,3.6561 -1.141947,1.47628 -3.975266,0.38901 -3.846009,-1.47361 0.09413,-0.82252 0.594755,-1.52142 0.899969,-2.2776 l 0.896608,-1.92051 H 2.617188 Z m -1.5,3.72656 -8.359375,8.38672 h 4.101563 c -0.885072,1.9032 -1.781799,3.80152 -2.659622,5.70774 -0.0349,0.56609 1.149057,0.98883 1.282093,0.29797 l 2.455699,-5.01348 3.179687,3.10351 z"
 | 
			
		||||
         id="path5851"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
      <rect
 | 
			
		||||
         width="20"
 | 
			
		||||
         height="20"
 | 
			
		||||
         x="-7.6293945e-06"
 | 
			
		||||
         y="640"
 | 
			
		||||
         id="rect1156"
 | 
			
		||||
         style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:1.781;marker:none;enable-background:new" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g29992"
 | 
			
		||||
       inkscape:label="mouse pointer dwell click"
 | 
			
		||||
       transform="translate(-28,-344)">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title39371">pointer-primary-click</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         width="20"
 | 
			
		||||
         height="20"
 | 
			
		||||
         x="27.999992"
 | 
			
		||||
         y="640"
 | 
			
		||||
         id="rect1244"
 | 
			
		||||
         style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:1.781;marker:none;enable-background:new" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 32,640 v 19.64648 l 4.24414,-4.14257 c 0.612408,1.21537 1.173049,2.46022 1.819709,3.65609 1.141947,1.47628 3.975266,0.38901 3.846009,-1.47361 -0.09413,-0.82252 -0.594755,-1.52142 -0.899969,-2.2776 l -0.896608,-1.92051 h 5.269531 z m 1.5,3.72656 8.359375,8.26172 h -4.101563 c 0.885072,1.9032 1.781799,3.80152 2.659622,5.70774 0.0349,0.56609 -1.149057,0.98883 -1.282093,0.29798 l -2.455699,-5.01349 -3.179687,3.10352 z"
 | 
			
		||||
         id="path5565"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g14643"
 | 
			
		||||
       inkscape:label="mouse pointer dwell click drag"
 | 
			
		||||
       transform="translate(0,-344)">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title39369">pointer-drag</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         width="20"
 | 
			
		||||
         height="20"
 | 
			
		||||
         x="55.999992"
 | 
			
		||||
         y="640"
 | 
			
		||||
         id="rect9430"
 | 
			
		||||
         style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:1.781;marker:none;enable-background:new" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 66.92607,642.31969 c -0.836524,0.0747 -1.818151,-0.13657 -2.447266,0.57617 -0.179249,0.5031 -0.39107,0.72969 -0.945312,0.61718 -0.793816,-0.0511 -1.701912,0.0538 -2.1875,0.77344 -0.554908,0.83096 -0.313681,1.85623 -0.367187,2.79297 v 1.50195 c -0.509721,-0.31797 -1.13192,-0.13205 -1.699219,-0.18164 -0.442833,-0.0207 -0.881113,0.0252 -1.31836,0.0918 0.05693,2.68593 0.07373,5.37334 0.121094,8.05859 0.09369,1.3023 1.232044,2.40482 2.544922,2.42383 0.632949,0.0151 1.48233,0.007 2.224609,0.0117 3.221817,-0.0121 6.446114,0.0498 9.666016,-0.0566 1.162213,-0.12022 2.213268,-1.18845 2.070313,-2.39648 v -9.48047 c -0.706809,-0.94069 -1.815276,-1.78087 -3.058594,-1.57032 -0.299549,-0.45356 -0.486118,-1.47311 -1.226563,-1.79882 -0.354855,-0.29104 -0.839588,-0.10977 -1.259765,-0.16211 -0.297442,-0.0727 -0.8559,0.19254 -0.869141,-0.25196 -0.157351,-0.52152 -0.715235,-0.90856 -1.248047,-0.94921 z m -0.105469,1.5039 c 0.164522,0.27146 0.182773,0.75372 0.21875,1.125 0.0066,0.007 0.0198,0.006 0.02734,0.0117 -0.0091,-1.7e-4 -0.01824,1.7e-4 -0.02734,0 l 0.494141,5.90039 0.664062,-5.8418 1.345704,0.004 c 0.536079,0.38955 0.412986,1.14048 0.554687,1.72266 -0.01113,0.0675 0.0064,0.096 0.01563,0.13672 -6.5e-4,-10e-6 -0.0013,0 -0.002,0 l 0.01172,0.0859 0.482422,3.86524 0.664062,-3.91993 c 0.574035,-0.0371 1.157689,0.0385 1.558594,0.50196 0.40964,0.21686 0.215641,0.68897 0.259766,1.05859 v 8.3418 c -0.337059,0.96368 -1.599977,0.54827 -2.375,0.66016 -3.370517,0.0131 -6.742137,0.0338 -10.111329,-0.0137 -0.975625,-0.0283 -1.141898,-1.06997 -1.040974,-1.84179 -0.01164,-1.90706 -0.04474,-3.81393 -0.07813,-5.72071 0.326364,0.006 0.675958,-0.0127 0.988281,0.01 0.493884,0.91523 0.484615,2.00119 0.507813,3.01563 0.492636,-0.007 1.043381,0.0398 1.5,0 0.0091,-2.51961 -0.01844,-5.04003 0.01367,-7.5586 0.104898,-0.5199 0.730745,-0.30916 1.111329,-0.35352 h 0.675781 l 0.488281,5.84766 0.669922,-5.87695 h -0.0039 c 0.03095,-0.38284 -0.150626,-0.89584 0.24805,-1.11914 z"
 | 
			
		||||
         id="path5630"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g30454"
 | 
			
		||||
       inkscape:label="mouse pointer dwell click double"
 | 
			
		||||
       transform="translate(0,-344)">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title39367">pointer-double-click</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         width="20"
 | 
			
		||||
         height="20"
 | 
			
		||||
         x="83.999992"
 | 
			
		||||
         y="640"
 | 
			
		||||
         id="rect14651"
 | 
			
		||||
         style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:1.781;marker:none;enable-background:new" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 85,640 v 19.70898 l 4.24414,-4.14453 c 0.5882,1.18866 1.158389,2.38656 1.758464,3.56913 1.108631,1.64026 4.157538,0.46513 3.89799,-1.49586 0.01057,-0.47022 -0.405577,-0.90844 -0.434651,-1.31364 l 0.778203,-0.75963 c 0.5882,1.18866 1.158389,2.38656 1.758464,3.56913 1.108631,1.64026 4.15754,0.46513 3.89799,-1.49586 -0.19232,-0.9043 -0.71785,-1.69802 -1.068629,-2.54897 l -0.716725,-1.53797 h 4.830074 L 91,640 v 6.24414 z m 1.5,3.72656 6,6.24414 v -6.24414 l 7.92188,8.32422 h -3.662115 c 0.883468,1.90344 1.781983,3.80027 2.656081,5.70782 0.0065,0.62278 -1.227555,0.98057 -1.325116,0.20712 l -2.412991,-4.92076 -3.060547,2.98633 c 0.263642,0.60805 0.596803,1.19246 0.814693,1.81614 -0.182662,0.60103 -1.26833,0.8373 -1.365856,0.0679 l -2.388284,-4.87037 -3.177734,3.10156 z"
 | 
			
		||||
         id="path5565-5"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g1429"
 | 
			
		||||
       transform="translate(-132,-248)"
 | 
			
		||||
       inkscape:label="screenshooter capture area ">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title1423">screenshot-ui-area</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         width="31.999998"
 | 
			
		||||
         height="31.999998"
 | 
			
		||||
         x="-491.99994"
 | 
			
		||||
         y="-163.99998"
 | 
			
		||||
         id="rect1425"
 | 
			
		||||
         transform="matrix(0,-1,-1,0,0,0)"
 | 
			
		||||
         style="fill:none;stroke-width:1" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 135.5,462 a 3.515,3.515 0 0 0 -3.5,3.5 c 0,1.385 0.822,2.593 2,3.158 V 472 h 2 v -3.037 A 3.521,3.521 0 0 0 138.963,466 H 141 v -2 h -2.342 a 3.516,3.516 0 0 0 -3.158,-2 z m 25,0 a 3.516,3.516 0 0 0 -3.158,2 H 155 v 2 h 2.037 A 3.521,3.521 0 0 0 160,468.963 V 472 h 2 v -3.342 a 3.516,3.516 0 0 0 2,-3.158 c 0,-1.921 -1.579,-3.5 -3.5,-3.5 z m -25,2 c 0.84,0 1.5,0.66 1.5,1.5 0,0.84 -0.66,1.5 -1.5,1.5 -0.84,0 -1.5,-0.66 -1.5,-1.5 0,-0.84 0.66,-1.5 1.5,-1.5 z m 7.5,0 v 2 h 4 v -2 z m 6,0 v 2 h 4 v -2 z m 11.5,0 c 0.84,0 1.5,0.66 1.5,1.5 0,0.84 -0.66,1.5 -1.5,1.5 -0.84,0 -1.5,-0.66 -1.5,-1.5 0,-0.84 0.66,-1.5 1.5,-1.5 z M 134,474 v 4 h 2 v -4 z m 26,0 v 4 h 2 v -4 z m -26,6 v 3.342 a 3.516,3.516 0 0 0 -2,3.158 c 0,1.921 1.579,3.5 3.5,3.5 a 3.516,3.516 0 0 0 3.158,-2 H 141 v -2 h -2.037 A 3.521,3.521 0 0 0 136,483.037 V 480 Z m 26,0 v 3.037 A 3.521,3.521 0 0 0 157.037,486 H 155 v 2 h 2.342 a 3.516,3.516 0 0 0 3.158,2 c 1.921,0 3.5,-1.579 3.5,-3.5 a 3.516,3.516 0 0 0 -2,-3.158 V 480 Z m -24.5,5 c 0.84,0 1.5,0.66 1.5,1.5 0,0.84 -0.66,1.5 -1.5,1.5 -0.84,0 -1.5,-0.66 -1.5,-1.5 0,-0.84 0.66,-1.5 1.5,-1.5 z m 25,0 c 0.84,0 1.5,0.66 1.5,1.5 0,0.84 -0.66,1.5 -1.5,1.5 -0.84,0 -1.5,-0.66 -1.5,-1.5 0,-0.84 0.66,-1.5 1.5,-1.5 z m -17.5,1 v 2 h 4 v -2 z m 6,0 v 2 h 4 v -2 z"
 | 
			
		||||
         id="path2-3"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g4349"
 | 
			
		||||
       transform="translate(-92,-248)"
 | 
			
		||||
       inkscape:label="screenshooter capture display screen ">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title4343">screenshot-ui-display</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         width="31.999998"
 | 
			
		||||
         height="31.999998"
 | 
			
		||||
         x="-491.99994"
 | 
			
		||||
         y="-163.99998"
 | 
			
		||||
         id="rect4345"
 | 
			
		||||
         transform="matrix(0,-1,-1,0,0,0)"
 | 
			
		||||
         style="fill:none;stroke-width:1" />
 | 
			
		||||
      <path
 | 
			
		||||
         id="path9443"
 | 
			
		||||
         d="m 136,464 c -1.662,0 -3,1.338 -3,3 v 14 c 0,1.662 1.338,3 3,3 h 10 v 2.99805 h -3.00195 c -1.0901,-7e-5 -1.99805,0.90995 -1.99805,2 H 142.99805 153 155 C 155,487.908 154.09,487.00007 153,487 h -2.99805 v -3 H 160 c 1.662,0 3,-1.338 3,-3 v -14 c 0,-1.662 -1.338,-3 -3,-3 z m 0,2 h 24 c 0.554,0 1,0.446 1,1 v 14 c 0,0.554 -0.446,1 -1,1 h -24 c -0.554,0 -1,-0.446 -1,-1 v -14 c 0,-0.554 0.446,-1 1,-1 z"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g4445"
 | 
			
		||||
       transform="translate(-52,-248)"
 | 
			
		||||
       inkscape:label="screenshooter capture windows">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title4439">screenshot-ui-window</title>
 | 
			
		||||
      <path
 | 
			
		||||
         id="rect28516"
 | 
			
		||||
         d="m 135,463 c -1.6447,0 -3,1.3553 -3,3 v 14 c 0,1.6447 1.3553,3 3,3 h 3.99805 v 3 c 0,1.6447 1.3553,3 3,3 h 18.99804 c 1.6447,0 3,-1.3553 3,-3 v -14 c 0,-1.6447 -1.3553,-3 -3,-3 h -4 v -3 c 0,-1.6447 -1.3553,-3 -3,-3 z m 0,2 h 18.99609 c 0.5713,0 1,0.4287 1,1 v 3 h -12.99804 c -1.6447,0 -3,1.3553 -3,3 v 9 H 135 c -0.5713,0 -1,-0.4287 -1,-1 v -14 c 0,-0.5713 0.4287,-1 1,-1 z m 6.99805,6 h 18.99804 c 0.5713,0 1,0.4287 1,1 v 14 c 0,0.5713 -0.4287,1 -1,1 h -18.99804 c -0.5713,0 -1,-0.4287 -1,-1 v -14 c 0,-0.5713 0.4287,-1 1,-1 z"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
      <rect
 | 
			
		||||
         width="31.999998"
 | 
			
		||||
         height="31.999998"
 | 
			
		||||
         x="-491.99994"
 | 
			
		||||
         y="-163.99998"
 | 
			
		||||
         id="rect4441"
 | 
			
		||||
         transform="matrix(0,-1,-1,0,0,0)"
 | 
			
		||||
         style="fill:none;stroke-width:1" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g42319"
 | 
			
		||||
       transform="translate(-12,-248)"
 | 
			
		||||
       inkscape:label="screenshooter capture windows">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title42313">screenshot-ui-window</title>
 | 
			
		||||
      <path
 | 
			
		||||
         id="path42315"
 | 
			
		||||
         d="m 135,463 c -1.6447,0 -3,1.3553 -3,3 v 14 c 0,1.6447 1.3553,3 3,3 h 3.99805 v 3 c 0,1.6447 1.3553,3 3,3 h 18.99804 c 1.6447,0 3,-1.3553 3,-3 v -14 c 0,-1.6447 -1.3553,-3 -3,-3 h -4 v -3 c 0,-1.6447 -1.3553,-3 -3,-3 z m 0,2 h 18.99609 c 0.5713,0 1,0.4287 1,1 v 3 h -12.99804 c -1.6447,0 -3,1.3553 -3,3 v 9 H 135 c -0.5713,0 -1,-0.4287 -1,-1 v -14 c 0,-0.5713 0.4287,-1 1,-1 z m 6.99805,6 h 18.99804 c 0.5713,0 1,0.4287 1,1 v 14 c 0,0.5713 -0.4287,1 -1,1 h -18.99804 c -0.5713,0 -1,-0.4287 -1,-1 v -14 c 0,-0.5713 0.4287,-1 1,-1 z"
 | 
			
		||||
         style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
      <rect
 | 
			
		||||
         width="31.999998"
 | 
			
		||||
         height="31.999998"
 | 
			
		||||
         x="-491.99994"
 | 
			
		||||
         y="-163.99998"
 | 
			
		||||
         id="rect42317"
 | 
			
		||||
         transform="matrix(0,-1,-1,0,0,0)"
 | 
			
		||||
         style="fill:none;stroke-width:1" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g42429"
 | 
			
		||||
       inkscape:label="screenshooter capture display screen "
 | 
			
		||||
       transform="translate(-80,-335.53331)">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title42423">screenshot-ui-show-pointer</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         transform="scale(-1,1)"
 | 
			
		||||
         y="663.53333"
 | 
			
		||||
         x="-96"
 | 
			
		||||
         height="16"
 | 
			
		||||
         width="16"
 | 
			
		||||
         id="rect42425"
 | 
			
		||||
         style="fill:none" />
 | 
			
		||||
      <path
 | 
			
		||||
         d="m 82.95312,664.60753 2.41797,13.21094 3.23828,-2.39844 2.05469,2.64844 c 1.03125,1.43359 3.14844,-0.21094 2.01172,-1.5625 l -2.01562,-2.59375 2.98437,-2.17579 z m 0,0"
 | 
			
		||||
         fill="#2e3436"
 | 
			
		||||
         id="path2-35" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <g
 | 
			
		||||
       id="g14227"
 | 
			
		||||
       transform="translate(-71.999987,-207.99997)"
 | 
			
		||||
       inkscape:label="overview window close">
 | 
			
		||||
      <title
 | 
			
		||||
         id="title15444">preview-close</title>
 | 
			
		||||
      <rect
 | 
			
		||||
         width="23.999996"
 | 
			
		||||
         height="23.999996"
 | 
			
		||||
         x="-487.99997"
 | 
			
		||||
         y="-159.99998"
 | 
			
		||||
         id="rect14223"
 | 
			
		||||
         transform="matrix(0,-1,-1,0,0,0)"
 | 
			
		||||
         style="fill:none" />
 | 
			
		||||
    </g>
 | 
			
		||||
    <path
 | 
			
		||||
       id="path986"
 | 
			
		||||
       d="M 71 262 A 1 1 0 0 0 70.292969 262.29297 A 1 1 0 0 0 70.292969 263.70703 L 74.585938 268 L 70.292969 272.29297 A 1 1 0 0 0 70.292969 273.70703 A 1 1 0 0 0 71.707031 273.70703 L 76 269.41406 L 80.292969 273.70703 A 1 1 0 0 0 81.707031 273.70703 A 1 1 0 0 0 81.707031 272.29297 L 77.414062 268 L 81.707031 263.70703 A 1 1 0 0 0 81.707031 262.29297 A 1 1 0 0 0 81 262 A 1 1 0 0 0 80.292969 262.29297 L 76 266.58594 L 71.707031 262.29297 A 1 1 0 0 0 71 262 z "
 | 
			
		||||
       style="fill:#241f31;fill-opacity:1" />
 | 
			
		||||
  </g>
 | 
			
		||||
</svg>
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 25 KiB  | 
@@ -41,7 +41,7 @@
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="disable-extension-version-validation" type="b">
 | 
			
		||||
      <default>false</default>
 | 
			
		||||
      <default>true</default>
 | 
			
		||||
      <summary>Disables the validation of extension version compatibility</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
        GNOME Shell will only load extensions that claim to support the current
 | 
			
		||||
@@ -50,13 +50,20 @@
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="favorite-apps" type="as">
 | 
			
		||||
      <default>[ 'org.gnome.Epiphany.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
 | 
			
		||||
      <default>[ 'org.gnome.Epiphany.desktop', 'org.gnome.Geary.desktop', 'org.gnome.Calendar.desktop', 'org.gnome.Music.desktop', 'org.gnome.Photos.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
 | 
			
		||||
      <summary>List of desktop file IDs for favorite applications</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
        The applications corresponding to these identifiers
 | 
			
		||||
        will be displayed in the favorites area.
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="app-picker-view" type="u">
 | 
			
		||||
      <default>0</default>
 | 
			
		||||
      <summary>App Picker View</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
        Index of the currently selected view in the application picker.
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="command-history" type="as">
 | 
			
		||||
      <default>[]</default>
 | 
			
		||||
      <summary>History for command (Alt-F2) dialog</summary>
 | 
			
		||||
@@ -94,58 +101,12 @@
 | 
			
		||||
        adapter is ever seen not to have devices associated to it.
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="last-selected-power-profile" type="s">
 | 
			
		||||
      <default>"power-saver"</default>
 | 
			
		||||
      <summary>The last selected non-default power profile</summary>
 | 
			
		||||
    <key name="introspect" type="b">
 | 
			
		||||
      <default>false</default>
 | 
			
		||||
      <summary>Enable introspection API</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
        Some systems support more than two power profiles. In order to still support
 | 
			
		||||
        toggling between two profiles, this key records the last selected non-default
 | 
			
		||||
        profile.
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="welcome-dialog-last-shown-version" type="s">
 | 
			
		||||
      <default>''</default>
 | 
			
		||||
      <summary>The last version the “Welcome to GNOME” dialog was shown for</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
        This key determines for which version the “Welcome to GNOME” dialog was
 | 
			
		||||
        last shown. An empty string represents the oldest possible version, and
 | 
			
		||||
        a huge number will represent versions that do not exist yet. This huge
 | 
			
		||||
        number can be used to effectively disable the dialog.
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="app-picker-layout" type="aa{sv}">
 | 
			
		||||
      <default><![CDATA[
 | 
			
		||||
        [{
 | 
			
		||||
          'org.gnome.Geary.desktop': <{'position': <0>}>,
 | 
			
		||||
          'org.gnome.Contacts.desktop': <{'position': <1>}>,
 | 
			
		||||
          'org.gnome.Weather.desktop': <{'position': <2>}>,
 | 
			
		||||
          'org.gnome.clocks.desktop': <{'position': <3>}>,
 | 
			
		||||
          'org.gnome.Maps.desktop': <{'position': <4>}>,
 | 
			
		||||
          'org.gnome.Books.desktop': <{'position': <5>}>,
 | 
			
		||||
          'org.gnome.Photos.desktop': <{'position': <6>}>,
 | 
			
		||||
          'org.gnome.Totem.desktop': <{'position': <7>}>,
 | 
			
		||||
          'org.gnome.Calculator.desktop': <{'position': <8>}>,
 | 
			
		||||
          'org.gnome.gedit.desktop': <{'position': <9>}>,
 | 
			
		||||
          'simple-scan.desktop': <{'position': <10>}>,
 | 
			
		||||
          'org.gnome.Settings.desktop': <{'position': <11>}>,
 | 
			
		||||
          'gnome-system-monitor.desktop': <{'position': <12>}>,
 | 
			
		||||
          'org.gnome.Boxes.desktop': <{'position': <13>}>,
 | 
			
		||||
          'org.gnome.Terminal.desktop': <{'position': <14>}>,
 | 
			
		||||
          'Utilities': <{'position': <15>}>,
 | 
			
		||||
          'org.gnome.Characters.desktop': <{'position': <16>}>,
 | 
			
		||||
          'yelp.desktop': <{'position': <17>}>,
 | 
			
		||||
          'org.gnome.Screenshot.desktop': <{'position': <18>}>,
 | 
			
		||||
          'org.gnome.Cheese.desktop': <{'position': <19>}>,
 | 
			
		||||
          'org.gnome.font-viewer.desktop': <{'position': <20>}>
 | 
			
		||||
        }]
 | 
			
		||||
      ]]></default>
 | 
			
		||||
      <summary>Layout of the app picker</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
        Layout of the app picker. Each entry in the array is a page. Pages are
 | 
			
		||||
        stored in the order they appear in GNOME Shell. Each page contains an
 | 
			
		||||
        “application id” → 'data' pair. Currently, the following values are
 | 
			
		||||
        stored as 'data':
 | 
			
		||||
          • “position”: the position of the application icon in the page
 | 
			
		||||
        Enables a D-Bus API that allows to introspect the application state of
 | 
			
		||||
        the shell.
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <child name="keybindings" schema="org.gnome.shell.keybindings"/>
 | 
			
		||||
@@ -160,20 +121,6 @@
 | 
			
		||||
        Keybinding to open the application menu.
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="shift-overview-up" type="as">
 | 
			
		||||
      <default>["<Super><Alt>Up"]</default>
 | 
			
		||||
      <summary>Keybinding to shift between overview states</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
        Keybinding to shift between session, window picker and app grid
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="shift-overview-down" type="as">
 | 
			
		||||
      <default>["<Super><Alt>Down"]</default>
 | 
			
		||||
      <summary>Keybinding to shift between overview states</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
        Keybinding to shift between app grid, window picker and session
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="toggle-application-view" type="as">
 | 
			
		||||
      <default>["<Super>a"]</default>
 | 
			
		||||
      <summary>Keybinding to open the “Show Applications” view</summary>
 | 
			
		||||
@@ -239,30 +186,6 @@
 | 
			
		||||
      <default>["<Super>9"]</default>
 | 
			
		||||
      <summary>Switch to application 9</summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="switch-realm" type="as">
 | 
			
		||||
      <default>["<Primary>Tab"]</default>
 | 
			
		||||
      <summary>Open Realm Switcher</summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="switch-realm-backward" type="as">
 | 
			
		||||
      <default>["<Shift><Primary>Tab"]</default>
 | 
			
		||||
      <summary>Open Realm Switcher Backwards</summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="show-screenshot-ui" type="as">
 | 
			
		||||
      <default>["Print"]</default>
 | 
			
		||||
      <summary>Take a screenshot interactively</summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="show-screen-recording-ui" type="as">
 | 
			
		||||
      <default>["<Ctrl><Shift><Alt>R"]</default>
 | 
			
		||||
      <summary>Record a screencast interactively</summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="screenshot-window" type="as">
 | 
			
		||||
      <default>["<Alt>Print"]</default>
 | 
			
		||||
      <summary>Take a screenshot of a window</summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="screenshot" type="as">
 | 
			
		||||
      <default>["<Shift>Print"]</default>
 | 
			
		||||
      <summary>Take a screenshot</summary>
 | 
			
		||||
    </key>
 | 
			
		||||
  </schema>
 | 
			
		||||
 | 
			
		||||
  <schema id="org.gnome.shell.app-switcher"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,978 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "levels": [
 | 
			
		||||
    {
 | 
			
		||||
      "level": "",
 | 
			
		||||
      "mode": "default",
 | 
			
		||||
      "rows": [
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "q"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "w"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "e",
 | 
			
		||||
              "é",
 | 
			
		||||
              "è",
 | 
			
		||||
              "ê",
 | 
			
		||||
              "ë",
 | 
			
		||||
              "ė"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "r"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "t"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "z"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "u",
 | 
			
		||||
              "ü",
 | 
			
		||||
              "û",
 | 
			
		||||
              "ù",
 | 
			
		||||
              "ú",
 | 
			
		||||
              "ū"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "i"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "o",
 | 
			
		||||
              "ö",
 | 
			
		||||
              "ô",
 | 
			
		||||
              "ò",
 | 
			
		||||
              "ó",
 | 
			
		||||
              "õ",
 | 
			
		||||
              "œ",
 | 
			
		||||
              "ø",
 | 
			
		||||
              "ō"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "p"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "delete",
 | 
			
		||||
            "iconName": "edit-clear-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "a",
 | 
			
		||||
              "ä",
 | 
			
		||||
              "â",
 | 
			
		||||
              "à",
 | 
			
		||||
              "á",
 | 
			
		||||
              "æ",
 | 
			
		||||
              "ã",
 | 
			
		||||
              "å",
 | 
			
		||||
              "ā"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "s",
 | 
			
		||||
              "ß",
 | 
			
		||||
              "ś",
 | 
			
		||||
              "š"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "d"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "f"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "g"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "h"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "j"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "k"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "l"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "iconName": "keyboard-enter-symbolic",
 | 
			
		||||
            "keyval": "0xff0d",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "iconName": "keyboard-shift-symbolic",
 | 
			
		||||
            "level": 1
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "y"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "x"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "c"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "v"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "b"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "n",
 | 
			
		||||
              "ñ",
 | 
			
		||||
              "ń"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "m"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ","
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ".",
 | 
			
		||||
              "#",
 | 
			
		||||
              "!",
 | 
			
		||||
              ",",
 | 
			
		||||
              "?",
 | 
			
		||||
              "-",
 | 
			
		||||
              ":",
 | 
			
		||||
              "'",
 | 
			
		||||
              "@"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "iconName": "keyboard-shift-symbolic",
 | 
			
		||||
            "level": 1,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "?123",
 | 
			
		||||
            "level": 2,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "emoji",
 | 
			
		||||
            "iconName": "face-smile-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              " "
 | 
			
		||||
            ],
 | 
			
		||||
            "width": 5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "languageMenu",
 | 
			
		||||
            "iconName": "keyboard-layout-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "hide",
 | 
			
		||||
            "iconName": "keyboard-hide-symbolic",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "level": "shift",
 | 
			
		||||
      "mode": "latched",
 | 
			
		||||
      "rows": [
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "Q"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "W"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "E",
 | 
			
		||||
              "É",
 | 
			
		||||
              "È",
 | 
			
		||||
              "Ê",
 | 
			
		||||
              "Ë",
 | 
			
		||||
              "Ė"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "R"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "T"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "Z"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "U",
 | 
			
		||||
              "Ü",
 | 
			
		||||
              "Û",
 | 
			
		||||
              "Ù",
 | 
			
		||||
              "Ú",
 | 
			
		||||
              "Ū"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "I"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "O",
 | 
			
		||||
              "Ö",
 | 
			
		||||
              "Ô",
 | 
			
		||||
              "Ò",
 | 
			
		||||
              "Ó",
 | 
			
		||||
              "Õ",
 | 
			
		||||
              "Œ",
 | 
			
		||||
              "Ø",
 | 
			
		||||
              "Ō"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "P"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "delete",
 | 
			
		||||
            "iconName": "edit-clear-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "A",
 | 
			
		||||
              "Ä",
 | 
			
		||||
              "Â",
 | 
			
		||||
              "À",
 | 
			
		||||
              "Á",
 | 
			
		||||
              "Æ",
 | 
			
		||||
              "Ã",
 | 
			
		||||
              "Å",
 | 
			
		||||
              "Ā"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "S",
 | 
			
		||||
              "SS",
 | 
			
		||||
              "Ś",
 | 
			
		||||
              "Š"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "D"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "F"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "G"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "H"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "J"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "K"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "L"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "iconName": "keyboard-enter-symbolic",
 | 
			
		||||
            "keyval": "0xff0d",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "iconName": "keyboard-shift-symbolic",
 | 
			
		||||
            "level": 0
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "Y"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "X"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "C"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "V"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "B"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "N",
 | 
			
		||||
              "Ñ",
 | 
			
		||||
              "Ń"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "M"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ","
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ".",
 | 
			
		||||
              "#",
 | 
			
		||||
              "!",
 | 
			
		||||
              ",",
 | 
			
		||||
              "?",
 | 
			
		||||
              "-",
 | 
			
		||||
              ":",
 | 
			
		||||
              "'",
 | 
			
		||||
              "@"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "iconName": "keyboard-shift-symbolic",
 | 
			
		||||
            "level": 0,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "?123",
 | 
			
		||||
            "level": 2,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "emoji",
 | 
			
		||||
            "iconName": "face-smile-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              " "
 | 
			
		||||
            ],
 | 
			
		||||
            "width": 5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "languageMenu",
 | 
			
		||||
            "iconName": "keyboard-layout-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "hide",
 | 
			
		||||
            "iconName": "keyboard-hide-symbolic",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "level": "opt",
 | 
			
		||||
      "mode": "locked",
 | 
			
		||||
      "rows": [
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "1",
 | 
			
		||||
              "¹",
 | 
			
		||||
              "½",
 | 
			
		||||
              "⅓",
 | 
			
		||||
              "¼",
 | 
			
		||||
              "⅛"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "2",
 | 
			
		||||
              "²",
 | 
			
		||||
              "⅔"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "3",
 | 
			
		||||
              "³",
 | 
			
		||||
              "¾",
 | 
			
		||||
              "⅜"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "4",
 | 
			
		||||
              "⁴"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "5",
 | 
			
		||||
              "⅝"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "6"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "7",
 | 
			
		||||
              "⅞"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "8"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "9"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "0",
 | 
			
		||||
              "ⁿ",
 | 
			
		||||
              "∅"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "delete",
 | 
			
		||||
            "iconName": "edit-clear-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "@"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "#"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "€",
 | 
			
		||||
              "¢",
 | 
			
		||||
              "£",
 | 
			
		||||
              "$",
 | 
			
		||||
              "¥",
 | 
			
		||||
              "₱"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "%",
 | 
			
		||||
              "‰"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "&"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "-",
 | 
			
		||||
              "_",
 | 
			
		||||
              "–",
 | 
			
		||||
              "—",
 | 
			
		||||
              "·"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "+",
 | 
			
		||||
              "±"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "(",
 | 
			
		||||
              "<",
 | 
			
		||||
              "{",
 | 
			
		||||
              "["
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ")",
 | 
			
		||||
              ">",
 | 
			
		||||
              "}",
 | 
			
		||||
              "]"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "iconName": "keyboard-enter-symbolic",
 | 
			
		||||
            "keyval": "0xff0d",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "=/<",
 | 
			
		||||
            "level": 3,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "*",
 | 
			
		||||
              "†",
 | 
			
		||||
              "‡",
 | 
			
		||||
              "★"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "\"",
 | 
			
		||||
              "“",
 | 
			
		||||
              "”",
 | 
			
		||||
              "«",
 | 
			
		||||
              "»"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "'",
 | 
			
		||||
              "‘",
 | 
			
		||||
              "’",
 | 
			
		||||
              "‹",
 | 
			
		||||
              "›"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ":"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ";"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "!",
 | 
			
		||||
              "¡"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "?",
 | 
			
		||||
              "¿"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "=/<",
 | 
			
		||||
            "level": 3,
 | 
			
		||||
            "width": 3
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "ABC",
 | 
			
		||||
            "level": 0,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "_"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "/"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              " "
 | 
			
		||||
            ],
 | 
			
		||||
            "width": 3
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ","
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ".",
 | 
			
		||||
              "…"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "emoji",
 | 
			
		||||
            "iconName": "face-smile-symbolic"
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "languageMenu",
 | 
			
		||||
            "iconName": "keyboard-layout-symbolic"
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "hide",
 | 
			
		||||
            "iconName": "keyboard-hide-symbolic"
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "level": "opt+shift",
 | 
			
		||||
      "mode": "locked",
 | 
			
		||||
      "rows": [
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "~"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "`"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "|"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "•",
 | 
			
		||||
              "♪",
 | 
			
		||||
              "♥",
 | 
			
		||||
              "♠",
 | 
			
		||||
              "♦",
 | 
			
		||||
              "♣"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "√"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "Π",
 | 
			
		||||
              "π"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "÷"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "×"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "¶",
 | 
			
		||||
              "§"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "∆"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "delete",
 | 
			
		||||
            "iconName": "edit-clear-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "£"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "¥"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "$",
 | 
			
		||||
              "¢"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "¢"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "^",
 | 
			
		||||
              "↑",
 | 
			
		||||
              "↓",
 | 
			
		||||
              "←",
 | 
			
		||||
              "→"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "°",
 | 
			
		||||
              "′",
 | 
			
		||||
              "″"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "=",
 | 
			
		||||
              "≠",
 | 
			
		||||
              "≈",
 | 
			
		||||
              "∞"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "{"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "}"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "iconName": "keyboard-enter-symbolic",
 | 
			
		||||
            "keyval": "0xff0d",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "?123",
 | 
			
		||||
            "level": 2,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "\\"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "©"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "®"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "™"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "℅"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "["
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "]"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "?123",
 | 
			
		||||
            "level": 2,
 | 
			
		||||
            "width": 3
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "ABC",
 | 
			
		||||
            "level": 0,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "<",
 | 
			
		||||
              "‹",
 | 
			
		||||
              "≤",
 | 
			
		||||
              "«"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ">",
 | 
			
		||||
              "›",
 | 
			
		||||
              "≥",
 | 
			
		||||
              "»"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              " "
 | 
			
		||||
            ],
 | 
			
		||||
            "width": 3
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ","
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ".",
 | 
			
		||||
              "…"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "emoji",
 | 
			
		||||
            "iconName": "face-smile-symbolic"
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "languageMenu",
 | 
			
		||||
            "iconName": "keyboard-layout-symbolic"
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "hide",
 | 
			
		||||
            "iconName": "keyboard-hide-symbolic"
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "locale": "de-AT",
 | 
			
		||||
  "name": "Austrian German"
 | 
			
		||||
}
 | 
			
		||||
@@ -1,978 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "levels": [
 | 
			
		||||
    {
 | 
			
		||||
      "level": "",
 | 
			
		||||
      "mode": "default",
 | 
			
		||||
      "rows": [
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "q"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "w"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "e",
 | 
			
		||||
              "é",
 | 
			
		||||
              "è",
 | 
			
		||||
              "ê",
 | 
			
		||||
              "ë",
 | 
			
		||||
              "ė"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "r"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "t"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "z"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "u",
 | 
			
		||||
              "ü",
 | 
			
		||||
              "û",
 | 
			
		||||
              "ù",
 | 
			
		||||
              "ú",
 | 
			
		||||
              "ū"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "i"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "o",
 | 
			
		||||
              "ö",
 | 
			
		||||
              "ô",
 | 
			
		||||
              "ò",
 | 
			
		||||
              "ó",
 | 
			
		||||
              "õ",
 | 
			
		||||
              "œ",
 | 
			
		||||
              "ø",
 | 
			
		||||
              "ō"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "p"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "delete",
 | 
			
		||||
            "iconName": "edit-clear-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "a",
 | 
			
		||||
              "ä",
 | 
			
		||||
              "â",
 | 
			
		||||
              "à",
 | 
			
		||||
              "á",
 | 
			
		||||
              "æ",
 | 
			
		||||
              "ã",
 | 
			
		||||
              "å",
 | 
			
		||||
              "ā"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "s",
 | 
			
		||||
              "ß",
 | 
			
		||||
              "ś",
 | 
			
		||||
              "š"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "d"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "f"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "g"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "h"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "j"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "k"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "l"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "iconName": "keyboard-enter-symbolic",
 | 
			
		||||
            "keyval": "0xff0d",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "iconName": "keyboard-shift-symbolic",
 | 
			
		||||
            "level": 1
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "y"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "x"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "c"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "v"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "b"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "n",
 | 
			
		||||
              "ñ",
 | 
			
		||||
              "ń"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "m"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ","
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ".",
 | 
			
		||||
              "#",
 | 
			
		||||
              "!",
 | 
			
		||||
              ",",
 | 
			
		||||
              "?",
 | 
			
		||||
              "-",
 | 
			
		||||
              ":",
 | 
			
		||||
              "'",
 | 
			
		||||
              "@"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "iconName": "keyboard-shift-symbolic",
 | 
			
		||||
            "level": 1,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "?123",
 | 
			
		||||
            "level": 2,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "emoji",
 | 
			
		||||
            "iconName": "face-smile-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              " "
 | 
			
		||||
            ],
 | 
			
		||||
            "width": 5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "languageMenu",
 | 
			
		||||
            "iconName": "keyboard-layout-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "hide",
 | 
			
		||||
            "iconName": "keyboard-hide-symbolic",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "level": "shift",
 | 
			
		||||
      "mode": "latched",
 | 
			
		||||
      "rows": [
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "Q"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "W"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "E",
 | 
			
		||||
              "É",
 | 
			
		||||
              "È",
 | 
			
		||||
              "Ê",
 | 
			
		||||
              "Ë",
 | 
			
		||||
              "Ė"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "R"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "T"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "Z"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "U",
 | 
			
		||||
              "Ü",
 | 
			
		||||
              "Û",
 | 
			
		||||
              "Ù",
 | 
			
		||||
              "Ú",
 | 
			
		||||
              "Ū"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "I"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "O",
 | 
			
		||||
              "Ö",
 | 
			
		||||
              "Ô",
 | 
			
		||||
              "Ò",
 | 
			
		||||
              "Ó",
 | 
			
		||||
              "Õ",
 | 
			
		||||
              "Œ",
 | 
			
		||||
              "Ø",
 | 
			
		||||
              "Ō"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "P"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "delete",
 | 
			
		||||
            "iconName": "edit-clear-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "A",
 | 
			
		||||
              "Ä",
 | 
			
		||||
              "Â",
 | 
			
		||||
              "À",
 | 
			
		||||
              "Á",
 | 
			
		||||
              "Æ",
 | 
			
		||||
              "Ã",
 | 
			
		||||
              "Å",
 | 
			
		||||
              "Ā"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "S",
 | 
			
		||||
              "SS",
 | 
			
		||||
              "Ś",
 | 
			
		||||
              "Š"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "D"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "F"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "G"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "H"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "J"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "K"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "L"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "iconName": "keyboard-enter-symbolic",
 | 
			
		||||
            "keyval": "0xff0d",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "iconName": "keyboard-shift-symbolic",
 | 
			
		||||
            "level": 0
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "Y"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "X"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "C"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "V"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "B"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "N",
 | 
			
		||||
              "Ñ",
 | 
			
		||||
              "Ń"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "M"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ","
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ".",
 | 
			
		||||
              "#",
 | 
			
		||||
              "!",
 | 
			
		||||
              ",",
 | 
			
		||||
              "?",
 | 
			
		||||
              "-",
 | 
			
		||||
              ":",
 | 
			
		||||
              "'",
 | 
			
		||||
              "@"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "iconName": "keyboard-shift-symbolic",
 | 
			
		||||
            "level": 0,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "?123",
 | 
			
		||||
            "level": 2,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "emoji",
 | 
			
		||||
            "iconName": "face-smile-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              " "
 | 
			
		||||
            ],
 | 
			
		||||
            "width": 5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "languageMenu",
 | 
			
		||||
            "iconName": "keyboard-layout-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "hide",
 | 
			
		||||
            "iconName": "keyboard-hide-symbolic",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "level": "opt",
 | 
			
		||||
      "mode": "locked",
 | 
			
		||||
      "rows": [
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "1",
 | 
			
		||||
              "¹",
 | 
			
		||||
              "½",
 | 
			
		||||
              "⅓",
 | 
			
		||||
              "¼",
 | 
			
		||||
              "⅛"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "2",
 | 
			
		||||
              "²",
 | 
			
		||||
              "⅔"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "3",
 | 
			
		||||
              "³",
 | 
			
		||||
              "¾",
 | 
			
		||||
              "⅜"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "4",
 | 
			
		||||
              "⁴"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "5",
 | 
			
		||||
              "⅝"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "6"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "7",
 | 
			
		||||
              "⅞"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "8"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "9"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "0",
 | 
			
		||||
              "ⁿ",
 | 
			
		||||
              "∅"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "delete",
 | 
			
		||||
            "iconName": "edit-clear-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "@"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "#"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "€",
 | 
			
		||||
              "¢",
 | 
			
		||||
              "£",
 | 
			
		||||
              "$",
 | 
			
		||||
              "¥",
 | 
			
		||||
              "₱"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "%",
 | 
			
		||||
              "‰"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "&"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "-",
 | 
			
		||||
              "_",
 | 
			
		||||
              "–",
 | 
			
		||||
              "—",
 | 
			
		||||
              "·"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "+",
 | 
			
		||||
              "±"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "(",
 | 
			
		||||
              "<",
 | 
			
		||||
              "{",
 | 
			
		||||
              "["
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ")",
 | 
			
		||||
              ">",
 | 
			
		||||
              "}",
 | 
			
		||||
              "]"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "iconName": "keyboard-enter-symbolic",
 | 
			
		||||
            "keyval": "0xff0d",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "=/<",
 | 
			
		||||
            "level": 3,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "*",
 | 
			
		||||
              "†",
 | 
			
		||||
              "‡",
 | 
			
		||||
              "★"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "\"",
 | 
			
		||||
              "“",
 | 
			
		||||
              "”",
 | 
			
		||||
              "«",
 | 
			
		||||
              "»"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "'",
 | 
			
		||||
              "‘",
 | 
			
		||||
              "’",
 | 
			
		||||
              "‹",
 | 
			
		||||
              "›"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ":"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ";"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "!",
 | 
			
		||||
              "¡"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "?",
 | 
			
		||||
              "¿"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "=/<",
 | 
			
		||||
            "level": 3,
 | 
			
		||||
            "width": 3
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "ABC",
 | 
			
		||||
            "level": 0,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "_"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "/"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              " "
 | 
			
		||||
            ],
 | 
			
		||||
            "width": 3
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ","
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ".",
 | 
			
		||||
              "…"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "emoji",
 | 
			
		||||
            "iconName": "face-smile-symbolic"
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "languageMenu",
 | 
			
		||||
            "iconName": "keyboard-layout-symbolic"
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "hide",
 | 
			
		||||
            "iconName": "keyboard-hide-symbolic"
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "level": "opt+shift",
 | 
			
		||||
      "mode": "locked",
 | 
			
		||||
      "rows": [
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "~"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "`"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "|"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "•",
 | 
			
		||||
              "♪",
 | 
			
		||||
              "♥",
 | 
			
		||||
              "♠",
 | 
			
		||||
              "♦",
 | 
			
		||||
              "♣"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "√"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "Π",
 | 
			
		||||
              "π"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "÷"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "×"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "¶",
 | 
			
		||||
              "§"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "∆"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "delete",
 | 
			
		||||
            "iconName": "edit-clear-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "£"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "¥"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "$",
 | 
			
		||||
              "¢"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "¢"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "^",
 | 
			
		||||
              "↑",
 | 
			
		||||
              "↓",
 | 
			
		||||
              "←",
 | 
			
		||||
              "→"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "°",
 | 
			
		||||
              "′",
 | 
			
		||||
              "″"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "=",
 | 
			
		||||
              "≠",
 | 
			
		||||
              "≈",
 | 
			
		||||
              "∞"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "{"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "}"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "iconName": "keyboard-enter-symbolic",
 | 
			
		||||
            "keyval": "0xff0d",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "?123",
 | 
			
		||||
            "level": 2,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "\\"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "©"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "®"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "™"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "℅"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "["
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "]"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "?123",
 | 
			
		||||
            "level": 2,
 | 
			
		||||
            "width": 3
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "ABC",
 | 
			
		||||
            "level": 0,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "<",
 | 
			
		||||
              "‹",
 | 
			
		||||
              "≤",
 | 
			
		||||
              "«"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ">",
 | 
			
		||||
              "›",
 | 
			
		||||
              "≥",
 | 
			
		||||
              "»"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              " "
 | 
			
		||||
            ],
 | 
			
		||||
            "width": 3
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ","
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ".",
 | 
			
		||||
              "…"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "emoji",
 | 
			
		||||
            "iconName": "face-smile-symbolic"
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "languageMenu",
 | 
			
		||||
            "iconName": "keyboard-layout-symbolic"
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "hide",
 | 
			
		||||
            "iconName": "keyboard-hide-symbolic"
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "locale": "fr-CH",
 | 
			
		||||
  "name": "Swiss French"
 | 
			
		||||
}
 | 
			
		||||
@@ -1,978 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "levels": [
 | 
			
		||||
    {
 | 
			
		||||
      "level": "",
 | 
			
		||||
      "mode": "default",
 | 
			
		||||
      "rows": [
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "q"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "w"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "e",
 | 
			
		||||
              "é",
 | 
			
		||||
              "è",
 | 
			
		||||
              "ê",
 | 
			
		||||
              "ë",
 | 
			
		||||
              "ė"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "r"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "t"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "z"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "u",
 | 
			
		||||
              "ü",
 | 
			
		||||
              "û",
 | 
			
		||||
              "ù",
 | 
			
		||||
              "ú",
 | 
			
		||||
              "ū"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "i"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "o",
 | 
			
		||||
              "ö",
 | 
			
		||||
              "ô",
 | 
			
		||||
              "ò",
 | 
			
		||||
              "ó",
 | 
			
		||||
              "õ",
 | 
			
		||||
              "œ",
 | 
			
		||||
              "ø",
 | 
			
		||||
              "ō"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "p"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "delete",
 | 
			
		||||
            "iconName": "edit-clear-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "a",
 | 
			
		||||
              "ä",
 | 
			
		||||
              "â",
 | 
			
		||||
              "à",
 | 
			
		||||
              "á",
 | 
			
		||||
              "æ",
 | 
			
		||||
              "ã",
 | 
			
		||||
              "å",
 | 
			
		||||
              "ā"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "s",
 | 
			
		||||
              "ß",
 | 
			
		||||
              "ś",
 | 
			
		||||
              "š"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "d"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "f"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "g"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "h"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "j"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "k"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "l"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "iconName": "keyboard-enter-symbolic",
 | 
			
		||||
            "keyval": "0xff0d",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "iconName": "keyboard-shift-symbolic",
 | 
			
		||||
            "level": 1
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "y"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "x"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "c"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "v"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "b"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "n",
 | 
			
		||||
              "ñ",
 | 
			
		||||
              "ń"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "m"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ","
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ".",
 | 
			
		||||
              "#",
 | 
			
		||||
              "!",
 | 
			
		||||
              ",",
 | 
			
		||||
              "?",
 | 
			
		||||
              "-",
 | 
			
		||||
              ":",
 | 
			
		||||
              "'",
 | 
			
		||||
              "@"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "iconName": "keyboard-shift-symbolic",
 | 
			
		||||
            "level": 1,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "?123",
 | 
			
		||||
            "level": 2,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "emoji",
 | 
			
		||||
            "iconName": "face-smile-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              " "
 | 
			
		||||
            ],
 | 
			
		||||
            "width": 5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "languageMenu",
 | 
			
		||||
            "iconName": "keyboard-layout-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "hide",
 | 
			
		||||
            "iconName": "keyboard-hide-symbolic",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "level": "shift",
 | 
			
		||||
      "mode": "latched",
 | 
			
		||||
      "rows": [
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "Q"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "W"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "E",
 | 
			
		||||
              "É",
 | 
			
		||||
              "È",
 | 
			
		||||
              "Ê",
 | 
			
		||||
              "Ë",
 | 
			
		||||
              "Ė"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "R"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "T"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "Z"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "U",
 | 
			
		||||
              "Ü",
 | 
			
		||||
              "Û",
 | 
			
		||||
              "Ù",
 | 
			
		||||
              "Ú",
 | 
			
		||||
              "Ū"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "I"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "O",
 | 
			
		||||
              "Ö",
 | 
			
		||||
              "Ô",
 | 
			
		||||
              "Ò",
 | 
			
		||||
              "Ó",
 | 
			
		||||
              "Õ",
 | 
			
		||||
              "Œ",
 | 
			
		||||
              "Ø",
 | 
			
		||||
              "Ō"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "P"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "delete",
 | 
			
		||||
            "iconName": "edit-clear-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "A",
 | 
			
		||||
              "Ä",
 | 
			
		||||
              "Â",
 | 
			
		||||
              "À",
 | 
			
		||||
              "Á",
 | 
			
		||||
              "Æ",
 | 
			
		||||
              "Ã",
 | 
			
		||||
              "Å",
 | 
			
		||||
              "Ā"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "S",
 | 
			
		||||
              "SS",
 | 
			
		||||
              "Ś",
 | 
			
		||||
              "Š"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "D"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "F"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "G"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "H"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "J"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "K"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "L"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "iconName": "keyboard-enter-symbolic",
 | 
			
		||||
            "keyval": "0xff0d",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "iconName": "keyboard-shift-symbolic",
 | 
			
		||||
            "level": 0
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "Y"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "X"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "C"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "V"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "B"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "N",
 | 
			
		||||
              "Ñ",
 | 
			
		||||
              "Ń"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "M"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ","
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ".",
 | 
			
		||||
              "#",
 | 
			
		||||
              "!",
 | 
			
		||||
              ",",
 | 
			
		||||
              "?",
 | 
			
		||||
              "-",
 | 
			
		||||
              ":",
 | 
			
		||||
              "'",
 | 
			
		||||
              "@"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "iconName": "keyboard-shift-symbolic",
 | 
			
		||||
            "level": 0,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "?123",
 | 
			
		||||
            "level": 2,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "emoji",
 | 
			
		||||
            "iconName": "face-smile-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              " "
 | 
			
		||||
            ],
 | 
			
		||||
            "width": 5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "languageMenu",
 | 
			
		||||
            "iconName": "keyboard-layout-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "hide",
 | 
			
		||||
            "iconName": "keyboard-hide-symbolic",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "level": "opt",
 | 
			
		||||
      "mode": "locked",
 | 
			
		||||
      "rows": [
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "1",
 | 
			
		||||
              "¹",
 | 
			
		||||
              "½",
 | 
			
		||||
              "⅓",
 | 
			
		||||
              "¼",
 | 
			
		||||
              "⅛"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "2",
 | 
			
		||||
              "²",
 | 
			
		||||
              "⅔"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "3",
 | 
			
		||||
              "³",
 | 
			
		||||
              "¾",
 | 
			
		||||
              "⅜"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "4",
 | 
			
		||||
              "⁴"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "5",
 | 
			
		||||
              "⅝"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "6"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "7",
 | 
			
		||||
              "⅞"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "8"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "9"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "0",
 | 
			
		||||
              "ⁿ",
 | 
			
		||||
              "∅"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "delete",
 | 
			
		||||
            "iconName": "edit-clear-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "@"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "#"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "€",
 | 
			
		||||
              "¢",
 | 
			
		||||
              "£",
 | 
			
		||||
              "$",
 | 
			
		||||
              "¥",
 | 
			
		||||
              "₱"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "%",
 | 
			
		||||
              "‰"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "&"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "-",
 | 
			
		||||
              "_",
 | 
			
		||||
              "–",
 | 
			
		||||
              "—",
 | 
			
		||||
              "·"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "+",
 | 
			
		||||
              "±"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "(",
 | 
			
		||||
              "<",
 | 
			
		||||
              "{",
 | 
			
		||||
              "["
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ")",
 | 
			
		||||
              ">",
 | 
			
		||||
              "}",
 | 
			
		||||
              "]"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "iconName": "keyboard-enter-symbolic",
 | 
			
		||||
            "keyval": "0xff0d",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "=/<",
 | 
			
		||||
            "level": 3,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "*",
 | 
			
		||||
              "†",
 | 
			
		||||
              "‡",
 | 
			
		||||
              "★"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "\"",
 | 
			
		||||
              "“",
 | 
			
		||||
              "”",
 | 
			
		||||
              "«",
 | 
			
		||||
              "»"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "'",
 | 
			
		||||
              "‘",
 | 
			
		||||
              "’",
 | 
			
		||||
              "‹",
 | 
			
		||||
              "›"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ":"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ";"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "!",
 | 
			
		||||
              "¡"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "?",
 | 
			
		||||
              "¿"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "=/<",
 | 
			
		||||
            "level": 3,
 | 
			
		||||
            "width": 3
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "ABC",
 | 
			
		||||
            "level": 0,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "_"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "/"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              " "
 | 
			
		||||
            ],
 | 
			
		||||
            "width": 3
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ","
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ".",
 | 
			
		||||
              "…"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "emoji",
 | 
			
		||||
            "iconName": "face-smile-symbolic"
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "languageMenu",
 | 
			
		||||
            "iconName": "keyboard-layout-symbolic"
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "hide",
 | 
			
		||||
            "iconName": "keyboard-hide-symbolic"
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "level": "opt+shift",
 | 
			
		||||
      "mode": "locked",
 | 
			
		||||
      "rows": [
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "~"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "`"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "|"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "•",
 | 
			
		||||
              "♪",
 | 
			
		||||
              "♥",
 | 
			
		||||
              "♠",
 | 
			
		||||
              "♦",
 | 
			
		||||
              "♣"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "√"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "Π",
 | 
			
		||||
              "π"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "÷"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "×"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "¶",
 | 
			
		||||
              "§"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "∆"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "delete",
 | 
			
		||||
            "iconName": "edit-clear-symbolic",
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "£"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "¥"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "$",
 | 
			
		||||
              "¢"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "¢"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "^",
 | 
			
		||||
              "↑",
 | 
			
		||||
              "↓",
 | 
			
		||||
              "←",
 | 
			
		||||
              "→"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "°",
 | 
			
		||||
              "′",
 | 
			
		||||
              "″"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "=",
 | 
			
		||||
              "≠",
 | 
			
		||||
              "≈",
 | 
			
		||||
              "∞"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "{"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "}"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "iconName": "keyboard-enter-symbolic",
 | 
			
		||||
            "keyval": "0xff0d",
 | 
			
		||||
            "width": 2
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "?123",
 | 
			
		||||
            "level": 2,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "\\"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "©"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "®"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "™"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "℅"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "["
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "]"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "?123",
 | 
			
		||||
            "level": 2,
 | 
			
		||||
            "width": 3
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        [
 | 
			
		||||
          {
 | 
			
		||||
            "action": "levelSwitch",
 | 
			
		||||
            "label": "ABC",
 | 
			
		||||
            "level": 0,
 | 
			
		||||
            "width": 1.5
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              "<",
 | 
			
		||||
              "‹",
 | 
			
		||||
              "≤",
 | 
			
		||||
              "«"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ">",
 | 
			
		||||
              "›",
 | 
			
		||||
              "≥",
 | 
			
		||||
              "»"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              " "
 | 
			
		||||
            ],
 | 
			
		||||
            "width": 3
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ","
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "strings": [
 | 
			
		||||
              ".",
 | 
			
		||||
              "…"
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "emoji",
 | 
			
		||||
            "iconName": "face-smile-symbolic"
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "languageMenu",
 | 
			
		||||
            "iconName": "keyboard-layout-symbolic"
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            "action": "hide",
 | 
			
		||||
            "iconName": "keyboard-hide-symbolic"
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "locale": "de-CH",
 | 
			
		||||
  "name": "Swiss German"
 | 
			
		||||
}
 | 
			
		||||