#!/bin/sh

[ -r .conf ] || exit 125

## RAW converters
RAWC=UFR
RAWO=GAM
UFRAW='ufraw-batch --interpolation=ahd --out-type=tiff --out-depth=16 --overwrite --create-id=no --zip --rotate=no'
UFRGAM="${UFRAW} \${UFRARG} \${UFRARGS} \${UFREC}"
UFRLIN="${UFRAW} --gamma=1 --linearity=1 \${UFRARG} \${UFRARGS} \${UFREC}"
DCRAW='dcraw -v -q 3 -n 10 -m 3 -t 0 -W -T -6'
DCRGAM="${DCRAW} +M -H 2 -o 0 -g 2.22222 4.50000 \${DCRARG} \${DCRARGS} \${DCREC}"
DCRLIN="${DCRAW} -M -H 0 -o 1 -g 1.00000 1.00000 \${DCRARG} \${DCRARGS} \${DCREC}"
DRKTBL='darktable-cli ${DRKRAW} ${DRKOUT} --bpp 16 --hq 1 --core --library ./${DST}.db'
DRKTBL='darktable-cli ${DRKRAW} ${DRKRAW}.xmp ${DRKOUT} --bpp 16 --hq 1 --core --library :memory:'
DRKGAM="${DRKTBL} --conf plugins/lighttable/export/iccprofile=sRGB"
#DRKLIN="${DRKTBL} --conf plugins/lighttable/export/iccprofile=linear_rgb"
DRKLIN="${DRKTBL} --conf plugins/lighttable/export/iccprofile=linear_rec2020_rgb"
RAWDNG='cr2hdr ${C2HARG}'

## metadata
EXIFTOOL='exiftool -overwrite_original -P'
#EXIFTOOL='true'
EXIFTFF="${EXIFTOOL} -TagsFromFile"
#EXIFTAG='-ImageDescription -Make -Model -Artist -WhitePoint -Copyright -GPS:all -DateTimeOriginal -CreateDate -UserComment -ColorSpace -OwnerName -SerialNumber -ISO -ExposureTime -FNumber -FocalLength -FocalLengthIn35mmFormat -Composite:DigitalZoom -FocalPlaneDiagonal -FocalPlaneXSize -FocalPlaneYSize -FocalPlaneResolutionUnit -FocalPlaneXResolution -FocalPlaneYResolution -ExifImageWidth -ExifImageHeight -ImageWidth -ImageHeight -LensType -LensModel -Lens -Orientation'
EXIFTAG='-EXIF:All -GPS:All -XResolution=${DPI} -YResolution=${DPI}'
EXIFTAG='-EXIF:FNumber -EXIF:ApertureValue -EXIF:ShutterSpeedValue -EXIF:ExposureTime -EXIF:BulbDuration -EXIF:ISO -EXIF:FocalLength -EXIF:FocalPlaneXResolution -EXIF:FocalPlaneYResolution -EXIF:FocalPlaneResolutionUnit -EXIF:ImageWidth -EXIF:ImageHeight -XResolution=${DPI} -YResolution=${DPI}'
EXIFTAG='-EXIF:FNumber -EXIF:ApertureValue -EXIF:ShutterSpeedValue -EXIF:ExposureTime -EXIF:BulbDuration -EXIF:ISO -EXIF:FocalLength -EXIF:FocalPlaneXResolution -EXIF:FocalPlaneYResolution -EXIF:FocalPlaneResolutionUnit -XResolution=${DPI} -YResolution=${DPI}'

## control points
#PMATIC='eval panomatic -n ${CPUS} --fullscale --surfscore 10 --kdtreesteps 100 --kdtreeseconddist 0.3 --ransacdist 100 --minmatches 48'
PMATIC='eval cpfind -n ${CPUS} --fullscale --kdtreesteps 100 --kdtreeseconddist 0.3 --ransacdist 100 --minmatches 48'
PMATIC='eval cpfind -n ${CPUS} --kdtreesteps 100 --kdtreeseconddist 0.3 --ransacdist 100 --minmatches 48'
PMATIC="${PMATIC} --celeste"

## other tools
FULLA='eval fulla -v -t ${CPUS} -s'
#FFUSE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} -m ${MEM} -b 16384 --exposure-weight=0 --saturation-weight=0  --contrast-weight=1 --hard-mask ${FFUSEX}'
FFUSE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} --exposure-weight=0.00 --saturation-weight=0.00  --contrast-weight=1.00 --hard-mask ${FFUSEX}'
#FFUSE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} --exposure-weight=0.00 --saturation-weight=0.75  --contrast-weight=1.00 --soft-mask ${FFUSEX}'
#FFUSE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} -m ${MEM} -b 16384 --exposure-weight=0.01 --saturation-weight=0.01  --contrast-weight=0.99 --hard-mask ${FFUSEX}'
#FFUSE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} -m ${MEM} -b 16384 --exposure-weight=1.00 --saturation-weight=0.00  --contrast-weight=1.00 --hard-mask --exposure-mu=1.0 --exposure-sigma=0.7 ${FFUSEX}'
#CONV='convert -limit memory 512 -limit map 256'
CONV='convert -limit area ${MEM}MiB -limit map ${MEM}MiB'
#INPNT='greycstoration -alpha 0.9 -sigma 0.2 -p 5 -a 1 -dt 20 -iter 5 -bits 16 -m mask.png -inpaint'
#INPNT='greycstoration -alpha 0.9 -sigma 0.2 -iter 512 -bits 16 -inpaint'
INPNT='greycstoration -iter 512 -bits 16 -inpaint'

REMAPEV=PAN

BLNT=CM

ENPSG='nearest-feature-transform'
#ENPSG='graph-cut'
ENOP=1
ENCM=16
ENMVCM=2%
ENMVFM=10%
ENOW=2:1
ENAN=0.975:7000:5:120
ENDI=10
ENVL=3

#RGB='-fx (s<=0.03928)?s/12.92:((s+0.055)/1.055)^2.4'
#sRGB='-fx (s<=0.00304)?s*12.92:s^0.416666667*1.055-0.055'

RGBPROFILE='../../tools/profiles/RGB.icc'
sRGBPROFILE='../../tools/profiles/sRGB.icm'
RGB='-profile ${sRGBPROFILE} -profile ${RGBPROFILE}'
sRGB='-profile ${RGBPROFILE} -profile ${sRGBPROFILE}'

GDIST='0.100:0.040:-0.960:1.820'

DPI=150

## PROCESS = LDR
LDRREMAP='eval nona -v -t ${CPUS} -m TIFF_m -r ldr -p UINT${DEPTH} -z ${ENCOMP} ${NONAEX} -o ${TMPPFX}-'
LDRTMPSFX='tif'
LDRWMRG='horizontal'
#LDRMERGE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} -m ${MEM} -b 16384 --exposure-mu=0.475 --exposure-sigma=0.150 ${EFUSEX}'
#LDRMERGE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} -m ${MEM} -b 16384 --exposure-weight=1.00 --saturation-weight=0.15 --contrast-weight=0.005 --entropy-weight=0.005 --soft-mask --exposure-mu=0.475 --exposure-sigma=0.150 --exposure-cutoff=1%:95% --gray-projector=average ${EFUSEX}'
#LDRMERGE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} -m ${MEM} -b 16384 --exposure-weight=1.00 --saturation-weight=0.05 --contrast-weight=0.01 --entropy-weight=0.01 --soft-mask --exposure-mu=0.325 --exposure-sigma=0.175 --exposure-cutoff=1%:90% --gray-projector=average ${EFUSEX}'
#LDRMERGE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} -m ${MEM} -b 16384 --exposure-weight=1.00 --saturation-weight=0.05 --contrast-weight=0.01 --entropy-weight=0.01 --soft-mask --exposure-mu=0.450 --exposure-sigma=0.100 --exposure-cutoff=1%:90% --gray-projector=average --wrap=both --ciecam ${EFUSEX}'
LDRMERGE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} --exposure-weight=1.00 --saturation-weight=0.100 --contrast-weight=0.00 --entropy-weight=0.00 --soft-mask --exposure-mu=0.475 --exposure-sigma=0.175 --exposure-cutoff=0%:98% --gray-projector=average ${EFUSEX}'
#LDRMERGE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} --exposure-weight=1.00 --saturation-weight=0.100 --contrast-weight=0.00 --entropy-weight=0.00 --soft-mask --exposure-mu=0.475 --exposure-sigma=0.175 --exposure-cutoff=1%:98% --gray-projector=average --ciecam --wrap=both'
#LDRMERGE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} --exposure-weight=1.00 --saturation-weight=0.050 --contrast-weight=0.05 --entropy-weight=0.00 --soft-mask --exposure-optimum=0.450 --exposure-width=0.125 --exposure-cutoff=0%:95% --gray-projector=average ${EFUSEX}'
#LDRMERGE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} --exposure-weight=1.00 --saturation-weight=0.050 --contrast-weight=0.05 --entropy-weight=0.00 --hard-mask --exposure-optimum=0.550 --exposure-width=0.175 --exposure-cutoff=5%:95% --gray-projector=average ${EFUSEX}'
#LDRMERGE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} --exposure-weight=1.00 --saturation-weight=0.050 --contrast-weight=0.20 --entropy-weight=0.00 --soft-mask --exposure-mu=0.350 --exposure-sigma=0.125 --exposure-cutoff=0%:95% --gray-projector=average --ciecam ${EFUSEX}'
#LDRMERGE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} --exposure-weight=0.00 --saturation-weight=1.000 --contrast-weight=0.25 --entropy-weight=0.00 --soft-mask ${EFUSEX}'
#LDRMERGE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} -m ${MEM} -b 16384 --exposure-weight=1.00 --saturation-weight=0.05 --contrast-weight=0.33 --hard-mask --gray-projector=value ${EFUSEX}'
#LDRMERGE='env ENFUSE="enfuse --verbose=${ENVL} --compression=${ENCOMP} --exposure-weight=1.00 --saturation-weight=0.100 --contrast-weight=0.00 --entropy-weight=0.00 --soft-mask --exposure-mu=0.475 --exposure-sigma=0.175 --exposure-cutoff=0%:98% --gray-projector=average ${EFUSEX}" sh ../../tools/enfuse-wrapper'
LDRWBLND='horizontal'
LDRBLENDFM='eval enblend --verbose=${ENVL} --compression=${ENCOMP} ${OBLEND} --primary-seam-generator=${ENPSG} --fine-mask ${BLNDEX}'
LDRBLENDCM='eval enblend --verbose=${ENVL} --compression=${ENCOMP} ${OBLEND} --primary-seam-generator=${ENPSG} --coarse-mask=${ENCM} ${BLNDEX}'
LDRBLEND='eval enblend --verbose=${ENVL} --compression=${ENCOMP} ${OBLEND} ${BLNDEX}'
LDRBLENDOP='--mask-vectorize=${ENMV} --optimizer-weights=${ENOW} --anneal=${ENAN} --dijkstra=${ENDI}'
LDRBLENDNO='--no-optimize'
LDRBLENDVD='eval verdandi --compression=${ENCOMP} --seam=blend ${VRDNEX}'
#LDRBLEND='eval enblend --verbose=${ENVL} --compression=${ENCOMP} --primary-seam-generator=nearest-feature-transform --fine-mask --mask-vectorize=${ENFMV} --optimizer-weights=${ENOW} --anneal=${ENAN} --dijkstra=${ENDI} ${BLNDEX}'
#LDRBLEND='eval enblend --verbose=${ENVL} --compression=${ENCOMP} --primary-seam-generator=nearest-feature-transform --coarse-mask=${ENCM} --mask-vectorize=${ENMVCM} --optimizer-weights=${ENOW} --anneal=${ENAN} --dijkstra=${ENDI} ${BLNDEX}'
#LDRBLEND='eval enblend --verbose=${ENVL} --compression=${ENCOMP} --primary-seam-generator=graph-cut --coarse-mask=${ENCM} --mask-vectorize=${ENMVCM} --optimizer-weights=${ENOW} --anneal=${ENAN} --dijkstra=${ENDI} ${BLNDEX}'
#LDRBLEND='eval enblend --verbose=${ENVL} --compression=${ENCOMP} ${BLNDEX}'
LDRDEGHOST='deghosting_mask -v -s 60 -c 0.8 -t 150 -i 8 -a mw'

