;ELC   
;;; Compiled
;;; in Emacs version 28.2
;;; with all optimizations.



(byte-code "\300\301!\210\300\302!\210\303\304\305\306\307\310\311\312\313\314&	\210\315\316\317\320\321DD\322\323\324%\210\315\325\317\320\326DD\327\323\330%\210\315\331\317\320\332DD\333\323\330%\210\315\334\317\320\335DD\336\323\337\340\341&\210\315\342\317\320\343DD\344\323\337\340\341&\207" [require cl-lib tramp custom-declare-group shadow nil "Automatic file copying when saving a file." :prefix "shadow-" :link (emacs-commentary-link "shadowfile") :group files custom-declare-variable shadow-noquery funcall function #[0 "\300\207" [nil] 1 #1=""] "If t, always copy shadow files without asking.\nIf nil (the default), always ask.  If not nil and not t, ask only if there\nis no buffer currently visiting the file." :type (choice (const t) (const nil) (other :tag "Ask if no buffer" maybe)) shadow-inhibit-message #[0 "\300\207" [nil] 1 #1#] "If non-nil, do not display a message when a file needs copying." boolean shadow-inhibit-overload #[0 "\300\207" [nil] 1 #1#] "If non-nil, shadowfile won't redefine \\[save-buffers-kill-emacs].\nNormally it overloads the function `save-buffers-kill-emacs' to check for\nfiles that have been changed and need to be copied to other systems." shadow-info-file #[0 "\300\301\302\"\207" [locate-user-emacs-file "shadows" ".shadows"] 3 #1#] "File to keep shadow information in.\nThe `shadow-info-file' should be shadowed to all your accounts to\nensure consistency.  Default: ~/.emacs.d/shadows" file :version "26.2" shadow-todo-file #[0 "\300\301\302\"\207" [locate-user-emacs-file "shadow_todo" ".shadow_todo"] 3 #1#] "File to store the list of uncopied shadows in.\nThis means that if a remote system is down, or for any reason you cannot or\ndecide not to copy your shadow files at the end of one Emacs session, it will\nremember and ask you again in your next Emacs session.\nThis file must NOT be shadowed to any other system, it is host-specific.\nDefault: ~/.emacs.d/shadow_todo"] 10)
#@53 The identification for local files on this machine.
(defvar shadow-system-name (byte-code "\300\301 \302Q\207" ["/" system-name ":"] 3) (#$ . 2023))
#@38 Your home directory on this machine.
(defvar shadow-homedir "~/" (#$ . 2178))
#@54 List of host clusters (see `shadow-define-cluster').
(defvar shadow-clusters nil (#$ . 2262))
#@149 List of files that are shared between hosts.
This list contains shadow structures with literal filenames, created by
`shadow-define-literal-group'.
(defvar shadow-literal-groups nil (#$ . 2363))
#@162 List of file types that are shared between hosts.
This list contains shadow structures with regexps matching filenames,
created by `shadow-define-regexp-group'.
(defvar shadow-regexp-groups nil (#$ . 2565))
(defvar shadow-files-to-copy nil)
(defvar shadow-hashtable (make-hash-table :test 'equal))
(defvar shadow-info-buffer nil)
(defvar shadow-todo-buffer nil)
#@25 Use for debug messages.
(defvar shadow-debug nil (#$ . 2933))
#@114 Like `regexp-quote', but includes the \` and \'.
This makes sure regexp matches nothing but STRING.

(fn STRING)
(defalias 'shadow-regexp-superquote #[257 "\300\301!\302Q\207" ["\\`" regexp-quote "\\'"] 4 (#$ . 3002)])
#@155 If PREFIX begins with STRING, return the rest.
Return value is non-nil if PREFIX and STRING are `string=' up to the length of
PREFIX.

(fn PREFIX STRING)
(defalias 'shadow-suffix #[514 "GG\211Y\205 \300O\230\205 \301O\207" [0 nil] 8 (#$ . 3229)])
#@73 compiler-macro for inlining `shadow-cluster-p'.

(fn CL-WHOLE-ARG CL-X)
(defalias 'shadow-cluster-p--cmacro #[514 "\300\301\302\303\211\211&\207" [cl--defsubst-expand (cl-x) (cl-block shadow-cluster-p (and (memq (car-safe cl-x) cl-struct-shadow-cluster-tags) t)) nil] 9 (#$ . 3492)])
(put 'shadow-cluster-p 'compiler-macro 'shadow-cluster-p--cmacro)
#@13 

(fn CL-X)
(defalias 'shadow-cluster-p #[257 "\211\242>\205 \301\207" [cl-struct-shadow-cluster-tags t] 3 (#$ . 3851)])
(byte-code "\300\301\302\303#\304\305\306\301#\207" [function-put shadow-cluster-p side-effect-free error-free put shadow-cluster cl-deftype-satisfies] 5)
#@76 compiler-macro for inlining `shadow-cluster-name'.

(fn CL-WHOLE-ARG CL-X)
(defalias 'shadow-cluster-name--cmacro #[514 "\300\301\302\303\211\211&\207" [cl--defsubst-expand (cl-x) (cl-block shadow-cluster-name (progn (or (shadow-cluster-p cl-x) (signal 'wrong-type-argument (list 'shadow-cluster cl-x))) (nth 1 cl-x))) nil] 9 (#$ . 4135)])
(put 'shadow-cluster-name 'compiler-macro 'shadow-cluster-name--cmacro)
#@64 Access slot "name" of `shadow-cluster' struct CL-X.

(fn CL-X)
(defalias 'shadow-cluster-name #[257 "\211\242>\204 \301\302\303D\"\210\211A@\207" [cl-struct-shadow-cluster-tags signal wrong-type-argument shadow-cluster] 5 (#$ . 4556)])
(byte-code "\300\301\302\303#\300\207" [function-put shadow-cluster-name side-effect-free t] 4)
#@79 compiler-macro for inlining `shadow-cluster-primary'.

(fn CL-WHOLE-ARG CL-X)
(defalias 'shadow-cluster-primary--cmacro #[514 "\300\301\302\303\211\211&\207" [cl--defsubst-expand (cl-x) (cl-block shadow-cluster-primary (progn (or (shadow-cluster-p cl-x) (signal 'wrong-type-argument (list 'shadow-cluster cl-x))) (nth 2 cl-x))) nil] 9 (#$ . 4897)])
(put 'shadow-cluster-primary 'compiler-macro 'shadow-cluster-primary--cmacro)
#@67 Access slot "primary" of `shadow-cluster' struct CL-X.

(fn CL-X)
(defalias 'shadow-cluster-primary #[257 "\211\242>\204 \301\302\303D\"\210\3048\207" [cl-struct-shadow-cluster-tags signal wrong-type-argument shadow-cluster 2] 5 (#$ . 5333)])
(byte-code "\300\301\302\303#\300\207" [function-put shadow-cluster-primary side-effect-free t] 4)
#@78 compiler-macro for inlining `shadow-cluster-regexp'.

(fn CL-WHOLE-ARG CL-X)
(defalias 'shadow-cluster-regexp--cmacro #[514 "\300\301\302\303\211\211&\207" [cl--defsubst-expand (cl-x) (cl-block shadow-cluster-regexp (progn (or (shadow-cluster-p cl-x) (signal 'wrong-type-argument (list 'shadow-cluster cl-x))) (nth 3 cl-x))) nil] 9 (#$ . 5685)])
(put 'shadow-cluster-regexp 'compiler-macro 'shadow-cluster-regexp--cmacro)
#@66 Access slot "regexp" of `shadow-cluster' struct CL-X.

(fn CL-X)
(defalias 'shadow-cluster-regexp #[257 "\211\242>\204 \301\302\303D\"\210\3048\207" [cl-struct-shadow-cluster-tags signal wrong-type-argument shadow-cluster 3] 5 (#$ . 6116)])
(byte-code "\300\301\302\303#\304\305\306\"\207" [function-put shadow-cluster-regexp side-effect-free t defalias copy-shadow-cluster copy-sequence] 4)
#@102 compiler-macro for inlining `make-shadow-cluster'.

(fn CL-WHOLE &cl-quote &key NAME PRIMARY REGEXP)
(defalias 'make-shadow-cluster--cmacro #[385 "\300\301\"A@\300\302\"A@\300\303\"A@\211\203= \211@\304>\203& \211AA\262\202 \305>A@\2034 \306\262\202 \307\310@\"\210\202 \210\311\312\313\306\306&\207" [plist-member :name :primary :regexp (:name :primary :regexp :allow-other-keys) :allow-other-keys nil error "Keyword argument %s not one of (:name :primary :regexp)" cl--defsubst-expand (name primary regexp) (cl-block make-shadow-cluster (list 'shadow-cluster name primary regexp))] 14 (#$ . 6519)])
(put 'make-shadow-cluster 'compiler-macro 'make-shadow-cluster--cmacro)
#@82 Constructor for objects of type `shadow-cluster'.

(fn &key NAME PRIMARY REGEXP)
(defalias 'make-shadow-cluster #[128 "\300\301\"A@\300\302\"A@\300\303\"A@\211\203= \211@\304>\203& \211AA\262\202 \305>A@\2034 \306\262\202 \307\310@\"\210\202 \210\311F\207" [plist-member :name :primary :regexp (:name :primary :regexp :allow-other-keys) :allow-other-keys nil error "Keyword argument %s not one of (:name :primary :regexp)" shadow-cluster] 8 (#$ . 7218)])
(byte-code "\300\301\302\303#\304\305\306\211\307\303\310\311\305\306&	\207" [function-put make-shadow-cluster side-effect-free t cl-struct-define shadow-cluster nil list ((cl-tag-slot) (name) (primary) (regexp)) cl-struct-shadow-cluster-tags] 11)
#@223 Put cluster NAME on the list of clusters.
Replace old definition, if any.  PRIMARY and REGEXP are the
information defining the cluster.  For interactive use, call
`shadow-define-cluster' instead.

(fn NAME PRIMARY REGEXP)
(defalias 'shadow-set-cluster #[771 "\301\302\303\"\"\304FB\211\207" [shadow-clusters cl-remove-if make-closure #[257 "\300\242	>\204 \302\303\304D\"\210A@\232\207" [V0 cl-struct-shadow-cluster-tags signal wrong-type-argument shadow-cluster] 6 "\n\n(fn X)"] shadow-cluster] 8 (#$ . 7942)])
#@47 Return cluster named NAME, or nil.

(fn NAME)
(defalias 'shadow-get-cluster #[257 "\301\302\303\"\"\207" [shadow-clusters seq-find make-closure #[257 "\211\242	>\204 \302\303\304D\"\210\211A@\300\230\207" [V0 cl-struct-shadow-cluster-tags signal wrong-type-argument shadow-cluster] 5 "\n\n(fn X)"]] 5 (#$ . 8471)])
#@42 The help string describing a valid site.
(defconst shadow-site-help "A cluster identification \"/name:\", a remote identification\n\"/method:user@host:\", or \"/system-name:\" (the value of\n`shadow-system-name')" (#$ . 8796))
#@71 Return name if SITE has the form "/name:", otherwise SITE.

(fn SITE)
(defalias 'shadow-site-name #[257 "\300\301\"\203\f \302\303\"\207\207" [string-match "\\`/\\([-.[:word:]]+\\):\\'" match-string 1] 4 (#$ . 9029)])
#@69 Return "/name:" if NAME has word syntax, otherwise NAME.

(fn NAME)
(defalias 'shadow-name-site #[257 "\300\301\"\203\f \302\303\"\207\207" [string-match "\\`[-.[:word:]]+\\'" format "/%s:"] 4 (#$ . 9255)])
#@88 If SITE is a cluster, return primary identification, otherwise return SITE.

(fn SITE)
(defalias 'shadow-site-primary #[257 "\301\302!!\211\203 \211\242>\204 \303\304\305D\"\210\3068\207\207" [cl-struct-shadow-cluster-tags shadow-get-cluster shadow-site-name signal wrong-type-argument shadow-cluster 2] 6 (#$ . 9470)])
#@59 Given a SITE, return cluster it is in, or nil.

(fn SITE)
(defalias 'shadow-site-cluster #[257 "\301\302!!\206 \303\304\305\"\"\207" [shadow-clusters shadow-get-cluster shadow-site-name seq-find make-closure #[257 "\302\242	>\204 \303\304\305D\"\210\3068\307\300!\"\207" [V0 cl-struct-shadow-cluster-tags string-match signal wrong-type-argument shadow-cluster 3 shadow-name-site] 6 "\n\n(fn X)"]] 5 (#$ . 9803)])
#@39 Read a site name from the minibuffer.
(defalias 'shadow-read-site #[0 "\303\304\305\306#	\"\307\310!!\204' \211\n\230\204' \211\310\n!\230\204' \311!\211\262\205( \211\207" [shadow-site-help shadow-clusters shadow-system-name completing-read propertize "Site name: " help-echo shadow-get-cluster shadow-site-name file-remote-p] 5 (#$ . 10230)])
#@178 Non-nil if SITE1 is or includes SITE2.
Each may be a host or cluster name; if they are clusters, regexp of SITE1 will
be matched against the primary of SITE2.

(fn SITE1 SITE2)
(defalias 'shadow-site-match #[514 "\230\206* \301!\302!\203% \303\242>\204 \304\305\306D\"\210\3078\"\207\230\266\202\207" [cl-struct-shadow-cluster-tags shadow-get-cluster shadow-site-primary string-match signal wrong-type-argument shadow-cluster 3] 9 (#$ . 10586)])
#@154 Parse any NAME into a `tramp-file-name' structure.
Argument can be a simple name, remote file name, or already a
`tramp-file-name' structure.

(fn NAME)
(defalias 'shadow-parse-name #[257 "\211\204 \302\207\211\242>\203 \207\303!\203 \304!\207\305!\203) \306\307\310	!\311\305!$\207\312\313\"\205K \314\315\"\314\316\"\317!\205I \320\302\211\211\302\302\257\266\202\207" [cl-struct-tramp-file-name-tags shadow-system-name nil file-remote-p tramp-dissect-file-name shadow-local-file make-tramp-file-name :host shadow-site-name :localname string-match "^/\\([^:/]+\\):\\([^:]*\\)$" match-string 1 2 shadow-get-cluster tramp-file-name] 11 (#$ . 11052)])
#@177 Make a Tramp style fullname out of HUP, a `tramp-file-name' structure.
Replace HOST, and NAME when non-nil.  HOST can also be a remote file name.

(fn HUP &optional HOST NAME)
(defalias 'shadow-make-fullname #[769 "\301!\211\205\244 \203L \302!\2036 \206* \211\205* \211\242>\204' \303\304\305D\"\210\3068\262\307\302!!\262\202L \211\242>\204D \303\304\305D\"\210\310\233\211\240\266\203f \211\242>\204^ \303\304\305D\"\210\306\233\211\240\266\211\242>\204t \303\304\305D\"\210\211A@\204\241 \311\312\242>\204\212 \303\304\305D\"\210\3108\242>\204\234 \303\304\305D\"\210\3068#\207\313!\207" [cl-struct-tramp-file-name-tags copy-tramp-file-name file-remote-p signal wrong-type-argument tramp-file-name 6 tramp-dissect-file-name 4 format "/%s:%s" tramp-make-tramp-file-name] 11 (#$ . 11726)])
(byte-code "\300\301\302\303#\304\301\305\306#\207" [function-put shadow-make-fullname speed -1 put byte-optimizer byte-compile-inline-expand] 5)
#@84 Return FULLNAME with the name component changed to NEWNAME.

(fn FULLNAME NEWNAME)
(defalias 'shadow-replace-name-component #[514 "\300!P\207" [file-remote-p] 4 (#$ . 12703)])
#@94 If FILE is not remote, return it.
If it refers to a different system, return nil.

(fn FILE)
(defalias 'shadow-local-file #[257 "\211\204 \303\207\211\242>\2033 \211\242>\204 \304\305\306D\"\210\211A@\2043 \211\242>\204/ \304\305\306D\"\210\3078\207\211\242>\203< \303\207\310\311\312\313	!\"\"\203M \314\315\"\207\310\316\"\203\211 \317\314\315\"!\203\211 \314\320\"\317\314\315\"!\211\242\n>\204u \304\305\321D\"\210\3208\262\211	\230\203\203 \303\262\322P!\207\323!?\205\221 \211\207" [cl-struct-tramp-file-name-tags shadow-system-name cl-struct-shadow-cluster-tags nil signal wrong-type-argument tramp-file-name 6 string-match format "^%s\\([^:]*\\)$" regexp-quote match-string 1 "^/\\([^:/]+\\):\\([^:]*\\)$" shadow-get-cluster 2 shadow-cluster shadow-local-file file-remote-p] 7 (#$ . 12887)])
#@141 If hostname part of FILE is a cluster, expand it to cluster's primary hostname.
Will return the name bare if it is a local file.

(fn FILE)
(defalias 'shadow-expand-cluster-in-file-name #[257 "\211;\205O \301!\206O \302\303\"\203N \304 \305\306\"\216\307\310\311\312\"!!\211\242>\204/ \313\314\315D\"\210\3168\262)\262\211\204= \207\317\320\211\312%\262\301!\206M \207\211\207" [cl-struct-shadow-cluster-tags shadow-local-file string-match "^\\(/[^:/]+:\\)[^:]*$" match-data make-closure #[0 "\301\300\302\"\207" [V0 set-match-data evaporate] 3] shadow-get-cluster shadow-site-name match-string 1 signal wrong-type-argument shadow-cluster 2 replace-match nil] 8 (#$ . 13716)])
#@73 Expand file name and get FILE's true name.

(fn FILE &optional DEFAULT)
(defalias 'shadow-expand-file-name #[513 "\300\301\"!\207" [file-truename expand-file-name] 6 (#$ . 14414)])
#@174 Simplify FILE.
Do so by replacing (when possible) home directory with ~/, and
hostname with cluster name that includes it.  Filename should be
absolute and true.

(fn FILE)
(defalias 'shadow-contract-file-name #[257 "\303!\211\205\216\304!\203 \202\304 \305\306\307\310\311!\211\205\277 \203c \312!\203M \206A \211\205A \211\242	>\204> \313\314\315D\"\210\3168\262\317\312!!\262\202c \211\242	>\204[ \313\314\315D\"\210\320\233\211\240\266\203} \211\242	>\204u \313\314\315D\"\210\316\233\211\240\266\211\242	>\204\213 \313\314\315D\"\210\211A@\204\274 \321\322\242	>\204\241 \313\314\315D\"\210\3208\242	>\204\263 \313\314\315D\"\210\3168#\266\204\202\301 \323!\266\204!!!\324\242	>\204\325 \313\314\315D\"\210\3168\"\325\310\326\311!\211\205\205\203)\312!\203\206\211\205\211\242	>\204\313\314\315D\"\210\3168\262\317\312!!\262\202)\211\242	>\204!\313\314\315D\"\210\320\233\211\240\266\203C\211\242	>\204;\313\314\315D\"\210\316\233\211\240\266\211\242	>\204Q\313\314\315D\"\210\211A@\204\202\321\322\242	>\204g\313\314\315D\"\210\3208\242	>\204y\313\314\315D\"\210\3168#\266\204\202\207\323!\266\204!\211\203\311\242	>\204\233\313\314\315D\"\210A\211\310\240\266\242	>\204\261\313\314\315D\"\210\320\233\211\242\n>\204\303\313\314\327D\"\210A@\240\266\310\203\325P\202\350\242	>\204\344\313\314\315D\"\210\3168\311!\211\205\214\2034\312!\203\206\211\205\211\242	>\204\313\314\315D\"\210\3168\262\317\312!!\262\2024\211\242	>\204,\313\314\315D\"\210\320\233\211\240\266\203N\211\242	>\204F\313\314\315D\"\210\316\233\211\240\266\211\242	>\204\\\313\314\315D\"\210\211A@\204\211\321\322\242	>\204r\313\314\315D\"\210\3208\242	>\204\204\313\314\315D\"\210\3168#\207\323!\266\207\207" [shadow-homedir cl-struct-tramp-file-name-tags cl-struct-shadow-cluster-tags shadow-parse-name shadow-local-file file-name-as-directory file-local-name expand-file-name nil copy-tramp-file-name file-remote-p signal wrong-type-argument tramp-file-name 6 tramp-dissect-file-name 4 format "/%s:%s" tramp-make-tramp-file-name shadow-suffix shadow-site-cluster "" shadow-cluster] 16 (#$ . 14604)])
#@183 True if the site of PATTERN and of FILE are on the same site.
PATTERN and FILE may be Tramp vectors, or remote file names.
FILE may also be just a local filename.

(fn PATTERN FILE)
(defalias 'shadow-same-site #[514 "\301!\301!\302\242>\204 \303\304\305D\"\210\3068\242>\204& \303\304\305D\"\210\3068\"\205e \242>\204; \303\304\305D\"\210\3078?\206e \242>\204P \303\304\305D\"\210\3078\242>\204a \303\304\305D\"\210\3078\230\207" [cl-struct-tramp-file-name-tags shadow-parse-name shadow-site-match signal wrong-type-argument tramp-file-name 4 2] 10 (#$ . 16849)])
#@423 Return t if PATTERN matches FILE.
If REGEXP is supplied and non-nil, the file part of the pattern is a regular
expression, otherwise it must match exactly.  The sites must
match---see `shadow-same-site'.  The pattern must be in full Tramp format,
but the file can be any valid filename.  This function does not do any
filename expansion or contraction, you must do that yourself first.

(fn PATTERN FILE &optional REGEXP)
(defalias 'shadow-file-match #[770 "\301!\301!\302\"\205_ \2038 \303\242>\204  \304\305\306D\"\210\3078\242>\2041 \304\305\306D\"\210\3078\"\202[ \242>\204F \304\305\306D\"\210\3078\242>\204W \304\305\306D\"\210\3078\230\205_ \310\207" [cl-struct-tramp-file-name-tags shadow-parse-name shadow-same-site string-match signal wrong-type-argument tramp-file-name 6 t] 11 (#$ . 17443)])
#@384 Edit (or create) the definition of a cluster NAME.
This is a group of hosts that share directories, so that copying to or from
one of them is sufficient to update the file on all of them.  Clusters are
defined by a name, the network address of a primary host (the one we copy
files to), and a regular expression that matches the hostnames of all the
sites in the cluster.

(fn NAME)
(defalias 'shadow-define-cluster #[257 "\302!\303\304\305\203 \242>\204 \306\307\310D\"\210\3118\202  \"\211\262	\230\204: \312!\204: \313\314!\210\315\311!\210\202 \211\262\303\316\304\317\203[ \242>\204T \306\307\310D\"\210\3208\202^ \321!\"\211\262\"\204r \313\322!\210\315\311!\210\202> \211\262\323#\207" [cl-struct-shadow-cluster-tags shadow-system-name shadow-get-cluster nil read-string "Primary host: " signal wrong-type-argument shadow-cluster 2 file-remote-p message "Not a valid primary!" sit-for string-match "Regexp matching all host names: " 3 shadow-regexp-superquote "Regexp doesn't include the primary host!" shadow-set-cluster] 11 (#$ . 18275) (byte-code "\301\302\"C\207" [shadow-clusters completing-read "Cluster name: "] 3)])
#@273 Declare a single file to be shared between sites.
It may have different filenames on each site.  When this file is edited, the
new version will be copied to each of the other locations.  Sites can be
specific hostnames, or names of clusters (see `shadow-define-cluster').
(defalias 'shadow-define-literal-group #[0 "\302\303\304 !!\211\205\362 \211\242>\204 \305\306\307D\"\210\3108\311\211\312 \211\262\203\346 \313\314\"\262\302\303!!\262\311\315!\211\205\335 \203\201 \316!\203k \206_ \211\205_ \211\242>\204\\ \305\306\307D\"\210\3108\262\317\316!!\262\202\201 \211\242>\204y \305\306\307D\"\210\320\233\211\240\266\203\233 \211\242>\204\223 \305\306\307D\"\210\310\233\211\240\266\211\242>\204\251 \305\306\307D\"\210\211A@\204\332 \321\322\242>\204\277 \305\306\307D\"\210\3208\242>\204\321 \305\306\307D\"\210\3108#\266\204\202\337 \323!\266\204B\262\202 \211\203\356 \211	B\266\324 \207" [cl-struct-tramp-file-name-tags shadow-literal-groups shadow-parse-name shadow-contract-file-name buffer-file-name signal wrong-type-argument tramp-file-name 6 nil shadow-read-site read-string "Filename: " copy-tramp-file-name file-remote-p tramp-dissect-file-name 4 format "/%s:%s" tramp-make-tramp-file-name shadow-write-info-file] 15 (#$ . 19442) nil])
#@389 Make each of a group of files be shared between hosts.
Prompts for regular expression; files matching this are shared between a list
of sites, which are also prompted for.  The filenames must be identical on all
hosts (if they aren't, use `shadow-define-literal-group' instead of this
function).  Each site can be either a hostname or the name of a cluster (see
`shadow-define-cluster').
(defalias 'shadow-define-regexp-group #[0 "\301\302\303 \205 \304\305\303 !!\"\306\211\307 \211\262\203  B\262\202 \310\"B\311 \207" [shadow-regexp-groups read-string "Filename regexp: " buffer-file-name shadow-regexp-superquote file-local-name nil shadow-read-site shadow-make-group shadow-write-info-file] 6 (#$ . 20750) nil])
#@54 Interactive function to display shadows of a buffer.
(defalias 'shadow-shadows #[0 "\300\301\302\303 !\304#\305\306G\307U\203 \310\202 \"\207" [mapconcat cdr shadow-shadows-of buffer-file-name " " message "%s" 0 "No shadows."] 5 (#$ . 21483) nil])
#@329 Copy all pending shadow files.
With prefix argument, copy all pending files without query.
Pending copies are stored in variable `shadow-files-to-copy', and in
`shadow-todo-file' if necessary.  This function is invoked by
`shadow-save-buffers-kill-emacs', so it is not usually necessary to
call it manually.

(fn &optional ARG)
(defalias 'shadow-copy-files #[256 "\204 \301\302!\205 \303\304!\207\212\305\306\307\"\310\311$\210\312\313!)\207" [shadow-files-to-copy called-interactively-p interactive message "No files need to be shadowed." map-y-or-n-p make-closure #[257 "\300\206 	\206 \302\303A\"\207" [V0 shadow-noquery format "Copy shadow file %s? "] 4 "\n\n(fn PAIR)"] shadow-copy-file ("shadow" "shadows" "copy") shadow-write-todo-file t] 6 (#$ . 21742) "P"])
#@281 Cancel the instruction to copy some files.
Prompts for which copy operations to cancel.  You will not be asked to copy
them again, unless you make more changes to the files.  To cancel a shadow
permanently, remove the group from `shadow-literal-groups' or
`shadow-regexp-groups'.
(defalias 'shadow-cancel #[0 "\301\302\303\304$\210\305\306G\"\210\307 \207" [shadow-files-to-copy map-y-or-n-p #[257 "\300\301@A#\207" [format "Cancel copying %s to %s? "] 5 "\n\n(fn PAIR)"] #[257 "\300!\207" [shadow-remove-from-todo] 3 "\n\n(fn PAIR)"] ("shadow" "shadows" "cancel copy") message "There are %d shadows to be updated." shadow-write-todo-file] 5 (#$ . 22524) nil])
#@165 Make a description of a file group---
actually a list of regexp Tramp file names---from REGEXP (name of file to
be shadowed), and list of SITES.

(fn REGEXP SITES)
(defalias 'shadow-make-group #[514 "\211\205\274 \301\302@!!\303\304!\211\205\264 \203X \305!\203B \2066 \211\2056 \211\242>\2043 \306\307\310D\"\210\3118\262\312\305!!\262\202X \211\242>\204P \306\307\310D\"\210\313\233\211\240\266\203r \211\242>\204j \306\307\310D\"\210\311\233\211\240\266\211\242>\204\200 \306\307\310D\"\210\211A@\204\261 \314\315\242>\204\226 \306\307\310D\"\210\3138\242>\204\250 \306\307\310D\"\210\3118#\266\204\202\266 \316!\266\204\317A\"B\207" [cl-struct-tramp-file-name-tags shadow-parse-name shadow-site-primary nil copy-tramp-file-name file-remote-p signal wrong-type-argument tramp-file-name 6 tramp-dissect-file-name 4 format "/%s:%s" tramp-make-tramp-file-name shadow-make-group] 13 (#$ . 23197)])
#@31 Copy one shadow file.

(fn S)
(defalias 'shadow-copy-file #[257 "\301\302\303@!!!\2068 \304@!\204$ \305\306\307@\"!\203  \310!\210\311\2028 \312=\2044 \305\306\313@\"!\2058 \314@!\315A!\205X q\210\3161R \317\311\211#\210\310!0\207\210\320\321A\"\207" [shadow-noquery get-file-buffer abbreviate-file-name shadow-expand-file-name file-readable-p y-or-n-p format "Cannot find file %s--cancel copy request? " shadow-remove-from-todo nil t "No buffer for %s -- update shadow anyway? " find-file-noselect shadow-expand-cluster-in-file-name (error) write-region message "Shadow %s not updated!"] 7 (#$ . 24137)])
#@233 Return copy operations needed to update FILE.
Filename should have clusters expanded, but otherwise can have any format.
Return value is a list of dotted pairs like (from . to), where from
and to are absolute file names.

(fn FILE)
(defalias 'shadow-shadows-of #[257 "\305\"\206@ \306\307!\206 	\"\310!\311\312\313\"\314\315\n\316#\315\317#\"\"\f\2039 \320\321\307!	&\210\322#\266\203\207" [shadow-hashtable shadow-homedir shadow-literal-groups shadow-regexp-groups shadow-debug gethash shadow-expand-file-name shadow-local-file shadow-contract-file-name mapcar make-closure #[257 "\300B\207" [V0] 3 "\n\n(fn SHADOW)"] append shadow-shadows-of-1 nil t message "shadow-shadows-of: %s %s %s %s %s" puthash] 11 (#$ . 24763)])
#@133 Return list of FILE's shadows in GROUPS.
Consider them as regular expressions if third arg REGEXP is true.

(fn FILE GROUPS REGEXP)
(defalias 'shadow-shadows-of-1 #[771 "\205[ \302\303\304#@\"\305@\232\203 \306\202O \203N \307!\211\242>\204. \310\311\312D\"\210\3138\262	\203B \314\315\307	!$\210\316\303\317\"\"\262\202O \320A#\"\262\207" [cl-struct-tramp-file-name-tags shadow-debug cl-remove-if make-closure #[257 "\302\300\301#\207" [V0 V1 shadow-file-match] 5 "\n\n(fn X)"] append nil shadow-parse-name signal wrong-type-argument tramp-file-name 6 message "shadow-shadows-of-1: %s %s %s" mapcar #[257 "\301\300\"\207" [V0 shadow-replace-name-component] 4 "\n\n(fn X)"] shadow-shadows-of-1] 11 (#$ . 25515)])
#@75 If current buffer has shadows, add them to the list needing to be copied.
(defalias 'shadow-add-to-todo #[0 "\203 \304\305\306p!\307\306p!!#\210\310\307\306p!!!\2035 \304\311	\312\313\314\"\315\216\n\316 \210)r\nq\210\317 +$\210\211\203S \320	\321\322$\237\204P \304\323\324\325!\"\210\326\327!\210\330 \210\210\331\207" [shadow-debug shadow-files-to-copy standard-output shadow-inhibit-message message "shadow-add-to-todo: %s %s" buffer-file-name shadow-expand-file-name shadow-shadows-of "shadow-add-to-todo: %s %s\n%s" generate-new-buffer " *string-output*" t #[0 "\301!\207" [standard-output kill-buffer] 2] backtrace buffer-string cl-union :test equal "%s" substitute-command-keys "Use \\[shadow-copy-files] to update shadows." sit-for 1 shadow-write-todo-file nil] 8 (#$ . 26264)])
#@108 Remove PAIR from `shadow-files-to-copy'.
PAIR must be `eq' to one of the elements of that list.

(fn PAIR)
(defalias 'shadow-remove-from-todo #[257 "\203 \303\304	\305\306\307\"\310\216\n\311 \210)r\nq\210\312 +$\210\313\314\315\"	\"\211\207" [shadow-debug shadow-files-to-copy standard-output message "shadow-remove-from-todo: %s %s\n%s" generate-new-buffer " *string-output*" t #[0 "\301!\207" [standard-output kill-buffer] 2] backtrace buffer-string cl-remove-if make-closure #[257 "\211\300=\207" [V0] 3 "\n\n(fn S)"]] 8 (#$ . 27069)])
#@174 Visit and load `shadow-info-file' and `shadow-todo-file'.
Thus restores shadowfile's state from your last Emacs session.
Return t unless files were locked; then return nil.
(defalias 'shadow-read-files #[0 "\304!;\204 \304	!;\203 \305\306!\210\307 \210\310\311!\210\312\207r\203H \313\314\"\211q\210\315 \204E \316\317 \"\203E \320 \210\305\321\322\317 !@\"\210\310\323!\210\324 \210	\203u \313	\314\"\211q\210\315 \204q \316\317 	\"\203q \320 \210\305\321\322\317 !@\"\210\310\323!\210\324\312!\210\325 \210)\326\207" [shadow-info-file shadow-todo-file shadow-info-buffer shadow-todo-buffer file-locked-p message "Shadowfile is running in another Emacs; can't have two." beep sit-for 3 nil find-file-noselect nowarn buffer-modified-p file-newer-than-file-p make-auto-save-file-name erase-buffer "Data recovered from %s." insert-file-contents 1 eval-buffer shadow-invalidate-hashtable t] 4 (#$ . 27624) nil])
#@154 Write out information to `shadow-info-file'.
Also clear `shadow-hashtable', since when there are new shadows
defined, the old hashtable info is invalid.
(defalias 'shadow-write-info-file #[0 "\303 \210\205% r	\204 \304!	q\210\305ed|\210\306\307!\210\306\310!\210\306\311!)\207" [shadow-info-file shadow-info-buffer buffer-read-only shadow-invalidate-hashtable find-file-noselect nil shadow-insert-var shadow-clusters shadow-literal-groups shadow-regexp-groups] 2 (#$ . 28548)])
#@112 Write out information to `shadow-todo-file'.
With non-nil argument also saves the buffer.

(fn &optional SAVE)
(defalias 'shadow-write-todo-file #[256 "\212\204	 \303	!q\210\304ed|\210\305\306!\210\211\205 \307 )\207" [shadow-todo-buffer shadow-todo-file buffer-read-only find-file-noselect nil shadow-insert-var shadow-files-to-copy shadow-save-todo-file] 3 (#$ . 29038)])
(defalias 'shadow-save-todo-file #[0 "\203 \303\304\305\306\307\"\310\216	\311 \210)r	q\210\312 +\"\210\n\205= \313\n!\205= r\nq\210\31414 \315 0\202< \210\303\316!\210\317\320!)\207" [shadow-debug standard-output shadow-todo-buffer message "shadow-save-todo-file:\n%s" generate-new-buffer " *string-output*" t #[0 "\301!\207" [standard-output kill-buffer] 2] backtrace buffer-string buffer-modified-p (error) basic-save-buffer "WARNING: Can't save shadow todo file; it is locked!" sit-for 1] 5])
(defalias 'shadow-invalidate-hashtable #[0 "\301!\207" [shadow-hashtable clrhash] 2])
#@223 Build a `setq' to restore VARIABLE.
Prettily insert a `setq' command which, when later evaluated,
will restore VARIABLE to its current setting.
VARIABLE must be the name of a variable whose value is a list.

(fn VARIABLE)
(defalias 'shadow-insert-var #[257 "p\301\302\"c\210\211J:\2034 \303c\210\304J@!\210\211JA\211\203- \305c\210\304@!\210\211A\262\202 \306c\262\202> \307c\210\304J!\210\310c)\207" [standard-output format "(setq %s" "\n  '(" prin1 "\n    " "))\n\n" " " ")\n\n"] 4 (#$ . 30013)])
#@311 Offer to save each buffer and copy shadows, then kill this Emacs process.
With prefix arg, silently save all file-visiting buffers, then kill.

Extended by shadowfile to automatically save `shadow-todo-file' and
look for files that have been changed and need to be copied to other systems.

(fn &optional ARG)
(defalias 'shadow-save-buffers-kill-emacs #[256 "\300!\210\301!\207" [shadow--save-buffers-kill-emacs save-buffers-kill-emacs] 3 (#$ . 30527) "P"])
#@30 

(fn &optional ARG &rest _)
(defalias 'shadow--save-buffers-kill-emacs #[384 "\300 \210\301\302\"\210\303 \210\300 \207" [shadow-save-todo-file save-some-buffers t shadow-copy-files] 5 (#$ . 30993)])
#@24 Set up file shadowing.
(defalias 'shadow-initialize #[0 "\305\306!!\306	!\306\n!\307 \204 \310\311!\210\312 \210\313\314!\207\204( \315\316\317\320#\210\321\322\323\"\210\324\f\325\326#\207" [shadow-homedir shadow-info-file shadow-todo-file shadow-inhibit-overload ctl-x-4-map file-name-as-directory shadow-expand-file-name shadow-read-files message "Shadowfile information files not found - aborting" beep sit-for 3 advice-add save-buffers-kill-emacs :before shadow--save-buffers-kill-emacs add-hook write-file-functions shadow-add-to-todo define-key "s" shadow-copy-files] 4 (#$ . 31201) nil])
(defalias 'shadowfile-unload-function #[0 "\301\302\303#\210\304\305\306\"\210\303\207" [ctl-x-4-map substitute-key-definition shadow-copy-files nil advice-remove save-buffers-kill-emacs shadow--save-buffers-kill-emacs] 4])
#@79 Add members of list A to list B if not equal to items already in B.

(fn A B)
(defalias 'shadow-union #[514 "\300\301\302$\237\207" [cl-union :test equal] 7 (#$ . 32034)])
(byte-code "\300\301\302\303#\210\304\305\306\307#\210\300\305\306\303#\210\310\311!\207" [make-obsolete shadow-union cl-union "28.1" defalias shadow-find seq-find nil provide shadowfile] 4)
