;ELC   
;;; Compiled by pot@pot.cnuce.cnr.it on Tue Mar 18 15:51:59 2003
;;; from file /home/pot/gnu/emacs-pretest.new/lisp/shadowfile.el
;;; in Emacs version 21.3
;;; with bytecomp version 2.85.4.1
;;; with all optimizations.

;;; This file uses dynamic docstrings, first added in Emacs 19.29.
(if (and (boundp 'emacs-version)
	 (< (aref emacs-version (1- (length emacs-version))) ?A)
	 (or (and (boundp 'epoch::version) epoch::version)
	     (string-lessp emacs-version "19.29")))
    (error "`shadowfile.el' was compiled for Emacs 19.29 or later"))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


(byte-code "\300\301!\210\302\303\304\305\306\307\310\311\312\313&	\207" [require ange-ftp custom-declare-group shadow nil "Automatic file copying when saving a file." :prefix "shadow-" :link (emacs-commentary-link "shadowfile") :group files] 10)
#@166 *If t, always copy shadow files without asking.
If nil (the default), always ask.  If not nil and not t, ask only if there
is no buffer currently visiting the file.
(custom-declare-variable 'shadow-noquery 'nil '(#$ . -870) :type '(choice (const t) (const nil) (other :tag "Ask if no buffer" maybe)) :group 'shadow)
#@65 *If nonnil, do not display a message when a file needs copying.
(custom-declare-variable 'shadow-inhibit-message 'nil '(#$ . -1192) :type 'boolean :group 'shadow)
#@204 If nonnil, shadowfile won't redefine \[save-buffers-kill-emacs].
Normally it overloads the function `save-buffers-kill-emacs' to check
for files have been changed and need to be copied to other systems.
(custom-declare-variable 'shadow-inhibit-overload 'nil '(#$ . 1362) :type 'boolean :group 'shadow)
#@144 File to keep shadow information in.
The `shadow-info-file' should be shadowed to all your accounts to
ensure consistency.  Default: ~/.shadows
(custom-declare-variable 'shadow-info-file 'nil '(#$ . 1671) :type '(choice (const nil) file) :group 'shadow)
#@354 File to store the list of uncopied shadows in.
This means that if a remote system is down, or for any reason you cannot or
decide not to copy your shadow files at the end of one Emacs session, it will
remember and ask you again in your next Emacs session.
This file must NOT be shadowed to any other system, it is host-specific.
Default: ~/.shadow_todo
(custom-declare-variable 'shadow-todo-file 'nil '(#$ . 1931) :type '(choice (const nil) file) :group 'shadow)
#@40 The complete hostname of this machine.
(defvar shadow-system-name (system-name) (#$ . 2400))
#@38 Your home directory on this machine.
(defvar shadow-homedir nil (#$ . 2499))
#@54 List of host clusters (see `shadow-define-cluster').
(defvar shadow-clusters nil (#$ . 2582))
#@139 List of files that are shared between hosts.
This list contains shadow structures with literal filenames, created by
shadow-define-group.
(defvar shadow-literal-groups nil (#$ . 2683))
#@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 (#$ . 2875))
(byte-code "\301B\305\301!\204\f \306\302B\305\302!\204 \306\303B\305\303!\204$ \306\304B\305\304!\2040 \306\306\207" [current-load-list shadow-files-to-copy shadow-hashtable shadow-info-buffer shadow-todo-buffer boundp nil] 2)
#@69 Add members of list A to list B if not equal to items already in B.
(defalias 'shadow-union #[(a b) "\204 	\207@	\235\203 \302A	\"\207\302A@	B\"\207" [a b shadow-union] 4 (#$ . 3329)])
#@79 If FUNC applied to some element of LIST is nonnil, return first such element.
(defalias 'shadow-find #[(func list) "\203 	@!\204 A\211\204 @\207" [list func] 3 (#$ . 3527)])
#@123 Remove elements satisfying FUNC from LIST.
Nondestructive; actually returns a copy of the list with the elements removed.
(defalias 'shadow-remove-if #[(func list) "\205 	@!\203 \302	A\"\207@\302	A\"B\207" [list func shadow-remove-if] 4 (#$ . 3716)])
#@68 Concatenate elements of the list of STRINGS with SEP between each.
(defalias 'shadow-join #[(strings sep) "\204 \302\207A\204 @\207@\303\304A	\"Q\207" [strings sep "" " " shadow-join] 5 (#$ . 3980)])
#@99 Like `regexp-quote', but includes the ^ and $.
This makes sure regexp matches nothing but STRING.
(defalias 'shadow-regexp-superquote #[(string) "\301\302!\303Q\207" [string "^" regexp-quote "$"] 3 (#$ . 4193)])
#@127 If PREFIX begins STRING, return the rest.
Return value is nonnil if PREFIX and STRING are string= up to the length of
PREFIX.
(defalias 'shadow-suffix #[(prefix string) "G	G\nY\205 	\304O\230\205 	\305O*\207" [prefix string ls lp 0 nil] 4 (#$ . 4413)])
#@309 Create a shadow cluster.
It is called NAME, uses the PRIMARY hostname and REGEXP matching all
hosts in the cluster.  The variable `shadow-clusters' associates the
names of clusters to these structures.  This function is for program
use: to create clusters interactively, use `shadow-define-cluster'
instead.
(defalias 'shadow-make-cluster #[(name primary regexp) "	\nE\207" [name primary regexp] 3 (#$ . 4682)])
#@33 Return the name of the CLUSTER.
(defalias 'shadow-cluster-name '(macro . #[(cluster) "\301\302E\207" [cluster elt 0] 3 (#$ . 5101)]))
#@43 Return the primary hostname of a CLUSTER.
(defalias 'shadow-cluster-primary '(macro . #[(cluster) "\301\302E\207" [cluster elt 1] 3 (#$ . 5242)]))
#@48 Return the regexp matching hosts in a CLUSTER.
(defalias 'shadow-cluster-regexp '(macro . #[(cluster) "\301\302E\207" [cluster elt 2] 3 (#$ . 5396)]))
#@197 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.
(defalias 'shadow-set-cluster #[(name primary regexp) "\305\306\"\307\n\f#	B\211)\207" [shadow-clusters rest name primary regexp shadow-remove-if #[(x) "	@\232\207" [name x] 2] shadow-make-cluster] 4 (#$ . 5555)])
#@36 Return cluster named NAME, or nil.
(defalias 'shadow-get-cluster '(macro . #[(name) "\301\302E\207" [name assoc shadow-clusters] 3 (#$ . 5976)]))
#@67 If SITE is a cluster, return primary host, otherwise return SITE.
(defalias 'shadow-site-primary #[(site) "\303	\"\211\203 \n\304\234\202 )\207" [site shadow-clusters c assoc 1] 4 (#$ . 6129)])
#@75 Given a SITE (hostname or cluster name), return cluster it is in, or nil.
(defalias 'shadow-site-cluster #[(site) "\302	\"\206 \303\304	\"\207" [site shadow-clusters assoc shadow-find #[(x) "\302\303\234	\"\207" [x site string-match 2] 3]] 3 (#$ . 6334)])
#@54 Read a cluster name or hostname from the minibuffer.
(defalias 'shadow-read-site #[nil "\302\303\"\211\304\232?\205 	)\207" [shadow-clusters ans completing-read "Host or cluster name [RET when done]: " ""] 4 (#$ . 6599)])
#@160 Nonnil iff 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.
(defalias 'shadow-site-match #[(site1 site2) "	\230\206  \305\n\"\306	!\203 \307\310\234\f\"\202 \f\230*\207" [site1 site2 shadow-clusters cluster1 primary2 assoc shadow-site-primary string-match 2] 3 (#$ . 6831)])
#@41 Return the default username for a SITE.
(defalias 'shadow-get-user #[(site) "\301\302!!\207" [site ange-ftp-get-user shadow-site-primary] 3 (#$ . 7220)])
#@143 Parse FULLPATH into (site user path) list.
Leave it alone if it already is one.  Returns nil if the argument is
not a full ange-ftp pathname.
(defalias 'shadow-parse-fullpath #[(fullpath) "<\203 \207\301!\207" [fullpath ange-ftp-ftp-name] 2 (#$ . 7382)])
#@118 Parse any PATH into (site user path) list.
Argument can be a simple path, full ange-ftp path, or already a hup list.
(defalias 'shadow-parse-path #[(path) "\302!\206 	\303 E\207" [path shadow-system-name shadow-parse-fullpath user-login-name] 3 (#$ . 7648)])
#@124 Make an ange-ftp style fullpath out of HOST, USER (optional), and PATH.
This is probably not as general as it ought to be.
(defalias 'shadow-make-fullpath #[(host user path) "\303\205 \304P	\305\n\260\207" [user host path "/" "@" ":"] 5 (#$ . 7917)])
(put 'shadow-make-fullpath 'byte-optimizer 'byte-compile-inline-expand)
#@65 Return FULLPATH with the pathname component changed to NEWPATH.
(defalias 'shadow-replace-path-component #[(fullpath newpath) "\306!\211@	A@\n\307\f\205 \f\310P\311\260,\207" [fullpath hup newpath path user host shadow-parse-fullpath "/" "@" ":"] 6 (#$ . 8250)])
#@130 If FILE is at this site, remove /user@host part.
If refers to a different system or a different user on this system,
return nil.
(defalias 'shadow-local-file #[(file) "\303!\211\204\f \202$ \304	@\n\"\203# 	A@\305 \230\203# \306	8\202$ \307)\207" [file hup shadow-system-name shadow-parse-fullpath shadow-site-match user-login-name 2 nil] 4 (#$ . 8529)])
#@134 If hostname part of FILE is a cluster, expand it to cluster's primary hostname.
Will return the pathname bare if it is a local file.
(defalias 'shadow-expand-cluster-in-file-name #[(file) "\306!\307\211\204 \202/ \310\n!\206/ \311\n@!\nA@\312\n8\313\f\205) \f\314P\315\260+*\207" [file cluster hup path user host shadow-parse-path nil shadow-local-file shadow-site-primary 2 "/" "@" ":"] 6 (#$ . 8894)])
#@44 Expand file name and get file's true name.
(defalias 'shadow-expand-file-name #[(file &optional default) "\302\303	\"!\207" [file default file-truename expand-file-name] 4 (#$ . 9315)])
#@162 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.
(defalias 'shadow-contract-file-name #[(file) "\306!\307	!\203 \n\202- \310\311\312\313	@	A@\314\315\f\205# \f\316P\317\260+!!8!\320\311	8\"\321	@!\211\203I \322\234\202K 	@	A@\203Z \323P\202] \311	8\315\f\205h \f\316P\317\260.\207" [file hup shadow-homedir path user host shadow-parse-path shadow-local-file file-name-as-directory 2 shadow-parse-fullpath expand-file-name "~" "/" "@" ":" shadow-suffix shadow-site-cluster 0 "~/" homedir suffix cluster] 10 (#$ . 9509)])
#@236 True if the site of PATTERN and of FILE are on the same site.
If usernames are supplied, they must also match exactly.  PATTERN and FILE may
be lists of host, user, path, or ange-ftp pathnames.  FILE may also be just a
local filename.
(defalias 'shadow-same-site #[(pattern file) "\304!\305	!\306@\n@\"\205 A@?\206 A@\nA@\230*\207" [pattern file file-sup pattern-sup shadow-parse-fullpath shadow-parse-path shadow-site-match] 3 (#$ . 10178)])
#@405 Return t if PATTERN matches FILE.
If REGEXP is supplied and nonnil, the pathname part of the pattern is a regular
expression, otherwise it must match exactly.  The sites and usernames must
match---see shadow-same-site.  The pattern must be in full ange-ftp 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.
(defalias 'shadow-file-match #[(pattern file &optional regexp) "\305!\306\n!\307	\"\205% \f\203 \310\311	8\3118\"\202% \311	8\3118\230*\207" [pattern pattern-sup file file-sup regexp shadow-parse-fullpath shadow-parse-path shadow-same-site string-match 2] 4 (#$ . 10636)])
#@373 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.
(defalias 'shadow-define-cluster #[(name) "\306	\"\307\310\n\203 \n\311\234\202 \"\312\313\307\314\n\203# \n\315\234\202& \316!\"\211\"\2049 \317\320!\210\321\315!\210\202 \f)\322#+\207" [name shadow-clusters old primary try-regexp regexp assoc read-string "Primary host: " 1 nil string-match "Regexp matching all host names: " 2 shadow-regexp-superquote message "Regexp doesn't include the primary host!" sit-for shadow-set-cluster] 5 (#$ . 11327) (list (completing-read "Cluster name: " shadow-clusters nil nil))])
#@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 #[nil "\306\307\310 !!\3118\312\312\312\313 \211\203L \314\315\316\317!\"!\314\320	\"\n\321\230\2033 \317!\2024 \n	\322\n\205@ \n\323P\324	\260+\fB\202 \fB-\325 \207" [hup path user site group host shadow-parse-fullpath shadow-contract-file-name buffer-file-name 2 nil shadow-read-site read-string format "Username [default %s]: " shadow-get-user "Filename: " "" "/" "@" ":" shadow-write-info-file shadow-literal-groups] 5 (#$ . 12238) nil])
#@378 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-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 #[nil "\305\306\307 \205 \310\311\312\313\307 !!8!\"\314\211\211\315 \211\2033 \n	B\305\316\317\n\"\320\n!\"B\202 \321	#\fB\322 ,\207" [usernames sites site regexp shadow-regexp-groups read-string "Filename regexp: " buffer-file-name shadow-regexp-superquote 2 shadow-parse-path shadow-contract-file-name nil shadow-read-site format "Username for %s: " shadow-get-user shadow-make-group shadow-write-info-file] 7 (#$ . 13021) nil])
#@54 Interactive function to display shadows of a buffer.
(defalias 'shadow-shadows #[nil "\301\302\303\304\305 !\"\306\"\307\310\311G!\203 \312\202 \")\207" [msg shadow-join mapcar cdr shadow-shadows-of buffer-file-name " " message "%s" zerop "No shadows."] 5 (#$ . 13887) nil])
#@309 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.
(defalias 'shadow-copy-files #[(&optional arg) "\204\f t\203\f \301\302!\207\212\303\304\305\306$\210\307\310!)\207" [shadow-files-to-copy message "No files need to be shadowed." map-y-or-n-p #[(pair) "\206 	\206 \303\304\nA\"\207" [arg shadow-noquery pair format "Copy shadow file %s? "] 3] shadow-copy-file ("shadow" "shadows" "copy") shadow-write-todo-file t] 5 (#$ . 14174) "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 #[nil "\301\302\303\304$\210\305\306G\"\210\307 \207" [shadow-files-to-copy map-y-or-n-p #[(pair) "\301\302@A#\207" [pair format "Cancel copying %s to %s? "] 4] #[(pair) "\301!\207" [pair shadow-remove-from-todo] 2] ("shadow" "shadows" "cancel copy") message "There are %d shadows to be updated." shadow-write-todo-file] 5 (#$ . 14878) nil])
#@196 Make a description of a file group---
actually a list of regexp ange-ftp file names---from REGEXP (name of file to
be shadowed), list of SITES, and corresponding list of USERNAMES for each
site.
(defalias 'shadow-make-group #[(regexp sites usernames) "\205\" @	@\n\306\f\205 \f\307P\310\260+\311\nA	A#B\207" [sites usernames regexp path user host "/" "@" ":" shadow-make-group] 5 (#$ . 15537)])
#@23 Copy one shadow file.
(defalias 'shadow-copy-file #[(s) "\304\305\306@!!!\2068 \307@!\204$ \310\311\312@\"!\203  \313!\210\314\2028 	\315=\2044 \310\311\316@\"!\2058 \317@!\320A!\n\205M \nq\210\214~\210\321\322\323\217)*\207" [s shadow-noquery buffer to 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 i (byte-code "\302ed#\210\303	!\207" [to s write-region shadow-remove-from-todo] 4) ((error (byte-code "\301\302A\"\207" [s message "Shadow %s not updated!"] 3)))] 4 (#$ . 15948)])
#@222 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.
(defalias 'shadow-shadows-of #[(file) "\306	\"J\2061 \307\310!\206 \n\"\311!\312\313\314\315\f\316#\315\f\317#\"\"\320	\"L+\207" [file shadow-hashtable shadow-homedir absolute-file canonical-file shadow-literal-groups intern-soft shadow-expand-file-name shadow-local-file shadow-contract-file-name mapcar #[(shadow) "	B\207" [absolute-file shadow] 2] append shadow-shadows-of-1 nil t intern shadow-regexp-groups shadows] 8 (#$ . 16668)])
#@108 Return list of FILE's shadows in GROUPS.
Consider them as regular expressions if third arg REGEXP is true.
(defalias 'shadow-shadows-of-1 #[(file groups regexp) "\2051 \305\306@\"\307	@\232\203 \310\202) \n\203( \311\312!8\313\314	\")\202) 	\315A\n#\")\207" [groups nonmatching regexp file realpath shadow-remove-if #[(x) "\303	\n#\207" [x file regexp shadow-file-match] 4] append nil 2 shadow-parse-fullpath mapcar #[(x) "\302	\"\207" [x realpath shadow-replace-path-component] 3] shadow-shadows-of-1] 6 (#$ . 17350)])
#@75 If current buffer has shadows, add them to the list needing to be copied.
(defalias 'shadow-add-to-todo #[nil "\303\304\305p!!!\211\203# \306	\"\n\204  \307\310\311\312!\"\210\313\314!\210\315 \210)\316\207" [shadows shadow-files-to-copy shadow-inhibit-message shadow-shadows-of shadow-expand-file-name buffer-file-name shadow-union message "%s" substitute-command-keys "Use \\[shadow-copy-files] to update shadows." sit-for 1 shadow-write-todo-file nil] 5 (#$ . 17887)])
#@97 Remove PAIR from `shadow-files-to-copy'.
PAIR must be (eq to) one of the elements of that list.
(defalias 'shadow-remove-from-todo #[(pair) "\301\302\"\211\207" [shadow-files-to-copy shadow-remove-if #[(s) "	=\207" [s pair] 2]] 3 (#$ . 18368)])
#@176 Visit and load `shadow-info-file' and `shadow-todo-file'.
Thus restores shadowfile's state from your last Emacs session.
Returns t unless files were locked; then returns nil.
(defalias 'shadow-read-files #[nil "\304\305!\203! \305!;\204 \305	!;\203! \306\307!\210\310 \210\311\312!\210\313\207\212\203M \314!\211q\210\315 \204J \316\317 \"\203J \320 \210\306\321\322\317 !@\"\210\311\323!\210\324 \210	\203y \314	!\211q\210\315 \204u \316\317 	\"\203u \320 \210\306\321\322\317 !@\"\210\311\323!\210\324\313!\210\325 \210)\326\207" [shadow-info-file shadow-todo-file shadow-info-buffer shadow-todo-buffer fboundp file-locked-p message "Shadowfile is running in another emacs; can't have two." beep sit-for 3 nil find-file-noselect buffer-modified-p file-newer-than-file-p make-auto-save-file-name erase-buffer "Data recovered from %s." insert-file-contents 1 eval-current-buffer shadow-invalidate-hashtable t] 4 (#$ . 18623) 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 #[nil "\302 \210\205# \212	\204 \303!	q\210ed|\210\304\305!\210\304\306!\210\304\307!)\207" [shadow-info-file shadow-info-buffer shadow-invalidate-hashtable find-file-noselect shadow-insert-var shadow-clusters shadow-literal-groups shadow-regexp-groups] 2 (#$ . 19568)])
#@88 Write out information to shadow-todo-file.
With nonnil argument also saves the buffer.
(defalias 'shadow-write-todo-file #[(&optional save) "\212\204	 \303	!q\210ed|\210\304\305!\210\n\205 \306 )\207" [shadow-todo-buffer shadow-todo-file save find-file-noselect shadow-insert-var shadow-files-to-copy shadow-save-todo-file] 2 (#$ . 20036)])
(defalias 'shadow-save-todo-file #[nil "\205 \301!\205 \212q\210\302\303\304\217)\207" [shadow-todo-buffer buffer-modified-p nil (basic-save-buffer) ((error (byte-code "\300\301!\210\302\303!\207" [message "WARNING: Can't save shadow todo file; it is locked!" sit-for 1] 2)))] 3])
(defalias 'shadow-invalidate-hashtable #[nil "\301\302\303\"\211\207" [shadow-hashtable make-vector 37 0] 3])
#@176 Prettily insert a setq command for VARIABLE.
which, when later evaluated, will restore it to its current setting.
SYMBOL must be the name of a variable whose value is a list.
(defalias 'shadow-insert-var #[(variable) "p\303\304	\"c\210\305	!:\2037 \306c\210\307\305	!@!\210\305	!A\211\2031 \310c\210\307\n@!\210\nA\211\204\" \311c)\202B \312c\210\307\305	!!\210\313c)\207" [standard-output variable rest format "(setq %s" eval "\n  '(" prin1 "\n    " "))\n\n" " " ")\n\n"] 4 (#$ . 20785)])
#@291 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.
(defalias 'shadow-save-buffers-kill-emacs #[(&optional arg) "\304 \210\305\306\"\210\307 \210\304 \210\306\310\311\312 \">\203 \313\314!\205] \315\316!\203[ \316 \317\211\203O \320\n@!\321>\203H \322\n@!\322\n@\"\210)\203H \306\nA\211\204- 	?\206W \313\323!*\205] \324 \207" [arg active processes val shadow-save-todo-file save-some-buffers t shadow-copy-files mapcar #[(buf) "\301!\205	 \302!\207" [buf buffer-file-name buffer-modified-p] 2] buffer-list yes-or-no-p "Modified buffers exist; exit anyway? " fboundp process-list nil process-status (run stop open) process-kill-without-query "Active processes exist; kill them and exit anyway? " kill-emacs] 5 (#$ . 21285) "P"])
#@24 Set up file shadowing.
(defalias 'shadow-initialize #[nil "\204\n \305\306\307!!	\204 \306\310!\n\204 \306\311!\312 \204* \313\314!\210\315 \210\316\317!\207\204? \320\321!\204? \322\321\323K\"\210\322\323\324\"\210\325\326\327\"\210\330\f\331\332#\207" [shadow-homedir shadow-info-file shadow-todo-file shadow-inhibit-overload ctl-x-4-map file-name-as-directory shadow-expand-file-name "~" "~/.shadows" "~/.shadow_todo" shadow-read-files message "Shadowfile information files not found - aborting" beep sit-for 3 fboundp shadow-orig-save-buffers-kill-emacs defalias save-buffers-kill-emacs shadow-save-buffers-kill-emacs add-hook write-file-hooks shadow-add-to-todo define-key "s" shadow-copy-files] 4 (#$ . 22269) nil])
(defalias 'shadowfile-unload-hook #[nil "\300\301!\203 \302\301KM\210\303\304\305\"\207" [fboundp shadow-orig-save-buffers-kill-emacs save-buffers-kill-emacs remove-hook write-file-hooks shadow-add-to-todo] 3])
(provide 'shadowfile)