## PROCESS = HDR
#HDRREMAP='eval nona -v -t ${CPUS} -m EXR_m -r hdr -p FLOAT -z ${ENCOMP} -G ${NONAEX} -o ${TMPPFX}-'
#HDRTMPSFX='exr'
HDRREMAP='eval nona -v -t ${CPUS} -m TIFF_m -r hdr -p FLOAT -z ${ENCOMP} -G ${NONAEX} -o ${TMPPFX}-'
HDRTMPSFX='tif'
HDRWMRG=''
#HDRMERGE='hugin_hdrmerge -v -m khan -s 50 -i 4 -a m'
#HDRMERGE='hugin_hdrmerge -v -m avg -c -a di'
#HDRMERGE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} --exposure-weight=1.00 --saturation-weight=0.50 --contrast-weight=0.00 --exposure-mu=0.45 --exposure-sigma=0.75 --gray-projector=average ${EFUSEX}'
#HDRMERGE='eval enfuse --verbose=${ENVL} --compression=${ENCOMP} -m ${MEM} -b 16384 ${EFUSEX}'
#HDRMERGE='sh ../../tools/merge-wrapper -v -m khan -i 1 -s 15 -a m -M ${MEM} -B 65536 -A'
#HDRMERGE='sh ../../tools/merge-wrapper -v -m khan -i 3 -s 15 -a m -M ${MEM} -B 65536 -O'
#HDRMERGE='unset EXIFTOOL EXIFTAG; eval sh ../../tools/pfshdrcalibrate-wrapper -v -x -c robertson -b 16 -m 65536 -r linear -g 8'
#HDRMERGE='unset EXIFTOOL EXIFTAG; eval sh ../../tools/pfshdrcalibrate-wrapper -v -x -c robertson -b 16 -m 65536 -r gamma -g 8'
#HDRMERGE='unset EXIFTOOL EXIFTAG; eval sh ../../tools/pfshdrcalibrate-wrapper -v -x -c none -b 16 -m 65536 -f ${DST}.m'
#HDRMERGE='unset EXIFTOOL EXIFTAG; eval sh ../../tools/pfshdrcalibrate-wrapper -v -x -c none -b 16 -m 65536 -f ${DST}.m -O'
#HDRMERGE='unset EXIFTOOL EXIFTAG; eval sh ../../tools/pfshdrcalibrate-wrapper -v -x -c none -b 16 -m 65536 -r linear -g 9'
#HDRMERGE='unset EXIFTOOL EXIFTAG; eval sh ../../tools/luminance-wrapper -v -c weight=gaussian:response_curve=from_file:curve_filename=${DST}.m:model=debevec -m ${HDRBEV}'
#HDRMERGE='unset EXIFTOOL EXIFTAG; eval sh ../../tools/luminance-wrapper -v -c weight=gaussian:response_curve=from_file:curve_filename=${DST}.m:model=debevec -m ${HDRBEV} -O'
#HDRMERGE='unset EXIFTOOL EXIFTAG; eval sh ../../tools/luminance-wrapper -v -c weight=gaussian:response_curve=linear:model=debevec -m ${HDRBEV}'
#HDRMERGE='unset EXIFTOOL EXIFTAG; eval sh ../../tools/luminance-wrapper -v -c weight=gaussian:response_curve=linear:model=debevec -m ${HDRBEV} -O'
#HDRMERGE='unset EXIFTOOL EXIFTAG; TMPPFX=${TMPPFX}; export TMPPFX; eval sh ../../tools/luminance-wrapper -v -c weight=gaussian:response_curve=gamma:model=debevec -m ${HDRBEV} -P ${DST}.pto'
#HDRMERGE='unset EXIFTOOL EXIFTAG; TMPPFX=${TMPPFX}; export TMPPFX; eval sh ../../tools/luminance-wrapper -v -c weight=gaussian:response_curve=gamma:model=debevec -m ${HDRBEV} -P ${DST}.pto -O'
#HDRMERGE='unset EXIFTOOL EXIFTAG; TMPPFX=${TMPPFX}; export TMPPFX; eval sh ../../tools/luminance-wrapper -v -c weight=gaussian:response_curve=srgb:model=debevec -m ${HDRBEV} -P ${DST}.pto'
#HDRMERGE='unset EXIFTOOL EXIFTAG; TMPPFX=${TMPPFX}; export TMPPFX; eval sh ../../tools/luminance-wrapper -v -c weight=gaussian:response_curve=linear:model=debevec -m ${HDRBEV} -P ${DST}.pto'
HDRMERGE='unset EXIFTOOL EXIFTAG; TMPPFX=${TMPPFX}; export TMPPFX; eval sh ../../tools/luminance-wrapper -v -c weight=gaussian:response_curve=from_file:curve_filename=${DST}.m:model=debevec -m ${HDRBEV} -P ${DST}.pto -O'
HDRMERGE='unset EXIFTOOL EXIFTAG; TMPPFX=${TMPPFX}; export TMPPFX; eval sh ../../tools/luminance-wrapper -v -c weight=gaussian:response_curve=from_file:curve_filename=${DST}.m:model=debevec -m ${HDRBEV} -P ${DST}.pto -A'
HDRWBLND='horizontal'
HDRBLENDFM='eval enblend --verbose=${ENVL} --compression=${ENCOMP} ${OBLEND} --primary-seam-generator=${ENPSG} --fine-mask ${BLNDEX}'
HDRBLENDCM='eval enblend --verbose=${ENVL} --compression=${ENCOMP} ${OBLEND} --primary-seam-generator=${ENPSG} --coarse-mask=${ENCM} ${BLNDEX}'
HDRBLEND='eval enblend --verbose=${ENVL} --compression=${ENCOMP} ${OBLEND} ${BLNDEX}'
HDRBLENDOP='--mask-vectorize=${ENMV} --optimizer-weights=${ENOW} --anneal=${ENAN} --dijkstra=${ENDI}'
HDRBLENDNO='--no-optimize'
HDRBLENDVD='eval verdandi --compression=${ENCOMP} --seam=blend ${VRDNEX}'
HDRDEGHOST='deghosting_mask -v -s 60 -c 0.8 -t 150 -i 8 -a mw'
HDRTMPL=/usr/local/share/pfstools/hdrhtml_hdrlabs_templ
HDRWBR=1.000
HDRWBG=1.000
HDRWBB=1.000
HDRR02KY=0.09
HDRR02ML=0.99609375
HDRR02GM=1.00
HDRR05BR=0.00
HDRR05CH=0.90
HDRR05LT=0.40
HDRR05ML=1024
HDRR05GM=1.00
HDRM06FR=0.40
HDRM06SN=0.80
HDRM06ML=0.99609375
HDRM06GM=1.00
HDRM08DF='pd=crt'
HDRM08CS=0.90
HDRM08CE=0.75
HDRM08WY=''
HDRM08ML=0.97500000
HDRM08GM=1.00
HDRGAMML=1.00
HDRGAMGM=1.00
HDRCLMMN=1e-20
HDRCLMMX=1e+20
HDRBEV=0
HDR7GRAY='-colorspace gray'
HDR7ALVL0='45%,75%,1.00000'
HDR7ABLR0='0x0.333333'
HDR7CMPS0='overlay'
HDR7ALVL1='85%,95%,1.00000'
HDR7ABLR1='0x1.333333'
HDR7CMPS1='src-over'
HDR8ALVL='75%,15%,0.75'
HDR9MDLT='110,75'
HDR9ALVL1='10%,180%,0.8'
HDR9ALVL2='75%,15%,0.75'
HDR10GRAY='-colorspace gray'
HDR10ALVL='0%,100%,1.00'
HDR10ASCN='4.00x90.0%'
HDR10ABLR='1.5x6'
HDR10CMPS='overlay'

PROCESS=LDR
EPL=1

NTHCMP=src-over
STHCMP=src-over

[ -n "${RMALL}" ] || RMALL='rm -f'
[ -n "${RMSRC}" ] || RMSRC="${RMALL}"
[ -n "${RMTMP}" ] || RMTMP="${RMALL}"
[ -n "${RMDST}" ] || RMDST="${RMALL}"

LANG=C; export LANG

. ./.conf

eval "RAWCONV=\${${RAWC}${RAWO}}"

eval "REMAP=\${${PROCESS}REMAP}"
eval "TMPSFX=\${${PROCESS}TMPSFX}"
eval "WMERGE=\${${PROCESS}WMRG}"
eval "MERGE=\${${PROCESS}MERGE}"
eval "WBLEND=\${${PROCESS}WBLND}"
eval "BLEND=\${${PROCESS}BLEND${BLNT}}"
[ -n "${BLEND}" ] \
|| eval "BLEND=\${${PROCESS}BLEND}"
eval "OBLEND=\${${PROCESS}BLENDNO}"
[ "${ENOP}0" -eq 0 ] \
|| eval "OBLEND=\${${PROCESS}BLENDOP}"
eval "ENMV=\${ENMV${BLNT}}"
[ -n "${ENMV}" ] \
|| ENMV="${ENMVFM}"
eval "DEGHOST=\${${PROCESS}DEGHOST}"

DSTPFX="${DST}"
[ -r "${DST}${3}.pto" ] && DST=${DST}${3}

IS360=''
ISSPH=''
ISMLT=''
[ -r "${DST}.pto" ] && {
    [ "$(ptoget -p v "${DST}.pto")" != 360 ] || IS360=1
    [ -z "${IS360}" \
        -o  $(("$(ptoget -p h "${DST}.pto")"*2)) \
            -ne "$(ptoget -p w "${DST}.pto")" ] || ISSPH=1
    [ -z "$(ptoget -i 1,n "${DST}.pto")" ] || ISMLT=1
    [ -n "${GBLEND}" ] || {
        PH="$(ptoget -p h "${DST}.pto")"
        PW="$(ptoget -p w "${DST}.pto")"
        GBLEND="${PW}x${PH}+0+0"
        eval "PL=$(ptoget -p S "${DST}.pto" |sed -e 's/,/; PR=/' -e 's/,/; PT=/' -e 's/,/; PB=/')"
        [ -z "${PL}" ] \
        || GBLEND=$(printf '%dx%d%+d%+d' $((${PR}-${PL})) $((${PB}-${PT})) ${PL} ${PT})
    }
}

[ -n "${IS360}" -a -n "${ISMLT}" ] || {
    WMERGE=''
    WBLEND=''
}
[ -z "${WMERGE}" ] || {
    FFUSEX="${FFUSEX} --wrap=${WMERGE}"
    EFUSEX="${EFUSEX} --wrap=${WMERGE}"
}
[ -z "${WBLEND}" ] || {
    BLNDEX="${BLNDEX} --wrap=${WBLEND}"
    VRDNEX="${VRDNEX} -w"
}

[ -z "${GBLEND}" ] || BLNDEX="${BLNDEX} -f ${GBLEND}"

#[ "${RAWO}" = GAM ] || {
#    FFUSEX="${FFUSEX} --fallback-profile='\${RGBPROFILE}' --ciecam"
#    if [ "${PROCESS}" = LDR ]
#    then
#        EFUSEX="${EFUSEX} --fallback-profile='\${RGBPROFILE}' --ciecam"
#        BLNDEX="${BLNDEX} --fallback-profile='\${RGBPROFILE}' --ciecam"
#    fi
#}

: ${RGPU:-${GPU}}
: ${BGPU:-${GPU}}
[ "${RGPU}0" -eq 0 -o -z "${DISPLAY}" ] \
|| REMAP="${REMAP} -g"
BLGPU='--no-gpu'
[ "${BGPU}0" -eq 0 -o -z "${DISPLAY}" ] \
|| BLGPU='--gpu'
BLNDEX="${BLNDEX} ${BLGPU}"
FFUSEX="${FFUSEX} ${BLGPU}"
EFUSEX="${EFUSEX} ${BLGPU}"

