mkprocessrmf () {
    srcdef () {
        awk '
            BEGIN {
                i=0;
            }
            /^p / {
                if (match($0,/ E[^ ]+/))
                    print "EPAN="substr($0,RSTART+2,RLENGTH-2);
            }
            /^i / {
                if (match($0," n\"?"SRC"\"?")) {
                    print "ISRC="i;
                    if (match($0,/ Eev[^ ]+/))
                        print "ESRC="substr($0,RSTART+4,RLENGTH-4);
                    nextfile
                }
                ++i;
            }
        ' SRC=${SRC} ${DST}.pto
    }
    prologue () {
        cat <<EOT
DST?=${DST}

CPUS?=${CPUS}
MEM?=${MEM}
DEPTH?=${DEPTH}
IMCOMP?=${IMCOMP}
ENCOMP?=${ENCOMP}
RGBPROFILE?=${RGBPROFILE}
sRGBPROFILE?=${sRGBPROFILE}

CONV?=${CONV}
REMAP?=${REMAP}
FFUSE?=${FFUSE}
MERGE?=${MERGE}
DEGHOST?=${DEGHOST}
BLEND?=${BLEND} ${f}

EXIFTFF?=${EXIFTFF}
EXIFTAG?=-EXIF:ShutterSpeedValue -EXIF:ApertureValue -EXIF:ISO

RM=${RM}
MV=mv
LN=ln -f

all: \${DST}.tiff

EOT
    }
    epilogue () {
        cat <<EOT

tmp.tiff: ${BLIN}
	@\${RM} ${RMIN}
	@\${BLEND} -o tmp.tiff ${BLIN}
	@\${RM} ${BLIN}
EOT
    }
    epilogueLDR1 () {
        cat <<EOT
\${DST}.tiff: tmp.tiff
	@\${CONV} tmp.tiff \\
		+matte +repage ${DARG} \\
		-compress \${IMCOMP} \${DST}.tiff
	@\${RM} tmp.tiff
EOT
    }
    epilogueHDR1 () {
        bright=-1.67
        light=0.35
        chrom=0.95
        r=0.9500
        g=0.7000
        b=1.2000
        cat <<EOT
\${DST}.tiff: tmp.tiff
	@pfsin tmp.tiff \\
	 | pfsclamp --min 1e-20: --max 1e+20 \\
	 | pfswb -v -r ${r} -g ${g} -b ${b} \\
	 | pfstmo_reinhard05 -v -b ${bright} -c ${chrom} -l ${light} \\
	 | pfsoutimgmagick -s -b 16 \${DST}.tiff
	@\${RM} tmp.tiff
	@\${CONV} \${DST}.tiff \\
		+matte +repage ${DARG} \\
		-compress \${IMCOMP} \${DST}.tiff
EOT
    }
    epilogueHDR2 () {
        bright=1.33
        light=0.50
        chrom=0.95
        #[ "${K}" = a ] && {
        #    bright=1.33
        #}
        #[ "${K}" = b ] && {
        #    bright=-5.00
        #    light=0.30
        #}
        #[ "${K}" = b ] && bright=-1.50
        #[ "${K}" = b ] && light=0.9625
        cat <<EOT

\${DST}.tiff: tmp.tiff
	@pfsin tmp.tiff \\
	 | pfsclamp --min 4 --max 65536 \\
	 | pfswb -v -r 1.0500 -g 1.0000 -b 0.9750 \\
	 | pfstmo_mantiuk08 -v -d pd=crt -c 0.9 -e 0.75 \\
	 | pfsoutimgmagick -b 16 \${DST}.0.tiff
	@pfsin tmp.tiff \\
	 | pfsclamp --min 4 --max 65536 \\
	 | pfswb -v -r 1.0500e-04 -g 1.0000e-04 -b 0.9750e-04 \\
	 | pfstmo_reinhard05 -v -b ${bright} -c ${chrom} -l ${light} \\
	 | pfsoutimgmagick -s -b 16 \${DST}.1.tiff
	@\${RM} tmp.tiff
	@\${CONV} \${DST}.0.tiff \\
		-colorspace HSL -channel B -separate \\
		-compress \${IMCOMP} \${DST}.2.tiff
	@\${CONV} \${DST}.2.tiff \\
		-negate \\
		+level 0%,90%,1.0 \\
		-compress \${IMCOMP} \${DST}.3.tiff
	@\${CONV} \${DST}.2.tiff \${DST}.3.tiff \\
		-compose lighten -composite \\
		-level 49%,100%,1.2 \\
		+level 0%,98%,1.0 \\
		-compress \${IMCOMP} \${DST}.4.tiff
	@\${CONV} \${DST}.1.tiff \${DST}.4.tiff \\
		-compose copy-opacity -composite \\
		-compress \${IMCOMP} \${DST}.5.tiff
	@\${CONV} \${DST}.0.tiff \${DST}.5.tiff \\
		-compose src-over -composite \\
		+matte +repage ${DARG} \\
		-compress \${IMCOMP} \${DST}.tiff
	@\${RM} \${DST}.0.tiff \${DST}.1.tiff \\
		\${DST}.2.tiff \${DST}.3.tiff \\
		\${DST}.4.tiff \${DST}.5.tiff
EOT
    }
    remap () {
        SRC="${NAM}${ESF}${FSF}.tiff"
        eval "EV=\${EV${e}}; SEV=\${EV${e}S${s}}"
        eval "$(srcdef)"
        [ -n "${ISRC}" ] || return 1
        [ ${nexp} -gt 1 ] || ESRC="${EPAN}"
        [ -z "${EV}" ] || ESRC="${EV}"
        [ -z "${SEV}" ] || ESRC="${SEV}"
        [ -z "${ESRC}" ] || ESRC="-e ${ESRC}"
        t=$(printf 'tmp-%04d.%s' ${ISRC} ${TMPSFX})
        m=''
        [ "${PROCESS}" = HDR ] \
        && m=$(printf ' tmp-%04d_gray.pgm' ${ISRC})
        cat <<EOT
${t}: \${DST}.pto ${SRC}
	@\${REMAP} -i ${ISRC} ${ESRC} \${DST}.pto
EOT
        RMIN="${RMIN} ${SRC}${m}"
        n="${SRC}"
        SRC="tmpf${NAM}${ESF}${FSF}.tiff"
        cat <<EOT
${SRC}: ${t}
EOT
        eval "TARGE=\${TARGE${e}F}; TARGSE=\${TARG${s}E${e}F}; TARGSEF=\${TARG${s}E${e}F${f}}"
        XTARG=''
        #[ -z "${LIN}" ] \
        #|| XTARG="${XTARG} ${sRGB}"
        [ -z "${TARGE}" ] \
        || XTARG="${XTARG} ${TARGE}"
        [ -z "${TARGSE}" ] \
        || XTARG="${XTARG} ${TARGSE}"
        [ -z "${TARGSEF}" ] \
        || XTARG="${XTARG} ${TARGSEF}"
        if [ -n "${XTARG}" ]
        then
            cat <<EOT
	@\${CONV} ${t} \\
		${XTARG} \\
		-compress \${IMCOMP} ${SRC}
EOT
        else
            cat <<EOT
	@\${LN} ${t} ${SRC}
EOT
        fi
        [ "${PROCESS}" = HDR ] && cat <<EOT
	@\${EXIFTFF} ${n} \${EXIFTAG} ${SRC}
EOT
        cat <<EOT
	@\${RM} ${t}
EOT
        FFIN="${FFIN} ${SRC}"
    }
    fstack () {
        t="${FFIN}"
        if [ "$(echo "${t}" | wc -w)" -gt 1 ]
        then
            t="tmpet${NAM}${ESF}.tiff"
            cat <<EOT
${t}: ${FFIN}
	@\${FFUSE} -o ${t} ${FFIN}
EOT
            [ "${PROCESS}" = HDR ] && cat <<EOT
	@\${EXIFTFF} ${FFIN%% *} \${EXIFTAG} ${t}
EOT
            cat <<EOT
	@\${RM} ${FFIN}
EOT
        fi
        SRC="tmpe${NAM}${ESF}.tiff"
        eval "PATCH=\${PATCH${s}E${e}}"
        ifs="${IFS}"; IFS=:
        set -- ${PATCH}
        IFS=${ifs}; unset ifs
        ps=''
        ap=''
        for p
        do
            eval "$(echo "${p}" | { read n p g a; echo "n='${n}';p='${p}';g='${g}';a='${a}'"; })"
            [ -n "${p}" ] || continue
            eval "p=tmpe${NAM}\${ESF${p}}.tiff"
            ps="${ps} ${p}"
            ap="$(printf '%s\n\t%s' "${ap}" "@env RGBPROFILE='\${RGBPROFILE}' sRGBPROFILE='\${sRGBPROFILE}' CONV='\${CONV}' IMCOMP='\${IMCOMP}' RM='\${RM}' sh ../../tools/applypatch ${g} ${p} ${SRC} ${n} ${LIN} ${a}")"
        done
        cat <<EOT
${SRC}: ${t}${ps}
EOT
        eval "TARGS=\${TARG${s}E}; TARGE=\${TARGE${e}}; TARGSE=\${TARG${s}E${e}}"
        XTARG=''
        [ -z "${TARGS}" ] \
        || XTARG="${XTARG} ${TARGS}"
        [ -z "${TARGE}" ] \
        || XTARG="${XTARG} ${TARGE}"
        [ -z "${TARGSE}" ] \
        || XTARG="${XTARG} ${TARGSE}"
        if [ -n "${XTARG}" ]
        then
            cat <<EOT
	@\${CONV} ${t} \\
		${XTARG} \\
		-compress \${IMCOMP} ${SRC}
EOT
        else
            cat <<EOT
	@\${LN} ${t} ${SRC}
EOT
        fi
        [ -z "${ap}" ] || echo "${ap}" | tail +2
        [ "${PROCESS}" = HDR ] && cat <<EOT
	@\${EXIFTFF} ${t} \${EXIFTAG} ${SRC}
EOT
        cat <<EOT
	@\${RM} ${t}
EOT
        EFIN="${EFIN} ${SRC}"
    }
    estack () {
        t="tmpt${NAM}.tiff"
        cat <<EOT
${t}: ${EFIN}
EOT
        if [ "$(echo "${EFIN}" | wc -w)" -gt 1 ]
        then
            [ -z "${STK}" ] \
            || cat <<EOT
	@env CONV='\${CONV}' RM='\${RM}' sh ../../tools/stackmask ${EFIN}
EOT
            [ -z "${DGH}" ] \
            || cat <<EOT
	@\${DEGHOST} ${EFIN}
	@for n in ${EFIN}; \\
	 do \\
		\${CONV} \$\${n} \\( +clone -fx '1-s.o' +matte \$\${n%.tif}_mask.tif -compose multiply -composite \\) -compose copy-opacity -composite \$\${n}; \\
		\${RM} \$\${n%.tif}_mask.tif; \\
	 done
EOT
        fi
        cat <<EOT
	@\${MERGE} -o ${t} ${EFIN}
	@\${RM} ${EFIN}
EOT
        SRC="tmp${NAM}.tiff"
        cat <<EOT
${SRC}: ${t}
EOT
        eval "TARGS=\${TARG${s}}"
        XTARG=''
        [ -z "${TARG}" ] \
        || XTARG="${XTARG} ${TARG}"
        [ -z "${TARGS}" ] \
        || XTARG="${XTARG} ${TARGS}"
        if [ -n "${XTARG}" ]
        then
            cat <<EOT
	@\${CONV} ${t} \\
		${XTARG} \\
		-compress \${IMCOMP} ${SRC}
EOT
        else
            cat <<EOT
	@\${LN} ${t} ${SRC}
EOT
        fi
        cat <<EOT
	@\${RM} ${t}
EOT
        BLIN="${BLIN} ${SRC}"
    }
    K="${3}"
    RM='rm -f'
    [ -z "${K}" ] || RM='echo'
    f=$(awk '/^p /{if(match($0,/ w[0-9]+/)){w=substr($0,RSTART+2,RLENGTH-2);match($0,/ h[0-9]+/);h=substr($0,RSTART+2,RLENGTH-2);print w"x"h}nextfile}' ${DST}.pto)
    [ -z "${f}" ] || f="-f ${f}"
    c=$(awk '/^p /{if(match($0,/ S[0-9]+,[0-9]+,[0-9]+,[0-9]+/)){split(substr($0,RSTART+2,RLENGTH-2),a,/,/);print(a[2]-a[1])"x"(a[4]-a[3])"+"a[1]"+"a[3]}nextfile}' ${DST}.pto)
    [ -z "${c}" ] || f="-f ${c}"
    #expr "${BLEND}" : '.*smartblend' >/dev/null && f=''
    prologue
    RMIN=''
    BLIN=''
    for s in ${SEC}
    do
        eval "NAM=\${NAM${s}}"
        eval "EXP=\${EXP${s}}"
        nexp=$(echo "${EXP}" | wc -w)
        EFIN=''
        if [ -z "${EXP}" ]
        then
            # no exposures stack for current sector
            e=0
            ESF=''
            FFIN=''
            eval "FOC=\${FOC${s}}"
            if [ -z "${FOC}" ]
            then
                # no focuses stack for current sector
                f=0
                FSF=''
                remap || return 1
            fi
            for f in ${FOC}
            do
                eval "FSF=\${FSF${f}}"
                remap || return 1
            done
            fstack
        fi
        for e in ${EXP}
        do
            eval "ESF=\${ESF${e}}"
            eval "FOC=\${FOC${s}E${e}}"
            FFIN=''
            if [ -z "${FOC}" ]
            then
                # no focuses stack for current exposure and sector
                f=0
                FSF=''
                remap || return 1
            fi
            for f in ${FOC}
            do
                eval "FSF=\${FSF${f}}"
                remap || return 1
            done
            fstack
        done
        estack
    done
    epilogue
    "epilogue${PROCESS}${EPL}"
}
