diff --git a/PepDeb32/pepbld.py b/PepDeb32/pepbld.py
index 97eb42a..4b062b0 100644
--- a/PepDeb32/pepbld.py
+++ b/PepDeb32/pepbld.py
@@ -86,10 +86,8 @@ shutil.copytree(os.path.join(uchinanchu, "PepProTools"), os.path.join(uchinanchu
shutil.copytree(os.path.join(uchinanchu, "peplightdm"), os.path.join(uchinanchu, "fusato", "config", "includes.installer", "preseed", "lightdm"), dirs_exist_ok=True)
# Copy recursive files and sub-directories
-shutil.copytree(os.path.join(uchinanchu, "peploadersplash", "debian", "boot"), os.path.join(uchinanchu, "fusato", "config", "includes.binary"), dirs_exist_ok=True)
-shutil.copytree(os.path.join(uchinanchu, "peploadersplash", "debian", "isolinux"), os.path.join(uchinanchu, "fusato", "config", "includes.binary"), dirs_exist_ok=True)
-shutil.copytree(os.path.join(uchinanchu, "pepinstaller", "graphics"), os.path.join(uchinanchu, "fusato", "config", "includes.installer", "usr", "share"), dirs_exist_ok=True)
-shutil.copytree(os.path.join(uchinanchu, "pepinstaller", "themes"), os.path.join(uchinanchu, "fusato", "config", "includes.installer", "usr", "share"), dirs_exist_ok=True)
+shutil.copytree(os.path.join(uchinanchu, "peploadersplash", "debian"), os.path.join(uchinanchu, "fusato", "config", "includes.binary"), dirs_exist_ok=True)
+shutil.copytree(os.path.join(uchinanchu, "pepinstaller"), os.path.join(uchinanchu, "fusato", "config", "includes.installer", "usr", "share"), dirs_exist_ok=True)
shutil.copytree(os.path.join(uchinanchu, "pepgrub", "debian"), os.path.join(uchinanchu, "fusato", "config", "includes.installer", "preseed", "grub"), dirs_exist_ok=True)
shutil.copytree(os.path.join(uchinanchu, "pylibraries"), os.path.join(uchinanchu, "fusato", "config", "includes.installer", "preseed", "py"), dirs_exist_ok=True)
shutil.copytree(os.path.join(uchinanchu, "pmostools"), os.path.join(uchinanchu, "fusato", "config", "includes.installer", "preseed", "tools"), dirs_exist_ok=True)
diff --git a/PepDeb64/fusato/.build/config b/PepDeb64/fusato/.build/config
new file mode 100644
index 0000000..e69de29
diff --git a/PepDeb64/fusato/config/binary b/PepDeb64/fusato/config/binary
new file mode 100644
index 0000000..540fdac
--- /dev/null
+++ b/PepDeb64/fusato/config/binary
@@ -0,0 +1,119 @@
+# config/binary - options for live-build(7), binary stage
+
+# Set image type
+LB_IMAGE_TYPE="iso-hybrid"
+
+# Set image filesystem
+LB_BINARY_FILESYSTEM="fat32"
+
+# Set apt/aptitude generic indices
+LB_APT_INDICES="true"
+
+# Set boot parameters
+LB_BOOTAPPEND_LIVE="boot=live components quiet splash"
+
+# Set boot parameters
+LB_BOOTAPPEND_INSTALL="file=/cdrom/install/preseed.cfg"
+
+# Set boot parameters
+LB_BOOTAPPEND_LIVE_FAILSAFE="boot=live components memtest noapic noapm nodma nomce nolapic nosmp nosplash vga=788"
+
+# Set BIOS bootloader
+LB_BOOTLOADER_BIOS="syslinux"
+
+# Set EFI bootloader
+LB_BOOTLOADER_EFI="grub-efi"
+
+# Set bootloaders
+LB_BOOTLOADERS=""
+
+# Set checksums
+LB_CHECKSUMS="sha512 md5"
+
+# Set compression
+LB_COMPRESSION="none"
+
+# Support dm-verity on rootfs
+LB_DM_VERITY=""
+
+# Support FEC on dm-verity rootfs
+LB_DM_VERITY_FEC_ROOTS=""
+
+# Set sign script for roothash for dm-verity rootfs
+LB_DM_VERITY_SIGN=""
+
+# Set zsync
+LB_ZSYNC="false"
+
+# Control if we build binary images chrooted
+# NEVER, *EVER*, *E*V*E*R* SET THIS OPTION to false.
+LB_BUILD_WITH_CHROOT="true"
+
+# Set debian-installer
+LB_DEBIAN_INSTALLER="netinst"
+
+# Set debian-installer suite
+LB_DEBIAN_INSTALLER_DISTRIBUTION="bookworm"
+
+# Set debian-installer preseed filename/url
+LB_DEBIAN_INSTALLER_PRESEEDFILE="preseed.cfg"
+
+# Toggle use of GUI debian-installer
+LB_DEBIAN_INSTALLER_GUI="true"
+
+# Set hdd label
+LB_HDD_LABEL="DEBIAN_LIVE"
+
+# Set hdd filesystem size
+LB_HDD_SIZE="auto"
+
+# Set start of partition for the hdd target for BIOSes that expect a specific boot partition start (e.g. "63s"). If empty, use optimal layout.
+LB_HDD_PARTITION_START=""
+
+# Set iso author
+LB_ISO_APPLICATION="Debian Live"
+
+# Set iso preparer
+LB_ISO_PREPARER="PeppermintOS-https://peppermintos.com/"
+
+# Set iso publisher
+LB_ISO_PUBLISHER="Peppermint OS Team"
+
+# Set iso volume (max 32 chars)
+LB_ISO_VOLUME="PeppermintOS"
+
+# Set jffs2 eraseblock size
+LB_JFFS2_ERASEBLOCK=""
+
+# Set memtest
+LB_MEMTEST="none"
+
+# Set loadlin
+LB_LOADLIN="true"
+
+# Set win32-loader
+LB_WIN32_LOADER="false"
+
+# Set net tarball
+LB_NET_TARBALL="true"
+
+# Set onie
+LB_ONIE="false"
+
+# Set onie additional kernel cmdline options
+LB_ONIE_KERNEL_CMDLINE=""
+
+# Set inclusion of firmware packages in debian-installer
+LB_FIRMWARE_BINARY="true"
+
+# Set inclusion of firmware packages in the live image
+LB_FIRMWARE_CHROOT="false"
+
+# Set swap file path
+LB_SWAP_FILE_PATH=""
+
+# Set swap file size
+LB_SWAP_FILE_SIZE="512"
+
+# Enable/disable UEFI secure boot support
+LB_UEFI_SECURE_BOOT="auto"
diff --git a/PepDeb64/fusato/config/bootstrap b/PepDeb64/fusato/config/bootstrap
new file mode 100644
index 0000000..584b510
--- /dev/null
+++ b/PepDeb64/fusato/config/bootstrap
@@ -0,0 +1,76 @@
+# config/bootstrap - options for live-build(7), bootstrap stage
+
+# Select architecture to use
+LB_ARCHITECTURE="amd64"
+
+# Select distribution to use
+LB_DISTRIBUTION="bookworm"
+
+# Select parent distribution to use
+LB_PARENT_DISTRIBUTION=""
+
+# Select distribution to use in the chroot
+LB_DISTRIBUTION_CHROOT="bookworm"
+
+# Select parent distribution to use in the chroot
+LB_PARENT_DISTRIBUTION_CHROOT="bookworm"
+
+# Select distribution to use in the final image
+LB_DISTRIBUTION_BINARY="bookworm"
+
+# Select parent distribution to use in the final image
+LB_PARENT_DISTRIBUTION_BINARY="bookworm"
+
+# Select parent distribution for debian-installer to use
+LB_PARENT_DEBIAN_INSTALLER_DISTRIBUTION="bookworm"
+
+# Select archive areas to use
+LB_ARCHIVE_AREAS="main contrib non-free non-free-firmware"
+
+# Select parent archive areas to use
+LB_PARENT_ARCHIVE_AREAS="main contrib non-free non-free-firmware"
+
+# Set parent mirror to bootstrap from
+LB_PARENT_MIRROR_BOOTSTRAP="http://deb.debian.org/debian/"
+
+# Set parent mirror to fetch packages from
+LB_PARENT_MIRROR_CHROOT="http://deb.debian.org/debian/"
+
+# Set security parent mirror to fetch packages from
+LB_PARENT_MIRROR_CHROOT_SECURITY="http://security.debian.org/"
+
+# Set parent mirror which ends up in the image
+LB_PARENT_MIRROR_BINARY="http://deb.debian.org/debian/"
+
+# Set security parent mirror which ends up in the image
+LB_PARENT_MIRROR_BINARY_SECURITY="http://security.debian.org/"
+
+# Set debian-installer parent mirror
+LB_PARENT_MIRROR_DEBIAN_INSTALLER="http://repo.peppermintos.com/packages"
+
+# Set mirror to bootstrap from
+LB_MIRROR_BOOTSTRAP="http://deb.debian.org/debian/"
+
+# Set mirror to fetch packages from
+LB_MIRROR_CHROOT="http://deb.debian.org/debian/"
+
+# Set security mirror to fetch packages from
+LB_MIRROR_CHROOT_SECURITY="http://security.debian.org/"
+
+# Set mirror which ends up in the image
+LB_MIRROR_BINARY="http://deb.debian.org/debian/"
+
+# Set security mirror which ends up in the image
+LB_MIRROR_BINARY_SECURITY="http://security.debian.org/"
+
+# Set debian-installer mirror
+LB_MIRROR_DEBIAN_INSTALLER="http://deb.debian.org/debian/"
+
+# Set architectures to use foreign bootstrap
+LB_BOOTSTRAP_QEMU_ARCHITECTURE=""
+
+# Set packages to exclude during foreign bootstrap
+LB_BOOTSTRAP_QEMU_EXCLUDE=""
+
+# Set static qemu binary for foreign bootstrap
+LB_BOOTSTRAP_QEMU_STATIC=""
diff --git a/PepDeb64/fusato/config/chroot b/PepDeb64/fusato/config/chroot
new file mode 100644
index 0000000..dafa75d
--- /dev/null
+++ b/PepDeb64/fusato/config/chroot
@@ -0,0 +1,34 @@
+# config/chroot - options for live-build(7), chroot stage
+
+# Set chroot filesystem
+LB_CHROOT_FILESYSTEM="squashfs"
+
+# Set chroot squashfs compression level
+LB_CHROOT_SQUASHFS_COMPRESSION_LEVEL=""
+
+# Set chroot squashfs compression type
+LB_CHROOT_SQUASHFS_COMPRESSION_TYPE=""
+
+# Set union filesystem
+LB_UNION_FILESYSTEM="overlay"
+
+# Set interactive build
+LB_INTERACTIVE="false"
+
+# Set keyring packages
+LB_KEYRING_PACKAGES="debian-archive-keyring"
+
+# Set kernel flavour to use (with arch)
+LB_LINUX_FLAVOURS_WITH_ARCH="amd64"
+
+# Set kernel packages to use
+LB_LINUX_PACKAGES="linux-image"
+
+# Enable security updates
+LB_SECURITY="true"
+
+# Enable updates updates
+LB_UPDATES="true"
+
+# Enable backports updates
+LB_BACKPORTS="false"
diff --git a/PepDeb64/fusato/config/common b/PepDeb64/fusato/config/common
new file mode 100644
index 0000000..60b02a7
--- /dev/null
+++ b/PepDeb64/fusato/config/common
@@ -0,0 +1,102 @@
+# config/common - common options for live-build(7)
+
+# Version of live-build used to build config (config format version)
+LB_CONFIGURATION_VERSION="20230131acoros1"
+
+# Set package manager
+LB_APT="apt"
+
+# Set proxy for HTTP connections
+LB_APT_HTTP_PROXY=""
+
+# Set apt/aptitude pipeline depth
+LB_APT_PIPELINE=""
+
+# Set apt/aptitude recommends
+LB_APT_RECOMMENDS="true"
+
+# Set apt/aptitude security
+LB_APT_SECURE="true"
+
+# Set apt/aptitude source entries in sources.list
+LB_APT_SOURCE_ARCHIVES="true"
+
+# Control cache
+LB_CACHE="true"
+
+# Control if downloaded package indices should be cached
+LB_CACHE_INDICES="false"
+
+# Control if downloaded packages files should be cached
+LB_CACHE_PACKAGES="true"
+
+# Control if completed stages should be cached
+LB_CACHE_STAGES="bootstrap"
+
+# Set debconf(1) frontend to use
+LB_DEBCONF_FRONTEND="noninteractive"
+
+# Set debconf(1) priority to use
+LB_DEBCONF_PRIORITY="critical"
+
+# Set initramfs hook
+LB_INITRAMFS="live-boot"
+
+# Set initramfs compression
+LB_INITRAMFS_COMPRESSION="gzip"
+
+# Set init system
+LB_INITSYSTEM="systemd"
+
+# Set distribution mode
+LB_MODE="debian"
+
+# Set system type
+LB_SYSTEM="live"
+
+# Set base name of the image
+LB_IMAGE_NAME="PepOS-mini-iso"
+
+# Set options to use with apt
+APT_OPTIONS="--yes -o Acquire::Retries=5"
+
+# Set options to use with aptitude
+APTITUDE_OPTIONS="--assume-yes -o Acquire::Retries=5"
+
+# Set options to use with debootstrap
+DEBOOTSTRAP_OPTIONS=""
+
+# Set script to use with debootstrap
+DEBOOTSTRAP_SCRIPT=""
+
+# Set options to use with gzip
+GZIP_OPTIONS="-6 --rsyncable"
+
+# Enable UTC timestamps
+LB_UTC_TIME="false"
+
+# live-build options
+
+# Enable breakpoints
+# If set here, overrides the command line option
+#_BREAKPOINTS="false"
+
+# Enable debug
+# If set here, overrides the command line option
+#_DEBUG="false"
+
+# Enable color
+# If set here, overrides the command line option
+#_COLOR="auto"
+
+# Enable force
+# If set here, overrides the command line option
+#_FORCE="false"
+
+# Enable quiet
+# If set here, overrides the command line option
+#_QUIET="false"
+
+# Enable verbose
+# If set here, overrides the command line option
+#_VERBOSE="false"
diff --git a/PepDeb64/fusato/config/hooks/live/0010-disable-kexec-tools.hook.chroot b/PepDeb64/fusato/config/hooks/live/0010-disable-kexec-tools.hook.chroot
new file mode 120000
index 0000000..996f766
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/live/0010-disable-kexec-tools.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/live/0010-disable-kexec-tools.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/live/0050-disable-sysvinit-tmpfs.hook.chroot b/PepDeb64/fusato/config/hooks/live/0050-disable-sysvinit-tmpfs.hook.chroot
new file mode 120000
index 0000000..5ddf090
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/live/0050-disable-sysvinit-tmpfs.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/live/0050-disable-sysvinit-tmpfs.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0020-create-mtab-symlink.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0020-create-mtab-symlink.hook.chroot
new file mode 120000
index 0000000..58123fc
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0020-create-mtab-symlink.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0020-create-mtab-symlink.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0030-enable-cryptsetup.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0030-enable-cryptsetup.hook.chroot
new file mode 120000
index 0000000..c5ab625
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0030-enable-cryptsetup.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0030-enable-cryptsetup.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0040-create-locales-files.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0040-create-locales-files.hook.chroot
new file mode 120000
index 0000000..036e7e0
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0040-create-locales-files.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0040-create-locales-files.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0100-remove-adjtime-configuration.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0100-remove-adjtime-configuration.hook.chroot
new file mode 120000
index 0000000..b0ccdb6
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0100-remove-adjtime-configuration.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0100-remove-adjtime-configuration.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0110-remove-backup-files.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0110-remove-backup-files.hook.chroot
new file mode 120000
index 0000000..8b68c5c
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0110-remove-backup-files.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0110-remove-backup-files.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0120-remove-dbus-machine-id.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0120-remove-dbus-machine-id.hook.chroot
new file mode 120000
index 0000000..4d55b27
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0120-remove-dbus-machine-id.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0120-remove-dbus-machine-id.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0130-remove-gnome-icon-cache.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0130-remove-gnome-icon-cache.hook.chroot
new file mode 120000
index 0000000..54f6a9b
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0130-remove-gnome-icon-cache.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0130-remove-gnome-icon-cache.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0140-remove-log-files.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0140-remove-log-files.hook.chroot
new file mode 120000
index 0000000..2b99cec
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0140-remove-log-files.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0140-remove-log-files.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0150-remove-mdadm-configuration.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0150-remove-mdadm-configuration.hook.chroot
new file mode 120000
index 0000000..0c3cd2f
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0150-remove-mdadm-configuration.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0150-remove-mdadm-configuration.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0160-remove-openssh-server-host-keys.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0160-remove-openssh-server-host-keys.hook.chroot
new file mode 120000
index 0000000..e57b8d2
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0160-remove-openssh-server-host-keys.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0160-remove-openssh-server-host-keys.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0170-remove-python-py.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0170-remove-python-py.hook.chroot
new file mode 120000
index 0000000..858a942
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0170-remove-python-py.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0170-remove-python-py.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0180-remove-systemd-machine-id.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0180-remove-systemd-machine-id.hook.chroot
new file mode 120000
index 0000000..6cecf66
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0180-remove-systemd-machine-id.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0180-remove-systemd-machine-id.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0190-remove-temporary-files.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0190-remove-temporary-files.hook.chroot
new file mode 120000
index 0000000..ada76d9
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0190-remove-temporary-files.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0190-remove-temporary-files.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0195-remove-ssl-cert-snakeoil.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0195-remove-ssl-cert-snakeoil.hook.chroot
new file mode 120000
index 0000000..9fc0723
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0195-remove-ssl-cert-snakeoil.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0195-remove-ssl-cert-snakeoil.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0200-remove-udev-persistent-cd-rules.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0200-remove-udev-persistent-cd-rules.hook.chroot
new file mode 120000
index 0000000..f893dcc
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0200-remove-udev-persistent-cd-rules.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0200-remove-udev-persistent-cd-rules.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0300-remove-udev-persistent-net-rules.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0300-remove-udev-persistent-net-rules.hook.chroot
new file mode 120000
index 0000000..a6ee33d
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0300-remove-udev-persistent-net-rules.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0300-remove-udev-persistent-net-rules.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0400-update-apt-file-cache.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0400-update-apt-file-cache.hook.chroot
new file mode 120000
index 0000000..380fdcf
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0400-update-apt-file-cache.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0400-update-apt-file-cache.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0410-update-apt-xapian-index.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0410-update-apt-xapian-index.hook.chroot
new file mode 120000
index 0000000..dd7150e
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0410-update-apt-xapian-index.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0410-update-apt-xapian-index.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0420-update-glx-alternative.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0420-update-glx-alternative.hook.chroot
new file mode 120000
index 0000000..4da25f8
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0420-update-glx-alternative.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0420-update-glx-alternative.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0430-update-mlocate-database.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0430-update-mlocate-database.hook.chroot
new file mode 120000
index 0000000..13b49d7
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0430-update-mlocate-database.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0430-update-mlocate-database.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0440-update-nvidia-alternative.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0440-update-nvidia-alternative.hook.chroot
new file mode 120000
index 0000000..0a65196
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0440-update-nvidia-alternative.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0440-update-nvidia-alternative.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0500-reproducible-glibc.hook.chroot b/PepDeb64/fusato/config/hooks/normal/0500-reproducible-glibc.hook.chroot
new file mode 120000
index 0000000..9d4f095
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0500-reproducible-glibc.hook.chroot
@@ -0,0 +1 @@
+/usr/share/live/build/hooks/normal/0500-reproducible-glibc.hook.chroot
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/hooks/normal/0950-final-cleanup-hook.binary b/PepDeb64/fusato/config/hooks/normal/0950-final-cleanup-hook.binary
new file mode 100755
index 0000000..324b352
--- /dev/null
+++ b/PepDeb64/fusato/config/hooks/normal/0950-final-cleanup-hook.binary
@@ -0,0 +1,9 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# SPDX-FileCopyrightText: 2023 PeppemrintOS Team (peppermintosteam@proton.me)
+
+## This script will remove unnecessary files and folders and reduce the size of the iso.
+# Remove live folder from binary.
+
+rm -r live
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/font.pf2 b/PepDeb64/fusato/config/includes.binary/boot/grub/font.pf2
new file mode 100644
index 0000000..59e8ffa
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/font.pf2 differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/grub.cfg b/PepDeb64/fusato/config/includes.binary/boot/grub/grub.cfg
new file mode 100644
index 0000000..42938df
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/boot/grub/grub.cfg
@@ -0,0 +1,96 @@
+if loadfont $prefix/font.pf2 ; then
+ set gfxmode=800x600
+ set gfxpayload=keep
+ insmod efi_gop
+ insmod efi_uga
+ insmod video_bochs
+ insmod video_cirrus
+ insmod gfxterm
+ insmod png
+ terminal_output gfxterm
+fi
+
+if background_image /isolinux/splash.png; then
+ set color_normal=light-gray/black
+ set color_highlight=white/black
+elif background_image /splash.png; then
+ set color_normal=light-gray/black
+ set color_highlight=white/black
+else
+ set menu_color_normal=cyan/blue
+ set menu_color_highlight=white/blue
+fi
+
+source /boot/grub/config.cfg
+
+insmod play
+play 960 440 1 0 4 440 1
+set theme=/boot/grub/live-theme/theme.txt
+menuentry --hotkey=g 'Graphical install' {
+ set background_color=black
+ linux /install/vmlinuz vga=788 --- quiet
+ initrd /install/gtk/initrd.gz
+}
+menuentry --hotkey=i 'Install' {
+ set background_color=black
+ linux /install/vmlinuz vga=788 --- quiet
+ initrd /install/initrd.gz
+}
+submenu --hotkey=a 'Advanced options ...' {
+ set menu_color_normal=cyan/blue
+ set menu_color_highlight=white/blue
+ set theme=/boot/grub/live-theme/theme.txt
+ set gfxpayload=keep
+ menuentry '... Graphical expert install' {
+ set background_color=black
+ linux /install/vmlinuz priority=low vga=788 ---
+ initrd /install/gtk/initrd.gz
+ }
+ menuentry '... Graphical rescue mode' {
+ set background_color=black
+ linux /install/vmlinuz vga=788 rescue/enable=true --- quiet
+ initrd /install/gtk/initrd.gz
+ }
+ menuentry '... Graphical automated install' {
+ set background_color=black
+ linux /install/vmlinuz auto=true priority=critical vga=788 --- quiet
+ initrd /install/gtk/initrd.gz
+ }
+ menuentry --hotkey=x '... Expert install' {
+ set background_color=black
+ linux /install/vmlinuz priority=low vga=788 ---
+ initrd /install/initrd.gz
+ }
+ menuentry --hotkey=r '... Rescue mode' {
+ set background_color=black
+ linux /install/vmlinuz vga=788 rescue/enable=true --- quiet
+ initrd /install/initrd.gz
+ }
+ menuentry --hotkey=a '... Automated install' {
+ set background_color=black
+ linux /install/vmlinuz auto=true priority=critical vga=788 --- quiet
+ initrd /install/initrd.gz
+ }
+ submenu --hotkey=s '... Speech-enabled advanced options ...' {
+ set menu_color_normal=cyan/blue
+ set menu_color_highlight=white/blue
+ set theme=/boot/grub/live-theme/theme.txt
+ set gfxpayload=keep
+ menuentry --hotkey=x '... Expert speech install' {
+ set background_color=black
+ linux /install/vmlinuz priority=low vga=788 speakup.synth=soft ---
+ initrd /install/gtk/initrd.gz
+ }
+ menuentry --hotkey=r '... Rescue speech mode' {
+ set background_color=black
+ linux /install/vmlinuz vga=788 rescue/enable=true speakup.synth=soft --- quiet
+ initrd /install/gtk/initrd.gz
+ }
+ menuentry --hotkey=a '... Automated speech install' {
+ set background_color=black
+ linux /install/vmlinuz auto=true priority=critical vga=788 speakup.synth=soft --- quiet
+ initrd /install/gtk/initrd.gz
+ }
+ }
+}
+
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/background.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/background.png
new file mode 100644
index 0000000..bf8fd87
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/background.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/4MLinux.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/4MLinux.png
new file mode 100644
index 0000000..1c6fe5e
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/4MLinux.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/AlpineLinux.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/AlpineLinux.png
new file mode 100644
index 0000000..6212a1f
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/AlpineLinux.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/Manjaro.i686.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/Manjaro.i686.png
new file mode 100644
index 0000000..611a6fb
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/Manjaro.i686.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/Manjaro.x86_64.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/Manjaro.x86_64.png
new file mode 100644
index 0000000..611a6fb
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/Manjaro.x86_64.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/SystemRescueCD.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/SystemRescueCD.png
new file mode 100644
index 0000000..7c41182
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/SystemRescueCD.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/android.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/android.png
new file mode 100644
index 0000000..dad066f
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/android.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/anonymous.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/anonymous.png
new file mode 100644
index 0000000..7d165b6
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/anonymous.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/antergos.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/antergos.png
new file mode 100644
index 0000000..32e3a3a
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/antergos.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/arch.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/arch.png
new file mode 100644
index 0000000..f6cd870
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/arch.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/archlinux.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/archlinux.png
new file mode 100644
index 0000000..f6cd870
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/archlinux.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/arcolinux.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/arcolinux.png
new file mode 100644
index 0000000..c5e5e5e
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/arcolinux.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/artix.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/artix.png
new file mode 100644
index 0000000..0cbeb11
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/artix.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/bedrock.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/bedrock.png
new file mode 100644
index 0000000..58ff48a
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/bedrock.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/cancel.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/cancel.png
new file mode 100644
index 0000000..fca2ac9
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/cancel.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/centos.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/centos.png
new file mode 100644
index 0000000..23fe2fa
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/centos.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/chakra.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/chakra.png
new file mode 100644
index 0000000..6f63a95
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/chakra.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/debian.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/debian.png
new file mode 100644
index 0000000..20bea8c
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/debian.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/deepin.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/deepin.png
new file mode 100644
index 0000000..61c92fb
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/deepin.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/devuan.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/devuan.png
new file mode 100644
index 0000000..ff65401
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/devuan.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/driver.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/driver.png
new file mode 100644
index 0000000..1621ee7
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/driver.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/edit.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/edit.png
new file mode 100644
index 0000000..6a43bd9
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/edit.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/efi.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/efi.png
new file mode 100644
index 0000000..4ecf3b9
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/efi.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/elementary.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/elementary.png
new file mode 100644
index 0000000..2840354
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/elementary.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/endeavouros.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/endeavouros.png
new file mode 100644
index 0000000..6b1e530
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/endeavouros.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/fedora.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/fedora.png
new file mode 100644
index 0000000..926b56d
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/fedora.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/find.efi.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/find.efi.png
new file mode 100644
index 0000000..0e32321
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/find.efi.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/find.none.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/find.none.png
new file mode 100644
index 0000000..87d4d0e
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/find.none.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/freebsd.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/freebsd.png
new file mode 100644
index 0000000..fb9408c
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/freebsd.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/garuda.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/garuda.png
new file mode 100644
index 0000000..f699718
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/garuda.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/gentoo.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/gentoo.png
new file mode 100644
index 0000000..bc0ed70
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/gentoo.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/gnu-linux.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/gnu-linux.png
new file mode 100644
index 0000000..db2fcfd
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/gnu-linux.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/haiku.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/haiku.png
new file mode 100644
index 0000000..ce7f818
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/haiku.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/help.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/help.png
new file mode 100644
index 0000000..d8b5a17
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/help.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/kali.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/kali.png
new file mode 100644
index 0000000..900dc82
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/kali.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/kaos.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/kaos.png
new file mode 100644
index 0000000..9fd4e89
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/kaos.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/kbd.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/kbd.png
new file mode 100644
index 0000000..6ace3ac
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/kbd.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/korora.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/korora.png
new file mode 100644
index 0000000..456e876
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/korora.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/kubuntu.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/kubuntu.png
new file mode 100644
index 0000000..7a79ff3
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/kubuntu.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/lang.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/lang.png
new file mode 100644
index 0000000..3c9c1d7
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/lang.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/lfs.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/lfs.png
new file mode 100644
index 0000000..2c54036
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/lfs.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/linux.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/linux.png
new file mode 100644
index 0000000..348ebdd
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/linux.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/linuxmint.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/linuxmint.png
new file mode 100644
index 0000000..7d9da81
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/linuxmint.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/lubuntu.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/lubuntu.png
new file mode 100644
index 0000000..057c8e2
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/lubuntu.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/macosx.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/macosx.png
new file mode 100644
index 0000000..ea03e77
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/macosx.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/mageia.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/mageia.png
new file mode 100644
index 0000000..79afa76
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/mageia.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/manjaro.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/manjaro.png
new file mode 100644
index 0000000..611a6fb
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/manjaro.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/mate.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/mate.png
new file mode 100644
index 0000000..b2fc22a
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/mate.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/memtest.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/memtest.png
new file mode 100644
index 0000000..1621ee7
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/memtest.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/mx-linux.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/mx-linux.png
new file mode 100644
index 0000000..49f1133
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/mx-linux.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/neon.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/neon.png
new file mode 100644
index 0000000..e41906e
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/neon.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/opensuse.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/opensuse.png
new file mode 100644
index 0000000..d844fd5
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/opensuse.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/parrot.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/parrot.png
new file mode 100644
index 0000000..3333de9
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/parrot.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/pop-os.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/pop-os.png
new file mode 100644
index 0000000..014d9f3
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/pop-os.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/pop.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/pop.png
new file mode 100644
index 0000000..014d9f3
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/pop.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/recovery.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/recovery.png
new file mode 100644
index 0000000..7b69b14
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/recovery.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/regolith.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/regolith.png
new file mode 100644
index 0000000..5ece07b
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/regolith.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/restart.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/restart.png
new file mode 100644
index 0000000..9715302
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/restart.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/rocky.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/rocky.png
new file mode 100644
index 0000000..be144f6
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/rocky.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/shutdown.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/shutdown.png
new file mode 100644
index 0000000..fc9cf16
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/shutdown.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/siduction.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/siduction.png
new file mode 100644
index 0000000..d16549b
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/siduction.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/slackware.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/slackware.png
new file mode 100644
index 0000000..4c31a3f
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/slackware.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/solus.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/solus.png
new file mode 100644
index 0000000..338718b
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/solus.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/steamos.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/steamos.png
new file mode 100644
index 0000000..df28bcc
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/steamos.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/type.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/type.png
new file mode 100644
index 0000000..5c48476
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/type.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/tz.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/tz.png
new file mode 100644
index 0000000..220b29b
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/tz.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/ubuntu.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/ubuntu.png
new file mode 100644
index 0000000..352fbe0
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/ubuntu.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/unknown.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/unknown.png
new file mode 100644
index 0000000..4733dc8
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/unknown.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/unset.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/unset.png
new file mode 100644
index 0000000..15e3d3c
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/unset.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/ventoy.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/ventoy.png
new file mode 100644
index 0000000..7abdc6c
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/ventoy.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/void.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/void.png
new file mode 100644
index 0000000..01cc2f3
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/void.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/windows.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/windows.png
new file mode 100644
index 0000000..d5c7cc3
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/windows.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/windows11.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/windows11.png
new file mode 100644
index 0000000..fe97d9f
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/windows11.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/xero.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/xero.png
new file mode 100644
index 0000000..2221c73
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/xero.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/xerolinux.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/xerolinux.png
new file mode 100644
index 0000000..2221c73
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/xerolinux.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/xubuntu.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/xubuntu.png
new file mode 100644
index 0000000..f43abc7
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/xubuntu.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/zorin.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/zorin.png
new file mode 100644
index 0000000..c1506c4
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/icons/zorin.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/select_c.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/select_c.png
new file mode 100644
index 0000000..b1f8d58
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/select_c.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/select_e.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/select_e.png
new file mode 100644
index 0000000..9332368
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/select_e.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/select_w.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/select_w.png
new file mode 100644
index 0000000..28f6424
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/select_w.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_c.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_c.png
new file mode 100644
index 0000000..d0dd52a
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_c.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_e.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_e.png
new file mode 100644
index 0000000..394cbe4
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_e.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_n.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_n.png
new file mode 100644
index 0000000..476f8bc
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_n.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_ne.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_ne.png
new file mode 100644
index 0000000..9e26959
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_ne.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_nw.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_nw.png
new file mode 100644
index 0000000..5c3cba8
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_nw.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_s.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_s.png
new file mode 100644
index 0000000..85a8901
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_s.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_se.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_se.png
new file mode 100644
index 0000000..d8627ee
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_se.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_sw.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_sw.png
new file mode 100644
index 0000000..67c600c
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_sw.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_w.png b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_w.png
new file mode 100644
index 0000000..d066e2d
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminal_box_w.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminus-12.pf2 b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminus-12.pf2
new file mode 100644
index 0000000..6092035
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminus-12.pf2 differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminus-14.pf2 b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminus-14.pf2
new file mode 100644
index 0000000..8ab8bd1
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminus-14.pf2 differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminus-16.pf2 b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminus-16.pf2
new file mode 100644
index 0000000..6e6b25d
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminus-16.pf2 differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminus-18.pf2 b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminus-18.pf2
new file mode 100644
index 0000000..129cef1
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/terminus-18.pf2 differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/theme.txt b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/theme.txt
new file mode 100644
index 0000000..c666b67
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/theme.txt
@@ -0,0 +1,42 @@
+# Main options
+title-text: ""
+desktop-image: "background.png"
+desktop-color: "#000000"
+terminal-font: "Terminus Regular 14"
+terminal-box: "terminal_box_*.png"
+terminal-left: "0"
+terminal-top: "0"
+terminal-width: "100%"
+terminal-height: "100%"
+terminal-border: "0"
+
+# Boot menu
++ boot_menu {
+ left = 15%
+ top = 40%
+ width = 85%
+ height = 65%
+ item_font = "Ubuntu Regular 20"
+ item_color = "#cccccc"
+ selected_item_color = "#ffffff"
+ icon_width = 36
+ icon_height = 36
+ item_icon_space = 20
+ item_height = 40
+ item_padding = 2
+ item_spacing = 10
+ selected_item_pixmap_style = "select_*.png"
+}
+
+
+# Countdown label
+# You can change the name of default starting OS here
++ label {
+ left = 15%
+ top = 31%
+ align = "center"
+ id = "__timeout__"
+ text = "Peppermint will start in %d seconds"
+ color = "#cccccc"
+ font = "Ubuntu Regular 17"
+}
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/ubuntu_regular_17.pf2 b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/ubuntu_regular_17.pf2
new file mode 100644
index 0000000..9405954
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/ubuntu_regular_17.pf2 differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/ubuntu_regular_20.pf2 b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/ubuntu_regular_20.pf2
new file mode 100644
index 0000000..3d903ba
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/live-theme/ubuntu_regular_20.pf2 differ
diff --git a/PepDeb64/fusato/config/includes.binary/boot/grub/splash.png b/PepDeb64/fusato/config/includes.binary/boot/grub/splash.png
new file mode 100644
index 0000000..bf8fd87
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/boot/grub/splash.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/addrk.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/addrk.cfg
new file mode 100644
index 0000000..e9074de
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/addrk.cfg
@@ -0,0 +1,9 @@
+label expertdark
+ menu label E^xpert install
+ kernel /install/vmlinuz
+ append priority=low vga=788 initrd=/install/initrd.gz theme=dark ---
+include rqdrk.cfg
+label autodark
+ menu label ^Automated install
+ kernel /install/vmlinuz
+ append auto=true priority=critical vga=788 initrd=/install/initrd.gz theme=dark --- quiet
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/addrkgtk.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/addrkgtk.cfg
new file mode 100644
index 0000000..83db79e
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/addrkgtk.cfg
@@ -0,0 +1,12 @@
+menu hshift 9
+menu width 58
+
+label expertdarkgui
+ menu label Graphical expert install
+ kernel /install/vmlinuz
+ append priority=low vga=788 initrd=/install/gtk/initrd.gz theme=dark ---
+include rqdrkgtk.cfg
+label autodarkgui
+ menu label Graphical automated install
+ kernel /install/gtk/vmlinuz
+ append auto=true priority=critical vga=788 initrd=/install/gtk/initrd.gz theme=dark --- quiet
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/adgtk.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/adgtk.cfg
new file mode 100644
index 0000000..524951e
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/adgtk.cfg
@@ -0,0 +1,12 @@
+menu hshift 9
+menu width 58
+
+label expertgui
+ menu label Graphical expert install
+ kernel /install/vmlinuz
+ append priority=low vga=788 initrd=/install/gtk/initrd.gz ---
+include rqgtk.cfg
+label autogui
+ menu label Graphical automated install
+ kernel /install/vmlinuz
+ append auto=true priority=critical vga=788 initrd=/install/gtk/initrd.gz --- quiet
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/adspkgtk.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/adspkgtk.cfg
new file mode 100644
index 0000000..e6d9d33
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/adspkgtk.cfg
@@ -0,0 +1,19 @@
+menu hshift 9
+menu width 58
+
+menu begin adspk
+ menu label ^Speech-enabled advanced options
+ menu title Speech-enabled advanced options
+ label advancedmenu
+ menu label ^Back..
+ menu exit
+ label expertspk
+ menu label E^xpert speech install
+ kernel /install/vmlinuz
+ append priority=low vga=788 initrd=/install/gtk/initrd.gz speakup.synth=soft ---
+ include rqspkgtk.cfg
+ label autospk
+ menu label ^Automated speech install
+ kernel /install/vmlinuz
+ append auto=true priority=critical vga=788 initrd=/install/gtk/initrd.gz speakup.synth=soft --- quiet
+menu end
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/adtxt.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/adtxt.cfg
new file mode 100644
index 0000000..acb1e3c
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/adtxt.cfg
@@ -0,0 +1,9 @@
+label expert
+ menu label E^xpert install
+ kernel /install/vmlinuz
+ append priority=low vga=788 initrd=/install/initrd.gz ---
+include rqtxt.cfg
+label auto
+ menu label ^Automated install
+ kernel /install/vmlinuz
+ append auto=true priority=critical vga=788 initrd=/install/initrd.gz --- quiet
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/boot.cat b/PepDeb64/fusato/config/includes.binary/isolinux/boot.cat
new file mode 100644
index 0000000..a52d039
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/isolinux/boot.cat differ
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/drk.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/drk.cfg
new file mode 100644
index 0000000..25acc00
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/drk.cfg
@@ -0,0 +1,6 @@
+label installdark
+default installdark
+ menu label ^Install
+ menu default
+ kernel /install/vmlinuz
+ append vga=788 initrd=/install/initrd.gz theme=dark --- quiet
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/drkgtk.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/drkgtk.cfg
new file mode 100644
index 0000000..7e460c6
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/drkgtk.cfg
@@ -0,0 +1,6 @@
+label installdarkgui
+default installdarkgui
+ menu label ^Graphical install
+ menu default
+ kernel /install/vmlinuz
+ append vga=788 initrd=/install/gtk/initrd.gz theme=dark --- quiet
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/drkmenu.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/drkmenu.cfg
new file mode 100644
index 0000000..753528a
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/drkmenu.cfg
@@ -0,0 +1,21 @@
+menu background #00000000
+menu color title * #FFFFFFFF *
+menu color border * #00000000 #00000000 none
+menu color unsel * #ffffffff #ff000000 *
+menu color hotkey * #ffdddd00 #ff000000 *
+menu color sel * #ffffffff #ff808080 *
+menu color hotsel * #ffdddd00 #ff808080 *
+menu color tabmsg * #ffffffff #00000000 *
+menu color help 37;40 #ffdddd00 #00000000 none
+# XXX When adjusting vshift, take care that rows is set to a small
+# enough value so any possible menu will fit on the screen,
+# rather than falling off the bottom.
+menu vshift 8
+menu rows 12
+# The help line must be at least one line from the bottom.
+menu helpmsgrow 14
+# The command line must be at least one line from the help line.
+menu cmdlinerow 16
+menu timeoutrow 16
+menu tabmsgrow 18
+menu tabmsg Press ENTER to boot or TAB to edit a menu entry
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/exithelp.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/exithelp.cfg
new file mode 100644
index 0000000..3119e65
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/exithelp.cfg
@@ -0,0 +1,3 @@
+label menu
+ kernel vesamenu.c32
+ config isolinux.cfg
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/f1.txt b/PepDeb64/fusato/config/includes.binary/isolinux/f1.txt
new file mode 100644
index 0000000..5451a9b
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/f1.txt
@@ -0,0 +1,25 @@
+ 0fWelcome to Debian GNU/Linux!07 09F107
+
+This is a PeppermintOS installation CD-ROM.
+It was built 20230311-21:01; d-i 20230311-00:01:40.
+
+0fHELP INDEX07
+
+0fKEY TOPIC07
+
+<09F107> This page, the help index.
+<09F207> Prerequisites for installing Debian.
+<09F307> Boot methods for special ways of using this CD-ROM
+<09F407> Additional boot methods; rescue mode.
+<09F507> Special boot parameters, overview.
+<09F607> Special boot parameters for special machines.
+<09F707> Special boot parameters for selected disk controllers.
+<09F807> Special boot parameters for the install system.
+<09F907> How to get help.
+<09F1007> Copyrights and warranties.
+
+For F1-F9 type control and F then the digit 1-9
+For F10 type control and F then the digit 0
+
+
+Press F2 through F10 for details, or ENTER to
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/f10.txt b/PepDeb64/fusato/config/includes.binary/isolinux/f10.txt
new file mode 100644
index 0000000..09dfa12
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/f10.txt
@@ -0,0 +1,23 @@
+0fCOPYRIGHTS AND WARRANTIES07 09F1007
+
+PeppermintOS is Copyright (C) 2010-2023 Software in the Public Interest,
+and others.
+
+The PepperminOS system is freely redistributable. After installation,
+the exact distribution terms for each package are described in the
+corresponding file /usr/share/doc/0bpackagename07/copyright.
+
+PeppermintOS comes with 0fABSOLUTELY NO WARRANTY07, to the extent
+permitted by applicable law.
+
+
+
+
+
+
+
+
+
+
+
+Press F1control and F then 1 for the help index, or ENTER to
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/f2.txt b/PepDeb64/fusato/config/includes.binary/isolinux/f2.txt
new file mode 100644
index 0000000..dc8b754
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/f2.txt
@@ -0,0 +1,23 @@
+0fPREREQUISITES FOR INSTALLING PEPPERMINT07 09F207
+
+You must have at least 285 megabytes of RAM to use this Debian installer.
+
+You should have space on your hard disk to create a new disk partition
+of at least 1160 megabytes to install the base system. You'll need more
+disk space to install additional packages, depending on what you wish
+to do with your new Debian system.
+
+See the Installation Guide or the FAQ for more information; both
+documents are available at the Debian web site, 0fhttps://peppermintos.com/07
+
+Thank you for choosing PeppermintOS!
+
+
+
+
+
+
+
+
+
+Press F1control and F then 1 for the help index, or ENTER to
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/f3.txt b/PepDeb64/fusato/config/includes.binary/isolinux/f3.txt
new file mode 100644
index 0000000..144d25d
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/f3.txt
@@ -0,0 +1,25 @@
+0fBOOT METHODS07 09F307
+
+0fAvailable boot methods:07
+
+0finstallgui07
+ Start the installation using the graphical installer -- this is the
+ default CD-ROM install
+0finstall07
+ Start the installation using the text mode installer
+0fexpertgui07
+ Start the installation in expert mode, for maximum control, using
+ the graphical installer
+0fexpert07
+ Start the installation in expert mode using the text mode installer
+
+To use one of these boot methods, type it at the prompt, optionally
+followed by any boot parameters. For example:
+ boot: install acpi=off
+
+If unsure, you should use the default boot method, with no special
+parameters, by simply pressing enter at the boot prompt.
+
+Except in expert mode, non-critical kernel boot messages are suppressed.
+
+Press F1control and F then 1 for the help index, or ENTER to
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/f4.txt b/PepDeb64/fusato/config/includes.binary/isolinux/f4.txt
new file mode 100644
index 0000000..74de4bf
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/f4.txt
@@ -0,0 +1,23 @@
+0fRESCUE MODE07 09F407
+
+0fUse one of these boot methods to rescue an existing install:07
+
+0frescuegui07
+ Boot into rescue mode using the graphical installer.
+0frescue07
+ Boot into rescue mode.
+
+
+
+
+
+To use one of these boot methods, type it at the prompt, optionally
+followed by any boot parameters. For example:
+ boot: rescue acpi=off
+
+
+
+
+
+
+Press F1control and F then 1 for the help index, or ENTER to
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/f5.txt b/PepDeb64/fusato/config/includes.binary/isolinux/f5.txt
new file mode 100644
index 0000000..6e73913
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/f5.txt
@@ -0,0 +1,23 @@
+0fSPECIAL BOOT PARAMETERS - OVERVIEW07 09F507
+
+On a few systems, you may need to specify a parameter at the 0fboot:07
+prompt in order to boot the system. For example, Linux may not be able
+to autodetect your hardware, and you may need to explicitly specify
+its location or type for it to be recognized.
+
+For more information about what boot parameters you can use, press:
+
+ <09F607> -- boot parameters for special machines
+ <09F707> -- boot parameters for various disk controllers
+ <09F807> -- boot parameters understood by the install system
+
+Note that to specify a parameter for a particular kernel module, use the form
+module.param=value, for example: libata.atapi_enabled=1
+
+
+
+
+
+
+
+Press F1control and F then 1 for the help index, or ENTER to
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/f6.txt b/PepDeb64/fusato/config/includes.binary/isolinux/f6.txt
new file mode 100644
index 0000000..ad8220f
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/f6.txt
@@ -0,0 +1,23 @@
+0fSPECIAL BOOT PARAMETERS - VARIOUS HARDWARE07 09F607
+
+You can use the following boot parameters at the 0fboot:07 prompt,
+in combination with the boot method (see <09F307>).
+If you use hex numbers you have to use the 0x prefix (e.g., 0x300).
+0f
+HARDWARE PARAMETER TO SPECIFY07
+IBM PS/1 or ValuePoint (IDE disk) 0fhd=0bcylinders0f,0bheads0f,0bsectors07
+Some IBM ThinkPads 0ffloppy.floppy=thinkpad07
+Protect I/O port regions 0freserve=0biobase0f,0bextent07[0f,0b...07]
+Laptops with screen display problems 0fvga=77107
+Use first serial port at 9600 baud 0fconsole=ttyS0,9600n807
+Force use of generic IDE driver 0fall_generic_ide=107
+Possible (temporary) workarounds for lockups or other hardware failures:
+disable buggy APIC interrupt routing 0fnoapic nolapic07
+(partly) disable ACPI 0facpi=noirq07 or 0facpi=off07
+disable USB 0fnousb07
+poll for interrupts 0firqpoll07
+
+For example:
+ boot: install vga=771 noapic nolapic
+
+Press F1control and F then 1 for the help index, or ENTER to
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/f7.txt b/PepDeb64/fusato/config/includes.binary/isolinux/f7.txt
new file mode 100644
index 0000000..bfd39fc
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/f7.txt
@@ -0,0 +1,23 @@
+0fSPECIAL BOOT PARAMETERS - VARIOUS DISK DRIVES07 09F707
+
+You can use the following boot parameters at the 0fboot:07 prompt,
+in combination with the boot method (see <09F307>).
+0f
+HARDWARE PARAMETER TO SPECIFY07
+Adaptec 151x, 152x 0faha152x.aha152x=0biobase07[0f,0birq07[0f,0bscsi-id07[0f,0breconnect07]]]
+Adaptec 1542 0faha1542.aha1542=0biobase07[0f,0bbuson0f,0bbusoff07[0f,0bdmaspeed07]]
+Adaptec 274x, 284x 0faic7xxx.aic7xxx=no_reset07 (enabled if non-zero)
+BusLogic SCSI Hosts 0fBusLogic.BusLogic=0biobase07
+Certain DELL machines 0faic7xxx.aic7xxx=no_probe07
+
+This list is incomplete, see the kernel's kernel-parameters.txt file
+for more.
+
+
+
+
+
+For example:
+ boot: install aic7xxx.aic7xxx=no_probe
+
+Press F1control and F then 1 for the help index, or ENTER to
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/f8.txt b/PepDeb64/fusato/config/includes.binary/isolinux/f8.txt
new file mode 100644
index 0000000..936e212
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/f8.txt
@@ -0,0 +1,23 @@
+0fSPECIAL BOOT PARAMETERS - INSTALLATION SYSTEM07 09F807
+
+You can use the following boot parameters at the 0fboot:07 prompt,
+in combination with the boot method (see <09F307>). These parameters
+control how the installer works.
+0f
+RESULT PARAMETER07
+Disable framebuffer 0fvga=normal fb=false07
+Don't start PCMCIA 0fhw-detect/start_pcmcia=false07
+Force static network config 0fnetcfg/disable_dhcp=true07
+Set keyboard map 0fbootkbd=es07
+Select the desktop 0fdesktop=kde07
+
+Accessibility options (last 2 options not available for all images):
+ Use dark contrast theme 0ftheme=dark07
+ Use Braille tty 0fbrltty=driver,device,texttable07
+ Use Speakup 0fspeakup.synth=driver07
+
+
+For example:
+ boot: install vga=normal fb=false
+
+Press F1control and F then 1 for the help index, or ENTER to
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/f9.txt b/PepDeb64/fusato/config/includes.binary/isolinux/f9.txt
new file mode 100644
index 0000000..b6bdb3e
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/f9.txt
@@ -0,0 +1,23 @@
+0fGETTING HELP07 09F907
+
+If you can't install Debian, don't despair! The PepperminOS team is ready to
+help you! We are especially interested in hearing about installation
+problems, because in general they don't happen to only 0fone07 person.
+We've either already heard about your particular problem and can dispense a
+quick fix, or we would like to hear about it and work through it with you,
+and the next user who comes up with the same problem will profit from your
+experience!
+
+See the Installation Guide or the FAQ for more information; both
+documents are available at the Debian web site, 0fhttps://peppermintos.com/07
+
+
+
+
+
+
+
+
+
+
+Press F1control and F then 1 for the help index, or ENTER to
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/g2ldr b/PepDeb64/fusato/config/includes.binary/isolinux/g2ldr
new file mode 100644
index 0000000..f5da412
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/isolinux/g2ldr differ
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/g2ldr.mbr b/PepDeb64/fusato/config/includes.binary/isolinux/g2ldr.mbr
new file mode 100644
index 0000000..2cdd88a
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/isolinux/g2ldr.mbr differ
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/gtk.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/gtk.cfg
new file mode 100644
index 0000000..14003e8
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/gtk.cfg
@@ -0,0 +1,6 @@
+default installgui
+label installgui
+ menu label ^Graphical install
+ menu default
+ kernel /install/vmlinuz
+ append vga=788 initrd=/install/gtk/initrd.gz --- quiet
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/isolinux.bin b/PepDeb64/fusato/config/includes.binary/isolinux/isolinux.bin
new file mode 100644
index 0000000..95329f8
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/isolinux/isolinux.bin differ
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/isolinux.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/isolinux.cfg
new file mode 100644
index 0000000..312653c
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/isolinux.cfg
@@ -0,0 +1,7 @@
+# D-I config version 2.0
+# search path for the c32 support libraries (libcom32, libutil etc.)
+path
+prompt 0
+timeout 0
+include menu.cfg
+default vesamenu.c32
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/ldlinux.c32 b/PepDeb64/fusato/config/includes.binary/isolinux/ldlinux.c32
new file mode 100644
index 0000000..e94389b
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/isolinux/ldlinux.c32 differ
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/libcom32.c32 b/PepDeb64/fusato/config/includes.binary/isolinux/libcom32.c32
new file mode 100644
index 0000000..c4265b9
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/isolinux/libcom32.c32 differ
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/libutil.c32 b/PepDeb64/fusato/config/includes.binary/isolinux/libutil.c32
new file mode 100644
index 0000000..6fc1da7
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/isolinux/libutil.c32 differ
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/menu.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/menu.cfg
new file mode 100644
index 0000000..cf652c3
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/menu.cfg
@@ -0,0 +1,55 @@
+menu hshift 4
+menu width 70
+
+menu title PeppermintOS net installer menu (BIOS mode)
+include stdmenu.cfg
+include gtk.cfg
+include txt.cfg
+menu begin advanced
+ menu label ^Advanced options
+ menu title Advanced options
+ include stdmenu.cfg
+ label mainmenu
+ menu label ^Back..
+ menu exit
+ include adgtk.cfg
+ include adtxt.cfg
+ include adspkgtk.cfg
+ include adspk.cfg
+menu end
+menu begin dark
+ menu label Accessible ^dark contrast installer menu
+ menu title Accessible dark contrast option
+ include drkmenu.cfg
+ label mainmenu
+ menu label ^Back..
+ menu exit
+ include drkgtk.cfg
+ include drk.cfg
+ menu begin advanced
+ menu label ^Advanced options
+ menu title Advanced options
+ include drkmenu.cfg
+ label mainmenu
+ menu label ^Back..
+ menu exit
+ include addrkgtk.cfg
+ include addrk.cfg
+ menu end
+ include x86drkme.cfg
+ label help
+ menu label ^Help
+ text help
+ Display help screens; type 'menu' at boot prompt to return to this menu
+ endtext
+ config prompt.cfg
+menu end
+include x86menu.cfg
+label help
+ menu label ^Help
+ text help
+ Display help screens; type 'menu' at boot prompt to return to this menu
+ endtext
+ config prompt.cfg
+include spkgtk.cfg
+include spk.cfg
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/prompt.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/prompt.cfg
new file mode 100644
index 0000000..3076499
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/prompt.cfg
@@ -0,0 +1,16 @@
+prompt 1
+display f1.txt
+timeout 0
+include menu.cfg
+include exithelp.cfg
+
+f1 f1.txt
+f2 f2.txt
+f3 f3.txt
+f4 f4.txt
+f5 f5.txt
+f6 f6.txt
+f7 f7.txt
+f8 f8.txt
+f9 f9.txt
+f10 f10.txt
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/rqdrk.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/rqdrk.cfg
new file mode 100644
index 0000000..c30ed87
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/rqdrk.cfg
@@ -0,0 +1,4 @@
+label rescuedark
+ menu label ^Rescue mode
+ kernel /install/vmlinuz
+ append vga=788 initrd=/install/initrd.gz rescue/enable=true theme=dark --- quiet
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/rqdrkgtk.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/rqdrkgtk.cfg
new file mode 100644
index 0000000..317e749
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/rqdrkgtk.cfg
@@ -0,0 +1,4 @@
+label rescuedarkgui
+ menu label Graphical rescue mode
+ kernel /install/vmlinuz
+ append vga=788 initrd=/install/gtk/initrd.gz rescue/enable=true theme=dark --- quiet
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/rqgtk.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/rqgtk.cfg
new file mode 100644
index 0000000..10680cc
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/rqgtk.cfg
@@ -0,0 +1,4 @@
+label rescuegui
+ menu label Graphical rescue mode
+ kernel /install/vmlinuz
+ append vga=788 initrd=/install/gtk/initrd.gz rescue/enable=true --- quiet
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/rqspkgtk.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/rqspkgtk.cfg
new file mode 100644
index 0000000..6117159
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/rqspkgtk.cfg
@@ -0,0 +1,4 @@
+label rescuespk
+ menu label ^Rescue speech mode
+ kernel /install/vmlinuz
+ append vga=788 initrd=/install/gtk/initrd.gz rescue/enable=true speakup.synth=soft --- quiet
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/rqtxt.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/rqtxt.cfg
new file mode 100644
index 0000000..fdb931c
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/rqtxt.cfg
@@ -0,0 +1,4 @@
+label rescue
+ menu label ^Rescue mode
+ kernel /install/vmlinuz
+ append vga=788 initrd=/install/initrd.gz rescue/enable=true --- quiet
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/setup.exe b/PepDeb64/fusato/config/includes.binary/isolinux/setup.exe
new file mode 100644
index 0000000..8f62e8f
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/isolinux/setup.exe differ
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/spkgtk.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/spkgtk.cfg
new file mode 100644
index 0000000..7047551
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/spkgtk.cfg
@@ -0,0 +1,8 @@
+label installspk
+ menu label Install with ^speech synthesis
+ kernel /install/vmlinuz
+ append vga=788 initrd=/install/gtk/initrd.gz speakup.synth=soft --- quiet
+# timeout to speech-enabled install
+timeout 300
+ontimeout /install/vmlinuz vga=788 initrd=/install/gtk/initrd.gz speakup.synth=soft --- quiet
+menu autoboot Press a key, otherwise speech synthesis will be started in # second{,s}...
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/splash.png b/PepDeb64/fusato/config/includes.binary/isolinux/splash.png
new file mode 100644
index 0000000..bf8fd87
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/isolinux/splash.png differ
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/stdmenu.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/stdmenu.cfg
new file mode 100644
index 0000000..f5ff63f
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/stdmenu.cfg
@@ -0,0 +1,19 @@
+menu background splash.png
+menu color title * #FFFFFFFF *
+menu color border * #00000000 #00000000 none
+menu color sel * #ffffffff #76a1d0ff *
+menu color hotsel 1;7;37;40 #ffffffff #76a1d0ff *
+menu color tabmsg * #ffffffff #00000000 *
+menu color help 37;40 #ffdddd00 #00000000 none
+# XXX When adjusting vshift, take care that rows is set to a small
+# enough value so any possible menu will fit on the screen,
+# rather than falling off the bottom.
+menu vshift 8
+menu rows 12
+# The help line must be at least one line from the bottom.
+menu helpmsgrow 14
+# The command line must be at least one line from the help line.
+menu cmdlinerow 16
+menu timeoutrow 16
+menu tabmsgrow 18
+menu tabmsg Press ENTER to boot or TAB to edit a menu entry
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/txt.cfg b/PepDeb64/fusato/config/includes.binary/isolinux/txt.cfg
new file mode 100644
index 0000000..1f0dbc0
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/txt.cfg
@@ -0,0 +1,4 @@
+label install
+ menu label ^Install
+ kernel /install/vmlinuz
+ append vga=788 initrd=/install/initrd.gz --- quiet
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/vesamenu.c32 b/PepDeb64/fusato/config/includes.binary/isolinux/vesamenu.c32
new file mode 100644
index 0000000..bbb65e0
Binary files /dev/null and b/PepDeb64/fusato/config/includes.binary/isolinux/vesamenu.c32 differ
diff --git a/PepDeb64/fusato/config/includes.binary/isolinux/win32-loader.ini b/PepDeb64/fusato/config/includes.binary/isolinux/win32-loader.ini
new file mode 100644
index 0000000..c635fe7
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.binary/isolinux/win32-loader.ini
@@ -0,0 +1,11 @@
+[installer]
+kernel=linux
+arch=amd64
+amd64/linux=install/vmlinuz
+amd64/initrd=install/initrd.gz
+amd64/gtk/linux=install/vmlinuz
+amd64/gtk/initrd=install/gtk/initrd.gz
+
+[grub]
+g2ldr=g2ldr
+g2ldr.mbr=g2ldr.mbr
diff --git a/PepDeb64/fusato/config/includes.installer/preseed.cfg b/PepDeb64/fusato/config/includes.installer/preseed.cfg
new file mode 100644
index 0000000..b0f76f8
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed.cfg
@@ -0,0 +1,29 @@
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# SPDX-FileCopyrightText: 2023 PeppermintOS Team (peppermintosteam@proton.me)
+
+#This preseed file includes configuration settings for a custom repository with the 'contrib' and 'non-free' components #enabled, as well as disabling the automatic response to the Debian popularity contest.
+
+# Add your custom repositories
+d-i apt-setup/local0/repository string \
+ http://repo.peppermintos.com/packages bookworm main contrib non-free non-free-firmware
+d-i apt-setup/local0/comment string PeppermintOS repository
+d-i apt-setup/local0/source boolean true
+
+# URL to the public key of the local repository
+d-i apt-setup/local0/key string http://repo.peppermintos.com/packages/conf/peppermint-keyring.gpg
+
+# You can choose to install non-free and contrib software.
+d-i apt-setup/non-free boolean true
+d-i apt-setup/contrib boolean true
+d-i apt-setup/non-free-firmware boolean true
+
+# Select which update services to use; define the mirrors to be used.
+# Values shown below are the normal defaults.
+d-i apt-setup/services-select multiselect security, updates
+d-i apt-setup/security_host string security.debian.org
+
+# Remove popularity-contest
+popularity-contest popularity-contest/participate boolean false
+
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/apps/Pephub.desktop b/PepDeb64/fusato/config/includes.installer/preseed/apps/Pephub.desktop
new file mode 100755
index 0000000..55a4e0b
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/apps/Pephub.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Type=Application
+Name=Peppermint Hub
+Exec=hub
+Icon=/usr/share/pixmaps/peppermint-hub.png
+Terminal=false
+Categories=Settings
+StartupNotify=True
+Comment=Use the Hub to configure your system
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/apps/Welcome.desktop b/PepDeb64/fusato/config/includes.installer/preseed/apps/Welcome.desktop
new file mode 100755
index 0000000..a669bc5
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/apps/Welcome.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Type=Application
+Name=Welcome to Peppermint
+Exec=welcome
+Icon=/usr/share/pixmaps/peppermint.png
+Terminal=false
+Categories=Settings
+StartupNotify=True
+Name[en_US]=Welcome to Peppermint
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/apps/gdebi.desktop b/PepDeb64/fusato/config/includes.installer/preseed/apps/gdebi.desktop
new file mode 100755
index 0000000..9bc2eba
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/apps/gdebi.desktop
@@ -0,0 +1,164 @@
+[Desktop Entry]
+Name=GDebi Package Installer
+Name[ar]=مثبت الحزم GDebi
+Name[ast]=Instalador de Paquetes GDebi
+Name[bg]=Инсталатор на пакет
+Name[bn]=প্যাকেজ ইনস্টলার
+Name[bs]=GDebi Paketni Instaler
+Name[ca]=Instal·lador de paquets GDebi
+Name[ca@valencia]=Instal·lador de paquets GDebi
+Name[cs]=Instalátor balíků GDebi
+Name[da]=GDebi pakkeinstalleringsprogram
+Name[de]=GDebi-Paket-Installationsprogramm
+Name[el]=Εγκατάσταση πακέτων GDebi
+Name[en_AU]=GDebi Package Installer
+Name[en_CA]=GDebi Package Installer
+Name[en_GB]=GDebi Package Installer
+Name[eo]=Instalilo de GDebi-pakaĵoj
+Name[es]=Instalador de paquetes GDebi
+Name[et]=GDebi Paketipaigaldus
+Name[eu]=GDebi pakete-instalatzailea
+Name[fi]=GDebi-paketinasentaja
+Name[fo]=GDebi Pakka innleggjari
+Name[fr]=Installateur de paquets GDebi
+Name[gl]=Instalador de paquetes GDebi
+Name[he]=מתקין החבילות GDebi
+Name[hu]=GDebi csomagtelepítő
+Name[id]=Pemasang Paket GDebi
+Name[it]=Installatore pacchetto GDebi
+Name[ja]=GDebi パッケージインストーラー
+Name[ko]=GDebi 패키지 설치 프로그램
+Name[lt]=„GDebi“ paketų diegyklė
+Name[ms]=Pemasang Pakej GDebi
+Name[nb]=GDebi pakkeinstallerer
+Name[nl]=GDebi pakketinstalleerder
+Name[oc]=Installador de paquets GDebi
+Name[pl]=Instalator pakietów GDebi
+Name[pt]=Instalador de Pacotes
+Name[pt_BR]=Instalador de pacotes GDebi
+Name[ro]=GDebi instalator de pachete
+Name[ru]=Программа установки пакетов GDebi
+Name[sk]=Inštalátor balíkov GDebi
+Name[sl]=Namestilnik paketov GDebi
+Name[sr]=ГДеби — Инсталер пакета
+Name[sv]=Paketinstalleraren GDebi
+Name[te]=GDebi ప్యాకేజీ స్థాపకం
+Name[tr]=GDebi Paket Kurucu
+Name[uk]=Встановлювач пакунків GDebi
+Name[ur]=جی ڈیبی پیکج انسٹالر
+Name[zh_CN]=GDebi 软件包安装程序
+Name[zh_HK]=GDebi 套件安裝程式
+Name[zh_TW]=GDebi 套件安裝程式
+GenericName=Package Installer
+GenericName[ar]=مثبت الحزم
+GenericName[ast]=Instalador de paquetes
+GenericName[bg]=Инсталатор на пакети
+GenericName[bn]=প্যাকেজ ইনস্টলার
+GenericName[bs]=Paketni instaler
+GenericName[ca]=Instal·lador de paquets
+GenericName[ca@valencia]=Instal·lador de paquets
+GenericName[cs]=Instalátor balíků
+GenericName[da]=Pakkeinstalleringsprogram
+GenericName[de]=Paket-Installationsprogramm
+GenericName[el]=Εγκατάσταση πακέτων
+GenericName[en_AU]=Package Installer
+GenericName[en_CA]=Package Installer
+GenericName[en_GB]=Package Installer
+GenericName[eo]=Instalilo de pakaĵoj
+GenericName[es]=Instalador de paquetes
+GenericName[et]=Paketti paigaldus
+GenericName[eu]=Pakete-instalatzailea
+GenericName[fi]=Paketinasentaja
+GenericName[fo]=Pakkainnleggjari
+GenericName[fr]=Installateur de paquets
+GenericName[gl]=Instalador de paquetes
+GenericName[he]=מתקין החבילות
+GenericName[hr]=Paketni instaler
+GenericName[hu]=Csomagtelepítő
+GenericName[id]=Pemasang Paket
+GenericName[it]=Installatore pacchetto
+GenericName[ja]=パッケージインストーラー
+GenericName[ko]=패키지 설치 프로그램
+GenericName[ku]=Sazgera Paketan
+GenericName[lt]=Paketų diegyklė
+GenericName[ms]=Pemasang Pakej
+GenericName[nb]=Pakkeinstallerer
+GenericName[nl]=Pakketinstalleerder
+GenericName[oc]=Installador de paquets
+GenericName[pl]=Instalator pakietów
+GenericName[pt]=Instalador de Pacotes
+GenericName[pt_BR]=Instalador de Pacotes
+GenericName[ro]=Instalator pachete
+GenericName[ru]=Программа установки пакетов
+GenericName[sk]=Inštalátor balíkov
+GenericName[sl]=Namestilnik paketov
+GenericName[sr]=Инсталер пакета
+GenericName[sv]=Paketinstallerare
+GenericName[te]=ప్యాకేజీ స్థాపకం
+GenericName[tr]=Paket Kurucu
+GenericName[uk]=Встановлювач пакунків
+GenericName[ur]=پیکج تنصیب کار
+GenericName[zh_CN]=软件包安装程序
+GenericName[zh_HK]=套件安裝程式
+GenericName[zh_TW]=套件安裝程式
+Comment=Install and view software packages
+Comment[ar]=تثبيت و عرض حزم البرامج
+Comment[ast]=Instalar y ver paquetes de software
+Comment[bg]=Инсталиране и преглед на пакети
+Comment[bn]=সফটওয়্যার প্যাকেজ ইনস্টল করুন এবং দেখুন
+Comment[bs]=Instaliraj i vidi softverski paket
+Comment[ca]=Instal·la i visualitza paquets de programari
+Comment[ca@valencia]=Instal·la i visualitza paquets de programari
+Comment[cs]=Instalovat a prohlížet balíky
+Comment[da]=Installer og vis softwarepakker
+Comment[de]=Software-Pakete installieren und betrachten
+Comment[el]=Εγκαταστήστε και εμφανίστε πακέτα λογισμικού
+Comment[en_AU]=Install and view software packages
+Comment[en_CA]=Install and view software packages
+Comment[en_GB]=Install and view software packages
+Comment[eo]=Instali kaj vidi pakaĵojn de programaroj
+Comment[es]=Instala y muestra paquetes de software
+Comment[eu]=Instalatu eta ikusi software paketeak
+Comment[fi]=Asenna ja tarkastele ohjelmapaketteja
+Comment[fo]=Legg inn og vís ritbúnaðarpakkar
+Comment[fr]=Installer et lister les paquets logiciels
+Comment[gl]=Instalar e ver paquetes de software
+Comment[he]=התקנה וצפייה של חבילות תכנה
+Comment[hr]=Instaliraj i pregledaj pakete
+Comment[hu]=Szoftvercsomagok telepítése és megjelenítése
+Comment[id]=Pasang dan tinjau paket-paket piranti lunak
+Comment[it]=Installa e visualizza pacchetti software
+Comment[ja]=ソフトウェアパッケージのインストールと表示を行います
+Comment[ko]=소프트웨어 패키지를 설치하고 봅니다
+Comment[ku]=Paketên nivîsbariyê saz bike û lê binêre
+Comment[lt]=Įdiegti ir peržiūrėti programinės įrangos paketus
+Comment[ms]=Pasang dan papar pakej perisian
+Comment[nb]=Installer og vis programvarepakker
+Comment[nl]=Programmapakketten installeren en bekijken
+Comment[oc]=Installar e far la lista dels paquets logicials
+Comment[pl]=Instaluje i wyświetla informacje o pakietach oprogramowania
+Comment[pt]=Instalar e ver pacotes de software
+Comment[pt_BR]=Instalar e visualizar pacotes de programa
+Comment[ro]=Instalare şi vizualizare pachete software
+Comment[ru]=Программа установки и просмотра пакетов программ
+Comment[sk]=Inštalácia a zobrazenie balíkov softvéru
+Comment[sl]=Nameščanje in ogled paketov programske opreme
+Comment[sr]=Инсталирајте и погледајте софтверске пакете
+Comment[sv]=Installera och visa programpaket
+Comment[te]=సాఫ్ట్వేర్ ప్యాకేజీలను స్థాపించు మరియు చూడు
+Comment[tr]=Yazılım paketlerini kur ve izle
+Comment[uk]=Встановити та оглянути програмні пакунки
+Comment[ur]=اردو ترجمہ از محمد علی مکی
+Comment[zh_CN]=安装和查看软件包
+Comment[zh_HK]=安裝和檢視軟件套件
+Comment[zh_TW]=安裝和檢視軟體套件
+Exec=sh -c "gdebi-gtk %f"
+Icon=gnome-mime-application-x-deb
+Terminal=false
+Type=Application
+Categories=System;
+MimeType=application/vnd.debian.binary-package;
+NotShowIn=KDE;
+X-Ubuntu-Gettext-Domain=gdebi
+StartupNotify=true
+Keywords=package;apt;dpkg;install
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/apps/kumo.desktop b/PepDeb64/fusato/config/includes.installer/preseed/apps/kumo.desktop
new file mode 100755
index 0000000..ec67327
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/apps/kumo.desktop
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Name=Kumo
+GenericName=Kumo
+Comment=Simple SSB Launcher
+Categories=Network;
+Type=Application
+Exec=kumo
+Icon=/usr/share/pixmaps/kumo.png
+Terminal=false
+NoDisplay=false
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/apps/plank.desktop b/PepDeb64/fusato/config/includes.installer/preseed/apps/plank.desktop
new file mode 100755
index 0000000..2a34df4
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/apps/plank.desktop
@@ -0,0 +1,67 @@
+[Desktop Entry]
+Name=Plank
+GenericName=Dock
+Comment[am]=በጣም ቀላል
+Comment[ar]=بسيط بغباء.
+Comment[bg]=Пределно прост.
+Comment[bs]=Glupavo jednostavan.
+Comment[ca]=Estúpidament simple.
+Comment[cs]=Stupidně jednoduchý.
+Comment[da]=Super simpel.
+Comment[de]=Lächerlich einfach.
+Comment[el]=Βλακωδώς απλό.
+Comment[en_AU]=Stupidly simple.
+Comment[en_CA]=Stupidly simple.
+Comment[en_GB]=Stupidly simple.
+Comment[eo]=Stulte simple.
+Comment[es]=Estúpidamente simple.
+Comment[et]=Hämmastavalt lihtne.
+Comment[eu]=Erraza baino errazagoa.
+Comment[fi]=Todella yksinkertainen.
+Comment[fr]=Stupidement simple.
+Comment[ga]=Simplíocht shimplí.
+Comment[gd]=Cho furasta 's a ghabhas.
+Comment[gl]=Estupidamente simple.
+Comment[he]=טפשי עד כמה שזה פשוט
+Comment[hr]=Neviđeno jednostavan
+Comment[hu]=Nagyszerűen egyszerű.
+Comment[id]=Begitu sederhana.
+Comment[it]=Stupidamente semplice.
+Comment[ja]=超シンプル
+Comment[ka]=ძალიან მარტივი აი ძალიან
+Comment[ko]=어처구니없으리 만치 단순한.
+Comment[lt]=Kvailai paprastas.
+Comment[lv]=Muļķīgi vienkārši.
+Comment[ml]=അനായാസം.
+Comment[ms]=Ringkas la sangat.
+Comment[nb]=Uforstandig enkelt.
+Comment[ne]=एकदमै सरल
+Comment[nl]=Belachelijk eenvoudig.
+Comment[nn]=Idiotsikkert
+Comment[pl]=Idiotycznie prosty.
+Comment[pt]=Estupidamente simples.
+Comment[pt_BR]=Estupidamente simples.
+Comment[ro]=Stupid de simplu.
+Comment[ru]=До безумного прост.
+Comment[sk]=Primitívne jednoduchý.
+Comment[sl]=Bedasto preprost.
+Comment[sma]=dle dan aelhkies.
+Comment[sr]=Шашаво једноставно.
+Comment[sr@latin]=Glupavo jenostavan.
+Comment[sv]=Galet enkelt.
+Comment[ta]=மிகவும் எளிது
+Comment[te]=చాలా సరళమైనది.
+Comment[th]=ง่ายเหี้ยๆ
+Comment[tr]=Son derece basit.
+Comment[uk]=Просто легкий.
+Comment[uz]=Ahmoqona darajada sodda.
+Comment[vi]=Cực kì đơn giản.
+Comment[zh_CN]=简单得无语。
+Comment[zh_TW]=極簡。
+Comment=Stupidly simple.
+Categories=Utility;
+Type=Application
+Exec=plank
+Icon=plank
+Terminal=false
+NoDisplay=false
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/conf/hostname b/PepDeb64/fusato/config/includes.installer/preseed/conf/hostname
new file mode 100644
index 0000000..ac3dd28
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/conf/hostname
@@ -0,0 +1 @@
+PepOS-Live
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/conf/issue b/PepDeb64/fusato/config/includes.installer/preseed/conf/issue
new file mode 100644
index 0000000..115706f
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/conf/issue
@@ -0,0 +1,2 @@
+Peppermint OS GNU/Linux \n \l
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/conf/issue.net b/PepDeb64/fusato/config/includes.installer/preseed/conf/issue.net
new file mode 100644
index 0000000..c95a2cb
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/conf/issue.net
@@ -0,0 +1 @@
+Peppermint OS
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/conf/os-release b/PepDeb64/fusato/config/includes.installer/preseed/conf/os-release
new file mode 100644
index 0000000..af53259
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/conf/os-release
@@ -0,0 +1,7 @@
+PRETTY_NAME="PeppermintOS"
+NAME="Peppermint"
+ID=peppermint
+VERSION_CODENAME="bookworm"
+HOME_URL="https://peppermintos.com"
+SUPPORT_URL="https://sourceforge.net/p/peppermintos/pepos/"
+BUG_REPORT_URL="https://sourceforge.net/p/peppermintos/pepos/"
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/conf/sources.list b/PepDeb64/fusato/config/includes.installer/preseed/conf/sources.list
new file mode 100644
index 0000000..696c7b9
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/conf/sources.list
@@ -0,0 +1,24 @@
+# This system was installed using PeppermintOS removable media
+# (e.g. netinst, live or single CD). The matching "deb cdrom"
+# entries were removed at the end of the installation process.
+# For information about how to configure apt package sources,
+# see the sources.list(5) manual.
+
+# Main Repo - main contrib non-free
+deb http://deb.debian.org/debian/ bookworm main contrib non-free
+deb-src http://deb.debian.org/debian/ bookworm main contrib non-free
+
+# Security Repo - main contrib non-free
+#deb http://security.debian.org/ bookworm-security main contrib non-free
+#deb-src http://security.debian.org/ bookworm-security main contrib non-free
+
+# Updates Repo - main contrib non-free
+#deb http://deb.debian.org/debian bookworm-updates main contrib non-free
+#deb-src http://deb.debian.org/debian bookworm-updates main
+#deb http://deb.debian.org/debian/ bookworm-proposed-updates main contrib non-free
+#deb-src http://deb.debian.org/debian/ bookworm-proposed-updates main contrib non-free
+
+# bookworm-backports, previously on backports.debian.org
+#deb http://deb.debian.org/debian/ bookworm-backports main contrib non-free
+#deb-src http://deb.debian.org/debian/ bookworm-backports main contrib non-free
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/database/welval.db b/PepDeb64/fusato/config/includes.installer/preseed/database/welval.db
new file mode 100644
index 0000000..743b999
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/database/welval.db differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/background.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/background.png
new file mode 100644
index 0000000..bf8fd87
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/background.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/4MLinux.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/4MLinux.png
new file mode 100644
index 0000000..1c6fe5e
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/4MLinux.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/AlpineLinux.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/AlpineLinux.png
new file mode 100644
index 0000000..6212a1f
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/AlpineLinux.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/Manjaro.i686.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/Manjaro.i686.png
new file mode 100644
index 0000000..611a6fb
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/Manjaro.i686.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/Manjaro.x86_64.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/Manjaro.x86_64.png
new file mode 100644
index 0000000..611a6fb
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/Manjaro.x86_64.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/SystemRescueCD.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/SystemRescueCD.png
new file mode 100644
index 0000000..7c41182
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/SystemRescueCD.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/android.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/android.png
new file mode 100644
index 0000000..dad066f
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/android.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/anonymous.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/anonymous.png
new file mode 100644
index 0000000..7d165b6
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/anonymous.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/antergos.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/antergos.png
new file mode 100644
index 0000000..32e3a3a
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/antergos.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/arch.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/arch.png
new file mode 100644
index 0000000..f6cd870
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/arch.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/archlinux.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/archlinux.png
new file mode 100644
index 0000000..f6cd870
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/archlinux.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/arcolinux.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/arcolinux.png
new file mode 100644
index 0000000..c5e5e5e
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/arcolinux.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/artix.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/artix.png
new file mode 100644
index 0000000..0cbeb11
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/artix.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/bedrock.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/bedrock.png
new file mode 100644
index 0000000..58ff48a
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/bedrock.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/cancel.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/cancel.png
new file mode 100644
index 0000000..fca2ac9
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/cancel.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/centos.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/centos.png
new file mode 100644
index 0000000..23fe2fa
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/centos.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/chakra.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/chakra.png
new file mode 100644
index 0000000..6f63a95
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/chakra.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/debian.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/debian.png
new file mode 100644
index 0000000..20bea8c
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/debian.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/deepin.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/deepin.png
new file mode 100644
index 0000000..61c92fb
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/deepin.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/devuan.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/devuan.png
new file mode 100644
index 0000000..ff65401
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/devuan.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/driver.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/driver.png
new file mode 100644
index 0000000..1621ee7
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/driver.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/edit.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/edit.png
new file mode 100644
index 0000000..6a43bd9
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/edit.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/efi.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/efi.png
new file mode 100644
index 0000000..4ecf3b9
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/efi.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/elementary.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/elementary.png
new file mode 100644
index 0000000..2840354
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/elementary.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/endeavouros.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/endeavouros.png
new file mode 100644
index 0000000..6b1e530
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/endeavouros.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/fedora.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/fedora.png
new file mode 100644
index 0000000..926b56d
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/fedora.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/find.efi.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/find.efi.png
new file mode 100644
index 0000000..0e32321
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/find.efi.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/find.none.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/find.none.png
new file mode 100644
index 0000000..87d4d0e
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/find.none.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/freebsd.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/freebsd.png
new file mode 100644
index 0000000..fb9408c
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/freebsd.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/garuda.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/garuda.png
new file mode 100644
index 0000000..f699718
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/garuda.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/gentoo.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/gentoo.png
new file mode 100644
index 0000000..bc0ed70
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/gentoo.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/gnu-linux.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/gnu-linux.png
new file mode 100644
index 0000000..db2fcfd
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/gnu-linux.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/haiku.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/haiku.png
new file mode 100644
index 0000000..ce7f818
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/haiku.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/help.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/help.png
new file mode 100644
index 0000000..d8b5a17
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/help.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/kali.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/kali.png
new file mode 100644
index 0000000..900dc82
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/kali.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/kaos.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/kaos.png
new file mode 100644
index 0000000..9fd4e89
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/kaos.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/kbd.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/kbd.png
new file mode 100644
index 0000000..6ace3ac
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/kbd.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/korora.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/korora.png
new file mode 100644
index 0000000..456e876
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/korora.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/kubuntu.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/kubuntu.png
new file mode 100644
index 0000000..7a79ff3
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/kubuntu.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/lang.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/lang.png
new file mode 100644
index 0000000..3c9c1d7
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/lang.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/lfs.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/lfs.png
new file mode 100644
index 0000000..2c54036
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/lfs.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/linux.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/linux.png
new file mode 100644
index 0000000..348ebdd
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/linux.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/linuxmint.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/linuxmint.png
new file mode 100644
index 0000000..7d9da81
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/linuxmint.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/lubuntu.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/lubuntu.png
new file mode 100644
index 0000000..057c8e2
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/lubuntu.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/macosx.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/macosx.png
new file mode 100644
index 0000000..ea03e77
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/macosx.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/mageia.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/mageia.png
new file mode 100644
index 0000000..79afa76
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/mageia.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/manjaro.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/manjaro.png
new file mode 100644
index 0000000..611a6fb
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/manjaro.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/mate.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/mate.png
new file mode 100644
index 0000000..b2fc22a
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/mate.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/memtest.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/memtest.png
new file mode 100644
index 0000000..1621ee7
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/memtest.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/mx-linux.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/mx-linux.png
new file mode 100644
index 0000000..49f1133
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/mx-linux.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/neon.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/neon.png
new file mode 100644
index 0000000..e41906e
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/neon.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/opensuse.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/opensuse.png
new file mode 100644
index 0000000..d844fd5
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/opensuse.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/parrot.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/parrot.png
new file mode 100644
index 0000000..3333de9
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/parrot.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/pop-os.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/pop-os.png
new file mode 100644
index 0000000..014d9f3
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/pop-os.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/pop.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/pop.png
new file mode 100644
index 0000000..014d9f3
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/pop.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/recovery.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/recovery.png
new file mode 100644
index 0000000..7b69b14
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/recovery.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/regolith.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/regolith.png
new file mode 100644
index 0000000..5ece07b
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/regolith.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/restart.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/restart.png
new file mode 100644
index 0000000..9715302
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/restart.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/rocky.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/rocky.png
new file mode 100644
index 0000000..be144f6
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/rocky.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/shutdown.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/shutdown.png
new file mode 100644
index 0000000..fc9cf16
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/shutdown.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/siduction.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/siduction.png
new file mode 100644
index 0000000..d16549b
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/siduction.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/slackware.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/slackware.png
new file mode 100644
index 0000000..4c31a3f
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/slackware.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/solus.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/solus.png
new file mode 100644
index 0000000..338718b
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/solus.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/steamos.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/steamos.png
new file mode 100644
index 0000000..df28bcc
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/steamos.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/type.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/type.png
new file mode 100644
index 0000000..5c48476
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/type.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/tz.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/tz.png
new file mode 100644
index 0000000..220b29b
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/tz.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/ubuntu.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/ubuntu.png
new file mode 100644
index 0000000..352fbe0
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/ubuntu.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/unknown.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/unknown.png
new file mode 100644
index 0000000..4733dc8
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/unknown.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/unset.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/unset.png
new file mode 100644
index 0000000..15e3d3c
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/unset.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/ventoy.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/ventoy.png
new file mode 100644
index 0000000..7abdc6c
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/ventoy.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/void.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/void.png
new file mode 100644
index 0000000..01cc2f3
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/void.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/windows.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/windows.png
new file mode 100644
index 0000000..d5c7cc3
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/windows.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/windows11.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/windows11.png
new file mode 100644
index 0000000..fe97d9f
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/windows11.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/xero.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/xero.png
new file mode 100644
index 0000000..2221c73
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/xero.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/xerolinux.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/xerolinux.png
new file mode 100644
index 0000000..2221c73
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/xerolinux.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/xubuntu.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/xubuntu.png
new file mode 100644
index 0000000..f43abc7
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/xubuntu.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/zorin.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/zorin.png
new file mode 100644
index 0000000..c1506c4
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/icons/zorin.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/select_c.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/select_c.png
new file mode 100644
index 0000000..b1f8d58
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/select_c.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/select_e.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/select_e.png
new file mode 100644
index 0000000..9332368
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/select_e.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/select_w.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/select_w.png
new file mode 100644
index 0000000..28f6424
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/select_w.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_c.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_c.png
new file mode 100644
index 0000000..d0dd52a
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_c.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_e.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_e.png
new file mode 100644
index 0000000..394cbe4
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_e.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_n.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_n.png
new file mode 100644
index 0000000..476f8bc
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_n.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_ne.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_ne.png
new file mode 100644
index 0000000..9e26959
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_ne.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_nw.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_nw.png
new file mode 100644
index 0000000..5c3cba8
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_nw.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_s.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_s.png
new file mode 100644
index 0000000..85a8901
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_s.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_se.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_se.png
new file mode 100644
index 0000000..d8627ee
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_se.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_sw.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_sw.png
new file mode 100644
index 0000000..67c600c
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_sw.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_w.png b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_w.png
new file mode 100644
index 0000000..d066e2d
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminal_box_w.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminus-12.pf2 b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminus-12.pf2
new file mode 100644
index 0000000..6092035
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminus-12.pf2 differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminus-14.pf2 b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminus-14.pf2
new file mode 100644
index 0000000..8ab8bd1
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminus-14.pf2 differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminus-16.pf2 b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminus-16.pf2
new file mode 100644
index 0000000..6e6b25d
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminus-16.pf2 differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminus-18.pf2 b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminus-18.pf2
new file mode 100644
index 0000000..129cef1
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/terminus-18.pf2 differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/theme.txt b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/theme.txt
new file mode 100644
index 0000000..c666b67
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/theme.txt
@@ -0,0 +1,42 @@
+# Main options
+title-text: ""
+desktop-image: "background.png"
+desktop-color: "#000000"
+terminal-font: "Terminus Regular 14"
+terminal-box: "terminal_box_*.png"
+terminal-left: "0"
+terminal-top: "0"
+terminal-width: "100%"
+terminal-height: "100%"
+terminal-border: "0"
+
+# Boot menu
++ boot_menu {
+ left = 15%
+ top = 40%
+ width = 85%
+ height = 65%
+ item_font = "Ubuntu Regular 20"
+ item_color = "#cccccc"
+ selected_item_color = "#ffffff"
+ icon_width = 36
+ icon_height = 36
+ item_icon_space = 20
+ item_height = 40
+ item_padding = 2
+ item_spacing = 10
+ selected_item_pixmap_style = "select_*.png"
+}
+
+
+# Countdown label
+# You can change the name of default starting OS here
++ label {
+ left = 15%
+ top = 31%
+ align = "center"
+ id = "__timeout__"
+ text = "Peppermint will start in %d seconds"
+ color = "#cccccc"
+ font = "Ubuntu Regular 17"
+}
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/ubuntu_regular_17.pf2 b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/ubuntu_regular_17.pf2
new file mode 100644
index 0000000..9405954
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/ubuntu_regular_17.pf2 differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/ubuntu_regular_20.pf2 b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/ubuntu_regular_20.pf2
new file mode 100644
index 0000000..3d903ba
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/grub/themes/peppermint/ubuntu_regular_20.pf2 differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/keyrings/deb-multimedia-keyring.gpg b/PepDeb64/fusato/config/includes.installer/preseed/keyrings/deb-multimedia-keyring.gpg
new file mode 100644
index 0000000..a4f2b10
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/keyrings/deb-multimedia-keyring.gpg differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/keyrings/peppermint-keyring.gpg b/PepDeb64/fusato/config/includes.installer/preseed/keyrings/peppermint-keyring.gpg
new file mode 100644
index 0000000..87f923f
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/keyrings/peppermint-keyring.gpg differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/lightdm/lightdm-gtk-greeter.conf b/PepDeb64/fusato/config/includes.installer/preseed/lightdm/lightdm-gtk-greeter.conf
new file mode 100755
index 0000000..3a52105
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/lightdm/lightdm-gtk-greeter.conf
@@ -0,0 +1,11 @@
+[greeter]
+background = /usr/share/backgrounds/pexels-sutee-vichaporn-8498924.jpg
+theme-name = Marwaita Dark Peppermint
+xft-antialias = true
+xft-hintstyle = hintfull
+xft-rgba = rgb
+reader = orca
+icon-theme-name = GNOME
+font-name = Cantarell 11
+position = 16%,center 52%,center
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/lightdm/lightdm.conf b/PepDeb64/fusato/config/includes.installer/preseed/lightdm/lightdm.conf
new file mode 100644
index 0000000..b893186
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/lightdm/lightdm.conf
@@ -0,0 +1,170 @@
+[Seat:*]
+#
+# General configuration
+#
+# start-default-seat = True to always start one seat if none are defined in the configuration
+# greeter-user = User to run greeter as
+# minimum-display-number = Minimum display number to use for X servers
+# minimum-vt = First VT to run displays on
+# lock-memory = True to prevent memory from being paged to disk
+# user-authority-in-system-dir = True if session authority should be in the system location
+# guest-account-script = Script to be run to setup guest account
+# logind-check-graphical = True to on start seats that are marked as graphical by logind
+# log-directory = Directory to log information to
+# run-directory = Directory to put running state in
+# cache-directory = Directory to cache to
+# sessions-directory = Directory to find sessions
+# remote-sessions-directory = Directory to find remote sessions
+# greeters-directory = Directory to find greeters
+# backup-logs = True to move add a .old suffix to old log files when opening new ones
+# dbus-service = True if LightDM provides a D-Bus service to control it
+#
+[LightDM]
+#start-default-seat=true
+#greeter-user=lightdm
+#minimum-display-number=0
+#minimum-vt=7
+#lock-memory=true
+#user-authority-in-system-dir=false
+#guest-account-script=guest-account
+#logind-check-graphical=false
+#log-directory=/var/log/lightdm
+#run-directory=/var/run/lightdm
+#cache-directory=/var/cache/lightdm
+#sessions-directory=/usr/share/lightdm/sessions:/usr/share/xsessions:/usr/share/wayland-sessions
+#remote-sessions-directory=/usr/share/lightdm/remote-sessions
+#greeters-directory=$XDG_DATA_DIRS/lightdm/greeters:$XDG_DATA_DIRS/xgreeters
+#backup-logs=true
+#dbus-service=true
+
+#
+# Seat configuration
+#
+# Seat configuration is matched against the seat name glob in the section, for example:
+# [Seat:*] matches all seats and is applied first.
+# [Seat:seat0] matches the seat named "seat0".
+# [Seat:seat-thin-client*] matches all seats that have names that start with "seat-thin-client".
+#
+# type = Seat type (local, xremote, unity)
+# pam-service = PAM service to use for login
+# pam-autologin-service = PAM service to use for autologin
+# pam-greeter-service = PAM service to use for greeters
+# xserver-backend = X backend to use (mir)
+# xserver-command = X server command to run (can also contain arguments e.g. X -special-option)
+# xmir-command = Xmir server command to run (can also contain arguments e.g. Xmir -special-option)
+# xserver-config = Config file to pass to X server
+# xserver-layout = Layout to pass to X server
+# xserver-allow-tcp = True if TCP/IP connections are allowed to this X server
+# xserver-share = True if the X server is shared for both greeter and session
+# xserver-hostname = Hostname of X server (only for type=xremote)
+# xserver-display-number = Display number of X server (only for type=xremote)
+# xdmcp-manager = XDMCP manager to connect to (implies xserver-allow-tcp=true)
+# xdmcp-port = XDMCP UDP/IP port to communicate on
+# xdmcp-key = Authentication key to use for XDM-AUTHENTICATION-1 (stored in keys.conf)
+# unity-compositor-command = Unity compositor command to run (can also contain arguments e.g. unity-system-compositor -special-option)
+# unity-compositor-timeout = Number of seconds to wait for compositor to start
+# greeter-session = Session to load for greeter
+# greeter-hide-users = True to hide the user list
+# greeter-allow-guest = True if the greeter should show a guest login option
+# greeter-show-manual-login = True if the greeter should offer a manual login option
+# greeter-show-remote-login = True if the greeter should offer a remote login option
+# user-session = Session to load for users
+# allow-user-switching = True if allowed to switch users
+# allow-guest = True if guest login is allowed
+# guest-session = Session to load for guests (overrides user-session)
+# session-wrapper = Wrapper script to run session with
+# greeter-wrapper = Wrapper script to run greeter with
+# guest-wrapper = Wrapper script to run guest sessions with
+# display-setup-script = Script to run when starting a greeter session (runs as root)
+# display-stopped-script = Script to run after stopping the display server (runs as root)
+# greeter-setup-script = Script to run when starting a greeter (runs as root)
+# session-setup-script = Script to run when starting a user session (runs as root)
+# session-cleanup-script = Script to run when quitting a user session (runs as root)
+# autologin-guest = True to log in as guest by default
+# autologin-user = User to log in with by default (overrides autologin-guest)
+# autologin-user-timeout = Number of seconds to wait before loading default user
+# autologin-session = Session to load for automatic login (overrides user-session)
+# autologin-in-background = True if autologin session should not be immediately activated
+# exit-on-failure = True if the daemon should exit if this seat fails
+#
+[Seat:*]
+#type=local
+#pam-service=lightdm
+#pam-autologin-service=lightdm-autologin
+#pam-greeter-service=lightdm-greeter
+#xserver-backend=
+#xserver-command=X
+#xmir-command=Xmir
+#xserver-config=
+#xserver-layout=
+#xserver-allow-tcp=false
+#xserver-share=true
+#xserver-hostname=
+#xserver-display-number=
+#xdmcp-manager=
+#xdmcp-port=177
+#xdmcp-key=
+#unity-compositor-command=unity-system-compositor
+#unity-compositor-timeout=60
+greeter-session=lightdm-gtk-greeter
+greeter-hide-users=false
+#greeter-allow-guest=true
+#greeter-show-manual-login=false
+#greeter-show-remote-login=true
+user-session=xfce
+allow-user-switching=true
+#allow-guest=true
+#guest-session=xfce
+#session-wrapper=lightdm-session
+#greeter-wrapper=
+#guest-wrapper=
+#display-setup-script=
+#display-stopped-script=
+#greeter-setup-script=
+#session-setup-script=
+#session-cleanup-script=
+#autologin-guest=false
+#autologin-user=
+#autologin-user-timeout=0
+#autologin-in-background=false
+#autologin-session=xfce
+#exit-on-failure=false
+
+#
+# XDMCP Server configuration
+#
+# enabled = True if XDMCP connections should be allowed
+# port = UDP/IP port to listen for connections on
+# listen-address = Host/address to listen for XDMCP connections (use all addresses if not present)
+# key = Authentication key to use for XDM-AUTHENTICATION-1 or blank to not use authentication (stored in keys.conf)
+# hostname = Hostname to report to XDMCP clients (defaults to system hostname if unset)
+#
+# The authentication key is a 56 bit DES key specified in hex as 0xnnnnnnnnnnnnnn. Alternatively
+# it can be a word and the first 7 characters are used as the key.
+#
+[XDMCPServer]
+#enabled=false
+#port=177
+#listen-address=
+#key=
+#hostname=
+
+#
+# VNC Server configuration
+#
+# enabled = True if VNC connections should be allowed
+# command = Command to run Xvnc server with
+# port = TCP/IP port to listen for connections on
+# listen-address = Host/address to listen for VNC connections (use all addresses if not present)
+# width = Width of display to use
+# height = Height of display to use
+# depth = Color depth of display to use
+#
+[VNCServer]
+#enabled=false
+#command=Xvnc
+#port=5900
+#listen-address=
+#width=1024
+#height=768
+#depth=8
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/ai.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/ai.png
new file mode 100644
index 0000000..55f99ee
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/ai.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/applications-system.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/applications-system.png
new file mode 100644
index 0000000..8268a5b
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/applications-system.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/battery.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/battery.png
new file mode 100644
index 0000000..5fb0fe0
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/battery.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/ckm.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/ckm.png
new file mode 100644
index 0000000..0c8dbba
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/ckm.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/cs-default-applications.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/cs-default-applications.png
new file mode 100644
index 0000000..c1729a7
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/cs-default-applications.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/cs-notifications.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/cs-notifications.png
new file mode 100644
index 0000000..2b47881
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/cs-notifications.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/dconf-editor.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/dconf-editor.png
new file mode 100644
index 0000000..9f4916f
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/dconf-editor.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/drive-harddisk-system.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/drive-harddisk-system.png
new file mode 100644
index 0000000..e0bb52c
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/drive-harddisk-system.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/ff.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/ff.png
new file mode 100644
index 0000000..9b5be5d
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/ff.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/flat.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/flat.png
new file mode 100644
index 0000000..fdb2c03
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/flat.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/glade.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/glade.png
new file mode 100644
index 0000000..7f99d03
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/glade.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/gnome-dev-printer.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/gnome-dev-printer.png
new file mode 100644
index 0000000..32970c4
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/gnome-dev-printer.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/gnome-session.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/gnome-session.png
new file mode 100644
index 0000000..6ff8198
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/gnome-session.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/gnome-software.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/gnome-software.png
new file mode 100644
index 0000000..a46ba6c
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/gnome-software.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/hblock.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/hblock.png
new file mode 100644
index 0000000..bbe750f
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/hblock.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/hblockon.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/hblockon.png
new file mode 100644
index 0000000..395bd12
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/hblockon.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/install-debian.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/install-debian.png
new file mode 100644
index 0000000..6361d2d
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/install-debian.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/keyboard.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/keyboard.png
new file mode 100644
index 0000000..9cb1cb5
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/keyboard.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/kumo.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/kumo.png
new file mode 100644
index 0000000..ae6c53b
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/kumo.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/logo.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/logo.png
new file mode 100644
index 0000000..c5d5c79
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/logo.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/luakit.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/luakit.png
new file mode 100644
index 0000000..ae6c53b
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/luakit.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/mouse.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/mouse.png
new file mode 100644
index 0000000..a0f50f7
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/mouse.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/network-wired.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/network-wired.png
new file mode 100644
index 0000000..e849106
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/network-wired.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/panel-applets.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/panel-applets.png
new file mode 100644
index 0000000..973ed53
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/panel-applets.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-48.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-48.png
new file mode 100644
index 0000000..f576ab0
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-48.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-fm-20.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-fm-20.png
new file mode 100644
index 0000000..8b05465
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-fm-20.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-hub-128.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-hub-128.png
new file mode 100644
index 0000000..85b0ee6
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-hub-128.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-hub.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-hub.png
new file mode 100644
index 0000000..f984e72
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-hub.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-inst-48.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-inst-48.png
new file mode 100644
index 0000000..b4fb90f
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-inst-48.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-inst.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-inst.png
new file mode 100644
index 0000000..9982463
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-inst.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-old.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-old.png
new file mode 100644
index 0000000..4934a1c
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-old.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-rim-128.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-rim-128.png
new file mode 100644
index 0000000..ce08aeb
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-rim-128.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-rim-48.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-rim-48.png
new file mode 100644
index 0000000..fabb69d
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint-rim-48.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint.png
new file mode 100644
index 0000000..094e9f5
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/peppermint.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/preferences-desktop-accessibility.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/preferences-desktop-accessibility.png
new file mode 100644
index 0000000..af96ad5
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/preferences-desktop-accessibility.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/snap.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/snap.png
new file mode 100644
index 0000000..19f88ce
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/snap.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/software-properties.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/software-properties.png
new file mode 100644
index 0000000..4c0b72b
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/software-properties.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/stock_music-library.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/stock_music-library.png
new file mode 100644
index 0000000..27cc427
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/stock_music-library.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/stock_people.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/stock_people.png
new file mode 100644
index 0000000..395135b
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/stock_people.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/synaptic.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/synaptic.png
new file mode 100644
index 0000000..b69e13c
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/synaptic.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/update-manager.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/update-manager.png
new file mode 100644
index 0000000..ab481ab
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/update-manager.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/video-display.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/video-display.png
new file mode 100644
index 0000000..2be22db
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/video-display.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/xd.png b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/xd.png
new file mode 100644
index 0000000..fe74207
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/pixmaps/xd.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/polkit/org.freedesktop.pepkumo.policy b/PepDeb64/fusato/config/includes.installer/preseed/polkit/org.freedesktop.pepkumo.policy
new file mode 100644
index 0000000..329e97b
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/polkit/org.freedesktop.pepkumo.policy
@@ -0,0 +1,19 @@
+
+
+
+
+ Run PepKumo SSB creater
+ Authentication to run Kumo is required
+ accessories-text-editor
+
+ auth_admin
+ auth_admin
+ auth_admin
+
+ /opt/pypep/pepkumo.py
+ true
+
+
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/polkit/org.freedesktop.peppackages.policy b/PepDeb64/fusato/config/includes.installer/preseed/polkit/org.freedesktop.peppackages.policy
new file mode 100644
index 0000000..f95e9ab
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/polkit/org.freedesktop.peppackages.policy
@@ -0,0 +1,19 @@
+
+
+
+
+ Run Package Selection program
+ Authentication to run PepPackages is required
+ accessories-text-editor
+
+ auth_admin
+ auth_admin
+ auth_admin
+
+ /opt/pypep/peppackages.py
+ true
+
+
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/polkit/org.freedesktop.pepu.policy b/PepDeb64/fusato/config/includes.installer/preseed/polkit/org.freedesktop.pepu.policy
new file mode 100644
index 0000000..e2a6c8e
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/polkit/org.freedesktop.pepu.policy
@@ -0,0 +1,19 @@
+
+
+
+
+ Run Peppermint Update Manager
+ Authentication to run Update Manager is required
+ accessories-text-editor
+
+ auth_admin
+ auth_admin
+ auth_admin
+
+ /opt/pypep/pepu.py
+ true
+
+
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/polkit/org.freedesktop.python3.policy b/PepDeb64/fusato/config/includes.installer/preseed/polkit/org.freedesktop.python3.policy
new file mode 100755
index 0000000..ad312c8
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/polkit/org.freedesktop.python3.policy
@@ -0,0 +1,18 @@
+
+
+
+
+ Run python3 program
+ Authentication is required to run the python3
+ accessories-text-editor
+
+ auth_admin
+ auth_admin
+ auth_admin
+
+ /usr/bin/python3
+ true
+
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/polkit/org.freedesktop.ttkcreator.policy b/PepDeb64/fusato/config/includes.installer/preseed/polkit/org.freedesktop.ttkcreator.policy
new file mode 100644
index 0000000..4ca43ae
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/polkit/org.freedesktop.ttkcreator.policy
@@ -0,0 +1,19 @@
+
+
+
+
+ Run TTK-Creator program
+ Authentication to run TTK-Creater is required
+ accessories-text-editor
+
+ auth_admin
+ auth_admin
+ auth_admin
+
+ /usr/bin/python3 /usr/local/lib/python3.9/dist-packages/ttkcreator/__main__.py
+ true
+
+
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/protools/hblock b/PepDeb64/fusato/config/includes.installer/preseed/protools/hblock
new file mode 100755
index 0000000..04c00f5
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/protools/hblock
@@ -0,0 +1,760 @@
+#!/bin/sh
+
+set -eu
+export LC_ALL='C'
+
+# Metadata.
+if [ -z "${HBLOCK_VERSION+x}" ]; then HBLOCK_VERSION='3.4.1'; fi
+if [ -z "${HBLOCK_AUTHOR+x}" ]; then HBLOCK_AUTHOR='Héctor Molinero Fernández '; fi
+if [ -z "${HBLOCK_LICENSE+x}" ]; then HBLOCK_LICENSE='MIT, https://opensource.org/licenses/MIT'; fi
+if [ -z "${HBLOCK_REPOSITORY+x}" ]; then HBLOCK_REPOSITORY='https://github.com/hectorm/hblock'; fi
+
+# Emulate ksh if the shell is zsh.
+if [ -n "${ZSH_VERSION-}" ]; then emulate -L ksh; fi
+
+# Define system and user configuration directories.
+if [ -z "${ETCDIR+x}" ]; then ETCDIR='/etc'; fi
+if [ -z "${XDG_CONFIG_HOME+x}" ]; then XDG_CONFIG_HOME="${HOME-}/.config"; fi
+
+# Remove temporary files on exit.
+cleanup() { ret="$?"; rm -rf -- "${TMPDIR:-${TMP:-/tmp}}/hblock.${$}."*; trap - EXIT; exit "${ret:?}"; }
+{ trap cleanup EXIT ||:; trap cleanup TERM ||:; trap cleanup INT ||:; trap cleanup HUP ||:; } 2>/dev/null
+
+# Built-in header.
+HOSTNAME="${HOSTNAME-"$(uname -n)"}"
+HBLOCK_HEADER_BUILTIN="$(cat <<-EOF
+ 127.0.0.1 localhost ${HOSTNAME?}
+ 255.255.255.255 broadcasthost
+ ::1 localhost ${HOSTNAME?}
+ ::1 ip6-localhost ip6-loopback
+ fe00::0 ip6-localnet
+ ff00::0 ip6-mcastprefix
+ ff02::1 ip6-allnodes
+ ff02::2 ip6-allrouters
+ ff02::3 ip6-allhosts
+EOF
+)"
+
+# Built-in footer.
+HBLOCK_FOOTER_BUILTIN=''
+
+# Built-in sources.
+HBLOCK_SOURCES_BUILTIN="$(cat <<-'EOF'
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/adaway.org/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/adblock-nocoin-list/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/adguard-cname-trackers/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/adguard-simplified/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/dandelionsprout-nordic/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-ara/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-bul/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-ces-slk/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-deu/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-fra/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-heb/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-ind/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-ita/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-kor/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-lav/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-lit/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-nld/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-por/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-rus/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-spa/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easylist-zho/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/easyprivacy/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/eth-phishing-detect/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/gfrogeye-firstparty-trackers/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/hostsvn/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/kadhosts/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/matomo.org-spammers/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/mitchellkrogza-badd-boyz-hosts/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/phishing.army/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/socram8888-notonmyshift/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/someonewhocares.org/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/spam404.com/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/stevenblack/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/ublock/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/ublock-abuse/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/ublock-badware/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/ublock-privacy/list.txt
+ https://raw.githubusercontent.com/hectorm/hmirror/master/data/urlhaus/list.txt
+EOF
+)"
+
+# Built-in allowlist.
+HBLOCK_ALLOWLIST_BUILTIN=''
+
+# Built-in denylist.
+HBLOCK_DENYLIST_BUILTIN="$(cat <<-'EOF'
+ # Special domain that is used to check if hBlock is enabled.
+ hblock-check.molinero.dev
+EOF
+)"
+
+# Parse command line options.
+optParse() {
+ SEP="$(printf '\037')"; POS=''
+ while [ "${#}" -gt '0' ]; do
+ case "${1?}" in
+ # Short options that accept a value need a "*" in their pattern because they can be found in the "-A" form.
+ '-O'*|'--output') optArgStr "${@-}"; outputFile="${optArg?}"; shift "${optShift:?}" ;;
+ '-H'*|'--header') optArgStr "${@-}"; headerFile="${optArg?}"; shift "${optShift:?}" ;;
+ '-F'*|'--footer') optArgStr "${@-}"; footerFile="${optArg?}"; shift "${optShift:?}" ;;
+ '-S'*|'--sources') optArgStr "${@-}"; sourcesFile="${optArg?}"; shift "${optShift:?}" ;;
+ '-A'*|'--allowlist') optArgStr "${@-}"; allowlistFile="${optArg?}"; shift "${optShift:?}" ;;
+ '-D'*|'--denylist') optArgStr "${@-}"; denylistFile="${optArg?}"; shift "${optShift:?}" ;;
+ '-R'*|'--redirection') optArgStr "${@-}"; redirection="${optArg?}"; shift "${optShift:?}" ;;
+ '-W'*|'--wrap') optArgStr "${@-}"; wrap="${optArg?}"; shift "${optShift:?}" ;;
+ '-T'*|'--template') optArgStr "${@-}"; template="${optArg?}"; shift "${optShift:?}" ;;
+ '-C'*|'--comment') optArgStr "${@-}"; comment="${optArg?}"; shift "${optShift:?}" ;;
+ '-l' |'--lenient'|'--no-lenient') optArgBool "${@-}"; lenient="${optArg:?}" ;;
+ '-r' |'--regex'|'--no-regex') optArgBool "${@-}"; regex="${optArg:?}" ;;
+ '-f' |'--filter-subdomains'|'--no-filter-subdomains') optArgBool "${@-}"; filterSubdomains="${optArg:?}" ;;
+ '-c' |'--continue'|'--no-continue') optArgBool "${@-}"; continue="${optArg:?}" ;;
+ '-p'*|'--parallel') optArgStr "${@-}"; parallel="${optArg?}"; shift "${optShift:?}" ;;
+ '-q' |'--quiet'|'--no-quiet') optArgBool "${@-}"; quiet="${optArg:?}" ;;
+ '-x'*|'--color') optArgStr "${@-}"; color="${optArg?}"; shift "${optShift:?}" ;;
+ '-v' |'--version') showVersion ;;
+ '-h' |'--help') showHelp ;;
+ # If "--" is found, the remaining positional parameters are saved and the parsing ends.
+ --) shift; _IFS="${IFS?}"; IFS="${SEP:?}"; POS="${POS-}${POS+${SEP:?}}${*-}"; IFS="${_IFS?}"; break ;;
+ # If a long option in the form "--opt=value" is found, it is split into "--opt" and "value".
+ --*=*) optSplitEquals "${@-}"; shift; set -- "${optName:?}" "${optArg?}" "${@-}"; continue ;;
+ # If an option did not match any pattern, an error is thrown.
+ -?|--*) optDie "Illegal option ${1:?}" ;;
+ # If multiple short options in the form "-AB" are found, they are split into "-A" and "-B".
+ -?*) optSplitShort "${@-}"; shift; set -- "${optAName:?}" "${optBName:?}" "${@-}"; continue ;;
+ # If a positional parameter is found, it is saved.
+ *) POS="${POS-}${POS+${SEP:?}}${1?}" ;;
+ esac
+ shift
+ done
+}
+optSplitShort() {
+ optAName="${1%"${1#??}"}"; optBName="-${1#??}"
+}
+optSplitEquals() {
+ optName="${1%="${1#--*=}"}"; optArg="${1#--*=}"
+}
+optArgStr() {
+ if [ -n "${1#??}" ] && [ "${1#--}" = "${1:?}" ]; then optArg="${1#??}"; optShift='0';
+ elif [ -n "${2+x}" ]; then optArg="${2-}"; optShift='1';
+ else optDie "No argument for ${1:?} option"; fi
+}
+optArgBool() {
+ if [ "${1#--no-}" = "${1:?}" ]; then optArg='true';
+ else optArg='false'; fi
+}
+optDie() {
+ printf '%s\n' "${@-}" "Try 'hblock --help' for more information" >&2
+ exit 2
+}
+
+# Show help and quit.
+showHelp() {
+ printf '%s\n' "$(sed -e 's/%NL/\n/g' <<-EOF
+ Usage: hblock [OPTION]...
+
+ hBlock is a POSIX-compliant shell script that gets a list of domains that serve
+ ads, tracking scripts and malware from multiple sources and creates a hosts
+ file, among other formats, that prevents your system from connecting to them.
+
+ Options:
+
+ -O, --output , \${HBLOCK_OUTPUT_FILE}%NL
+ Output file location.%NL
+ If equals "-", it is printed to stdout.%NL
+ (default: ${outputFile?})%NL
+ -H, --header , \${HBLOCK_HEADER_FILE}%NL
+ File to be included at the beginning of the output file.%NL
+ If equals "builtin", the built-in value is used.%NL
+ If equals "none", an empty value is used.%NL
+ If equals "-", the stdin content is used.%NL
+ If unspecified and any of the following files exists, its content is used.%NL
+ \${XDG_CONFIG_HOME}/hblock/header%NL
+ ${ETCDIR?}/hblock/header%NL
+ (default: ${headerFile?})%NL
+ -F, --footer , \${HBLOCK_FOOTER_FILE}%NL
+ File to be included at the end of the output file.%NL
+ If equals "builtin", the built-in value is used.%NL
+ If equals "none", an empty value is used.%NL
+ If equals "-", the stdin content is used.%NL
+ If unspecified and any of the following files exists, its content is used.%NL
+ \${XDG_CONFIG_HOME}/hblock/footer%NL
+ ${ETCDIR?}/hblock/footer%NL
+ (default: ${footerFile?})%NL
+ -S, --sources , \${HBLOCK_SOURCES_FILE}%NL
+ File with line separated URLs used to generate the blocklist.%NL
+ If equals "builtin", the built-in value is used.%NL
+ If equals "none", an empty value is used.%NL
+ If equals "-", the stdin content is used.%NL
+ If unspecified and any of the following files exists, its content is used.%NL
+ \${XDG_CONFIG_HOME}/hblock/sources.list%NL
+ ${ETCDIR?}/hblock/sources.list%NL
+ (default: ${sourcesFile?})%NL
+ -A, --allowlist , \${HBLOCK_ALLOWLIST_FILE}%NL
+ File with line separated entries to be removed from the blocklist.%NL
+ If equals "builtin", the built-in value is used.%NL
+ If equals "none", an empty value is used.%NL
+ If equals "-", the stdin content is used.%NL
+ If unspecified and any of the following files exists, its content is used.%NL
+ \${XDG_CONFIG_HOME}/hblock/allow.list%NL
+ ${ETCDIR?}/hblock/allow.list%NL
+ (default: ${allowlistFile?})%NL
+ -D, --denylist , \${HBLOCK_DENYLIST_FILE}%NL
+ File with line separated entries to be added to the blocklist.%NL
+ If equals "builtin", the built-in value is used.%NL
+ If equals "none", an empty value is used.%NL
+ If equals "-", the stdin content is used.%NL
+ If unspecified and any of the following files exists, its content is used.%NL
+ \${XDG_CONFIG_HOME}/hblock/deny.list%NL
+ ${ETCDIR?}/hblock/deny.list%NL
+ (default: ${denylistFile?})%NL
+ -R, --redirection , \${HBLOCK_REDIRECTION}%NL
+ Redirection for all entries in the blocklist.%NL
+ (default: ${redirection?})%NL
+ -W, --wrap , \${HBLOCK_WRAP}%NL
+ Break blocklist lines after this number of entries.%NL
+ (default: ${wrap?})%NL
+ -T, --template , \${HBLOCK_TEMPLATE}%NL
+ Template applied to each entry.%NL
+ %D = , %R = %NL
+ (default: ${template?})%NL
+ -C, --comment , \${HBLOCK_COMMENT}%NL
+ Character used for comments.%NL
+ (default: ${comment?})%NL
+ -l, --[no-]lenient, \${HBLOCK_LENIENT}%NL
+ Match all entries from sources regardless of their IP, instead of
+ 0.0.0.0, 127.0.0.1, ::, ::1 or nothing.%NL
+ (default: ${lenient?})%NL
+ -r, --[no-]regex, \${HBLOCK_REGEX}%NL
+ Use POSIX BREs in the allowlist instead of fixed strings.%NL
+ (default: ${regex?})%NL
+ -f, --[no-]filter-subdomains, \${HBLOCK_FILTER_SUBDOMAINS}%NL
+ Do not include subdomains when the parent domain is also blocked.
+ Useful for reducing the blocklist size in cases such as when DNS blocking
+ makes these subdomains redundant.%NL
+ (default: ${filterSubdomains?})%NL
+ -c, --[no-]continue, \${HBLOCK_CONTINUE}%NL
+ Do not abort if a download error occurs.%NL
+ (default: ${continue?})%NL
+ -p, --parallel, \${HBLOCK_PARALLEL}%NL
+ Maximum concurrency for parallel downloads.%NL
+ (default: ${parallel?})%NL
+ -q, --[no-]quiet, \${HBLOCK_QUIET}%NL
+ Suppress non-error messages.%NL
+ (default: ${quiet?})%NL
+ -x, --color , \${HBLOCK_COLOR}%NL
+ Colorize the output.%NL
+ (default: ${color?})%NL
+ -v, --version%NL
+ Show version number and quit.%NL
+ -h, --help%NL
+ Show this help and quit.
+
+ Report bugs to:
+ EOF
+ )"
+ exit 0
+}
+
+# Show version number and quit.
+showVersion() {
+ printf '%s\n' "$(cat <<-EOF
+ hBlock ${HBLOCK_VERSION:?}
+ Author: ${HBLOCK_AUTHOR:?}
+ License: ${HBLOCK_LICENSE:?}
+ Repository: ${HBLOCK_REPOSITORY:?}
+ EOF
+ )"
+ exit 0
+}
+
+# Check if a program exists.
+exists() {
+ # shellcheck disable=SC2230
+ if command -v true; then command -v -- "${1:?}"
+ elif eval type type; then eval type -- "${1:?}"
+ else which -- "${1:?}"; fi >/dev/null 2>&1
+}
+
+# Pretty print methods.
+printInfo() { [ -n "${NO_STDOUT+x}" ] || printf "${COLOR_RESET-}[${COLOR_BGREEN-}INFO${COLOR_RESET-}] %s\n" "${@-}"; }
+printWarn() { [ -n "${NO_STDERR+x}" ] || printf "${COLOR_RESET-}[${COLOR_BYELLOW-}WARN${COLOR_RESET-}] %s\n" "${@-}" >&2; }
+printError() { [ -n "${NO_STDERR+x}" ] || printf "${COLOR_RESET-}[${COLOR_BRED-}ERROR${COLOR_RESET-}] %s\n" "${@-}" >&2; }
+printList() { [ -n "${NO_STDOUT+x}" ] || printf "${COLOR_RESET-} ${COLOR_BCYAN-}*${COLOR_RESET-} %s\n" "${@-}"; }
+
+# Print a pseudorandom string.
+rand() { :& awk -v N="${!}" 'BEGIN{srand();printf("%08x%06x",rand()*2^31-1,N)}'; }
+
+# Create a temporary directory, file or FIFO special file.
+createTemp() {
+ # POSIX does not specify the mktemp utility, so here comes a hacky solution.
+ while t="${TMPDIR:-${TMP:-/tmp}}/hblock.${$}.$(rand)" && [ -e "${t:?}" ]; do sleep 1; done
+ (
+ umask 077
+ case "${1-}" in
+ 'dir') mkdir -- "${t:?}" ;;
+ 'file') touch -- "${t:?}" ;;
+ 'fifo') mkfifo -- "${t:?}" ;;
+ esac
+ printf '%s' "${t:?}"
+ )
+}
+
+# Write stdin to a file.
+sponge() {
+ spongeFile="$(createTemp 'file')"; cat > "${spongeFile:?}"
+ cat -- "${spongeFile:?}" > "${1:?}"; rm -f -- "${spongeFile:?}"
+}
+
+# Count files or directories in a directory.
+dirCount() { [ -e "${1:?}" ] && printf '%s' "${#}" || printf '%s' '0'; }
+
+# Print to stdout the contents of a URL.
+fetchUrl() {
+ # If the protocol is "file://" we can omit the download and simply use cat.
+ if [ "${1#file://}" != "${1:?}" ]; then cat -- "${1#file://}"
+ else
+ userAgent='Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0'
+ if exists curl; then curl -fsSL -A "${userAgent:?}" -- "${1:?}"
+ elif exists wget; then wget -qO- -U "${userAgent:?}" -- "${1:?}"
+ elif exists fetch; then fetch -qo- --user-agent="${userAgent:?}" -- "${1:?}"
+ else
+ printError 'curl, wget or fetch are required for this script'
+ exit 1
+ fi
+ fi
+}
+
+# Remove comments from string.
+removeComments() { sed -e 's/[[:blank:]]*#.*//;/^$/d'; }
+
+# Transform hosts file entries to domain names.
+sanitizeBlocklist() {
+ leadingScript='s/^[[:blank:]]*//'
+ trailingScript='s/[[:blank:]]*\(#.*\)\{0,1\}$//'
+ if [ "${1:?}" = 'true' ]; then
+ ipv4Script='s/^\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}[[:blank:]]\{1,\}//'
+ ipv6Script='s/^\([0-9a-f]\{0,4\}:\)\{2,7\}[0-9a-f]\{0,4\}[[:blank:]]\{1,\}//'
+ else
+ ipv4Script='s/^\(0\)\{0,1\}\(127\)\{0,1\}\(\.[0-9]\{1,3\}\)\{3\}[[:blank:]]\{1,\}//'
+ ipv6Script='s/^\(0\{0,4\}:\)\{2,7\}0\{0,3\}[01]\{0,1\}[[:blank:]]\{1,\}//'
+ fi
+ domainRegex='\([0-9a-z_-]\{1,63\}\.\)\{1,\}[a-z][0-9a-z-]\{0,61\}[0-9a-z]\.\{0,1\}'
+ tr -d '\r' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' \
+ | sed -e "${leadingScript:?};${ipv4Script:?};${ipv6Script:?};${trailingScript:?}" \
+ | { grep -e "^${domainRegex:?}\([[:blank:]]\{1,\}${domainRegex:?}\)*$" ||:; } \
+ | tr -s ' \t' '\n' | sed 's/\.$//'
+}
+
+# Remove reserved Top Level Domains.
+removeReservedTLDs() {
+ sed -e '/\.corp$/d' \
+ -e '/\.domain$/d' \
+ -e '/\.example$/d' \
+ -e '/\.home$/d' \
+ -e '/\.host$/d' \
+ -e '/\.invalid$/d' \
+ -e '/\.lan$/d' \
+ -e '/\.local$/d' \
+ -e '/\.localdomain$/d' \
+ -e '/\.localhost$/d' \
+ -e '/\.test$/d'
+}
+
+main() {
+ usrConfDir="${XDG_CONFIG_HOME?}/hblock"
+ sysConfDir="${ETCDIR?}/hblock"
+
+ # Source environment file if exists.
+ # shellcheck disable=SC1091
+ if [ -f "${usrConfDir:?}/environment" ]; then
+ set -a; . "${usrConfDir:?}/environment"; set +a
+ elif [ -f "${sysConfDir:?}/environment" ]; then
+ set -a; . "${sysConfDir:?}/environment"; set +a
+ fi
+
+ # Output file location.
+ outputFile="${HBLOCK_OUTPUT_FILE-"${ETCDIR?}/hosts"}"
+
+ # File to be included at the beginning of the output file.
+ headerFile='builtin'
+ if [ -n "${HBLOCK_HEADER+x}" ]; then
+ HBLOCK_HEADER_BUILTIN="${HBLOCK_HEADER?}"
+ elif [ -n "${HBLOCK_HEADER_FILE+x}" ]; then
+ headerFile="${HBLOCK_HEADER_FILE?}"
+ elif [ -f "${usrConfDir:?}/header" ]; then
+ headerFile="${usrConfDir:?}/header"
+ elif [ -f "${sysConfDir:?}/header" ]; then
+ headerFile="${sysConfDir:?}/header"
+ fi
+
+ # File to be included at the end of the output file.
+ footerFile='builtin'
+ if [ -n "${HBLOCK_FOOTER+x}" ]; then
+ HBLOCK_FOOTER_BUILTIN="${HBLOCK_FOOTER?}"
+ elif [ -n "${HBLOCK_FOOTER_FILE+x}" ]; then
+ footerFile="${HBLOCK_FOOTER_FILE?}"
+ elif [ -f "${usrConfDir:?}/footer" ]; then
+ footerFile="${usrConfDir:?}/footer"
+ elif [ -f "${sysConfDir:?}/footer" ]; then
+ footerFile="${sysConfDir:?}/footer"
+ fi
+
+ # File with line separated URLs used to generate the blocklist.
+ sourcesFile='builtin'
+ if [ -n "${HBLOCK_SOURCES+x}" ]; then
+ HBLOCK_SOURCES_BUILTIN="${HBLOCK_SOURCES?}"
+ elif [ -n "${HBLOCK_SOURCES_FILE+x}" ]; then
+ sourcesFile="${HBLOCK_SOURCES_FILE?}"
+ elif [ -f "${usrConfDir:?}/sources.list" ]; then
+ sourcesFile="${usrConfDir:?}/sources.list"
+ elif [ -f "${sysConfDir:?}/sources.list" ]; then
+ sourcesFile="${sysConfDir:?}/sources.list"
+ fi
+
+ # File with line separated entries to be removed from the blocklist.
+ allowlistFile='builtin'
+ if [ -n "${HBLOCK_ALLOWLIST+x}" ]; then
+ HBLOCK_ALLOWLIST_BUILTIN="${HBLOCK_ALLOWLIST?}"
+ elif [ -n "${HBLOCK_ALLOWLIST_FILE+x}" ]; then
+ allowlistFile="${HBLOCK_ALLOWLIST_FILE?}"
+ elif [ -f "${usrConfDir:?}/allow.list" ]; then
+ allowlistFile="${usrConfDir:?}/allow.list"
+ elif [ -f "${sysConfDir:?}/allow.list" ]; then
+ allowlistFile="${sysConfDir:?}/allow.list"
+ fi
+
+ # File with line separated entries to be added to the blocklist.
+ denylistFile='builtin'
+ if [ -n "${HBLOCK_DENYLIST+x}" ]; then
+ HBLOCK_DENYLIST_BUILTIN="${HBLOCK_DENYLIST?}"
+ elif [ -n "${HBLOCK_DENYLIST_FILE+x}" ]; then
+ denylistFile="${HBLOCK_DENYLIST_FILE?}"
+ elif [ -f "${usrConfDir:?}/deny.list" ]; then
+ denylistFile="${usrConfDir:?}/deny.list"
+ elif [ -f "${sysConfDir:?}/deny.list" ]; then
+ denylistFile="${sysConfDir:?}/deny.list"
+ fi
+
+ # Redirection for all entries in the blocklist.
+ redirection="${HBLOCK_REDIRECTION-"0.0.0.0"}"
+
+ # Break blocklist lines after this number of entries.
+ wrap="${HBLOCK_WRAP-"1"}"
+
+ # Template applied to each entry.
+ template="${HBLOCK_TEMPLATE-"%R %D"}"
+
+ # Character used for comments.
+ comment="${HBLOCK_COMMENT-"#"}"
+
+ # Match all entries from sources, regardless of their IP.
+ lenient="${HBLOCK_LENIENT-"false"}"
+
+ # Use POSIX BREs instead of fixed strings.
+ regex="${HBLOCK_REGEX-"false"}"
+
+ # Do not include subdomains when the parent domain is also blocked.
+ filterSubdomains="${HBLOCK_FILTER_SUBDOMAINS-"false"}"
+
+ # Abort if a download error occurs.
+ continue="${HBLOCK_CONTINUE-"false"}"
+
+ # Maximum concurrency for parallel downloads.
+ parallel="${HBLOCK_PARALLEL-"4"}"
+
+ # Colorize the output.
+ color="${HBLOCK_COLOR-"auto"}"
+
+ # Suppress non-error messages.
+ quiet="${HBLOCK_QUIET-"false"}"
+
+ # Parse command line options.
+ # shellcheck disable=SC2086
+ { optParse "${@-}"; _IFS="${IFS?}"; IFS="${SEP:?}"; set -- ${POS-} >/dev/null; IFS="${_IFS?}"; }
+
+ # Define terminal colors if the color option is enabled or in auto mode if STDOUT is attached to a TTY and the
+ # "NO_COLOR" variable is not set (https://no-color.org).
+ if [ "${color:?}" = 'true' ] || { [ "${color:?}" = 'auto' ] && [ -z "${NO_COLOR+x}" ] && [ -t 1 ]; }; then
+ COLOR_RESET="$({ exists tput && tput sgr0; } 2>/dev/null || printf '\033[0m')"
+ COLOR_BRED="$({ exists tput && tput bold && tput setaf 1; } 2>/dev/null || printf '\033[1;31m')"
+ COLOR_BGREEN="$({ exists tput && tput bold && tput setaf 2; } 2>/dev/null || printf '\033[1;32m')"
+ COLOR_BYELLOW="$({ exists tput && tput bold && tput setaf 3; } 2>/dev/null || printf '\033[1;33m')"
+ COLOR_BCYAN="$({ exists tput && tput bold && tput setaf 6; } 2>/dev/null || printf '\033[1;36m')"
+ fi
+
+ # Set "NO_STDOUT" variable if the quiet option is enabled (other methods will honor this variable).
+ if [ "${quiet:?}" = 'true' ]; then
+ NO_STDOUT='true'
+ fi
+
+ # Check the header file.
+ case "${headerFile:?}" in
+ # If the file value equals "-", use stdin.
+ '-') headerFile="$(createTemp 'file')"; cat <&0 > "${headerFile:?}" ;;
+ # If the file value equals "none", use an empty file.
+ 'none') headerFile="$(createTemp 'file')" ;;
+ # If the file value equals "builtin", use the built-in value.
+ 'builtin') headerFile="$(createTemp 'file')"; printf '%s' "${HBLOCK_HEADER_BUILTIN?}" > "${headerFile:?}" ;;
+ # If the file does not exist, throw an error.
+ *) [ -e "${headerFile:?}" ] || { printError "No such file: ${headerFile:?}"; exit 1; } ;;
+ esac
+
+ # Check the footer file.
+ case "${footerFile:?}" in
+ # If the file value equals "-", use stdin.
+ '-') footerFile="$(createTemp 'file')"; cat <&0 > "${footerFile:?}" ;;
+ # If the file value equals "none", use an empty file.
+ 'none') footerFile="$(createTemp 'file')" ;;
+ # If the file value equals "builtin", use the built-in value.
+ 'builtin') footerFile="$(createTemp 'file')"; printf '%s' "${HBLOCK_FOOTER_BUILTIN?}" > "${footerFile:?}" ;;
+ # If the file does not exist, throw an error.
+ *) [ -e "${footerFile:?}" ] || { printError "No such file: ${footerFile:?}"; exit 1; } ;;
+ esac
+
+ # Check the sources file.
+ case "${sourcesFile:?}" in
+ # If the file value equals "-", use stdin.
+ '-') sourcesFile="$(createTemp 'file')"; cat <&0 > "${sourcesFile:?}" ;;
+ # If the file value equals "none", use an empty file.
+ 'none') sourcesFile="$(createTemp 'file')" ;;
+ # If the file value equals "builtin", use the built-in value.
+ 'builtin') sourcesFile="$(createTemp 'file')"; printf '%s' "${HBLOCK_SOURCES_BUILTIN?}" > "${sourcesFile:?}" ;;
+ # If the file does not exist, throw an error.
+ *) [ -e "${sourcesFile:?}" ] || { printError "No such file: ${sourcesFile:?}"; exit 1; } ;;
+ esac
+
+ # Check the allowlist file.
+ case "${allowlistFile:?}" in
+ # If the file value equals "-", use stdin.
+ '-') allowlistFile="$(createTemp 'file')"; cat <&0 > "${allowlistFile:?}" ;;
+ # If the file value equals "none", use an empty file.
+ 'none') allowlistFile="$(createTemp 'file')" ;;
+ # If the file value equals "builtin", use the built-in value.
+ 'builtin') allowlistFile="$(createTemp 'file')"; printf '%s' "${HBLOCK_ALLOWLIST_BUILTIN?}" > "${allowlistFile:?}" ;;
+ # If the file does not exist, throw an error.
+ *) [ -e "${allowlistFile:?}" ] || { printError "No such file: ${allowlistFile:?}"; exit 1; } ;;
+ esac
+
+ # Check the denylist file.
+ case "${denylistFile:?}" in
+ # If the file value equals "-", use stdin.
+ '-') denylistFile="$(createTemp 'file')"; cat <&0 > "${denylistFile:?}" ;;
+ # If the file value equals "none", use an empty file.
+ 'none') denylistFile="$(createTemp 'file')" ;;
+ # If the file value equals "builtin", use the built-in value.
+ 'builtin') denylistFile="$(createTemp 'file')"; printf '%s' "${HBLOCK_DENYLIST_BUILTIN?}" > "${denylistFile:?}" ;;
+ # If the file does not exist, throw an error.
+ *) [ -e "${denylistFile:?}" ] || { printError "No such file: ${denylistFile:?}"; exit 1; } ;;
+ esac
+
+ # Create an empty blocklist file.
+ blocklistFile="$(createTemp 'file')"
+
+ # If the sources file is not empty, each source is downloaded and appended to the blocklist file.
+ if [ -s "${sourcesFile:?}" ]; then
+ printInfo 'Downloading sources'
+
+ sourcesDlDir="$(createTemp 'dir')"
+ sourcesUrlFile="$(createTemp 'file')"
+
+ # Read the sources file ignoring comments or empty lines.
+ removeComments < "${sourcesFile:?}" > "${sourcesUrlFile:?}"
+
+ while IFS= read -r url || [ -n "${url?}" ]; do
+ # Wait if the number of running jobs exceeds the concurrency limit.
+ if [ "${parallel:?}" -gt '0' ]; then
+ while [ "${parallel:?}" -le "$(dirCount "${sourcesDlDir:?}"/*.part)" ]; do
+ # POSIX does not specify the "-n" option, wait for the last PID as fallback.
+ # shellcheck disable=SC3045
+ wait -n 2>/dev/null || wait "${!}"
+ done
+ fi
+
+ # Initialize the download job and send it to the background.
+ printList "${url:?}"
+ sourceDlFile="${sourcesDlDir:?}"/"$(rand)"
+ touch -- "${sourceDlFile:?}.part"
+ {
+ if fetchUrl "${url:?}" > "${sourceDlFile:?}.part"; then
+ if [ -e "${sourceDlFile:?}.part" ]; then
+ printf '\n' >> "${sourceDlFile:?}.part"
+ mv -- "${sourceDlFile:?}.part" "${sourceDlFile:?}"
+ fi
+ else
+ rm -f -- "${sourceDlFile:?}.part"
+ if [ "${continue:?}" = 'true' ]; then
+ printWarn "Cannot obtain source: ${url:?}"
+ else
+ printError "Cannot obtain source: ${url:?}"
+ { kill "${$}"; exit 1; } 2>/dev/null
+ fi
+ fi
+ } &
+ done < "${sourcesUrlFile:?}"
+ wait
+
+ # Append downloaded sources to the blocklist file.
+ cat -- "${sourcesDlDir:?}"/* >> "${blocklistFile:?}"
+ rm -rf -- "${sourcesDlDir:?}"
+ fi
+
+ # If the denylist file is not empty, it is appended to the blocklist file.
+ if [ -s "${denylistFile:?}" ]; then
+ printInfo 'Applying denylist'
+ cat -- "${denylistFile:?}" >> "${blocklistFile:?}"
+ fi
+
+ # If the blocklist file is not empty, it is sanitized.
+ if [ -s "${blocklistFile:?}" ]; then
+ printInfo 'Sanitizing blocklist'
+ sanitizeBlocklist "${lenient:?}" < "${blocklistFile:?}" | removeReservedTLDs | sponge "${blocklistFile:?}"
+ fi
+
+ # If the allowlist file is not empty, the entries on it are removed from the blocklist file.
+ if [ -s "${allowlistFile:?}" ]; then
+ printInfo 'Applying allowlist'
+ allowlistPatternFile="$(createTemp 'file')"
+ # Entries are treated as regexes depending on whether the regex option is enabled.
+ removeComments < "${allowlistFile:?}" >> "${allowlistPatternFile:?}"
+ if [ "${regex:?}" = 'true' ]; then
+ grep -vf "${allowlistPatternFile:?}" -- "${blocklistFile:?}" | sponge "${blocklistFile:?}"
+ else
+ grep -Fxvf "${allowlistPatternFile:?}" -- "${blocklistFile:?}" | sponge "${blocklistFile:?}"
+ fi
+ rm -f -- "${allowlistPatternFile:?}"
+ fi
+
+ # If the blocklist file is not empty, it is filtered and sorted.
+ if [ -s "${blocklistFile:?}" ]; then
+ if [ "${filterSubdomains:?}" = 'true' ]; then
+ printInfo 'Filtering redundant subdomains'
+ awkReverseScript="$(cat <<-'EOF'
+ BEGIN { FS = "." }
+ {
+ for (i = NF; i > 0; i--) {
+ printf("%s%s", $i, (i > 1 ? FS : RS))
+ }
+ }
+ EOF
+ )"
+ awkFilterScript="$(cat <<-'EOF'
+ BEGIN { p = "." }
+ {
+ if (index($0, p) != 1) {
+ print($0); p = $0"."
+ }
+ }
+ EOF
+ )"
+ awk "${awkReverseScript:?}" < "${blocklistFile:?}" | sort \
+ | awk "${awkFilterScript:?}" | awk "${awkReverseScript:?}" \
+ | sponge "${blocklistFile:?}"
+ fi
+
+ printInfo 'Sorting blocklist'
+ sort < "${blocklistFile:?}" | uniq | sponge "${blocklistFile:?}"
+ fi
+
+ # Count blocked domains.
+ blocklistCount="$(wc -l < "${blocklistFile:?}" | awk '{print($1)}')"
+
+ # If the blocklist file is not empty, the format template is applied.
+ if [ -s "${blocklistFile:?}" ]; then
+ printInfo 'Applying format template'
+ # The number of domains per line is equal to the value of the wrap option.
+ if [ "${wrap:?}" -gt '1' ]; then
+ awkWrapScript='{ORS=(NR%W?FS:RS)}1;END{if(NR%W){printf(RS)}}'
+ awk -v FS=' ' -v RS='\n' -v W="${wrap:?}" "${awkWrapScript:?}" < "${blocklistFile:?}" \
+ | sponge "${blocklistFile:?}"
+ fi
+ # The following awk script replaces in the template the variables starting with a % sign with their value.
+ awkTemplateScript="$(cat <<-'EOF'
+ BEGIN {
+ Tl = length(T); split(T, Ta, "")
+ for (i = 1; i <= Tl; i++) {
+ if (Ta[i] == "%") {
+ i++; if (Ta[i] == "D") { Vn[++Vl] = "D"; Vp[Vl] = i - 1 }
+ else if (Ta[i] == "R") { Vn[++Vl] = "R"; Vp[Vl] = i - 1 }
+ else if (Ta[i] == "%") { Vn[++Vl] = "%"; Vp[Vl] = i - 1 }
+ }
+ }
+ }
+ {
+ o = T
+ for (i = Vl; i > 0 ; i--) {
+ if (Vn[i] == "D") v = $0
+ else if (Vn[i] == "R") v = R
+ else if (Vn[i] == "%") v = "%"
+ else v = ""
+ o = substr(o, 1, Vp[i] - 1) v substr(o, Vp[i] + 2)
+ }
+ print(o)
+ }
+ EOF
+ )"
+ awk -v T="${template?}" -v R="${redirection?}" "${awkTemplateScript:?}" < "${blocklistFile:?}" \
+ | sponge "${blocklistFile:?}"
+ fi
+
+ printOutputFile() {
+ # Define "C" variable for convenience.
+ C="${comment?}"
+
+ # Append banner to the output file.
+ if [ -n "${C?}" ]; then
+ cat <<-EOF
+ ${C?} Generated with hBlock ${HBLOCK_VERSION:?} (${HBLOCK_REPOSITORY:?})
+ ${C?} Blocked domains: ${blocklistCount:?}
+ EOF
+ if [ -z "${SOURCE_DATE_EPOCH+x}" ]; then
+ cat <<-EOF
+ ${C?} Date: $(date)
+ EOF
+ fi
+ fi
+
+ # If the header file is not empty, it is appended to the output file.
+ if [ -s "${headerFile:?}" ]; then
+ [ -z "${C?}" ] || printf '\n%s\n' "${C?} BEGIN HEADER"
+ awk 1 < "${headerFile:?}"
+ [ -z "${C?}" ] || printf '%s\n' "${C?} END HEADER"
+ fi
+
+ # If the blocklist file is not empty, it is appended to the output file.
+ if [ -s "${blocklistFile:?}" ]; then
+ [ -z "${C?}" ] || printf '\n%s\n' "${C?} BEGIN BLOCKLIST"
+ awk 1 < "${blocklistFile:?}"
+ [ -z "${C?}" ] || printf '%s\n' "${C?} END BLOCKLIST"
+ fi
+
+ # If the footer file is not empty, it is appended to the output file.
+ if [ -s "${footerFile:?}" ]; then
+ [ -z "${C?}" ] || printf '\n%s\n' "${C?} BEGIN FOOTER"
+ awk 1 < "${footerFile:?}"
+ [ -z "${C?}" ] || printf '%s\n' "${C?} END FOOTER"
+ fi
+ }
+
+ # If the file name equals "-", print to stdout.
+ if [ "${outputFile:?}" = '-' ]; then
+ printOutputFile
+ # Try writing the file.
+ elif touch -- "${outputFile:?}" >/dev/null 2>&1; then
+ printOutputFile > "${outputFile:?}"
+ # If writing fails, try with sudo.
+ elif exists sudo && exists tee; then
+ printOutputFile | sudo tee -- "${outputFile:?}" >/dev/null
+ # Throw an error for everything else.
+ else
+ printError "Cannot write file: ${outputFile:?}"
+ exit 1
+ fi
+
+ printInfo "${blocklistCount:?} blocked domains!"
+}
+
+main "${@-}"
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/protools/hub b/PepDeb64/fusato/config/includes.installer/preseed/protools/hub
new file mode 100755
index 0000000..87040c9
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/protools/hub
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+python3 ~/.local/share/pmostools/peptools/hub.py
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/protools/kumo b/PepDeb64/fusato/config/includes.installer/preseed/protools/kumo
new file mode 100755
index 0000000..ad867c7
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/protools/kumo
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+python3 ~/.local/share/pmostools/peptools/kumo.py
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/protools/welcome b/PepDeb64/fusato/config/includes.installer/preseed/protools/welcome
new file mode 100755
index 0000000..092eef9
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/protools/welcome
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+python3 ~/.local/share/pmostools/peptools/welcome.py
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/protools/xDaily b/PepDeb64/fusato/config/includes.installer/preseed/protools/xDaily
new file mode 100755
index 0000000..1e72619
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/protools/xDaily
@@ -0,0 +1,211 @@
+#!/bin/bash
+
+PROGNAME="xDaily"
+[ "$USER" != "root" ] &&
+ echo -e "\t$PROGNAME must be run as root. \n\tOr with \`sudo $PROGNAME\` ." && exit
+
+### Our options are going to be
+# = "full output to the terminal, no stopping."
+# -i = "interactive"
+# -q = "interactive but suppressed output"
+OPTIND="0"
+for i in _quiet _interactive ; do unset -v $i ; done
+
+while getopts 'iq' OPTION; do
+ case "$OPTION" in
+ i)
+ _interactive="yes"
+ echo -e " Entering interactive mode\n"
+ break
+ ;;
+
+ q)
+ _quiet="yes"
+ echo -e " Entering interactive mode, without verbose output.\n"
+ break
+ ;;
+
+ ?)
+ echo "Usage: $(basename ${PROGNAME}) [-i = interactive] [-q = suppressed ouput]"
+ return 1
+ ;;
+ esac
+done
+
+[ "$(which nala)" ] && PkgMgr="nala" || PkgMgr="apt"
+
+see_it() {
+ [ "$_interactive" = "yes" ] && ( read -n1 -p " $_msg ? \"Y/n\" " answ
+ [ -z $answ ] || [ "$answ" = "y" ] || [ "$answ" = "Y" ] && echo &&
+ do_it &&
+ echo -e " $_msg - Completed.\n" ||
+ echo -e "\r $_msg - Skipped.\n" )
+}
+
+no_see() {
+ [ "$_quiet" = "yes" ] && ( read -n1 -p " $_msg ? \"Y/n\" " answ
+ [ -z $answ ] || [ "$answ" = "y" ] || [ "$answ" = "Y" ] && echo &&
+ do_it > /dev/null &&
+ echo -e " $_msg - Completed.\n" ||
+ echo -e "\r $_msg - Skipped.\n" )
+}
+
+run_it() {
+ [ "$_interactive" != "yes" ] && [ "$_quiet" != "yes" ] && (
+ echo -e "\n $_msg ." &&
+ do_it &&
+ echo -e " $_msg - Completed." )
+}
+
+# Begin xDaily command functions
+_update() {
+ _msg="Check apt repositories for Updates"
+ do_it() {
+ [ "$_quiet" != "yes" ] &&
+ $PkgMgr update ||
+ $PkgMgr update 2>&1 >/dev/null
+}
+ see_it
+ no_see
+ run_it
+}
+
+_upgradable() {
+ _msg="See upgradable packages"
+ do_it() {
+ [ "$_quiet" != "yes" ] &&
+ $PkgMgr list --upgradable ||
+ $PkgMgr list --upgradable 2>&1 >/dev/null
+}
+ see_it
+# no_see
+# run_it
+}
+
+_upgrade() {
+ _msg="Install available updated packages"
+ do_it() {
+ [ "$_quiet" != "yes" ] &&
+ $PkgMgr upgrade ||
+ $PkgMgr upgrade 2>&1 >/dev/null
+}
+ see_it
+ no_see
+ run_it
+}
+
+_apt_clean() {
+ _msg="Remove unneccessary packages from APT cache"
+ do_it() {
+ [ "$_quiet" != "yes" ] &&
+ $PkgMgr clean ||
+ $PkgMgr clean 2>&1 >/dev/null
+}
+ see_it
+ no_see
+ run_it
+}
+
+_autoclean () {
+ _msg="Remove unavailable entries from APT cache"
+ do_it() {
+ [ "$_quiet" != "yes" ] &&
+ $PkgMgr autoclean ||
+ $PkgMgr autoclean 2>&1 >/dev/null
+}
+ see_it
+ no_see
+ run_it
+}
+
+_autoremove() {
+ _msg="Remove old dependencies not required by the system"
+ do_it() {
+ [ "$_quiet" != "yes" ] &&
+ $PkgMgr autoremove ||
+ $PkgMgr autoremove 2>&1 >/dev/null
+}
+ see_it
+ no_see
+ run_it
+}
+
+_clear_thumbnails() {
+ _msg="Clear browser thumbnail caches"
+ do_it() {
+ for i in ".thumbnails" ".cache/thumbnails" ; do
+ for j in "*/*.png" "*/*/*.png" ; do
+ [ "$_quiet" != "yes" ] &&
+ rm -v /home/${SUDO_USER}/${i}/${j} 2>/dev/null ||
+ rm /home/${SUDO_USER}/${i}/${j} 2>/dev/null
+ done
+ done ; true
+ }
+ see_it
+ no_see
+ run_it
+}
+
+_clear_recents() {
+ _msg="Clear the \"Recently Used\" list in FireFox"
+ do_it() {
+ dd bs=1 count=1 status=none if=/dev/null of=/home/${SUDO_USER}/.local/share/recently-used.xbel
+ chown ${SUDO_USER} /home/${SUDO_USER}/.local/share/recently-used.xbel
+}
+ see_it
+ no_see
+ run_it
+}
+
+_rbranding() {
+ _msg="Reconfirm Peppermint Branding in os-release"
+ do_it() {
+ diff -q /opt/pepconf/os-release /usr/lib/os-release || cp /opt/pepconf/os-release /usr/lib/os-release
+ diff -q /opt/pepconf/os-release /etc/os-release || cp /opt/pepconf/os-release /etc/os-release
+ }
+ see_it
+ no_see
+ run_it
+}
+
+_ssd_trimfs() {
+ _msg="For SSDs: trim eligible ext2/3/4 filesystems"
+ do_it() {
+ for mnt in $(grep -E "(ext2|ext3|ext4)" /etc/mtab | cut -f2 -d" ")
+ do fstrim ${mnt} &>/dev/null &&
+ echo -e " Completed fstrim for \"${mnt}\"" ||
+ echo -e " No fstrim required for \"${mnt}\""
+ done
+ }
+ see_it
+ no_see
+ run_it
+}
+
+
+_udcache() {
+ _msg="Caching icons at /usr/share/icons/"
+ do_it() { update-icon-caches /usr/share/icons/* ;}
+ see_it
+ no_see
+ run_it
+}
+
+
+_update
+_upgradable
+_upgrade
+_apt_clean
+if [ "$PkgMgr" = "apt" ]; then _autoclean ; fi
+_autoremove
+_clear_thumbnails
+_clear_recents
+_udcache
+_rbranding
+_ssd_trimfs
+_ptools
+
+[ "$_interactive" = "yes" ] &&
+ read -n1 -p " Press any key to continue ... " answ
+echo
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/protools/xd.png b/PepDeb64/fusato/config/includes.installer/preseed/protools/xd.png
new file mode 100644
index 0000000..fe74207
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/protools/xd.png differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/INSTALLER b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/INSTALLER
new file mode 100644
index 0000000..a1b589e
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/LICENSE.txt b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/LICENSE.txt
new file mode 100644
index 0000000..0496023
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/LICENSE.txt
@@ -0,0 +1,48 @@
+PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
+--------------------------------------------
+
+1. This LICENSE AGREEMENT is between the Python Software Foundation
+("PSF"), and the Individual or Organization ("Licensee") accessing and
+otherwise using this software ("Python") in source or binary form and
+its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, PSF
+hereby grants Licensee a nonexclusive, royalty-free, world-wide
+license to reproduce, analyze, test, perform and/or display publicly,
+prepare derivative works, distribute, and otherwise use Python
+alone or in any derivative version, provided, however, that PSF's
+License Agreement and PSF's notice of copyright, i.e., "Copyright (c)
+2001, 2002, 2003, 2004 Python Software Foundation; All Rights Reserved"
+are retained in Python alone or in any derivative version prepared
+by Licensee.
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python.
+
+4. PSF is making Python available to Licensee on an "AS IS"
+basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. Nothing in this License Agreement shall be deemed to create any
+relationship of agency, partnership, or joint venture between PSF and
+Licensee. This License Agreement does not grant permission to use PSF
+trademarks or trade name in a trademark sense to endorse or promote
+products or services of Licensee, or any third party.
+
+8. By copying, installing or otherwise using Python, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/METADATA b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/METADATA
new file mode 100644
index 0000000..a4ce7d6
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/METADATA
@@ -0,0 +1,70 @@
+Metadata-Version: 2.1
+Name: tendo
+Version: 0.3.0
+Summary: A Python library that extends some core functionality
+Home-page: https://github.com/pycontribs/tendo
+Author: Sorin Sbarnea
+Author-email: sorin.sbarnea@gmail.com
+Maintainer: Sorin Sbarnea
+Maintainer-email: sorin.sbarnea@gmail.com
+Keywords: tendo,tee,unicode,colorer,singleton
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Other Environment
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: Information Technology
+Classifier: License :: OSI Approved :: Python Software Foundation License
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Internet :: WWW/HTTP
+Requires-Python: >=3.6
+Description-Content-Type: text/markdown
+License-File: LICENSE.txt
+Requires-Dist: six
+Provides-Extra: docs
+Requires-Dist: Sphinx (~=5.2.1) ; extra == 'docs'
+Requires-Dist: docutils (~=0.19) ; extra == 'docs'
+Requires-Dist: MarkupSafe (~=2.1.1) ; extra == 'docs'
+Provides-Extra: test
+Requires-Dist: coverage[toml] (>=6.5.0) ; extra == 'test'
+Requires-Dist: coveralls (~=3.3.1) ; extra == 'test'
+Requires-Dist: pre-commit (~=2.20.0) ; extra == 'test'
+Requires-Dist: pytest-cache (~=1.0) ; extra == 'test'
+Requires-Dist: pytest-cov (~=3.0.0) ; extra == 'test'
+Requires-Dist: pytest-html (~=3.1.1) ; extra == 'test'
+Requires-Dist: pytest-instafail (~=0.4.2) ; extra == 'test'
+Requires-Dist: pytest-xdist (~=2.5.0) ; extra == 'test'
+Requires-Dist: pytest (~=7.1.3) ; extra == 'test'
+Requires-Dist: wheel (~=0.37.1) ; extra == 'test'
+
+[![](https://img.shields.io/pypi/v/tendo.svg?colorB=green)](https://pypi.python.org/pypi/tendo/)
+[![](https://img.shields.io/codecov/c/github/pycontribs/tendo/main.svg)](https://codecov.io/gh/pycontribs/tendo)
+[![](https://readthedocs.org/projects/tendo/badge/?version=latest)](http://tendo.readthedocs.io)
+
+# tendo
+
+Tendo is a python module that adds basic functionality that is
+not provided by Python. Read the [documentation](https://tendo.readthedocs.org/en/latest/) for more info.
+
+- [transparent Unicode support for text file operations (BOM detection)](https://tendo.readthedocs.org/en/latest/#module-tendo.singleton)
+- [console logging coloring](https://tendo.readthedocs.org/en/latest/#module-tendo.colorer)
+- enable you to use symlinks under windows
+- [python tee implementation](https://tendo.readthedocs.org/en/latest/#module-tendo.colorer) for executing external programs and redirecting their output to both console/file
+- [improved execfile](https://tendo.readthedocs.org/en/latest/#module-tendo.execfile2)
+
+## Requirements and compatibility
+
+- python 3.6 or newer
+- tox for running tests
+
+## Related projects and packages
+
+- jaraco - http://pypi.python.org/pypi/jaraco.util
+- pexpect (maybe)
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/RECORD b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/RECORD
new file mode 100644
index 0000000..ffe7090
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/RECORD
@@ -0,0 +1,45 @@
+tendo-0.3.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+tendo-0.3.0.dist-info/LICENSE.txt,sha256=OxeG9HHdLhJfWm6Hf6fUu2LVhQIKMdkOI7aD8NDwnGk,2382
+tendo-0.3.0.dist-info/METADATA,sha256=3ND7DyJNzL42x9jdLXg65BuaiJe2bkSdWy-R0E3MJF8,3222
+tendo-0.3.0.dist-info/RECORD,,
+tendo-0.3.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+tendo-0.3.0.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
+tendo-0.3.0.dist-info/top_level.txt,sha256=mmQBS5KFPLIkGpS8uCmFiJxGLhsSSAInN47ST1KPjmc,6
+tendo/__init__.py,sha256=LiZKhNQTguXDtwYRvv3wOPrlXQ3tFXd17Mqc_uxaISU,569
+tendo/__pycache__/__init__.cpython-39.pyc,,
+tendo/__pycache__/_version.cpython-39.pyc,,
+tendo/__pycache__/ansiterm.cpython-39.pyc,,
+tendo/__pycache__/colorer.cpython-39.pyc,,
+tendo/__pycache__/execfile2.cpython-39.pyc,,
+tendo/__pycache__/singleton.cpython-39.pyc,,
+tendo/__pycache__/tee.cpython-39.pyc,,
+tendo/__pycache__/unicode.cpython-39.pyc,,
+tendo/_version.py,sha256=_UJonOENX4r-qwHEWuAPWP39KNmboa9_GnJ2v2Bb0P8,176
+tendo/ansiterm.py,sha256=SDX3yhayfzAWDU3n992kdAYKiFS8gRzTpINyjdv9q30,10910
+tendo/colorer.py,sha256=jsl_BEMwPND5fwPHPK3-Wdkx8TpvrtkLorK5iwIQDLY,5438
+tendo/execfile2.py,sha256=r1RWOnTwUGf7G009sXz1LdXp6VQ2fWJlGncajqkMPYM,1917
+tendo/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+tendo/singleton.py,sha256=uth-bsBUymT8UseXVSZ9iUrdaY7U5Qac-2-h9HBYE38,3265
+tendo/tee.py,sha256=gJYRskfTJCrYpNqWuONKAns5etVmbtl-z-rktN5e03E,8754
+tendo/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+tendo/tests/__pycache__/__init__.cpython-39.pyc,,
+tendo/tests/__pycache__/test_colorer.cpython-39.pyc,,
+tendo/tests/__pycache__/test_execfile2.cpython-39.pyc,,
+tendo/tests/__pycache__/test_singleton.cpython-39.pyc,,
+tendo/tests/__pycache__/test_tee.cpython-39.pyc,,
+tendo/tests/__pycache__/test_unicode.cpython-39.pyc,,
+tendo/tests/assets/full_sample_utf8_bom.txt,sha256=KkNqDwebtlS3xhAfplqf3tHcOObMmouytKn_4MroI0Q,49
+tendo/tests/assets/sample_ucs2_be.txt,sha256=__3Aog-FfxCuKo6NKHunfeRXGSpuUlXnARO3UBVP4VA,86
+tendo/tests/assets/sample_ucs2_le.txt,sha256=uJwfDIb4NO1UWXuwG02bCmcvB-4UIM4Z7VhOfKaEN-w,86
+tendo/tests/assets/sample_utf8.txt,sha256=C6RMLCgPWRPxEugZTJy3l4LTUVPq6nmR-cOt6aBvC9Q,9
+tendo/tests/assets/sample_utf8_bom.txt,sha256=1wfcaw-EIPdBGFtm8UFbI9WrzVbq0sXN8JQXauJIUEI,57
+tendo/tests/assets/utf8-after-append.txt,sha256=cpkiZTGrK8QbpxjMn2YZ1vhzhs4wLN5iyqXAuLKuZ78,79
+tendo/tests/assets/utf8-invalid.txt,sha256=2RYQGQO5gNv5DuyEk4huGwQ6tzxjT-Gz_3NcbyOXufQ,20334
+tendo/tests/assets/utf8.txt,sha256=EBPTlbkWEzl0touJx-LcPMYwApkP432FqDxX-6YOmdU,17
+tendo/tests/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+tendo/tests/test_colorer.py,sha256=qWk_-ntdZtL3bLV_Q1tWUuK3-UwTGgL7DdUwEpdG2i0,1170
+tendo/tests/test_execfile2.py,sha256=SXYLMnOX-HB_5pjpd_0D_HOnbn6E-yBqURup8CB0Zn4,1171
+tendo/tests/test_singleton.py,sha256=8d8ujn7JMxzSsDImJS2MGNMPXcdS_BMpR2GZK4s5BeU,1624
+tendo/tests/test_tee.py,sha256=RFVdrFXYqQuE8VXRxLunjnhoXYc2zd0lxuqz4L1MhpI,1283
+tendo/tests/test_unicode.py,sha256=96ZV5MkMgXu8qw7ojQ20zUWD6bIJb_akyLGXoZ-5hQs,1373
+tendo/unicode.py,sha256=oxBES0O3NmqkSJ9_nPI_dxCw3a9lR95-EjrTBRNBavs,3124
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/REQUESTED b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/REQUESTED
new file mode 100644
index 0000000..e69de29
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/WHEEL b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/WHEEL
new file mode 100644
index 0000000..becc9a6
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.37.1)
+Root-Is-Purelib: true
+Tag: py3-none-any
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/top_level.txt b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/top_level.txt
new file mode 100644
index 0000000..e187ff8
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo-0.3.0.dist-info/top_level.txt
@@ -0,0 +1 @@
+tendo
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__init__.py b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__init__.py
new file mode 100644
index 0000000..60d03ed
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__init__.py
@@ -0,0 +1,18 @@
+#!/usr/bin/env python
+# Licensed to PSF under a Contributor Agreement.
+# See http://www.python.org/psf/license for licensing details.
+from __future__ import absolute_import
+import sys
+
+from ._version import __version__
+
+__author__ = "Sorin Sbarnea"
+__copyright__ = "Copyright 2010-2022, Sorin Sbarnea"
+__email__ = "sorin.sbarnea@gmail.com"
+__status__ = "Production"
+__all__ = ('tee', 'colorer', 'unicode',
+ 'execfile2', 'singleton', 'ansiterm', '__version__')
+
+
+if sys.hexversion < 0x02050000:
+ sys.exit("Python 2.5 or newer is required by tendo module.")
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/__init__.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 0000000..68d1322
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/__init__.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/_version.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/_version.cpython-39.pyc
new file mode 100644
index 0000000..f74798c
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/_version.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/ansiterm.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/ansiterm.cpython-39.pyc
new file mode 100644
index 0000000..b605117
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/ansiterm.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/colorer.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/colorer.cpython-39.pyc
new file mode 100644
index 0000000..1d58f00
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/colorer.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/execfile2.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/execfile2.cpython-39.pyc
new file mode 100644
index 0000000..bc63166
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/execfile2.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/singleton.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/singleton.cpython-39.pyc
new file mode 100644
index 0000000..199d3b0
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/singleton.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/tee.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/tee.cpython-39.pyc
new file mode 100644
index 0000000..9a0d052
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/tee.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/unicode.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/unicode.cpython-39.pyc
new file mode 100644
index 0000000..1695e92
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/__pycache__/unicode.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/_version.py b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/_version.py
new file mode 100644
index 0000000..8b0af9c
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/_version.py
@@ -0,0 +1,5 @@
+# coding: utf-8
+# file generated by setuptools_scm
+# don't change, don't track in version control
+__version__ = version = '0.3.0'
+__version_tuple__ = version_tuple = (0, 3, 0)
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/ansiterm.py b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/ansiterm.py
new file mode 100644
index 0000000..b0647b4
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/ansiterm.py
@@ -0,0 +1,273 @@
+#!/usr/bin/env python
+# Originally from http://waf.googlecode.com/svn/trunk/waflib/ansiterm.py
+import os
+import sys
+
+
+try:
+ if (not sys.stderr.isatty()) or (not sys.stdout.isatty()):
+ raise ValueError('not a tty')
+
+ import ctypes
+ from ctypes import byref
+ from ctypes import c_char
+ from ctypes import c_int
+ from ctypes import c_short
+ from ctypes import windll
+
+ class COORD(ctypes.Structure):
+ _fields_ = [("X", c_short), ("Y", c_short)]
+
+ class SMALL_RECT(ctypes.Structure):
+ _fields_ = [("Left", c_short), ("Top", c_short),
+ ("Right", c_short), ("Bottom", c_short)]
+
+ class CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
+ _fields_ = [("Size", COORD), ("CursorPosition", COORD), ("Attributes",
+ c_short), ("Window", SMALL_RECT), ("MaximumWindowSize", COORD)]
+
+ class CONSOLE_CURSOR_INFO(ctypes.Structure):
+ _fields_ = [('dwSize', ctypes.c_ulong), ('bVisible', c_int)]
+
+ sbinfo = CONSOLE_SCREEN_BUFFER_INFO()
+ csinfo = CONSOLE_CURSOR_INFO()
+ hconsole = windll.kernel32.GetStdHandle(-11)
+ windll.kernel32.GetConsoleScreenBufferInfo(hconsole, byref(sbinfo))
+ if sbinfo.Size.X < 10 or sbinfo.Size.Y < 10:
+ raise Exception('small console')
+ windll.kernel32.GetConsoleCursorInfo(hconsole, byref(csinfo))
+except Exception:
+ pass
+else:
+ import re
+ import threading
+
+ from six import text_type
+
+ def to_int(number, default):
+ return number and int(number) or default
+ wlock = threading.Lock()
+
+ STD_OUTPUT_HANDLE = -11
+ STD_ERROR_HANDLE = -12
+
+ class AnsiTerm(object):
+
+ def __init__(self):
+ self.encoding = sys.stdout.encoding
+ self.hconsole = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
+ self.cursor_history = []
+ self.orig_sbinfo = CONSOLE_SCREEN_BUFFER_INFO()
+ self.orig_csinfo = CONSOLE_CURSOR_INFO()
+ windll.kernel32.GetConsoleScreenBufferInfo(
+ self.hconsole, byref(self.orig_sbinfo))
+ windll.kernel32.GetConsoleCursorInfo(
+ hconsole, byref(self.orig_csinfo))
+
+ def screen_buffer_info(self):
+ sbinfo = CONSOLE_SCREEN_BUFFER_INFO()
+ windll.kernel32.GetConsoleScreenBufferInfo(
+ self.hconsole, byref(sbinfo))
+ return sbinfo
+
+ def clear_line(self, param):
+ mode = param and int(param) or 0
+ sbinfo = self.screen_buffer_info()
+ if mode == 1: # Clear from begining of line to cursor position
+ line_start = COORD(0, sbinfo.CursorPosition.Y)
+ line_length = sbinfo.Size.X
+ elif mode == 2: # Clear entire line
+ line_start = COORD(
+ sbinfo.CursorPosition.X, sbinfo.CursorPosition.Y)
+ line_length = sbinfo.Size.X - sbinfo.CursorPosition.X
+ else: # Clear from cursor position to end of line
+ line_start = sbinfo.CursorPosition
+ line_length = sbinfo.Size.X - sbinfo.CursorPosition.X
+ chars_written = c_int()
+ windll.kernel32.FillConsoleOutputCharacterA(
+ self.hconsole, c_char(' '), line_length, line_start, byref(chars_written))
+ windll.kernel32.FillConsoleOutputAttribute(
+ self.hconsole, sbinfo.Attributes, line_length, line_start, byref(chars_written))
+
+ def clear_screen(self, param):
+ mode = to_int(param, 0)
+ sbinfo = self.screen_buffer_info()
+ if mode == 1: # Clear from begining of screen to cursor position
+ clear_start = COORD(0, 0)
+ clear_length = sbinfo.CursorPosition.X * \
+ sbinfo.CursorPosition.Y
+ elif mode == 2: # Clear entire screen and return cursor to home
+ clear_start = COORD(0, 0)
+ clear_length = sbinfo.Size.X * sbinfo.Size.Y
+ windll.kernel32.SetConsoleCursorPosition(
+ self.hconsole, clear_start)
+ else: # Clear from cursor position to end of screen
+ clear_start = sbinfo.CursorPosition
+ clear_length = sbinfo.Size.X - sbinfo.CursorPosition.X + \
+ sbinfo.Size.X * (sbinfo.Size.Y - sbinfo.CursorPosition.Y)
+ chars_written = c_int()
+ windll.kernel32.FillConsoleOutputCharacterA(
+ self.hconsole, c_char(' '), clear_length, clear_start, byref(chars_written))
+ windll.kernel32.FillConsoleOutputAttribute(
+ self.hconsole, sbinfo.Attributes, clear_length, clear_start, byref(chars_written))
+
+ def push_cursor(self, param):
+ sbinfo = self.screen_buffer_info()
+ self.cursor_history.push(sbinfo.CursorPosition)
+
+ def pop_cursor(self, param):
+ if self.cursor_history:
+ old_pos = self.cursor_history.pop()
+ windll.kernel32.SetConsoleCursorPosition(
+ self.hconsole, old_pos)
+
+ def set_cursor(self, param):
+ x, sep, y = param.partition(';')
+ x = to_int(x, 1) - 1
+ y = to_int(y, 1) - 1
+ sbinfo = self.screen_buffer_info()
+ new_pos = COORD(
+ min(max(0, x), sbinfo.Size.X),
+ min(max(0, y), sbinfo.Size.Y)
+ )
+ windll.kernel32.SetConsoleCursorPosition(self.hconsole, new_pos)
+
+ def set_column(self, param):
+ x = to_int(param, 1) - 1
+ sbinfo = self.screen_buffer_info()
+ new_pos = COORD(
+ min(max(0, x), sbinfo.Size.X),
+ sbinfo.CursorPosition.Y
+ )
+ windll.kernel32.SetConsoleCursorPosition(self.hconsole, new_pos)
+
+ def move_cursor(self, x_offset=0, y_offset=0):
+ sbinfo = self.screen_buffer_info()
+ new_pos = COORD(
+ min(max(0, sbinfo.CursorPosition.X + x_offset), sbinfo.Size.X),
+ min(max(0, sbinfo.CursorPosition.Y + y_offset), sbinfo.Size.Y)
+ )
+ windll.kernel32.SetConsoleCursorPosition(self.hconsole, new_pos)
+
+ def move_up(self, param):
+ self.move_cursor(y_offset=-to_int(param, 1))
+
+ def move_down(self, param):
+ self.move_cursor(y_offset=to_int(param, 1))
+
+ def move_left(self, param):
+ self.move_cursor(x_offset=-to_int(param, 1))
+
+ def move_right(self, param):
+ self.move_cursor(x_offset=to_int(param, 1))
+
+ def next_line(self, param):
+ sbinfo = self.screen_buffer_info()
+ self.move_cursor(
+ x_offset=-sbinfo.CursorPosition.X,
+ y_offset=to_int(param, 1)
+ )
+
+ def prev_line(self, param):
+ sbinfo = self.screen_buffer_info()
+ self.move_cursor(
+ x_offset=-sbinfo.CursorPosition.X,
+ y_offset=-to_int(param, 1)
+ )
+
+ escape_to_color = {(0, 30): 0x0, # black
+ (0, 31): 0x4, # red
+ (0, 32): 0x2, # green
+ (0, 33): 0x4 + 0x2, # dark yellow
+ (0, 34): 0x1, # blue
+ (0, 35): 0x1 + 0x4, # purple
+ (0, 36): 0x2 + 0x4, # cyan
+ (0, 37): 0x1 + 0x2 + 0x4, # grey
+ (1, 30): 0x1 + 0x2 + 0x4, # dark gray
+ (1, 31): 0x4 + 0x8, # red
+ (1, 32): 0x2 + 0x8, # light green
+ (1, 33): 0x4 + 0x2 + 0x8, # yellow
+ (1, 34): 0x1 + 0x8, # light blue
+ (1, 35): 0x1 + 0x4 + 0x8, # light purple
+ (1, 36): 0x1 + 0x2 + 0x8, # light cyan
+ (1, 37): 0x1 + 0x2 + 0x4 + 0x8, # white
+ }
+
+ def set_color(self, param):
+ cols = param.split(';')
+ attr = self.orig_sbinfo.Attributes
+ for c in cols:
+ c = to_int(c, 0)
+ if c in range(30, 38):
+ attr = (attr & 0xf0) | (
+ self.escape_to_color.get((0, c), 0x7))
+ elif c in range(40, 48):
+ attr = (attr & 0x0f) | (
+ self.escape_to_color.get((0, c), 0x7) << 8)
+ elif c in range(90, 98):
+ attr = (attr & 0xf0) | (
+ self.escape_to_color.get((1, c - 60), 0x7))
+ elif c in range(100, 108):
+ attr = (attr & 0x0f) | (
+ self.escape_to_color.get((1, c - 60), 0x7) << 8)
+ elif c == 1:
+ attr |= 0x08
+ windll.kernel32.SetConsoleTextAttribute(self.hconsole, attr)
+
+ def show_cursor(self, param):
+ csinfo.bVisible = 1
+ windll.kernel32.SetConsoleCursorInfo(self.hconsole, byref(csinfo))
+
+ def hide_cursor(self, param):
+ csinfo.bVisible = 0
+ windll.kernel32.SetConsoleCursorInfo(self.hconsole, byref(csinfo))
+
+ ansi_command_table = {
+ 'A': move_up,
+ 'B': move_down,
+ 'C': move_right,
+ 'D': move_left,
+ 'E': next_line,
+ 'F': prev_line,
+ 'G': set_column,
+ 'H': set_cursor,
+ 'f': set_cursor,
+ 'J': clear_screen,
+ 'K': clear_line,
+ 'h': show_cursor,
+ 'l': hide_cursor,
+ 'm': set_color,
+ 's': push_cursor,
+ 'u': pop_cursor,
+ }
+ # Match either the escape sequence or text not containing escape
+ # sequence
+ ansi_tokans = re.compile(r'(?:\x1b\[([0-9?;]*)([a-zA-Z])|([^\x1b]+))')
+
+ def write(self, text):
+ try:
+ wlock.acquire()
+ for param, cmd, txt in self.ansi_tokans.findall(text):
+ if cmd:
+ cmd_func = self.ansi_command_table.get(cmd)
+ if cmd_func:
+ cmd_func(self, param)
+ else:
+ chars_written = c_int()
+ if isinstance(txt, text_type):
+ windll.kernel32.WriteConsoleW(
+ self.hconsole, txt, len(txt), byref(chars_written), None)
+ else:
+ windll.kernel32.WriteConsoleA(
+ self.hconsole, txt, len(txt), byref(chars_written), None)
+ finally:
+ wlock.release()
+
+ def flush(self):
+ pass
+
+ def isatty(self):
+ return True
+
+ sys.stderr = sys.stdout = AnsiTerm()
+ os.environ['TERM'] = 'vt100'
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/colorer.py b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/colorer.py
new file mode 100644
index 0000000..7a3f23b
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/colorer.py
@@ -0,0 +1,142 @@
+#!/usr/bin/env python
+# encoding: utf-8
+
+"""
+Colorer does enable colored logging messages by using `ANSI escape sequences `_.
+
+Under Windows, where the escapes are not supported it does use the Windows API.
+
+The colored output is generated only when the console is a terminal supporting it, so if you redirect the output to a log file you will not see the escape codes in the file.
+
+>>> import colorer, logging
+... logging.error("red line")
+... logging.warn("yellow line")
+... logging.info("gray line")
+... logging.debug("magenta line")
+"""
+import copy
+import logging
+import os
+import six
+import sys
+
+
+if (hasattr(sys.stderr, "isatty") and sys.stderr.isatty()) or \
+ ('TERM' in os.environ.keys() and os.environ['TERM'] in ['linux']) or \
+ ('PYCHARM_HOSTED' in os.environ.keys()):
+
+ # Why stderr and not stdout? - because python logging module does output to stderr by default and not stdout.
+ # now we patch Python code to add color support to logging.StreamHandler
+ def add_coloring_to_emit_windows(fn):
+ # add methods we need to the class
+ def _out_handle(self):
+ import ctypes
+ return ctypes.windll.kernel32.GetStdHandle(self.STD_OUTPUT_HANDLE)
+
+ def _set_color(self, code):
+ import ctypes
+ # Constants from the Windows API
+ self.STD_OUTPUT_HANDLE = -11
+ hdl = ctypes.windll.kernel32.GetStdHandle(self.STD_OUTPUT_HANDLE)
+ ctypes.windll.kernel32.SetConsoleTextAttribute(hdl, code)
+
+ setattr(logging.StreamHandler, '_set_color', _set_color)
+
+ def new(*args):
+ FOREGROUND_BLUE = 0x0001 # text color contains blue.
+ FOREGROUND_GREEN = 0x0002 # text color contains green.
+ FOREGROUND_RED = 0x0004 # text color contains red.
+ FOREGROUND_INTENSITY = 0x0008 # text color is intensified.
+ FOREGROUND_WHITE = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED
+ # winbase.h
+ # STD_INPUT_HANDLE = -10
+ # STD_OUTPUT_HANDLE = -11
+ # STD_ERROR_HANDLE = -12
+
+ # wincon.h
+ # FOREGROUND_BLACK = 0x0000
+ FOREGROUND_BLUE = 0x0001
+ FOREGROUND_GREEN = 0x0002
+ # FOREGROUND_CYAN = 0x0003
+ FOREGROUND_RED = 0x0004
+ FOREGROUND_MAGENTA = 0x0005
+ FOREGROUND_YELLOW = 0x0006
+ # FOREGROUND_GREY = 0x0007
+ FOREGROUND_INTENSITY = 0x0008 # foreground color is intensified.
+
+ # BACKGROUND_BLACK = 0x0000
+ # BACKGROUND_BLUE = 0x0010
+ # BACKGROUND_GREEN = 0x0020
+ # BACKGROUND_CYAN = 0x0030
+ # BACKGROUND_RED = 0x0040
+ # BACKGROUND_MAGENTA = 0x0050
+ BACKGROUND_YELLOW = 0x0060
+ # BACKGROUND_GREY = 0x0070
+ BACKGROUND_INTENSITY = 0x0080 # background color is intensified.
+
+ levelno = args[1].levelno
+ if levelno >= 50:
+ color = BACKGROUND_YELLOW | FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_INTENSITY
+ elif levelno >= 40:
+ color = FOREGROUND_RED | FOREGROUND_INTENSITY
+ elif levelno >= 30:
+ color = FOREGROUND_YELLOW | FOREGROUND_INTENSITY
+ elif levelno >= 20:
+ color = FOREGROUND_GREEN
+ elif levelno >= 10:
+ color = FOREGROUND_MAGENTA
+ else:
+ color = FOREGROUND_WHITE
+ args[0]._set_color(color)
+
+ ret = fn(*args)
+ args[0]._set_color(FOREGROUND_WHITE)
+ # print "after"
+ return ret
+ return new
+
+ def add_coloring_to_emit_ansi(fn):
+ # add methods we need to the class
+ def new(*args):
+ # new_args = args
+ if len(args) == 2:
+ new_args = (args[0], copy.copy(args[1]))
+ else:
+ new_args = (args[0], copy.copy(args[1]), args[2:])
+ if hasattr(args[0], 'baseFilename'):
+ return fn(*args)
+ levelno = new_args[1].levelno
+ if levelno >= 50:
+ color = '\x1b[31m' # red
+ elif levelno >= 40:
+ color = '\x1b[31m' # red
+ elif levelno >= 30:
+ color = '\x1b[33m' # yellow
+ elif levelno >= 20:
+ color = '\x1b[32m' # green
+ elif levelno >= 10:
+ color = '\x1b[35m' # pink
+ else:
+ color = '\x1b[0m' # normal
+ try:
+ new_args[
+ 1].msg = color + six.text_type(new_args[1].msg) + '\x1b[0m' # normal
+ except Exception as e:
+ raise e
+ return fn(*new_args)
+ return new
+
+ import platform
+ if platform.system() == 'Windows':
+ # Windows does not support ANSI escapes and we are using API calls to
+ # set the console color
+ logging.StreamHandler.emit = add_coloring_to_emit_windows(
+ logging.StreamHandler.emit)
+ else:
+ # all non-Windows platforms are supporting ANSI escapes so we use them
+ logging.StreamHandler.emit = add_coloring_to_emit_ansi(
+ logging.StreamHandler.emit)
+ # log = logging.getLogger()
+ # log.addFilter(log_filter())
+ # //hdlr = logging.StreamHandler()
+ # //hdlr.setFormatter(formatter())
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/execfile2.py b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/execfile2.py
new file mode 100644
index 0000000..bd413fa
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/execfile2.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+import shlex
+import sys
+
+if sys.hexversion > 0x03000000:
+ def execfile(file, globals=globals(), locals=locals()):
+ fh = open(file, "r")
+ if not fh:
+ raise Exception("Unable to open %s." % file)
+ exec(fh.read() + "\n", globals, locals)
+
+
+def execfile2(filename, _globals=dict(), _locals=dict(), cmd=None, quiet=False):
+ """Execute a Python script using :py:func:`execfile`.
+
+ In addition to Python :py:func:`execfile` this method can temporary change the argv params.
+
+ This enables you to call an external python script that requires
+ command line arguments without leaving current python interpretor.
+
+ `cmd` can be a string with command line arguments or a list or arguments
+
+ The return value is a numeric exit code similar to the one used for command line tools:
+
+ - 0 - if succesfull; this applies if script receives SystemExit with error code 0
+ - 1 - if SystemExit does not contain an error code or if other Exception is received.
+ - x - the SystemExit error code (if present)
+ """
+ _globals['__name__'] = '__main__'
+ saved_argv = sys.argv # we save sys.argv
+ if cmd:
+ sys.argv = list([filename])
+ if isinstance(cmd, list):
+ sys.argv.append(cmd)
+ else:
+ sys.argv.extend(shlex.split(cmd))
+ exit_code = 0
+ try:
+ exec(
+ compile(open(filename).read(), filename, 'exec'), _globals, _locals)
+
+ except SystemExit:
+ type, e, tb = sys.exc_info()
+ if isinstance(e.code, int):
+ exit_code = e.code # this could be 0 if you do sys.exit(0)
+ else:
+ exit_code = 1
+ except Exception:
+ if not quiet:
+ import traceback
+ traceback.print_exc(file=sys.stderr)
+ exit_code = 1
+ finally:
+ if cmd:
+ sys.argv = saved_argv # we restore sys.argv
+ return exit_code
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/py.typed b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/py.typed
new file mode 100644
index 0000000..e69de29
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/singleton.py b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/singleton.py
new file mode 100644
index 0000000..7668ced
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/singleton.py
@@ -0,0 +1,92 @@
+#! /usr/bin/env python
+
+import logging
+import os
+import sys
+import tempfile
+
+
+if sys.platform != "win32":
+ import fcntl
+
+
+class SingleInstanceException(BaseException):
+ pass
+
+
+class SingleInstance(object):
+
+ """Class that can be instantiated only once per machine.
+
+ If you want to prevent your script from running in parallel just instantiate SingleInstance() class. If is there another instance already running it will throw a `SingleInstanceException`.
+
+ >>> import tendo
+ ... me = SingleInstance()
+
+ This option is very useful if you have scripts executed by crontab at small amounts of time.
+
+ Remember that this works by creating a lock file with a filename based on the full path to the script file.
+
+ Providing a flavor_id will augment the filename with the provided flavor_id, allowing you to create multiple singleton instances from the same file. This is particularly useful if you want specific functions to have their own singleton instances.
+ """
+
+ def __init__(self, flavor_id="", lockfile=""):
+ self.initialized = False
+ if lockfile:
+ self.lockfile = lockfile
+ else:
+ basename = os.path.splitext(os.path.abspath(sys.argv[0]))[0].replace(
+ "/", "-").replace(":", "").replace("\\", "-") + '-%s' % flavor_id + '.lock'
+ self.lockfile = os.path.normpath(
+ tempfile.gettempdir() + '/' + basename)
+
+ logger.debug("SingleInstance lockfile: " + self.lockfile)
+ if sys.platform == 'win32':
+ try:
+ # file already exists, we try to remove (in case previous
+ # execution was interrupted)
+ if os.path.exists(self.lockfile):
+ os.unlink(self.lockfile)
+ self.fd = os.open(
+ self.lockfile, os.O_CREAT | os.O_EXCL | os.O_RDWR)
+ except OSError:
+ type, e, tb = sys.exc_info()
+ if e.errno == 13:
+ logger.error(
+ "Another instance is already running, quitting.")
+ raise SingleInstanceException()
+ print(e.errno)
+ raise
+ else: # non Windows
+ self.fp = open(self.lockfile, 'w')
+ self.fp.flush()
+ try:
+ fcntl.lockf(self.fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
+ except IOError:
+ logger.warning(
+ "Another instance is already running, quitting.")
+ raise SingleInstanceException()
+ self.initialized = True
+
+ def __del__(self):
+ if not self.initialized:
+ return
+ try:
+ if sys.platform == 'win32':
+ if hasattr(self, 'fd'):
+ os.close(self.fd)
+ os.unlink(self.lockfile)
+ else:
+ fcntl.lockf(self.fp, fcntl.LOCK_UN)
+ # os.close(self.fp)
+ if os.path.isfile(self.lockfile):
+ os.unlink(self.lockfile)
+ except Exception as e:
+ if logger:
+ logger.warning(e)
+ else:
+ print("Unloggable error: %s" % e)
+ sys.exit(-1)
+
+
+logger = logging.getLogger("tendo.singleton")
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tee.py b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tee.py
new file mode 100644
index 0000000..6660f8c
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tee.py
@@ -0,0 +1,277 @@
+#!/usr/bin/env python
+# encoding: utf-8
+import codecs
+import logging
+import os
+import pipes
+from six import string_types
+import subprocess
+import sys
+import time
+import types
+import unittest
+
+global logger
+global stdout
+global stderr
+global timing
+global log_command
+
+logger = None
+stdout = False
+stderr = False
+# print execution time of each command in the log, just after the return code
+timing = True
+# outputs the command being executed to the log (before command output)
+log_command = True
+_sentinel = object()
+
+
+def quote_command(cmd):
+ """This function does assure that the command line is entirely quoted.
+
+ This is required in order to prevent getting "The input line is too long" error message.
+ """
+ if not (os.name == "nt" or os.name == "dos"):
+ # the escaping is required only on Windows platforms, in fact it will
+ # break cmd line on others
+ return cmd
+ if '"' in cmd[1:-1]:
+ cmd = '"' + cmd + '"'
+ return cmd
+
+
+def system2(cmd, cwd=None, logger=_sentinel, stdout=_sentinel, log_command=_sentinel, timing=_sentinel):
+ # def tee(cmd, cwd=None, logger=tee_logger, console=tee_console):
+ """Works exactly like :func:`system` but it returns both the exit code and the output as a list of lines.
+
+ This method returns a tuple: (return_code, output_lines_as_list). The return code of 0 means success.
+ """
+ # if isinstance(cmd, collections.Iterable): # -- this line was replaced
+ # because collections.Iterable seems to be missing on Debian Python 2.5.5
+ # (but not on OS X 10.8 with Python 2.5.6)
+ if hasattr(cmd, '__iter__'):
+ cmd = " ".join(pipes.quote(s) for s in cmd)
+
+ t = time.process_time()
+ output = []
+ if log_command is _sentinel:
+ log_command = globals().get('log_command')
+ if timing is _sentinel:
+ timing = globals().get('timing')
+
+ # default to python native logger if logger parameter is not used
+ if logger is _sentinel:
+ logger = globals().get('logger')
+ if stdout is _sentinel:
+ stdout = globals().get('stdout')
+
+ # logging.debug("logger=%s stdout=%s" % (logger, stdout))
+
+ f = sys.stdout
+ if not f.encoding or f.encoding == 'ascii':
+ # `ascii` is not a valid encoding by our standards, it's better to output to UTF-8 because it can encoding any Unicode text
+ encoding = 'utf_8'
+ else:
+ encoding = f.encoding
+
+ def filelogger(msg):
+ try:
+ # we'll use the same endline on all platforms, you like it or not
+ msg += '\n'
+ try:
+ f.write(msg)
+ except TypeError:
+ f.write(msg.encode("utf-8"))
+ except Exception:
+ sys.exc_info()[1]
+ import traceback
+ print(' ****** ERROR: Exception: %s\nencoding = %s' %
+ (e, encoding))
+ traceback.print_exc(file=sys.stderr)
+ sys.exit(-1)
+ pass
+
+ def nop(msg):
+ pass
+
+ if not logger:
+ mylogger = nop
+ elif isinstance(logger, string_types):
+ f = codecs.open(logger, "a+b", 'utf_8')
+ mylogger = filelogger
+ elif isinstance(logger, (types.FunctionType, types.MethodType, types.BuiltinFunctionType)):
+ mylogger = logger
+ else:
+ method_write = getattr(logger, "write", None)
+ # if we can call write() we'll aceppt it :D
+ # this should work for filehandles
+ if hasattr(method_write, '__call__'):
+ f = logger
+ mylogger = filelogger
+ else:
+ sys.exit("tee() does not support this type of logger=%s" %
+ type(logger))
+
+ if cwd is not None and not os.path.isdir(cwd):
+ os.makedirs(cwd) # this throws exception if fails
+
+ cmd = quote_command(cmd) # to prevent _popen() bug
+ p = subprocess.Popen(
+ cmd, cwd=cwd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ if log_command:
+ mylogger("Running: %s" % cmd)
+ while True:
+ line = ""
+ try:
+ line = p.stdout.readline()
+ line = line.decode(encoding)
+ except Exception:
+ e = sys.exc_info()[1]
+ logging.error(e)
+ logging.error("The output of the command could not be decoded as %s\ncmd: %s\n line ignored: %s" %
+ (encoding, cmd, repr(line)))
+ pass
+
+ output.append(line)
+ if not line:
+ break
+ line = line.rstrip('\n\r')
+ mylogger(line) # they are added by logging anyway
+ if stdout:
+ print(line)
+ returncode = p.wait()
+ if log_command:
+ if timing:
+ def secondsToStr(t):
+ return time.strftime('%H:%M:%S', time.gmtime(t))
+ mylogger("Returned: %d (execution time %s)\n" %
+ (returncode, secondsToStr(time.process_time() - t)))
+ else:
+ mylogger("Returned: %d\n" % returncode)
+
+ # running a tool that returns non-zero? this deserves a warning
+ if not returncode == 0:
+ logging.warning("Returned: %d from: %s\nOutput %s" %
+ (returncode, cmd, '\n'.join(output)))
+
+ return returncode, output
+
+
+def system(cmd, cwd=None, logger=None, stdout=None, log_command=_sentinel, timing=_sentinel):
+ """This works similar to :py:func:`os.system` but add some useful optional parameters.
+
+ * ``cmd`` - command to be executed
+ * ``cwd`` - optional working directory to be set before running cmd
+ * ``logger`` - None, a filename, handle or a function like print or :py:meth:`logging.Logger.warning`
+
+ Returns the exit code reported by the execution of the command, 0 means success.
+
+ >>> import os, logging
+ ... import tendo.tee
+ ... tee.system("echo test", logger=logging.error) # output using python logging
+ ... tee.system("echo test", logger="log.txt") # output to a file
+ ... f = open("log.txt", "w")
+ ... tee.system("echo test", logger=f) # output to a filehandle
+ ... tee.system("echo test", logger=print) # use the print() function for output
+ """
+ (returncode, output) = system2(cmd, cwd=cwd, logger=logger,
+ stdout=stdout, log_command=log_command, timing=timing)
+ return returncode
+
+
+class testTee(unittest.TestCase):
+
+ def test_1(self):
+ """No CMD os.system()
+
+ 1 sort /? ok ok
+ 2 "sort" /? ok ok
+ 3 sort "/?" ok ok
+ 4 "sort" "/?" ok [bad]
+ 5 ""sort /?"" ok [bad]
+ 6 "sort /?" [bad] ok
+ 7 "sort "/?"" [bad] ok
+ 8 ""sort" "/?"" [bad] ok
+ """
+
+ quotes = {
+ 'dir >nul': 'dir >nul',
+ 'cd /D "C:\\Program Files\\"': '"cd /D "C:\\Program Files\\""',
+ 'python -c "import os" dummy': '"python -c "import os" dummy"',
+ 'sort': 'sort',
+ }
+
+ # we fake the os name because we want to run the test on any platform
+ save = os.name
+ os.name = 'nt'
+
+ for key, value in quotes.items():
+ resulted_value = quote_command(key)
+ self.assertEqual(
+ value, resulted_value, "Returned <%s>, expected <%s>" % (resulted_value, value))
+ # ret = os.system(resulted_value)
+ # if not ret==0:
+ # print("failed")
+ os.name = save
+
+ def test_2(self):
+ self.assertEqual(system(['python', '-V']), 0)
+
+ def test_3(self):
+ self.assertEqual(system2(['python', '-V'])[0], 0)
+
+ def test_4(self):
+ self.assertEqual(system(['python', '-c', "print('c c')"]), 0)
+
+
+if __name__ == '__main__':
+
+ # unittest.main()
+ import pytest
+ pytest.main([__file__])
+
+ # import pytest
+ # pytest.main(['--pyargs', __name__])
+ """
+ import colorer
+ import tempfile, os
+
+ logging.basicConfig(level=logging.NOTSET,
+ format='%(message)s')
+
+ # default (stdout)
+ print("#1")
+ system("python --version")
+
+ # function/method
+ print("#2")
+ system("python --version", logger=logging.error)
+
+ # function (this is the same as default)
+ print("#3")
+ system("python --version", logger=print)
+
+ # handler
+ print("#4")
+ f = tempfile.NamedTemporaryFile()
+ system("python --version", logger=f)
+ f.close()
+
+ # test with string (filename)
+ print("#5")
+ (f, fname) = tempfile.mkstemp()
+ system("python --version", logger=fname)
+ os.close(f)
+ os.unlink(fname)
+
+ print("#6")
+ stdout = False
+ logger = None
+ system("echo test")
+
+ print("#7")
+ stdout = True
+ system("echo test2")
+
+"""
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__init__.py b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/__init__.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 0000000..3ca146d
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/__init__.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/test_colorer.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/test_colorer.cpython-39.pyc
new file mode 100644
index 0000000..3dc2a9a
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/test_colorer.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/test_execfile2.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/test_execfile2.cpython-39.pyc
new file mode 100644
index 0000000..59701b4
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/test_execfile2.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/test_singleton.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/test_singleton.cpython-39.pyc
new file mode 100644
index 0000000..f384871
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/test_singleton.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/test_tee.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/test_tee.cpython-39.pyc
new file mode 100644
index 0000000..58e10cb
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/test_tee.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/test_unicode.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/test_unicode.cpython-39.pyc
new file mode 100644
index 0000000..a30ef23
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/__pycache__/test_unicode.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/full_sample_utf8_bom.txt b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/full_sample_utf8_bom.txt
new file mode 100644
index 0000000..73dc094
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/full_sample_utf8_bom.txt
@@ -0,0 +1,4 @@
+NFD aaâaa
+NFC aaâaa
+NFKD aaâaa
+NFKC aaâaa
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/sample_ucs2_be.txt b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/sample_ucs2_be.txt
new file mode 100644
index 0000000..1443f60
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/sample_ucs2_be.txt differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/sample_ucs2_le.txt b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/sample_ucs2_le.txt
new file mode 100644
index 0000000..94badbc
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/sample_ucs2_le.txt differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/sample_utf8.txt b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/sample_utf8.txt
new file mode 100644
index 0000000..9e4f93e
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/sample_utf8.txt
@@ -0,0 +1 @@
+țăpusă
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/sample_utf8_bom.txt b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/sample_utf8_bom.txt
new file mode 100644
index 0000000..37c898a
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/sample_utf8_bom.txt
@@ -0,0 +1,3 @@
+aăâ sș aă #1
+aăâ sș aă #2
+aăâ sș aă #3
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/utf8-after-append.txt b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/utf8-after-append.txt
new file mode 100644
index 0000000..a18824a
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/utf8-after-append.txt
@@ -0,0 +1 @@
+This is a testabcșț_ṩṩṩ_бдж_αβώ_وت_אסל_永𪚥麵𠀀
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/utf8-invalid.txt b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/utf8-invalid.txt
new file mode 100644
index 0000000..abd16f7
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/utf8-invalid.txt differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/utf8.txt b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/utf8.txt
new file mode 100644
index 0000000..996259b
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/assets/utf8.txt
@@ -0,0 +1 @@
+This is a test
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/py.typed b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/py.typed
new file mode 100644
index 0000000..e69de29
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/test_colorer.py b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/test_colorer.py
new file mode 100644
index 0000000..c5208c5
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/test_colorer.py
@@ -0,0 +1,37 @@
+import logging
+import sys
+import tempfile
+
+
+def test_colorer():
+ isatty = None
+ if hasattr(sys.stderr, "isatty"):
+ isatty = sys.stderr.isatty()
+ print("sys.stderr.isatty = %s" % isatty)
+
+ isatty = None
+ if hasattr(sys.stdout, "isatty"):
+ isatty = sys.stdout.isatty()
+ print("sys.stdout.isatty = %s" % isatty)
+
+ logging.getLogger().setLevel(logging.NOTSET)
+ tmp_file = tempfile.NamedTemporaryFile(suffix='_colorer.log').name
+ fh = logging.FileHandler(tmp_file)
+ fh.setLevel(logging.NOTSET)
+ ch = logging.StreamHandler()
+ ch.setLevel(logging.NOTSET)
+ formatter = logging.Formatter('%(levelname)s: %(message)s')
+ fh.setFormatter(formatter)
+ ch.setFormatter(formatter)
+ logging.getLogger().addHandler(ch)
+ logging.getLogger().addHandler(fh)
+
+ logging.warning("a warning")
+ logging.error("some error")
+ logging.info("some info")
+ logging.debug("some info")
+ expected_lines = ['WARNING: a warning\n', 'ERROR: some error\n', 'INFO: some info\n', 'DEBUG: some info\n']
+ line_no = 0
+ for line in open(tmp_file).readlines():
+ assert(line == expected_lines[line_no])
+ line_no += 1
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/test_execfile2.py b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/test_execfile2.py
new file mode 100644
index 0000000..20e6412
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/test_execfile2.py
@@ -0,0 +1,52 @@
+
+import os
+import tempfile
+
+from tendo.execfile2 import execfile2
+
+
+def exec_py_code(code, cmd=None):
+ (ftmp, fname_tmp) = tempfile.mkstemp()
+ f = open(fname_tmp, "w") # encoding not specified, should use utf-8
+ f.write(code)
+ f.close()
+ exit_code = execfile2(fname_tmp, cmd=cmd, quiet=True)
+ os.close(ftmp)
+ os.unlink(fname_tmp)
+ return exit_code
+
+
+def test_normal_execution():
+ exit_code = exec_py_code("")
+ assert exit_code == 0
+
+
+def test_bad_code():
+ exit_code = exec_py_code("bleah")
+ assert exit_code == 1
+
+
+def test_sys_exit_0():
+ exit_code = exec_py_code("import sys; sys.exit(0)")
+ assert exit_code == 0
+
+
+def test_sys_exit_5():
+ exit_code = exec_py_code("import sys; sys.exit(5)")
+ assert exit_code == 5
+
+
+def test_sys_exit_text():
+ exit_code = exec_py_code("import sys; sys.exit('bleah')")
+ assert exit_code == 1
+
+
+def test_raised_exception():
+ exit_code = exec_py_code("raise Exception('bleah')")
+ assert exit_code == 1
+
+
+def test_command_line():
+ exit_code = exec_py_code(
+ "import sys\nif len(sys.argv)==2 and sys.argv[1]=='doh!': sys.exit(-1)", cmd="doh!")
+ assert exit_code == -1
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/test_singleton.py b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/test_singleton.py
new file mode 100644
index 0000000..6423482
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/test_singleton.py
@@ -0,0 +1,58 @@
+import logging
+from multiprocessing import Process
+import sys
+
+from tendo.singleton import SingleInstance, SingleInstanceException
+
+logger = logging.getLogger("tendo.singleton.test")
+logger.addHandler(logging.StreamHandler())
+logger.setLevel(logging.DEBUG)
+
+
+def f(name):
+ tmp = logger.level
+ logger.setLevel(logging.CRITICAL) # we do not want to see the warning
+ try:
+ me2 = SingleInstance(flavor_id=name) # noqa
+ except SingleInstanceException:
+ sys.exit(-1)
+ logger.setLevel(tmp)
+ pass
+
+
+def test_1():
+ me = SingleInstance(flavor_id="test-1")
+ del me # now the lock should be removed
+ assert True
+
+
+def test_2():
+ p = Process(target=f, args=("test-2",))
+ p.start()
+ p.join()
+ # the called function should succeed
+ assert p.exitcode == 0, "%s != 0" % p.exitcode
+
+
+def test_3():
+ me = SingleInstance(flavor_id="test-3") # noqa -- me should still kept
+ p = Process(target=f, args=("test-3",))
+ p.start()
+ p.join()
+ # the called function should fail because we already have another
+ # instance running
+ assert p.exitcode != 0, "%s != 0 (2nd execution)" % p.exitcode
+ # note, we return -1 but this translates to 255 meanwhile we'll
+ # consider that anything different from 0 is good
+ p = Process(target=f, args=("test-3",))
+ p.start()
+ p.join()
+ # the called function should fail because we already have another
+ # instance running
+ assert p.exitcode != 0, "%s != 0 (3rd execution)" % p.exitcode
+
+
+def test_4():
+ lockfile = '/tmp/foo.lock'
+ me = SingleInstance(lockfile=lockfile)
+ assert me.lockfile == lockfile
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/test_tee.py b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/test_tee.py
new file mode 100644
index 0000000..f1ad9de
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/test_tee.py
@@ -0,0 +1,48 @@
+
+import os
+from tendo.tee import quote_command, system, system2
+
+
+def test_1():
+ """No CMD os.system()
+
+ 1 sort /? ok ok
+ 2 "sort" /? ok ok
+ 3 sort "/?" ok ok
+ 4 "sort" "/?" ok [bad]
+ 5 ""sort /?"" ok [bad]
+ 6 "sort /?" [bad] ok
+ 7 "sort "/?"" [bad] ok
+ 8 ""sort" "/?"" [bad] ok
+ """
+
+ quotes = {
+ 'dir >nul': 'dir >nul',
+ 'cd /D "C:\\Program Files\\"': '"cd /D "C:\\Program Files\\""',
+ 'python -c "import os" dummy': '"python -c "import os" dummy"',
+ 'sort': 'sort',
+ }
+
+ # we fake the os name because we want to run the test on any platform
+ save = os.name
+ os.name = 'nt'
+
+ for key, value in quotes.items():
+ resulted_value = quote_command(key)
+ assert value == resulted_value
+ # ret = os.system(resulted_value)
+ # if not ret==0:
+ # print("failed")
+ os.name = save
+
+
+def test_2():
+ assert system(['python', '-V']) == 0
+
+
+def test_3():
+ assert system2(['python', '-V'])[0] == 0
+
+
+def test_4():
+ assert system(['python', '-c', "print('c c')"]) == 0
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/test_unicode.py b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/test_unicode.py
new file mode 100644
index 0000000..12ce1be
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/tests/test_unicode.py
@@ -0,0 +1,49 @@
+import inspect
+import pytest
+import tempfile
+import six
+import os
+import filecmp
+import shutil
+
+
+@pytest.fixture
+def dir():
+ os.chdir(os.path.dirname(os.path.abspath(__file__)))
+ return os.path.dirname(inspect.getfile(inspect.currentframe()))
+
+
+def test_read_utf8(dir):
+ if six.PY2:
+ mode = "rU"
+ else:
+ mode = "r"
+ f = open(os.path.join(dir, "assets/utf8.txt"), mode)
+ f.readlines()
+ f.close()
+ assert True
+
+
+def test_read_invalid_utf8(dir):
+ with pytest.raises(UnicodeDecodeError):
+ if six.PY2:
+ mode = "rU"
+ else:
+ mode = "r"
+ f = open(os.path.join(dir, "assets/utf8-invalid.txt"), mode)
+ f.readlines()
+ f.close()
+
+
+def test_write_on_existing_utf8(dir):
+ (ftmp, fname_tmp) = tempfile.mkstemp()
+ shutil.copyfile(os.path.join(dir, "assets/utf8.txt"), fname_tmp)
+ f = open(fname_tmp, "a") # encoding not specified, should use utf-8
+ f.write(six.u(
+ "\u0061\u0062\u0063\u0219\u021B\u005F\u1E69\u0073\u0323\u0307\u0073\u0307\u0323\u005F\u0431\u0434\u0436\u005F\u03B1\u03B2\u03CE\u005F\u0648\u062A\u005F\u05D0\u05E1\u05DC\u005F\u6C38\U0002A6A5\u9EB5\U00020000"))
+ f.close()
+ passed = filecmp.cmp(
+ os.path.join(dir, "assets/utf8-after-append.txt"), fname_tmp, shallow=False)
+ assert passed is True
+ os.close(ftmp)
+ os.unlink(fname_tmp)
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/unicode.py b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/unicode.py
new file mode 100644
index 0000000..8c21df1
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/tendo/unicode.py
@@ -0,0 +1,81 @@
+#!/usr/bin/python
+import codecs
+import logging
+import sys
+
+import six
+"""
+Author: Sorin Sbarnea
+
+This file does add some additional Unicode support to Python, like:
+* auto-detect BOM on text-file open: open(file, "r") and open(file, "rU")
+
+"""
+# we save the file function handler because we want to override it
+open_old = open
+
+
+def open(filename, mode='r', bufsize=-1, fallback_encoding='utf_8'):
+ """This replaces Python original function with an improved version that is Unicode aware.
+
+ The new `open()` does change behaviour only for text files, not binary.
+
+ * mode is by default 'r' if not specified and text mode
+ * negative bufsize makes it use the default system one (same as not specified)
+
+ >>> import tendo.unicode
+ ... f = open("file-with-unicode-content.txt")
+ ... content = f.read() # Unicode content of the file, without BOM
+
+ Shortly by importing unicode, you will repair code that previously was broken when the input files were Unicode.
+
+ This will not change the behavior of code that reads the files as binary, it has an effect on text file operations.
+
+ Files with BOM will be read properly as Unicode and the BOM will not be part of the text.
+
+ If you do not specify the fallback_encoding, files without BOM will be read as `UTF-8` instead of `ascii`.
+ """
+ # Do not assign None to bufsize or mode because calling original open will
+ # fail
+
+ # we read the first 4 bytes just to be sure we use the right encoding
+ # we are interested of detecting the mode only for read text
+ if "r" in mode or "a" in mode:
+ try:
+ f = open_old(filename, "rb")
+ aBuf = bytes(f.read(4))
+ f.close()
+ except Exception:
+ aBuf = six.b('')
+ if six.binary_type(aBuf[:3]) == six.b('\xEF\xBB\xBF'):
+ f = codecs.open(filename, mode, "utf_8")
+ f.seek(3, 0)
+ f.BOM = codecs.BOM_UTF8
+ elif six.binary_type(aBuf[:2]) == six.b('\xFF\xFE'):
+ f = codecs.open(filename, mode, "utf_16_le")
+ f.seek(2, 0)
+ f.BOM = codecs.BOM_UTF16_LE
+ elif six.binary_type(aBuf[:2]) == six.b('\xFE\xFF'):
+ f = codecs.open(filename, mode, "utf_16_be")
+ f.seek(2, 0)
+ f.BOM = codecs.BOM_UTF16_BE
+ elif six.binary_type(aBuf[:4]) == six.b('\xFF\xFE\x00\x00'):
+ f = codecs.open(filename, mode, "utf_32_le")
+ f.seek(4, 0)
+ f.BOM = codecs.BOM_UTF32_LE
+ elif six.binary_type(aBuf[:4]) == six.b('\x00\x00\xFE\xFF'):
+ f = codecs.open(filename, mode, "utf_32_be")
+ f.seek(4, 0)
+ f.BOM = codecs.BOM_UTF32_BE
+ else: # we assume that if there is no BOM, the encoding is UTF-8
+ f = codecs.open(filename, mode, fallback_encoding)
+ f.seek(0)
+ f.BOM = None
+ return f
+ else:
+ import traceback
+ logging.warning(
+ "Calling unicode.open(%s,%s,%s) that may be wrong." % (filename, mode, bufsize))
+ traceback.print_exc(file=sys.stderr)
+
+ return open_old(filename, mode, bufsize)
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/INSTALLER b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/INSTALLER
new file mode 100644
index 0000000..a1b589e
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/LICENSE b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/LICENSE
new file mode 100644
index 0000000..8b4db1f
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Israel Dryer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/METADATA b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/METADATA
new file mode 100644
index 0000000..1f6dba1
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/METADATA
@@ -0,0 +1,81 @@
+Metadata-Version: 2.1
+Name: ttkbootstrap
+Version: 1.10.1
+Summary: A supercharged theme extension for tkinter that enables on-demand modern flat style themes inspired by Bootstrap.
+Home-page: https://github.com/israel-dryer/ttkbootstrap
+Author: Israel Dryer
+Author-email: israel.dryer@gmail.com
+Classifier: Programming Language :: Python :: 3
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Requires-Python: >=3.7
+Description-Content-Type: text/markdown
+License-File: LICENSE
+Requires-Dist: pillow (>=8.2.0)
+
+
+![](https://img.shields.io/github/release/israel-dryer/ttkbootstrap.svg)
+[![Downloads](https://pepy.tech/badge/ttkbootstrap)](https://pepy.tech/project/ttkbootstrap)
+[![Downloads](https://pepy.tech/badge/ttkbootstrap/month)](https://pepy.tech/project/ttkbootstrap)
+![](https://img.shields.io/github/issues/israel-dryer/ttkbootstrap.svg)
+![](https://img.shields.io/github/issues-closed/israel-dryer/ttkbootstrap.svg)
+![](https://img.shields.io/github/license/israel-dryer/ttkbootstrap.svg)
+![](https://img.shields.io/github/stars/israel-dryer/ttkbootstrap.svg)
+![](https://img.shields.io/github/forks/israel-dryer/ttkbootstrap.svg)
+
+A supercharged theme extension for tkinter that enables on-demand modern flat style themes inspired by Bootstrap.
+
+👀 Check out the [documentation](https://ttkbootstrap.readthedocs.io/en/latest/).
+
+![](https://raw.githubusercontent.com/israel-dryer/ttkbootstrap/master/docs/assets/themes/themes.gif)
+
+## Features
+
+✔️ [**Built-in Themes**](https://ttkbootstrap.readthedocs.io/en/latest/themes/)
+Over a dozen curated dark and light themes.
+
+✔️ [**Pre-defined Styles:**](https://ttkbootstrap.readthedocs.io/en/latest/styleguide/)
+Loads of beautiful pre-defined widget styles such as **outline** and **round toggle** buttons.
+
+✔️ [**Simple keyword API:**](https://ttkbootstrap.readthedocs.io/en/latest/gettingstarted/tutorial/#use-themed-widgets)
+Apply colors and types using simple keywords such as **primary** and **striped** instead of the legacy approach of **primary.Striped.Horizontal.TProgressbar**. If you've used Bootstrap for web development, you are already familiar with this approach using css classes.
+
+✔️ [**Lots of new Widgets:**](https://ttkbootstrap.readthedocs.io/en/latest/api/widgets/dateentry/)
+ttkbootstrap comes with several new beautifully designed widgets such as **Meter**, **DateEntry**, and **Floodgauge**. Additionally, **dialogs** are now themed and fully customizable.
+
+✔️ [**Built-in Theme Creator:**](https://ttkbootstrap.readthedocs.io/en/latest/themes/themecreator/)
+Want to create your own theme? Easy! ttkboostrap includes a built-in **theme creator** that enables you to easily build, load, expore, and apply your own custom themes.
+
+## Installation
+
+```python
+python -m pip install ttkbootstrap
+```
+
+## Simple Usage
+Instead of using long, complicated ttk style classes, you can use simple keywords with the "bootstyle" parameter.
+
+```python
+import ttkbootstrap as ttk
+from ttkbootstrap.constants import *
+
+root = ttk.Window(themename="superhero")
+
+b1 = ttk.Button(root, text="Submit", bootstyle="success")
+b1.pack(side=LEFT, padx=5, pady=10)
+
+b2 = ttk.Button(root, text="Submit", bootstyle="info-outline")
+b2.pack(side=LEFT, padx=5, pady=10)
+
+root.mainloop()
+```
+
+The new keyword API is very flexible. The following examples all produce the same result:
+- `bootstyle="info-outline"`
+- `bootstyle="info outline"`
+- `bootstyle=("info", "outline")`
+- `bootstyle=(INFO, OUTLINE)`
+
+## Links
+- **Documentation:** https://ttkbootstrap.readthedocs.io/en/latest/
+- **GitHub:** https://github.com/israel-dryer/ttkbootstrap
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/RECORD b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/RECORD
new file mode 100644
index 0000000..38d39c1
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/RECORD
@@ -0,0 +1,61 @@
+ttkbootstrap-1.10.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+ttkbootstrap-1.10.1.dist-info/LICENSE,sha256=5GxHfz2ouGVSpF_de2vLpQ334PjztTwgUXTzB6YrQRk,1090
+ttkbootstrap-1.10.1.dist-info/METADATA,sha256=01CDyDVcyPAdh5gNebxKlumHGh1OFOaOt2pJ5vfGdGc,3757
+ttkbootstrap-1.10.1.dist-info/RECORD,,
+ttkbootstrap-1.10.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+ttkbootstrap-1.10.1.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
+ttkbootstrap-1.10.1.dist-info/top_level.txt,sha256=kiB4so53dBImGejI1oNn1TsM0rRR9MF-okIQV-tgGWc,24
+ttkbootstrap/__init__.py,sha256=XKPis2k-N7nVBjtKmQf0iH7n8_mDJOQt7jLYi4JP7cM,396
+ttkbootstrap/__main__.py,sha256=LvK6Wp_GlZhCFXny5Hm-NFpKIklqLW6fyc_cKpOUL48,8926
+ttkbootstrap/__pycache__/__init__.cpython-39.pyc,,
+ttkbootstrap/__pycache__/__main__.cpython-39.pyc,,
+ttkbootstrap/__pycache__/colorutils.cpython-39.pyc,,
+ttkbootstrap/__pycache__/constants.cpython-39.pyc,,
+ttkbootstrap/__pycache__/icons.cpython-39.pyc,,
+ttkbootstrap/__pycache__/publisher.cpython-39.pyc,,
+ttkbootstrap/__pycache__/scrolled.cpython-39.pyc,,
+ttkbootstrap/__pycache__/style.cpython-39.pyc,,
+ttkbootstrap/__pycache__/tableview.cpython-39.pyc,,
+ttkbootstrap/__pycache__/toast.cpython-39.pyc,,
+ttkbootstrap/__pycache__/tooltip.cpython-39.pyc,,
+ttkbootstrap/__pycache__/utility.cpython-39.pyc,,
+ttkbootstrap/__pycache__/validation.cpython-39.pyc,,
+ttkbootstrap/__pycache__/widgets.cpython-39.pyc,,
+ttkbootstrap/__pycache__/window.cpython-39.pyc,,
+ttkbootstrap/colorutils.py,sha256=8BLNwPi5Y3hnIJLYWedT7f4qOrpuuZ8hudoEkb6RqQ8,5255
+ttkbootstrap/constants.py,sha256=d1GutsvjEDbuAe079R-4r4hsRpXCjAz0T9fk5vNT2QA,775
+ttkbootstrap/dialogs/__init__.py,sha256=j_U9tYIjdQNmakvsvJT_OZRu5VYA-bazR7Ut2WcZJjI,42
+ttkbootstrap/dialogs/__pycache__/__init__.cpython-39.pyc,,
+ttkbootstrap/dialogs/__pycache__/colorchooser.cpython-39.pyc,,
+ttkbootstrap/dialogs/__pycache__/colordropper.cpython-39.pyc,,
+ttkbootstrap/dialogs/__pycache__/dialogs.cpython-39.pyc,,
+ttkbootstrap/dialogs/colorchooser.py,sha256=NPC94V9bYdlYepAt7cYhpGxmu-nRa-zqTg3W09tB3n4,22700
+ttkbootstrap/dialogs/colordropper.py,sha256=1hVj3iqA8OA1bM5bBp5mMNaIjY04hhDEixbRQh9qiyA,6885
+ttkbootstrap/dialogs/dialogs.py,sha256=O6bD4RogB2Sj7BmqlsdZCCKW80EvtHxXaxz8rqZ3wQk,64245
+ttkbootstrap/icons.py,sha256=dA2NB413LgENzuhBQ3JLSRS98ZGY4yTVVfrQomnvfM0,118811
+ttkbootstrap/localization/__init__.py,sha256=QvDooxyknlC7Iw7sAlRAGbXM9UC6FxJf3UT4iGYdiew,675
+ttkbootstrap/localization/__pycache__/__init__.cpython-39.pyc,,
+ttkbootstrap/localization/__pycache__/msgcat.cpython-39.pyc,,
+ttkbootstrap/localization/__pycache__/msgs.cpython-39.pyc,,
+ttkbootstrap/localization/msgcat.py,sha256=BEEXbDOm-WdvRGXMA4g7kgQXMus-t3_ibEoXv1wudI4,5594
+ttkbootstrap/localization/msgs.py,sha256=Pc5dKO4JdNKqaP6tUOXItXAITliXgVPdus_PjjnIzdg,15106
+ttkbootstrap/publisher.py,sha256=NAiNAwOMSqa8nymObagYXhQf7vHBX2lGzOimh7seinw,2879
+ttkbootstrap/scrolled.py,sha256=sQCxqXDuT3ddyozNfrG5x7UnlIz3naAhHbQgWBeaPus,15839
+ttkbootstrap/style.py,sha256=YCC661XblVvHSxukSqoZm8lPfrjMckGjbg3E2rYUF64,172335
+ttkbootstrap/tableview.py,sha256=OHYxxBmtsslAPn4zOKLI3NKo6YIT49sZct48HZ-p1Gw,92575
+ttkbootstrap/themes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+ttkbootstrap/themes/__pycache__/__init__.cpython-39.pyc,,
+ttkbootstrap/themes/__pycache__/standard.cpython-39.pyc,,
+ttkbootstrap/themes/__pycache__/user.cpython-39.pyc,,
+ttkbootstrap/themes/standard.py,sha256=4Uv-FuiG_dbo46_AaTvyXUE22BO-KZzN6Yh_eg6Uk18,11286
+ttkbootstrap/themes/user.py,sha256=G7lg2FIAc8oijPHic6BwWH0jq1dXCKPCqMbb7hxPViA,14
+ttkbootstrap/toast.py,sha256=K1uzggaf61YHK6VNTVq-hVSULsYuooHfIuUTFmGKPvk,8389
+ttkbootstrap/tooltip.py,sha256=6YOndpT6GwwvTkThCFQk3nxQZZFXBscbDpvTz6Oj19Q,5139
+ttkbootstrap/utility.py,sha256=oQlyHG1_XNgcqzWybEqdPmKvoHmxlHGhITTbY6ViE_o,3555
+ttkbootstrap/validation.py,sha256=go7iVecKNJdaPelf6Mkx7CjLhfVhO2B-CGHJdAMi5ts,10200
+ttkbootstrap/widgets.py,sha256=FhfJVQBL1jAWgi_Tks0hRSs2ZEa8PfPqm3SyVgQwvrc,40690
+ttkbootstrap/window.py,sha256=nOaFAj5PX1l8Oo3d-HpAw7w42qGObpRGqGzc5FjfYuw,18186
+ttkcreator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+ttkcreator/__main__.py,sha256=DUPwQng17rIssQzyudFpgmo-Kt77W7yxtE7SxyU5K10,17276
+ttkcreator/__pycache__/__init__.cpython-39.pyc,,
+ttkcreator/__pycache__/__main__.cpython-39.pyc,,
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/REQUESTED b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/REQUESTED
new file mode 100644
index 0000000..e69de29
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/WHEEL b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/WHEEL
new file mode 100644
index 0000000..57e3d84
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.38.4)
+Root-Is-Purelib: true
+Tag: py3-none-any
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/top_level.txt b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/top_level.txt
new file mode 100644
index 0000000..fc93cf8
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap-1.10.1.dist-info/top_level.txt
@@ -0,0 +1,2 @@
+ttkbootstrap
+ttkcreator
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__init__.py b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__init__.py
new file mode 100644
index 0000000..90f1d87
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__init__.py
@@ -0,0 +1,11 @@
+from ttkbootstrap.style import Style
+from ttkbootstrap.style import Bootstyle
+from ttkbootstrap.widgets import *
+from ttkbootstrap.window import Window, Toplevel
+
+from tkinter.scrolledtext import ScrolledText
+from tkinter import Variable, StringVar, IntVar, BooleanVar, DoubleVar
+from tkinter import Canvas, Menu, Text
+from tkinter import PhotoImage
+
+Bootstyle.setup_ttkbootstap_api()
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__main__.py b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__main__.py
new file mode 100644
index 0000000..4859986
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__main__.py
@@ -0,0 +1,301 @@
+"""
+ ttkbootstrap demo
+
+ ISSUES:
+ - the legacy tk widgets do not update after DateDialog is used.
+"""
+import ttkbootstrap as ttk
+from ttkbootstrap.constants import *
+from ttkbootstrap.dialogs import Messagebox
+from ttkbootstrap.scrolled import ScrolledText
+
+
+def setup_demo(master):
+
+ ZEN = """Beautiful is better than ugly.
+Explicit is better than implicit.
+Simple is better than complex.
+Complex is better than complicated.
+Flat is better than nested.
+Sparse is better than dense.
+Readability counts.
+Special cases aren't special enough to break the rules.
+Although practicality beats purity.
+Errors should never pass silently.
+Unless explicitly silenced.
+In the face of ambiguity, refuse the temptation to guess.
+There should be one-- and preferably only one --obvious way to do it.
+Although that way may not be obvious at first unless you're Dutch.
+Now is better than never.
+Although never is often better than *right* now.
+If the implementation is hard to explain, it's a bad idea.
+If the implementation is easy to explain, it may be a good idea.
+Namespaces are one honking great idea -- let's do more of those!"""
+
+ root = ttk.Frame(master, padding=10)
+ style = ttk.Style()
+ theme_names = style.theme_names()
+
+ theme_selection = ttk.Frame(root, padding=(10, 10, 10, 0))
+ theme_selection.pack(fill=X, expand=YES)
+
+ theme_selected = ttk.Label(
+ master=theme_selection, text="litera", font="-size 24 -weight bold"
+ )
+ theme_selected.pack(side=LEFT)
+
+ lbl = ttk.Label(theme_selection, text="Select a theme:")
+ theme_cbo = ttk.Combobox(
+ master=theme_selection,
+ text=style.theme.name,
+ values=theme_names,
+ )
+ theme_cbo.pack(padx=10, side=RIGHT)
+ theme_cbo.current(theme_names.index(style.theme.name))
+ lbl.pack(side=RIGHT)
+
+ ttk.Separator(root).pack(fill=X, pady=10, padx=10)
+
+ def change_theme(e):
+ t = cbo.get()
+ style.theme_use(t)
+ theme_selected.configure(text=t)
+ theme_cbo.selection_clear()
+ default.focus_set()
+
+ theme_cbo.bind("<>", change_theme)
+
+ lframe = ttk.Frame(root, padding=5)
+ lframe.pack(side=LEFT, fill=BOTH, expand=YES)
+
+ rframe = ttk.Frame(root, padding=5)
+ rframe.pack(side=RIGHT, fill=BOTH, expand=YES)
+
+ color_group = ttk.Labelframe(
+ master=lframe, text="Theme color options", padding=10
+ )
+ color_group.pack(fill=X, side=TOP)
+
+ for color in style.colors:
+ cb = ttk.Button(color_group, text=color, bootstyle=color)
+ cb.pack(side=LEFT, expand=YES, padx=5, fill=X)
+
+ rb_group = ttk.Labelframe(
+ lframe, text="Checkbuttons & radiobuttons", padding=10
+ )
+ rb_group.pack(fill=X, pady=10, side=TOP)
+
+ check1 = ttk.Checkbutton(rb_group, text="selected")
+ check1.pack(side=LEFT, expand=YES, padx=5)
+ check1.invoke()
+
+ check2 = ttk.Checkbutton(rb_group, text="alternate")
+ check2.pack(side=LEFT, expand=YES, padx=5)
+
+ check4 = ttk.Checkbutton(rb_group, text="deselected")
+ check4.pack(side=LEFT, expand=YES, padx=5)
+ check4.invoke()
+ check4.invoke()
+
+ check3 = ttk.Checkbutton(rb_group, text="disabled", state=DISABLED)
+ check3.pack(side=LEFT, expand=YES, padx=5)
+
+ radio1 = ttk.Radiobutton(rb_group, text="selected", value=1)
+ radio1.pack(side=LEFT, expand=YES, padx=5)
+ radio1.invoke()
+
+ radio2 = ttk.Radiobutton(rb_group, text="deselected", value=2)
+ radio2.pack(side=LEFT, expand=YES, padx=5)
+
+ radio3 = ttk.Radiobutton(
+ master=rb_group, text="disabled", value=3, state=DISABLED
+ )
+ radio3.pack(side=LEFT, expand=YES, padx=5)
+
+ ttframe = ttk.Frame(lframe)
+ ttframe.pack(pady=5, fill=X, side=TOP)
+
+ table_data = [
+ ("South Island, New Zealand", 1),
+ ("Paris", 2),
+ ("Bora Bora", 3),
+ ("Maui", 4),
+ ("Tahiti", 5),
+ ]
+
+ tv = ttk.Treeview(master=ttframe, columns=[0, 1], show=HEADINGS, height=5)
+ for row in table_data:
+ tv.insert("", END, values=row)
+
+ tv.selection_set("I001")
+ tv.heading(0, text="City")
+ tv.heading(1, text="Rank")
+ tv.column(0, width=300)
+ tv.column(1, width=70, anchor=CENTER)
+ tv.pack(side=LEFT, anchor=NE, fill=X)
+
+ # # notebook with table and text tabs
+ nb = ttk.Notebook(ttframe)
+ nb.pack(side=LEFT, padx=(10, 0), expand=YES, fill=BOTH)
+ nb_text = "This is a notebook tab.\nYou can put any widget you want here."
+ nb.add(ttk.Label(nb, text=nb_text), text="Tab 1", sticky=NW)
+ nb.add(
+ child=ttk.Label(nb, text="A notebook tab."), text="Tab 2", sticky=NW
+ )
+ nb.add(ttk.Frame(nb), text="Tab 3")
+ nb.add(ttk.Frame(nb), text="Tab 4")
+ nb.add(ttk.Frame(nb), text="Tab 5")
+
+ # text widget
+ txt = ScrolledText(master=lframe, height=5, width=50, autohide=True)
+ txt.insert(END, ZEN)
+ txt.pack(side=LEFT, anchor=NW, pady=5, fill=BOTH, expand=YES)
+ lframe_inner = ttk.Frame(lframe)
+ lframe_inner.pack(fill=BOTH, expand=YES, padx=10)
+ s1 = ttk.Scale(
+ master=lframe_inner, orient=HORIZONTAL, value=75, from_=100, to=0
+ )
+ s1.pack(fill=X, pady=5, expand=YES)
+
+ ttk.Progressbar(
+ master=lframe_inner,
+ orient=HORIZONTAL,
+ value=50,
+ ).pack(fill=X, pady=5, expand=YES)
+
+ ttk.Progressbar(
+ master=lframe_inner,
+ orient=HORIZONTAL,
+ value=75,
+ bootstyle=(SUCCESS, STRIPED),
+ ).pack(fill=X, pady=5, expand=YES)
+
+ m = ttk.Meter(
+ master=lframe_inner,
+ metersize=150,
+ amountused=45,
+ subtext="meter widget",
+ bootstyle=INFO,
+ interactive=True,
+ )
+ m.pack(pady=10)
+
+ sb = ttk.Scrollbar(
+ master=lframe_inner,
+ orient=HORIZONTAL,
+ )
+ sb.set(0.1, 0.9)
+ sb.pack(fill=X, pady=5, expand=YES)
+
+ sb = ttk.Scrollbar(
+ master=lframe_inner, orient=HORIZONTAL, bootstyle=(DANGER, ROUND)
+ )
+ sb.set(0.1, 0.9)
+ sb.pack(fill=X, pady=5, expand=YES)
+
+ btn_group = ttk.Labelframe(master=rframe, text="Buttons", padding=(10, 5))
+ btn_group.pack(fill=X)
+
+ menu = ttk.Menu(root)
+ for i, t in enumerate(style.theme_names()):
+ menu.add_radiobutton(label=t, value=i)
+
+ default = ttk.Button(master=btn_group, text="solid button")
+ default.pack(fill=X, pady=5)
+ default.focus_set()
+
+ mb = ttk.Menubutton(
+ master=btn_group,
+ text="solid menubutton",
+ bootstyle=SECONDARY,
+ menu=menu,
+ )
+ mb.pack(fill=X, pady=5)
+
+ cb = ttk.Checkbutton(
+ master=btn_group,
+ text="solid toolbutton",
+ bootstyle=(SUCCESS, TOOLBUTTON),
+ )
+ cb.invoke()
+ cb.pack(fill=X, pady=5)
+
+ ob = ttk.Button(
+ master=btn_group,
+ text="outline button",
+ bootstyle=(INFO, OUTLINE),
+ command=lambda: Messagebox.ok("You pushed an outline button"),
+ )
+ ob.pack(fill=X, pady=5)
+
+ mb = ttk.Menubutton(
+ master=btn_group,
+ text="outline menubutton",
+ bootstyle=(WARNING, OUTLINE),
+ menu=menu,
+ )
+ mb.pack(fill=X, pady=5)
+
+ cb = ttk.Checkbutton(
+ master=btn_group,
+ text="outline toolbutton",
+ bootstyle=(SUCCESS, OUTLINE, TOOLBUTTON),
+ )
+ cb.pack(fill=X, pady=5)
+
+ lb = ttk.Button(master=btn_group, text="link button", bootstyle=LINK)
+ lb.pack(fill=X, pady=5)
+
+ cb1 = ttk.Checkbutton(
+ master=btn_group,
+ text="rounded toggle",
+ bootstyle=(SUCCESS, ROUND, TOGGLE),
+ )
+ cb1.invoke()
+ cb1.pack(fill=X, pady=5)
+
+ cb2 = ttk.Checkbutton(
+ master=btn_group, text="squared toggle", bootstyle=(SQUARE, TOGGLE)
+ )
+ cb2.pack(fill=X, pady=5)
+ cb2.invoke()
+
+ input_group = ttk.Labelframe(
+ master=rframe, text="Other input widgets", padding=10
+ )
+ input_group.pack(fill=BOTH, pady=(10, 5), expand=YES)
+ entry = ttk.Entry(input_group)
+ entry.pack(fill=X)
+ entry.insert(END, "entry widget")
+
+ password = ttk.Entry(master=input_group, show="•")
+ password.pack(fill=X, pady=5)
+ password.insert(END, "password")
+
+ spinbox = ttk.Spinbox(master=input_group, from_=0, to=100)
+ spinbox.pack(fill=X)
+ spinbox.set(45)
+
+ cbo = ttk.Combobox(
+ master=input_group,
+ text=style.theme.name,
+ values=theme_names,
+ exportselection=False,
+ )
+ cbo.pack(fill=X, pady=5)
+ cbo.current(theme_names.index(style.theme.name))
+
+ de = ttk.DateEntry(input_group)
+ de.pack(fill=X)
+
+ return root
+
+
+if __name__ == "__main__":
+
+ app = ttk.Window("ttkbootstrap widget demo")
+
+ bagel = setup_demo(app)
+ bagel.pack(fill=BOTH, expand=YES)
+
+ app.mainloop()
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/__init__.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 0000000..b47dd14
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/__init__.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/__main__.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/__main__.cpython-39.pyc
new file mode 100644
index 0000000..c7ac73a
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/__main__.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/colorutils.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/colorutils.cpython-39.pyc
new file mode 100644
index 0000000..373376a
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/colorutils.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/constants.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/constants.cpython-39.pyc
new file mode 100644
index 0000000..1cb2af1
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/constants.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/icons.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/icons.cpython-39.pyc
new file mode 100644
index 0000000..d1b7487
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/icons.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/publisher.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/publisher.cpython-39.pyc
new file mode 100644
index 0000000..39b22e1
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/publisher.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/scrolled.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/scrolled.cpython-39.pyc
new file mode 100644
index 0000000..25e976a
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/scrolled.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/style.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/style.cpython-39.pyc
new file mode 100644
index 0000000..79d13bf
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/style.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/tableview.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/tableview.cpython-39.pyc
new file mode 100644
index 0000000..397dcc9
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/tableview.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/toast.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/toast.cpython-39.pyc
new file mode 100644
index 0000000..2f231fd
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/toast.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/tooltip.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/tooltip.cpython-39.pyc
new file mode 100644
index 0000000..ea5f64f
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/tooltip.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/utility.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/utility.cpython-39.pyc
new file mode 100644
index 0000000..95bb702
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/utility.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/validation.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/validation.cpython-39.pyc
new file mode 100644
index 0000000..e620a33
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/validation.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/widgets.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/widgets.cpython-39.pyc
new file mode 100644
index 0000000..17c2b15
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/widgets.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/window.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/window.cpython-39.pyc
new file mode 100644
index 0000000..5364f46
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/__pycache__/window.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/colorutils.py b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/colorutils.py
new file mode 100644
index 0000000..b878b0b
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/colorutils.py
@@ -0,0 +1,204 @@
+from PIL import ImageColor
+from colorsys import rgb_to_hls
+
+RGB = 'rgb'
+HSL = 'hsl'
+HEX = 'hex'
+NAME = 'name'
+
+HUE = 360
+SAT = 100
+LUM = 100
+
+
+def color_to_rgb(color, model=HEX):
+ """Convert color value to rgb.
+
+ The color and model parameters represent the color to be converted.
+ The value is expected to be a string for "name" and "hex" models and
+ a Tuple or List for "rgb" and "hsl" models.
+
+ Parameters:
+
+ color (Any):
+ The color values for the model being converted.
+
+ model (str):
+ The color model being converted.
+
+ Returns:
+
+ Tuple[int, int, int]:
+ The rgb color values.
+ """
+ color_ = conform_color_model(color, model)
+ try:
+ return ImageColor.getrgb(color_)
+ except:
+ print('this')
+
+def color_to_hex(color, model=RGB):
+ """Convert color value to hex.
+
+ The color and model parameters represent the color to be converted.
+ The value is expected to be a string for "name" and "hex" models and
+ a Tuple or List for "rgb" and "hsl" models.
+
+ Parameters:
+
+ color (Any):
+ The color values for the model being converted.
+
+ model (str):
+ The color model being converted.
+
+ Returns:
+
+ str:
+ The hexadecimal color value.
+ """
+ r, g, b = color_to_rgb(color, model)
+ return f'#{r:02x}{g:02x}{b:02x}'
+
+def color_to_hsl(color, model=HEX):
+ """Convert color value to hsl.
+
+ The color and model parameters represent the color to be converted.
+ The value is expected to be a string for "name" and "hex" models and
+ a Tuple or List for "rgb" and "hsl" models.
+
+ Parameters:
+
+ color (Any):
+ The color values for the model being converted.
+
+ model (str):
+ The color model being converted.
+
+ Returns:
+
+ Tuple[int, int, int]:
+ The hsl color values.
+ """
+ r, g, b = color_to_rgb(color, model)
+ hls = rgb_to_hls(r/255, g/255, b/255)
+ h = int(hls[0]*HUE)
+ l = int(hls[1]*LUM)
+ s = int(hls[2]*SAT)
+ return h, s, l
+
+def update_hsl_value(color, hue=None, sat=None, lum=None, inmodel=HSL, outmodel=HSL):
+ """Change hue, saturation, or lumenosity of the color based on the
+ hue, sat, lum parameters provided.
+
+ Parameters:
+
+ color (Any):
+ The color
+
+ hue (int):
+ A number between 0 and 360.
+
+ sat (int):
+ A number between 0 and 100.
+
+ lum (int):
+ A number between 0 and 100.
+
+ inmodel (str):
+ The color model used by the color to be changed. One of
+ hsl, rgb, hex, name.
+
+ outmodel (str):
+ The color value model to be returned when the color is
+ changed. One of hsl, rgb, hex.
+
+ Returns:
+
+ Union[Tuple[int, int, int], str]:
+ The color value based on the selected color model.
+ """
+ h, s, l = color_to_hsl(color, inmodel)
+ if hue is not None:
+ h = hue
+ if sat is not None:
+ s = sat
+ if lum is not None:
+ l = lum
+ if outmodel == RGB:
+ return color_to_rgb([h, s, l], HSL)
+ elif outmodel == HEX:
+ return color_to_hex([h, s, l], HSL)
+ else:
+ return h, s, l
+
+
+"""
+https://stackoverflow.com/questions/1855884/determine-font-color-based-on-background-color
+
+"""
+
+def contrast_color(color, model=RGB, darkcolor='#000', lightcolor='#fff'):
+ """Returns the best matching contrasting light or dark color for
+ the given color.
+
+ Parameters:
+
+ color (Any):
+ The color value to evaluate.
+
+ model (str):
+ The model of the color value to be evaluated. 'rgb' by
+ default.
+
+ darkcolor (Any):
+ The color value to be returned when the constrasting color
+ should be dark.
+
+ lightcolor (Any):
+ The color value to be returned when the constrasting color
+ should be light.
+
+ Returns:
+
+ str:
+ The matching color value.
+ """
+ if model != RGB:
+ r, g, b = color_to_rgb(color, model)
+ else:
+ r, g, b = color
+
+ luminance = ((0.299 * r) + (0.587 * g) + (0.114 * b))/255
+ if luminance > 0.5:
+ return darkcolor
+ else:
+ return lightcolor
+
+
+def conform_color_model(color, model):
+ """Conform the color values to a string that can be interpreted
+ by the `PIL.ImageColor.getrgb method`.
+
+ Parameters:
+
+ color (Union[Tuple[int, int, int], str]):
+ The color value to conform.
+
+ model (str):
+ One of 'HSL', 'RGB', or 'HEX'
+
+ Returns:
+
+ str:
+ A color value string that can be used as a parameter in the
+ PIL.ImageColor.getrgb method.
+ """
+ if model == HSL:
+ h, s, l = color
+ return f'hsl({h},{s}%,{l}%)'
+ elif model == RGB:
+ r, g, b = color
+ return f'rgb({r},{g},{b})'
+ else:
+ return color
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/constants.py b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/constants.py
new file mode 100644
index 0000000..d2cd63a
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/constants.py
@@ -0,0 +1,43 @@
+from tkinter.constants import *
+
+DEFAULT = 'default'
+DEFAULT_THEME = 'litera'
+TTK_CLAM = 'clam'
+TTK_ALT = 'alt'
+TTK_DEFAULT = 'default'
+
+# meter constants
+FULL = 'full'
+SEMI = 'semi'
+
+# progressbar constant
+DETERMINATE = 'determinate'
+INDETERMINATE = 'indeterminate'
+
+# bootstyle colors
+PRIMARY = 'primary'
+SECONDARY = 'secondary'
+SUCCESS = 'success'
+DANGER = 'danger'
+WARNING = 'warning'
+INFO = 'info'
+LIGHT = 'light'
+DARK = 'dark'
+
+# bootstyle types
+OUTLINE = 'outline'
+LINK = 'link'
+TOGGLE = 'toggle'
+INVERSE = 'inverse'
+STRIPED = 'striped'
+TOOLBUTTON = 'toolbutton'
+ROUND = 'round'
+SQUARE = 'square'
+
+# treeview constants
+TREE = 'tree'
+HEADINGS = 'headings'
+TREEHEADINGS = 'tree headings'
+
+# state constants
+READONLY = 'readonly'
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/__init__.py b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/__init__.py
new file mode 100644
index 0000000..1edf819
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/__init__.py
@@ -0,0 +1 @@
+from ttkbootstrap.dialogs.dialogs import *
\ No newline at end of file
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/__pycache__/__init__.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 0000000..bb97337
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/__pycache__/__init__.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/__pycache__/colorchooser.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/__pycache__/colorchooser.cpython-39.pyc
new file mode 100644
index 0000000..6625d38
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/__pycache__/colorchooser.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/__pycache__/colordropper.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/__pycache__/colordropper.cpython-39.pyc
new file mode 100644
index 0000000..465eea6
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/__pycache__/colordropper.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/__pycache__/dialogs.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/__pycache__/dialogs.cpython-39.pyc
new file mode 100644
index 0000000..0b66204
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/__pycache__/dialogs.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/colorchooser.py b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/colorchooser.py
new file mode 100644
index 0000000..01e81e1
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/colorchooser.py
@@ -0,0 +1,570 @@
+import ttkbootstrap as ttk
+from ttkbootstrap.validation import add_range_validation, add_validation, validator
+from ttkbootstrap.constants import *
+from tkinter import Frame as tkFrame
+from tkinter import Label as tkLabel
+from ttkbootstrap import utility
+from collections import namedtuple
+from ttkbootstrap import colorutils
+from ttkbootstrap.colorutils import RGB, HSL, HEX, HUE, SAT, LUM
+from PIL import ImageColor
+from ttkbootstrap.dialogs.colordropper import ColorDropperDialog
+from ttkbootstrap.tooltip import ToolTip
+from ttkbootstrap.localization import MessageCatalog
+
+STD_SHADES = [0.9, 0.8, 0.7, 0.4, 0.3]
+STD_COLORS = [
+ '#FF0000', '#FFC000', '#FFFF00', '#00B050',
+ '#0070C0', '#7030A0', '#FFFFFF', '#000000'
+]
+
+ColorValues = namedtuple('ColorValues', 'h s l r g b hex')
+ColorChoice = namedtuple('ColorChoice', 'rgb hsl hex')
+
+PEN = '✛'
+
+
+@validator
+def validate_color(event):
+ try:
+ ImageColor.getrgb(event.postchangetext)
+ return True
+ except:
+ return False
+
+
+class ColorChooser(ttk.Frame):
+ """A class which creates a color chooser widget
+
+ ![](../../assets/dialogs/querybox-get-color.png)
+ """
+
+ def __init__(self, master, initialcolor=None, padding=None):
+ super().__init__(master, padding=padding)
+ self.tframe = ttk.Frame(self, padding=5)
+ self.tframe.pack(fill=X)
+ self.bframe = ttk.Frame(self, padding=(5, 0, 5, 5))
+ self.bframe.pack(fill=X)
+
+ self.notebook = ttk.Notebook(self.tframe)
+ self.notebook.pack(fill=BOTH)
+
+ self.style = ttk.Style.get_instance()
+ self.colors = self.style.colors
+ self.initialcolor = initialcolor or self.colors.bg
+
+ # color variables
+ r, g, b = ImageColor.getrgb(self.initialcolor)
+ h, s, l = colorutils.color_to_hsl((r, g, b), RGB)
+ hx = colorutils.color_to_hex((r, g, b), RGB)
+
+ self.hue = ttk.IntVar(value=h)
+ self.sat = ttk.IntVar(value=s)
+ self.lum = ttk.IntVar(value=l)
+ self.red = ttk.IntVar(value=r)
+ self.grn = ttk.IntVar(value=g)
+ self.blu = ttk.IntVar(value=b)
+ self.hex = ttk.StringVar(value=hx)
+
+ # widget sizes (adjusted by widget scaling)
+ self.spectrum_height = utility.scale_size(self, 240)
+ self.spectrum_width = utility.scale_size(self, 530) # looks better on Mac OS
+ #self.spectrum_width = utility.scale_size(self, 480)
+ self.spectrum_point = utility.scale_size(self, 12)
+
+ # build widgets
+ spectrum_frame = ttk.Frame(self.notebook)
+ self.color_spectrum = self.create_spectrum(spectrum_frame)
+ self.color_spectrum.pack(fill=X, side=TOP)
+ self.luminance_scale = self.create_luminance_scale(self.tframe)
+ self.luminance_scale.pack(fill=X)
+ self.notebook.add(spectrum_frame, text=MessageCatalog.translate('Advanced'))
+
+ themed_colors = [self.colors.get(c) for c in self.style.colors]
+ self.themed_swatches = self.create_swatches(
+ self.notebook, themed_colors)
+ self.standard_swatches = self.create_swatches(
+ self.notebook, STD_COLORS)
+ self.notebook.add(self.themed_swatches, text=MessageCatalog.translate('Themed'))
+ self.notebook.add(self.standard_swatches, text=MessageCatalog.translate('Standard'))
+ preview_frame = self.create_preview(self.bframe)
+ preview_frame.pack(side=LEFT, fill=BOTH, expand=YES, padx=(0, 5))
+ self.color_entries = self.create_value_inputs(self.bframe)
+ self.color_entries.pack(side=RIGHT)
+
+ self.create_spectrum_indicator()
+ self.create_luminance_indicator()
+
+ def create_spectrum(self, master):
+ """Create the color spectrum canvas"""
+ # canvas and point dimensions
+ width = self.spectrum_width
+ height = self.spectrum_height
+ xf = yf = self.spectrum_point
+
+ # create canvas widget and binding
+ canvas = ttk.Canvas(master, width=width, height=height, cursor='tcross')
+ canvas.bind("", self.on_spectrum_interaction, add="+")
+ canvas.bind("", self.on_spectrum_interaction, add="+")
+
+ # add color points
+ for x, colorx in enumerate(range(0, width, xf)):
+ for y, colory in enumerate(range(0, height, yf)):
+ values = self.color_from_coords(colorx, colory)
+ fill = values.hex
+ bbox = [x*xf, y*yf, (x*xf)+xf, (y*yf)+yf]
+ canvas.create_rectangle(*bbox, fill=fill, width=0)
+ return canvas
+
+ def create_spectrum_indicator(self):
+ """Create a square indicator that displays in the position of
+ the selected color"""
+ s = utility.scale_size(self, 10)
+ width = utility.scale_size(self, 2)
+ values = self.get_variables()
+ x1, y1 = self.coords_from_color(values.hex)
+ colorutils.contrast_color(values.hex, 'hex')
+ tag = ['spectrum-indicator']
+ self.color_spectrum.create_rectangle(
+ x1, y1, x1+s, y1+s, width=width, tags=[tag])
+ self.color_spectrum.tag_lower('spectrum-indicator')
+
+ # widget builder methods
+ def create_swatches(self, master, colors):
+ """Create a grid of color swatches"""
+ boxpadx = 2
+ boxpady = 0
+ padxtotal = (boxpadx*15)
+ boxwidth = int((self.spectrum_width-padxtotal)) / len(STD_COLORS)
+ boxheight = int((self.spectrum_height-boxpady) / (len(STD_SHADES)+1))
+ container = ttk.Frame(master)
+
+ # create color combinations
+ color_rows = [colors]
+ lastcol = len(colors)-1
+ for l in STD_SHADES:
+ lum = int(l*LUM)
+ row = []
+ for color in colors:
+ color = colorutils.update_hsl_value(
+ color=color,
+ lum=lum,
+ inmodel='hex',
+ outmodel='hex'
+ )
+ row.append(color)
+ color_rows.append(row)
+
+ # themed colors - regular colors
+ for row in color_rows:
+ rowframe = ttk.Frame(container)
+ for j, color in enumerate(row):
+ swatch = tkFrame(
+ master=rowframe,
+ bg=color,
+ width=boxwidth,
+ height=boxheight,
+ autostyle=False
+ )
+ swatch.bind('', self.on_press_swatch)
+ if j == 0:
+ swatch.pack(side=LEFT, padx=(0, boxpadx))
+ elif j == lastcol:
+ swatch.pack(side=LEFT, padx=(boxpadx, 0))
+ else:
+ swatch.pack(side=LEFT, padx=boxpadx)
+ rowframe.pack(fill=X, expand=YES)
+
+ return container
+
+ def create_preview(self, master):
+ """Create the preview frame for original and new colors"""
+ nbstyle = self.notebook.cget('style')
+ # set the border color to match the notebook border color
+ bordercolor = self.style.lookup(nbstyle, 'bordercolor')
+ container = ttk.Frame(master)
+
+ # the frame and label for the original color (current)
+ old = tkFrame(
+ master=container,
+ relief=FLAT,
+ bd=2,
+ highlightthickness=1,
+ highlightbackground=bordercolor,
+ bg=self.initialcolor,
+ autostyle=False
+ )
+ old.pack(side=LEFT, fill=BOTH, expand=YES, padx=(0, 2))
+ contrastfg = colorutils.contrast_color(
+ color=self.initialcolor,
+ model='hex',
+ )
+ tkLabel(
+ master=old,
+ text=MessageCatalog.translate('Current'),
+ background=self.initialcolor,
+ foreground=contrastfg,
+ autostyle=False,
+ width=7
+ ).pack(anchor=NW)
+
+ # the frame and label for the new color
+ self.preview = tkFrame(
+ master=container,
+ relief=FLAT,
+ bd=2,
+ highlightthickness=1,
+ highlightbackground=bordercolor,
+ bg=self.initialcolor,
+ autostyle=False
+ )
+ self.preview.pack(side=LEFT, fill=BOTH, expand=YES, padx=(2, 0))
+ self.preview_lbl = tkLabel(
+ master=self.preview,
+ text=MessageCatalog.translate('New'),
+ background=self.initialcolor,
+ foreground=contrastfg,
+ autostyle=False,
+ width=7
+ )
+ self.preview_lbl.pack(anchor=NW)
+
+ return container
+
+ def create_value_inputs(self, master):
+ """Create color value input widgets"""
+ container = ttk.Frame(master)
+ for x in range(4):
+ container.columnconfigure(x, weight=1)
+
+ # value labels
+ lbl_cnf = {'master': container, 'anchor': E}
+ ttk.Label(**lbl_cnf, text=f'''{MessageCatalog.translate('Hue')}:''').grid(row=0, column=0, sticky=E)
+ ttk.Label(**lbl_cnf, text=f'''{MessageCatalog.translate('Sat')}:''').grid(row=1, column=0, sticky=E)
+ ttk.Label(**lbl_cnf, text=f'''{MessageCatalog.translate('Lum')}:''').grid(row=2, column=0, sticky=E)
+ ttk.Label(**lbl_cnf, text=f'''{MessageCatalog.translate('Hex')}:''').grid(row=3, column=0, sticky=E)
+ ttk.Label(**lbl_cnf, text=f'''{MessageCatalog.translate('Red')}:''').grid(row=0, column=2, sticky=E)
+ ttk.Label(**lbl_cnf, text=f'''{MessageCatalog.translate('Green')}:''').grid(row=1, column=2, sticky=E)
+ ttk.Label(**lbl_cnf, text=f'''{MessageCatalog.translate('Blue')}:''').grid(row=2, column=2, sticky=E)
+
+ # value spinners and entry widgets
+ rgb_cnf = {'master': container, 'from_': 0, 'to': 255, 'width': 3}
+ sl_cnf = {'master': container, 'from_': 0, 'to': 100, 'width': 3}
+ hue_cnf = {'master': container, 'from_': 0, 'to': 360, 'width': 3}
+ sb_hue = ttk.Spinbox(**hue_cnf, textvariable=self.hue)
+ sb_hue.grid(row=0, column=1, padx=4, pady=2, sticky=EW)
+ sb_sat = ttk.Spinbox(**sl_cnf, textvariable=self.sat)
+ sb_sat.grid(row=1, column=1, padx=4, pady=2, sticky=EW)
+ sb_lum = ttk.Spinbox(**sl_cnf, textvariable=self.lum)
+ sb_lum.grid(row=2, column=1, padx=4, pady=2, sticky=EW)
+ sb_red = ttk.Spinbox(**rgb_cnf, textvariable=self.red)
+ sb_red.grid(row=0, column=3, padx=4, pady=2, sticky=EW)
+ sb_grn = ttk.Spinbox(**rgb_cnf, textvariable=self.grn)
+ sb_grn.grid(row=1, column=3, padx=4, pady=2, sticky=EW)
+ sb_blu = ttk.Spinbox(**rgb_cnf, textvariable=self.blu)
+ sb_blu.grid(row=2, column=3, padx=4, pady=2, sticky=EW)
+ ent_hex = ttk.Entry(container, textvariable=self.hex)
+ ent_hex.grid(row=3, column=1, padx=4, columnspan=3, pady=2, sticky=EW)
+
+ # add input validation
+ add_validation(ent_hex, validate_color)
+ add_range_validation(sb_hue, 0, 360)
+ for sb in [sb_sat, sb_lum]:
+ add_range_validation(sb, 0, 100)
+ for sb in [sb_red, sb_grn, sb_blu]:
+ add_range_validation(sb, 0, 255)
+
+ # event binding for updating colors on value change
+ for sb in [sb_hue, sb_sat, sb_lum]:
+ for sequence in ['<>', '<>', '', '']:
+ sb.bind(
+ sequence=sequence,
+ func=lambda _, w=sb: self.on_entry_value_change(
+ w, HSL),
+ add="+"
+ )
+ for sb in [sb_red, sb_grn, sb_blu]:
+ for sequence in ['<>', '<>', '', '']:
+ sb.bind(
+ sequence=sequence,
+ func=lambda _, w=sb: self.on_entry_value_change(
+ w, RGB),
+ add="+"
+ )
+ for sequence in ['', '']:
+ ent_hex.bind(
+ sequence=sequence,
+ func=lambda _, w=ent_hex: self.on_entry_value_change(
+ w, HEX),
+ add="+"
+ )
+
+ return container
+
+ def create_luminance_scale(self, master):
+ """Create the color luminance canvas"""
+ # widget dimensions
+ height = xf = self.spectrum_point
+ width = self.spectrum_width
+
+ values = self.get_variables()
+ canvas = ttk.Canvas(master, height=height, width=width)
+
+ # add color points to scale
+ for x, l in enumerate(range(0, width, xf)):
+ lum = l/width*LUM
+ fill = colorutils.update_hsl_value(
+ color=values.hex,
+ lum=lum,
+ inmodel='hex',
+ outmodel='hex'
+ )
+ bbox = [x*xf, 0, (x*xf)+xf, height]
+ tag = f'color{x}'
+ canvas.create_rectangle(*bbox, fill=fill, width=0, tags=[tag])
+ canvas.bind("", self.on_luminance_interaction, add="+")
+ canvas.bind("", self.on_luminance_interaction, add="+")
+ return canvas
+
+ def create_luminance_indicator(self):
+ """Create an indicator that displays in the position of the
+ luminance value"""
+ lum = 50
+ x1 = int(lum / LUM * self.spectrum_width) - \
+ ((self.spectrum_point - 2)//2)
+ y1 = 0
+ x2 = x1 + self.spectrum_point
+ y2 = self.spectrum_point - 3
+ tag = 'luminance-indicator'
+ bbox = [x1, y1, x2, y2]
+ self.luminance_scale.create_rectangle(
+ *bbox, fill='white', outline='black', tags=[tag])
+ self.luminance_scale.tag_lower(tag)
+
+ def coords_from_color(self, hexcolor):
+ """Get the coordinates on the color spectrum from the color
+ value"""
+ h, s, _ = colorutils.color_to_hsl(hexcolor)
+ x = (h / HUE) * self.spectrum_width
+ y = (1-(s / SAT)) * self.spectrum_height
+ return x, y
+
+ def color_from_coords(self, x, y):
+ """Get the color value from the mouse position in the color
+ spectrum"""
+ HEIGHT = self.spectrum_height
+ WIDTH = self.spectrum_width
+ h = int(min(HUE, max(0, (HUE/WIDTH) * x)))
+ s = int(min(SAT, max(0, SAT - ((SAT/HEIGHT) * y))))
+ l = 50
+ hx = colorutils.color_to_hex([h, s, l], 'hsl')
+ r, g, b = colorutils.color_to_rgb(hx)
+ return ColorValues(h, s, l, r, g, b, hx)
+
+ def set_variables(self, h, s, l, r, g, b, hx):
+ """Update the color value variables"""
+ self.hue.set(h)
+ self.sat.set(s)
+ self.lum.set(l)
+ self.red.set(r)
+ self.grn.set(g)
+ self.blu.set(b)
+ self.hex.set(hx)
+
+ def get_variables(self):
+ """Get the values of all color models and return a
+ tuple of color values"""
+ h = self.hue.get()
+ s = self.sat.get()
+ l = self.lum.get()
+ r = self.red.get()
+ g = self.grn.get()
+ b = self.blu.get()
+ hx = self.hex.get()
+ return ColorValues(h, s, l, r, g, b, hx)
+
+ def update_preview(self):
+ """Update the color in the preview frame"""
+ hx = self.hex.get()
+ fg = colorutils.contrast_color(
+ color=hx,
+ model='hex',
+ )
+ self.preview.configure(bg=hx)
+ self.preview_lbl.configure(bg=hx, fg=fg)
+
+ def update_luminance_scale(self):
+ """Update the luminance scale with the change in hue and saturation"""
+ values = self.get_variables()
+ width = self.spectrum_width
+ xf = self.spectrum_point
+ for x, l in enumerate(range(0, width, xf)):
+ lum = l/width*LUM
+ fill = colorutils.update_hsl_value(
+ color=values.hex,
+ lum=lum,
+ inmodel='hex',
+ outmodel='hex'
+ )
+ tag = f'color{x}'
+ self.luminance_scale.itemconfig(tag, fill=fill)
+
+ def update_luminance_indicator(self):
+ """Update the position of the luminance indicator"""
+ lum = self.lum.get()
+ x = int(lum / LUM * self.spectrum_width) - \
+ ((self.spectrum_point - 2)//2)
+ self.luminance_scale.moveto('luminance-indicator', x, 0)
+ self.luminance_scale.tag_raise('luminance-indicator')
+
+ def update_spectrum_indicator(self):
+ """Move the spectrum indicator to a new location"""
+ values = self.get_variables()
+ x, y = self.coords_from_color(values.hex)
+ # move to the new color location
+ self.color_spectrum.moveto('spectrum-indicator', x, y)
+ self.color_spectrum.tag_raise('spectrum-indicator')
+ # adjust the outline color based on contrast of background
+ color = colorutils.contrast_color(values.hex, 'hex')
+ self.color_spectrum.itemconfig('spectrum-indicator', outline=color)
+
+ # color events
+ def sync_color_values(self, model):
+ """Callback for when a color value changes. A change in one
+ value will automatically update the other values so that all
+ color models remain in sync."""
+ values = self.get_variables()
+ if model == HEX:
+ hx = values.hex
+ r, g, b = colorutils.color_to_rgb(hx)
+ h, s, l = colorutils.color_to_hsl(hx)
+ elif model == RGB:
+ r, g, b = values.r, values.g, values.b
+ h, s, l = colorutils.color_to_hsl([r, g, b], 'rgb')
+ hx = colorutils.color_to_hex([r, g, b])
+ elif model == HSL:
+ h, s, l = values.h, values.s, values.l
+ r, g, b = colorutils.color_to_rgb([h, s, l], 'hsl')
+ hx = colorutils.color_to_hex([h, s, l], 'hsl')
+ self.set_variables(h, s, l, r, g, b, hx)
+ self.update_preview()
+ self.update_luminance_indicator()
+
+ def on_entry_value_change(self, widget: ttk.Spinbox, model):
+ """Update the widget colors when the color value input is
+ changed"""
+ is_valid = widget.validate()
+ if is_valid:
+ self.sync_color_values(model)
+ self.update_luminance_scale()
+ self.update_spectrum_indicator()
+
+ def on_press_swatch(self, event):
+ """Update the widget colors when a color swatch is clicked."""
+ button: tkFrame = self.nametowidget(event.widget)
+ color = button.cget('background')
+ self.hex.set(color)
+ self.sync_color_values(HEX)
+ self.update_luminance_scale()
+ self.update_spectrum_indicator()
+
+ def on_spectrum_interaction(self, event):
+ """Update the widget colors when the color spectrum canvas is
+ pressed"""
+ values = self.color_from_coords(event.x, event.y)
+ self.hue.set(values.h)
+ self.sat.set(values.s)
+ self.lum.set(values.l)
+ self.sync_color_values(HSL)
+ self.update_luminance_scale()
+ self.update_spectrum_indicator()
+
+ def on_luminance_interaction(self, event):
+ """Update the widget colors when the color luminance scale is
+ pressed"""
+ l = max(0, min(LUM, int((event.x / self.spectrum_width) * LUM)))
+ self.lum.set(l)
+ self.sync_color_values(HSL)
+
+
+from ttkbootstrap.dialogs import Dialog
+
+class ColorChooserDialog(Dialog):
+ """A class which displays a color chooser dialog. When a color
+ option is selected and the "OK" button is pressed, the dialog will
+ return a namedtuple that contains the color values for rgb, hsl, and
+ hex. These values can be accessed by indexing the tuple or by using
+ the named fields.
+
+ ![](../../assets/dialogs/querybox-get-color.png)
+
+ Examples:
+
+ ```python
+ >>> cd = ColorChooserDialog()
+ >>> cd.show()
+ >>> colors = cd.result
+ >>> colors.hex
+ '#5fb04f'
+ >>> colors[2]
+ '#5fb04f
+ >>> colors.rgb
+ (95, 176, 79)
+ >>> colors[0]
+ (95, 176, 79)
+ ```
+ """
+
+ def __init__(self, parent=None, title="Color Chooser", initialcolor=None):
+ title = MessageCatalog.translate(title)
+ super().__init__(parent=parent, title=title)
+ self.initialcolor = initialcolor
+ self.dropper = ColorDropperDialog()
+ self.dropper.result.trace_add('write', self.trace_dropper_color)
+
+ def create_body(self, master):
+ self.colorchooser = ColorChooser(master, self.initialcolor)
+ self.colorchooser.pack(fill=BOTH, expand=YES)
+
+ def create_buttonbox(self, master):
+ frame = ttk.Frame(master, padding=(5, 5))
+
+ # OK button
+ ok = ttk.Button(frame, bootstyle=PRIMARY, width=6, text=MessageCatalog.translate('OK'))
+ ok.bind("", lambda _: ok.invoke())
+ ok.configure(command=lambda b=ok: self.on_button_press(b))
+ ok.pack(padx=2, side=RIGHT)
+
+ # Cancel button
+ cancel = ttk.Button(frame, bootstyle=SECONDARY, width=6, text=MessageCatalog.translate('Cancel'))
+ cancel.bind("", lambda _: cancel.invoke())
+ cancel.configure(command=lambda b=cancel: self.on_button_press(b))
+ cancel.pack(padx=2, side=RIGHT)
+
+ # color dropper (not supported on Mac OS)
+ if self._toplevel.winsys != 'aqua':
+ dropper = ttk.Label(frame, text=PEN, font=('-size 16'))
+ ToolTip(dropper, MessageCatalog.translate('color dropper')) # add tooltip
+ dropper.pack(side=RIGHT, padx=2)
+ dropper.bind("", self.on_show_colordropper)
+
+ frame.pack(side=BOTTOM, fill=X, anchor=S)
+
+ def on_show_colordropper(self, event):
+ self.dropper.show()
+
+ def trace_dropper_color(self, *_):
+ values = self.dropper.result.get()
+ self.colorchooser.hex.set(values[2])
+ self.colorchooser.sync_color_values('hex')
+
+ def on_button_press(self, button):
+ if button.cget('text') == 'OK':
+ values = self.colorchooser.get_variables()
+ self._result = ColorChoice(
+ rgb=(values.r, values.g, values.b),
+ hsl=(values.h, values.s, values.l),
+ hex=values.hex
+ )
+ self._toplevel.destroy()
+ self._toplevel.destroy()
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/colordropper.py b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/colordropper.py
new file mode 100644
index 0000000..67e137f
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/colordropper.py
@@ -0,0 +1,170 @@
+"""
+ NOTE: https://stackoverflow.com/questions/25467288/pils-imagegrab-is-capturing-at-the-wrong-resolution
+
+ !! This widget is not currently supported on Mac OS
+"""
+import tkinter as tk
+import ttkbootstrap as ttk
+from ttkbootstrap.constants import *
+from ttkbootstrap import colorutils, utility
+from PIL import ImageGrab, ImageTk, Image
+from collections import namedtuple
+
+ColorChoice = namedtuple('ColorChoice', 'rgb hsl hex')
+
+
+class ColorDropperDialog:
+ """A widget that displays an indicator and a zoom window for
+ selecting a color on the screen.
+
+ Left-click the mouse button to select a color. The result is
+ stored in the `result` property as a `ColorChoice` tuple which
+ contains named fields for rgb, hsl, and hex color models.
+
+ Zoom in and out on the zoom window by using the mouse wheel.
+
+ This widget is implemented for **Windows** and **Linux** only.
+
+ ![](../../assets/dialogs/color-dropper.png)
+
+ !!! warning "high resolution displays"
+ This widget may not function properly on high resolution
+ displays if you are not using the application in high
+ resolution mode. This is enabled automatically on Windows.
+ """
+
+ def __init__(self):
+ self.toplevel: ttk.Toplevel = None
+ self.result = ttk.Variable()
+
+ def build_screenshot_canvas(self):
+ """Build the screenshot canvas"""
+ self.screenshot_canvas = ttk.Canvas(
+ self.toplevel, cursor='tcross', autostyle=False)
+ self.screenshot_data = ImageGrab.grab()
+ self.screenshot_image = ImageTk.PhotoImage(self.screenshot_data)
+ self.screenshot_canvas.create_image(
+ 0, 0, image=self.screenshot_image, anchor=NW)
+ self.screenshot_canvas.pack(fill=BOTH, expand=YES)
+
+ def build_zoom_toplevel(self, master):
+ """Build the toplevel widget that shows the zoomed version of
+ the pixels underneath the mouse cursor."""
+ height = utility.scale_size(self.toplevel, 100)
+ width = utility.scale_size(self.toplevel, 100)
+ text_xoffset = utility.scale_size(self.toplevel, 50)
+ text_yoffset = utility.scale_size(self.toplevel, 50)
+ toplevel = ttk.Toplevel(master)
+ toplevel.transient(master)
+ if self.toplevel.winsys == 'x11':
+ toplevel.attributes('-type', 'tooltip')
+ else:
+ toplevel.overrideredirect(True)
+ toplevel.geometry(f'{width}x{height}')
+ toplevel.lift()
+ self.zoom_canvas = ttk.Canvas(
+ toplevel, borderwidth=1, height=self.zoom_height, width=self.zoom_width)
+ self.zoom_canvas.create_image(0, 0, tags=['image'], anchor=NW)
+ self.zoom_canvas.create_text(
+ text_xoffset, text_yoffset, text="+", fill="white", tags=['indicator'])
+ self.zoom_canvas.pack(fill=BOTH, expand=YES)
+ self.zoom_toplevel = toplevel
+
+ def on_mouse_wheel(self, event: tk.Event):
+ """Zoom in and out on the image underneath the mouse
+ TODO Cross platform testing needed
+ """
+ if self.toplevel.winsys.lower() == 'win32':
+ delta = -int(event.delta / 120)
+ elif self.toplevel.winsys.lower() == 'aqua':
+ delta = -event.delta
+ elif event.num == 4:
+ delta = -1
+ elif event.num == 5:
+ delta = 1
+ self.zoom_level += delta
+ self.on_mouse_motion()
+
+ def on_left_click(self, _):
+ """Capture the color underneath the mouse cursor and destroy
+ the toplevel widget"""
+ # add logic here to capture the image color
+ hx = self.get_hover_color()
+ hsl = colorutils.color_to_hsl(hx)
+ rgb = colorutils.color_to_rgb(hx)
+ self.result.set(ColorChoice(rgb, hsl, hx))
+ self.toplevel.destroy()
+ self.zoom_toplevel.destroy()
+ self.toplevel.grab_release()
+ return self.result.get()
+
+ def on_right_click(self, _):
+ """Close the color dropper without saving any color information"""
+ self.zoom_toplevel.destroy()
+ self.toplevel.grab_release()
+ self.toplevel.destroy()
+
+ def on_mouse_motion(self, event=None):
+ """Callback for mouse motion"""
+ if event is None:
+ x, y = self.toplevel.winfo_pointerxy()
+ else:
+ x = event.x
+ y = event.y
+ # move snip window
+ self.zoom_toplevel.geometry(
+ f'+{x+self.zoom_xoffset}+{y+self.zoom_yoffset}')
+ # update the snip image
+ bbox = (x-self.zoom_level, y-self.zoom_level,
+ x+self.zoom_level+1, y+self.zoom_level+1)
+ size = (self.zoom_width, self.zoom_height)
+ self.zoom_data = self.screenshot_data.crop(
+ bbox).resize(size, Image.BOX)
+ self.zoom_image = ImageTk.PhotoImage(self.zoom_data)
+ self.zoom_canvas.itemconfig('image', image=self.zoom_image)
+ hover_color = self.get_hover_color()
+ contrast_color = colorutils.contrast_color(hover_color, 'hex')
+ self.zoom_canvas.itemconfig('indicator', fill=contrast_color)
+
+ def get_hover_color(self):
+ """Get the color that is hovered over by the mouse cursor."""
+ x1, y1, x2, y2 = self.zoom_canvas.bbox('indicator')
+ x = x1 + (x2-x1)//2
+ y = y1 + (y2-y2)//2
+ r, g, b = self.zoom_data.getpixel((x, y))
+ hx = colorutils.color_to_hex((r, g, b))
+ return hx
+
+ def show(self):
+ """Show the toplevel window"""
+ self.toplevel = ttk.Toplevel(alpha=1)
+ self.toplevel.wm_attributes('-fullscreen', True)
+ self.build_screenshot_canvas()
+
+ # event binding
+ self.toplevel.bind("", self.on_mouse_motion, "+")
+ self.toplevel.bind("", self.on_left_click, "+")
+ self.toplevel.bind("", self.on_right_click, "+")
+
+ if self.toplevel.winsys.lower() == 'x11':
+ self.toplevel.bind("", self.on_mouse_wheel, "+")
+ self.toplevel.bind("", self.on_mouse_wheel, "+")
+ else:
+ self.toplevel.bind("", self.on_mouse_wheel, "+")
+
+ # initial snip setup
+ self.zoom_level = 2
+ self.zoom_toplevel: ttk.Toplevel = None
+ self.zoom_data = None
+ self.zoom_image = None
+ self.zoom_height = utility.scale_size(self.toplevel, 100)
+ self.zoom_width = utility.scale_size(self.toplevel, 100)
+ self.zoom_xoffset = utility.scale_size(self.toplevel, 10)
+ self.zoom_yoffset = utility.scale_size(self.toplevel, 10)
+
+ self.build_zoom_toplevel(self.toplevel)
+ self.toplevel.grab_set()
+ self.toplevel.lift('.')
+ self.zoom_toplevel.lift(self.toplevel)
+
+ self.on_mouse_motion()
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/dialogs.py b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/dialogs.py
new file mode 100644
index 0000000..6f6999e
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/dialogs/dialogs.py
@@ -0,0 +1,1879 @@
+"""
+ This module contains various base dialog base classes that can be
+ used to create custom dialogs for the end user.
+
+ These classes serve as the basis for the pre-defined static helper
+ methods in the `Messagebox`, and `Querybox` container classes.
+"""
+
+import calendar
+import textwrap
+import locale
+from datetime import datetime
+from tkinter import font
+import ttkbootstrap as ttk
+from ttkbootstrap import utility
+from ttkbootstrap.icons import Icon
+from ttkbootstrap.constants import *
+from tkinter import BaseWidget
+from ttkbootstrap.localization import MessageCatalog
+
+
+class Dialog(BaseWidget):
+ """A simple dialog base class."""
+
+ def __init__(self, parent=None, title="", alert=False):
+ """
+ Parameters:
+
+ parent (Widget):
+ Makes the window the logical parent of the message box.
+ The messagebox is displayed on top of its parent window.
+
+ title (str):
+ The string displayed as the title of the message box.
+ This option is ignored on Mac OS X, where platform
+ guidelines forbid the use of a title on this kind of
+ dialog.
+
+ alert (bool):
+ Ring the display's bell when the dialog is shown.
+ """
+ BaseWidget._setup(self, parent, {})
+ self._winsys = self.master.tk.call("tk", "windowingsystem")
+ self._parent = parent
+ self._toplevel = None
+ self._title = title or " "
+ self._result = None
+ self._alert = alert
+ self._initial_focus = None
+
+ def _locate(self):
+ toplevel = self._toplevel
+ if self._parent is None:
+ master = toplevel.master
+ else:
+ master = self._parent
+ x = master.winfo_rootx()
+ y = master.winfo_rooty()
+ toplevel.geometry(f"+{x}+{y}")
+
+ def show(self, position=None):
+ """Show the popup dialog
+ Parameters:
+
+ position: Tuple[int, int]
+ The x and y coordinates used to position the dialog. By
+ default the dialog will anchor at the NW corner of the
+ parent window.
+ """
+ self._result = None
+ self.build()
+
+ if position is None:
+ self._locate()
+ else:
+ try:
+ x, y = position
+ self._toplevel.geometry(f'+{x}+{y}')
+ except:
+ self._locate()
+
+ self._toplevel.deiconify()
+ if self._alert:
+ self._toplevel.bell()
+
+ if self._initial_focus:
+ self._initial_focus.focus_force()
+
+ self._toplevel.grab_set()
+ self._toplevel.wait_window()
+
+ def create_body(self, master):
+ """Create the dialog body.
+
+ This method should be overridden and is called by the `build`
+ method. Set the `self._initial_focus` for the widget that
+ should receive the initial focus.
+
+ Parameters:
+
+ master (Widget):
+ The parent widget.
+ """
+ raise NotImplementedError
+
+ def create_buttonbox(self, master):
+ """Create the dialog button box.
+
+ This method should be overridden and is called by the `build`
+ method. Set the `self._initial_focus` for the button that
+ should receive the intial focus.
+
+ Parameters:
+
+ master (Widget):
+ The parent widget.
+ """
+ raise NotImplementedError
+
+ def build(self):
+ """Build the dialog from settings"""
+
+ # setup toplevel based on widowing system
+ if self._winsys == "win32":
+ self._toplevel = ttk.Toplevel(
+ transient=self.master,
+ title=self._title,
+ resizable=(0, 0),
+ minsize=(250, 15),
+ iconify=True,
+ )
+ else:
+ self._toplevel = ttk.Toplevel(
+ transient=self.master,
+ title=self._title,
+ resizable=(0, 0),
+ windowtype="dialog",
+ iconify=True,
+ )
+
+ self._toplevel.withdraw() # reset the iconify state
+
+ # bind event to window close
+ self._toplevel.bind("", lambda _: self._toplevel.destroy())
+
+ # set position of popup from parent window
+ # self._locate()
+
+ # create widgets
+ self.create_body(self._toplevel)
+ self.create_buttonbox(self._toplevel)
+
+ # update the window before showing
+ self._toplevel.update_idletasks()
+
+ @property
+ def result(self):
+ """Returns the result of the dialog."""
+ return self._result
+
+
+class MessageDialog(Dialog):
+ """A simple modal dialog class that can be used to build simple
+ message dialogs.
+
+ Displays a message and a set of buttons. Each of the buttons in the
+ message window is identified by a unique symbolic name. After the
+ message window is popped up, the message box awaits for the user to
+ select one of the buttons. Then it returns the symbolic name of the
+ selected button. Use a `Toplevel` widget for more advanced modal
+ dialog designs.
+ """
+
+ def __init__(
+ self,
+ message,
+ title=" ",
+ buttons=None,
+ command=None,
+ width=50,
+ parent=None,
+ alert=False,
+ default=None,
+ padding=(20, 20),
+ icon=None,
+ **kwargs,
+ ):
+ """
+ Parameters:
+
+ message (str):
+ A message to display in the message box.
+
+ title (str):
+ The string displayed as the title of the message box.
+ This option is ignored on Mac OS X, where platform
+ guidelines forbid the use of a title on this kind of
+ dialog.
+
+ buttons (List[str]):
+ A list of buttons to appear at the bottom of the popup
+ messagebox. The buttons can be a list of strings which
+ will define the symbolic name and the button text.
+ `['OK', 'Cancel']`. Alternatively, you can assign a
+ bootstyle to each button by using the colon to separate the
+ button text and the bootstyle. If no colon is found, then
+ the style is set to 'primary' by default.
+ `['OK:success','Cancel:danger']`.
+
+ command (Tuple[Callable, str]):
+ The function to invoke when the user closes the dialog.
+ The actual command is a tuple that consists of the
+ function to call and the symbolic name of the button that
+ closes the dialog.
+
+ width (int):
+ The maximum number of characters per line in the message.
+ If the text stretches beyond the limit, the line will break
+ at the word.
+
+ parent (Widget):
+ Makes the window the logical parent of the message box.
+ The messagebox is displayed on top of its parent window.
+
+ alert (bool):
+ Ring the display's bell when the dialog is shown.
+
+ default (str):
+ The symbolic name of the default button. The default
+ button is invoked when the the key is pressed.
+ If no default is provided, the right-most button in the
+ button list will be set as the default.,
+
+ padding (Union[int, Tuple[int]]):
+ The amount of space between the border and the widget
+ contents.
+
+ icon (str):
+ An image path, path-like object or image data to be
+ displayed to the left of the text.
+
+ **kwargs (Dict):
+ Other optional keyword arguments.
+
+ Example:
+
+ ```python
+ root = tk.Tk()
+
+ md = MessageDialog("Displays a message with buttons.")
+ md.show()
+ ```
+ """
+ super().__init__(parent, title, alert)
+ self._message = message
+ self._command = command
+ self._width = width
+ self._alert = alert
+ self._default = (default,)
+ self._padding = padding
+ self._icon = icon
+ self._localize = kwargs.get("localize")
+
+ if buttons is None:
+ self._buttons = [
+ f"{MessageCatalog.translate('Cancel')}:secondary",
+ f"{MessageCatalog.translate('OK')}:primary",
+ ]
+ else:
+ self._buttons = buttons
+
+ def create_body(self, master):
+ """Overrides the parent method; adds the message section."""
+ container = ttk.Frame(master, padding=self._padding)
+ if self._icon:
+ try:
+ # assume this is image data
+ self._img = ttk.PhotoImage(data=self._icon)
+ icon_lbl = ttk.Label(container, image=self._img)
+ icon_lbl.pack(side=LEFT, padx=5)
+ except:
+ try:
+ # assume this is a file path
+ self._img = ttk.PhotoImage(file=self._icon)
+ icon_lbl = ttk.Label(container, image=self._img)
+ icon_lbl.pack(side=LEFT, padx=5)
+ except:
+ # icon is neither data nor a valid file path
+ print("MessageDialog icon is invalid")
+
+ if self._message:
+ for msg in self._message.split("\n"):
+ message = "\n".join(textwrap.wrap(msg, width=self._width))
+ message_label = ttk.Label(container, text=message)
+ message_label.pack(pady=(0, 3), fill=X, anchor=N)
+ container.pack(fill=X, expand=True)
+
+ def create_buttonbox(self, master):
+ """Overrides the parent method; adds the message buttonbox"""
+ frame = ttk.Frame(master, padding=(5, 5))
+
+ button_list = []
+
+ for i, button in enumerate(self._buttons[::-1]):
+ cnf = button.split(":")
+ if len(cnf) == 2:
+ text, bootstyle = cnf
+ else:
+ text = cnf[0]
+ bootstyle = "secondary"
+
+ if self._localize == True:
+ text = MessageCatalog.translate(text)
+
+ btn = ttk.Button(frame, bootstyle=bootstyle, text=text)
+ btn.configure(command=lambda b=btn: self.on_button_press(b))
+ btn.pack(padx=2, side=RIGHT)
+ btn.lower() # set focus traversal left-to-right
+ button_list.append(btn)
+
+ if self._default is not None and text == self._default:
+ self._initial_focus = btn
+ elif self._default is None and i == 0:
+ self._initial_focus = btn
+
+ # bind default button to return key press and set focus
+ self._toplevel.bind("", lambda _, b=btn: b.invoke())
+ self._toplevel.bind("", lambda _, b=btn: b.invoke())
+
+ ttk.Separator(self._toplevel).pack(fill=X)
+ frame.pack(side=BOTTOM, fill=X, anchor=S)
+
+ if not self._initial_focus:
+ self._initial_focus = button_list[0]
+
+ def on_button_press(self, button):
+ """Save result, destroy the toplevel, and execute command."""
+ self._result = button["text"]
+ command = self._command
+ if command is not None:
+ command()
+ self._toplevel.destroy()
+
+ def show(self, position=None):
+ """Create and display the popup messagebox."""
+ super().show(position)
+
+
+class QueryDialog(Dialog):
+ """A simple modal dialog class that can be used to build simple
+ data input dialogs. Displays a prompt, and input box, and a set of
+ buttons. Additional data manipulation can be performed on the
+ user input post-hoc by overriding the `apply` method.
+
+ Use a `Toplevel` widget for more advanced modal dialog designs.
+ """
+
+ def __init__(
+ self,
+ prompt,
+ title=" ",
+ initialvalue="",
+ minvalue=None,
+ maxvalue=None,
+ width=65,
+ datatype=str,
+ padding=(20, 20),
+ parent=None,
+ ):
+ """
+ Parameters:
+
+ prompt (str):
+ A message to display in the message box above the entry
+ widget.
+
+ title (str):
+ The string displayed as the title of the message box.
+ This option is ignored on Mac OS X, where platform
+ guidelines forbid the use of a title on this kind of
+ dialog.
+
+ initialvalue (Any):
+ The initial value in the entry widget.
+
+ minvalue (Any):
+ The minimum allowed value. Only valid for int and float
+ data types.
+
+ maxvalue (Any):
+ The maximum allowed value. Only valid for int and float
+ data types.
+
+ width (int):
+ The maximum number of characters per line in the
+ message. If the text stretches beyond the limit, the
+ line will break at the word.
+
+ parent (Widget):
+ Makes the window the logical parent of the message box.
+ The messagebox is displayed on top of its parent
+ window.
+
+ padding (Union[int, Tuple[int]]):
+ The amount of space between the border and the widget
+ contents.
+
+ datatype (Union[int, str, float]):
+ The data type used to validate the entry value.
+ """
+ super().__init__(parent, title)
+ self._prompt = prompt
+ self._initialvalue = initialvalue
+ self._minvalue = minvalue
+ self._maxvalue = maxvalue
+ self._width = width
+ self._datatype = datatype
+ self._padding = padding
+ self._result = None
+
+ def create_body(self, master):
+ """Overrides the parent method; adds the message and input
+ section."""
+ frame = ttk.Frame(master, padding=self._padding)
+ if self._prompt:
+ for p in self._prompt.split("\n"):
+ prompt = "\n".join(textwrap.wrap(p, width=self._width))
+ prompt_label = ttk.Label(frame, text=prompt)
+ prompt_label.pack(pady=(0, 5), fill=X, anchor=N)
+
+ entry = ttk.Entry(master=frame)
+ entry.insert(END, self._initialvalue)
+ entry.pack(pady=(0, 5), fill=X)
+ entry.bind("", self.on_submit)
+ entry.bind("", self.on_submit)
+ entry.bind("", self.on_cancel)
+ frame.pack(fill=X, expand=True)
+ self._initial_focus = entry
+
+ def create_buttonbox(self, master):
+ """Overrides the parent method; adds the message buttonbox"""
+ frame = ttk.Frame(master, padding=(5, 10))
+
+ submit = ttk.Button(
+ master=frame,
+ bootstyle="primary",
+ text=MessageCatalog.translate("Submit"),
+ command=self.on_submit,
+ )
+ submit.pack(padx=5, side=RIGHT)
+ submit.lower() # set focus traversal left-to-right
+
+ cancel = ttk.Button(
+ master=frame,
+ bootstyle="secondary",
+ text=MessageCatalog.translate("Cancel"),
+ command=self.on_cancel,
+ )
+ cancel.pack(padx=5, side=RIGHT)
+ cancel.lower() # set focus traversal left-to-right
+
+ ttk.Separator(self._toplevel).pack(fill=X)
+ frame.pack(side=BOTTOM, fill=X, anchor=S)
+
+ def on_submit(self, *_):
+ """Save result, destroy the toplevel, and apply any post-hoc
+ data manipulations."""
+ self._result = self._initial_focus.get()
+ valid_result = self.validate()
+ if not valid_result:
+ return # keep toplevel open for valid response
+ self._toplevel.destroy()
+ self.apply()
+
+ def on_cancel(self, *_):
+ """Close the toplevel and return empty."""
+ self._toplevel.destroy()
+ return
+
+ def validate(self):
+ """Validate the data
+
+ This method is called automatically to validate the data before
+ the dialog is destroyed. Can be subclassed and overridden.
+ """
+ # no default checks required for string data types
+ if self._datatype not in [float, int, complex]:
+ return True
+
+ # convert result to appropriate data type
+ try:
+ self._result = self._datatype(self._result)
+ except ValueError:
+ msg = MessageCatalog.translate("Should be of data type")
+ Messagebox.ok(
+ message=f"{msg} `{self._datatype}`",
+ title=MessageCatalog.translate("Invalid data type"),
+ parent=self._toplevel
+ )
+ return False
+
+ # max value range
+ if self._maxvalue is not None:
+ if self._result > self._maxvalue:
+ msg = MessageCatalog.translate("Number cannot be greater than")
+ Messagebox.ok(
+ message=f"{msg} {self._maxvalue}",
+ title=MessageCatalog.translate("Out of range"),
+ parent=self._toplevel
+ )
+ return False
+
+ # min value range
+ if self._minvalue is not None:
+ if self._result < self._minvalue:
+ msg = MessageCatalog.translate("Number cannot be less than")
+ Messagebox.ok(
+ message=f"{msg} {self._minvalue}",
+ title=MessageCatalog.translate("Out of range"),
+ parent=self._toplevel
+ )
+ return False
+
+ # valid result
+ return True
+
+ def apply(self):
+ """Process the data.
+
+ This method is called automatically to process the data after
+ the dialog is destroyed. By default, it does nothing.
+ """
+ pass # override
+
+
+class DatePickerDialog:
+ """A dialog that displays a calendar popup and returns the
+ selected date as a datetime object.
+
+ The current date is displayed by default unless the `startdate`
+ parameter is provided.
+
+ The month can be changed by clicking the chevrons to the left
+ and right of the month-year title.
+
+ Left-click the arrow to move the calendar by one month.
+ Right-click the arrow to move the calendar by one year.
+ Right-click the title to reset the calendar to the start date.
+
+ The starting weekday can be changed with the `firstweekday`
+ parameter for geographies that do not start the calendar on
+ Sunday, which is the default.
+
+ The widget grabs focus and all screen events until released.
+ If you want to cancel a date selection, click the 'X' button
+ at the top-right corner of the widget.
+
+ The bootstyle api may be used to change the style of the widget.
+ The available colors include -> primary, secondary, success,
+ info, warning, danger, light, dark.
+
+ ![](../../assets/dialogs/date-picker-dialog.png)
+
+ """
+
+ locale.setlocale(locale.LC_ALL, locale.setlocale(locale.LC_TIME, ""))
+
+ def __init__(
+ self,
+ parent=None,
+ title=" ",
+ firstweekday=6,
+ startdate=None,
+ bootstyle=PRIMARY,
+ ):
+ """
+ Parameters:
+
+ parent (Widget):
+ The parent widget; the popup will appear to the
+ bottom-right of the parent widget. If no parent is
+ provided, the widget is centered on the screen.
+
+ title (str):
+ The text that appears on the titlebar.
+
+ firstweekday (int):
+ Specifies the first day of the week. 0=Monday,
+ 1=Tuesday, etc...
+
+ startdate (datetime):
+ The date to be in focus when the widget is
+ displayed.
+
+ bootstyle (str):
+ The following colors can be used to change the color of
+ the title and hover / pressed color -> primary,
+ secondary, info, warning, success, danger, light, dark.
+ """
+ self.parent = parent
+ self.root = ttk.Toplevel(
+ title=title,
+ transient=self.parent,
+ resizable=(False, False),
+ topmost=True,
+ minsize=(226, 1),
+ iconify=True,
+ )
+ self.firstweekday = firstweekday
+ self.startdate = startdate or datetime.today().date()
+ self.bootstyle = bootstyle or PRIMARY
+
+ self.date_selected = self.startdate
+ self.date = startdate or self.date_selected
+ self.calendar = calendar.Calendar(firstweekday=firstweekday)
+
+ self.titlevar = ttk.StringVar()
+ self.datevar = ttk.IntVar()
+
+ self._setup_calendar()
+ self.root.grab_set()
+ self.root.wait_window()
+
+ def _setup_calendar(self):
+ """Setup the calendar widget"""
+ # create the widget containers
+ self.frm_calendar = ttk.Frame(
+ master=self.root, padding=0, borderwidth=0, relief=FLAT
+ )
+ self.frm_calendar.pack(fill=BOTH, expand=YES)
+ self.frm_title = ttk.Frame(self.frm_calendar, padding=(3, 3))
+ self.frm_title.pack(fill=X)
+ self.frm_header = ttk.Frame(self.frm_calendar, bootstyle=SECONDARY)
+ self.frm_header.pack(fill=X)
+
+ # setup the toplevel widget
+ self.root.withdraw() # reset the iconify state
+ self.frm_calendar.update_idletasks() # actualize geometry
+
+ # create visual components
+ self._draw_titlebar()
+ self._draw_calendar()
+
+ # make toplevel visible
+ self._set_window_position()
+ self.root.deiconify()
+
+ def _update_widget_bootstyle(self):
+ self.frm_title.configure(bootstyle=self.bootstyle)
+ self.title.configure(bootstyle=f"{self.bootstyle}-inverse")
+ self.prev_period.configure(style=f"Chevron.{self.bootstyle}.TButton")
+ self.next_period.configure(style=f"Chevron.{self.bootstyle}.TButton")
+
+ def _draw_calendar(self):
+ self._update_widget_bootstyle()
+ self._set_title()
+ self._current_month_days()
+ self.frm_dates = ttk.Frame(self.frm_calendar)
+ self.frm_dates.pack(fill=BOTH, expand=YES)
+
+ for row, weekday_list in enumerate(self.monthdays):
+ for col, day in enumerate(weekday_list):
+ self.frm_dates.columnconfigure(col, weight=1)
+ if day == 0:
+ ttk.Label(
+ master=self.frm_dates,
+ text=self.monthdates[row][col].day,
+ anchor=CENTER,
+ padding=5,
+ bootstyle=SECONDARY,
+ ).grid(row=row, column=col, sticky=NSEW)
+ else:
+ if all(
+ [
+ day == self.date_selected.day,
+ self.date.month == self.date_selected.month,
+ self.date.year == self.date_selected.year,
+ ]
+ ):
+ day_style = "secondary-toolbutton"
+ else:
+ day_style = f"{self.bootstyle}-calendar"
+
+ def selected(x=row, y=col):
+ self._on_date_selected(x, y)
+
+ btn = ttk.Radiobutton(
+ master=self.frm_dates,
+ variable=self.datevar,
+ value=day,
+ text=day,
+ bootstyle=day_style,
+ padding=5,
+ command=selected,
+ )
+ btn.grid(row=row, column=col, sticky=NSEW)
+
+ def _draw_titlebar(self):
+ """Draw the calendar title bar which includes the month title
+ and the buttons that increment and decrement the selected
+ month.
+
+ In addition to the previous and next MONTH commands that are
+ assigned to the button press, a "right-click" event is assigned
+ to each button that causes the calendar to move to the previous
+ and next YEAR.
+ """
+ # create and pack the title and action buttons
+ self.prev_period = ttk.Button(
+ master=self.frm_title, text="«", command=self.on_prev_month
+ )
+ self.prev_period.pack(side=LEFT)
+
+ self.title = ttk.Label(
+ master=self.frm_title,
+ textvariable=self.titlevar,
+ anchor=CENTER,
+ font="-weight bold",
+ )
+ self.title.pack(side=LEFT, fill=X, expand=YES)
+
+ self.next_period = ttk.Button(
+ master=self.frm_title,
+ text="»",
+ command=self.on_next_month,
+ )
+ self.next_period.pack(side=LEFT)
+
+ # bind "year" callbacks to action buttons
+ self.prev_period.bind("", self.on_prev_year, "+")
+ self.next_period.bind("", self.on_next_year, "+")
+ self.title.bind("", self.on_reset_date)
+
+ # create and pack days of the week header
+ for col in self._header_columns():
+ ttk.Label(
+ master=self.frm_header,
+ text=col,
+ anchor=CENTER,
+ padding=5,
+ bootstyle=(SECONDARY, INVERSE),
+ ).pack(side=LEFT, fill=X, expand=YES)
+
+ def _set_title(self):
+ _titledate = f'{self.date.strftime("%B %Y")}'
+ self.titlevar.set(value=_titledate.capitalize())
+
+ def _current_month_days(self):
+ """Fetch the day numbers and dates for all days in the current
+ month. `monthdays` is a list of days as integers, and
+ `monthdates` is a list of `datetime` objects.
+ """
+ self.monthdays = self.calendar.monthdayscalendar(
+ year=self.date.year, month=self.date.month
+ )
+ self.monthdates = self.calendar.monthdatescalendar(
+ year=self.date.year, month=self.date.month
+ )
+
+ def _header_columns(self):
+ """Create and return a list of weekdays to be used as a header
+ in the calendar. The order of the weekdays is based on the
+ `firstweekday` property.
+
+ Returns:
+
+ List[str]:
+ A list of weekday column names for the calendar header.
+ """
+ weekdays = [
+ MessageCatalog.translate("Mo"),
+ MessageCatalog.translate("Tu"),
+ MessageCatalog.translate("We"),
+ MessageCatalog.translate("Th"),
+ MessageCatalog.translate("Fr"),
+ MessageCatalog.translate("Sa"),
+ MessageCatalog.translate("Su"),
+ ]
+ header = weekdays[self.firstweekday :] + weekdays[: self.firstweekday]
+ return header
+
+ def _on_date_selected(self, row, col):
+ """Callback for selecting a date.
+
+ An index is assigned to each date button that corresponds to
+ the dates in the `monthdates` matrix. When the user clicks a
+ button to select a date, the index from this button is used
+ to lookup the date value of the button based on the row and
+ column index reference. This value is saved in the
+ `date_selected` property and the `Toplevel` is destroyed.
+
+ Parameters:
+
+ index (Tuple[int, int]):
+ A row and column index of the date selected; to be
+ found in the `monthdates` matrix.
+
+ Returns:
+
+ datetime:
+ The date selected
+ """
+ self.date_selected = self.monthdates[row][col]
+ self.root.destroy()
+
+ def _selection_callback(func):
+ """Calls the decorated `func` and redraws the calendar."""
+
+ def inner(self, *args):
+ func(self, *args)
+ self.frm_dates.destroy()
+ self._draw_calendar()
+
+ return inner
+
+ @_selection_callback
+ def on_next_month(self):
+ """Increment the calendar data to the next month"""
+ year, month = self._nextmonth(self.date.year, self.date.month)
+ self.date = datetime(year=year, month=month, day=1).date()
+
+ @_selection_callback
+ def on_next_year(self, *_):
+ """Increment the calendar data to the next year"""
+ year = self.date.year + 1
+ month = self.date.month
+ self.date = datetime(year=year, month=month, day=1).date()
+
+ @_selection_callback
+ def on_prev_month(self):
+ """Decrement the calendar to the previous year"""
+ year, month = self._prevmonth(self.date.year, self.date.month)
+ self.date = datetime(year=year, month=month, day=1).date()
+
+ @_selection_callback
+ def on_prev_year(self, *_):
+ year = self.date.year - 1
+ month = self.date.month
+ self.date = datetime(year=year, month=month, day=1).date()
+
+ @_selection_callback
+ def on_reset_date(self, *_):
+ """Set the calendar to the start date"""
+ self.date = self.startdate
+
+ def _set_window_position(self):
+ """Move the window the to bottom-right of the parent widget, or
+ the top-left corner of the master window if no parent is
+ provided.
+ """
+ if self.parent:
+ xpos = self.parent.winfo_rootx() + self.parent.winfo_width()
+ ypos = self.parent.winfo_rooty() + self.parent.winfo_height()
+ self.root.geometry(f"+{xpos}+{ypos}")
+ else:
+ xpos = self.root.master.winfo_rootx()
+ ypos = self.root.master.winfo_rooty()
+ self.root.geometry(f"+{xpos}+{ypos}")
+
+ @staticmethod
+ def _nextmonth(year, month):
+ if month == 12:
+ return year + 1, 1
+ else:
+ return year, month + 1
+
+ @staticmethod
+ def _prevmonth(year, month):
+ if month == 1:
+ return year - 1, 12
+ else:
+ return year, month - 1
+
+
+class FontDialog(Dialog):
+
+ """A dialog that displays a variety of options for choosing a font.
+
+ This dialog constructs and returns a `Font` object based on the
+ options selected by the user. The initial font is based on OS
+ settings and will vary.
+
+ The font object is returned when the **Ok** button is pressed and
+ can be passed to any widget that accepts a _font_ configuration
+ option.
+
+ ![](../../assets/dialogs/querybox-get-font.png)
+ """
+
+ def __init__(self, title="Font Selector", parent=None):
+ title = MessageCatalog.translate(title)
+ super().__init__(parent=parent, title=title)
+ self._style = ttk.Style()
+ self._default = font.nametofont("TkDefaultFont")
+ self._actual = self._default.actual()
+ self._size = ttk.Variable(value=self._actual["size"])
+ self._family = ttk.Variable(value=self._actual["family"])
+ self._slant = ttk.Variable(value=self._actual["slant"])
+ self._weight = ttk.Variable(value=self._actual["weight"])
+ self._overstrike = ttk.Variable(value=self._actual["overstrike"])
+ self._underline = ttk.Variable(value=self._actual["underline"])
+ self._preview_font = font.Font()
+ self._slant.trace_add("write", self._update_font_preview)
+ self._weight.trace_add("write", self._update_font_preview)
+ self._overstrike.trace_add("write", self._update_font_preview)
+ self._underline.trace_add("write", self._update_font_preview)
+
+ _headingfont = font.nametofont("TkHeadingFont")
+ _headingfont.configure(weight="bold")
+
+ self._update_font_preview()
+ self._families = set([self._family.get()])
+ for f in font.families():
+ if all([f, not f.startswith("@"), "emoji" not in f.lower()]):
+ self._families.add(f)
+
+ def create_body(self, master):
+ width = utility.scale_size(master, 600)
+ height = utility.scale_size(master, 500)
+ self._toplevel.geometry(f"{width}x{height}")
+
+ family_size_frame = ttk.Frame(master, padding=10)
+ family_size_frame.pack(fill=X, anchor=N)
+ self._initial_focus = self._font_families_selector(family_size_frame)
+ self._font_size_selector(family_size_frame)
+ self._font_options_selectors(master, padding=10)
+ self._font_preview(master, padding=10)
+
+ def create_buttonbox(self, master):
+ container = ttk.Frame(master, padding=(5, 10))
+ container.pack(fill=X)
+
+ ok_btn = ttk.Button(
+ master=container,
+ bootstyle="primary",
+ text=MessageCatalog.translate("OK"),
+ command=self._on_submit,
+ )
+ ok_btn.pack(side=RIGHT, padx=5)
+ ok_btn.bind("", lambda _: ok_btn.invoke())
+
+ cancel_btn = ttk.Button(
+ master=container,
+ bootstyle="secondary",
+ text=MessageCatalog.translate("Cancel"),
+ command=self._on_cancel,
+ )
+ cancel_btn.pack(side=RIGHT, padx=5)
+ cancel_btn.bind("", lambda _: cancel_btn.invoke())
+
+ def _font_families_selector(self, master):
+ container = ttk.Frame(master)
+ container.pack(fill=BOTH, expand=YES, side=LEFT)
+
+ header = ttk.Label(
+ container,
+ text=MessageCatalog.translate("Family"),
+ font="TkHeadingFont",
+ )
+ header.pack(fill=X, pady=(0, 2), anchor=N)
+
+ listbox = ttk.Treeview(
+ master=container,
+ height=5,
+ show="",
+ columns=[0],
+ )
+ listbox.column(0, width=utility.scale_size(listbox, 250))
+ listbox.pack(side=LEFT, fill=BOTH, expand=YES)
+
+ listbox_vbar = ttk.Scrollbar(
+ container,
+ command=listbox.yview,
+ orient=VERTICAL,
+ bootstyle="rounded",
+ )
+ listbox_vbar.pack(side=RIGHT, fill=Y)
+ listbox.configure(yscrollcommand=listbox_vbar.set)
+
+ for f in self._families:
+ listbox.insert("", iid=f, index=END, tags=[f], values=[f])
+ listbox.tag_configure(f, font=(f, self._size.get()))
+
+ iid = self._family.get()
+ listbox.selection_set(iid) # select default value
+ listbox.see(iid) # ensure default is visible
+ listbox.bind(
+ "<>", lambda e: self._on_select_font_family(e)
+ )
+ return listbox
+
+ def _font_size_selector(self, master):
+ container = ttk.Frame(master)
+ container.pack(side=LEFT, fill=Y, padx=(10, 0))
+
+ header = ttk.Label(
+ container,
+ text=MessageCatalog.translate("Size"),
+ font="TkHeadingFont",
+ )
+ header.pack(fill=X, pady=(0, 2), anchor=N)
+
+ sizes_listbox = ttk.Treeview(container, height=7, columns=[0], show="")
+ sizes_listbox.column(0, width=utility.scale_size(sizes_listbox, 24))
+
+ sizes = [*range(8, 13), *range(13, 30, 2), 36, 48, 72]
+ for s in sizes:
+ sizes_listbox.insert("", iid=s, index=END, values=[s])
+
+ iid = self._size.get()
+ sizes_listbox.selection_set(iid)
+ sizes_listbox.see(iid)
+ sizes_listbox.bind(
+ "<>", lambda e: self._on_select_font_size(e)
+ )
+
+ sizes_listbox_vbar = ttk.Scrollbar(
+ master=container,
+ orient=VERTICAL,
+ command=sizes_listbox.yview,
+ bootstyle="round",
+ )
+ sizes_listbox.configure(yscrollcommand=sizes_listbox_vbar.set)
+ sizes_listbox.pack(side=LEFT, fill=Y, expand=YES, anchor=N)
+ sizes_listbox_vbar.pack(side=LEFT, fill=Y, expand=YES)
+
+ def _font_options_selectors(self, master, padding: int):
+ container = ttk.Frame(master, padding=padding)
+ container.pack(fill=X, padx=2, pady=2, anchor=N)
+
+ weight_lframe = ttk.Labelframe(
+ container, text=MessageCatalog.translate("Weight"), padding=5
+ )
+ weight_lframe.pack(side=LEFT, fill=X, expand=YES)
+ opt_normal = ttk.Radiobutton(
+ master=weight_lframe,
+ text=MessageCatalog.translate("normal"),
+ value="normal",
+ variable=self._weight,
+ )
+ opt_normal.invoke()
+ opt_normal.pack(side=LEFT, padx=5, pady=5)
+ opt_bold = ttk.Radiobutton(
+ master=weight_lframe,
+ text=MessageCatalog.translate("bold"),
+ value="bold",
+ variable=self._weight,
+ )
+ opt_bold.pack(side=LEFT, padx=5, pady=5)
+
+ slant_lframe = ttk.Labelframe(
+ container, text=MessageCatalog.translate("Slant"), padding=5
+ )
+ slant_lframe.pack(side=LEFT, fill=X, padx=10, expand=YES)
+ opt_roman = ttk.Radiobutton(
+ master=slant_lframe,
+ text=MessageCatalog.translate("roman"),
+ value="roman",
+ variable=self._slant,
+ )
+ opt_roman.invoke()
+ opt_roman.pack(side=LEFT, padx=5, pady=5)
+ opt_italic = ttk.Radiobutton(
+ master=slant_lframe,
+ text=MessageCatalog.translate("italic"),
+ value="italic",
+ variable=self._slant,
+ )
+ opt_italic.pack(side=LEFT, padx=5, pady=5)
+
+ effects_lframe = ttk.Labelframe(
+ container, text=MessageCatalog.translate("Effects"), padding=5
+ )
+ effects_lframe.pack(side=LEFT, padx=(2, 0), fill=X, expand=YES)
+ opt_underline = ttk.Checkbutton(
+ master=effects_lframe,
+ text=MessageCatalog.translate("underline"),
+ variable=self._underline,
+ )
+ opt_underline.pack(side=LEFT, padx=5, pady=5)
+ opt_overstrike = ttk.Checkbutton(
+ master=effects_lframe,
+ text=MessageCatalog.translate("overstrike"),
+ variable=self._overstrike,
+ )
+ opt_overstrike.pack(side=LEFT, padx=5, pady=5)
+
+ def _font_preview(self, master, padding: int):
+ container = ttk.Frame(master, padding=padding)
+ container.pack(fill=BOTH, expand=YES, anchor=N)
+
+ header = ttk.Label(
+ container,
+ text=MessageCatalog.translate("Preview"),
+ font="TkHeadingFont",
+ )
+ header.pack(fill=X, pady=2, anchor=N)
+
+ content = MessageCatalog.translate(
+ "The quick brown fox jumps over the lazy dog."
+ )
+ self._preview_text = ttk.Text(
+ master=container,
+ height=3,
+ font=self._preview_font,
+ highlightbackground=self._style.colors.primary,
+ )
+ self._preview_text.insert(END, content)
+ self._preview_text.pack(fill=BOTH, expand=YES)
+ container.pack_propagate(False)
+
+ def _on_select_font_family(self, e):
+ tree: ttk.Treeview = self._toplevel.nametowidget(e.widget)
+ fontfamily = tree.selection()[0]
+ self._family.set(value=fontfamily)
+ self._update_font_preview()
+
+ def _on_select_font_size(self, e):
+ tree: ttk.Treeview = self._toplevel.nametowidget(e.widget)
+ fontsize = tree.selection()[0]
+ self._size.set(value=fontsize)
+ self._update_font_preview()
+
+ def _on_submit(self) -> font.Font:
+ self._toplevel.destroy()
+ return self.result
+
+ def _on_cancel(self):
+ self._toplevel.destroy()
+
+ def _update_font_preview(self, *_):
+ family = self._family.get()
+ size = self._size.get()
+ slant = self._slant.get()
+ overstrike = self._overstrike.get()
+ underline = self._underline.get()
+
+ self._preview_font.config(
+ family=family,
+ size=size,
+ slant=slant,
+ overstrike=overstrike,
+ underline=underline,
+ )
+ try:
+ self._preview_text.configure(font=self._preview_font)
+ except:
+ pass
+ self._result = self._preview_font
+
+
+class Messagebox:
+ """This class contains various static methods that show popups with
+ a message to the end user with various arrangments of buttons
+ and alert options."""
+
+ @staticmethod
+ def show_info(message, title=" ", parent=None, alert=False, **kwargs):
+ """Display a modal dialog box with an OK button and an INFO
+ icon.
+
+ ![](../../assets/dialogs/messagebox-show-info.png)
+
+ Parameters:
+
+ message (str):
+ A message to display in the message box.
+
+ title (str):
+ The string displayed as the title of the messagebox. This
+ option is ignored on Mac OS X, where platform guidelines
+ forbid the use of a title on this kind of dialog.
+
+ parent (Union[Window, Toplevel]):
+ Makes the window the logical parent of the message box. The
+ message box is displayed on top of its parent window.
+
+ alert (bool):
+ Specified whether to ring the display bell.
+
+ **kwargs (Dict):
+ Other optional keyword arguments.
+ """
+ dialog = MessageDialog(
+ message=message,
+ title=title,
+ alert=alert,
+ parent=parent,
+ buttons=["OK:primary"],
+ icon=Icon.info,
+ localize=True,
+ **kwargs
+ )
+ if "position" in kwargs:
+ position = kwargs.pop("position")
+ else:
+ position = None
+ dialog.show(position)
+
+ @staticmethod
+ def show_warning(message, title=" ", parent=None, alert=True, **kwargs):
+ """Display a modal dialog box with an OK button and a
+ warning icon. Also will ring the display bell.
+
+ ![](../../assets/dialogs/messagebox-show-warning.png)
+
+ Parameters:
+
+ message (str):
+ A message to display in the message box.
+
+ title (str):
+ The string displayed as the title of the messagebox. This
+ option is ignored on Mac OS X, where platform guidelines
+ forbid the use of a title on this kind of dialog.
+
+ parent (Union[Window, Toplevel]):
+ Makes the window the logical parent of the message box. The
+ message box is displayed on top of its parent window.
+
+ alert (bool):
+ Specified whether to ring the display bell.
+
+ **kwargs (Dict):
+ Other optional keyword arguments.
+ """
+ dialog = MessageDialog(
+ message=message,
+ title=title,
+ parent=parent,
+ buttons=["OK:primary"],
+ icon=Icon.warning,
+ alert=alert,
+ localize=True,
+ **kwargs,
+ )
+ if "position" in kwargs:
+ position = kwargs.pop("position")
+ else:
+ position = None
+ dialog.show(position)
+
+ @staticmethod
+ def show_error(message, title=" ", parent=None, alert=True, **kwargs):
+ """Display a modal dialog box with an OK button and an
+ error icon. Also will ring the display bell.
+
+ ![](../../assets/dialogs/messagebox-show-error.png)
+
+ Parameters:
+
+ message (str):
+ A message to display in the message box.
+
+ title (str):
+ The string displayed as the title of the messagebox. This
+ option is ignored on Mac OS X, where platform guidelines
+ forbid the use of a title on this kind of dialog.
+
+ parent (Union[Window, Toplevel]):
+ Makes the window the logical parent of the message box. The
+ message box is displayed on top of its parent window.
+
+ alert (bool):
+ Specified whether to ring the display bell.
+
+ **kwargs (Dict):
+ Other optional keyword arguments.
+ """
+ dialog = MessageDialog(
+ message=message,
+ title=title,
+ parent=parent,
+ buttons=["OK:primary"],
+ icon=Icon.error,
+ alert=alert,
+ localize=True,
+ **kwargs,
+ )
+ if "position" in kwargs:
+ position = kwargs.pop("position")
+ else:
+ position = None
+ dialog.show(position)
+
+ @staticmethod
+ def show_question(
+ message,
+ title=" ",
+ parent=None,
+ buttons=["No:secondary", "Yes:primary"],
+ alert=True,
+ **kwargs,
+ ):
+ """Display a modal dialog box with yes, no buttons and a
+ question icon. Also will ring the display bell. You may also
+ change the button scheme using the `buttons` parameter.
+
+ ![](../../assets/dialogs/messagebox-show-question.png)
+
+ Parameters:
+
+ message (str):
+ A message to display in the message box.
+
+ title (str):
+ The string displayed as the title of the messagebox. This
+ option is ignored on Mac OS X, where platform guidelines
+ forbid the use of a title on this kind of dialog.
+
+ parent (Union[Window, Toplevel]):
+ Makes the window the logical parent of the message box. The
+ message box is displayed on top of its parent window.
+
+ buttons (List[str]):
+ A list of buttons to appear at the bottom of the popup
+ messagebox. The buttons can be a list of strings which
+ will define the symbolic name and the button text.
+ `['OK', 'Cancel']`. Alternatively, you can assign a
+ bootstyle to each button by using the colon to separate the
+ button text and the bootstyle. If no colon is found, then
+ the style is set to 'primary' by default.
+ `['Yes:success','No:danger']`.
+
+ alert (bool):
+ Specified whether to ring the display bell.
+
+ **kwargs (Dict):
+ Other optional keyword arguments.
+
+ Returns:
+
+ Union[str, None]:
+ The symbolic name of the button pressed, or None if the
+ window is closed without pressing a button.
+ """
+ dialog = MessageDialog(
+ message=message,
+ title=title,
+ parent=parent,
+ buttons=buttons,
+ icon=Icon.question,
+ alert=alert,
+ localize=True,
+ **kwargs,
+ )
+ if "position" in kwargs:
+ position = kwargs.pop("position")
+ else:
+ position = None
+ dialog.show(position)
+ return dialog.result
+
+ @staticmethod
+ def ok(message, title=" ", alert=False, parent=None, **kwargs):
+ """Display a modal dialog box with an OK button and and optional
+ bell alert.
+
+ ![](../../assets/dialogs/messagebox-ok.png)
+
+ Parameters:
+
+ message (str):
+ A message to display in the message box.
+
+ title (str):
+ The string displayed as the title of the messagebox. This
+ option is ignored on Mac OS X, where platform guidelines
+ forbid the use of a title on this kind of dialog.
+
+ alert (bool):
+ Specified whether to ring the display bell.
+
+ parent (Union[Window, Toplevel]):
+ Makes the window the logical parent of the message box. The
+ message box is displayed on top of its parent window.
+
+ **kwargs (Dict):
+ Other optional keyword arguments.
+ """
+ dialog = MessageDialog(
+ title=title,
+ message=message,
+ parent=parent,
+ alert=alert,
+ buttons=["OK:primary"],
+ localize=True,
+ **kwargs,
+ )
+ if "position" in kwargs:
+ position = kwargs.pop("position")
+ else:
+ position = None
+ dialog.show(position)
+
+ @staticmethod
+ def okcancel(message, title=" ", alert=False, parent=None, **kwargs):
+ """Displays a modal dialog box with OK and Cancel buttons and
+ return the symbolic name of the button pressed.
+
+ ![](../../assets/dialogs/messagebox-ok-cancel.png)
+
+ Parameters:
+
+ message (str):
+ A message to display in the message box.
+
+ title (str):
+ The string displayed as the title of the messagebox. This
+ option is ignored on Mac OS X, where platform guidelines
+ forbid the use of a title on this kind of dialog.
+
+ alert (bool):
+ Specified whether to ring the display bell.
+
+ parent (Union[Window, Toplevel]):
+ Makes the window the logical parent of the message box. The
+ message box is displayed on top of its parent window.
+
+ **kwargs (Dict):
+ Other optional keyword arguments.
+
+ Returns:
+
+ Union[str, None]:
+ The symbolic name of the button pressed, or None if the
+ window is closed without pressing a button.
+ """
+ dialog = MessageDialog(
+ title=title,
+ message=message,
+ parent=parent,
+ alert=alert,
+ localize=True,
+ **kwargs,
+ )
+ if "position" in kwargs:
+ position = kwargs.pop("position")
+ else:
+ position = None
+ dialog.show(position)
+ return dialog.result
+
+ @staticmethod
+ def yesno(message, title=" ", alert=False, parent=None, **kwargs):
+ """Display a modal dialog box with YES and NO buttons and return
+ the symbolic name of the button pressed.
+
+ ![](../../assets/dialogs/messagebox-yes-no.png)
+
+ Parameters:
+
+ message (str):
+ A message to display in the message box.
+
+ title (str):
+ The string displayed as the title of the messagebox. This
+ option is ignored on Mac OS X, where platform guidelines
+ forbid the use of a title on this kind of dialog.
+
+ alert (bool):
+ Specified whether to ring the display bell.
+
+ parent (Union[Window, Toplevel]):
+ Makes the window the logical parent of the message box. The
+ message box is displayed on top of its parent window.
+
+ **kwargs (Dict):
+ Other optional keyword arguments.
+
+ Returns:
+
+ Union[str, None]:
+ The symbolic name of the button pressed, or None if the
+ window is closed without pressing a button.
+ """
+ dialog = MessageDialog(
+ title=title,
+ message=message,
+ parent=parent,
+ buttons=["No", "Yes:primary"],
+ alert=alert,
+ localize=True,
+ **kwargs,
+ )
+ if "position" in kwargs:
+ position = kwargs.pop("position")
+ else:
+ position = None
+ dialog.show(position)
+ return dialog.result
+
+ @staticmethod
+ def yesnocancel(message, title=" ", alert=False, parent=None, **kwargs):
+ """Display a modal dialog box with YES, NO, and Cancel buttons,
+ and return the symbolic name of the button pressed.
+
+ ![](../../assets/dialogs/messagebox-yes-no-cancel.png)
+
+ Parameters:
+
+ message (str):
+ A message to display in the message box.
+
+ title (str):
+ The string displayed as the title of the messagebox. This
+ option is ignored on Mac OS X, where platform guidelines
+ forbid the use of a title on this kind of dialog.
+
+ alert (bool):
+ Specified whether to ring the display bell.
+
+ parent (Union[Window, Toplevel]):
+ Makes the window the logical parent of the message box. The
+ message box is displayed on top of its parent window.
+
+ **kwargs (Dict):
+ Optional keyword arguments.
+
+ Returns:
+
+ Union[str, None]:
+ The symbolic name of the button pressed, or None if the
+ window is closed without pressing a button.
+ """
+ dialog = MessageDialog(
+ title=title,
+ message=message,
+ parent=parent,
+ alert=alert,
+ buttons=["Cancel", "No", "Yes:primary"],
+ localize=True,
+ **kwargs,
+ )
+ if "position" in kwargs:
+ position = kwargs.pop("position")
+ else:
+ position = None
+ dialog.show(position)
+ return dialog.result
+
+ @staticmethod
+ def retrycancel(message, title=" ", alert=False, parent=None, **kwargs):
+ """Display a modal dialog box with RETRY and Cancel buttons;
+ returns the symbolic name of the button pressed.
+
+ ![](../../assets/dialogs/messagebox-retry-cancel.png)
+
+ Parameters:
+
+ message (str):
+ A message to display in the message box.
+
+ title (str):
+ The string displayed as the title of the messagebox. This
+ option is ignored on Mac OS X, where platform guidelines
+ forbid the use of a title on this kind of dialog.
+
+ alert (bool):
+ Specified whether to ring the display bell.
+
+ parent (Union[Window, Toplevel]):
+ Makes the window the logical parent of the message box. The
+ message box is displayed on top of its parent window.
+
+ **kwargs (Dict):
+ Other optional keyword arguments.
+
+ Returns:
+
+ Union[str, None]:
+ The symbolic name of the button pressed, or None if the
+ window is closed without pressing a button.
+ """
+ dialog = MessageDialog(
+ title=title,
+ message=message,
+ parent=parent,
+ alert=alert,
+ buttons=["Cancel", "Retry:primary"],
+ localize=True,
+ **kwargs,
+ )
+ if "position" in kwargs:
+ position = kwargs.pop("position")
+ else:
+ position = None
+ dialog.show(position)
+ return dialog.result
+
+
+class Querybox:
+ """This class contains various static methods that request data
+ from the end user."""
+
+ @staticmethod
+ def get_color(
+ parent=None, title="Color Chooser", initialcolor=None, **kwargs
+ ):
+ """Show a color picker and return the select color when the
+ user pressed OK.
+
+ ![](../../assets/dialogs/querybox-get-color.png)
+
+ Parameters:
+
+ parent (Widget):
+ The parent widget.
+
+ title (str):
+ Optional text that appears on the titlebar.
+
+ initialcolor (str):
+ The initial color to display in the 'Current' color
+ frame.
+
+ Returns:
+
+ Tuple[rgb, hsl, hex]:
+ The selected color in various colors models.
+ """
+ from ttkbootstrap.dialogs.colorchooser import ColorChooserDialog
+
+ dialog = ColorChooserDialog(parent, title, initialcolor)
+ if "position" in kwargs:
+ position = kwargs.pop("position")
+ else:
+ position = None
+ dialog.show(position)
+ return dialog.result
+
+ @staticmethod
+ def get_date(
+ parent=None,
+ title=" ",
+ firstweekday=6,
+ startdate=None,
+ bootstyle="primary",
+ ):
+ """Shows a calendar popup and returns the selection.
+
+ ![](../../assets/dialogs/querybox-get-date.png)
+
+ Parameters:
+
+ parent (Widget):
+ The parent widget; the popup will appear to the
+ bottom-right of the parent widget. If no parent is
+ provided, the widget is centered on the screen.
+
+ title (str):
+ The text that appears on the popup titlebar.
+
+ firstweekday (int):
+ Specifies the first day of the week. `0` is Monday, `6` is
+ Sunday (the default).
+
+ startdate (datetime):
+ The date to be in focus when the widget is displayed;
+
+ bootstyle (str):
+ The following colors can be used to change the color of the
+ title and hover / pressed color -> primary, secondary, info,
+ warning, success, danger, light, dark.
+
+ Returns:
+
+ datetime:
+ The date selected; the current date if no date is selected.
+ """
+ chooser = DatePickerDialog(
+ parent=parent,
+ title=title,
+ firstweekday=firstweekday,
+ startdate=startdate,
+ bootstyle=bootstyle,
+ )
+ return chooser.date_selected
+
+ @staticmethod
+ def get_string(
+ prompt="", title=" ", initialvalue=None, parent=None, **kwargs
+ ):
+ """Request a string type input from the user.
+
+ ![](../../assets/dialogs/querybox-get-string.png)
+
+ Parameters:
+
+ prompt (str):
+ A message to display in the message box above the entry
+ widget.
+
+ title (str):
+ The string displayed as the title of the message box. This
+ option is ignored on Mac OS X, where platform guidelines
+ forbid the use of a title on this kind of dialog.
+
+ initialvalue (Any):
+ The initial value in the entry widget.
+
+ parent (Widget):
+ Makes the window the logical parent of the message box. The
+ messagebox is displayed on top of its parent window.
+
+ **kwargs (Dict):
+ Other optional keyword arguments.
+
+ Returns:
+
+ str:
+ The string value of the entry widget.
+ """
+ initialvalue = initialvalue or ""
+ if "position" in kwargs:
+ position = kwargs.pop("position")
+ else:
+ position = None
+ dialog = QueryDialog(
+ prompt, title, initialvalue, parent=parent, **kwargs
+ )
+ dialog.show(position)
+ return dialog._result
+
+ @staticmethod
+ def get_integer(
+ prompt="",
+ title=" ",
+ initialvalue=None,
+ minvalue=None,
+ maxvalue=None,
+ parent=None,
+ **kwargs,
+ ):
+ """Request an integer type input from the user.
+
+ ![](../../assets/dialogs/querybox-get-integer.png)
+
+ Parameters:
+
+ prompt (str):
+ A message to display in the message box above the entry
+ widget.
+
+ title (str):
+ The string displayed as the title of the message box. This
+ option is ignored on Mac OS X, where platform guidelines
+ forbid the use of a title on this kind of dialog.
+
+ initialvalue (int):
+ The initial value in the entry widget.
+
+ minvalue (int):
+ The minimum allowed value.
+
+ maxvalue (int):
+ The maximum allowed value.
+
+ parent (Widget):
+ Makes the window the logical parent of the message box. The
+ messagebox is displayed on top of its parent window.
+
+ **kwargs (Dict):
+ Other optional keyword arguments.
+
+ Returns:
+
+ int:
+ The integer value of the entry widget.
+ """
+ initialvalue = initialvalue or ""
+ if "position" in kwargs:
+ position = kwargs.pop("position")
+ else:
+ position = None
+ dialog = QueryDialog(
+ prompt,
+ title,
+ initialvalue,
+ minvalue,
+ maxvalue,
+ datatype=int,
+ parent=parent,
+ **kwargs,
+ )
+ dialog.show(position)
+ return dialog._result
+
+ @staticmethod
+ def get_float(
+ prompt="",
+ title=" ",
+ initialvalue=None,
+ minvalue=None,
+ maxvalue=None,
+ parent=None,
+ **kwargs,
+ ):
+ """Request a float type input from the user.
+
+ ![](../../assets/dialogs/querybox-get-float.png)
+
+ Parameters:
+
+ prompt (str):
+ A message to display in the message box above the entry
+ widget.
+
+ title (str):
+ The string displayed as the title of the message box. This
+ option is ignored on Mac OS X, where platform guidelines
+ forbid the use of a title on this kind of dialog.
+
+ initialvalue (float):
+ The initial value in the entry widget.
+
+ minvalue (float):
+ The minimum allowed value.
+
+ maxvalue (float):
+ The maximum allowed value.
+
+ parent (Widget):
+ Makes the window the logical parent of the message box. The
+ messagebox is displayed on top of its parent window.
+
+ **kwargs (Dict):
+ Other optional keyword arguments.
+
+ Returns:
+
+ float:
+ The float value of the entry widget.
+ """
+ initialvalue = initialvalue or ""
+ if "position" in kwargs:
+ position = kwargs.pop("position")
+ else:
+ position = None
+ dialog = QueryDialog(
+ prompt,
+ title,
+ initialvalue,
+ minvalue,
+ maxvalue,
+ datatype=float,
+ parent=parent,
+ **kwargs,
+ )
+ dialog.show(position)
+ return dialog._result
+
+ @staticmethod
+ def get_font(parent=None, **kwargs):
+ """Request a customized font
+
+ ![](../../assets/dialogs/querybox-get-font.png)
+
+ Parameters:
+
+ parent (Widget):
+ Makes the window the logical parent of the dialog box. The
+ dialog is displayed on top of its parent window.
+
+ **kwargs (Dict):
+ Other keyword arguments.
+
+ Returns:
+
+ Font:
+ A font object.
+ """
+ if "position" in kwargs:
+ position = kwargs.pop("position")
+ else:
+ position = None
+ dialog = FontDialog(parent=parent, **kwargs)
+ dialog.show(position)
+ return dialog.result
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/icons.py b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/icons.py
new file mode 100644
index 0000000..c1a2f30
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/icons.py
@@ -0,0 +1,2130 @@
+"""
+ A module various classes that can be used either in text as `Emoji`
+ or in the tkinter.PhotoImage class as in `Icon`.
+"""
+
+
+class Icon:
+ """A container class that contains base64 image attributes that can
+ be used in the `PhotoImage` class using the `data` parameter.
+
+ Attributes:
+
+ icon (str): The ttkbootstrap icon.
+ error (str): An error image.
+ warning (str): A warning image.
+ question (str): A question image.
+ info (str): An info image.
+
+ Examples:
+
+ ```python
+ img = tk.PhotoImage(data=Icon.warning)
+ ```
+ """
+
+ icon = "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFxEAABcRAcom8z8AAAT/SURBVFhHzZd9TNR1HMff/O64BwKOp+NRnkIScJI2n7ZqFmqjVhkrHExrrDFZLnPkqmEyW2WtlQ1SQawWPSAYiJLNGvK0VhJOaDgVBDPCw0PwEOUQfsfd/fp+v/cFbt0Bd6yxXvfP5+F79/l+P9+H+3w8wMnO3r40I+P5vOCQ4I1ymVzrQeCu/wSJYDabB/sHbp45XlnzQUnJgcvcBRQUHEjX6/vH6aCFQK/XjxcWHnyBxpbRle/Ysf3n0NAQJTWMmiRUnB/FNy1GNHaNYdwsIS7IE4JdPqxWKxoam3D0aAVq6+rR39+P2NhYKBQKPsJGx3Abyq8dxGldBbrvXkSoVyR8Pf3g7e0tj46O2mQ0Gqs96urqv1u/PmUL/cLfQ2a8/O0t9A2b2Q9MsjpGicOZQfBSeEAURbyZtxstLee410awVovCgk8RGxPD9NLuT1B6dT+TJ/EUFMhL/gwpYZuYXl/fUCbQPaeKVQJyqwwOwSnnekR8VDvM5JIjnzsEpwwMDmL32/mwWCxoHqhzCE6ZsJrw4YWduHGvh+k0tkAPHFXadSZc1k8whzNOtt+DcWwCJ2p+4BZH/urpwfnWNpzs/YpbHJmwivjxehmTaWxh8rTT9M+GSM7CpZ5BjI2NcYtzdH069PEVzsSkn8YWmETQek+JTpER9/3h/pDL5dzinKDAQAQqg7nmHHv/VNRV5KCFaWRcc2RdvBpajRopjz/GLY4EBARgzerVeCKc3TCneJDPxohp/9QEFDIPfJwWwE76v1nkL8fep/yYnLvzNURFRTLZHqVSib35e6BSqfDkokysC32ae6ahwbPidyFRs4JbiK2jo1NKSFjCVaDHYMaRX0fQ3mcikwIeiVMh+2EfaNTTW2Q0jqKsvBxnzzaza5mYmICXXtw6dQUpVslK7n85ztyogkEcQIRXLNKis7BWu4GPADo7rzhOYCGZ9wQmxi249NN19P5xCxaTFdo4XyQ/Gw3fEDUf4RrzmoA4MoFT77RiqNfILTY8VTKk5i1HWJI/t8wNncDsd88JzV93OQSn0Kw0FF5kGXEHtyZgJj/+5283uebI6JAI3QUD11zDrQmIIyZYzLOvcNQgcsk13JqASqOAXDnzY0XxcfMgujUBmVzAkpRwrjmiCfNCxLIArrmG24dwzZbFTk+6mmRnw+vLIJAX1R3m9Q5IpHjo/kWP3jYDOZgW9g4sTY2EyseTj3CN/8VL6PYWMO70A1W7gHeTgfzFwBcZpBpp4U7OuAl4jxQm8ZvJ/pB/0IeygC9P0fKYD7DhfgaGeoFDzwAjA9zAEcjtyDwEPEjqPZFUVqm5QFMbd9rxShpQ9AYT55eBmj2OwSlWC1D9Fln5XaC42nlwSvEJoLGVK+7eApE8wVcauOKEsTtAVxPwfT03zMCxab9AGwUuz834iG2lszF6GzCQLMzGkM1PYwu0XWKaK/iQAlqt4coMhDwAJE0XJk7hfhpboL0a01xBIAXpo9u44oRIUmrFriV1G7kV9q2UPb73AdueYyKNLfNSazpXrlyRTdslZp2LmFXAbR2gn+4tGSHkJmWVkgz5AtGhpOsgT3ItaWBIGzeFnw9QuQ9YHk/bObG4qGgrs9NGkTaMdE9c5trvknR6nyTV5EtS23HS+pq4w46rOkl6v1SSXt0vSQXHJGlwmJltzWkhK42n8pSTk5OUnr5598K055WkPS8hKQT+AVyRrtzM5URAAAAAAElFTkSuQmCC"
+ error = "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABmJLR0QA/wD/AP+gvaeTAAAEc0lEQVRIDcVXbU8bRxCee7MxkGBTSIJt0UAjRES+tKDKUfoFm5I0UVuFUKr+h/ZTf0Wr/pK2BFlKKkUmqOqHJKC8NFKiJKqJAEGNgRIIAcy97PWZde8EfgGnQcLy7M0+MzvP7e3ezB7REf2UWnnvDAx8qKrqkKZpl1zXPSWECJPrkqppa6Qoi2Tbv1lEYxcymT9ribkvsUukTKZSXyua9pNmGMcj8Xhd04kThh4Mkm4YMr5tWWTv7NDrfN5cXVgwhW2vOY7zfWJ8/BcERwjpVtbAVoZJAIRdrqalA6FQPN7T03istVXiBzWvl5dp4enTN2ahMOdY1hcXJiamK42pSDyZTCZJ19PR7u76lo4OtdLAg7Clly/F4osXW1iSz8+Pj/9OJb8y4nupVD8e7c2Ovr5QrbMsiel3efYz9+9v27Z9CTP/wzdA2UM81d/f4+r65AeJRENDczPM7/7fXF2l7NTUBgnRm8hk/vIiqp6CXaBQMPhz7Ny50GGRcmyOFcOS4W34VXIwCPGJ7w4MfBOsr29/r73dx2A/lH/L6dOaEQp13hscHPECShK+E9zRD21nzzZ6htKrduYMKXV1pbDfV0IhYh8fKFE4tqYoP3qwJL6TSvXhPW061tLi4XuuWlcXGVeuUODaNWKCPUZ0GGMb+7AvoLL/cbyOqmFE7iaTH7FREuua9lUkFqs6HTE7S2JpiRQMDoyMkNLQwGOlsC4x3DT7OPCVhgpNpK0tiDdmmE2SGJ1PMdtiKmK0RFxkJvP6dRL5PCmRCAWGhyW5JGUdGNvYh+BbMtzv4vUM4MkOMqBzg61+ChlKqlUbBOTAgaEhUk+eJJ4l+ypNTfKG2LYfKftig5ErRJR1OWN0Ipx/GdhX/iMXSItMyOJCr4WU4xrYnK7jNLMuiVmpVRQUBxbfn/t68cH5WA2KJFZUdZUrzEH+SmNjcX3DYbnZeDMp0L01P2i8hScGrn/YzyPOW9vb3K8qe0gXF8kcHZUioPsbDjdWNQAM1tYWYSPnoJIkRv28sYZ6ykAlKSMdGyO5kTADE3qt5KjZBdTrG8xRJHbd0fVczmSgkqjRKHkbyUqni6SeI8gZc1dWpA/7eqbS66tcznGEGGVcVidOmVMXL8519PbG8a4xXiacDsX8PLmFQpmNAc5eaixGTjbL3TLhEjn74MHcx7duvc9GOWOwu45tfzf/5MkbnKcYLxMOWI2UnV3sEfZhvVQ45vzjx5s4kXzr2SQxd87fvp22TXNueWZGcP8wZWV62hGOM52YmJDry7F9Yp61ZZqXc8+ebawjNbLxMGQduz6Xza7vOM5nzOHF9IkZwPEE1UBcnX34cHsDGYmxdxG5ro8ebeMkevWTTObv3bFwE7u7RV0e9jRtrK27u661szNQRN+uxWHPzD1/XsD6flnTYc8LfyTHW4/c3XWgV3U9HI5GAyjoRgD12KtmJrLRzuYm4bFanAtQBF4hIf3/A71H7l13fcJcRjWLYpe2sA2fMCv4tFlARrppvcUnDI89EvkXuxHzVm+w/WUAAAAASUVORK5CYII="
+ warning = "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABmJLR0QA/wD/AP+gvaeTAAADO0lEQVRIDe1V3UtTYRh/P87HPo815+zoNlHb5tzUbTmnQiUU6QZGBN4UBBURIgR1E9TNkkIi8SIw2BKi226iG5cfMKiLoIT+hO4qRSIIg3Tb6TxHtpbbzs4RIogO5znvc37P7/n9zns+3oPQX9rwfnyz8yOWvMl8nyAs7dDtm6MXlrf06jB6G4BfMAtPmhziOEIS2tz42CxjE3Lo2okutkxeWkgcIwTHg9EhPhAd5gmhccDkkq5dl3EymSQMJQu+3n4ToRRROSAHDGp6nHUZDzvfXjJbG0TR3VZ6NyA3WQVxyPXu4h8xXkmdbJBv8aw/PGBBCJd5YNQdjlkYgmeBU1ZQTTXPmLLGaYfTzQkHbRWCgDW1unjCGZNI46bJeDWd8EpYuuLrCRtr6e7WpKvArcUpxzUZE54+6vAFOY7/5Rs7+wxBFMWg1uELcIRn5ouY2ljXeCU9NkopG3N7/VRNCGpubzelDDMIPXCuFqrGa6kjLGGZtD/UbyFElap4AKerL2qBnmxyRHVxUlX7yjZPCgdstqYWlyKs5eBocSLoybnMk2r8msbZ1LgdY3LXH4nJn4+aRGXNHxmwEIzvrT490VhZ3UVqGhd4NCO621mzVdhl6jjKiwwS29pZjIwztdqqGq+kEj3y+n/ucCBkqNVYD1d6C/i8olWFXNWYGuhjT7DPwHJclRZtEPR6gr0GytN0tY4K4+X02GmWMwScHd6KWjUBNczZ4SMszweXFuLje3nliy5afBjnOYH5EB48Ltoc8JvdS9d//mVjHb1/k/20/a3QnriW+VFU+G1WnAXfsDXaBS2mnze/I4iiUK0RtGyNDoG34uvlnJLxy9SoiBG51RUaMJcTquVgODG1iCamMmhdvoBqnHKsKyxrSuQ2eBTxkjFn4GZdnV7WaNbw2UpSsV9++UtpzQQ0nZ0eluP5B0WS8oxX02NRynPZo/EzZsqwxZrqCLMGwiG7CYa6kc/toFeZ51u5XH7k1OXFNWXGhOPmPMGQUaspuIAhBORaArS9gYiRpcwc8BXjQj4fsYutSg7gnwrwyBdyEdBX/iCUkOnXmRfTUqGw/xUD1OoEJmSbEuZOHdr/8j9yB34CUBepV8n7RlcAAAAASUVORK5CYII="
+ question = "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABmJLR0QA/wD/AP+gvaeTAAAEvElEQVRIDcVX208cVRj/5sxlB1j2Aiyy2lpgEZVaUvXBeIvERCOwC1Qlvhj/gcYnE1PAR1tsU598bOK7sV6A3ZVEX9pqE32yFzDKdlkS6ILslUXYmT0z4zlnmbLtzt76oJPznXO+y+/7zsy5fQPwPz1cvXEnpkMnDZ4/JSA0AobRpem6i2J5hDKAuLiGtTAu4O+C5wM3qLwW1QhscIHp8KTAo88FQXR2dnps7rY2SRIFEAWB+S5gDGoBQzqVVLf+TigYa2kDax/NzQ5/A8AZzMiiqhh47MxiHxKNOZvNdsTn8zncLqcFvFyUTmcgEo3m1Ly6RgY1HvrMHy23IkOyEk58sjDEceL33d3HWr1eL+IqDs8KTWUGbGzEtVhsbdfQtMDcrP8alZZSmcvAVPg1XkTzJ5453upobS3Tl4Jr9bM7OWNpaXkHa7p/4ezwz6X29zk+NRXqB4H/dXDwhMtubym1e+j+7u4u3Lh5K40N/ELw08CK6UgwOwAGB/zi1729PS3VgjpkBENPy3DUXYSupzFc+TMPmT390FVJz263Q09Pt31tNfYVADxHiBXEalKNTYfea25ufryr6xGRsJallQT94GU79BOTJokDSk+Q/vsv2oHqLEFE+KjXK9pkuXd8KvwuYVk5CGxwCAkXen09bG8yjUX1OnlTWeQguo3h0pUcXLqaY30qG3pKtkAcinx9PifiuYumhAUemwk/L0mCgzym3LI91l78vD8u7UN2X4cs+bw/Le8z2+6Ooo4xFpXT4QBRFF1jZ8LPUjULjBA36fF4mqmgGklCcS3m8ofzWdAOzoiDphre0+lpQgI3SW3YMBEnvOFyuyrOLTWkdHExS5v76ORRifFbOY211Sqn0yltxjffJDbT7I3B0L02SSJ8Y8XXKcJLfcW5/S2q1ATLsg3It/JSQxaYHPhuSbJRvm5qa0EwOtgE9FS7HslDLIFrYiXycrqmtVNDFph2GqVX+2Wgc35rXYXrEaUBeHGdsMCI51Oq2ggY4GgbWx5w9a983UEVRQHEoyQFFANzsKWoKuXrJrp3qfG+WsdypoaEFEUFEjBOusCGXcB6MJlIDbjIqqPCeshqhdfCpVKpPFlPQWpHBgCgY3w5kdhu7JUpukHaTmxrBV27TGEscPC8/6amGelMtnyfUiMr6rDzQMlKZyWjCYKO9UTonP821bPAJB8wsI4/jKxEdow6poxuJXpZUHKTbUUdVScDViJ3cpqunTbtDgIDLJwdmVcVNba1tVkwlfW0xc1R3fJufLOgFdTI/Dl/yLRki6vIcIamzg1H76z+Tq6wDrfLVdFn6h8dvryWY7BK9zBTkiqZShmrq7Es0rhRwt4rZc5Z6sNzoYHjA80kwSvT30PW0UlnMsby0h975B55q2rqY/oKzPzwCrmI5rpJ5kCSPYkei6auvtaA9Y14PrZGkj1sTMzPjvzyII57UGDyb38cPgIy+laUpCcfJr3FamEJ5/PvzF8Yv2v6LG0rBjaNAjOhcQEJX/A8cne0t5OE3iXKsgyUqI2i5GF/Lw+pTEZNJhIFklEmyV/F6YXZ0SDVV6KagU2g+Qsj8tyorhmPkROogySIwCM+QVKaDUxOv0Z+YUy//3n7L6y2u/Lkn4gSAAAAAElFTkSuQmCC"
+ info = "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAABmJLR0QA/wD/AP+gvaeTAAADzElEQVRIDcWXzXPbRBTAn7SSrJbEH8Vp4rjFjjPDUCgz0PbMDMwAwRknE4aP4dpe4QSHEigHSDNDp/9C+wfQr6RNTLgxvXGDoaEpxDSJmzYhtpSPUluydpd9InJE4yTqpCYaPe3Te2/fb3dlrZ8A9uiQgnL7TudfVQh/V1LUHuC8gzIWxb5ElpdBkhYcxvISpddGhnt/RvtOsgOYS32D4x8SQs4TRQ23H4zrsQPPqpqqgKoobu6a40DNroFhmvbi4l82pXTZofTTG8PZSwASd4MaXLYED3w+/jwoZFTT1EPd3d0tsVi0QffNJtM0oVC4+9CyrTmxMn0jQ9nC5igxpEbG3Jf5NxSQR1Pp1P5kskPeIqxR13Ubh/n5+2x2pviIQy03MpT7ER47Ns24b3DsdSKT8SMvHtkXdJaP5azf4uxv/zZVoZz1XD/be7PuEMp/wLkzEy8Rzn86+vLRZyLhVuHe/bm6sgq3JifXatw5PjaU+8PLKHsKAJcUCb7LZLr2BYGGdRlQNvo31sKRMKS60vs1Wb2MDC+qDu4/k/9ID+nPJRL4TD134xaBp15rhZNCWsUAGkdtWJOJBAmF9Ez/F99/4FnXwVySgXybyaRbPMe2re8B+dRtu3R1pVokIp/zglxw7vTECaIokWg02CuzWmFw4eYaXBSyWmVerm3bWCwm3k4llhu8cQwDXbCssPfbD7bpaAgqCEQJGo9x7W1tISIr76Hubj+KrL4ppquiIYh81hOph52fWKnrOymRaERbWFh4S8QNujPmnHXoIU3cBzufBObPqOshYJx3os0Fiw0/pmkhvG+qaJoGjPEDCHHBqPzf4oJlQgzbtprOtiwLZCKXEfQvWIJFy7bxvqliWTYI4AOEiBaAOmzMKBlNJxumURW/p7E6GDi7slQqNR28tLREucSu1MEjw9lfsHIwzWW0NUVMwwTKeHn0m95fEeAutfij547DPpmeLjzkfMtqBeNd8W8gft11NrhgzunCn39zyj723L49nksDX/1wK3X48AvJQ8n1AXlhu2uL9+bpvWJx8urXb7+Ck8RsPoDELUqzM7Nza4ZYFnQ+DSmXDSjOFVecqvWOB8W8PjBA/mzvLGN0YOr275Wn8byx9LkzdadCRc7r5/rvI9AT31J7JgAs9sSIrmXSab0zmdDESDecgTQs9h7Yd2dmqhLQ/kDFnpd3T8pbD441Ur2gJyQaj8c1UXmquq4DCsZZVhUqj6qioF+ulcslUdAzc1cFPSb1y8YnjJLljHeKHSiOfvEJU5KJNF+jfPxJPmGw757IPxpVi5HvZ9PZAAAAAElFTkSuQmCC"
+
+
+class EmojiItem:
+
+ """A container for an emoji character used by the Emoji class"""
+
+ def __init__(self, name, category, subcategory, char):
+ """
+ Parameters:
+
+ name (str):
+ The name of the emoji character.
+
+ category (str):
+ The major category of the emoji character.
+
+ subcategory (str):
+ The subcategory of the emoji character.
+
+ char (str):
+ The unicode character.
+ """
+ self.name = name
+ self.category = category
+ self.subcategory = subcategory
+ self.char = char
+
+ def __repr__(self) -> str:
+ return self.char
+
+
+class Emoji:
+ """A class that contains emoji characters that can be used in the
+ `text` parameter in any tkinter widget with the option.
+ """
+
+ _ITEMS = [
+ EmojiItem("KNOT", "activities", "arts & crafts", "🪢"),
+ EmojiItem("SEWING NEEDLE", "activities", "arts & crafts", "🪡"),
+ EmojiItem("BALL OF YARN", "activities", "arts & crafts", "🧶"),
+ EmojiItem("SPOOL OF THREAD", "activities", "arts & crafts", "🧵"),
+ EmojiItem("FRAME WITH PICTURE", "activities", "arts & crafts", "🖼"),
+ EmojiItem("PERFORMING ARTS", "activities", "arts & crafts", "🎭"),
+ EmojiItem("ARTIST PALETTE", "activities", "arts & crafts", "🎨"),
+ EmojiItem("THIRD PLACE MEDAL", "activities", "award-medal", "🥉"),
+ EmojiItem("SECOND PLACE MEDAL", "activities", "award-medal", "🥈"),
+ EmojiItem("FIRST PLACE MEDAL", "activities", "award-medal", "🥇"),
+ EmojiItem("TROPHY", "activities", "award-medal", "🏆"),
+ EmojiItem("SPORTS MEDAL", "activities", "award-medal", "🏅"),
+ EmojiItem("MILITARY MEDAL", "activities", "award-medal", "🎖"),
+ EmojiItem("SPARKLES", "activities", "event", "✨"),
+ EmojiItem("FIRECRACKER", "activities", "event", "🧨"),
+ EmojiItem("RED GIFT ENVELOPE", "activities", "event", "🧧"),
+ EmojiItem("TICKET", "activities", "event", "🎫"),
+ EmojiItem("ADMISSION TICKETS", "activities", "event", "🎟"),
+ EmojiItem("REMINDER RIBBON", "activities", "event", "🎗"),
+ EmojiItem("MOON VIEWING CEREMONY", "activities", "event", "🎑"),
+ EmojiItem("WIND CHIME", "activities", "event", "🎐"),
+ EmojiItem("CARP STREAMER", "activities", "event", "🎏"),
+ EmojiItem("JAPANESE DOLLS", "activities", "event", "🎎"),
+ EmojiItem("PINE DECORATION", "activities", "event", "🎍"),
+ EmojiItem("TANABATA TREE", "activities", "event", "🎋"),
+ EmojiItem("CONFETTI BALL", "activities", "event", "🎊"),
+ EmojiItem("PARTY POPPER", "activities", "event", "🎉"),
+ EmojiItem("BALLOON", "activities", "event", "🎈"),
+ EmojiItem("FIREWORK SPARKLER", "activities", "event", "🎇"),
+ EmojiItem("FIREWORKS", "activities", "event", "🎆"),
+ EmojiItem("CHRISTMAS TREE", "activities", "event", "🎄"),
+ EmojiItem("JACK-O-LANTERN", "activities", "event", "🎃"),
+ EmojiItem("WRAPPED PRESENT", "activities", "event", "🎁"),
+ EmojiItem("RIBBON", "activities", "event", "🎀"),
+ EmojiItem("BLACK CHESS PAWN", "activities", "game", "♟"),
+ EmojiItem("BLACK DIAMOND SUIT", "activities", "game", "♦"),
+ EmojiItem("BLACK HEART SUIT", "activities", "game", "♥"),
+ EmojiItem("BLACK CLUB SUIT", "activities", "game", "♣"),
+ EmojiItem("BLACK SPADE SUIT", "activities", "game", "♠"),
+ EmojiItem("NESTING DOLLS", "activities", "game", "🪆"),
+ EmojiItem("PINATA", "activities", "game", "🪅"),
+ EmojiItem("MAGIC WAND", "activities", "game", "🪄"),
+ EmojiItem("KITE", "activities", "game", "🪁"),
+ EmojiItem("YO-YO", "activities", "game", "🪀"),
+ EmojiItem("NAZAR AMULET", "activities", "game", "🧿"),
+ EmojiItem("TEDDY BEAR", "activities", "game", "🧸"),
+ EmojiItem("JIGSAW PUZZLE PIECE", "activities", "game", "🧩"),
+ EmojiItem("JOYSTICK", "activities", "game", "🕹"),
+ EmojiItem("CRYSTAL BALL", "activities", "game", "🔮"),
+ EmojiItem("FLOWER PLAYING CARDS", "activities", "game", "🎴"),
+ EmojiItem("GAME DIE", "activities", "game", "🎲"),
+ EmojiItem("BILLIARDS", "activities", "game", "🎱"),
+ EmojiItem("SLOT MACHINE", "activities", "game", "🎰"),
+ EmojiItem("DIRECT HIT", "activities", "game", "🎯"),
+ EmojiItem("VIDEO GAME", "activities", "game", "🎮"),
+ EmojiItem("PLAYING CARD BLACK JOKER", "activities", "game", "🃏"),
+ EmojiItem("MAHJONG TILE RED DRAGON", "activities", "game", "🀄"),
+ EmojiItem("ICE SKATE", "activities", "sport", "⛸"),
+ EmojiItem("FLAG IN HOLE", "activities", "sport", "⛳"),
+ EmojiItem("BASEBALL", "activities", "sport", "⚾"),
+ EmojiItem("SOCCER BALL", "activities", "sport", "⚽"),
+ EmojiItem("FLYING DISC", "activities", "sport", "🥏"),
+ EmojiItem("SOFTBALL", "activities", "sport", "🥎"),
+ EmojiItem("LACROSSE STICK AND BALL", "activities", "sport", "🥍"),
+ EmojiItem("CURLING STONE", "activities", "sport", "🥌"),
+ EmojiItem("MARTIAL ARTS UNIFORM", "activities", "sport", "🥋"),
+ EmojiItem("BOXING GLOVE", "activities", "sport", "🥊"),
+ EmojiItem("GOAL NET", "activities", "sport", "🥅"),
+ EmojiItem("DIVING MASK", "activities", "sport", "🤿"),
+ EmojiItem("SLED", "activities", "sport", "🛷"),
+ EmojiItem(
+ "BADMINTON RACQUET AND SHUTTLECOCK", "activities", "sport", "🏸"
+ ),
+ EmojiItem("TABLE TENNIS PADDLE AND BALL", "activities", "sport", "🏓"),
+ EmojiItem("ICE HOCKEY STICK AND PUCK", "activities", "sport", "🏒"),
+ EmojiItem("FIELD HOCKEY STICK AND BALL", "activities", "sport", "🏑"),
+ EmojiItem("VOLLEYBALL", "activities", "sport", "🏐"),
+ EmojiItem("CRICKET BAT AND BALL", "activities", "sport", "🏏"),
+ EmojiItem("RUGBY FOOTBALL", "activities", "sport", "🏉"),
+ EmojiItem("AMERICAN FOOTBALL", "activities", "sport", "🏈"),
+ EmojiItem("BASKETBALL AND HOOP", "activities", "sport", "🏀"),
+ EmojiItem("SKI AND SKI BOOT", "activities", "sport", "🎿"),
+ EmojiItem("TENNIS RACQUET AND BALL", "activities", "sport", "🎾"),
+ EmojiItem("RUNNING SHIRT WITH SASH", "activities", "sport", "🎽"),
+ EmojiItem("BOWLING", "activities", "sport", "🎳"),
+ EmojiItem("FISHING POLE AND FISH", "activities", "sport", "🎣"),
+ EmojiItem("FROG FACE", "animal-nature", "animal-amphibian", "🐸"),
+ EmojiItem("FEATHER", "animal-nature", "animal-bird", "🪶"),
+ EmojiItem("FLAMINGO", "animal-nature", "animal-bird", "🦩"),
+ EmojiItem("DODO", "animal-nature", "animal-bird", "🦤"),
+ EmojiItem("SWAN", "animal-nature", "animal-bird", "🦢"),
+ EmojiItem("PARROT", "animal-nature", "animal-bird", "🦜"),
+ EmojiItem("PEACOCK", "animal-nature", "animal-bird", "🦚"),
+ EmojiItem("OWL", "animal-nature", "animal-bird", "🦉"),
+ EmojiItem("DUCK", "animal-nature", "animal-bird", "🦆"),
+ EmojiItem("EAGLE", "animal-nature", "animal-bird", "🦅"),
+ EmojiItem("TURKEY", "animal-nature", "animal-bird", "🦃"),
+ EmojiItem("DOVE OF PEACE", "animal-nature", "animal-bird", "🕊"),
+ EmojiItem("PENGUIN", "animal-nature", "animal-bird", "🐧"),
+ EmojiItem("BIRD", "animal-nature", "animal-bird", "🐦"),
+ EmojiItem(
+ "FRONT-FACING BABY CHICK", "animal-nature", "animal-bird", "🐥"
+ ),
+ EmojiItem("BABY CHICK", "animal-nature", "animal-bird", "🐤"),
+ EmojiItem("HATCHING CHICK", "animal-nature", "animal-bird", "🐣"),
+ EmojiItem("CHICKEN", "animal-nature", "animal-bird", "🐔"),
+ EmojiItem("ROOSTER", "animal-nature", "animal-bird", "🐓"),
+ EmojiItem("COCKROACH", "animal-nature", "animal-bug", "🪳"),
+ EmojiItem("BEETLE", "animal-nature", "animal-bug", "🪲"),
+ EmojiItem("WORM", "animal-nature", "animal-bug", "🪱"),
+ EmojiItem("FLY", "animal-nature", "animal-bug", "🪰"),
+ EmojiItem("MICROBE", "animal-nature", "animal-bug", "🦠"),
+ EmojiItem("MOSQUITO", "animal-nature", "animal-bug", "🦟"),
+ EmojiItem("CRICKET", "animal-nature", "animal-bug", "🦗"),
+ EmojiItem("BUTTERFLY", "animal-nature", "animal-bug", "🦋"),
+ EmojiItem("SCORPION", "animal-nature", "animal-bug", "🦂"),
+ EmojiItem("SPIDER WEB", "animal-nature", "animal-bug", "🕸"),
+ EmojiItem("SPIDER", "animal-nature", "animal-bug", "🕷"),
+ EmojiItem("LADY BEETLE", "animal-nature", "animal-bug", "🐞"),
+ EmojiItem("HONEYBEE", "animal-nature", "animal-bug", "🐝"),
+ EmojiItem("ANT", "animal-nature", "animal-bug", "🐜"),
+ EmojiItem("BUG", "animal-nature", "animal-bug", "🐛"),
+ EmojiItem("SNAIL", "animal-nature", "animal-bug", "🐌"),
+ EmojiItem("GUIDE DOG", "animal-nature", "animal-mammal", "🦮"),
+ EmojiItem("BISON", "animal-nature", "animal-mammal", "🦬"),
+ EmojiItem("BEAVER", "animal-nature", "animal-mammal", "🦫"),
+ EmojiItem("SKUNK", "animal-nature", "animal-mammal", "🦨"),
+ EmojiItem("ORANGUTAN", "animal-nature", "animal-mammal", "🦧"),
+ EmojiItem("OTTER", "animal-nature", "animal-mammal", "🦦"),
+ EmojiItem("SLOTH", "animal-nature", "animal-mammal", "🦥"),
+ EmojiItem("MAMMOTH", "animal-nature", "animal-mammal", "🦣"),
+ EmojiItem("BADGER", "animal-nature", "animal-mammal", "🦡"),
+ EmojiItem("RACCOON", "animal-nature", "animal-mammal", "🦝"),
+ EmojiItem("HIPPOPOTAMUS", "animal-nature", "animal-mammal", "🦛"),
+ EmojiItem("LLAMA", "animal-nature", "animal-mammal", "🦙"),
+ EmojiItem("KANGAROO", "animal-nature", "animal-mammal", "🦘"),
+ EmojiItem("HEDGEHOG", "animal-nature", "animal-mammal", "🦔"),
+ EmojiItem("ZEBRA FACE", "animal-nature", "animal-mammal", "🦓"),
+ EmojiItem("GIRAFFE FACE", "animal-nature", "animal-mammal", "🦒"),
+ EmojiItem("RHINOCEROS", "animal-nature", "animal-mammal", "🦏"),
+ EmojiItem("GORILLA", "animal-nature", "animal-mammal", "🦍"),
+ EmojiItem("DEER", "animal-nature", "animal-mammal", "🦌"),
+ EmojiItem("FOX FACE", "animal-nature", "animal-mammal", "🦊"),
+ EmojiItem("BAT", "animal-nature", "animal-mammal", "🦇"),
+ EmojiItem("UNICORN FACE", "animal-nature", "animal-mammal", "🦄"),
+ EmojiItem("LION FACE", "animal-nature", "animal-mammal", "🦁"),
+ EmojiItem("CHIPMUNK", "animal-nature", "animal-mammal", "🐿"),
+ EmojiItem("PAW PRINTS", "animal-nature", "animal-mammal", "🐾"),
+ EmojiItem("PIG NOSE", "animal-nature", "animal-mammal", "🐽"),
+ EmojiItem("PANDA FACE", "animal-nature", "animal-mammal", "🐼"),
+ EmojiItem("BEAR FACE", "animal-nature", "animal-mammal", "🐻"),
+ EmojiItem("WOLF FACE", "animal-nature", "animal-mammal", "🐺"),
+ EmojiItem("HAMSTER FACE", "animal-nature", "animal-mammal", "🐹"),
+ EmojiItem("PIG FACE", "animal-nature", "animal-mammal", "🐷"),
+ EmojiItem("DOG FACE", "animal-nature", "animal-mammal", "🐶"),
+ EmojiItem("MONKEY FACE", "animal-nature", "animal-mammal", "🐵"),
+ EmojiItem("HORSE FACE", "animal-nature", "animal-mammal", "🐴"),
+ EmojiItem("CAT FACE", "animal-nature", "animal-mammal", "🐱"),
+ EmojiItem("RABBIT FACE", "animal-nature", "animal-mammal", "🐰"),
+ EmojiItem("TIGER FACE", "animal-nature", "animal-mammal", "🐯"),
+ EmojiItem("COW FACE", "animal-nature", "animal-mammal", "🐮"),
+ EmojiItem("MOUSE FACE", "animal-nature", "animal-mammal", "🐭"),
+ EmojiItem("BACTRIAN CAMEL", "animal-nature", "animal-mammal", "🐫"),
+ EmojiItem("DROMEDARY CAMEL", "animal-nature", "animal-mammal", "🐪"),
+ EmojiItem("POODLE", "animal-nature", "animal-mammal", "🐩"),
+ EmojiItem("KOALA", "animal-nature", "animal-mammal", "🐨"),
+ EmojiItem("ELEPHANT", "animal-nature", "animal-mammal", "🐘"),
+ EmojiItem("BOAR", "animal-nature", "animal-mammal", "🐗"),
+ EmojiItem("PIG", "animal-nature", "animal-mammal", "🐖"),
+ EmojiItem("DOG", "animal-nature", "animal-mammal", "🐕"),
+ EmojiItem("MONKEY", "animal-nature", "animal-mammal", "🐒"),
+ EmojiItem("SHEEP", "animal-nature", "animal-mammal", "🐑"),
+ EmojiItem("GOAT", "animal-nature", "animal-mammal", "🐐"),
+ EmojiItem("RAM", "animal-nature", "animal-mammal", "🐏"),
+ EmojiItem("HORSE", "animal-nature", "animal-mammal", "🐎"),
+ EmojiItem("CAT", "animal-nature", "animal-mammal", "🐈"),
+ EmojiItem("RABBIT", "animal-nature", "animal-mammal", "🐇"),
+ EmojiItem("LEOPARD", "animal-nature", "animal-mammal", "🐆"),
+ EmojiItem("TIGER", "animal-nature", "animal-mammal", "🐅"),
+ EmojiItem("COW", "animal-nature", "animal-mammal", "🐄"),
+ EmojiItem("WATER BUFFALO", "animal-nature", "animal-mammal", "🐃"),
+ EmojiItem("OX", "animal-nature", "animal-mammal", "🐂"),
+ EmojiItem("MOUSE", "animal-nature", "animal-mammal", "🐁"),
+ EmojiItem("RAT", "animal-nature", "animal-mammal", "🐀"),
+ EmojiItem("SEAL", "animal-nature", "animal-marine", "🦭"),
+ EmojiItem("SHARK", "animal-nature", "animal-marine", "🦈"),
+ EmojiItem("SPOUTING WHALE", "animal-nature", "animal-marine", "🐳"),
+ EmojiItem("DOLPHIN", "animal-nature", "animal-marine", "🐬"),
+ EmojiItem("BLOWFISH", "animal-nature", "animal-marine", "🐡"),
+ EmojiItem("TROPICAL FISH", "animal-nature", "animal-marine", "🐠"),
+ EmojiItem("FISH", "animal-nature", "animal-marine", "🐟"),
+ EmojiItem("SPIRAL SHELL", "animal-nature", "animal-marine", "🐚"),
+ EmojiItem("OCTOPUS", "animal-nature", "animal-marine", "🐙"),
+ EmojiItem("WHALE", "animal-nature", "animal-marine", "🐋"),
+ EmojiItem("T-REX", "animal-nature", "animal-reptile", "🦖"),
+ EmojiItem("SAUROPOD", "animal-nature", "animal-reptile", "🦕"),
+ EmojiItem("LIZARD", "animal-nature", "animal-reptile", "🦎"),
+ EmojiItem("DRAGON FACE", "animal-nature", "animal-reptile", "🐲"),
+ EmojiItem("TURTLE", "animal-nature", "animal-reptile", "🐢"),
+ EmojiItem("SNAKE", "animal-nature", "animal-reptile", "🐍"),
+ EmojiItem("CROCODILE", "animal-nature", "animal-reptile", "🐊"),
+ EmojiItem("DRAGON", "animal-nature", "animal-reptile", "🐉"),
+ EmojiItem("WILTED FLOWER", "animal-nature", "plant-flower", "🥀"),
+ EmojiItem("WHITE FLOWER", "animal-nature", "plant-flower", "💮"),
+ EmojiItem("BOUQUET", "animal-nature", "plant-flower", "💐"),
+ EmojiItem("ROSETTE", "animal-nature", "plant-flower", "🏵"),
+ EmojiItem("BLOSSOM", "animal-nature", "plant-flower", "🌼"),
+ EmojiItem("SUNFLOWER", "animal-nature", "plant-flower", "🌻"),
+ EmojiItem("HIBISCUS", "animal-nature", "plant-flower", "🌺"),
+ EmojiItem("ROSE", "animal-nature", "plant-flower", "🌹"),
+ EmojiItem("CHERRY BLOSSOM", "animal-nature", "plant-flower", "🌸"),
+ EmojiItem("TULIP", "animal-nature", "plant-flower", "🌷"),
+ EmojiItem("SHAMROCK", "animal-nature", "plant-other", "☘"),
+ EmojiItem("POTTED PLANT", "animal-nature", "plant-other", "🪴"),
+ EmojiItem(
+ "LEAF FLUTTERING IN WIND", "animal-nature", "plant-other", "🍃"
+ ),
+ EmojiItem("FALLEN LEAF", "animal-nature", "plant-other", "🍂"),
+ EmojiItem("MAPLE LEAF", "animal-nature", "plant-other", "🍁"),
+ EmojiItem("FOUR LEAF CLOVER", "animal-nature", "plant-other", "🍀"),
+ EmojiItem("HERB", "animal-nature", "plant-other", "🌿"),
+ EmojiItem("EAR OF RICE", "animal-nature", "plant-other", "🌾"),
+ EmojiItem("CACTUS", "animal-nature", "plant-other", "🌵"),
+ EmojiItem("PALM TREE", "animal-nature", "plant-other", "🌴"),
+ EmojiItem("DECIDUOUS TREE", "animal-nature", "plant-other", "🌳"),
+ EmojiItem("EVERGREEN TREE", "animal-nature", "plant-other", "🌲"),
+ EmojiItem("SEEDLING", "animal-nature", "plant-other", "🌱"),
+ EmojiItem(
+ "EMOJI COMPONENT WHITE HAIR", "component", "hair-style", "🦳"
+ ),
+ EmojiItem("EMOJI COMPONENT BALD", "component", "hair-style", "🦲"),
+ EmojiItem(
+ "EMOJI COMPONENT CURLY HAIR", "component", "hair-style", "🦱"
+ ),
+ EmojiItem("EMOJI COMPONENT RED HAIR", "component", "hair-style", "🦰"),
+ EmojiItem(
+ "EMOJI MODIFIER FITZPATRICK TYPE-6", "component", "skin-tone", "🏿"
+ ),
+ EmojiItem(
+ "EMOJI MODIFIER FITZPATRICK TYPE-5", "component", "skin-tone", "🏾"
+ ),
+ EmojiItem(
+ "EMOJI MODIFIER FITZPATRICK TYPE-4", "component", "skin-tone", "🏽"
+ ),
+ EmojiItem(
+ "EMOJI MODIFIER FITZPATRICK TYPE-3", "component", "skin-tone", "🏼"
+ ),
+ EmojiItem(
+ "EMOJI MODIFIER FITZPATRICK TYPE-1-2",
+ "component",
+ "skin-tone",
+ "🏻",
+ ),
+ EmojiItem("TRIANGULAR FLAG ON POST", "flags", "flag", "🚩"),
+ EmojiItem("WAVING BLACK FLAG", "flags", "flag", "🏴"),
+ EmojiItem("WAVING WHITE FLAG", "flags", "flag", "🏳"),
+ EmojiItem("CHEQUERED FLAG", "flags", "flag", "🏁"),
+ EmojiItem("CROSSED FLAGS", "flags", "flag", "🎌"),
+ EmojiItem("CHOPSTICKS", "food-drink", "dishware", "🥢"),
+ EmojiItem("SPOON", "food-drink", "dishware", "🥄"),
+ EmojiItem("HOCHO", "food-drink", "dishware", "🔪"),
+ EmojiItem("AMPHORA", "food-drink", "dishware", "🏺"),
+ EmojiItem("FORK AND KNIFE WITH PLATE", "food-drink", "dishware", "🍽"),
+ EmojiItem("FORK AND KNIFE", "food-drink", "dishware", "🍴"),
+ EmojiItem("HOT BEVERAGE", "food-drink", "drink", "☕"),
+ EmojiItem("TEAPOT", "food-drink", "drink", "🫖"),
+ EmojiItem("BUBBLE TEA", "food-drink", "drink", "🧋"),
+ EmojiItem("ICE CUBE", "food-drink", "drink", "🧊"),
+ EmojiItem("MATE DRINK", "food-drink", "drink", "🧉"),
+ EmojiItem("BEVERAGE BOX", "food-drink", "drink", "🧃"),
+ EmojiItem("CUP WITH STRAW", "food-drink", "drink", "🥤"),
+ EmojiItem("GLASS OF MILK", "food-drink", "drink", "🥛"),
+ EmojiItem("TUMBLER GLASS", "food-drink", "drink", "🥃"),
+ EmojiItem("CLINKING GLASSES", "food-drink", "drink", "🥂"),
+ EmojiItem("BOTTLE WITH POPPING CORK", "food-drink", "drink", "🍾"),
+ EmojiItem("BABY BOTTLE", "food-drink", "drink", "🍼"),
+ EmojiItem("CLINKING BEER MUGS", "food-drink", "drink", "🍻"),
+ EmojiItem("BEER MUG", "food-drink", "drink", "🍺"),
+ EmojiItem("TROPICAL DRINK", "food-drink", "drink", "🍹"),
+ EmojiItem("COCKTAIL GLASS", "food-drink", "drink", "🍸"),
+ EmojiItem("WINE GLASS", "food-drink", "drink", "🍷"),
+ EmojiItem("SAKE BOTTLE AND CUP", "food-drink", "drink", "🍶"),
+ EmojiItem("TEACUP WITHOUT HANDLE", "food-drink", "drink", "🍵"),
+ EmojiItem("MOON CAKE", "food-drink", "food-asian", "🥮"),
+ EmojiItem("TAKEOUT BOX", "food-drink", "food-asian", "🥡"),
+ EmojiItem("FORTUNE COOKIE", "food-drink", "food-asian", "🥠"),
+ EmojiItem("DUMPLING", "food-drink", "food-asian", "🥟"),
+ EmojiItem("BENTO BOX", "food-drink", "food-asian", "🍱"),
+ EmojiItem(
+ "FISH CAKE WITH SWIRL DESIGN", "food-drink", "food-asian", "🍥"
+ ),
+ EmojiItem("FRIED SHRIMP", "food-drink", "food-asian", "🍤"),
+ EmojiItem("SUSHI", "food-drink", "food-asian", "🍣"),
+ EmojiItem("ODEN", "food-drink", "food-asian", "🍢"),
+ EmojiItem("DANGO", "food-drink", "food-asian", "🍡"),
+ EmojiItem("ROASTED SWEET POTATO", "food-drink", "food-asian", "🍠"),
+ EmojiItem("SPAGHETTI", "food-drink", "food-asian", "🍝"),
+ EmojiItem("STEAMING BOWL", "food-drink", "food-asian", "🍜"),
+ EmojiItem("CURRY AND RICE", "food-drink", "food-asian", "🍛"),
+ EmojiItem("COOKED RICE", "food-drink", "food-asian", "🍚"),
+ EmojiItem("RICE BALL", "food-drink", "food-asian", "🍙"),
+ EmojiItem("RICE CRACKER", "food-drink", "food-asian", "🍘"),
+ EmojiItem("OLIVE", "food-drink", "food-fruit", "🫒"),
+ EmojiItem("BLUEBERRIES", "food-drink", "food-fruit", "🫐"),
+ EmojiItem("MANGO", "food-drink", "food-fruit", "🥭"),
+ EmojiItem("COCONUT", "food-drink", "food-fruit", "🥥"),
+ EmojiItem("KIWIFRUIT", "food-drink", "food-fruit", "🥝"),
+ EmojiItem("STRAWBERRY", "food-drink", "food-fruit", "🍓"),
+ EmojiItem("CHERRIES", "food-drink", "food-fruit", "🍒"),
+ EmojiItem("PEACH", "food-drink", "food-fruit", "🍑"),
+ EmojiItem("PEAR", "food-drink", "food-fruit", "🍐"),
+ EmojiItem("GREEN APPLE", "food-drink", "food-fruit", "🍏"),
+ EmojiItem("RED APPLE", "food-drink", "food-fruit", "🍎"),
+ EmojiItem("PINEAPPLE", "food-drink", "food-fruit", "🍍"),
+ EmojiItem("BANANA", "food-drink", "food-fruit", "🍌"),
+ EmojiItem("LEMON", "food-drink", "food-fruit", "🍋"),
+ EmojiItem("TANGERINE", "food-drink", "food-fruit", "🍊"),
+ EmojiItem("WATERMELON", "food-drink", "food-fruit", "🍉"),
+ EmojiItem("MELON", "food-drink", "food-fruit", "🍈"),
+ EmojiItem("GRAPES", "food-drink", "food-fruit", "🍇"),
+ EmojiItem("TOMATO", "food-drink", "food-fruit", "🍅"),
+ EmojiItem("OYSTER", "food-drink", "food-marine", "🦪"),
+ EmojiItem("LOBSTER", "food-drink", "food-marine", "🦞"),
+ EmojiItem("SQUID", "food-drink", "food-marine", "🦑"),
+ EmojiItem("SHRIMP", "food-drink", "food-marine", "🦐"),
+ EmojiItem("CRAB", "food-drink", "food-marine", "🦀"),
+ EmojiItem("FONDUE", "food-drink", "food-prepared", "🫕"),
+ EmojiItem("TAMALE", "food-drink", "food-prepared", "🫔"),
+ EmojiItem("FLATBREAD", "food-drink", "food-prepared", "🫓"),
+ EmojiItem("BUTTER", "food-drink", "food-prepared", "🧈"),
+ EmojiItem("WAFFLE", "food-drink", "food-prepared", "🧇"),
+ EmojiItem("FALAFEL", "food-drink", "food-prepared", "🧆"),
+ EmojiItem("SALT SHAKER", "food-drink", "food-prepared", "🧂"),
+ EmojiItem("CHEESE WEDGE", "food-drink", "food-prepared", "🧀"),
+ EmojiItem("BAGEL", "food-drink", "food-prepared", "🥯"),
+ EmojiItem("CANNED FOOD", "food-drink", "food-prepared", "🥫"),
+ EmojiItem("SANDWICH", "food-drink", "food-prepared", "🥪"),
+ EmojiItem("CUT OF MEAT", "food-drink", "food-prepared", "🥩"),
+ EmojiItem("PRETZEL", "food-drink", "food-prepared", "🥨"),
+ EmojiItem("BOWL WITH SPOON", "food-drink", "food-prepared", "🥣"),
+ EmojiItem("PANCAKES", "food-drink", "food-prepared", "🥞"),
+ EmojiItem("EGG", "food-drink", "food-prepared", "🥚"),
+ EmojiItem("STUFFED FLATBREAD", "food-drink", "food-prepared", "🥙"),
+ EmojiItem("SHALLOW PAN OF FOOD", "food-drink", "food-prepared", "🥘"),
+ EmojiItem("GREEN SALAD", "food-drink", "food-prepared", "🥗"),
+ EmojiItem("BAGUETTE BREAD", "food-drink", "food-prepared", "🥖"),
+ EmojiItem("BACON", "food-drink", "food-prepared", "🥓"),
+ EmojiItem("CROISSANT", "food-drink", "food-prepared", "🥐"),
+ EmojiItem("POPCORN", "food-drink", "food-prepared", "🍿"),
+ EmojiItem("COOKING", "food-drink", "food-prepared", "🍳"),
+ EmojiItem("POT OF FOOD", "food-drink", "food-prepared", "🍲"),
+ EmojiItem("FRENCH FRIES", "food-drink", "food-prepared", "🍟"),
+ EmojiItem("BREAD", "food-drink", "food-prepared", "🍞"),
+ EmojiItem("POULTRY LEG", "food-drink", "food-prepared", "🍗"),
+ EmojiItem("MEAT ON BONE", "food-drink", "food-prepared", "🍖"),
+ EmojiItem("SLICE OF PIZZA", "food-drink", "food-prepared", "🍕"),
+ EmojiItem("HAMBURGER", "food-drink", "food-prepared", "🍔"),
+ EmojiItem("BURRITO", "food-drink", "food-prepared", "🌯"),
+ EmojiItem("TACO", "food-drink", "food-prepared", "🌮"),
+ EmojiItem("HOT DOG", "food-drink", "food-prepared", "🌭"),
+ EmojiItem("CUPCAKE", "food-drink", "food-sweet", "🧁"),
+ EmojiItem("PIE", "food-drink", "food-sweet", "🥧"),
+ EmojiItem("BIRTHDAY CAKE", "food-drink", "food-sweet", "🎂"),
+ EmojiItem("SHORTCAKE", "food-drink", "food-sweet", "🍰"),
+ EmojiItem("HONEY POT", "food-drink", "food-sweet", "🍯"),
+ EmojiItem("CUSTARD", "food-drink", "food-sweet", "🍮"),
+ EmojiItem("LOLLIPOP", "food-drink", "food-sweet", "🍭"),
+ EmojiItem("CANDY", "food-drink", "food-sweet", "🍬"),
+ EmojiItem("CHOCOLATE BAR", "food-drink", "food-sweet", "🍫"),
+ EmojiItem("COOKIE", "food-drink", "food-sweet", "🍪"),
+ EmojiItem("DOUGHNUT", "food-drink", "food-sweet", "🍩"),
+ EmojiItem("ICE CREAM", "food-drink", "food-sweet", "🍨"),
+ EmojiItem("SHAVED ICE", "food-drink", "food-sweet", "🍧"),
+ EmojiItem("SOFT ICE CREAM", "food-drink", "food-sweet", "🍦"),
+ EmojiItem("BELL PEPPER", "food-drink", "food-vegetable", "🫑"),
+ EmojiItem("ONION", "food-drink", "food-vegetable", "🧅"),
+ EmojiItem("GARLIC", "food-drink", "food-vegetable", "🧄"),
+ EmojiItem("LEAFY GREEN", "food-drink", "food-vegetable", "🥬"),
+ EmojiItem("BROCCOLI", "food-drink", "food-vegetable", "🥦"),
+ EmojiItem("PEANUTS", "food-drink", "food-vegetable", "🥜"),
+ EmojiItem("CARROT", "food-drink", "food-vegetable", "🥕"),
+ EmojiItem("POTATO", "food-drink", "food-vegetable", "🥔"),
+ EmojiItem("CUCUMBER", "food-drink", "food-vegetable", "🥒"),
+ EmojiItem("AVOCADO", "food-drink", "food-vegetable", "🥑"),
+ EmojiItem("AUBERGINE", "food-drink", "food-vegetable", "🍆"),
+ EmojiItem("MUSHROOM", "food-drink", "food-vegetable", "🍄"),
+ EmojiItem("EAR OF MAIZE", "food-drink", "food-vegetable", "🌽"),
+ EmojiItem("HOT PEPPER", "food-drink", "food-vegetable", "🌶"),
+ EmojiItem("CHESTNUT", "food-drink", "food-vegetable", "🌰"),
+ EmojiItem("ROLLED-UP NEWSPAPER", "objects", "book-paper", "🗞"),
+ EmojiItem("BOOKMARK", "objects", "book-paper", "🔖"),
+ EmojiItem("NEWSPAPER", "objects", "book-paper", "📰"),
+ EmojiItem("SCROLL", "objects", "book-paper", "📜"),
+ EmojiItem("BOOKS", "objects", "book-paper", "📚"),
+ EmojiItem("ORANGE BOOK", "objects", "book-paper", "📙"),
+ EmojiItem("BLUE BOOK", "objects", "book-paper", "📘"),
+ EmojiItem("GREEN BOOK", "objects", "book-paper", "📗"),
+ EmojiItem("OPEN BOOK", "objects", "book-paper", "📖"),
+ EmojiItem("CLOSED BOOK", "objects", "book-paper", "📕"),
+ EmojiItem(
+ "NOTEBOOK WITH DECORATIVE COVER", "objects", "book-paper", "📔"
+ ),
+ EmojiItem("NOTEBOOK", "objects", "book-paper", "📓"),
+ EmojiItem("LEDGER", "objects", "book-paper", "📒"),
+ EmojiItem("BOOKMARK TABS", "objects", "book-paper", "📑"),
+ EmojiItem("PAGE FACING UP", "objects", "book-paper", "📄"),
+ EmojiItem("PAGE WITH CURL", "objects", "book-paper", "📃"),
+ EmojiItem("LABEL", "objects", "book-paper", "🏷"),
+ EmojiItem("HELMET WITH WHITE CROSS", "objects", "clothing", "⛑"),
+ EmojiItem("MILITARY HELMET", "objects", "clothing", "🪖"),
+ EmojiItem("THONG SANDAL", "objects", "clothing", "🩴"),
+ EmojiItem("SHORTS", "objects", "clothing", "🩳"),
+ EmojiItem("BRIEFS", "objects", "clothing", "🩲"),
+ EmojiItem("ONE-PIECE SWIMSUIT", "objects", "clothing", "🩱"),
+ EmojiItem("BALLET SHOES", "objects", "clothing", "🩰"),
+ EmojiItem("SOCKS", "objects", "clothing", "🧦"),
+ EmojiItem("COAT", "objects", "clothing", "🧥"),
+ EmojiItem("GLOVES", "objects", "clothing", "🧤"),
+ EmojiItem("SCARF", "objects", "clothing", "🧣"),
+ EmojiItem("BILLED CAP", "objects", "clothing", "🧢"),
+ EmojiItem("SAFETY VEST", "objects", "clothing", "🦺"),
+ EmojiItem("FLAT SHOE", "objects", "clothing", "🥿"),
+ EmojiItem("HIKING BOOT", "objects", "clothing", "🥾"),
+ EmojiItem("GOGGLES", "objects", "clothing", "🥽"),
+ EmojiItem("LAB COAT", "objects", "clothing", "🥼"),
+ EmojiItem("SARI", "objects", "clothing", "🥻"),
+ EmojiItem("SHOPPING BAGS", "objects", "clothing", "🛍"),
+ EmojiItem("DARK SUNGLASSES", "objects", "clothing", "🕶"),
+ EmojiItem("PRAYER BEADS", "objects", "clothing", "📿"),
+ EmojiItem("GEM STONE", "objects", "clothing", "💎"),
+ EmojiItem("RING", "objects", "clothing", "💍"),
+ EmojiItem("LIPSTICK", "objects", "clothing", "💄"),
+ EmojiItem("WOMANS BOOTS", "objects", "clothing", "👢"),
+ EmojiItem("WOMANS SANDAL", "objects", "clothing", "👡"),
+ EmojiItem("HIGH-HEELED SHOE", "objects", "clothing", "👠"),
+ EmojiItem("ATHLETIC SHOE", "objects", "clothing", "👟"),
+ EmojiItem("MANS SHOE", "objects", "clothing", "👞"),
+ EmojiItem("POUCH", "objects", "clothing", "👝"),
+ EmojiItem("HANDBAG", "objects", "clothing", "👜"),
+ EmojiItem("PURSE", "objects", "clothing", "👛"),
+ EmojiItem("WOMANS CLOTHES", "objects", "clothing", "👚"),
+ EmojiItem("BIKINI", "objects", "clothing", "👙"),
+ EmojiItem("KIMONO", "objects", "clothing", "👘"),
+ EmojiItem("DRESS", "objects", "clothing", "👗"),
+ EmojiItem("JEANS", "objects", "clothing", "👖"),
+ EmojiItem("T-SHIRT", "objects", "clothing", "👕"),
+ EmojiItem("NECKTIE", "objects", "clothing", "👔"),
+ EmojiItem("EYEGLASSES", "objects", "clothing", "👓"),
+ EmojiItem("WOMANS HAT", "objects", "clothing", "👒"),
+ EmojiItem("CROWN", "objects", "clothing", "👑"),
+ EmojiItem("TOP HAT", "objects", "clothing", "🎩"),
+ EmojiItem("GRADUATION CAP", "objects", "clothing", "🎓"),
+ EmojiItem("SCHOOL SATCHEL", "objects", "clothing", "🎒"),
+ EmojiItem("KEYBOARD", "objects", "computer", "⌨"),
+ EmojiItem("ABACUS", "objects", "computer", "🧮"),
+ EmojiItem("TRACKBALL", "objects", "computer", "🖲"),
+ EmojiItem("THREE BUTTON MOUSE", "objects", "computer", "🖱"),
+ EmojiItem("PRINTER", "objects", "computer", "🖨"),
+ EmojiItem("DESKTOP COMPUTER", "objects", "computer", "🖥"),
+ EmojiItem("ELECTRIC PLUG", "objects", "computer", "🔌"),
+ EmojiItem("BATTERY", "objects", "computer", "🔋"),
+ EmojiItem("DVD", "objects", "computer", "📀"),
+ EmojiItem("OPTICAL DISC", "objects", "computer", "💿"),
+ EmojiItem("FLOPPY DISK", "objects", "computer", "💾"),
+ EmojiItem("MINIDISC", "objects", "computer", "💽"),
+ EmojiItem("PERSONAL COMPUTER", "objects", "computer", "💻"),
+ EmojiItem("TOOTHBRUSH", "objects", "household", "🪥"),
+ EmojiItem("MOUSE TRAP", "objects", "household", "🪤"),
+ EmojiItem("BUCKET", "objects", "household", "🪣"),
+ EmojiItem("PLUNGER", "objects", "household", "🪠"),
+ EmojiItem("WINDOW", "objects", "household", "🪟"),
+ EmojiItem("MIRROR", "objects", "household", "🪞"),
+ EmojiItem("RAZOR", "objects", "household", "🪒"),
+ EmojiItem("CHAIR", "objects", "household", "🪑"),
+ EmojiItem("SPONGE", "objects", "household", "🧽"),
+ EmojiItem("BAR OF SOAP", "objects", "household", "🧼"),
+ EmojiItem("ROLL OF PAPER", "objects", "household", "🧻"),
+ EmojiItem("BASKET", "objects", "household", "🧺"),
+ EmojiItem("BROOM", "objects", "household", "🧹"),
+ EmojiItem("SAFETY PIN", "objects", "household", "🧷"),
+ EmojiItem("LOTION BOTTLE", "objects", "household", "🧴"),
+ EmojiItem("FIRE EXTINGUISHER", "objects", "household", "🧯"),
+ EmojiItem("ELEVATOR", "objects", "household", "🛗"),
+ EmojiItem("SHOPPING TROLLEY", "objects", "household", "🛒"),
+ EmojiItem("BED", "objects", "household", "🛏"),
+ EmojiItem("COUCH AND LAMP", "objects", "household", "🛋"),
+ EmojiItem("BATHTUB", "objects", "household", "🛁"),
+ EmojiItem("SHOWER", "objects", "household", "🚿"),
+ EmojiItem("TOILET", "objects", "household", "🚽"),
+ EmojiItem("DOOR", "objects", "household", "🚪"),
+ EmojiItem("DIYA LAMP", "objects", "light & video", "🪔"),
+ EmojiItem("CANDLE", "objects", "light & video", "🕯"),
+ EmojiItem("ELECTRIC TORCH", "objects", "light & video", "🔦"),
+ EmojiItem(
+ "RIGHT-POINTING MAGNIFYING GLASS", "objects", "light & video", "🔎"
+ ),
+ EmojiItem(
+ "LEFT-POINTING MAGNIFYING GLASS", "objects", "light & video", "🔍"
+ ),
+ EmojiItem("FILM PROJECTOR", "objects", "light & video", "📽"),
+ EmojiItem("VIDEOCASSETTE", "objects", "light & video", "📼"),
+ EmojiItem("TELEVISION", "objects", "light & video", "📺"),
+ EmojiItem("VIDEO CAMERA", "objects", "light & video", "📹"),
+ EmojiItem("CAMERA WITH FLASH", "objects", "light & video", "📸"),
+ EmojiItem("CAMERA", "objects", "light & video", "📷"),
+ EmojiItem("ELECTRIC LIGHT BULB", "objects", "light & video", "💡"),
+ EmojiItem("IZAKAYA LANTERN", "objects", "light & video", "🏮"),
+ EmojiItem("CLAPPER BOARD", "objects", "light & video", "🎬"),
+ EmojiItem("MOVIE CAMERA", "objects", "light & video", "🎥"),
+ EmojiItem("FILM FRAMES", "objects", "light & video", "🎞"),
+ EmojiItem("OLD KEY", "objects", "lock", "🗝"),
+ EmojiItem("OPEN LOCK", "objects", "lock", "🔓"),
+ EmojiItem("LOCK", "objects", "lock", "🔒"),
+ EmojiItem("KEY", "objects", "lock", "🔑"),
+ EmojiItem("CLOSED LOCK WITH KEY", "objects", "lock", "🔐"),
+ EmojiItem("LOCK WITH INK PEN", "objects", "lock", "🔏"),
+ EmojiItem("ENVELOPE", "objects", "mail", "✉"),
+ EmojiItem("BALLOT BOX WITH BALLOT", "objects", "mail", "🗳"),
+ EmojiItem("POSTBOX", "objects", "mail", "📮"),
+ EmojiItem("OPEN MAILBOX WITH LOWERED FLAG", "objects", "mail", "📭"),
+ EmojiItem("OPEN MAILBOX WITH RAISED FLAG", "objects", "mail", "📬"),
+ EmojiItem("CLOSED MAILBOX WITH RAISED FLAG", "objects", "mail", "📫"),
+ EmojiItem("CLOSED MAILBOX WITH LOWERED FLAG", "objects", "mail", "📪"),
+ EmojiItem(
+ "ENVELOPE WITH DOWNWARDS ARROW ABOVE", "objects", "mail", "📩"
+ ),
+ EmojiItem("INCOMING ENVELOPE", "objects", "mail", "📨"),
+ EmojiItem("E-MAIL SYMBOL", "objects", "mail", "📧"),
+ EmojiItem("PACKAGE", "objects", "mail", "📦"),
+ EmojiItem("INBOX TRAY", "objects", "mail", "📥"),
+ EmojiItem("OUTBOX TRAY", "objects", "mail", "📤"),
+ EmojiItem("STETHOSCOPE", "objects", "medical", "🩺"),
+ EmojiItem("ADHESIVE BANDAGE", "objects", "medical", "🩹"),
+ EmojiItem("DROP OF BLOOD", "objects", "medical", "🩸"),
+ EmojiItem("PILL", "objects", "medical", "💊"),
+ EmojiItem("SYRINGE", "objects", "medical", "💉"),
+ EmojiItem("COIN", "objects", "money", "🪙"),
+ EmojiItem("RECEIPT", "objects", "money", "🧾"),
+ EmojiItem(
+ "CHART WITH UPWARDS TREND AND YEN SIGN", "objects", "money", "💹"
+ ),
+ EmojiItem("MONEY WITH WINGS", "objects", "money", "💸"),
+ EmojiItem("BANKNOTE WITH POUND SIGN", "objects", "money", "💷"),
+ EmojiItem("BANKNOTE WITH EURO SIGN", "objects", "money", "💶"),
+ EmojiItem("BANKNOTE WITH DOLLAR SIGN", "objects", "money", "💵"),
+ EmojiItem("BANKNOTE WITH YEN SIGN", "objects", "money", "💴"),
+ EmojiItem("CREDIT CARD", "objects", "money", "💳"),
+ EmojiItem("MONEY BAG", "objects", "money", "💰"),
+ EmojiItem("RADIO", "objects", "music", "📻"),
+ EmojiItem("MUSICAL SCORE", "objects", "music", "🎼"),
+ EmojiItem("MULTIPLE MUSICAL NOTES", "objects", "music", "🎶"),
+ EmojiItem("MUSICAL NOTE", "objects", "music", "🎵"),
+ EmojiItem("HEADPHONE", "objects", "music", "🎧"),
+ EmojiItem("MICROPHONE", "objects", "music", "🎤"),
+ EmojiItem("CONTROL KNOBS", "objects", "music", "🎛"),
+ EmojiItem("LEVEL SLIDER", "objects", "music", "🎚"),
+ EmojiItem("STUDIO MICROPHONE", "objects", "music", "🎙"),
+ EmojiItem("LONG DRUM", "objects", "musical-instrument", "🪘"),
+ EmojiItem("ACCORDION", "objects", "musical-instrument", "🪗"),
+ EmojiItem("BANJO", "objects", "musical-instrument", "🪕"),
+ EmojiItem(
+ "DRUM WITH DRUMSTICKS", "objects", "musical-instrument", "🥁"
+ ),
+ EmojiItem("VIOLIN", "objects", "musical-instrument", "🎻"),
+ EmojiItem("TRUMPET", "objects", "musical-instrument", "🎺"),
+ EmojiItem("MUSICAL KEYBOARD", "objects", "musical-instrument", "🎹"),
+ EmojiItem("GUITAR", "objects", "musical-instrument", "🎸"),
+ EmojiItem("SAXOPHONE", "objects", "musical-instrument", "🎷"),
+ EmojiItem("BLACK SCISSORS", "objects", "office", "✂"),
+ EmojiItem("SPIRAL CALENDAR PAD", "objects", "office", "🗓"),
+ EmojiItem("SPIRAL NOTE PAD", "objects", "office", "🗒"),
+ EmojiItem("WASTEBASKET", "objects", "office", "🗑"),
+ EmojiItem("FILE CABINET", "objects", "office", "🗄"),
+ EmojiItem("CARD FILE BOX", "objects", "office", "🗃"),
+ EmojiItem("CARD INDEX DIVIDERS", "objects", "office", "🗂"),
+ EmojiItem("LINKED PAPERCLIPS", "objects", "office", "🖇"),
+ EmojiItem("TRIANGULAR RULER", "objects", "office", "📐"),
+ EmojiItem("STRAIGHT RULER", "objects", "office", "📏"),
+ EmojiItem("PAPERCLIP", "objects", "office", "📎"),
+ EmojiItem("ROUND PUSHPIN", "objects", "office", "📍"),
+ EmojiItem("PUSHPIN", "objects", "office", "📌"),
+ EmojiItem("CLIPBOARD", "objects", "office", "📋"),
+ EmojiItem("BAR CHART", "objects", "office", "📊"),
+ EmojiItem("CHART WITH DOWNWARDS TREND", "objects", "office", "📉"),
+ EmojiItem("CHART WITH UPWARDS TREND", "objects", "office", "📈"),
+ EmojiItem("CARD INDEX", "objects", "office", "📇"),
+ EmojiItem("TEAR-OFF CALENDAR", "objects", "office", "📆"),
+ EmojiItem("CALENDAR", "objects", "office", "📅"),
+ EmojiItem("OPEN FILE FOLDER", "objects", "office", "📂"),
+ EmojiItem("FILE FOLDER", "objects", "office", "📁"),
+ EmojiItem("BRIEFCASE", "objects", "office", "💼"),
+ EmojiItem("FUNERAL URN", "objects", "other-object", "⚱"),
+ EmojiItem("COFFIN", "objects", "other-object", "⚰"),
+ EmojiItem("PLACARD", "objects", "other-object", "🪧"),
+ EmojiItem("HEADSTONE", "objects", "other-object", "🪦"),
+ EmojiItem("SMOKING SYMBOL", "objects", "other-object", "🚬"),
+ EmojiItem("MOYAI", "objects", "other-object", "🗿"),
+ EmojiItem("BLACK TELEPHONE", "objects", "phone", "☎"),
+ EmojiItem(
+ "MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT",
+ "objects",
+ "phone",
+ "📲",
+ ),
+ EmojiItem("MOBILE PHONE", "objects", "phone", "📱"),
+ EmojiItem("FAX MACHINE", "objects", "phone", "📠"),
+ EmojiItem("PAGER", "objects", "phone", "📟"),
+ EmojiItem("TELEPHONE RECEIVER", "objects", "phone", "📞"),
+ EmojiItem("ALEMBIC", "objects", "science", "⚗"),
+ EmojiItem("DNA DOUBLE HELIX", "objects", "science", "🧬"),
+ EmojiItem("PETRI DISH", "objects", "science", "🧫"),
+ EmojiItem("TEST TUBE", "objects", "science", "🧪"),
+ EmojiItem("TELESCOPE", "objects", "science", "🔭"),
+ EmojiItem("MICROSCOPE", "objects", "science", "🔬"),
+ EmojiItem("SATELLITE ANTENNA", "objects", "science", "📡"),
+ EmojiItem("BELL WITH CANCELLATION STROKE", "objects", "sound", "🔕"),
+ EmojiItem("BELL", "objects", "sound", "🔔"),
+ EmojiItem("SPEAKER WITH THREE SOUND WAVES", "objects", "sound", "🔊"),
+ EmojiItem("SPEAKER WITH ONE SOUND WAVE", "objects", "sound", "🔉"),
+ EmojiItem("SPEAKER", "objects", "sound", "🔈"),
+ EmojiItem("SPEAKER WITH CANCELLATION STROKE", "objects", "sound", "🔇"),
+ EmojiItem("POSTAL HORN", "objects", "sound", "📯"),
+ EmojiItem("CHEERING MEGAPHONE", "objects", "sound", "📣"),
+ EmojiItem("PUBLIC ADDRESS LOUDSPEAKER", "objects", "sound", "📢"),
+ EmojiItem("CHAINS", "objects", "tool", "⛓"),
+ EmojiItem("PICK", "objects", "tool", "⛏"),
+ EmojiItem("GEAR", "objects", "tool", "⚙"),
+ EmojiItem("SCALES", "objects", "tool", "⚖"),
+ EmojiItem("CROSSED SWORDS", "objects", "tool", "⚔"),
+ EmojiItem("HAMMER AND PICK", "objects", "tool", "⚒"),
+ EmojiItem("HOOK", "objects", "tool", "🪝"),
+ EmojiItem("LADDER", "objects", "tool", "🪜"),
+ EmojiItem("SCREWDRIVER", "objects", "tool", "🪛"),
+ EmojiItem("CARPENTRY SAW", "objects", "tool", "🪚"),
+ EmojiItem("AXE", "objects", "tool", "🪓"),
+ EmojiItem("BOOMERANG", "objects", "tool", "🪃"),
+ EmojiItem("MAGNET", "objects", "tool", "🧲"),
+ EmojiItem("TOOLBOX", "objects", "tool", "🧰"),
+ EmojiItem("PROBING CANE", "objects", "tool", "🦯"),
+ EmojiItem("SHIELD", "objects", "tool", "🛡"),
+ EmojiItem("HAMMER AND WRENCH", "objects", "tool", "🛠"),
+ EmojiItem("DAGGER KNIFE", "objects", "tool", "🗡"),
+ EmojiItem("COMPRESSION", "objects", "tool", "🗜"),
+ EmojiItem("PISTOL", "objects", "tool", "🔫"),
+ EmojiItem("NUT AND BOLT", "objects", "tool", "🔩"),
+ EmojiItem("HAMMER", "objects", "tool", "🔨"),
+ EmojiItem("WRENCH", "objects", "tool", "🔧"),
+ EmojiItem("LINK SYMBOL", "objects", "tool", "🔗"),
+ EmojiItem("BOW AND ARROW", "objects", "tool", "🏹"),
+ EmojiItem("PENCIL", "objects", "writing", "✏"),
+ EmojiItem("BLACK NIB", "objects", "writing", "✒"),
+ EmojiItem("LOWER LEFT CRAYON", "objects", "writing", "🖍"),
+ EmojiItem("LOWER LEFT PAINTBRUSH", "objects", "writing", "🖌"),
+ EmojiItem("LOWER LEFT FOUNTAIN PEN", "objects", "writing", "🖋"),
+ EmojiItem("LOWER LEFT BALLPOINT PEN", "objects", "writing", "🖊"),
+ EmojiItem("MEMO", "objects", "writing", "📝"),
+ EmojiItem("LUNGS", "people-body", "body-parts", "🫁"),
+ EmojiItem("ANATOMICAL HEART", "people-body", "body-parts", "🫀"),
+ EmojiItem("BRAIN", "people-body", "body-parts", "🧠"),
+ EmojiItem("MECHANICAL LEG", "people-body", "body-parts", "🦿"),
+ EmojiItem("MECHANICAL ARM", "people-body", "body-parts", "🦾"),
+ EmojiItem("EAR WITH HEARING AID", "people-body", "body-parts", "🦻"),
+ EmojiItem("TOOTH", "people-body", "body-parts", "🦷"),
+ EmojiItem("FOOT", "people-body", "body-parts", "🦶"),
+ EmojiItem("LEG", "people-body", "body-parts", "🦵"),
+ EmojiItem("BONE", "people-body", "body-parts", "🦴"),
+ EmojiItem("FLEXED BICEPS", "people-body", "body-parts", "💪"),
+ EmojiItem("TONGUE", "people-body", "body-parts", "👅"),
+ EmojiItem("MOUTH", "people-body", "body-parts", "👄"),
+ EmojiItem("NOSE", "people-body", "body-parts", "👃"),
+ EmojiItem("EAR", "people-body", "body-parts", "👂"),
+ EmojiItem("EYE", "people-body", "body-parts", "👁"),
+ EmojiItem("EYES", "people-body", "body-parts", "👀"),
+ EmojiItem("COUPLE WITH HEART", "people-body", "family", "💑"),
+ EmojiItem("KISS", "people-body", "family", "💏"),
+ EmojiItem("TWO WOMEN HOLDING HANDS", "people-body", "family", "👭"),
+ EmojiItem("TWO MEN HOLDING HANDS", "people-body", "family", "👬"),
+ EmojiItem("MAN AND WOMAN HOLDING HANDS", "people-body", "family", "👫"),
+ EmojiItem("FAMILY", "people-body", "family", "👪"),
+ EmojiItem("RAISED FIST", "people-body", "hand-fingers-closed", "✊"),
+ EmojiItem(
+ "RIGHT-FACING FIST", "people-body", "hand-fingers-closed", "🤜"
+ ),
+ EmojiItem(
+ "LEFT-FACING FIST", "people-body", "hand-fingers-closed", "🤛"
+ ),
+ EmojiItem(
+ "THUMBS DOWN SIGN", "people-body", "hand-fingers-closed", "👎"
+ ),
+ EmojiItem("THUMBS UP SIGN", "people-body", "hand-fingers-closed", "👍"),
+ EmojiItem(
+ "FISTED HAND SIGN", "people-body", "hand-fingers-closed", "👊"
+ ),
+ EmojiItem("RAISED HAND", "people-body", "hand-fingers-open", "✋"),
+ EmojiItem(
+ "RAISED BACK OF HAND", "people-body", "hand-fingers-open", "🤚"
+ ),
+ EmojiItem(
+ "RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS",
+ "people-body",
+ "hand-fingers-open",
+ "🖖",
+ ),
+ EmojiItem(
+ "RAISED HAND WITH FINGERS SPLAYED",
+ "people-body",
+ "hand-fingers-open",
+ "🖐",
+ ),
+ EmojiItem("WAVING HAND SIGN", "people-body", "hand-fingers-open", "👋"),
+ EmojiItem("VICTORY HAND", "people-body", "hand-fingers-partial", "✌"),
+ EmojiItem(
+ "I LOVE YOU HAND SIGN", "people-body", "hand-fingers-partial", "🤟"
+ ),
+ EmojiItem(
+ "HAND WITH INDEX AND MIDDLE FINGERS CROSSED",
+ "people-body",
+ "hand-fingers-partial",
+ "🤞",
+ ),
+ EmojiItem("CALL ME HAND", "people-body", "hand-fingers-partial", "🤙"),
+ EmojiItem(
+ "SIGN OF THE HORNS", "people-body", "hand-fingers-partial", "🤘"
+ ),
+ EmojiItem("PINCHING HAND", "people-body", "hand-fingers-partial", "🤏"),
+ EmojiItem(
+ "PINCHED FINGERS", "people-body", "hand-fingers-partial", "🤌"
+ ),
+ EmojiItem("OK HAND SIGN", "people-body", "hand-fingers-partial", "👌"),
+ EmojiItem("WRITING HAND", "people-body", "hand-prop", "✍"),
+ EmojiItem("SELFIE", "people-body", "hand-prop", "🤳"),
+ EmojiItem("NAIL POLISH", "people-body", "hand-prop", "💅"),
+ EmojiItem("PALMS UP TOGETHER", "people-body", "hands", "🤲"),
+ EmojiItem("HANDSHAKE", "people-body", "hands", "🤝"),
+ EmojiItem("PERSON WITH FOLDED HANDS", "people-body", "hands", "🙏"),
+ EmojiItem(
+ "PERSON RAISING BOTH HANDS IN CELEBRATION",
+ "people-body",
+ "hands",
+ "🙌",
+ ),
+ EmojiItem("OPEN HANDS SIGN", "people-body", "hands", "👐"),
+ EmojiItem("CLAPPING HANDS SIGN", "people-body", "hands", "👏"),
+ EmojiItem(
+ "WHITE UP POINTING INDEX", "people-body", "hand-single-finger", "☝"
+ ),
+ EmojiItem(
+ "REVERSED HAND WITH MIDDLE FINGER EXTENDED",
+ "people-body",
+ "hand-single-finger",
+ "🖕",
+ ),
+ EmojiItem(
+ "WHITE RIGHT POINTING BACKHAND INDEX",
+ "people-body",
+ "hand-single-finger",
+ "👉",
+ ),
+ EmojiItem(
+ "WHITE LEFT POINTING BACKHAND INDEX",
+ "people-body",
+ "hand-single-finger",
+ "👈",
+ ),
+ EmojiItem(
+ "WHITE DOWN POINTING BACKHAND INDEX",
+ "people-body",
+ "hand-single-finger",
+ "👇",
+ ),
+ EmojiItem(
+ "WHITE UP POINTING BACKHAND INDEX",
+ "people-body",
+ "hand-single-finger",
+ "👆",
+ ),
+ EmojiItem("BEARDED PERSON", "people-body", "person", "🧔"),
+ EmojiItem("OLDER ADULT", "people-body", "person", "🧓"),
+ EmojiItem("CHILD", "people-body", "person", "🧒"),
+ EmojiItem("ADULT", "people-body", "person", "🧑"),
+ EmojiItem("BABY", "people-body", "person", "👶"),
+ EmojiItem("OLDER WOMAN", "people-body", "person", "👵"),
+ EmojiItem("OLDER MAN", "people-body", "person", "👴"),
+ EmojiItem("PERSON WITH BLOND HAIR", "people-body", "person", "👱"),
+ EmojiItem("WOMAN", "people-body", "person", "👩"),
+ EmojiItem("MAN", "people-body", "person", "👨"),
+ EmojiItem("GIRL", "people-body", "person", "👧"),
+ EmojiItem("BOY", "people-body", "person", "👦"),
+ EmojiItem("PERSON CLIMBING", "people-body", "person-activity", "🧗"),
+ EmojiItem(
+ "PERSON IN STEAMY ROOM", "people-body", "person-activity", "🧖"
+ ),
+ EmojiItem("KNEELING PERSON", "people-body", "person-activity", "🧎"),
+ EmojiItem("STANDING PERSON", "people-body", "person-activity", "🧍"),
+ EmojiItem("PEDESTRIAN", "people-body", "person-activity", "🚶"),
+ EmojiItem("MAN DANCING", "people-body", "person-activity", "🕺"),
+ EmojiItem(
+ "MAN IN BUSINESS SUIT LEVITATING",
+ "people-body",
+ "person-activity",
+ "🕴",
+ ),
+ EmojiItem("HAIRCUT", "people-body", "person-activity", "💇"),
+ EmojiItem("FACE MASSAGE", "people-body", "person-activity", "💆"),
+ EmojiItem("DANCER", "people-body", "person-activity", "💃"),
+ EmojiItem(
+ "WOMAN WITH BUNNY EARS", "people-body", "person-activity", "👯"
+ ),
+ EmojiItem("RUNNER", "people-body", "person-activity", "🏃"),
+ EmojiItem("ZOMBIE", "people-body", "person-fantasy", "🧟"),
+ EmojiItem("GENIE", "people-body", "person-fantasy", "🧞"),
+ EmojiItem("ELF", "people-body", "person-fantasy", "🧝"),
+ EmojiItem("MERPERSON", "people-body", "person-fantasy", "🧜"),
+ EmojiItem("VAMPIRE", "people-body", "person-fantasy", "🧛"),
+ EmojiItem("FAIRY", "people-body", "person-fantasy", "🧚"),
+ EmojiItem("MAGE", "people-body", "person-fantasy", "🧙"),
+ EmojiItem("SUPERVILLAIN", "people-body", "person-fantasy", "🦹"),
+ EmojiItem("SUPERHERO", "people-body", "person-fantasy", "🦸"),
+ EmojiItem("MOTHER CHRISTMAS", "people-body", "person-fantasy", "🤶"),
+ EmojiItem("BABY ANGEL", "people-body", "person-fantasy", "👼"),
+ EmojiItem("FATHER CHRISTMAS", "people-body", "person-fantasy", "🎅"),
+ EmojiItem("DEAF PERSON", "people-body", "person-gesture", "🧏"),
+ EmojiItem("SHRUG", "people-body", "person-gesture", "🤷"),
+ EmojiItem("FACE PALM", "people-body", "person-gesture", "🤦"),
+ EmojiItem(
+ "PERSON WITH POUTING FACE", "people-body", "person-gesture", "🙎"
+ ),
+ EmojiItem("PERSON FROWNING", "people-body", "person-gesture", "🙍"),
+ EmojiItem(
+ "HAPPY PERSON RAISING ONE HAND",
+ "people-body",
+ "person-gesture",
+ "🙋",
+ ),
+ EmojiItem(
+ "PERSON BOWING DEEPLY", "people-body", "person-gesture", "🙇"
+ ),
+ EmojiItem(
+ "FACE WITH OK GESTURE", "people-body", "person-gesture", "🙆"
+ ),
+ EmojiItem(
+ "FACE WITH NO GOOD GESTURE", "people-body", "person-gesture", "🙅"
+ ),
+ EmojiItem(
+ "INFORMATION DESK PERSON", "people-body", "person-gesture", "💁"
+ ),
+ EmojiItem(
+ "PERSON IN LOTUS POSITION", "people-body", "person-resting", "🧘"
+ ),
+ EmojiItem(
+ "SLEEPING ACCOMMODATION", "people-body", "person-resting", "🛌"
+ ),
+ EmojiItem("BATH", "people-body", "person-resting", "🛀"),
+ EmojiItem("PERSON WITH HEADSCARF", "people-body", "person-role", "🧕"),
+ EmojiItem("NINJA", "people-body", "person-role", "🥷"),
+ EmojiItem("MAN IN TUXEDO", "people-body", "person-role", "🤵"),
+ EmojiItem("PRINCE", "people-body", "person-role", "🤴"),
+ EmojiItem("BREAST-FEEDING", "people-body", "person-role", "🤱"),
+ EmojiItem("PREGNANT WOMAN", "people-body", "person-role", "🤰"),
+ EmojiItem("SLEUTH OR SPY", "people-body", "person-role", "🕵"),
+ EmojiItem("GUARDSMAN", "people-body", "person-role", "💂"),
+ EmojiItem("PRINCESS", "people-body", "person-role", "👸"),
+ EmojiItem("CONSTRUCTION WORKER", "people-body", "person-role", "👷"),
+ EmojiItem("MAN WITH TURBAN", "people-body", "person-role", "👳"),
+ EmojiItem("MAN WITH GUA PI MAO", "people-body", "person-role", "👲"),
+ EmojiItem("BRIDE WITH VEIL", "people-body", "person-role", "👰"),
+ EmojiItem("POLICE OFFICER", "people-body", "person-role", "👮"),
+ EmojiItem("PERSON WITH BALL", "people-body", "person-sport", "⛹"),
+ EmojiItem("SKIER", "people-body", "person-sport", "⛷"),
+ EmojiItem("HANDBALL", "people-body", "person-sport", "🤾"),
+ EmojiItem("WATER POLO", "people-body", "person-sport", "🤽"),
+ EmojiItem("WRESTLERS", "people-body", "person-sport", "🤼"),
+ EmojiItem("FENCER", "people-body", "person-sport", "🤺"),
+ EmojiItem("JUGGLING", "people-body", "person-sport", "🤹"),
+ EmojiItem(
+ "PERSON DOING CARTWHEEL", "people-body", "person-sport", "🤸"
+ ),
+ EmojiItem("MOUNTAIN BICYCLIST", "people-body", "person-sport", "🚵"),
+ EmojiItem("BICYCLIST", "people-body", "person-sport", "🚴"),
+ EmojiItem("ROWBOAT", "people-body", "person-sport", "🚣"),
+ EmojiItem("GOLFER", "people-body", "person-sport", "🏌"),
+ EmojiItem("WEIGHT LIFTER", "people-body", "person-sport", "🏋"),
+ EmojiItem("SWIMMER", "people-body", "person-sport", "🏊"),
+ EmojiItem("HORSE RACING", "people-body", "person-sport", "🏇"),
+ EmojiItem("SURFER", "people-body", "person-sport", "🏄"),
+ EmojiItem("SNOWBOARDER", "people-body", "person-sport", "🏂"),
+ EmojiItem("PEOPLE HUGGING", "people-body", "person-symbol", "🫂"),
+ EmojiItem(
+ "SPEAKING HEAD IN SILHOUETTE", "people-body", "person-symbol", "🗣"
+ ),
+ EmojiItem("BUSTS IN SILHOUETTE", "people-body", "person-symbol", "👥"),
+ EmojiItem("BUST IN SILHOUETTE", "people-body", "person-symbol", "👤"),
+ EmojiItem("FOOTPRINTS", "people-body", "person-symbol", "👣"),
+ EmojiItem(
+ "CIRCLED LATIN CAPITAL LETTER M", "symbols", "alphanum", "Ⓜ"
+ ),
+ EmojiItem("CIRCLED IDEOGRAPH SECRET", "symbols", "alphanum", "㊙"),
+ EmojiItem(
+ "CIRCLED IDEOGRAPH CONGRATULATION", "symbols", "alphanum", "㊗"
+ ),
+ EmojiItem("INFORMATION SOURCE", "symbols", "alphanum", "ℹ"),
+ EmojiItem(
+ "INPUT SYMBOL FOR LATIN LETTERS", "symbols", "alphanum", "🔤"
+ ),
+ EmojiItem("INPUT SYMBOL FOR SYMBOLS", "symbols", "alphanum", "🔣"),
+ EmojiItem("INPUT SYMBOL FOR NUMBERS", "symbols", "alphanum", "🔢"),
+ EmojiItem(
+ "INPUT SYMBOL FOR LATIN SMALL LETTERS", "symbols", "alphanum", "🔡"
+ ),
+ EmojiItem(
+ "INPUT SYMBOL FOR LATIN CAPITAL LETTERS",
+ "symbols",
+ "alphanum",
+ "🔠",
+ ),
+ EmojiItem("CIRCLED IDEOGRAPH ACCEPT", "symbols", "alphanum", "🉑"),
+ EmojiItem("CIRCLED IDEOGRAPH ADVANTAGE", "symbols", "alphanum", "🉐"),
+ EmojiItem(
+ "SQUARED CJK UNIFIED IDEOGRAPH-55B6", "symbols", "alphanum", "🈺"
+ ),
+ EmojiItem(
+ "SQUARED CJK UNIFIED IDEOGRAPH-5272", "symbols", "alphanum", "🈹"
+ ),
+ EmojiItem(
+ "SQUARED CJK UNIFIED IDEOGRAPH-7533", "symbols", "alphanum", "🈸"
+ ),
+ EmojiItem(
+ "SQUARED CJK UNIFIED IDEOGRAPH-6708", "symbols", "alphanum", "🈷"
+ ),
+ EmojiItem(
+ "SQUARED CJK UNIFIED IDEOGRAPH-6709", "symbols", "alphanum", "🈶"
+ ),
+ EmojiItem(
+ "SQUARED CJK UNIFIED IDEOGRAPH-6E80", "symbols", "alphanum", "🈵"
+ ),
+ EmojiItem(
+ "SQUARED CJK UNIFIED IDEOGRAPH-5408", "symbols", "alphanum", "🈴"
+ ),
+ EmojiItem(
+ "SQUARED CJK UNIFIED IDEOGRAPH-7A7A", "symbols", "alphanum", "🈳"
+ ),
+ EmojiItem(
+ "SQUARED CJK UNIFIED IDEOGRAPH-7981", "symbols", "alphanum", "🈲"
+ ),
+ EmojiItem(
+ "SQUARED CJK UNIFIED IDEOGRAPH-6307", "symbols", "alphanum", "🈯"
+ ),
+ EmojiItem(
+ "SQUARED CJK UNIFIED IDEOGRAPH-7121", "symbols", "alphanum", "🈚"
+ ),
+ EmojiItem("SQUARED KATAKANA SA", "symbols", "alphanum", "🈂"),
+ EmojiItem("SQUARED KATAKANA KOKO", "symbols", "alphanum", "🈁"),
+ EmojiItem("SQUARED VS", "symbols", "alphanum", "🆚"),
+ EmojiItem(
+ "SQUARED UP WITH EXCLAMATION MARK", "symbols", "alphanum", "🆙"
+ ),
+ EmojiItem("SQUARED SOS", "symbols", "alphanum", "🆘"),
+ EmojiItem("SQUARED OK", "symbols", "alphanum", "🆗"),
+ EmojiItem("SQUARED NG", "symbols", "alphanum", "🆖"),
+ EmojiItem("SQUARED NEW", "symbols", "alphanum", "🆕"),
+ EmojiItem("SQUARED ID", "symbols", "alphanum", "🆔"),
+ EmojiItem("SQUARED FREE", "symbols", "alphanum", "🆓"),
+ EmojiItem("SQUARED COOL", "symbols", "alphanum", "🆒"),
+ EmojiItem("SQUARED CL", "symbols", "alphanum", "🆑"),
+ EmojiItem("NEGATIVE SQUARED AB", "symbols", "alphanum", "🆎"),
+ EmojiItem(
+ "NEGATIVE SQUARED LATIN CAPITAL LETTER P",
+ "symbols",
+ "alphanum",
+ "🅿",
+ ),
+ EmojiItem(
+ "NEGATIVE SQUARED LATIN CAPITAL LETTER O",
+ "symbols",
+ "alphanum",
+ "🅾",
+ ),
+ EmojiItem(
+ "NEGATIVE SQUARED LATIN CAPITAL LETTER B",
+ "symbols",
+ "alphanum",
+ "🅱",
+ ),
+ EmojiItem(
+ "NEGATIVE SQUARED LATIN CAPITAL LETTER A",
+ "symbols",
+ "alphanum",
+ "🅰",
+ ),
+ EmojiItem("DOWNWARDS BLACK ARROW", "symbols", "arrow", "⬇"),
+ EmojiItem("UPWARDS BLACK ARROW", "symbols", "arrow", "⬆"),
+ EmojiItem("LEFTWARDS BLACK ARROW", "symbols", "arrow", "⬅"),
+ EmojiItem("BLACK RIGHTWARDS ARROW", "symbols", "arrow", "➡"),
+ EmojiItem("RIGHTWARDS ARROW WITH HOOK", "symbols", "arrow", "↪"),
+ EmojiItem("LEFTWARDS ARROW WITH HOOK", "symbols", "arrow", "↩"),
+ EmojiItem(
+ "ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS",
+ "symbols",
+ "arrow",
+ "⤵",
+ ),
+ EmojiItem(
+ "ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS",
+ "symbols",
+ "arrow",
+ "⤴",
+ ),
+ EmojiItem("SOUTH WEST ARROW", "symbols", "arrow", "↙"),
+ EmojiItem("SOUTH EAST ARROW", "symbols", "arrow", "↘"),
+ EmojiItem("NORTH EAST ARROW", "symbols", "arrow", "↗"),
+ EmojiItem("NORTH WEST ARROW", "symbols", "arrow", "↖"),
+ EmojiItem("UP DOWN ARROW", "symbols", "arrow", "↕"),
+ EmojiItem("LEFT RIGHT ARROW", "symbols", "arrow", "↔"),
+ EmojiItem("TOP WITH UPWARDS ARROW ABOVE", "symbols", "arrow", "🔝"),
+ EmojiItem("SOON WITH RIGHTWARDS ARROW ABOVE", "symbols", "arrow", "🔜"),
+ EmojiItem(
+ "ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE",
+ "symbols",
+ "arrow",
+ "🔛",
+ ),
+ EmojiItem("END WITH LEFTWARDS ARROW ABOVE", "symbols", "arrow", "🔚"),
+ EmojiItem("BACK WITH LEFTWARDS ARROW ABOVE", "symbols", "arrow", "🔙"),
+ EmojiItem(
+ "ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS",
+ "symbols",
+ "arrow",
+ "🔄",
+ ),
+ EmojiItem(
+ "CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS",
+ "symbols",
+ "arrow",
+ "🔃",
+ ),
+ EmojiItem("BLACK LEFT-POINTING TRIANGLE", "symbols", "av-symbol", "◀"),
+ EmojiItem(
+ "BLACK RIGHT-POINTING TRIANGLE", "symbols", "av-symbol", "▶"
+ ),
+ EmojiItem("BLACK CIRCLE FOR RECORD", "symbols", "av-symbol", "⏺"),
+ EmojiItem("BLACK SQUARE FOR STOP", "symbols", "av-symbol", "⏹"),
+ EmojiItem("DOUBLE VERTICAL BAR", "symbols", "av-symbol", "⏸"),
+ EmojiItem(
+ "BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR",
+ "symbols",
+ "av-symbol",
+ "⏯",
+ ),
+ EmojiItem(
+ "BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR",
+ "symbols",
+ "av-symbol",
+ "⏮",
+ ),
+ EmojiItem(
+ "BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR",
+ "symbols",
+ "av-symbol",
+ "⏭",
+ ),
+ EmojiItem(
+ "BLACK DOWN-POINTING DOUBLE TRIANGLE", "symbols", "av-symbol", "⏬"
+ ),
+ EmojiItem(
+ "BLACK UP-POINTING DOUBLE TRIANGLE", "symbols", "av-symbol", "⏫"
+ ),
+ EmojiItem(
+ "BLACK LEFT-POINTING DOUBLE TRIANGLE", "symbols", "av-symbol", "⏪"
+ ),
+ EmojiItem("EJECT SYMBOL", "symbols", "av-symbol", "⏏"),
+ EmojiItem(
+ "DOWN-POINTING SMALL RED TRIANGLE", "symbols", "av-symbol", "🔽"
+ ),
+ EmojiItem(
+ "UP-POINTING SMALL RED TRIANGLE", "symbols", "av-symbol", "🔼"
+ ),
+ EmojiItem("HIGH BRIGHTNESS SYMBOL", "symbols", "av-symbol", "🔆"),
+ EmojiItem("LOW BRIGHTNESS SYMBOL", "symbols", "av-symbol", "🔅"),
+ EmojiItem(
+ "CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY",
+ "symbols",
+ "av-symbol",
+ "🔂",
+ ),
+ EmojiItem(
+ "CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS",
+ "symbols",
+ "av-symbol",
+ "🔁",
+ ),
+ EmojiItem("TWISTED RIGHTWARDS ARROWS", "symbols", "av-symbol", "🔀"),
+ EmojiItem("ANTENNA WITH BARS", "symbols", "av-symbol", "📶"),
+ EmojiItem("MOBILE PHONE OFF", "symbols", "av-symbol", "📴"),
+ EmojiItem("VIBRATION MODE", "symbols", "av-symbol", "📳"),
+ EmojiItem("CINEMA", "symbols", "av-symbol", "🎦"),
+ EmojiItem("HEAVY DOLLAR SIGN", "symbols", "currency", "💲"),
+ EmojiItem("CURRENCY EXCHANGE", "symbols", "currency", "💱"),
+ EmojiItem(
+ "MALE WITH STROKE AND MALE AND FEMALE SIGN",
+ "symbols",
+ "gender",
+ "⚧",
+ ),
+ EmojiItem("MALE SIGN", "symbols", "gender", "♂"),
+ EmojiItem("FEMALE SIGN", "symbols", "gender", "♀"),
+ EmojiItem("WHITE LARGE SQUARE", "symbols", "geometric", "⬜"),
+ EmojiItem("BLACK LARGE SQUARE", "symbols", "geometric", "⬛"),
+ EmojiItem("MEDIUM BLACK CIRCLE", "symbols", "geometric", "⚫"),
+ EmojiItem("MEDIUM WHITE CIRCLE", "symbols", "geometric", "⚪"),
+ EmojiItem("BLACK MEDIUM SMALL SQUARE", "symbols", "geometric", "◾"),
+ EmojiItem("WHITE MEDIUM SMALL SQUARE", "symbols", "geometric", "◽"),
+ EmojiItem("BLACK MEDIUM SQUARE", "symbols", "geometric", "◼"),
+ EmojiItem("WHITE MEDIUM SQUARE", "symbols", "geometric", "◻"),
+ EmojiItem("WHITE SMALL SQUARE", "symbols", "geometric", "▫"),
+ EmojiItem("BLACK SMALL SQUARE", "symbols", "geometric", "▪"),
+ EmojiItem("LARGE BROWN SQUARE", "symbols", "geometric", "🟫"),
+ EmojiItem("LARGE PURPLE SQUARE", "symbols", "geometric", "🟪"),
+ EmojiItem("LARGE GREEN SQUARE", "symbols", "geometric", "🟩"),
+ EmojiItem("LARGE YELLOW SQUARE", "symbols", "geometric", "🟨"),
+ EmojiItem("LARGE ORANGE SQUARE", "symbols", "geometric", "🟧"),
+ EmojiItem("LARGE BLUE SQUARE", "symbols", "geometric", "🟦"),
+ EmojiItem("LARGE RED SQUARE", "symbols", "geometric", "🟥"),
+ EmojiItem("LARGE BROWN CIRCLE", "symbols", "geometric", "🟤"),
+ EmojiItem("LARGE PURPLE CIRCLE", "symbols", "geometric", "🟣"),
+ EmojiItem("LARGE GREEN CIRCLE", "symbols", "geometric", "🟢"),
+ EmojiItem("LARGE YELLOW CIRCLE", "symbols", "geometric", "🟡"),
+ EmojiItem("LARGE ORANGE CIRCLE", "symbols", "geometric", "🟠"),
+ EmojiItem("DOWN-POINTING RED TRIANGLE", "symbols", "geometric", "🔻"),
+ EmojiItem("UP-POINTING RED TRIANGLE", "symbols", "geometric", "🔺"),
+ EmojiItem("SMALL BLUE DIAMOND", "symbols", "geometric", "🔹"),
+ EmojiItem("SMALL ORANGE DIAMOND", "symbols", "geometric", "🔸"),
+ EmojiItem("LARGE BLUE DIAMOND", "symbols", "geometric", "🔷"),
+ EmojiItem("LARGE ORANGE DIAMOND", "symbols", "geometric", "🔶"),
+ EmojiItem("LARGE BLUE CIRCLE", "symbols", "geometric", "🔵"),
+ EmojiItem("LARGE RED CIRCLE", "symbols", "geometric", "🔴"),
+ EmojiItem("WHITE SQUARE BUTTON", "symbols", "geometric", "🔳"),
+ EmojiItem("BLACK SQUARE BUTTON", "symbols", "geometric", "🔲"),
+ EmojiItem("RADIO BUTTON", "symbols", "geometric", "🔘"),
+ EmojiItem(
+ "DIAMOND SHAPE WITH A DOT INSIDE", "symbols", "geometric", "💠"
+ ),
+ EmojiItem("KEYCAP TEN", "symbols", "keycap", "🔟"),
+ EmojiItem("PERMANENT PAPER SIGN", "symbols", "math", "♾"),
+ EmojiItem("HEAVY DIVISION SIGN", "symbols", "math", "➗"),
+ EmojiItem("HEAVY MINUS SIGN", "symbols", "math", "➖"),
+ EmojiItem("HEAVY PLUS SIGN", "symbols", "math", "➕"),
+ EmojiItem("HEAVY MULTIPLICATION X", "symbols", "math", "✖"),
+ EmojiItem("PART ALTERNATION MARK", "symbols", "other-symbol", "〽"),
+ EmojiItem("HEAVY LARGE CIRCLE", "symbols", "other-symbol", "⭕"),
+ EmojiItem("DOUBLE CURLY LOOP", "symbols", "other-symbol", "➿"),
+ EmojiItem("CURLY LOOP", "symbols", "other-symbol", "➰"),
+ EmojiItem(
+ "NEGATIVE SQUARED CROSS MARK", "symbols", "other-symbol", "❎"
+ ),
+ EmojiItem("CROSS MARK", "symbols", "other-symbol", "❌"),
+ EmojiItem("FLEUR-DE-LIS", "symbols", "other-symbol", "⚜"),
+ EmojiItem(
+ "BLACK UNIVERSAL RECYCLING SYMBOL", "symbols", "other-symbol", "♻"
+ ),
+ EmojiItem("REGISTERED SIGN", "symbols", "other-symbol", "®"),
+ EmojiItem("COPYRIGHT SIGN", "symbols", "other-symbol", "©"),
+ EmojiItem("SPARKLE", "symbols", "other-symbol", "❇"),
+ EmojiItem("EIGHT POINTED BLACK STAR", "symbols", "other-symbol", "✴"),
+ EmojiItem("EIGHT SPOKED ASTERISK", "symbols", "other-symbol", "✳"),
+ EmojiItem("HEAVY CHECK MARK", "symbols", "other-symbol", "✔"),
+ EmojiItem("WHITE HEAVY CHECK MARK", "symbols", "other-symbol", "✅"),
+ EmojiItem("STAFF OF AESCULAPIUS", "symbols", "other-symbol", "⚕"),
+ EmojiItem("BALLOT BOX WITH CHECK", "symbols", "other-symbol", "☑"),
+ EmojiItem("TRADE MARK SIGN", "symbols", "other-symbol", "™"),
+ EmojiItem("TRIDENT EMBLEM", "symbols", "other-symbol", "🔱"),
+ EmojiItem(
+ "JAPANESE SYMBOL FOR BEGINNER", "symbols", "other-symbol", "🔰"
+ ),
+ EmojiItem("NAME BADGE", "symbols", "other-symbol", "📛"),
+ EmojiItem("DOUBLE EXCLAMATION MARK", "symbols", "punctuation", "‼"),
+ EmojiItem("WAVY DASH", "symbols", "punctuation", "〰"),
+ EmojiItem(
+ "HEAVY EXCLAMATION MARK SYMBOL", "symbols", "punctuation", "❗"
+ ),
+ EmojiItem(
+ "WHITE EXCLAMATION MARK ORNAMENT", "symbols", "punctuation", "❕"
+ ),
+ EmojiItem(
+ "WHITE QUESTION MARK ORNAMENT", "symbols", "punctuation", "❔"
+ ),
+ EmojiItem(
+ "BLACK QUESTION MARK ORNAMENT", "symbols", "punctuation", "❓"
+ ),
+ EmojiItem("EXCLAMATION QUESTION MARK", "symbols", "punctuation", "⁉"),
+ EmojiItem("LATIN CROSS", "symbols", "religion", "✝"),
+ EmojiItem("ATOM SYMBOL", "symbols", "religion", "⚛"),
+ EmojiItem("YIN YANG", "symbols", "religion", "☯"),
+ EmojiItem("PEACE SYMBOL", "symbols", "religion", "☮"),
+ EmojiItem("STAR AND CRESCENT", "symbols", "religion", "☪"),
+ EmojiItem("STAR OF DAVID", "symbols", "religion", "✡"),
+ EmojiItem("WHEEL OF DHARMA", "symbols", "religion", "☸"),
+ EmojiItem("ORTHODOX CROSS", "symbols", "religion", "☦"),
+ EmojiItem("PLACE OF WORSHIP", "symbols", "religion", "🛐"),
+ EmojiItem("MENORAH WITH NINE BRANCHES", "symbols", "religion", "🕎"),
+ EmojiItem("OM SYMBOL", "symbols", "religion", "🕉"),
+ EmojiItem(
+ "SIX POINTED STAR WITH MIDDLE DOT", "symbols", "religion", "🔯"
+ ),
+ EmojiItem("WHEELCHAIR SYMBOL", "symbols", "transport-sign", "♿"),
+ EmojiItem("LEFT LUGGAGE", "symbols", "transport-sign", "🛅"),
+ EmojiItem("BAGGAGE CLAIM", "symbols", "transport-sign", "🛄"),
+ EmojiItem("CUSTOMS", "symbols", "transport-sign", "🛃"),
+ EmojiItem("PASSPORT CONTROL", "symbols", "transport-sign", "🛂"),
+ EmojiItem("WATER CLOSET", "symbols", "transport-sign", "🚾"),
+ EmojiItem("BABY SYMBOL", "symbols", "transport-sign", "🚼"),
+ EmojiItem("RESTROOM", "symbols", "transport-sign", "🚻"),
+ EmojiItem("WOMENS SYMBOL", "symbols", "transport-sign", "🚺"),
+ EmojiItem("MENS SYMBOL", "symbols", "transport-sign", "🚹"),
+ EmojiItem("POTABLE WATER SYMBOL", "symbols", "transport-sign", "🚰"),
+ EmojiItem(
+ "PUT LITTER IN ITS PLACE SYMBOL", "symbols", "transport-sign", "🚮"
+ ),
+ EmojiItem(
+ "AUTOMATED TELLER MACHINE", "symbols", "transport-sign", "🏧"
+ ),
+ EmojiItem("NO ENTRY", "symbols", "warning", "⛔"),
+ EmojiItem("WARNING SIGN", "symbols", "warning", "⚠"),
+ EmojiItem("BIOHAZARD SIGN", "symbols", "warning", "☣"),
+ EmojiItem("RADIOACTIVE SIGN", "symbols", "warning", "☢"),
+ EmojiItem("CHILDREN CROSSING", "symbols", "warning", "🚸"),
+ EmojiItem("NO PEDESTRIANS", "symbols", "warning", "🚷"),
+ EmojiItem("NO BICYCLES", "symbols", "warning", "🚳"),
+ EmojiItem("NON-POTABLE WATER SYMBOL", "symbols", "warning", "🚱"),
+ EmojiItem("DO NOT LITTER SYMBOL", "symbols", "warning", "🚯"),
+ EmojiItem("NO SMOKING SYMBOL", "symbols", "warning", "🚭"),
+ EmojiItem("NO ENTRY SIGN", "symbols", "warning", "🚫"),
+ EmojiItem("NO ONE UNDER EIGHTEEN SYMBOL", "symbols", "warning", "🔞"),
+ EmojiItem("NO MOBILE PHONES", "symbols", "warning", "📵"),
+ EmojiItem("OPHIUCHUS", "symbols", "zodiac", "⛎"),
+ EmojiItem("SCORPIUS", "symbols", "zodiac", "♏"),
+ EmojiItem("LIBRA", "symbols", "zodiac", "♎"),
+ EmojiItem("VIRGO", "symbols", "zodiac", "♍"),
+ EmojiItem("LEO", "symbols", "zodiac", "♌"),
+ EmojiItem("CANCER", "symbols", "zodiac", "♋"),
+ EmojiItem("GEMINI", "symbols", "zodiac", "♊"),
+ EmojiItem("PISCES", "symbols", "zodiac", "♓"),
+ EmojiItem("AQUARIUS", "symbols", "zodiac", "♒"),
+ EmojiItem("CAPRICORN", "symbols", "zodiac", "♑"),
+ EmojiItem("SAGITTARIUS", "symbols", "zodiac", "♐"),
+ EmojiItem("TAURUS", "symbols", "zodiac", "♉"),
+ EmojiItem("ARIES", "symbols", "zodiac", "♈"),
+ EmojiItem("LUGGAGE", "travel-places", "hotel", "🧳"),
+ EmojiItem("BELLHOP BELL", "travel-places", "hotel", "🛎"),
+ EmojiItem("WOOD", "travel-places", "place-building", "🪵"),
+ EmojiItem("ROCK", "travel-places", "place-building", "🪨"),
+ EmojiItem("BRICK", "travel-places", "place-building", "🧱"),
+ EmojiItem("HUT", "travel-places", "place-building", "🛖"),
+ EmojiItem("STATUE OF LIBERTY", "travel-places", "place-building", "🗽"),
+ EmojiItem("TOKYO TOWER", "travel-places", "place-building", "🗼"),
+ EmojiItem("WEDDING", "travel-places", "place-building", "💒"),
+ EmojiItem("EUROPEAN CASTLE", "travel-places", "place-building", "🏰"),
+ EmojiItem("JAPANESE CASTLE", "travel-places", "place-building", "🏯"),
+ EmojiItem("FACTORY", "travel-places", "place-building", "🏭"),
+ EmojiItem("DEPARTMENT STORE", "travel-places", "place-building", "🏬"),
+ EmojiItem("SCHOOL", "travel-places", "place-building", "🏫"),
+ EmojiItem("CONVENIENCE STORE", "travel-places", "place-building", "🏪"),
+ EmojiItem("LOVE HOTEL", "travel-places", "place-building", "🏩"),
+ EmojiItem("HOTEL", "travel-places", "place-building", "🏨"),
+ EmojiItem("BANK", "travel-places", "place-building", "🏦"),
+ EmojiItem("HOSPITAL", "travel-places", "place-building", "🏥"),
+ EmojiItem(
+ "EUROPEAN POST OFFICE", "travel-places", "place-building", "🏤"
+ ),
+ EmojiItem(
+ "JAPANESE POST OFFICE", "travel-places", "place-building", "🏣"
+ ),
+ EmojiItem("OFFICE BUILDING", "travel-places", "place-building", "🏢"),
+ EmojiItem("HOUSE WITH GARDEN", "travel-places", "place-building", "🏡"),
+ EmojiItem("HOUSE BUILDING", "travel-places", "place-building", "🏠"),
+ EmojiItem("STADIUM", "travel-places", "place-building", "🏟"),
+ EmojiItem(
+ "CLASSICAL BUILDING", "travel-places", "place-building", "🏛"
+ ),
+ EmojiItem(
+ "DERELICT HOUSE BUILDING", "travel-places", "place-building", "🏚"
+ ),
+ EmojiItem("HOUSE BUILDINGS", "travel-places", "place-building", "🏘"),
+ EmojiItem(
+ "BUILDING CONSTRUCTION", "travel-places", "place-building", "🏗"
+ ),
+ EmojiItem("MOUNTAIN", "travel-places", "place-geographic", "⛰"),
+ EmojiItem("MOUNT FUJI", "travel-places", "place-geographic", "🗻"),
+ EmojiItem("NATIONAL PARK", "travel-places", "place-geographic", "🏞"),
+ EmojiItem("DESERT ISLAND", "travel-places", "place-geographic", "🏝"),
+ EmojiItem("DESERT", "travel-places", "place-geographic", "🏜"),
+ EmojiItem(
+ "BEACH WITH UMBRELLA", "travel-places", "place-geographic", "🏖"
+ ),
+ EmojiItem("CAMPING", "travel-places", "place-geographic", "🏕"),
+ EmojiItem(
+ "SNOW CAPPED MOUNTAIN", "travel-places", "place-geographic", "🏔"
+ ),
+ EmojiItem("VOLCANO", "travel-places", "place-geographic", "🌋"),
+ EmojiItem("COMPASS", "travel-places", "place-map", "🧭"),
+ EmojiItem("SILHOUETTE OF JAPAN", "travel-places", "place-map", "🗾"),
+ EmojiItem("WORLD MAP", "travel-places", "place-map", "🗺"),
+ EmojiItem("GLOBE WITH MERIDIANS", "travel-places", "place-map", "🌐"),
+ EmojiItem(
+ "EARTH GLOBE ASIA-AUSTRALIA", "travel-places", "place-map", "🌏"
+ ),
+ EmojiItem("EARTH GLOBE AMERICAS", "travel-places", "place-map", "🌎"),
+ EmojiItem(
+ "EARTH GLOBE EUROPE-AFRICA", "travel-places", "place-map", "🌍"
+ ),
+ EmojiItem("TENT", "travel-places", "place-other", "⛺"),
+ EmojiItem("FOUNTAIN", "travel-places", "place-other", "⛲"),
+ EmojiItem("HOT SPRINGS", "travel-places", "place-other", "♨"),
+ EmojiItem("BARBER POLE", "travel-places", "place-other", "💈"),
+ EmojiItem("CITYSCAPE", "travel-places", "place-other", "🏙"),
+ EmojiItem("CIRCUS TENT", "travel-places", "place-other", "🎪"),
+ EmojiItem("ROLLER COASTER", "travel-places", "place-other", "🎢"),
+ EmojiItem("FERRIS WHEEL", "travel-places", "place-other", "🎡"),
+ EmojiItem("CAROUSEL HORSE", "travel-places", "place-other", "🎠"),
+ EmojiItem("BRIDGE AT NIGHT", "travel-places", "place-other", "🌉"),
+ EmojiItem(
+ "SUNSET OVER BUILDINGS", "travel-places", "place-other", "🌇"
+ ),
+ EmojiItem("CITYSCAPE AT DUSK", "travel-places", "place-other", "🌆"),
+ EmojiItem("SUNRISE", "travel-places", "place-other", "🌅"),
+ EmojiItem(
+ "SUNRISE OVER MOUNTAINS", "travel-places", "place-other", "🌄"
+ ),
+ EmojiItem("NIGHT WITH STARS", "travel-places", "place-other", "🌃"),
+ EmojiItem("FOGGY", "travel-places", "place-other", "🌁"),
+ EmojiItem("CHURCH", "travel-places", "place-religious", "⛪"),
+ EmojiItem("HINDU TEMPLE", "travel-places", "place-religious", "🛕"),
+ EmojiItem("SYNAGOGUE", "travel-places", "place-religious", "🕍"),
+ EmojiItem("MOSQUE", "travel-places", "place-religious", "🕌"),
+ EmojiItem("KAABA", "travel-places", "place-religious", "🕋"),
+ EmojiItem("WHITE MEDIUM STAR", "travel-places", "sky & weather", "⭐"),
+ EmojiItem("UMBRELLA ON GROUND", "travel-places", "sky & weather", "⛱"),
+ EmojiItem(
+ "THUNDER CLOUD AND RAIN", "travel-places", "sky & weather", "⛈"
+ ),
+ EmojiItem("SUN BEHIND CLOUD", "travel-places", "sky & weather", "⛅"),
+ EmojiItem(
+ "SNOWMAN WITHOUT SNOW", "travel-places", "sky & weather", "⛄"
+ ),
+ EmojiItem("HIGH VOLTAGE SIGN", "travel-places", "sky & weather", "⚡"),
+ EmojiItem("SNOWFLAKE", "travel-places", "sky & weather", "❄"),
+ EmojiItem(
+ "UMBRELLA WITH RAIN DROPS", "travel-places", "sky & weather", "☔"
+ ),
+ EmojiItem("COMET", "travel-places", "sky & weather", "☄"),
+ EmojiItem("SNOWMAN", "travel-places", "sky & weather", "☃"),
+ EmojiItem("UMBRELLA", "travel-places", "sky & weather", "☂"),
+ EmojiItem("CLOUD", "travel-places", "sky & weather", "☁"),
+ EmojiItem(
+ "BLACK SUN WITH RAYS", "travel-places", "sky & weather", "☀"
+ ),
+ EmojiItem("RINGED PLANET", "travel-places", "sky & weather", "🪐"),
+ EmojiItem("FIRE", "travel-places", "sky & weather", "🔥"),
+ EmojiItem("DROPLET", "travel-places", "sky & weather", "💧"),
+ EmojiItem("WIND BLOWING FACE", "travel-places", "sky & weather", "🌬"),
+ EmojiItem("FOG", "travel-places", "sky & weather", "🌫"),
+ EmojiItem("CLOUD WITH TORNADO", "travel-places", "sky & weather", "🌪"),
+ EmojiItem(
+ "CLOUD WITH LIGHTNING", "travel-places", "sky & weather", "🌩"
+ ),
+ EmojiItem("CLOUD WITH SNOW", "travel-places", "sky & weather", "🌨"),
+ EmojiItem("CLOUD WITH RAIN", "travel-places", "sky & weather", "🌧"),
+ EmojiItem(
+ "WHITE SUN BEHIND CLOUD WITH RAIN",
+ "travel-places",
+ "sky & weather",
+ "🌦",
+ ),
+ EmojiItem(
+ "WHITE SUN BEHIND CLOUD", "travel-places", "sky & weather", "🌥"
+ ),
+ EmojiItem(
+ "WHITE SUN WITH SMALL CLOUD", "travel-places", "sky & weather", "🌤"
+ ),
+ EmojiItem("THERMOMETER", "travel-places", "sky & weather", "🌡"),
+ EmojiItem("SHOOTING STAR", "travel-places", "sky & weather", "🌠"),
+ EmojiItem("GLOWING STAR", "travel-places", "sky & weather", "🌟"),
+ EmojiItem("SUN WITH FACE", "travel-places", "sky & weather", "🌞"),
+ EmojiItem(
+ "FULL MOON WITH FACE", "travel-places", "sky & weather", "🌝"
+ ),
+ EmojiItem(
+ "LAST QUARTER MOON WITH FACE",
+ "travel-places",
+ "sky & weather",
+ "🌜",
+ ),
+ EmojiItem(
+ "FIRST QUARTER MOON WITH FACE",
+ "travel-places",
+ "sky & weather",
+ "🌛",
+ ),
+ EmojiItem("NEW MOON WITH FACE", "travel-places", "sky & weather", "🌚"),
+ EmojiItem("CRESCENT MOON", "travel-places", "sky & weather", "🌙"),
+ EmojiItem(
+ "WANING CRESCENT MOON SYMBOL",
+ "travel-places",
+ "sky & weather",
+ "🌘",
+ ),
+ EmojiItem(
+ "LAST QUARTER MOON SYMBOL", "travel-places", "sky & weather", "🌗"
+ ),
+ EmojiItem(
+ "WANING GIBBOUS MOON SYMBOL", "travel-places", "sky & weather", "🌖"
+ ),
+ EmojiItem("FULL MOON SYMBOL", "travel-places", "sky & weather", "🌕"),
+ EmojiItem(
+ "WAXING GIBBOUS MOON SYMBOL", "travel-places", "sky & weather", "🌔"
+ ),
+ EmojiItem(
+ "FIRST QUARTER MOON SYMBOL", "travel-places", "sky & weather", "🌓"
+ ),
+ EmojiItem(
+ "WAXING CRESCENT MOON SYMBOL",
+ "travel-places",
+ "sky & weather",
+ "🌒",
+ ),
+ EmojiItem("NEW MOON SYMBOL", "travel-places", "sky & weather", "🌑"),
+ EmojiItem("MILKY WAY", "travel-places", "sky & weather", "🌌"),
+ EmojiItem("WATER WAVE", "travel-places", "sky & weather", "🌊"),
+ EmojiItem("RAINBOW", "travel-places", "sky & weather", "🌈"),
+ EmojiItem("CLOSED UMBRELLA", "travel-places", "sky & weather", "🌂"),
+ EmojiItem("CYCLONE", "travel-places", "sky & weather", "🌀"),
+ EmojiItem("HOURGLASS WITH FLOWING SAND", "travel-places", "time", "⏳"),
+ EmojiItem("TIMER CLOCK", "travel-places", "time", "⏲"),
+ EmojiItem("STOPWATCH", "travel-places", "time", "⏱"),
+ EmojiItem("ALARM CLOCK", "travel-places", "time", "⏰"),
+ EmojiItem("HOURGLASS", "travel-places", "time", "⌛"),
+ EmojiItem("WATCH", "travel-places", "time", "⌚"),
+ EmojiItem("MANTELPIECE CLOCK", "travel-places", "time", "🕰"),
+ EmojiItem("CLOCK FACE TWELVE-THIRTY", "travel-places", "time", "🕧"),
+ EmojiItem("CLOCK FACE ELEVEN-THIRTY", "travel-places", "time", "🕦"),
+ EmojiItem("CLOCK FACE TEN-THIRTY", "travel-places", "time", "🕥"),
+ EmojiItem("CLOCK FACE NINE-THIRTY", "travel-places", "time", "🕤"),
+ EmojiItem("CLOCK FACE EIGHT-THIRTY", "travel-places", "time", "🕣"),
+ EmojiItem("CLOCK FACE SEVEN-THIRTY", "travel-places", "time", "🕢"),
+ EmojiItem("CLOCK FACE SIX-THIRTY", "travel-places", "time", "🕡"),
+ EmojiItem("CLOCK FACE FIVE-THIRTY", "travel-places", "time", "🕠"),
+ EmojiItem("CLOCK FACE FOUR-THIRTY", "travel-places", "time", "🕟"),
+ EmojiItem("CLOCK FACE THREE-THIRTY", "travel-places", "time", "🕞"),
+ EmojiItem("CLOCK FACE TWO-THIRTY", "travel-places", "time", "🕝"),
+ EmojiItem("CLOCK FACE ONE-THIRTY", "travel-places", "time", "🕜"),
+ EmojiItem("CLOCK FACE TWELVE OCLOCK", "travel-places", "time", "🕛"),
+ EmojiItem("CLOCK FACE ELEVEN OCLOCK", "travel-places", "time", "🕚"),
+ EmojiItem("CLOCK FACE TEN OCLOCK", "travel-places", "time", "🕙"),
+ EmojiItem("CLOCK FACE NINE OCLOCK", "travel-places", "time", "🕘"),
+ EmojiItem("CLOCK FACE EIGHT OCLOCK", "travel-places", "time", "🕗"),
+ EmojiItem("CLOCK FACE SEVEN OCLOCK", "travel-places", "time", "🕖"),
+ EmojiItem("CLOCK FACE SIX OCLOCK", "travel-places", "time", "🕕"),
+ EmojiItem("CLOCK FACE FIVE OCLOCK", "travel-places", "time", "🕔"),
+ EmojiItem("CLOCK FACE FOUR OCLOCK", "travel-places", "time", "🕓"),
+ EmojiItem("CLOCK FACE THREE OCLOCK", "travel-places", "time", "🕒"),
+ EmojiItem("CLOCK FACE TWO OCLOCK", "travel-places", "time", "🕑"),
+ EmojiItem("CLOCK FACE ONE OCLOCK", "travel-places", "time", "🕐"),
+ EmojiItem("AIRPLANE", "travel-places", "transport-air", "✈"),
+ EmojiItem("PARACHUTE", "travel-places", "transport-air", "🪂"),
+ EmojiItem("FLYING SAUCER", "travel-places", "transport-air", "🛸"),
+ EmojiItem("SATELLITE", "travel-places", "transport-air", "🛰"),
+ EmojiItem("AIRPLANE ARRIVING", "travel-places", "transport-air", "🛬"),
+ EmojiItem("AIRPLANE DEPARTURE", "travel-places", "transport-air", "🛫"),
+ EmojiItem("SMALL AIRPLANE", "travel-places", "transport-air", "🛩"),
+ EmojiItem("AERIAL TRAMWAY", "travel-places", "transport-air", "🚡"),
+ EmojiItem("MOUNTAIN CABLEWAY", "travel-places", "transport-air", "🚠"),
+ EmojiItem("SUSPENSION RAILWAY", "travel-places", "transport-air", "🚟"),
+ EmojiItem("HELICOPTER", "travel-places", "transport-air", "🚁"),
+ EmojiItem("ROCKET", "travel-places", "transport-air", "🚀"),
+ EmojiItem("SEAT", "travel-places", "transport-air", "💺"),
+ EmojiItem("FUEL PUMP", "travel-places", "transport-ground", "⛽"),
+ EmojiItem(
+ "MANUAL WHEELCHAIR", "travel-places", "transport-ground", "🦽"
+ ),
+ EmojiItem(
+ "MOTORIZED WHEELCHAIR", "travel-places", "transport-ground", "🦼"
+ ),
+ EmojiItem("ROLLER SKATE", "travel-places", "transport-ground", "🛼"),
+ EmojiItem("PICKUP TRUCK", "travel-places", "transport-ground", "🛻"),
+ EmojiItem("AUTO RICKSHAW", "travel-places", "transport-ground", "🛺"),
+ EmojiItem("SKATEBOARD", "travel-places", "transport-ground", "🛹"),
+ EmojiItem("MOTOR SCOOTER", "travel-places", "transport-ground", "🛵"),
+ EmojiItem("SCOOTER", "travel-places", "transport-ground", "🛴"),
+ EmojiItem("RAILWAY TRACK", "travel-places", "transport-ground", "🛤"),
+ EmojiItem("MOTORWAY", "travel-places", "transport-ground", "🛣"),
+ EmojiItem("OIL DRUM", "travel-places", "transport-ground", "🛢"),
+ EmojiItem("OCTAGONAL SIGN", "travel-places", "transport-ground", "🛑"),
+ EmojiItem("BICYCLE", "travel-places", "transport-ground", "🚲"),
+ EmojiItem(
+ "POLICE CARS REVOLVING LIGHT",
+ "travel-places",
+ "transport-ground",
+ "🚨",
+ ),
+ EmojiItem(
+ "CONSTRUCTION SIGN", "travel-places", "transport-ground", "🚧"
+ ),
+ EmojiItem(
+ "VERTICAL TRAFFIC LIGHT", "travel-places", "transport-ground", "🚦"
+ ),
+ EmojiItem(
+ "HORIZONTAL TRAFFIC LIGHT",
+ "travel-places",
+ "transport-ground",
+ "🚥",
+ ),
+ EmojiItem(
+ "MOUNTAIN RAILWAY", "travel-places", "transport-ground", "🚞"
+ ),
+ EmojiItem("MONORAIL", "travel-places", "transport-ground", "🚝"),
+ EmojiItem("TRACTOR", "travel-places", "transport-ground", "🚜"),
+ EmojiItem(
+ "ARTICULATED LORRY", "travel-places", "transport-ground", "🚛"
+ ),
+ EmojiItem("DELIVERY TRUCK", "travel-places", "transport-ground", "🚚"),
+ EmojiItem(
+ "RECREATIONAL VEHICLE", "travel-places", "transport-ground", "🚙"
+ ),
+ EmojiItem(
+ "ONCOMING AUTOMOBILE", "travel-places", "transport-ground", "🚘"
+ ),
+ EmojiItem("AUTOMOBILE", "travel-places", "transport-ground", "🚗"),
+ EmojiItem("ONCOMING TAXI", "travel-places", "transport-ground", "🚖"),
+ EmojiItem("TAXI", "travel-places", "transport-ground", "🚕"),
+ EmojiItem(
+ "ONCOMING POLICE CAR", "travel-places", "transport-ground", "🚔"
+ ),
+ EmojiItem("POLICE CAR", "travel-places", "transport-ground", "🚓"),
+ EmojiItem("FIRE ENGINE", "travel-places", "transport-ground", "🚒"),
+ EmojiItem("AMBULANCE", "travel-places", "transport-ground", "🚑"),
+ EmojiItem("MINIBUS", "travel-places", "transport-ground", "🚐"),
+ EmojiItem("BUS STOP", "travel-places", "transport-ground", "🚏"),
+ EmojiItem("TROLLEYBUS", "travel-places", "transport-ground", "🚎"),
+ EmojiItem("ONCOMING BUS", "travel-places", "transport-ground", "🚍"),
+ EmojiItem("BUS", "travel-places", "transport-ground", "🚌"),
+ EmojiItem("TRAM CAR", "travel-places", "transport-ground", "🚋"),
+ EmojiItem("TRAM", "travel-places", "transport-ground", "🚊"),
+ EmojiItem("STATION", "travel-places", "transport-ground", "🚉"),
+ EmojiItem("LIGHT RAIL", "travel-places", "transport-ground", "🚈"),
+ EmojiItem("METRO", "travel-places", "transport-ground", "🚇"),
+ EmojiItem("TRAIN", "travel-places", "transport-ground", "🚆"),
+ EmojiItem(
+ "HIGH-SPEED TRAIN WITH BULLET NOSE",
+ "travel-places",
+ "transport-ground",
+ "🚅",
+ ),
+ EmojiItem(
+ "HIGH-SPEED TRAIN", "travel-places", "transport-ground", "🚄"
+ ),
+ EmojiItem("RAILWAY CAR", "travel-places", "transport-ground", "🚃"),
+ EmojiItem(
+ "STEAM LOCOMOTIVE", "travel-places", "transport-ground", "🚂"
+ ),
+ EmojiItem("RACING CAR", "travel-places", "transport-ground", "🏎"),
+ EmojiItem(
+ "RACING MOTORCYCLE", "travel-places", "transport-ground", "🏍"
+ ),
+ EmojiItem("SAILBOAT", "travel-places", "transport-water", "⛵"),
+ EmojiItem("FERRY", "travel-places", "transport-water", "⛴"),
+ EmojiItem("ANCHOR", "travel-places", "transport-water", "⚓"),
+ EmojiItem("CANOE", "travel-places", "transport-water", "🛶"),
+ EmojiItem("PASSENGER SHIP", "travel-places", "transport-water", "🛳"),
+ EmojiItem("MOTOR BOAT", "travel-places", "transport-water", "🛥"),
+ EmojiItem("SPEEDBOAT", "travel-places", "transport-water", "🚤"),
+ EmojiItem("SHIP", "travel-places", "transport-water", "🚢"),
+ EmojiItem("WEARY CAT FACE", "smiley-emotion", "cat-face", "🙀"),
+ EmojiItem("CRYING CAT FACE", "smiley-emotion", "cat-face", "😿"),
+ EmojiItem("POUTING CAT FACE", "smiley-emotion", "cat-face", "😾"),
+ EmojiItem(
+ "KISSING CAT FACE WITH CLOSED EYES",
+ "smiley-emotion",
+ "cat-face",
+ "😽",
+ ),
+ EmojiItem(
+ "CAT FACE WITH WRY SMILE", "smiley-emotion", "cat-face", "😼"
+ ),
+ EmojiItem(
+ "SMILING CAT FACE WITH HEART-SHAPED EYES",
+ "smiley-emotion",
+ "cat-face",
+ "😻",
+ ),
+ EmojiItem(
+ "SMILING CAT FACE WITH OPEN MOUTH",
+ "smiley-emotion",
+ "cat-face",
+ "😺",
+ ),
+ EmojiItem(
+ "CAT FACE WITH TEARS OF JOY", "smiley-emotion", "cat-face", "😹"
+ ),
+ EmojiItem(
+ "GRINNING CAT FACE WITH SMILING EYES",
+ "smiley-emotion",
+ "cat-face",
+ "😸",
+ ),
+ EmojiItem("HEAVY BLACK HEART", "smiley-emotion", "emotion", "❤"),
+ EmojiItem(
+ "HEAVY HEART EXCLAMATION MARK ORNAMENT",
+ "smiley-emotion",
+ "emotion",
+ "❣",
+ ),
+ EmojiItem("ORANGE HEART", "smiley-emotion", "emotion", "🧡"),
+ EmojiItem("BROWN HEART", "smiley-emotion", "emotion", "🤎"),
+ EmojiItem("WHITE HEART", "smiley-emotion", "emotion", "🤍"),
+ EmojiItem("RIGHT ANGER BUBBLE", "smiley-emotion", "emotion", "🗯"),
+ EmojiItem("LEFT SPEECH BUBBLE", "smiley-emotion", "emotion", "🗨"),
+ EmojiItem("BLACK HEART", "smiley-emotion", "emotion", "🖤"),
+ EmojiItem("HOLE", "smiley-emotion", "emotion", "🕳"),
+ EmojiItem("HUNDRED POINTS SYMBOL", "smiley-emotion", "emotion", "💯"),
+ EmojiItem("THOUGHT BALLOON", "smiley-emotion", "emotion", "💭"),
+ EmojiItem("SPEECH BALLOON", "smiley-emotion", "emotion", "💬"),
+ EmojiItem("DIZZY SYMBOL", "smiley-emotion", "emotion", "💫"),
+ EmojiItem("DASH SYMBOL", "smiley-emotion", "emotion", "💨"),
+ EmojiItem("SPLASHING SWEAT SYMBOL", "smiley-emotion", "emotion", "💦"),
+ EmojiItem("COLLISION SYMBOL", "smiley-emotion", "emotion", "💥"),
+ EmojiItem("SLEEPING SYMBOL", "smiley-emotion", "emotion", "💤"),
+ EmojiItem("BOMB", "smiley-emotion", "emotion", "💣"),
+ EmojiItem("ANGER SYMBOL", "smiley-emotion", "emotion", "💢"),
+ EmojiItem("HEART DECORATION", "smiley-emotion", "emotion", "💟"),
+ EmojiItem("REVOLVING HEARTS", "smiley-emotion", "emotion", "💞"),
+ EmojiItem("HEART WITH RIBBON", "smiley-emotion", "emotion", "💝"),
+ EmojiItem("PURPLE HEART", "smiley-emotion", "emotion", "💜"),
+ EmojiItem("YELLOW HEART", "smiley-emotion", "emotion", "💛"),
+ EmojiItem("GREEN HEART", "smiley-emotion", "emotion", "💚"),
+ EmojiItem("BLUE HEART", "smiley-emotion", "emotion", "💙"),
+ EmojiItem("HEART WITH ARROW", "smiley-emotion", "emotion", "💘"),
+ EmojiItem("GROWING HEART", "smiley-emotion", "emotion", "💗"),
+ EmojiItem("SPARKLING HEART", "smiley-emotion", "emotion", "💖"),
+ EmojiItem("TWO HEARTS", "smiley-emotion", "emotion", "💕"),
+ EmojiItem("BROKEN HEART", "smiley-emotion", "emotion", "💔"),
+ EmojiItem("BEATING HEART", "smiley-emotion", "emotion", "💓"),
+ EmojiItem("LOVE LETTER", "smiley-emotion", "emotion", "💌"),
+ EmojiItem("KISS MARK", "smiley-emotion", "emotion", "💋"),
+ EmojiItem(
+ "WHITE SMILING FACE", "smiley-emotion", "face-affection", "☺"
+ ),
+ EmojiItem(
+ "SMILING FACE WITH TEAR", "smiley-emotion", "face-affection", "🥲"
+ ),
+ EmojiItem(
+ "SMILING FACE WITH SMILING EYES AND THREE HEARTS",
+ "smiley-emotion",
+ "face-affection",
+ "🥰",
+ ),
+ EmojiItem(
+ "GRINNING FACE WITH STAR EYES",
+ "smiley-emotion",
+ "face-affection",
+ "🤩",
+ ),
+ EmojiItem(
+ "KISSING FACE WITH CLOSED EYES",
+ "smiley-emotion",
+ "face-affection",
+ "😚",
+ ),
+ EmojiItem(
+ "KISSING FACE WITH SMILING EYES",
+ "smiley-emotion",
+ "face-affection",
+ "😙",
+ ),
+ EmojiItem(
+ "FACE THROWING A KISS", "smiley-emotion", "face-affection", "😘"
+ ),
+ EmojiItem("KISSING FACE", "smiley-emotion", "face-affection", "😗"),
+ EmojiItem(
+ "SMILING FACE WITH HEART-SHAPED EYES",
+ "smiley-emotion",
+ "face-affection",
+ "😍",
+ ),
+ EmojiItem(
+ "WHITE FROWNING FACE", "smiley-emotion", "face-concerned", "☹"
+ ),
+ EmojiItem(
+ "FACE WITH PLEADING EYES", "smiley-emotion", "face-concerned", "🥺"
+ ),
+ EmojiItem("YAWNING FACE", "smiley-emotion", "face-concerned", "🥱"),
+ EmojiItem(
+ "SLIGHTLY FROWNING FACE", "smiley-emotion", "face-concerned", "🙁"
+ ),
+ EmojiItem("FLUSHED FACE", "smiley-emotion", "face-concerned", "😳"),
+ EmojiItem("ASTONISHED FACE", "smiley-emotion", "face-concerned", "😲"),
+ EmojiItem(
+ "FACE SCREAMING IN FEAR", "smiley-emotion", "face-concerned", "😱"
+ ),
+ EmojiItem(
+ "FACE WITH OPEN MOUTH AND COLD SWEAT",
+ "smiley-emotion",
+ "face-concerned",
+ "😰",
+ ),
+ EmojiItem("HUSHED FACE", "smiley-emotion", "face-concerned", "😯"),
+ EmojiItem(
+ "FACE WITH OPEN MOUTH", "smiley-emotion", "face-concerned", "😮"
+ ),
+ EmojiItem(
+ "LOUDLY CRYING FACE", "smiley-emotion", "face-concerned", "😭"
+ ),
+ EmojiItem("TIRED FACE", "smiley-emotion", "face-concerned", "😫"),
+ EmojiItem("WEARY FACE", "smiley-emotion", "face-concerned", "😩"),
+ EmojiItem("FEARFUL FACE", "smiley-emotion", "face-concerned", "😨"),
+ EmojiItem("ANGUISHED FACE", "smiley-emotion", "face-concerned", "😧"),
+ EmojiItem(
+ "FROWNING FACE WITH OPEN MOUTH",
+ "smiley-emotion",
+ "face-concerned",
+ "😦",
+ ),
+ EmojiItem(
+ "DISAPPOINTED BUT RELIEVED FACE",
+ "smiley-emotion",
+ "face-concerned",
+ "😥",
+ ),
+ EmojiItem("PERSEVERING FACE", "smiley-emotion", "face-concerned", "😣"),
+ EmojiItem("CRYING FACE", "smiley-emotion", "face-concerned", "😢"),
+ EmojiItem("WORRIED FACE", "smiley-emotion", "face-concerned", "😟"),
+ EmojiItem(
+ "DISAPPOINTED FACE", "smiley-emotion", "face-concerned", "😞"
+ ),
+ EmojiItem("CONFOUNDED FACE", "smiley-emotion", "face-concerned", "😖"),
+ EmojiItem("CONFUSED FACE", "smiley-emotion", "face-concerned", "😕"),
+ EmojiItem(
+ "FACE WITH COLD SWEAT", "smiley-emotion", "face-concerned", "😓"
+ ),
+ EmojiItem("CLOWN FACE", "smiley-emotion", "face-costume", "🤡"),
+ EmojiItem("ROBOT FACE", "smiley-emotion", "face-costume", "🤖"),
+ EmojiItem("PILE OF POO", "smiley-emotion", "face-costume", "💩"),
+ EmojiItem("ALIEN MONSTER", "smiley-emotion", "face-costume", "👾"),
+ EmojiItem(
+ "EXTRATERRESTRIAL ALIEN", "smiley-emotion", "face-costume", "👽"
+ ),
+ EmojiItem("GHOST", "smiley-emotion", "face-costume", "👻"),
+ EmojiItem("JAPANESE GOBLIN", "smiley-emotion", "face-costume", "👺"),
+ EmojiItem("JAPANESE OGRE", "smiley-emotion", "face-costume", "👹"),
+ EmojiItem("FACE WITH MONOCLE", "smiley-emotion", "face-glasses", "🧐"),
+ EmojiItem("NERD FACE", "smiley-emotion", "face-glasses", "🤓"),
+ EmojiItem(
+ "SMILING FACE WITH SUNGLASSES",
+ "smiley-emotion",
+ "face-glasses",
+ "😎",
+ ),
+ EmojiItem(
+ "SMILING FACE WITH SMILING EYES AND HAND COVERING MOUTH",
+ "smiley-emotion",
+ "face-hand",
+ "🤭",
+ ),
+ EmojiItem(
+ "FACE WITH FINGER COVERING CLOSED LIPS",
+ "smiley-emotion",
+ "face-hand",
+ "🤫",
+ ),
+ EmojiItem("HUGGING FACE", "smiley-emotion", "face-hand", "🤗"),
+ EmojiItem("THINKING FACE", "smiley-emotion", "face-hand", "🤔"),
+ EmojiItem("DISGUISED FACE", "smiley-emotion", "face-hat", "🥸"),
+ EmojiItem(
+ "FACE WITH PARTY HORN AND PARTY HAT",
+ "smiley-emotion",
+ "face-hat",
+ "🥳",
+ ),
+ EmojiItem("FACE WITH COWBOY HAT", "smiley-emotion", "face-hat", "🤠"),
+ EmojiItem(
+ "SKULL AND CROSSBONES", "smiley-emotion", "face-negative", "☠"
+ ),
+ EmojiItem(
+ "SERIOUS FACE WITH SYMBOLS COVERING MOUTH",
+ "smiley-emotion",
+ "face-negative",
+ "🤬",
+ ),
+ EmojiItem(
+ "FACE WITH LOOK OF TRIUMPH", "smiley-emotion", "face-negative", "😤"
+ ),
+ EmojiItem("POUTING FACE", "smiley-emotion", "face-negative", "😡"),
+ EmojiItem("ANGRY FACE", "smiley-emotion", "face-negative", "😠"),
+ EmojiItem(
+ "SMILING FACE WITH HORNS", "smiley-emotion", "face-negative", "😈"
+ ),
+ EmojiItem("SKULL", "smiley-emotion", "face-negative", "💀"),
+ EmojiItem("IMP", "smiley-emotion", "face-negative", "👿"),
+ EmojiItem(
+ "FACE WITH ONE EYEBROW RAISED",
+ "smiley-emotion",
+ "face-neutral-skeptical",
+ "🤨",
+ ),
+ EmojiItem(
+ "LYING FACE", "smiley-emotion", "face-neutral-skeptical", "🤥"
+ ),
+ EmojiItem(
+ "ZIPPER-MOUTH FACE",
+ "smiley-emotion",
+ "face-neutral-skeptical",
+ "🤐",
+ ),
+ EmojiItem(
+ "FACE WITH ROLLING EYES",
+ "smiley-emotion",
+ "face-neutral-skeptical",
+ "🙄",
+ ),
+ EmojiItem(
+ "FACE WITHOUT MOUTH",
+ "smiley-emotion",
+ "face-neutral-skeptical",
+ "😶",
+ ),
+ EmojiItem(
+ "GRIMACING FACE", "smiley-emotion", "face-neutral-skeptical", "😬"
+ ),
+ EmojiItem(
+ "UNAMUSED FACE", "smiley-emotion", "face-neutral-skeptical", "😒"
+ ),
+ EmojiItem(
+ "EXPRESSIONLESS FACE",
+ "smiley-emotion",
+ "face-neutral-skeptical",
+ "😑",
+ ),
+ EmojiItem(
+ "NEUTRAL FACE", "smiley-emotion", "face-neutral-skeptical", "😐"
+ ),
+ EmojiItem(
+ "SMIRKING FACE", "smiley-emotion", "face-neutral-skeptical", "😏"
+ ),
+ EmojiItem("DROOLING FACE", "smiley-emotion", "face-sleepy", "🤤"),
+ EmojiItem("SLEEPING FACE", "smiley-emotion", "face-sleepy", "😴"),
+ EmojiItem("SLEEPY FACE", "smiley-emotion", "face-sleepy", "😪"),
+ EmojiItem("PENSIVE FACE", "smiley-emotion", "face-sleepy", "😔"),
+ EmojiItem("RELIEVED FACE", "smiley-emotion", "face-sleepy", "😌"),
+ EmojiItem(
+ "ROLLING ON THE FLOOR LAUGHING",
+ "smiley-emotion",
+ "face-smiling",
+ "🤣",
+ ),
+ EmojiItem("UPSIDE-DOWN FACE", "smiley-emotion", "face-smiling", "🙃"),
+ EmojiItem(
+ "SLIGHTLY SMILING FACE", "smiley-emotion", "face-smiling", "🙂"
+ ),
+ EmojiItem(
+ "SMILING FACE WITH SMILING EYES",
+ "smiley-emotion",
+ "face-smiling",
+ "😊",
+ ),
+ EmojiItem("WINKING FACE", "smiley-emotion", "face-smiling", "😉"),
+ EmojiItem(
+ "SMILING FACE WITH HALO", "smiley-emotion", "face-smiling", "😇"
+ ),
+ EmojiItem(
+ "SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES",
+ "smiley-emotion",
+ "face-smiling",
+ "😆",
+ ),
+ EmojiItem(
+ "SMILING FACE WITH OPEN MOUTH AND COLD SWEAT",
+ "smiley-emotion",
+ "face-smiling",
+ "😅",
+ ),
+ EmojiItem(
+ "SMILING FACE WITH OPEN MOUTH AND SMILING EYES",
+ "smiley-emotion",
+ "face-smiling",
+ "😄",
+ ),
+ EmojiItem(
+ "SMILING FACE WITH OPEN MOUTH",
+ "smiley-emotion",
+ "face-smiling",
+ "😃",
+ ),
+ EmojiItem(
+ "FACE WITH TEARS OF JOY", "smiley-emotion", "face-smiling", "😂"
+ ),
+ EmojiItem(
+ "GRINNING FACE WITH SMILING EYES",
+ "smiley-emotion",
+ "face-smiling",
+ "😁",
+ ),
+ EmojiItem("GRINNING FACE", "smiley-emotion", "face-smiling", "😀"),
+ EmojiItem(
+ "GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE",
+ "smiley-emotion",
+ "face-tongue",
+ "🤪",
+ ),
+ EmojiItem("MONEY-MOUTH FACE", "smiley-emotion", "face-tongue", "🤑"),
+ EmojiItem(
+ "FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES",
+ "smiley-emotion",
+ "face-tongue",
+ "😝",
+ ),
+ EmojiItem(
+ "FACE WITH STUCK-OUT TONGUE AND WINKING EYE",
+ "smiley-emotion",
+ "face-tongue",
+ "😜",
+ ),
+ EmojiItem(
+ "FACE WITH STUCK-OUT TONGUE", "smiley-emotion", "face-tongue", "😛"
+ ),
+ EmojiItem(
+ "FACE SAVOURING DELICIOUS FOOD",
+ "smiley-emotion",
+ "face-tongue",
+ "😋",
+ ),
+ EmojiItem("FREEZING FACE", "smiley-emotion", "face-unwell", "🥶"),
+ EmojiItem("OVERHEATED FACE", "smiley-emotion", "face-unwell", "🥵"),
+ EmojiItem(
+ "FACE WITH UNEVEN EYES AND WAVY MOUTH",
+ "smiley-emotion",
+ "face-unwell",
+ "🥴",
+ ),
+ EmojiItem(
+ "SHOCKED FACE WITH EXPLODING HEAD",
+ "smiley-emotion",
+ "face-unwell",
+ "🤯",
+ ),
+ EmojiItem(
+ "FACE WITH OPEN MOUTH VOMITING",
+ "smiley-emotion",
+ "face-unwell",
+ "🤮",
+ ),
+ EmojiItem("SNEEZING FACE", "smiley-emotion", "face-unwell", "🤧"),
+ EmojiItem("NAUSEATED FACE", "smiley-emotion", "face-unwell", "🤢"),
+ EmojiItem(
+ "FACE WITH HEAD-BANDAGE", "smiley-emotion", "face-unwell", "🤕"
+ ),
+ EmojiItem(
+ "FACE WITH THERMOMETER", "smiley-emotion", "face-unwell", "🤒"
+ ),
+ EmojiItem(
+ "FACE WITH MEDICAL MASK", "smiley-emotion", "face-unwell", "😷"
+ ),
+ EmojiItem("DIZZY FACE", "smiley-emotion", "face-unwell", "😵"),
+ EmojiItem(
+ "SPEAK-NO-EVIL MONKEY", "smiley-emotion", "monkey-face", "🙊"
+ ),
+ EmojiItem("HEAR-NO-EVIL MONKEY", "smiley-emotion", "monkey-face", "🙉"),
+ EmojiItem("SEE-NO-EVIL MONKEY", "smiley-emotion", "monkey-face", "🙈"),
+ ]
+
+ @staticmethod
+ def categories():
+ """Get a set of categories.
+
+ Returns:
+
+ set:
+ Emoji categories.
+
+ Examples:
+
+ ```python
+ >>> Emoji.categories()
+ {'component', 'animal-nature', 'objects', 'symbols', 'flags',
+ 'people-body', 'smiley-emotion', 'activities', 'food-drink',
+ 'travel-places'}
+ ```
+ """
+ cat = set()
+ for e in Emoji._ITEMS:
+ cat.add(e.category)
+ return cat
+
+ @staticmethod
+ def subcategories(category: str = None):
+ """Get a set of all subcategories or for a specific category.
+
+ Parameters:
+
+ category (str):
+ The name of the category to query.
+
+ Returns:
+
+ set:
+ All subcategories or categories for a specific category.
+
+ Examples:
+
+ ```python
+ >>> Emoji.subcategories('activities')
+ {'award-medal', 'arts & crafts', 'event', 'game', 'sport'}
+ ```
+ """
+ subcat = set()
+ for e in Emoji._ITEMS:
+ if not category:
+ subcat.add(e.subcategory)
+ else:
+ if e.category == category:
+ subcat.add(e.subcategory)
+ return subcat
+
+ @staticmethod
+ def get(name: str):
+ """Lookup an emoji by name.
+
+ Parameters:
+
+ name (str):
+ The name of the emoji to lookup.
+
+ Returns:
+
+ Union[EmojiItem, None]:
+ The selected emoji or None if not found.
+
+ Examples:
+
+ ```python
+ >>> Emoji.get('winking face')
+ 😉
+
+ >>> face = Emoji.get('winking face')
+ >>> face.name
+ WINKING FACE
+
+ >>> face.category
+ smiley-emotion
+
+ >>> face.subcategory
+ face.smiling
+
+ >>> face.char
+ 😉
+ ```
+ """
+ for e in Emoji._ITEMS:
+ if e.name.lower() == name.lower():
+ return e
+
+
+if __name__ == "__main__":
+ print(Emoji.get("winking face"))
+ print(Emoji.categories())
+ print(Emoji.subcategories())
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/__init__.py b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/__init__.py
new file mode 100644
index 0000000..b70c281
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/__init__.py
@@ -0,0 +1,18 @@
+"""
+ A partial wrapper on the tcl/tk msgcat (Tcl message catalog)
+
+ The MessageCatalog provides a set of functions that can be used to
+ manage multi-lingual user interfaces. Text strings are defined in a
+ “message catalog” which is independent from the application, and
+ which can be edited or localized without modifying the application
+ source code. New languages or locales may be provided by adding a
+ new file to the message catalog.
+
+ https://www.tcl.tk/man/tcl/TclCmd/msgcat.html
+"""
+from ttkbootstrap.localization.msgs import initialize_localities
+from ttkbootstrap.localization.msgcat import MessageCatalog
+
+
+
+
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/__pycache__/__init__.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/__pycache__/__init__.cpython-39.pyc
new file mode 100644
index 0000000..08f6f1d
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/__pycache__/__init__.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/__pycache__/msgcat.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/__pycache__/msgcat.cpython-39.pyc
new file mode 100644
index 0000000..1a3e66d
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/__pycache__/msgcat.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/__pycache__/msgs.cpython-39.pyc b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/__pycache__/msgs.cpython-39.pyc
new file mode 100644
index 0000000..d13457d
Binary files /dev/null and b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/__pycache__/msgs.cpython-39.pyc differ
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/msgcat.py b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/msgcat.py
new file mode 100644
index 0000000..3851008
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/msgcat.py
@@ -0,0 +1,179 @@
+from ttkbootstrap.window import get_default_root
+
+
+class MessageCatalog:
+ @staticmethod
+ def translate(src):
+ """Returns a translation of src according to the user's current
+ locale.
+
+ This is the main function used to localize an application.
+ Instead of using an English string directly, an applicaton can
+ pass the English string through `translate` and use the result.
+ If an application is written for a single language in this
+ fashion, then it is easy to add support for additional languages
+ later simply by defining new message catalog entries.
+
+ Parameters:
+
+ src (str):
+ The string to be translated.
+
+ Returns:
+
+ str:
+ The translated string.
+ """
+ root = get_default_root()
+ command = "::msgcat::mc"
+ return root.tk.eval(f'{command} "{src}"')
+
+ @staticmethod
+ def locale(newlocale=None):
+ """ "This function sets the locale to newlocale. If newlocale is
+ omitted, the current locale is returned, otherwise the current
+ locale is set to newlocale. The initial locale defaults to the
+ locale specified in the user's environment.
+
+ Parameters:
+
+ newlocale (str):
+ The new locale code used to define the language for the
+ application.
+
+ Returns:
+
+ str:
+ The current locale name if newlocale is None or an empty
+ string.
+ """
+ root = get_default_root()
+ command = "::msgcat::mclocale"
+ return root.tk.eval(f'{command} {newlocale or ""}')
+
+ @staticmethod
+ def preferences():
+ """Returns an ordered list of the locales preferred by the user,
+ based on the user's language specification. The list is ordered
+ from most specific to least preference. If the user has specified
+ LANG=en_US_funky, this method would return {en_US_funky en_US en}.
+
+ Returns:
+
+ List[str, ...]:
+ Locales preferred by the user.
+ """
+ root = get_default_root()
+ command = "::msgcat::mcpreferences"
+ items = root.tk.eval(command).split(" ")
+ if len(items) > 0:
+ return items[0:-1]
+ else:
+ return []
+
+ @staticmethod
+ def load(dirname):
+ """Searches the specified directory for files that match the
+ language specifications returned by `preferences`. Each file
+ located is sourced.
+
+ Parameters:
+
+ dirname (str or Pathlike object):
+ The directory path of the msg files.
+
+ Returns:
+
+ int:
+ Then number of message files which matched the
+ specification and were loaded.
+ """
+ from pathlib import Path
+ msgs = Path(dirname).as_posix() # format path for tcl/tk
+
+ root = get_default_root()
+ command = "::msgcat::mcload"
+ return int(root.tk.eval(f"{command} [list {msgs}]"))
+
+ @staticmethod
+ def set(locale, src, translated=None):
+ """Sets the translation for 'src' to 'translated' in the
+ specified locale. If translated is not specified, src is used
+ for both.
+
+ Parameters:
+
+ locale (str):
+ The local code used when translating the src.
+
+ src (str):
+ The original language string.
+
+ translated (str):
+ The translated string.
+ """
+ root = get_default_root()
+ command = "::msgcat::mcset"
+ root.tk.eval(f'{command} {locale} {src} {translated or ""}')
+
+ @staticmethod
+ def set_many(locale, *args):
+ """Sets the translation for multiple source strings in *args in
+ the specified locale and the current namespace. Must be an even
+ number of args.
+
+ Parameters:
+
+ locale (str):
+ The local code used when translating the src.
+
+ *args (str):
+ A series of src, translated pairs.
+
+ Returns:
+
+ int:
+ The number of translation sets.
+ """
+ root = get_default_root()
+ command = "::msgcat::mcmset"
+ messages = " ".join([f'"{x}"' for x in args])
+ out = f"{command} {locale} {{{messages}}}"
+ return int(root.tk.eval(out))
+
+ @staticmethod
+ def max(*src):
+ """Given several source strings, max returns the length of the
+ longest translated string. This is useful when designing localized
+ GUIs, which may require that all buttons, for example, be a fixed
+ width (which will be the width of the widest button).
+
+ Parameters:
+
+ *src (str):
+ A series of strings to compare
+
+ Returns:
+
+ int:
+ The length of the longest str.
+ """
+ root = get_default_root()
+ command = "::msgcat::mcmax"
+ return int(root.tk.eval(f'{command} {" ".join(src)}'))
+
+
+if __name__ == "__main__":
+
+ # testing
+ from ttkbootstrap import localization
+
+ localization.initialize_localities()
+ MessageCatalog.locale("zh_cn")
+ result = MessageCatalog.translate("Skip Messages")
+ print(result)
+ result = MessageCatalog.translate("yes")
+ print(result)
+ from ttkbootstrap.dialogs import Messagebox
+
+ Messagebox.okcancel("this is my message")
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/msgs.py b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/msgs.py
new file mode 100644
index 0000000..a529a98
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/localization/msgs.py
@@ -0,0 +1,431 @@
+from ttkbootstrap.localization.msgcat import MessageCatalog
+
+MESSAGES = []
+
+
+def initialize_localities():
+ """Load all custom msg files."""
+ for m in MESSAGES:
+ m.initialize()
+
+
+class LocaleMsgs:
+ """A helper class to allow loading the library message catalog
+ without having to package library resources which can cause
+ problems with creating distributable applications with some
+ packagers."""
+
+ def __init__(self, locale, *msgs):
+ self.locale = locale
+ self.messages = msgs
+
+ def initialize(self):
+ """Initialize this locale in the MessageCatalog"""
+ from itertools import chain
+
+ messages = list(chain(*self.messages))
+ MessageCatalog.set_many(self.locale, *messages)
+
+
+MESSAGES.append(
+ # CZECH translation
+ LocaleMsgs(
+ "cs",
+ ("Continue", "Pokračovat"),
+ ("Retry", "Znovu"),
+ ("Delete", "Vymazat"),
+ ("Next", "Další"),
+ ("Prev", "Předchozí"),
+ ("Yes", "Ano"),
+ ("No", "Ne"),
+ ("Open", "Otevřený"),
+ ("Close", "Zavřít"),
+ ("Add", "Přidat"),
+ ("Remove", "Odstranit"),
+ ("Submit", "Podat"),
+ ("Family", "Rodina"),
+ ("Weight", "Hmotnost"),
+ ("Slant", "Sklonit"),
+ ("Effects", "Účinky"),
+ ("Preview", "Náhled"),
+ ("Size", "Velikost"),
+ )
+)
+MESSAGES.append(
+ # DANISH translation
+ LocaleMsgs(
+ "da",
+ ("Continue", "Fortsætte"),
+ ("Retry", "Prøv"),
+ ("Delete", "Slette"),
+ ("Next", "Næste"),
+ ("Prev", "Forrige"),
+ ("Yes", "Ja"),
+ ("No", "Nej"),
+ ("Open", "Åben"),
+ ("Close", "Lukke"),
+ ("Add", "Tilføje"),
+ ("Remove", "Fjerne"),
+ ("Submit", "Indsende"),
+ ("Family", "Familie"),
+ ("Weight", "Vægt"),
+ ("Slant", "Drejning"),
+ ("Effects", "Effekter"),
+ ("Size", "Størrelse"),
+ )
+)
+MESSAGES.append(
+ # SPANISH translation
+ LocaleMsgs(
+ "es",
+ ("Cancel", "Cancelar"),
+ ("Retry", "Reintentar"),
+ ("Delete", "Borrar"),
+ ("Next", "Próximo"),
+ ("Prev", "Anterior"),
+ ("Yes", "Sí"),
+ ("Open", "Abrir"),
+ ("Close", "Cerrar"),
+ ("Add", "Agregar"),
+ ("Remove", "Eliminar"),
+ ("Submit", "Enviar"),
+ ("Family", "Familia"),
+ ("Weight", "Peso"),
+ ("Slant", "Inclinación"),
+ ("Effects", "Efectos"),
+ ("Preview", "Vista previa"),
+ ("Size", "Tamaño"),
+ )
+)
+MESSAGES.append(
+ # PORTUGUESE - BRAZIL translation
+ LocaleMsgs(
+ "pt_br",
+ ("Retry", "Repetir"),
+ ("Delete", "Excluir"),
+ ("Next", "Próximo"),
+ ("Prev", "Anterior"),
+ ("Yes", "Sim"),
+ ("No", "Não"),
+ ("Open", "Abrir"),
+ ("Close", "Fechar"),
+ ("Add", "Adicionar"),
+ ("Remove", "Remover"),
+ ("Submit", "Enviar"),
+ ("Family", "Família"),
+ ("Weight", "Espessura"),
+ ("Slant", "Estilo"),
+ ("Effects", "Efeitos"),
+ ("Preview", "Visualizar"),
+ ("Size", "Tamanho"),
+ ("Should be of data type", "Deve ser do tipo de dados"),
+ ("Invalid data type", "Tipo de dados inválido"),
+ ("Number cannot be greater than", "O número não deve ser maior que"),
+ ("Out of range", "Fora do limite"),
+ ("Previous", "Anterior"),
+ (
+ "The quick brown fox jumps over the lazy dog.",
+ "A rápida raposa marrom pula sobre o cachorro preguiçoso.",
+ ),
+ ("Font Selector", "Seletor de Fontes"),
+ ("normal", "normal"),
+ ("bold", "negrito"),
+ ("roman", "romano"),
+ ("italic", "itálico"),
+ ("underline", "sublinhado"),
+ ("overstrike", "taxado"),
+ ("Color Chooser", "Seletor de Cores"),
+ ("Advanced", "Avançado"),
+ ("Themed", "Tema"),
+ ("Standard", "Básicas"),
+ ("Current", "Atual"),
+ ("New", "Nova"),
+ ("Hue", "Matiz"),
+ ("Sat", "Sat"),
+ ("Lum", "Lum"),
+ ("Hex", "Hex"),
+ ("Red", "Vermelho"),
+ ("Green", "Verde"),
+ ("Blue", "Azul"),
+ ("color dropper", "Selecionador de cores (conta-gotas)"),
+ ("Cancel", "Cancelar"),
+ ("Search", "Buscar"),
+ ("Page", "Página"),
+ ("of", "de"),
+ ("⎌", "↺"),
+ ("Reset table", "Resetar Tabela"),
+ ("Columns", "Colunas"),
+ ("Move", "Mover"),
+ ("Align", "Alinhar"),
+ ("Hide column", "Ocultar coluna"),
+ ("Delete column", "Excluir coluna"),
+ ("Show All", "Exibir todas"),
+ ("Move to left", "Mover para esquerda"),
+ ("Move to right", "Mover para direira"),
+ ("Move to first", "Mover para o início"),
+ ("Move to last", "Mover para o fim"),
+ ("Align left", "Alinhar à esquerda"),
+ ("Align center", "Alinhar ao centro"),
+ ("Align right", "Alinhar à direita"),
+ ("Sort", "Classificar"),
+ ("Filter", "Filtrar"),
+ ("Export", "Exportar"),
+ ("Delete selected rows", "Excluir linhas selecionadas"),
+ ("Sort Ascending", "Ordem crescente"),
+ ("Sort Descending", "Ordem decrescente"),
+ ("Clear filters", "Limpar filtros"),
+ ("Filter by cell's value", "Filtrar pelo valor da célula"),
+ ("Hide select rows", "Ocultar linha selecionada"),
+ ("Show only select rows", "Exibir somente as linhas selecionadas"),
+ ("Export all records", "Exportar todos os dados"),
+ ("Export current page", "Exportar página atual"),
+ ("Export current selection", "Exportar seleção atual"),
+ ("Export records in filter", "Exportar dados do filtro"),
+ ("Move up", "Mover para cima"),
+ ("Move down", "Mover para baixo"),
+ ("Move to top", "Mover para o início"),
+ ("Move to bottom", "Mover para o fim"),
+ ("Mo", "S"),
+ ("Tu", "T"),
+ ("We", "Q"),
+ ("Th", "Q"),
+ ("Fr", "S"),
+ ("Sa", "S"),
+ ("Su", "D"),
+ )
+)
+MESSAGES.append(
+ # CHINESE - CHINA translation
+ LocaleMsgs(
+ "zh_cn",
+ ("&Abort", "&中止"),
+ ("&About...", "&关于……"),
+ ("All Files", "所有文件"),
+ ("Application Error", "应用程序错误"),
+ ("&Apply", "&添加"),
+ ("Bold", "粗体"),
+ ("Bold Italic", "加粗斜体"),
+ ("&Blue", "&蓝色"),
+ ("Cancel", "取消"),
+ ("&Cancel", "&取消"),
+ (
+ 'Cannot change to the directory %1\$s.\nPermission denied.',
+ '无法更改目录 %1\$s。\n访问被拒绝。',
+ ),
+ ("Choose Directory", "选择文件夹"),
+ ("Cl&ear", "清&除"),
+ ("&Clear Console", "&清除终端"),
+ ("Color", "颜色"),
+ ("Console", "终端"),
+ ("&Copy", "&复制"),
+ ("Cu&t", "剪&切"),
+ ("&Delete", "&删除"),
+ ("Details >>", "详细信息 >>"),
+ ('Directory %1\$s does not exist.', '目录 %1\$s 不存在。'),
+ ("&Directory:", "&目录:"),
+ ("&Edit", "&编辑"),
+ ("Effects", "效果"),
+ ("Error: %1\$s", "错误: %1\$s"),
+ ("E&xit", "退&出"),
+ ("&File", "&文件"),
+ (
+ 'File %1\$s already exists.\nDo you want to overwrite it?',
+ '文件 %1\$s 已经存在。\n您想要覆盖它吗?',
+ ),
+ ('File %1\$s already exists.\n\n', '文件 %1\$s 已经存在。\n\n'),
+ ('File %1\$s does not exist.', '文件 %1\$s 不存在。'),
+ ("File &name:", "文件&名:"),
+ ("File &names:", "文件&名:"),
+ ("Files of &type:", "文件&类型:"),
+ ("Fi&les:", "文&件:"),
+ ("&Filter", "&过滤"),
+ ("Fil&ter:", "过&滤:"),
+ ("Font", "字体"),
+ ("&Font:", "&字体:"),
+ ("Font st&yle:", "字体&样式:"),
+ ("&Green", "&绿色"),
+ ("&Help", "&帮助"),
+ ("Hi", "你好"),
+ ("&Hide Console", "&隐藏终端"),
+ ("&Ignore", "&忽略"),
+ ('Invalid file name %1\$s.', '无效的文件名 %1\$s。'),
+ ("Italic", "斜体"),
+ ("Log Files", "日志文件"),
+ ("&No", "&取消"),
+ ("No", "取消"),
+ ("&OK", "&确定"),
+ ("OK", "确定"),
+ ("Ok", "确定"),
+ ("Open", "打开"),
+ ("&Open", "&打开"),
+ ("Open Multiple Files", "打开多个文件"),
+ ("P&aste", "粘&贴"),
+ ("&Quit", "&退出"),
+ ("&Red", "红色"),
+ ("Regular", "规则"),
+ ("Replace existing file?", "替换已有文件?"),
+ ("&Retry", "&重试"),
+ ("Sample", "样式"),
+ ("&Save", "&保存"),
+ ("Save As", "另存为"),
+ ("Save To Log", "保存到日志"),
+ ("Select Log File", "选择日志文件"),
+ ("Select a file to source", "选择一个源文件"),
+ ("&Selection:", "&选择:"),
+ ("&Size:", "&大小:"),
+ ("Show &Hidden Directories", "显示&隐藏目录"),
+ ("Show &Hidden Files and Directories", "显示&隐藏文件和目录"),
+ ("Skip Messages", "跳过信息"),
+ ("&Source...", "&来源……"),
+ ("Stri&keout", "删&除线"),
+ ("Tcl Scripts", "Tcl脚本"),
+ ("Tcl for Windows", "适用于Windows的Tcl"),
+ ("Text Files", "文本文档"),
+ ("&Underline", "&下划线"),
+ ("&Yes", "&确定"),
+ ("abort", "中止"),
+ ("blue", "蓝色"),
+ ("cancel", "取消"),
+ ("extension", "拓展"),
+ ("extensions", "拓展"),
+ ("green", "绿色"),
+ ("ignore", "忽略"),
+ ("ok", "确定"),
+ ("red", "红色"),
+ ("retry", "重试"),
+ ("Retry", "重试"),
+ ("yes", "确认"),
+ ("Yes", "确认"),
+ ("Should be of data type", "应为数据类型"),
+ ("Invalid data type", "无效数据类型"),
+ ("Number cannot be greater than", "数字不能大于"),
+ ("Out of range", "超出范围"),
+ ("Submit", "提交"),
+ ("Delete", "删除"),
+ ("Next", "下一步"),
+ ("Previous", "以前的"),
+ ("Open", "打开"),
+ ("Close", "关闭"),
+ ("Add", "添加"),
+ ("Remove", "移除"),
+ ("Family", "组"),
+ ("Weight", "重量"),
+ ("Slant", "倾斜"),
+ ("Effects", "效果"),
+ ("Preview", "预览"),
+ ("Size", "大小"),
+ ("The quick brown fox jumps over the lazy dog.", "敏捷的棕色狐狸跳过懒惰的狗。"),
+ ("Print", "输出"),
+ ("Printer", "打印机"),
+ ("Letter ", "信 "),
+ ("Legal ", "合法的 "),
+ ("A4", "A4"),
+ ("Grayscale", "灰度"),
+ ("RGB", "RGB"),
+ ("Options", "设置"),
+ ("Copies", "复制"),
+ ("Paper", "纸"),
+ ("Scale", "规模"),
+ ("Orientation", "方向"),
+ ("Portrait", "竖向"),
+ ("Landscape", "横向"),
+ ("Output", "输出"),
+ )
+)
+
+MESSAGES.append(
+ LocaleMsgs(
+ # French
+ "fr",
+ ("OK", "OK"),
+ ("Ok", "Ok"),
+ ("Retry", "Recommencer"),
+ ("Delete", "Supprimer"),
+ ("Next", "Suivant"),
+ ("Prev", "Préc."),
+ ("Yes", "Oui"),
+ ("No", "Non"),
+ ("Open", "Ouvrir"),
+ ("Close", "Fermer"),
+ ("Add", "Ajouter"),
+ ("Remove", "Supprimer"),
+ ("Submit", "Envoyer"),
+ ("Family", "Famille"),
+ ("Weight", "Poids"),
+ ("Slant", "Italique"),
+ ("Effects", "Effets"),
+ ("Preview", "Prévisualiser"),
+ ("Size", "Taille"),
+ ("Should be a of data type", "Doit être du type de données"),
+ ("Invalid data type", "Type de données invalide"),
+ ("Number cannot be greater than", "Le nombre ne peut pas être plus grand que"),
+ ("Out of range", "Hors limites"),
+ ("Previous", "Précédent"),
+ ("The quick brown fox jumps over the lazy dog.", "The quick brown fox jumps over the lazy dog."),
+ ("Font Selector", "Sélecteur de Polices"),
+ ("normal", "normal"),
+ ("bold", "gras"),
+ ("roman", "roman"),
+ ("italic", "italique"),
+ ("underline", "souligné"),
+ ("overstrike", "barré"),
+ ("Color Chooser", "Sélecteur de couleur"),
+ ("Advanced", "Avancé"),
+ ("Themed", "Thème"),
+ ("Standard", "Standard"),
+ ("Current", "Courant"),
+ ("New", "Nouveau"),
+ ("Hue", "Teinte"),
+ ("Sat", "Sat"),
+ ("Lum", "Lum"),
+ ("Hex", "Hex"),
+ ("Red", "Rouge"),
+ ("Green", "Vert"),
+ ("Blue", "Bleu"),
+ ("color dropper", "Sélecteur de couleurs"),
+ ("Cancel", "Annuler"),
+ ("Search", "Chercher"),
+ ("Page", "Page"),
+ ("of", "de"),
+ ("⎌", "↺"),
+ ("Reset table", "Réinit. table"),
+ ("Columns", "Colonnes"),
+ ("Move", "Déplacer"),
+ ("Align", "Aligner"),
+ ("Hide column", "Cacher la colonne"),
+ ("Delete column", "Supprimer la colonne"),
+ ("Show All", "Afficher tout"),
+ ("Move to left", "Déplacer vers la gauche"),
+ ("Move to right", "Déplacer vers la droite"),
+ ("Move to first", "Déplacer en premier"),
+ ("Move to last", "Déplacer en dernier"),
+ ("Align left", "Aligner à gauche"),
+ ("Align center", "Aligner au centre"),
+ ("Align right", "Aligner à droite"),
+ ("Sort", "Trier"),
+ ("Filter", "Filtrer"),
+ ("Export", "Exporter"),
+ ("Delete selected rows", "Supprimer les lignes sélectionnées"),
+ ("Sort Ascending", "Tri ascendant"),
+ ("Sort Descending", "Tri descendant"),
+ ("Clear filters", "Effacer les filtres"),
+ ("Filter by cell's value", "Filtrer par valeur de cellules"),
+ ("Hide select rows", "Cacher les lignes sélectionnées"),
+ ("Show only select rows", "N’afficher que les lignes sélectionnées"),
+ ("Export all records", "Exporter tous les enregistrements"),
+ ("Export current page", "Exporter la page active"),
+ ("Export current selection", "Exporter la sélection"),
+ ("Export records in filter", "Exporter les enregistrements filtrés"),
+ ("Move up", "Déplacer vers le haut"),
+ ("Move down", "Déplacer vers le bas"),
+ ("Move to top", "Déplacer en premier"),
+ ("Move to bottom", "Déplacer en dernier"),
+ ("Mo", "Lu"),
+ ("Tu", "Ma"),
+ ("We", "Me"),
+ ("Th", "Je"),
+ ("Fr", "Ve"),
+ ("Sa", "Sa"),
+ ("Su", "Di"),
+ )
+)
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/publisher.py b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/publisher.py
new file mode 100644
index 0000000..61e5f24
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/publisher.py
@@ -0,0 +1,118 @@
+from enum import Enum
+from typing import List
+
+
+class Channel(Enum):
+ """A grouping for Publisher subscribers. Indicates whether the
+ widget is a legacy `STD` tk widget or a styled `TTK` widget.
+
+ Attributes:
+
+ STD (1):
+ Legacy tkinter widgets.
+
+ TTK (2):
+ Themed tkinter widgets.
+ """
+
+ STD = 1
+ TTK = 2
+
+
+class Subscriber:
+ """A subcriber data class used to store information about a specific
+ subcriber to the `Publisher`."""
+
+ def __init__(self, name, func, channel):
+ """Create a subscriber.
+
+ Parameters:
+
+ name (str):
+ The name of the subscriber
+
+ func (Callable):
+ The function to call when messaging.
+
+ channel (Channel):
+ The subscription channel.
+ """
+ self.name = name
+ self.func = func
+ self.channel = channel
+
+
+class Publisher:
+ """A class used to publish events for widget updates for theme changes
+ or configurations"""
+
+ __subscribers = {}
+
+ @staticmethod
+ def subscriber_count():
+ return len(Publisher.__subscribers)
+
+ @staticmethod
+ def subscribe(name, func, channel):
+ """Subscribe to an event.
+
+ Parameters:
+
+ name (str):
+ The widget's tkinter/tcl name.
+
+ func (Callable):
+ A function to call when passing a message.
+
+ channel (Channel):
+ Indicates the channel grouping the subscribers.
+ """
+ subs = Publisher.__subscribers
+ subs[name] = Subscriber(name, func, channel)
+
+ @staticmethod
+ def unsubscribe(name):
+ """Remove a subscriber
+
+ Parameters:
+
+ name (str):
+ The widget's tkinter/tcl name.
+ """
+ subs = Publisher.__subscribers
+ try:
+ del subs[str(name)]
+ except:
+ pass
+
+ def get_subscribers(channel):
+ """Return a list of subscribers
+
+ Returns:
+
+ List:
+ List of key-value tuples
+ """
+ subs = Publisher.__subscribers.values()
+ channel_subs = [s for s in subs if s.channel == channel]
+ return channel_subs
+
+ def publish_message(channel, *args):
+ """Publish a message to all subscribers
+
+ Parameters:
+
+ channel (Channel):
+ The name of the channel to subscribe.
+
+ **args:
+ optional arguments to pass to the subscribers.
+ """
+ subs: List[Subscriber] = Publisher.get_subscribers(channel)
+ for sub in subs:
+ sub.func(*args)
+
+ @staticmethod
+ def clear_subscribers():
+ """Reset all subscriptions."""
+ Publisher.__subscribers.clear()
diff --git a/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/scrolled.py b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/scrolled.py
new file mode 100644
index 0000000..1a0384d
--- /dev/null
+++ b/PepDeb64/fusato/config/includes.installer/preseed/py/ttkbootstrap/scrolled.py
@@ -0,0 +1,476 @@
+"""
+ This module contains various custom scrolling widgets, including
+ `ScrolledText` and `ScrolledFrame`.
+"""
+import ttkbootstrap as ttk
+from ttkbootstrap.constants import *
+from tkinter import Pack, Place, Grid
+
+
+class ScrolledText(ttk.Frame):
+ """A text widget with optional vertical and horizontal scrollbars.
+ Setting `autohide=True` will cause the scrollbars to hide when the
+ mouse is not over the widget. The vertical scrollbar is on by
+ default, but can be turned off. The horizontal scrollbar can be
+ enabled by setting `vbar=True`.
+
+ This widget is identical in configuration to the `Text` widget other
+ than the scrolling frame. https://tcl.tk/man/tcl8.6/TkCmd/text.htm
+
+ ![scrolled text](../../../assets/scrolled/scrolledtext.gif)
+
+ Examples:
+
+ ```python
+ import ttkbootstrap as ttk
+ from ttkbootstrap.constants import *
+ from ttkbootstrap.scrolled import ScrolledText
+
+ app = ttk.Window()
+
+ # scrolled text with autohide vertical scrollbar
+ st = ScrolledText(app, padding=5, height=10, autohide=True)
+ st.pack(fill=BOTH, expand=YES)
+
+ # add text
+ st.insert(END, 'Insert your text here.')
+
+ app.mainloop()
+ ```
+ """
+
+ def __init__(
+ self,
+ master=None,
+ padding=2,
+ bootstyle=DEFAULT,
+ autohide=False,
+ vbar=True,
+ hbar=False,
+ **kwargs,
+ ):
+ """
+ Parameters:
+
+ master (Widget):
+ The parent widget.
+
+ padding (int):
+ The amount of empty space to create on the outside of
+ the widget.
+
+ bootstyle (str):
+ A style keyword used to set the color and style of the
+ vertical scrollbar. Available options include -> primary,
+ secondary, success, info, warning, danger, dark, light.
+
+ vbar (bool):
+ A vertical scrollbar is shown when **True** (default).
+
+ hbar (bool):
+ A horizontal scrollbar is shown when **True**. Turning
+ on this scrollbar will also set `wrap="none"`. This
+ scrollbar is _off_ by default.
+
+ autohide (bool):
+ When **True**, the scrollbars will hide when the mouse
+ is not within the frame bbox.
+
+ **kwargs (Dict[str, Any]):
+ Other keyword arguments passed to the `Text` widget.
+ """
+ super().__init__(master, padding=padding)
+
+ # setup text widget
+ self._text = ttk.Text(self, padx=50, **kwargs)
+ self._hbar = None
+ self._vbar = None
+
+ # delegate text methods to frame
+ for method in vars(ttk.Text).keys():
+ if any(["pack" in method, "grid" in method, "place" in method]):
+ pass
+ else:
+ setattr(self, method, getattr(self._text, method))
+
+ # setup scrollbars
+ if vbar:
+ self._vbar = ttk.Scrollbar(
+ master=self,
+ bootstyle=bootstyle,
+ command=self._text.yview,
+ orient=VERTICAL,
+ )
+ self._vbar.place(relx=1.0, relheight=1.0, anchor=NE)
+ self._text.configure(yscrollcommand=self._vbar.set)
+
+ if hbar:
+ self._hbar = ttk.Scrollbar(
+ master=self,
+ bootstyle=bootstyle,
+ command=self._text.xview,
+ orient=HORIZONTAL,
+ )
+ self._hbar.place(rely=1.0, relwidth=1.0, anchor=SW)
+ self._text.configure(xscrollcommand=self._hbar.set, wrap="none")
+
+ self._text.pack(side=LEFT, fill=BOTH, expand=YES)
+
+ # position scrollbars
+ if self._hbar:
+ self.update_idletasks()
+ self._text_width = self.winfo_reqwidth()
+ self._scroll_width = self.winfo_reqwidth()
+
+ self.bind("", self._on_configure)
+
+ if autohide:
+ self.autohide_scrollbar()
+ self.hide_scrollbars()
+
+ def _on_configure(self, *_):
+ """Callback for when the configure method is used"""
+ if self._hbar:
+ self.update_idletasks()
+ text_width = self.winfo_width()
+ vbar_width = self._vbar.winfo_width()
+ relx = (text_width - vbar_width) / text_width
+ self._hbar.place(rely=1.0, relwidth=relx)
+
+ @property
+ def text(self):
+ """Returns the internal text object"""
+ return self._text
+
+ @property
+ def hbar(self):
+ """Returns the internal horizontal scrollbar"""
+ return self._hbar
+
+ @property
+ def vbar(self):
+ """Returns the internal vertical scrollbar"""
+ return self._vbar
+
+ def hide_scrollbars(self, *_):
+ """Hide the scrollbars."""
+ try:
+ self._vbar.lower(self._text)
+ except:
+ pass
+ try:
+ self._hbar.lower(self._text)
+ except:
+ pass
+
+ def show_scrollbars(self, *_):
+ """Show the scrollbars."""
+ try:
+ self._vbar.lift(self._text)
+ except:
+ pass
+ try:
+ self._hbar.lift(self._text)
+ except:
+ pass
+
+ def autohide_scrollbar(self, *_):
+ """Show the scrollbars when the mouse enters the widget frame,
+ and hide when it leaves the frame."""
+ self.bind("", self.show_scrollbars)
+ self.bind("", self.hide_scrollbars)
+
+
+class ScrolledFrame(ttk.Frame):
+ """A widget container with a vertical scrollbar.
+
+ The ScrolledFrame fills the width of its container. The height is
+ either set explicitly or is determined by the content frame's
+ contents.
+
+ This widget behaves mostly like a normal frame other than the
+ exceptions stated already. Another exception is when packing it
+ into a Notebook or Panedwindow. In this case, you'll need to add
+ the container instead of the content frame. For example,
+ `mynotebook.add(myscrolledframe.container)`.
+
+ The scrollbar has an autohide feature that can be turned on by
+ setting `autohide=True`.
+
+ Examples:
+
+ ```python
+ import ttkbootstrap as ttk
+ from ttkbootstrap.constants import *
+ from ttkbootstrap.scrolled import ScrolledFrame
+
+ app = ttk.Window()
+
+ sf = ScrolledFrame(app, autohide=True)
+ sf.pack(fill=BOTH, expand=YES, padx=10, pady=10)
+
+ # add a large number of checkbuttons into the scrolled frame
+ for x in range(20):
+ ttk.Checkbutton(sf, text=f"Checkbutton {x}").pack(anchor=W)
+
+ app.mainloop()
+ ```"""
+
+ def __init__(
+ self,
+ master=None,
+ padding=2,
+ bootstyle=DEFAULT,
+ autohide=False,
+ height=200,
+ width=300,
+ scrollheight=None,
+ **kwargs,
+ ):
+ """
+ Parameters:
+
+ master (Widget):
+ The parent widget.
+
+ padding (int):
+ The amount of empty space to create on the outside of
+ the widget.
+
+ bootstyle (str):
+ A style keyword used to set the color and style of the
+ vertical scrollbar. Available options include -> primary,
+ secondary, success, info, warning, danger, dark, light.
+
+ autohide (bool):
+ When **True**, the scrollbars will hide when the mouse
+ is not within the frame bbox.
+
+ height (int):
+ The height of the container frame in screen units.
+
+ width (int):
+ The width of the container frame in screen units.
+
+ scrollheight (int):
+ The height of the content frame in screen units. If None,
+ the height is determined by the frame contents.
+
+ **kwargs (Dict[str, Any]):
+ Other keyword arguments passed to the content frame.
+ """
+ # content frame container
+ self.container = ttk.Frame(
+ master=master,
+ relief=FLAT,
+ borderwidth=0,
+ width=width,
+ height=height,
+ )
+ self.container.bind("", lambda _: self.yview())
+ self.container.propagate(0)
+
+ # content frame
+ super().__init__(
+ master=self.container,
+ padding=padding,
+ bootstyle=bootstyle.replace('round', ''),
+ width=width,
+ height=height,
+ **kwargs,
+ )
+ self.place(rely=0.0, relwidth=1.0, height=scrollheight)
+
+ # vertical scrollbar
+ self.vscroll = ttk.Scrollbar(
+ master=self.container,
+ command=self.yview,
+ orient=VERTICAL,
+ bootstyle=bootstyle,
+ )
+ self.vscroll.pack(side=RIGHT, fill=Y)
+
+ self.winsys = self.tk.call("tk", "windowingsystem")
+
+ # setup autohide scrollbar
+ self.autohide = autohide
+ if self.autohide:
+ self.hide_scrollbars()
+
+ # widget event binding
+ self.container.bind("", self._on_enter, "+")
+ self.container.bind("", self._on_leave, "+")
+ self.container.bind("