[ -n "${TMPDIR}" ] || TMPDIR=.

[ -n "${TMPPFX}" ] || TMPPFX=tmp
expr -- "${3}" : '^[a-z]$' >/dev/null \
&& TMPPFX="${TMPPFX}-${3}"

[ -n "${DEPTH}" ] || DEPTH="${2}"
[ -n "${DEPTH}" ] || DEPTH=16

[ -n "${KEEPHDR}" ] || KEEPHDR='tee ${TMPPFX}.pfs'

[ -n "${CPUS}" ] || CPUS=$(sysctl -n kern.smp.cpus)
[ -n "${CPUS}" ] || CPUS=1

#[ -n "${MEM}" ] || MEM="$(($(ulimit -d)/1024))"
#[ -n "${MEM}" ] || MEM=512
[ -n "${MEM}" ] || MEM=3072
#[ ${MEM} -le 5120 ] || MEM=5120

#[ -n "${IMCOMP}" ] || IMCOMP=zip
#[ -n "${ENCOMP}" ] || ENCOMP=DEFLATE
[ -n "${IMCOMP}" ] || IMCOMP=lzw
[ -n "${ENCOMP}" ] || ENCOMP=LZW

[ -n "${FQ}" ] || FQ=90
[ -n "${QKF}" ] || QKF=95
[ -n "${WKF}" ] || WKF=760

TMPSRC=''

prnsrc () {
    for s in ${SEC}
    do
        eval "NAM=\${NAM${s}}"
        eval "EXP=\${EXP${s}}"
        if [ -z "${EXP}" ]
        then
            # no exposures stack for current sector
            eval "FOC=\${FOC${s}}"
            if [ -z "${FOC}" ]
            then
                # no focuses stack for current sector
                eval "SRC=\${SRC${s}}"
                printf '%s\t%s\n' "${SRC}" "${NAM}.tiff"
                continue
            fi
            for f in ${FOC}
            do
                eval "FSF=\${FSF${f}}"
                eval "SRC=\${SRC${s}F${f}}"
                printf '%s\t%s\n' "${SRC}" "${NAM}${FSF}.tiff"
            done
            continue
        fi
        for e in ${EXP}
        do
            eval "ESF=\${ESF${e}}"
            eval "FOC=\${FOC${s}E${e}}"
            if [ -z "${FOC}" ]
            then
                # no focuses stack for current exposure and sector
                eval "SRC=\${SRC${s}E${e}}"
                printf '%s\t%s\n' "${SRC}" "${NAM}${ESF}.tiff"
                continue
            fi
            for f in ${FOC}
            do
                eval "FSF=\${FSF${f}}"
                eval "SRC=\${SRC${s}E${e}F${f}}"
                printf '%s\t%s\n' "${SRC}" "${NAM}${ESF}${FSF}.tiff"
            done
        done
    done
}

mkdng () {
    [ 0${MKDNG} -ne 0 ] || return 0
    ALLSRC=$(
        prnsrc \
        | grep -v '^LINK:' \
        | while read r n
          do
            [ -r "${n}" ] || echo "${r}"
          done
    )
    [ -n "${ALLSRC}" ] || return 0
    eval ${RAWDNG} ${ALLSRC}
    for n in ${ALLSRC}
    do
        [ -r "${n}" -a -r "${n%.*}.DNG" ] && TMPSRC="${TMPSRC} ${n%.*}.DNG"
    done
}

extractsrc () {
    n="${SRC}"
    o="${NAM}${ESF}${FSF}"
    [ -z "${n}" -o "${n}" = SKIP -o "${n}" = SSKIP ] && continue
    [ -r ${o}.tiff ] && continue
    echo "${n} => ${o}.tiff" >&2
    l="$(expr -- "${n}" : 'LINK:\(.*\)')" && {
        echo "LINK: ${l} => ${o}.tiff" >&2
        ln -s "${l}" ${o}.tiff
        continue
    }
    echo "${n}" | grep -q '^CONV:\([^:]*\):\([^:]*\):\([^:]*\):\(.*\)' && {
        eval "$(
            echo "${n}" \
            | sed -e 's/^CONV:\([^:]*\):\([^:]*\):\([^:]*\):\(.*\)/s=\1; e=\2; f=\3; c="\4"/'
        )"
        #echo "CONV: s=$s; e=$e; f=$f; c='$c'" >&2
        n="$(
            eval "NAM=\${NAM${s}}"
            eval "ESF=\${ESF${e}}"
            eval "FSF=\${FSF${f}}"
            eval "SRC=\${SRC${s}E${e}F${f}}"
            eval "UCFE=\${UCFE${e}}"
            eval "BLVE=\${BLVE${e}}"
            eval "UCF=\${UCF${s}E${e}F${f}}"
            [ -n "${UCF}" ] || UCF="${UCFE}"
            eval "BLV=\${BLV${s}E${e}F${f}}"
            [ -n "${BLV}" ] || BLV="${BLVE}"
            ( extractsrc "${@}" >/dev/null )
            echo "${NAM}${ESF}${FSF}.tiff ${c} => ${o}.tiff" >&2
            echo "${NAM}${ESF}${FSF}"
        )"
        #echo "${CONV} ${n}.tiff ${c} -compress '${IMCOMP}' ${o}.tiff" >&2
        eval "${CONV} ${n}.tiff ${c} -compress '${IMCOMP}' ${o}.tiff"
        continue
    }
    [ -d used ] && {
        [ -e "used/${n##*/}" ] || ln -s "${n}" "used/${n##*/}"
    }
    n="${n%.xz}"
    n="${n%.bz2}"
    n="${n%.gz}"
    n="${n%.RAW}"
    n="${n%.CR2}"
    n="${n%.DNG}"
    n="${n%.JPG}"
    n="${n%.[Pp][Nn][Gg]}"
    n="${n%.pto}"
    r=''
    [ -r ${n}.RAW.xz ] && {
        r=${n}.RWT
        TMPSRC="${TMPSRC} ${r}"
        xzcat ${n}.RAW.xz >${r}
    }
    [ -r ${n}.RAW.bz2 ] && {
        r=${n}.RWT
        TMPSRC="${TMPSRC} ${r}"
        bzcat ${n}.RAW.bz2 >${r}
    }
    [ -r ${n}.RAW.gz ] && {
        r=${n}.RWT
        TMPSRC="${TMPSRC} ${r}"
        zcat ${n}.RAW.gz >${r}
    }
    [ -r ${n}.CR2 ] && r=${n}.CR2
    [ -r ${n}.DNG ] && r=${n}.DNG
    p=$(echo "${n}".[Pp][Nn][Gg]); [ -r "${p}" ] || p=''
    echo "${p}"
    if [ -n "${r}" -a -r "${r}" ]
    then
        EVC=NO;
        baselv="${BLV}"
        [ -n "${baselv}" ] || baselv="${BASELV}"
        if [ -n "${baselv}" -o -n "${EVCOMP}" ]
        then
            eval "$(
                ${EXIFTOOL} -Aperture -ShutterSpeed -ISO -LightValue -n ${r} \
                | awk '
                    BEGIN {
                        EV="";
                    }
                    /^Aperture/ {
                        if (APRT == "") {
                            APRT = $3;
                        }
                    }
                    /^Shutter Speed/ {
                        SHSP = $4;
                    }
                    /^ISO/ {
                        ISO = $3;
                    }
                    /^Light Value/ {
                        EV = $4;
                    }
                    END {
                        if (EV == "") {
                            EV = (2*log(APRT)-log(SHSP)-log(ISO/100))/log(2);
                        }
                        if (EVCOMP == "") {
                            EVCOMP = 0;
                        }
                        if (BASELV == "") {
                            BASELV = EV;
                        }
                        EVCOMP += EV - BASELV;
                        print "EVC=" EVCOMP "; UFREC=\"--exposure=" EVCOMP "\"; DCREC=\"-b " (2^EVCOMP) "\"";
                    }
                  ' BASELV="${baselv}" EVCOMP="${EVCOMP:-0}" APRT="${APRT}"
            )"
            echo "UFREC='${UFREC}'; DCREC='${DCREC}'"
        fi
        if [ "${RAWC}" = "UFR" ]
        then
            uconf="${UCF}"
            [ -n "${uconf}" ] || eval "uconf=\${UCONF${e}S${s}}"
            [ -n "${uconf}" ] || eval "uconf=\${UCONF${e}}"
            [ -n "${uconf}" ] || uconf="${UCONF}"
            [ -z "${uconf}" -o "${uconf}" = "${n}" -o -r "${n}.ufraw" ] || {
              echo "use template '${uconf}.ufraw' ufraw conf '${n}.ufraw'" >&2
              sed -e "s/${uconf}/${n}/g" ${uconf}.ufraw \
              | awk '
                BEGIN {
                    eset=1;
                }
                /^<Exposure>/ && EVC!="NO" {
                    print "<Exposure>"EVC"</Exposure>";
                    eset=0;
                    next;
                }
                /^<\/UFRaw>/ && EVC!="NO" && eset {
                    print "<Exposure>"EVC"</Exposure>";
                }
                {
                    print;
                }
              ' EVC=${EVC} >${n}.ufraw
            }
            [ -r ${n}.ufraw ] || exit 125
            [ -z "${baselv}" ] || UFREC="${UFREC} --create-id=no"
            RWCONV="${RAWCONV} --conf=${n}.ufraw --output=${n}.tiff ${r}"
        elif [ "${RAWC}" = "DCR" ]
        then
            RWCONV="${RAWCONV} ${r}"
        elif [ "${RAWC}" = "DRK" ]
        then
            DRKRAW=${r}
            DRKOUT=${n}.tiff
            RWCONV="DRKTIF=${n}.tif; rm -f \${DRKTIF}; ${RAWCONV} && { in=\${DRKTIF}; [ -z '${DRKSZ}' -o -z '${DRKGM}' ] || in=\"-size ${DRKSZ} xc:transparent \${DRKTIF} -geometry ${DRKGM} -compose src-over -composite\"; ${CONV} \${in} -compress ${IMCOMP} ${n}.tiff; rm -f \${DRKTIF}; }"
        else
            echo "Unknown RAW converter type: ${RAWC}" >&2
            exit 123
        fi
        echo "${RWCONV}" >&2
        eval "echo \"${RWCONV}\"" >&2
        eval "${RWCONV}"
        tca=''
        if [ -z "${TCA}" -a -n "${LENS}" ]
        then
            fl="$(dcraw -i -v ${r} |awk '/^Focal length: /{print $3}')"
            #fl="$(exiftool -n -e -FocalLength ${r} |awk '{print $NF}')"
            tca="$( ( cd ../../tools/tca && echo "disp(tca('tca.db','${LENS}',${fl},1,0))"|octave -qf|cat|head -1 ) )"
            echo "Focal length: ${fl}; TCA correction: ${tca}"
        else
            tca="${TCA}"
        fi
        [ -z "${tca}" ] || ${FULLA} ${tca} -o ${n}.tiff ${n}.tiff
        eval "$(identify -format 'w=%w; h=%h' ${n}.tiff)"
        eval ${CONV} ${n}.tiff \
            +repage -crop $((${w}-16))x$((${h}-16))+8+8 +repage \
            ${SARG} \
            -compress ${IMCOMP} ${o}.tiff
        rm -f ${n}.tiff
    elif [ -r ${n}.JPG ]
    then
        # sRGB => RGB
        [ "${RAWO}" = GAM ] || rgb="${RGB}"
        eval ${CONV} ${n}.JPG \
            -noise 3 -unsharp 0x0.3 \
            ${rgb} \
            -depth ${DEPTH} \
            ${SARG} \
            -compress ${IMCOMP} ${o}.tiff
    elif [ -n "${p}" -a -r "${p}" ]
        # sRGB => RGB
        [ "${RAWO}" = GAM ] || rgb="${RGB}"
        eval ${CONV} ${p} \
            ${rgb} \
            -depth ${DEPTH} \
            ${SARG} \
            -compress ${IMCOMP} ${o}.tiff
    then
    elif [ -r ${n}.pto ]
    then
        sh "${0}" pano "${2}" "${n#${DSTPFX}}" || exit 124
    else
        exit 126
    fi
    [ -r mask-${o}.png -a \( "${1}" != prep -o "${DEPTH}" != 8 \) ] \
    && eval ${CONV} ${o}.tiff -matte \
        mask-${o}.png -alpha copy \
        -compose copyopacity -composite \
        -compress ${IMCOMP} ${o}.tiff
    if [ -n "${SINP}" ]
    then
        for i in ${SINP}
        do
            eval "g=\${${IBASE}I${i}}"
            inpaint ${o} ${g} ${i}
        done
    fi
    [ -n "${r}" -a -r "${r}" ] && eval "${EXIFTFF} ${r} -EXIF:Orientation ${EXIFTAG} ${o}.tiff"
    [ -r ${n}.JPG ] && eval "${EXIFTFF} ${n}.JPG -EXIF:Orientation ${EXIFTAG} ${o}.tiff"
}

prep () {
    mkdng
    for s in ${SEC}
    do
        IBASE="SINP${s}"
        eval "NAM=\${NAM${s}}"
        eval "SINP=\${${IBASE}}"
        eval "EXP=\${EXP${s}}"
        eval "UCFS=\${UCF${s}}"
        e=''
        UCF=''
        BLV=''
        DCRARGS=''
        UFRARGS=''
        if [ -z "${EXP}" ]
        then
            # no exposures stack for current sector
            ESF=''
            eval "FOC=\${FOC${s}}"
            if [ -z "${FOC}" ]
            then
                # no focuses stack for current sector
                FSF=''
                eval "SRC=\${SRC${s}}"
                eval "BLV=\${BLV${s}}"
                eval "DCRARGS=\${DCRARG${s}}"
                eval "UFRARGS=\${UFRARG${s}}"
                UCF="${UCFS}"
                extractsrc "${@}"
                continue
            fi
            for f in ${FOC}
            do
                eval "FSF=\${FSF${f}}"
                eval "SRC=\${SRC${s}F${f}}"
                eval "BLV=\${BLV${s}F${f}}"
                eval "DCRARGS=\${DCRARG${s}F${f}}"
                eval "UFRARGS=\${UFRARG${s}F${f}}"
                eval "UCFF=\${UCFF${f}}"
                eval "UCF=\${UCF${s}F${f}}"
                [ -n "${UCF}" ] || UCF="${UCFF}"
                [ -n "${UCF}" ] || UCF="${UCFS}"
                extractsrc "${@}"
            done
            continue
        fi
        for e in ${EXP}
        do
            IBASE="SINP${s}E${e}"
            eval "ESF=\${ESF${e}}"
            eval "BLVE=\${BLVE${e}}"
            eval "DCRARGE=\${DCRARGE${e}}"
            eval "UFRARGE=\${UFRARGE${e}}"
            eval "DCRARGF=\${DCRARG${s}E${e}}"
            [ -n "${DCRARGF}" ] || DCRARGF="${DCRARGE}"
            eval "UFRARGF=\${UFRARG${s}E${e}}"
            [ -n "${UFRARGF}" ] || UFRARGF="${UFRARGE}"
            eval "SINP=\${${IBASE}}"
            eval "FOC=\${FOC${s}E${e}}"
            eval "UCFE=\${UCFE${e}}"
            eval "UCFSE=\${UCF${s}E${e}}"
            if [ -z "${FOC}" ]
            then
                # no focuses stack for current exposure and sector
                FSF=''
                eval "SRC=\${SRC${s}E${e}}"
                eval "BLV=\${BLV${s}E${e}}"
                [ -n "${BLV}" ] || BLV="${BLVE}"
                DCRARGS="${DCRARGF}"
                UFRARGS="${UFRARGF}"
                UCF="${UCFSE}"
                [ -n "${UCF}" ] || UCF="${UCFE}"
                [ -n "${UCF}" ] || UCF="${UCFS}"
                extractsrc "${@}"
                continue
            fi
            for f in ${FOC}
            do
                eval "FSF=\${FSF${f}}"
                eval "SRC=\${SRC${s}E${e}F${f}}"
                eval "BLV=\${BLV${s}E${e}F${f}}"
                [ -n "${BLV}" ] || BLV="${BLVE}"
                eval "DCRARGS=\${DCRARG${s}E${e}F${f}}"
                [ -n "${DCRARGS}" ] || DCRARGS="${DCRARGF}"
                eval "UFRARGS=\${UFRARG${s}E${e}F${f}}"
                [ -n "${UFRARGS}" ] || UFRARGS="${UFRARGF}"
                eval "UCFF=\${UCFF${f}}"
                eval "UCFEF=\${UCFE${e}F${f}}"
                eval "UCF=\${UCF${s}E${e}F${f}}"
                [ -n "${UCF}" ] || UCF="${UCFEF}"
                [ -n "${UCF}" ] || UCF="${UCFSE}"
                [ -n "${UCF}" ] || UCF="${UCFF}"
                [ -n "${UCF}" ] || UCF="${UCFE}"
                [ -n "${UCF}" ] || UCF="${UCFS}"
                extractsrc "${@}"
            done
        done
    done
    for n in ${TMPSRC}
    do
        rm ${n}
    done
}

auto () {
    mkpto () {
        [ -r "${1}" ] && {
            SRC="${1}"
            return 0
        }
        true || {
        for n in ${SRC}
        do
            eval "$(
                ${EXIFTOOL} -n -FOV -LightValue -ImageWidth -ImageHeight ${n} \
                | awk '
                    /^Field Of View/ {
                        print "FOV="$NF
                    }
                    /^Light Value/ {
                        print "LV="$NF
                    }
                    /^Image Width/ {
                        print "W="$NF
                    }
                    /^Image Height/ {
                        print "H="$NF
                    }
                    /^Scale Factor/ {
                        print "CF="$NF
                    }
                '
            )"
            [ -z "${CF}" ] \
            || echo "#-hugin  cropFactor=${CF}"
            echo "i f0 w${W} h${H} v${FOV} Eev${LV} d0 e0 a0 b0 c0 p0 r0 y0 n\"${n}\""
        done \
        > "${1}"
        }
        pto_gen -o "${1}" ${SRC}
        perl ../../tools/ptsed \
            -I 'v,a,b,c,d,e,Ra,Rb,Rc,Rd,Re,Va,Vb,Vc,Vd,Vx,Vy/1-:=0' \
            -o "${1}" "${1}"
        SRC="${1}"
    }
    autoexp () {
        x=${1}; shift
        e=${1}; shift
        eval "ESF=\${ESF${e}}"
        [ -r ${DST}${ESF}${x}-ao.pto ] && return
        [ ${#} -lt 2 ] && return
        SRC=''
        for s
        do
            eval "NAM=\${NAM${s}}"
            FSF=''
            eval "FOC=\${FOC${s}E${e}}"
            [ -n "${FOC}" ] || eval "FOC=\${FOC${s}}"
            [ -z "${FOC}" ] || eval "FSF=\${FSF${FOC%% *}}"
            src="${NAM}${ESF}${FSF}.tiff"
            [ -r "${src}" ] && SRC="${SRC} ${src}"
        done
        printf 'e=%s; S=%s\n' ${e} "${SRC}"
        mkpto ${DST}${ESF}${x}-pm.pto
        ${PMATIC} \
            --multirow \
            --sieve1width 64 --sieve1height 48 --sieve1size 8 \
            --sieve2width 16 --sieve2height 16 --sieve2size 4 \
            -o ${DST}${ESF}${x}-pm.pto ${SRC}
        autooptimiser -a -l -s -o ${DST}${ESF}${x}-ao.pto ${DST}${ESF}${x}-pm.pto
            #--linearmatch --linearmatchlen 22 \
    }
    autoexpex () {
        e="${1}"; shift
        eval "ESF=\${ESF${e}}"
        [ -r ${DST}${ESF}-ao.pto ] && return
        if [ -z "${ROWS}" ]
        then
            autoexp '' "${e}" "${@}"
            return ${?}
        fi
        eval "${ROWS}"
        eval "RROWS=\${ROWS${e}}"
        if [ -n "${RROWS}" ]
        then
            for r in ${RROWS}
            do
                eval "RSF=\${RSF${e}R${r}}"
                eval "RSC=\${RSC${e}R${r}}"
                autoexp "${RSF}" "${e}" ${RSC}
            done
            ptomerge ${DST}${ESF}[^-]*-ao.pto ${DST}${ESF}-ao.pto
            ptosort -i n ${DST}${ESF}-ao.pto ${DST}${ESF}-ao.pto
            autooptimiser -a -l -s -o ${DST}${ESF}-ao.pto ${DST}${ESF}-ao.pto
            return ${?}
        fi
        autoexp '' "${e}" "${@}"
    }
    autosec () {
        s=${1}; shift
        eval "NAM=\${NAM${s}}"
        [ -r ${DST}-${NAM}-ao.pto ] && return
        echo "${DST}-${NAM}-ao.pto: ${#}"
        [ ${#} -lt 2 ] && return
        SRC=''
        for e
        do
            eval "ESF=\${ESF${e}}"
            FSF=''
            eval "FOC=\${FOC${s}E${e}}"
            [ -n "${FOC}" ] || eval "FOC=\${FOC${s}}"
            [ -z "${FOC}" ] || eval "FSF=\${FSF${FOC%% *}}"
            src="${NAM}${ESF}${FSF}.tiff"
            [ -r "${src}" ] && SRC="${SRC} ${src}"
        done
        printf 's=%s; SRC=%s\n' ${s} "${SRC}"
        mkpto ${DST}-${NAM}-pm.pto
        ${PMATIC} \
            --sieve1width 64 --sieve1height 48 --sieve1size 8 \
            --sieve2width 32 --sieve2height 24 --sieve2size 4 \
            -o ${DST}-${NAM}-pm.pto ${SRC}
        perl ../../tools/ptsed \
            -P f:0 \
            -V r,p,y/1- \
            -o ${DST}-${NAM}-pm.pto ${DST}-${NAM}-pm.pto
        autooptimiser -n -o ${DST}-${NAM}-ao.pto ${DST}-${NAM}-pm.pto
    }
    autofoc () {
        s=${1}; shift
        eval "NAM=\${NAM${s}}"
        ESF=''
        e="${1}"; shift
        [ -z "${e}" ] || eval "ESF=\${ESF${e}}"
        [ -r ${DST}-${NAM}${ESF}-ao.pto ] && return
        echo "${DST}-${NAM}${ESF}-ao.pto: ${#}"
        [ ${#} -lt 2 ] && return
        SRC=''
        for f
        do
            eval "FSF=\${FSF${f}}"
            src="${NAM}${ESF}${FSF}.tiff"
            [ -r "${src}" ] && SRC="${SRC} ${src}"
        done
        printf 's=%s; e=%s; SRC=%s\n' ${s} ${e} "${SRC}"
        mkpto ${DST}-${NAM}${ESF}-pm.pto
        ${PMATIC} \
            --linearmatch --linearmatchlen 8 \
            --sieve1width 64 --sieve1height 48 --sieve1size 8 \
            --sieve2width 32 --sieve2height 24 --sieve2size 4 \
            -o ${DST}-${NAM}${ESF}-pm.pto ${SRC}
        perl ../../tools/ptsed -P f:0 -V v,r,p,y/1- -o ${DST}-${NAM}${ESF}-pm.pto ${DST}-${NAM}${ESF}-pm.pto
        autooptimiser -n -o ${DST}-${NAM}${ESF}-ao.pto ${DST}-${NAM}${ESF}-pm.pto
    }
    E=''
    for s in ${SEC}
    do
        eval "EXP=\${EXP${s}}"
        for e in ${EXP}
        do
            echo "${E}" | grep -q "\<${e}\>" && continue
            E="${E} ${e}"
        done
    done
    for e in ${E}
    do
        S=''
        for s in ${SEC}
        do
            eval "echo \"\$EXP${s}\" | grep -q '\<${e}\>'" || continue
            S="${S} ${s}"
        done
        autoexpex "${e}" ${S}
    done
    for s in ${SEC}
    do
        eval "EXP=\${EXP${s}}"
        autosec ${s} ${EXP}
        eval "FOC=\${FOC${s}}"
        if [ -n "${FOC}" ]
        then
            autofoc "${s}" '' ${FOC}
            continue
        fi
        for e in ${EXP}
        do
            eval "FOC=\${FOC${s}E${e}}"
            [ -n "${FOC}" ] || continue
            autofoc "${s}" "${e}" ${FOC}
        done
    done
}

cluster () {
    clexp () {
        e=${1}
        eval "ESF=\${ESF${e}}"
        [ -r ${DST}${ESF}-ao.pto ] || return
        [ -r ${DST}${ESF}.pto ] && return
        [ -z "${2}" ] || D="-D${2}"
        [ -z "${3}" ] || d="-d${3}"
        yrp=y,r,p/0-
        #[ -z "${4}" ] || yrp="y,r,p/0-$((${4}-1)),$((${4}+1))-:r,p/${4}"
        [ -z "${4}" ] || {
            yrp='y,r,p/1-'
            [ "${4}" -eq 0 ] || \
            yrp="y,r,p/0-$((${4}-1)),$((${4}+1))-"
        }
        echo "yrp: ${yrp}"
        [ -r ${DST}${ESF}.pto ] && return
        perl ../../tools/ptsed -O0x80ff \
            -s -Vv/0-:b,a,c,d,e/0:${yrp} \
            -o ${DST}${ESF}-ao.txt ${DST}${ESF}-ao.pto
        PToptimizer ${DST}${ESF}-ao.txt
        perl ../../tools/ptscluster -O0xff \
            -x48 -y36 ${D} ${d} \
            -o ${DST}${ESF}-ao.txt ${DST}${ESF}-ao.txt \
        && perl ../../tools/ptsed -O0xff \
            -s -r \
            -o ${DST}${ESF}-ao.txt ${DST}${ESF}-ao.txt
        PToptimizer ${DST}${ESF}-ao.txt
        perl ../../tools/ptscluster -O0xff \
            -x24 -y18 ${D} ${d} \
            -o ${DST}${ESF}-ao.txt ${DST}${ESF}-ao.txt \
        && perl ../../tools/ptsed -O0xff \
            -s -r \
            -o ${DST}${ESF}-ao.txt ${DST}${ESF}-ao.txt
        PToptimizer ${DST}${ESF}-ao.txt
        perl ../../tools/ptscluster -O0xff \
            ${D} ${d} \
            -o ${DST}${ESF}-ao.txt ${DST}${ESF}-ao.txt \
        && perl ../../tools/ptsed -O0xff \
            -s -r \
            -o ${DST}${ESF}-ao.txt ${DST}${ESF}-ao.txt
        PToptimizer ${DST}${ESF}-ao.txt
        perl ../../tools/ptsed -O0xff \
            -i \
            -o ${DST}${ESF}.pto ${DST}${ESF}-ao.txt
    }
    clsec () {
        s=${1}
        eval "NAM=\${NAM${s}}"
        ESF=''
        e=${2}
        [ -z "${e}" ] || eval "ESF=\${ESF${e}}"
        [ -r ${DST}-${NAM}${ESF}-ao.pto ] || return
        [ -r ${DST}-${NAM}${ESF}.pto ] && return
        #[ -r ${DST}-${NAM}${ESF}.pto ] && return
        #    -Ib,v/1-:=0:a,c,d,e/0-:0 \
        perl ../../tools/ptsed -O0xff \
            -Vy,r,p/1- \
            -s -o ${DST}-${NAM}${ESF}-ao.txt ${DST}-${NAM}${ESF}-ao.pto
        PToptimizer ${DST}-${NAM}${ESF}-ao.txt
        perl ../../tools/ptscluster -O0xff \
            -r0x21 -x48 -y36 -d12 -D24 \
            -o ${DST}-${NAM}${ESF}-ao.txt ${DST}-${NAM}${ESF}-ao.txt \
        && perl ../../tools/ptsed -O0xff \
            -s -r \
            -o ${DST}-${NAM}${ESF}-ao.txt ${DST}-${NAM}${ESF}-ao.txt
        PToptimizer ${DST}-${NAM}${ESF}-ao.txt
        perl ../../tools/ptscluster -O0xff \
            -r0x21 -x48 -y36 -d8 -D16 \
            -o ${DST}-${NAM}${ESF}-ao.txt ${DST}-${NAM}${ESF}-ao.txt \
        && perl ../../tools/ptsed -O0xff \
            -s -r \
            -o ${DST}-${NAM}${ESF}-ao.txt ${DST}-${NAM}${ESF}-ao.txt
        PToptimizer ${DST}-${NAM}${ESF}-ao.txt
        perl ../../tools/ptscluster -O0xff \
            -r0x21 -x48 -y36 -D10 \
            -o ${DST}-${NAM}${ESF}-ao.txt ${DST}-${NAM}${ESF}-ao.txt \
        && perl ../../tools/ptsed -O0xff \
            -s -r \
            -Vv,y,r,p/1- \
            -o ${DST}-${NAM}${ESF}-ao.txt ${DST}-${NAM}${ESF}-ao.txt
        PToptimizer ${DST}-${NAM}${ESF}-ao.txt
        perl ../../tools/ptscluster -O0xff \
            -r0x21 -x24 -y18 -D7 \
            -o ${DST}-${NAM}${ESF}-ao.txt ${DST}-${NAM}${ESF}-ao.txt \
        && perl ../../tools/ptsed -O0xff \
            -s -r \
            -o ${DST}-${NAM}${ESF}-ao.txt ${DST}-${NAM}${ESF}-ao.txt
        PToptimizer ${DST}-${NAM}${ESF}-ao.txt
        perl ../../tools/ptscluster -O0xff \
            -r0x21 -D5 \
            -o ${DST}-${NAM}${ESF}-ao.txt ${DST}-${NAM}${ESF}-ao.txt \
        && perl ../../tools/ptsed -O0xff \
            -s -r \
            -o ${DST}-${NAM}${ESF}-ao.txt ${DST}-${NAM}${ESF}-ao.txt
        PToptimizer ${DST}-${NAM}${ESF}-ao.txt
        perl ../../tools/ptscluster -O0xff \
            -r0x21 -D3 \
            -o ${DST}-${NAM}${ESF}-ao.txt ${DST}-${NAM}${ESF}-ao.txt \
        && perl ../../tools/ptsed -O0xff \
            -s -r \
            -o ${DST}-${NAM}${ESF}-ao.txt ${DST}-${NAM}${ESF}-ao.txt
        PToptimizer ${DST}-${NAM}${ESF}-ao.txt
        perl ../../tools/ptsed -O0xff \
            -i \
            -o ${DST}-${NAM}${ESF}.pto ${DST}-${NAM}${ESF}-ao.txt
    }
    E=''
    for s in ${SEC}
    do
        eval "EXP=\${EXP${s}}"
        for e in ${EXP}
        do
            echo "${E}" | grep -q "\<${e}\>" && continue
            E="${E} ${e}"
        done
    done
    for e in ${E}
    do
        eval "anc=\${ANC${e}}"
        [ -n "${anc}" ] || anc="${ANC}"
        echo "ANC: ${ANC}; anc: ${anc}"
        clexp ${e} "${DMAX}" "${DMIN}" "${anc}"
    done
    for s in ${SEC}
    do
        clsec ${s}
        eval "EXP=\${EXP${s}}"
        for e in ${EXP}
        do
            clsec ${s} ${e}
        done
    done
}

mkprocessmf () {
    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}
TMPPFX?=${TMPPFX}

CPUS?=${CPUS}
MEM?=${MEM}
DEPTH?=${DEPTH}
IMCOMP?=${IMCOMP}
ENCOMP?=${ENCOMP}
NONAEX?=${NONAEX}
FFUSEX?=${FFUSEX}
EFUSEX?=${EFUSEX}
BLNDEX?=${BLNDEX}
OBLEND?=${OBLEND}
ENPSG?=${ENPSG}
ENCM?=${ENCM}
ENMV?=${ENMV}
ENOW?=${ENOW}
ENAN?=${ENAN}
ENDI?=${ENDI}
ENVL?=${ENVL}
VRDNEX?=${VRDNEX}
RGBPROFILE?=${RGBPROFILE}
sRGBPROFILE?=${sRGBPROFILE}
RGB?=${RGB}
sRGB?=${sRGB}
DPI?=${DPI}

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

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

RMSRC=${RMSRC}
RMTMP=${RMTMP}
RMDST=${RMDST}
MV=mv
LN=ln -f

all: \${DST}.tiff

EOT
    }
    prologueLDR () {
        echo >/dev/null
    }
    prologueHDR () {
        cat <<EOT
HDRBEV?=${HDRBEV}

EOT
    }
    epilogue () {
        if [ -n "${SEQ}" ]
        then
            BLIN=''
            for q in ${SEQ}
            do
                eval "SSC=\${SSC${q}}"
                SQIN=''
                for s in ${SSC}
                do
                    eval "NAM=\${NAM${s}}"
                    SQIN="${SQIN} \${TMPPFX}${NAM}.tiff"
                done
                SQIN="${SQIN# }"
                s=$(echo "${SQIN}"|wc -w)
                [ ${s} -ne 0 ] || continue
                t="\${TMPPFX}s${q}.tiff"
                cat <<EOT

${t}: ${SQIN}
EOT
                if [ $(echo "${SQIN}"|wc -w) -eq 1 ]
                then
                    cat <<EOT
	@\${LN} ${SQIN} ${t}
EOT
                else
                    cat <<EOT
	@\${BLEND} -o ${t} ${SQIN}
EOT
                fi
                BLIN="${BLIN} ${t}"
            done
        fi
        BLIN="${BLIN# }"
        cat <<EOT

\${TMPPFX}t.tiff: ${BLIN}
	@\${RMSRC} ${RMIN# }
	@\${BLEND} -o \${TMPPFX}t.tiff ${BLIN}
EOT
        if [ -n "${NORTH}" ]
        then
            NSFX="${NORTH##*.}"
            cat <<EOT
	@\${LN} ${NORTH} \${TMPPFX}-north.${NSFX}
EOT
            BARG="\\( \${TMPPFX}-north.${NSFX} ${NTHARG} \\) -gravity north -compose ${NTHCMP} -composite ${BARG}"
        fi
        if [ -n "${SOUTH}" ]
        then
            SSFX="${SOUTH##*.}"
            cat <<EOT
	@\${LN} ${SOUTH} \${TMPPFX}-south.${SSFX}
EOT
            BARG="\\( \${TMPPFX}-south.${SSFX} ${STHARG} \\) -gravity south -compose ${STHCMP} -composite ${BARG}"
        fi
        cat <<EOT
	@\${RMTMP} ${BLIN}
\${TMPPFX}.tiff: \${TMPPFX}t.tiff
EOT
        if [ -n "${BARG0}" -o -n "${BARG}" -o -n "${BARG1}" ]
        then
            cat <<EOT
	@\${CONV} \${TMPPFX}t.tiff \\
		-define compose:clamp=false \\
		${BARG0} \\
		${BARG} \\
		${BARG1} \\
		-compress \${IMCOMP} \${TMPPFX}.tiff
EOT
        else
            cat <<EOT
	@\${LN} \${TMPPFX}t.tiff \${TMPPFX}.tiff
EOT
        fi
        if [ -n "${NORTH}" ]
        then
            cat <<EOT
	@\${RMTMP} \${TMPPFX}-north.${NSFX}
EOT
        fi
        if [ -n "${SOUTH}" ]
        then
            cat <<EOT
	@\${RMTMP} \${TMPPFX}-south.${SSFX}
EOT
        fi
    }
    epilogueLDR () {
        cat <<EOT
\${DST}.tiff: \${TMPPFX}.tiff
EOT
    }
    epilogueHDR () {
        [ -z "${HDRHTML}" ] \
        || cat <<EOT
${html}: \${TMPPFX}.tiff
	@pfsin \${TMPPFX}.tiff \\
	 | pfstag --set FILE_NAME="${HDRHTML}.pfs" \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfssize --maxx 1024 --maxy 768 \\
	 | pfswb -v -r ${HDRWBR} -g ${HDRWBG} -b ${HDRWBB} \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | ( \\
	    rm -rf '${html}' && mkdir '${html}' && cd '${html}' \\
	    && pfsouthdrhtml \\
	        -q 4 \\
	        -p ${HDRTMPL}/hdrhtml_page_templ.html \\
	        -i ${HDRTMPL}/hdrhtml_image_templ.html \\
	        index.html \
	    && cp -r ${HDRTMPL}/hdrhtml_assets ./ \\
	   )
EOT
        cat <<EOT
\${DST}.tiff: \${TMPPFX}.tiff ${html}
EOT
    }
    epilogueLDR0 () {
        cat <<EOT
	@\${CONV} \${TMPPFX}.tiff \\
		${DARG} \\
		-compress \${IMCOMP} \${DST}.tiff
	@\${RMTMP} \${TMPPFX}.tiff
EOT
    }
    epilogueLDR1 () {
        srgb=''
        [ "${RAWO}" = GAM ] || srgb='${sRGB}'
        cat <<EOT
	@\${CONV} \${TMPPFX}.tiff \\
		+matte +repage ${srgb} ${DARG} \\
		-compress \${IMCOMP} \${DST}.tiff
	@\${RMTMP} \${TMPPFX}.tiff
EOT
    }
    epilogueHDR0 () {
        cat <<EOT
#	@pfsin \${TMPPFX}.tiff \\
#	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
#	 | pfsgamma -m ${HDRGAMML} -g ${HDRGAMGM} \\
#	 | pfswb -v -r ${HDRWBR} -g ${HDRWBG} -b ${HDRWBB} \\
#	 | pfsoutpfm \${TMPPFX}.pfm
#	@\${RMTMP} \${TMPPFX}.tiff
#	@\${CONV} \${TMPPFX}.pfm \\
#		${DARG} \\
#		-compress \${IMCOMP} \${DST}.tiff
#	@\${RMTMP} \${TMPPFX}.pfm
	@\${CONV} \${TMPPFX}.tiff \\
		${DARG} \\
		-compress \${IMCOMP} \${DST}.tiff
	@\${RMTMP} \${TMPPFX}.tiff
EOT
        EPLTMP="\${TMPPFX}.pfm ${EPLTMP}"
    }
    epilogueHDR1 () {
        cat <<EOT
	@pfsin \${TMPPFX}.tiff \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfsgamma -m ${HDRGAMML} -g ${HDRGAMGM} \\
	 | pfswb -v -r ${HDRWBR} -g ${HDRWBG} -b ${HDRWBB} \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfstmo_reinhard05 -v -b ${HDRR05BR} -c ${HDRR05CH} -l ${HDRR05LT} \\
	 | pfsoutimgmagick -s -b 16 \${DST}.tiff
	@\${RMTMP} \${TMPPFX}.tiff
	@\${CONV} \${DST}.tiff \\
		+matte +repage ${DARG} \\
		-compress \${IMCOMP} \${DST}.tiff
EOT
    }
    epilogueHDR2 () {
        cat <<EOT
	@pfsin \${TMPPFX}.tiff \\
	 | pfsclamp --min 4 --max 65536 \\
	 | pfswb -v -r ${HDRWBR} -g ${HDRWBG} -b ${HDRWBB} \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfstmo_mantiuk08 -v -d ${HDRM08DF} -c ${HDRM08CS} -e ${HDRM08CE} \\
	 | pfsoutimgmagick -b 16 \${DST}.0.tiff
	@pfsin \${TMPPFX}.tiff \\
	 | pfsclamp --min 4 --max 65536 \\
	 | pfswb -v -r ${HDRWBR}e-04 -g ${HDRWBG}e-04 -b ${HDRWBB}e-04 \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfstmo_reinhard05 -v -b ${HDRR05BR} -c ${HDRR05CH} -l ${HDRR05LT} \\
	 | pfsoutimgmagick -s -b 16 \${DST}.1.tiff
	@\${RMTMP} \${TMPPFX}.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
	@\${RMTMP} \${DST}.0.tiff \${DST}.1.tiff \\
		\${DST}.2.tiff \${DST}.3.tiff \\
		\${DST}.4.tiff \${DST}.5.tiff
EOT
    EPLTMP='${DST}.0.tiff ${DST}.1.tiff ${DST}.2.tiff ${DST}.3.tiff ${DST}.4.tiff ${DST}.5.tiff'
    }
    epilogueHDR3 () {
        cat <<EOT
	@pfsin \${TMPPFX}.tiff \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfswb -v -r ${HDRWBR} -g ${HDRWBG} -b ${HDRWBB} \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfstmo_reinhard02 -v -k ${HDRR02KY} \\
	 | pfsgamma -m ${HDRGAMML} -g ${HDRGAMGM} \\
	 | pfsoutimgmagick -s -b 16 \${DST}.tiff
	@\${RMTMP} \${TMPPFX}.tiff
	@\${CONV} \${DST}.tiff \\
		+matte +repage ${DARG} \\
		-compress \${IMCOMP} \${DST}.tiff
EOT
    }
    epilogueHDR4 () {
        cat <<EOT
	@pfsin \${TMPPFX}.tiff \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfswb -v -r ${HDRWBR} -g ${HDRWBG} -b ${HDRWBB} \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfstmo_mantiuk08 -v -d ${HDRM08DF} -c ${HDRM08CS} -e ${HDRM08CE} \\
	 | pfsoutimgmagick -b 16 \${DST}.0.tiff
	@pfsin \${TMPPFX}.tiff \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfswb -v -r ${HDRWBR} -g ${HDRWBG} -b ${HDRWBB} \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfstmo_reinhard05 -v -b ${HDRR05BR} -c ${HDRR05CH} -l ${HDRR05LT} \\
	 | pfsoutimgmagick -s -b 16 \${DST}.1.tiff
	@\${RMTMP} \${TMPPFX}.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
	@\${RMTMP} \${DST}.0.tiff \${DST}.1.tiff \\
		\${DST}.2.tiff \${DST}.3.tiff \\
		\${DST}.4.tiff \${DST}.5.tiff
EOT
    EPLTMP='${DST}.0.tiff ${DST}.1.tiff ${DST}.2.tiff ${DST}.3.tiff ${DST}.4.tiff ${DST}.5.tiff'
    }
    epilogueHDR5 () {
        cat <<EOT
	@pfsin \${TMPPFX}.tiff \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfswb -v -r ${HDRWBR} -g ${HDRWBG} -b ${HDRWBB} \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfstmo_mantiuk06 -v -f ${HDRM06FR} -s ${HDRM06SN} \\
	 | pfstmo_reinhard02 -v -k ${HDRR02KY} \\
	 | pfsoutimgmagick -s -b 16 \${DST}.tiff
	@\${RMTMP} \${TMPPFX}.tiff
	@\${CONV} \${DST}.tiff \\
		+matte +repage ${DARG} \\
		-compress \${IMCOMP} \${DST}.tiff
EOT
    }
    epilogueHDR6 () {
        wy=''
        [ -z "${HDRM08WY}" ] || wy="-y ${HDRM08WY}"
        cat <<EOT
	@pfsin \${TMPPFX}.tiff \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfswb -v -r ${HDRWBR} -g ${HDRWBG} -b ${HDRWBB} \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfstmo_mantiuk08 -v -d ${HDRM08DF} -c ${HDRM08CS} -e ${HDRM08CE} ${wy} \\
	 | pfsoutimgmagick -b 16 \${DST}.tiff
	@\${RMTMP} \${TMPPFX}.tiff
	@\${CONV} \${DST}.tiff \\
		+matte +repage ${DARG} \\
		-compress \${IMCOMP} \${DST}.tiff
EOT
    }
    epilogueHDR7 () {
        [ -z "${IS360}" -o -z "${HDRTMOFS}" ] || {
            #!!!eval "$(identify -format 'TW=%w; TH=%h' ${TMPPFX}.tiff)"
            cat <<EOT
	@\${CONV} \${TMPPFX}.tiff +matte +repage \\
		-compress \${IMCOMP} \${TMPPFX}.tiff
EOT
        }
        cat <<EOT
	@pfsin \${TMPPFX}.tiff \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfsgamma -m ${HDRGAMML} -g ${HDRGAMGM} \\
	 | pfswb -v -r ${HDRWBR} -g ${HDRWBG} -b ${HDRWBB} \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | ${KEEPHDR} \\
	 | pfstmo_mantiuk06 -v -f ${HDRM06FR} -s ${HDRM06SN} \\
	 | pfsgamma -m ${HDRM06ML} -g ${HDRM06GM} \\
	 | pfsoutimgmagick -s -b 16 \${DST}.1.tiff
	@pfstmo_reinhard02 <\${TMPPFX}.pfs -v -k ${HDRR02KY} \\
	 | pfsgamma -m ${HDRR02ML} -g ${HDRR02GM} \\
	 | pfsoutimgmagick -s -b 16 \${DST}.0.tiff
	@\${RMTMP} \${TMPPFX}.tiff \${TMPPFX}.pfs
	@\${CONV} \${DST}.0.tiff +matte +repage \\
		\( +clone \\
			${HDR7GRAY} \\
			+level ${HDR7ALVL0} \\
			-gaussian-blur ${HDR7ABLR0} \\
			-alpha copy \\
			\( \${DST}.1.tiff +matte +repage \) \\
			+swap \\
			-compose copy-opacity -composite \) \\
		-compose ${HDR7CMPS0} -composite +matte \\
		\( +clone \\
			${HDR7GRAY} \\
			+level ${HDR7ALVL1} \\
			-gaussian-blur ${HDR7ABLR1} \\
			-alpha copy \\
			\( \${DST}.1.tiff +matte +repage \) \\
			+swap \\
			-compose copy-opacity -composite \) \\
		-compose ${HDR7CMPS1} -composite +matte \\
		${DARG} -compress \${IMCOMP} \${DST}.tiff
	@\${RMTMP} \${DST}.[01].tiff
EOT
    }
    epilogueHDR8 () {
        wy=''
        [ -z "${HDRM08WY}" ] || wy="-y ${HDRM08WY}"
        cat <<EOT
	@pfsin \${TMPPFX}.tiff \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfsgamma -m ${HDRGAMML} -g ${HDRGAMGM} \\
	 | pfswb -v -r ${HDRWBR} -g ${HDRWBG} -b ${HDRWBB} \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | ${KEEPHDR} \\
	 | pfstmo_mantiuk08 -v -d ${HDRM08DF} -c ${HDRM08CS} -e ${HDRM08CE} ${wy} \\
	 | pfsgamma -m ${HDRM08ML} -g ${HDRM08GM} \\
	 | pfsoutimgmagick -s -b 16 \${DST}.1.tiff
	@pfstmo_reinhard02 <\${TMPPFX}.pfs -v -k ${HDRR02KY} \\
	 | pfsgamma -m ${HDRR02ML} -g ${HDRR02GM} \\
	 | pfsoutimgmagick -s -b 16 \${TMPPFX}.0.tiff
	@\${RMTMP} \${TMPPFX}.tiff \${TMPPFX}.pfs
	@\${CONV} \${DST}.0.tiff +matte +repage \\
		\( \${DST}.1.tiff +matte +repage \\
		    \( +clone +level ${HDR8ALVL} -alpha copy \) \\
		    -compose copy-opacity -composite \) \\
		-compose overlay -composite +matte \\
		${DARG} -compress \${IMCOMP} \${DST}.tiff
	@\${RMTMP} \${DST}.[01].tiff
EOT
    }
    epilogueHDR9 () {
        wy=''
        [ -z "${HDRM08WY}" ] || wy="-y ${HDRM08WY}"
        cat <<EOT
	@pfsin \${TMPPFX}.tiff \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfsgamma -m ${HDRGAMML} -g ${HDRGAMGM} \\
	 | pfswb -v -r ${HDRWBR} -g ${HDRWBG} -b ${HDRWBB} \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | ${KEEPHDR} \\
	 | pfstmo_mantiuk08 -v -d ${HDRM08DF} -c ${HDRM08CS} -e ${HDRM08CE} ${wy} \\
	 | pfsgamma -m ${HDRM08ML} -g ${HDRM08GM} \\
	 | pfsoutimgmagick -s -b 16 \${DST}.2.tiff
	@pfstmo_reinhard05 <\${TMPPFX}.pfs -v -b ${HDRR05BR} -c ${HDRR05CH} -l ${HDRR05LT} \\
	 | pfsoutimgmagick -s -b 16 \${DST}.1.tiff
	@pfstmo_reinhard02 <\${DSTMPPFX}.pfs -v -k ${HDRR02KY} \\
	 | pfsgamma -m ${HDRR02ML} -g ${HDRR02GM} \\
	 | pfsoutimgmagick -s -b 16 \${DST}.0.tiff
	@\${RMTMP} \${TMPPFX}.tiff \${TMPPFX}.pfs
	@\${CONV} \${DST}.0.tiff +matte +repage -modulate ${HDR9MDLT} \\
		\( \${DST}.1.tiff +matte +repage \\
		    \( +clone +level ${HDR9ALVL1} -alpha copy \) \\
		    -compose copy-opacity -composite \) \\
		-compose overlay -composite +matte \\
		\( \${DST}.2.tiff +matte +repage \\
		    \( +clone +level ${HDR9ALVL2} -alpha copy \) \\
		    -compose copy-opacity -composite \) \\
		-compose overlay -composite +matte \\
		${DARG} -compress \${IMCOMP} \${DST}.tiff
	@\${RMTMP} \${DST}.[0-2].tiff
EOT
    }
    epilogueHDR10 () {
        wy=''
        [ -z "${HDRM08WY}" ] || wy="-y ${HDRM08WY}"
        cat <<EOT
	@pfsin \${TMPPFX}.tiff \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfsgamma -m ${HDRGAMML} -g ${HDRGAMGM} \\
	 | pfswb -v -k -r ${HDRWBR} -g ${HDRWBG} -b ${HDRWBB} \\
	 | pfsclamp --min ${HDRCLMMN} --max ${HDRCLMMX} \\
	 | pfstag -s LUMINANCE=RELATIVE \\
	 | tee \${TMPPFX}.pfs \\
	 | pfsgamma -m ${HDRR05ML} -g ${HDRR05GM} \\
	 | pfstmo_reinhard05 -v -b ${HDRR05BR} -c ${HDRR05CH} -l ${HDRR05LT} \\
	 | pfsoutimgmagick -s -b 16 \${DST}.1.tiff
	@pfstmo_mantiuk08 <\${TMPPFX}.pfs -v -d ${HDRM08DF} -c ${HDRM08CS} -e ${HDRM08CE} ${wy} \\
	 | pfsgamma -m ${HDRM08ML} -g ${HDRM08GM} \\
	 | pfstag -s LUMINANCE=RELATIVE \\
	 | pfsoutimgmagick -s -b 16 \${DST}.0.tiff
	@\${RMTMP} \${TMPPFX}.tiff \${TMPPFX}.pfs
	@\${CONV} \${DST}.0.tiff +matte +repage \\
		\( +clone \\
			${HDR10GRAY} \\
			+level ${HDR10ALVL} \\
			-sigmoidal-contrast ${HDR10ASCN} \\
			-gaussian-blur ${HDR10ABLR} \\
			-alpha copy \\
			\( \${DST}.1.tiff +matte +repage \) \\
			+swap \\
			-compose copy-opacity -composite \) \\
		-compose ${HDR10CMPS} -composite +matte \\
		${DARG} -compress \${IMCOMP} \${DST}.tiff
	@\${RMTMP} \${DST}.[01].tiff
EOT
    }
    remap () {
        SRC="${NAM}${ESF}${FSF}.tiff"
        eval "EV=\${EV${e}}; SEV=\${EV${e}S${s}}; FEV=\${EV${e}S${s}F${f}}"
        eval "$(srcdef)"
        [ -n "${ISRC}" ] || return 1
        eval "EVR=\${E${REMAPEV}}"
        [ -z "${EV}" ] || EVR="${EV}"
        [ -z "${SEV}" ] || EVR="${SEV}"
        [ -z "${FEV}" ] || EVR="${FEV}"
        [ -z "${EVR}" ] || EVR="-e ${EVR}"
        t=$(printf '${TMPPFX}-%04d.%s' ${ISRC} ${TMPSFX})
        m=''
        [ "${PROCESS}" = HDR ] \
        && m=$(printf ' ${TMPPFX}-%04d_gray.pgm' ${ISRC})
        cat <<EOT
${t}: \${DST}.pto ${SRC}
	@#\${MV} ${SRC} x${SRC}
	@#\${CONV} x${SRC} +strip -compress \${IMCOMP} ${SRC}
	@\${REMAP} -i ${ISRC} ${EVR} \${DST}.pto
	@#\${MV} x${SRC} ${SRC}
EOT
        RMIN="${RMIN} ${SRC}${m}"
        n="${SRC}"
        SRC="\${TMPPFX}f${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=''
        #[ "${RAWO}" = GAM ] \
        #|| 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
	@\${RMTMP} ${t}
EOT
        FCRM="${FCRM} ${t}"
        FFIN="${FFIN} ${SRC}"
    }
    fstack () {
        FFIN="${FFIN# }"
        t="${FFIN}"
        if [ "$(echo "${t}" | wc -w)" -gt 1 ]
        then
            t="\${TMPPFX}et${NAM}${ESF}.tiff"
            cat <<EOT
${t}: ${FFIN}
	@\${FFUSE} -o ${t} ${FFIN}
EOT
            [ "${PROCESS}" = HDR ] && cat <<EOT
	@\${EXIFTFF} ${FFIN%% *} \${EXIFTAG} ${t}
EOT
            cat <<EOT
	@\${RMTMP} ${FFIN}
EOT
            FCRM="${FCRM} ${FFIN}"
        fi
        SRC="\${TMPPFX}e${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=\\\${TMPPFX}e${NAM}\${ESF${p}}.tiff"
            l=yes
            [ "${RAWO}" = LIN ] || l=''
            ps="${ps} ${p}"
            ap="$(printf '%s\n\t%s' "${ap}" "@env RGBPROFILE='\${RGBPROFILE}' sRGBPROFILE='\${sRGBPROFILE}' CONV='\${CONV}' IMCOMP='\${IMCOMP}' RM='\${RMTMP}' sh ../../tools/applypatch ${g} ${p} ${SRC} ${n} ${l} ${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
	@\${RMTMP} ${t}
EOT
        EFRM="${EFRM} ${t}"
        EMIN="${EMIN} "`jot -s ' ' -b "${SRC}" ${EMWT}`
    }
    estack () {
        EMIN="${EMIN# }"
        t="\${TMPPFX}t${NAM}.tiff"
        cat <<EOT
${t}: ${EMIN}
EOT
        ECNT="$(echo "${EMIN}" | wc -w)"
        if [ "${ECNT}" -gt 1 ]
        then
            [ -z "${STK}" ] \
            || cat <<EOT
	@env CONV='\${CONV}' RM='\${RMTMP}' sh ../../tools/stackmask ${EMIN}
EOT
            if [ -n "${DGH}" ]
            then
                [ "${RAWO}" = GAM ] \
                || cat <<EOT
	@for n in ${EMIN}; \\
	 do \\
		\${CONV} \$\${n} \${sRGB} \$\${n}; \\
	 done
EOT
                cat <<EOT
	@\${DEGHOST} ${EMIN}
EOT
                [ "${RAWO}" = GAM ] \
                || cat <<EOT
	@for n in ${EMIN}; \\
	 do \\
		\${CONV} \$\${n} \${RGB} \$\${n}; \\
	 done
EOT
                cat <<EOT
	@for n in ${EMIN}; \\
	 do \\
		\${CONV} \$\${n} \\( +clone -fx '1-s.o' +matte \$\${n%.tiff}_mask.tif -compose multiply -composite \\) -compose copy-opacity -composite \$\${n}; \\
		\${RMTMP} \$\${n%.tiff}_mask.tif; \\
	 done
EOT
                EFRM="${EFRM} ${n%.tiff}_mask.tif"
            fi
        fi
        if [ "${ECNT}" -eq 1 ]
        then
            if [ "${EMSI}" = LINK ]
            then
                cat <<EOT
	@\${LN} ${EMIN} ${t}
EOT
            else
                cat <<EOT
	@\${MERGE} -o ${t} ${EMIN} ${EMIN}
EOT
            fi
        else
            cat <<EOT
	@\${MERGE} -o ${t} ${EMIN}
EOT
        fi
        cat <<EOT
	@\${RMTMP} ${EMIN}
EOT
        EFRM="${EFRM} ${EMIN}"
        SRC="\${TMPPFX}${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
	@\${RMTMP} ${t}
EOT
        EFRM="${EFRM} ${t}"
        BLIN="${BLIN} ${SRC}"
    }
    clean () {
        cat <<EOT

clean: 
	@-\${RMSRC} ${RMIN# }
	@-\${RMTMP} ${FCRM# }
	@-\${RMTMP} ${EFRM# }
	@-\${RMTMP} ${BLIN# }
	@-\${RMTMP} \${TMPPFX}.tiff ${EPLTMP# }
	@-\${RMDST} \${DST}.tiff
EOT
    }
    html=''
    [ -z "${HDRHTML}" ] || html="${HDRHTML}-hdr"
    prologue
    prologue${PROCESS}
    RMIN=''
    FCRM=''
    EFRM=''
    BLIN=''
    EPLTMP=''
    for s in ${SEC}
    do
        eval "NAM=\${NAM${s}}"
        eval "EXP=\${EXP${s}}"
        nexp=$(echo "${EXP}" | wc -w)
        EMIN=''
        EMWT=1
        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}}"
            eval "EMWT=\${EWT${s}E${e}}"
            [ -n "${EMWT}" ] || eval "EMWT=\${EWTE${e}}"
            [ -n "${EMWT}" ] || EMWT=1
            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}"
    "epilogue${PROCESS}${EPL}"
    [ -z ${DINP} ] || {
        for n in ${DINP}
        do
            eval "g=\${DINP${n}}"
            cat <<EOT
	@env INPNT='\${INPNT}' CONV='\${CONV}' IMCOMP='\${IMCOMP}' sh ../../tools/inpaint '\${DST}' '${g}' ${n}
EOT
        done
    }
    [ -r "${DST}.tiff.xmp" ] && {
        cat <<EOT
	@DRKRAW=\${DST}.tiff; DRKOUT=\${DST}.tiff; \\
		$(echo "${DRKGAM}" | sed -e 's/\$/$$/g') \\
		&& test -r \${DST}.tif \\
		&& mv \${DST}.tif \${DST}.tiff
EOT
    }
    clean
}

inpaint () {
    local d g n
    d=${1}
    g=${2}
    n=${3}
    [ -r mask-${d}.${n}.png ] || return
    eval ${CONV} ${d}.tiff \
        -crop ${g} \
        -compress ${IMCOMP} ${d}.${n}.tiff 
    mv ${d}.tiff ${d}.0.tiff
    greycstoration -inpaint ${d}.${n}.tiff \
        -iter 1024 -bits 16 \
        -m mask-${d}.${n}.png \
        -o ${d}.${n}.tiff
    eval ${CONV} ${d}.0.tiff ${d}.${n}.tiff \
        -geometry ${g} \
        -compose src-over -composite \
        -compress ${IMCOMP} ${d}.tiff
    rm ${d}.0.tiff ${d}.${n}.tiff
}

apply_patch () {
    g=${1}; shift
    se=${1}; shift
    de=${1}; shift
    n=${1}; shift
    [ -n ${n} ] || n=1
    rgb=''; srgb=''
    [ "${RAWO}" = LIN ] || { rgb="${RGB}"; srgb="${sRGB}"; }
    eval ${CONV} ${DST}-e${se}.tiff \
        -crop ${g} +repage \
        ${rgb} "${@}" ${srgb} \
        -compress ${IMCOMP} ${DST}-e${de}.${n}.tiff 
    [ -r mask-${DST}-e${de}.${n}.png ] \
    && eval ${CONV} ${DST}-e${de}.${n}.tiff \
        mask-${DST}-e${de}.${n}.png -compose copyopacity -composite \
        -compress ${IMCOMP} ${DST}-e${de}.${n}.tiff
    mv ${DST}-e${de}.tiff ${DST}-e${de}.0.tiff
    eval ${CONV} ${DST}-e${de}.0.tiff ${DST}-e${de}.${n}.tiff \
        -geometry ${g} \
        -compose src-over -composite \
        -compress ${IMCOMP} ${DST}-e${de}.tiff
    rm ${DST}-e${de}.0.tiff ${DST}-e${de}.${n}.tiff
}

apply_patch2 () 
{
    dg=${1}; shift
    sg=${1}; shift
    n=${1}; shift
    [ -n ${n} ] || n=1
    rgb=''; srgb=''
    [ "${RAWO}" = LIN ] || { rgb="${RGB}"; srgb="${sRGB}"; }
    eval ${CONV} ${DST}.tiff \
        -crop ${sg} +repage \
        ${rgb} "${@}" ${srgb} \
        -compress ${IMCOMP} ${DST}.${n}.tiff 
    [ -r mask-${DST}.${n}.png ] \
    && eval ${CONV} ${DST}.${n}.tiff \
        mask-${DST}.${n}.png -compose copyopacity -composite \
        -compress ${IMCOMP} ${DST}.${n}.tiff
    mv ${DST}.tiff ${DST}.0.tiff
    eval ${CONV} ${DST}.0.tiff ${DST}.${n}.tiff \
        -geometry ${dg} \
        -compose src-over -composite \
        -compress ${IMCOMP} ${DST}.tiff
    rm ${DST}.0.tiff ${DST}.${n}.tiff
}

apply_patch3 () 
{
    dst=${1}; shift
    dg=${1}; shift
    src=${1}; shift
    sg=${1}; shift
    n=${1}; shift
    [ -n ${n} ] || n=1
    rgb=''; srgb=''
    [ "${RAWO}" = LIN ] || { rgb="${RGB}"; srgb="${sRGB}"; }
    eval ${CONV} ${src}.tiff \
        -crop ${sg} +repage \
        ${rgb} "${@}" ${srgb} \
        -compress ${IMCOMP} ${dst}.${n}.tiff 
    [ -r mask-${dst}.${n}.png ] \
    && eval ${CONV} ${dst}.${n}.tiff \
        mask-${dst}.${n}.png -compose copyopacity -composite \
        -compress ${IMCOMP} ${dst}.${n}.tiff
    mv ${dst}.tiff ${dst}.0.tiff
    eval ${CONV} ${dst}.0.tiff ${dst}.${n}.tiff \
        -geometry ${dg} \
        -compose src-over -composite \
        -compress ${IMCOMP} ${dst}.tiff
    rm ${dst}.0.tiff ${dst}.${n}.tiff
}

cubic () {
    CDIR="${1}"; shift
    CSIZ="${1}"; shift
    yaw=''
    [ -z "${CYAW}" ] || yaw="--yaw='${CYAW}'"
    gpu=''
    [ "${CGPU}0" -eq 0 -o -z "${DISPLAY}" ] || gpu='-g'
    eval "${CONV} ${DST}.tiff ${*} -compress ${IMCOMP} '${CDIR}/erect.tiff'" \
    && BASEDIR="$(pwd)" \
    && cd "${CDIR}" \
    && eval "erect2cubic --erect=erect.tiff \
        ${yaw} \
        --ptofile=cubic.pto" \
    && ptsed -Pw,h:${CSIZ} -Mi:7 -o cubic.pto cubic.pto \
    && ${LDRREMAP} ${gpu} -o face- cubic.pto
    r=${?}
    ${RMTMP} erect.tiff cubic.pto
    cd "${BASEDIR}"
    return ${r}
}

qtvr () {
    n=''
    [ -z "${NAME}" ] || n="--name='${NAME}'"
    mkdir -p "${TMPDIR}/${DST}" \
    && cubic "${TMPDIR}/${DST}" ${QSIZ:=2048} "${@}" \
    && cd "${TMPDIR}/${DST}" \
    && for n in 0 1 2 3 4 5
       do
        eval ${CONV} face-000${n}.tif \
                -sharpen 0x1.16331 \
                    \\\( +clone ${FINAL} -quality 90 -write face-big-${n}.jpg \\\) \
                -resize 1024 -sharpen 0x0.76105 \
                    \\\( +clone ${FINAL} -quality 90 -write face-middle-${n}.jpg \\\) \
                -resize 512 -sharpen 0x0.51848 \
                    \\\( +clone ${FINAL} -quality 92 -write face-small-${n}.jpg \\\) \
                -resize 256 -sharpen 0x0.42410 \
                                ${FINAL} -quality 80 preview-${n}.jpg \
        && ${RMTMP} face-000${n}.tif
       done \
    && eval "jpeg2qtvr \
        --prefix=face-small- --preview=preview- ${n} \
        --width=400 --height=300 \
        --outfile='${BASEDIR}/${DST}-small.mov'" \
    && eval "jpeg2qtvr \
        --prefix=face-middle- --preview=preview- ${n} \
        --width=768 --height=576 \
        --outfile='${BASEDIR}/${DST}-middle.mov'" \
    && eval "jpeg2qtvr \
        --prefix=face-big- --preview=preview- ${n} \
        --width=1280 --height=960 \
        --outfile='${BASEDIR}/${DST}-big.mov'"
    cd "${BASEDIR}"
    rm -rf ${TMPDIR}/${DST}
    test -r "${DST}-small.mov" -a -r "${DST}-middle.mov" -a -r "${DST}-big.mov"
}

tiles () {
    : "${TLVL=5}"
    : "${TMIN=256}"
    : "${TSHR=1.64516877924425}"
    mkdir -p "${1}" \
    && cubic "${@}" \
    && {
        l=${TLVL}
        s=${TSHR}
        while [ ${l} -gt 0 ]
        do
            l=$((${l}-1))
            eval "$(
                awk "
                    END {
                        split(\"${TFCS}\",p,/:/);
                        S=p[${l}*2+1];
                        t=p[${l}*2+2];
                        if (!S) {
                            S=${2}/(2**(${TLVL}-${l}-1));
                        }
                        if (!t) {
                            t=2**${l};
                        }
                        print \"T=\" S/t \"; t=\" t \"; S=\" S \"; s=\" ${s}/sqrt(2)
                    }" /dev/null
            )"
            [ ${S}0 -gt 0 -a ${t}0 -gt 0 ] || continue
            [ ${S}0 -ge ${TMIN}0 ] || break
            echo "level: ${l} (${S}); tiles: ${t} (${T}); sharpen: ${s}" >&2
            for n in 0 1 2 3 4 5
            do
                f=$(echo ${n} | tr 0-5 frblud) || return ${?}
                eval ${CONV} "'${1}/face-000${n}.tif'" \
                    -resize ${S} -sharpen 0x${s} \
                    -compress ${IMCOMP} -write "'${1}/face-000${n}.tif'" \
                    ${FINAL} \
                    -crop ${T}x${T} -quality 90 "'${1}/t.jpeg'" \
                && y=${t} \
                && while [ ${y} -gt 0 ]
                   do
                    y=$((${y}-1))
                    mkdir -p "${1}/${DST}/${l}/${f}/${y}" \
                    && x=${t} \
                    && while [ ${x} -gt 0 ]
                       do
                        x=$((${x}-1))
                        N=t-$((${t}*${y}+${x})).jpeg
                        [ -r "${1}/${N}" ] || N='t.jpeg'
                        mv "${1}/${N}" "${1}/${DST}/${l}/${f}/${y}/${x}.jpg"
                       done
                   done
            done
        done
        ${RMTMP} "${1}"/face-000[0-5].tif
        l=0
        while true
        do
            [ -d "${1}/${DST}/${l}" -o ${l} -gt ${TLVL} ] || {
                l=$((${l}+1))
                continue
            }
            break
        done
        [ -d "${1}/${DST}/${l}/b/1" ] \
        || eval ${CONV} "${1}/${DST}/${l}/"[bdflru]/0/0.jpg \
                -append "${1}/${DST}/preview.jpg"
    } 
}

globe () {
    [ -z "${GFILL}" ] || {
        h=$(identify -format '%h' ${DST}.tiff)
        y=$((${h}/2))
        r=$((${h}/64))
        s=$((${r}/3))
        echo "globe: h=${h}; y=${y}; blur ${r}x${s}"
        eval ${CONV} ${DST}.tiff \
            \(  -size ${h}x${h} "xc:${GFILL}" \
                \(  -colorspace gray -virtual-pixel white \
                    -size ${h}x${h} xc:white \
                    -fill black -box black -draw "circle ${y},${y} ${y},1" \
                    -blur ${r}x${s} +matte \
                \) \
                -compose copyopacity -composite \
            \) \
            -compose src-over -composite \
            -compress ${IMCOMP} ${DST}.tiff
    }
    ${FULLA} -g "${GDIST}" -o ${DST}.tiff ${DST}.tiff
    [ -z "${GCROP}" ] \
    || eval ${CONV} ${DST}.tiff -crop "${GCROP}" -compress ${IMCOMP} ${DST}.tiff
}

[ "${3}" = prnsrc ] && { prnsrc; exit; }
[ "${1}" = cluster -o "${1}" = mkprocessmf -o "${1}" = clean ] \
|| prep "${@}"
[ "${1}" = prep ] && exit
[ "${1}" = auto ] && { auto "${@}"; exit; }
[ "${1}" = cluster ] && { cluster "${@}"; exit; }
[ "${1}" = mkprocessmf ] && { mkprocessmf "${@}"; exit; }
[ "${1}" = clean ] && {
    mkprocessmf "${@}" >Makefile
    make clean
    rm Makefile
    exit
}
{
    mkprocessmf "${@}" >Makefile \
    && make all \
    && { [ -n "${3}" ] || ${RMTMP} Makefile; }
} || exit ${?}
#if [ "${3}" = a ]
#then
#    inpaint ${DST} 480x480+4224+5056 1
#    inpaint ${DST} 64x128+4832+4576 2
#else
#    inpaint ${DST} 320x64+64+2720 1
#    inpaint ${DST} 128x64+7840+2688 2
#fi
#[ "${3}" = a ] || {
#    apply_patch2 64x96+1536+1952 64x96+1546+1952 1
#    apply_patch2 96x320+1504+2032 96x320+1568+2032 2
#}
#inpaint ${DST} 480x480+2976+2592 1
[ "${1}" = pano ] && exit

[ 0"${ISSPH}" -eq 0 -o 0"${QTVR}" -eq 0 ]   || qtvr
[ 0"${ISSPH}" -eq 0 -o 0"${TILES}" -eq 0 ]  || tiles tiles ${TSIZ:=3072}
[ 0"${GLOBE}" -eq 0 ] || globe

(
    set -- ${DST}.tiff
    . ../../tools/tiff2jpeg
    ${RMDST} ${DST}.tiff
)
