Ë
    ‰½×jèO  ã                   ó  — d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	m	Z	 ddl
mZ ddlmZ ddlZddlmZmZ ddlmZ ej(                  j+                  d	d
¬«        ee«      j/                  «       j0                  j0                  Zedz  dz  Zedz  dz  Zedz  dz  ZdZh d£Zh d£Zde de!fd„Z"de!de!de#fd„Z$de fd„Z%d„ Z&defd„Z'd„ Z(d„ Z)d(d„Z*d)d „Z+d!„ Z,d*d"„Z-d#„ Z.d$„ Z/d+d%„Z0d&„ Z1e2d'k(  r e3 e1«       «      ‚y),uª  
pose_harvest: rescata poses ya renderizadas (origin=explore) y las prepara
para revisiÃ³n y promociÃ³n al banco.

Fase 1 del plan de ampliaciÃ³n: no gasta GPU. Lee los manifiestos de
Output/pilots y Output/packs, limpia las lÃ­neas (ropa, accesorios, escena,
atrezo), descarta blacklist y casi-duplicados (Jaccard por conjunto de tags),
y escribe una carpeta de revisiÃ³n con:

    candidates.json   -> editable: approved true/false, blacklist, motivos
    review.html       -> miniaturas + lÃ­nea propuesta + origen
    contact_<nivel>.jpg

PromociÃ³n (despuÃ©s de revisar y editar candidates.json):

    python Engine/pose_harvest.py --promote Output/pose_review/<stamp>/candidates.json

`approved: true` aÃ±ade la pose al banco (copia la imagen a refs/). `approved:
false` la descarta sin blacklist. Para blacklist hace falta `blacklist: true`
(y motivos): solo cuando la pose en sÃ­ es mala, no cuando la imagen concreta
saliÃ³ mal.
é    N)ÚCounter)Údatetime)ÚPath)Úquote)Ú
clean_lineÚtag_key)ÚSCENEúutf-8Úbackslashreplace)ÚencodingÚerrorsÚOutputÚpilotsÚpacksÚpose_review)Ú	sugerenteÚspicyÚ	explicito>   Ú1boyÚsoloÚ1girlÚhetero>	   ÚflyingÚ	bathhouseÚnaked_towelÚholding_foodÚholding_swordÚnaked_bandageÚholding_umbrellaÚholding_clothes_hangerÚholding_unworn_clothesÚlineÚreturnc                 ód   — t        j                  | «      D �ch c]  }|t        vsŒ|’Œ c}S c c}w ©N)Ú	pose_bankÚ	signatureÚGENERIC)r"   Úts     úEngine\pose_harvest.pyÚ_content_tokensr+   9   s.   € Ü ×*Ñ*¨4Ô0ÓEÑ0�!°A¼WÒ4DŠAÐ0ÑEÐEùÒEs   ˜-¦-ÚaÚbc                 óF   — | r|syt        | |z  «      t        | |z  «      z  S )Nç        ©Úlen)r,   r-   s     r*   Ú_jaccardr2   =   s%   € Ù‘AØÜˆq�1‰u‹:œ˜A ™E›
Ñ"Ð"ó    c                 ó0  — t        | «      \  }}g }|j                  d«      D ]`  }|j                  «       }t        |«      }|sŒ!|t        v st        j                  |«      r|j                  |«       ŒP|j                  |«       Œb dj                  |«      |fS )zEQuita ropa/meta (clean_bank_lines) y escena/atrezo (SCENE/PROP_DROP).Ú,ú, )	r   ÚsplitÚstripr   Ú	PROP_DROPr	   ÚmatchÚappendÚjoin)r"   ÚcleanedÚdroppedÚkeptÚtokenÚkeys         r*   Ú_clean_pose_linerB   C   s†   € ä! $Ó'Ñ€GˆWØ€DØ—‘˜sÖ#ˆØ—‘“ˆÜ�e‹nˆÙØØ”)ÑœuŸ{™{¨3Ô/Ø�N‰N˜3ÔØØ�‰�EÕð $ð �9‰9�T‹?˜GÐ#Ð#r3   c           	   #   ó   K  — | D ]Î  }|j                  «       st        d|› d�«       Œ#t        |j                  d«      «      D ]�  }	 t	        j
                  |j                  d¬«      «      }t        |t        «      r|j                  d«      n|}t        |t        «      sŒ]|D ].  }t        |t        «      sŒ|j                  d	«      d
k(  sŒ)||f–— Œ0 Œ‘ ŒÐ y # t        t        j                  f$ r}t        d|› d|› �«       Y d }~ŒÄd }~ww xY w­w)Nz[i] no existe z
; se saltazpack_manifest.jsonr
   ©r   z[!] manifiesto ilegible ú: ÚrecordsÚoriginÚexplore)ÚexistsÚprintÚsortedÚrglobÚjsonÚloadsÚ	read_textÚOSErrorÚJSONDecodeErrorÚ
isinstanceÚdictÚgetÚlist)ÚrootsÚrootÚmanifestÚdataÚerF   Úrecs          r*   Ú_iter_recordsr\   S   só   è ø€ ÛˆØ�{‰{Œ}Ü�N 4 &¨
Ð3Ô4ØÜ˜tŸz™zÐ*>Ó?Ö@ˆHðÜ—z‘z (×"4Ñ"4¸gÐ"4Ó"FÓG�ô .8¸¼dÔ-C�d—h‘h˜yÔ)ÈˆGÜ˜g¤tÔ,ØÛ�Ü˜c¤4Õ(¨S¯W©W°XÓ->À)Ó-KØ" C˜-Ó'ñ ñ Añ	 øô œT×1Ñ1Ð2ò ÜÐ0°°
¸"¸Q¸CÐ@ÔAÜûðüs=   ‚ADÁ%CÁ+A	DÂ5DÃ
DÃDÃ0DÄDÄDÄDÚrun_dirc                 ó  — | j                  d«      xs d}|sy t        |«      j                  }dD ],  }||z  |z  }|j                  «       sŒ|j	                  «       c S  ||z  }|j                  «       r|j	                  «       S d S )NÚfileÚ )ÚrawÚimg)rT   r   ÚnamerI   Úresolve)r[   r]   Úrelrc   ÚsubÚ	candidates         r*   Ú_source_forrh   f   s„   € Ø
�'‰'�&‹/Ò
˜R€CÙØÜ�‹9�>‰>€DÛˆØ˜c‘M DÑ(ˆ	Ø×ÑÕØ×$Ñ$Ó&Ò&ð ð ˜#‘€IØ"+×"2Ñ"2Ô"4ˆ9×ÑÓÐ>¸$Ð>r3   c           
      ó®   — i }| D ]M  }|j                  |j                  d«      g «      j                  |t        |j                  dd«      «      f«       ŒO |S )NÚnivelÚ	pose_liner`   )Ú
setdefaultrT   r;   r+   )ÚbankÚby_levelÚentrys      r*   Ú_bank_indexrp   s   sU   € Ø€HÛˆØ×Ñ˜EŸI™I gÓ.°Ó3×:Ñ:Ø”O E§I¡I¨k¸2Ó$>Ó?Ð@õ	Bð ð €Or3   c                 ó‚   — d\  }}|j                  |g «      D ]  \  }}t        | |«      }||kD  sŒ||}}Œ ||k\  r||fS dS )N)r/   N)rT   r2   )	ÚtokensÚlevelÚ
bank_indexÚ	thresholdÚbest_jÚ
best_entryro   ÚsigÚjs	            r*   Ú
_near_bankrz   {   sZ   € Ø"Ñ€FˆJØ —n‘n U¨BÖ/‰
ˆˆsÜ�V˜SÓ!ˆØˆv‹:Ø!" E�J‰Fð 0ð $*¨YÒ#6ˆF�JÐÐG¸KÐGr3   c                 óŽ  ‡— t        j                  «       }t        j                  «       }t        |«      }t	        «       }g }t        «       }t        | «      D �]4  \  }	}
|dxx   dz  cc<   |
j                  d«      }|t        vr|dxx   dz  cc<   Œ;t        |
j                  dd«      «      \  }}t        |«      }t        |«      |k  r|dxx   dz  cc<   Œ€t        j                  ||«      r|dxx   dz  cc<   Œ¤t        ||||«      \  }}|�W|d	xx   dz  cc<   t        d
t        |
j                  dd«      «      j                   › d|j                  d«      › d|d›d�«       �Œt#        |
|	j$                  «      }|€|dxx   dz  cc<   �Œ5t'        |«      }||v r|dxx   dz  cc<   �ŒS|j)                  |«       |j+                  ||t,        j.                  j1                  |t2        «      j5                  dd«      |j                   |	j$                  j                   t        |
j                  dd«      «      j                   |
j                  d«      |
j                  dd«      |
j                  dd«      t7        t        |«      «      |dœ«       �Œ7 g }t7        |d„ ¬«      D ]w  }d }|D ]+  }|d   |d   k7  rŒt9        |d   |d   «      }||k\  sŒ'||f} n |r0|dxx   dz  cc<   t        d
|d   › d|d   d   › d|d   d›d�«       Œg|j+                  |«       Œy |j;                  d „ ¬«       t=        |d«      D ]5  \  }}||d!<   d |d"<   d#|d$<   g |d%<   d|d&<   d |d'<   |j?                  dd «       Œ7 t        D �‡ci c]  Š‰tA        ˆfd(„|D «       «      “Œ }}|d   t        |«      ||d   |d	   |d   |d   |d   d)œd*œ}||fS c c}w )+NrH   é   rj   Únivel_desconocidork   r`   Ú
pocos_tagsÚblacklistedÚcasi_duplicado_bancoz[i] r_   z: ~Úidz (j=z.2fÚ)Ú
sin_imagenÚmisma_imagenÚ\Ú/ÚseedÚcharÚlora_weightç      ð?)rj   rk   ÚsourceÚsource_nameÚrunr_   r‡   rˆ   r‰   r>   rr   c                 ó*   — t        | d   «       | d   fS )Nrr   r‹   r0   ©Úcs    r*   Ú<lambda>zcollect.<locals>.<lambda>º   s   € ¤s¨1¨X©;Ó'7Ð&7¸¸8¹Ñ%Er3   )rA   rr   Úcasi_duplicado_candidatorŒ   r   c                 ó<   — t         j                  | d   «      | d   fS )Nrj   r‹   )ÚLEVELSÚindexr�   s    r*   r‘   zcollect.<locals>.<lambda>Ê   s   € œVŸ\™\¨!¨G©*Ó5°q¸±{ÑCr3   r•   ÚapprovedFÚ	blacklistÚmotivosÚnotasÚpromoted_idc              3   ó4   •K  — | ]  }|d    ‰k(  sŒd–— Œ y­w)rj   r|   N© )Ú.0r�   Úlvs     €r*   Ú	<genexpr>zcollect.<locals>.<genexpr>Ô   s   øè ø€ Ð<¡4˜a¨1¨W©:¸Ó+;œ¡4ùs   ƒ‘)r   r€   r’   r~   rƒ   )Úexplore_leidosÚ
candidatasÚ	por_nivelÚdescartadas)!r&   Ú	load_bankÚ
load_avoidrp   r   Úsetr\   rT   r”   rB   r+   r1   Ú
is_avoidedrz   rJ   r   rc   rh   ÚparentÚstrÚaddr;   ÚosÚpathÚrelpathÚBASE_DIRÚreplacerK   r2   ÚsortÚ	enumerateÚpopÚsum)rV   Úmin_jaccardÚ
min_tokensrm   Úavoidrt   ÚstatsÚraw_candidatesÚseen_sourcesrX   r[   rs   r"   r>   rr   ry   ro   r‹   rA   r?   ÚcandÚ	duplicateÚotherÚirž   rn   Úsummarys                           `  r*   Úcollectr¿   „   s  ø€ Ü×ÑÓ €DÜ× Ñ Ó"€EÜ˜TÓ"€JÜ‹I€EØ€NÜ“5€Lä& u×-‰ˆ�#ØˆiÓ˜AÑÓØ—‘˜Ó ˆØœÑØÐ%Ó&¨!Ñ+Ó&ØÜ(¨¯©°¸bÓ)AÓB‰ˆˆgÜ  Ó&ˆÜˆv‹;˜Ò#Ø�,Ó 1Ñ$ÓØÜ×Ñ  eÔ,Ø�-Ó  AÑ%Ó ØÜ˜f e¨Z¸ÓE‰ˆˆ5ØÐØÐ(Ó)¨QÑ.Ó)Ü�Dœ˜cŸg™g f¨bÓ1Ó2×7Ñ7Ð8¸¸E¿I¹IÀd»OÐ;Lð MØ˜#�w˜að!ô "áÜ˜S (§/¡/Ó2ˆØˆ>Ø�,Ó 1Ñ$ÓÙÜ�&‹kˆØ�,ÑØ�.Ó! QÑ&Ó!ÙØ×Ñ˜ÔØ×ÑØØÜ—g‘g—o‘o f¬hÓ7×?Ñ?ÀÀcÓJØ!Ÿ;™;Ø—?‘?×'Ñ'Ü˜Ÿ™ ¨Ó,Ó-×2Ñ2Ø—G‘G˜F“OØ—G‘G˜F BÓ'ØŸ7™7 =°#Ó6Üœc '›lÓ+Øñ
ö 	ð; .ðX €DÜ�~ÙE÷Gˆàˆ	ÛˆEØ�W‰~  g¡Ò.ØÜ˜˜h™¨¨x©Ó9ˆAØ�KÓØ ˜J�	Ùð ñ ØÐ,Ó-°Ñ2Ó-Ü�D˜˜mÑ,Ð-¨S°¸1±¸mÑ1LÐ0Mð NØ! !™ SÐ)¨ð,ô -àØ�‰�DÕðGð" 	‡I�IÑC€IÔDÜ˜T 1Ö%‰ˆˆ4ØˆˆW‰ØˆˆZÑØ!ˆˆ[ÑØˆˆY‰ØˆˆW‰Ø"ˆˆ]ÑØ�‰�˜4Õ ð &õ HNÔNÁvÀ�”CÓ<¡4Ó<Ó<Ñ<Àv€HÐNà 	Ñ*Ü˜$“iØà  Ñ/Ø$)Ð*@Ñ$AØ(-Ð.HÑ(IØ Ñ-Ø Ñ-ñ
ñ	€Gð �ˆ=Ðùò Os   Í8Oc                 ó~   — 	 ddl m} |j                  d| «      S # t        $ r ddl m} |j	                  «       cY S w xY w)Nr   )Ú	ImageFontz	arial.ttf)ÚPILrÁ   ÚtruetypeÚ	ExceptionÚload_default)ÚsizerÁ   s     r*   Ú_fontrÇ   ä   s>   € ð(Ý!Ø×!Ñ! +¨tÓ4Ð4øÜò (Ý!Ø×%Ñ%Ó'Ò'ð(ús   ‚ š<»<c           	      óà  — ddl m}m} | syd\  }}}}t        | «      |z   dz
  |z  }|j	                  d||z  |||z   z  fd«      }	|j                  |	«      }
t        d«      }t        | «      D ]´  \  }}||z  |z  }||z  ||z   z  }|
j                  |d	z   |d
z   fd|d   › d|d   › �d|¬«       t        |d   z  }	 |j                  |«      j                  d«      }|j                  |dz
  |dz
  f«       |	j                  ||||j                  z
  dz  z   ||z   dz   f«       Œ¶ |	j!                  |d¬«       y# t        $ r-}|
j                  |d	z   ||z   dz   fd|› �d|¬«       Y d}~Œüd}~ww xY w)uB   Hoja de contacto con el Ã­ndice global para revisar de un vistazo.r   )ÚImageÚ	ImageDrawF)é   i  i|  é    r|   ÚRGB)é   é   rÌ   é   é   é   Ú[r•   ú] rj   )éæ   éí   éó   )ÚfillÚfontr‹   é   é   rË   é
   zERR )éû   éq   é…   NéX   )ÚqualityT)rÂ   rÉ   rÊ   r1   ÚnewÚDrawrÇ   r±   Útextr®   ÚopenÚconvertÚ	thumbnailÚpasteÚwidthrÄ   Úsave)Úcandsr¬   rÉ   rÊ   ÚcolsÚtwÚthÚlabel_hÚrowsÚsheetÚdrawrÙ   r½   rº   ÚxÚyÚsrcrb   rZ   s                      r*   Ú_contact_sheetrö   í   s¨  € ç$ÙØØ+Ñ€Dˆ"ˆb�'Ü�‹J˜Ñ Ñ! dÑ*€DØ�I‰I�e˜d R™i¨°°g±Ñ)>Ð?ÀÓN€EØ�>‰>˜%Ó €DÜ�‹9€DÜ˜UÖ#‰ˆˆ4Ø�‰X˜‰OˆØ�$‰Y˜2 ™<Ñ(ˆØ�	‰	�1�q‘5˜!˜a™%�. A d¨7¡m _°B°t¸G±}°oÐ"FØ&¨Tð 	ô 	3ä˜˜h™Ñ'ˆð	!Ø—*‘*˜S“/×)Ñ)¨%Ó0ˆCØ�M‰M˜2 ™7 B¨¡GÐ,Ô-Ø�K‰K˜˜a 2¨¯	©	¡>°aÑ"7Ñ7¸¸W¹Àq¹ÐIÕJð $ð 
‡J�Jˆt˜R€JÔ Øøô	 ò 	!Ø�I‰I�q˜1‘u˜a '™k¨BÑ.Ð/°4¸°s°À/Øð ÷ !ñ !ûð	!ús   Â;A&D7Ä7	E-Å #E(Å(E-c                 óÈ  — t        |«      }|j                  dd¬«       t        j                  «       j	                  d«      ||| dœ}|dz  j                  t        j                  |dd¬«      d	¬
«       i }t        D ]5  }| D �cg c]  }|d   |k(  sŒ|‘Œ }}d|› d�}	t        |||	z  «      sŒ1|	||<   Œ7 g }
t        D �]­  }| D �cg c]  }|d   |k(  sŒ|‘Œ }}|sŒg }|D �]6  }t        |d   z  j                  «       }t        j                  j                  ||«      j                  dd«      }t!        |d¬«      }dj#                  |d   «      xs d}|j%                  d|d   › dt'        j(                  |«      › dt'        j(                  |«      › dt'        j(                  |d   «      › dt'        j(                  |d   «      › dt'        j(                  |d   «      › d |d!   › d"t'        j(                  |d   «      › d#t'        j(                  |«      › d$�«       �Œ9 |j+                  |«      }|rd%|› d&�nd'}|
j%                  d(|› d)t-        |«      › d*|› d+d'j#                  |«      › d,�	«       �Œ° d-t'        j(                  |d.   «      › d/t'        j(                  |d.   «      › d0|d1   › d2|d3   › d4|› d5d'j#                  |
«      › d6�}|d7z  j                  |d	¬
«       |S c c}w c c}w )8NT©ÚparentsÚexist_okz%Y-%m-%d %H:%M:%S)Ú	generatedr´   r¾   Ú
candidateszcandidates.jsonFr|   ©Úensure_asciiÚindentr
   rD   rj   Úcontact_z.jpgr‹   r…   r†   z/:)Úsafer6   r>   Ú-z8
      <article class="card">
        <div class="idx">[r•   z]</div>
        <a href="z"><img loading="lazy" src="z"
             alt="rŒ   z"></a>
        <p class="line">rk   z</p>
        <p class="meta">r�   u    Â· sr‡   u    Â·
           z&</p>
        <p class="meta">quitado: z</p>
      </article>z<a class="sheet" href="z">hoja de contacto</a>r`   z
    <section>
      <h2>z <span class="count">z</span> z</h2>
      <div class="grid">z</div>
    </section>uœ   <!DOCTYPE html>
<html lang="es"><head><meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Poses Â· revisiÃ³n rû   u(  </title>
<style>
  :root { --bg:#0b0e14; --panel:#121826; --line:#23304a; --text:#e6edf3;
           --muted:#93a4b8; --pink:#ff5c8a; --cyan:#6ee7ff; }
  * { box-sizing:border-box }
  body { margin:0; background:var(--bg); color:var(--text);
          font-family:ui-sans-serif,system-ui,"Segoe UI",Arial,sans-serif; }
  .wrap { max-width:1280px; margin:0 auto; padding:28px 20px 60px; }
  h1 { margin:0 0 6px; font-size:30px; }
  h2 { margin:34px 0 12px; border-bottom:1px solid var(--line);
        padding-bottom:8px; text-transform:capitalize; }
  .count { color:var(--pink); font-size:18px; }
  .sheet { float:right; font-size:13px; color:var(--cyan); font-weight:400; }
  .sub { color:var(--muted); margin:0 0 8px; }
  .note { border-left:3px solid var(--pink); background:#121826;
           padding:12px 14px; border-radius:0 10px 10px 0; color:var(--muted);
           margin:16px 0 8px; }
  .note code { color:var(--text); }
  .grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(260px,1fr));
           gap:14px; }
  .card { position:relative; background:linear-gradient(180deg,#121826,#0f1522);
           border:1px solid var(--line); border-radius:12px; padding:10px;
           overflow:hidden; }
  .card img { width:100%; height:330px; object-fit:contain;
               background:#0a0f18; border-radius:8px; }
  .idx { position:absolute; top:16px; left:16px; background:rgba(11,14,20,.82);
          border:1px solid var(--line); border-radius:999px; padding:2px 9px;
          font-weight:700; color:var(--cyan); font-size:13px; }
  .line { font-size:13px; line-height:1.45; margin:10px 0 8px;
           overflow-wrap:anywhere; }
  .meta { color:var(--muted); font-size:11.5px; margin:2px 0;
           overflow-wrap:anywhere; }
</style></head><body><div class="wrap">
  <h1>RevisiÃ³n de poses Â· z</h1>
  <p class="sub">r¡   z candidatas de
     r    u"    imÃ¡genes explore Â· Jaccard â‰¥ u˜  </p>
  <div class="note">
    Edita <code>candidates.json</code>: <code>approved: true</code> para
    promover, <code>false</code> para descartar. Para blacklist, pon
    <code>blacklist: true</code> y un <code>motivo</code>; solo si la pose es
    mala, no si la imagen concreta saliÃ³ mal. DespuÃ©s:
    <code>python Engine/pose_harvest.py --promote &lt;esta carpeta&gt;/candidates.json</code>
  </div>
  z
</div></body></html>úreview.html)r   Úmkdirr   ÚnowÚstrftimeÚ
write_textrM   Údumpsr”   rö   r®   rd   r«   r¬   r­   r¯   r   r<   r;   ÚhtmlÚescaperT   r1   )rë   r¾   Úout_dirr´   ÚpayloadÚsheetsrs   r�   Úsubsetrc   rð   Úcardsrº   rõ   re   r>   rñ   ÚlinkÚdocs                      r*   Úwrite_reviewr    sM  € Ü�7‹m€GØ‡M�M˜$¨€MÔ.ä—\‘\“^×,Ñ,Ð-@ÓAØ"ØØñ	€Gð Ð Ñ ×,Ñ,Ü�
‰
�7¨°qÔ9ÀGð -ô Mð €FßˆÙ"Ó:™U˜ a¨¡j°EÓ&9’!˜UˆÐ:Ø˜%˜ Ð%ˆÜ˜& '¨D¡.Õ1Ø ˆF�5ŠMð	 ð €Dß�ˆÙ"Ó:™U˜ a¨¡j°EÓ&9’!˜UˆÐ:ÙØØˆÜˆDÜ˜d 8™nÑ,×5Ñ5Ó7ˆCÜ—'‘'—/‘/ # wÓ/×7Ñ7¸¸cÓBˆCÜ˜ $Ô'ˆCØ—i‘i  Y¡Ó0Ò7°CˆGØ�L‰Lð à ™=˜/ð *Ü—+‘+˜cÓ"Ð#Ð#>¼t¿{¹{È3Ó?OÐ>Pð QÜ—;‘;˜t MÑ2Ó3Ð4ð 5ÜŸ™ T¨+Ñ%6Ó7Ð8ð 9ÜŸ™ T¨%¡[Ó1Ð2°%¸¸V¹°~ð FÜ�K‰K˜˜]Ñ+Ó,Ð-ð ."Ü"&§+¡+¨gÓ"6Ð!7ð 8ð	ö 	ð ð —
‘
˜5Ó!ˆáð *¨%¨Ð0FÑGØ ð 	à�‰ð àˆ'Ð&¤s¨6£{ m°8¸D¸6ð BØŸ™ ›Ð(ð )ðö 	ð/ ð:ô  Ÿ;™; w¨{Ñ';Ó<Ð=ð !>ôB "Ÿ[™[¨°Ñ)=Ó>Ð?ð @Ø˜,Ñ'Ð(ð )ØÐÑÐ Ð BÀ;À-ð Pð ‡7�7ˆ4ƒ=€/ð ð]/€Cð` ˆ}Ñ×(Ñ(¨°wÐ(Ô?Ø€Nùòi ;ùò ;s   ÂKÂKÃKÃKc                 ón   — t        | j                  dd«      «      }|j                  «       r|S t        |z  S )Nr‹   r`   )r   rT   Úis_absoluter®   )rº   rõ   s     r*   Ú_source_pathr  m  s/   € Ü
ˆt�x‰x˜ "Ó%Ó
&€CØ—/‘/Ô#ˆ3Ð9¬(°S©.Ð9r3   c                  ó  — t        j                  «       j                  d«      } t        j                  d| › �z  }|j                  dd¬«       t        j                  j                  «       r?t        j                  t        j                  |t        j                  j                  z  «       t        j                  j                  «       r?t        j                  t        j                  |t        j                  j                  z  «       |S )Nú%Y%m%d_%H%M%SÚ_backup_Trø   )r   r  r  r&   ÚBANK_DIRr  Ú	BANK_FILErI   ÚshutilÚcopy2rc   Ú
AVOID_FILE)ÚstampÚbackups     r*   Ú_backup_bankr   r  s²   € Ü�L‰L‹N×#Ñ# OÓ4€EÜ×Ñ H¨U¨GÐ"4Ñ4€FØ
‡L�L˜¨€LÔ-Ü×Ñ×!Ñ!Ô#Ü�‰”Y×(Ñ(¨&´9×3FÑ3F×3KÑ3KÑ*KÔLÜ×Ñ×"Ñ"Ô$Ü�‰”Y×)Ñ)¨6´I×4HÑ4H×4MÑ4MÑ+MÔNØ€Mr3   c                 ó0  ‡‡— t        | «      } 	 t        j                  | j                  d¬«      «      }t        |t        «      r|j                  d«      nd }t        |t        «      st        d«       y‰€t        |j                  dd	«      «      Št        j                  «       }t        j                  «       }t        |«      }t         D �	ci c]  }	|	g “Œ }
}	g g g }}}|D �]Í  }t        |t        «      sŒ|j                  d
«      }|€|j#                  |df«       Œ<|j                  dd«      }|j                  d«      }|du r7|j                  d«      r|j#                  |«       n|j#                  |df«       Œš|dur|j#                  |df«       Œ²|t         vr|j#                  |df«       ŒÎt        j$                  ||«      r|j#                  |df«       Œøt'        |«      Št)        ‰«      dk  r|j#                  |df«       �Œ&t+        ‰||‰«      \  }}|�'|j#                  |d|j                  d«      › �f«       �Œ`t-        ˆˆfd„|
|   D «       «      r|j#                  |df«       �Œ�t/        |«      j1                  «       du r|j#                  |df«       �Œ½|j#                  |«       �ŒÐ |r¦t        dt)        |«      › dt)        |«      › dt)        |«      › d �«       |D ]F  }t        d!|j                  d"«      › d#|j                  d«      › d|j                  d«      d d$ › �«       ŒH |D ]%  \  }}t        d%|j                  d"«      › d#|› �«       Œ' y&|s|st        d'«       y&t3        «       }t        d(|› �«       |D �]  }t/        |«      }	 t        j4                  |j                  dd«      |j                  d«      g ||j                  d)d«      |j                  d*«      d+|j                  d,d-«      d.|j                  d/d«      › �¬0«	      }||d5<   d6|d4<   |
|d      j#                  t'        |d   «      «       t        d7|j                  d"«      › d#|› d8|j                  d«      › d9|j                  d«      d d: › �«       �Œ |D ]§  }|j                  dd«      }t        j$                  |«      rd|d4<   Œ0|j                  d;«      xs d<g}t        |t8        «      r|g}t        j:                  |d=j=                  |«      d¬>«       d?|d4<   t        d@|j                  d"«      › dA|d d: › �«       Œ© ||d<   | j?                  t        j@                  |dd¬B«      d¬«       t        dCt)        |«      › dDt)        |«      › dEt)        |«      › �«       t        dF«       y&# t        t        j
                  f$ r}t        d| › d|› �«       Y d }~yd }~ww xY wc c}	w # t6        $ r3}t        d1|j                  d"«      › d2|› �«       d3|› �|d4<   Y d }~�ŒŽd }~ww xY w)GNr
   rD   z[!] no se puede leer rE   r|   rü   z*[!] candidates.json sin lista 'candidates'r´   çffffffæ?r–   zsin revisarrk   r`   rj   Fr—   Ú
descartadaTzapproved no booleanoznivel desconocidozya en blacklisté   zlinea demasiado cortazcasi-duplicado de r�   c              3   ó<   •K  — | ]  }t        ‰|«      ‰k\  –— Œ y ­wr%   )r2   )r�   rx   r´   rr   s     €€r*   rŸ   zpromote.<locals>.<genexpr>±  s%   øè ø€ ð -Ù+�3ô ˜ Ó$¨Õ3Ù+ùs   ƒzcasi-duplicado de otra aprobadazimagen no encontradaz[-] dry-run: z promover, z blacklist, z	 saltadasz  + [r•   rÔ   éd   z  - [r   z[i] nada que promoverz[-] backup del banco: rˆ   r‡   rH   r‰   rŠ   zpromovida de r�   )	rk   rj   ÚtemaÚref_pngrˆ   r‡   Ú
provenancer‰   r™   z[!] [z] no promovida: zerror: Ústatusrš   Úpromotedz[+] [z (z): éZ   r˜   zrevision manualr6   )ru   r   z[x] [z] blacklist: rý   z
[OK] promovidas z, blacklist z, saltadas z2[i] revisa con: python Engine/pose_bank.py --stats)!r   rM   rN   rO   rP   rQ   rJ   rR   rS   rT   rU   Úfloatr&   r¤   r¥   rp   r”   r;   r§   r+   r1   rz   Úanyr  rI   r   Úadd_poserÄ   r©   Úpenalizer<   r  r  )r¬   Údry_runr´   rY   rZ   rë   rm   r¶   rt   rž   Ú
added_sigsÚto_addÚto_blackÚskippedrº   r–   r"   rs   ry   ro   Úmotivor  rõ   Úpidr˜   rr   s     `                      @r*   Úpromoter8  }  sü  ù€ Ü�‹:€DðÜ�z‰z˜$Ÿ.™.°'˜.Ó:Ó;ˆô '1°´tÔ&<ˆD�H‰H�\Ô"À$€EÜ�eœTÔ"ÜÐ:Ô;ØØÐÜ˜DŸH™H ]°CÓ8Ó9ˆä×ÑÓ €DÜ× Ñ Ó"€EÜ˜TÓ"€JÝ#)Ó*¡6˜R�"�b‘& 6€JÐ*à " B¨�gˆH€FÜˆÜ˜$¤Ô%ØØ—8‘8˜JÓ'ˆØÐØ�N‰N˜D -Ð0Ô1ØØ�x‰x˜ RÓ(ˆØ—‘˜Ó!ˆØ�uÑØ�x‰x˜Ô$Ø—‘ Õ%à—‘  lÐ3Ô4ØØ˜4ÑØ�N‰N˜DÐ"8Ð9Ô:ØØœÑØ�N‰N˜DÐ"5Ð6Ô7ØÜ×Ñ  eÔ,Ø�N‰N˜DÐ"3Ð4Ô5ØÜ  Ó&ˆÜˆv‹;˜Š?Ø�N‰N˜DÐ"9Ð:Ô;ÙÜ˜f e¨Z¸ÓE‰ˆˆ5ØÐØ�N‰N˜DÐ$6°u·y±yÀ³Ð6GÐ"HÐIÔJÙÜô -Ø$ UÒ+ó-ô -à�N‰N˜DÐ"CÐDÔEÙÜ˜Ó×$Ñ$Ó&¨%Ñ/Ø�N‰N˜DÐ"8Ð9Ô:ÙØ�‰�dÖðO ñR Ü�œc &›k˜]¨+´c¸(³m°_ÀLÜ�W“�˜ið)ô 	*ãˆDÜ�E˜$Ÿ(™( 7Ó+Ð,¨B¨t¯x©x¸Ó/@Ð.AÀØ—X‘X˜kÓ*¨4¨CÐ0Ð1ð3õ 4ð ó $‰LˆD�&Ü�E˜$Ÿ(™( 7Ó+Ð,¨B¨v¨hÐ7Õ8ð $àá™(ÜÐ%Ô&Øä‹^€FÜ	Ð" 6 (Ð
+Ô,äˆÜ˜4Ó ˆð	Ü×$Ñ$ØŸ(™( ;°Ó3Ø—h‘h˜wÓ'ØØØ—X‘X˜f bÓ)Ø—X‘X˜fÓ%Ø$Ø ŸH™H ]°CÓ8Ø% d§h¡h¨u°bÓ&9Ð%:Ð;ô
ˆCð "ˆˆ]ÑØ#ˆˆX‰Ø�4˜‘=Ñ!×(Ñ(¬¸¸kÑ9JÓ)KÔLÜ��d—h‘h˜wÓ'Ð(¨¨3¨%¨r°$·(±(¸7Ó2CÐ1DÀCØ—‘˜+Ó& s¨Ð+Ð,ð.ö 	/ð+ ó0 ˆØ�x‰x˜ RÓ(ˆÜ×Ñ Ô%Ø.ˆD�‰NØØ—(‘(˜9Ó%Ò<Ð*;Ð)<ˆÜ�gœsÔ#Ø�iˆGÜ×Ñ˜4 §¡¨7Ó!3¸qÕAØ&ˆˆX‰Ü��d—h‘h˜wÓ'Ð(¨°d¸3¸B°i°[ÐAÕBð ð €DˆÑØ‡O�O”D—J‘J˜t°%ÀÔBØ$ð ô &ä	Ðœs 6›{˜m¨<¼¸H»°ð GÜ˜'“l�^ð%ô &ä	Ð
>Ô?Øøôi ”T×)Ñ)Ð*ò ÜÐ% d V¨2¨a¨SÐ1Ô2Üûðüò +øôV ò 	Ü�E˜$Ÿ(™( 7Ó+Ð,Ð,<¸Q¸CÐ@ÔAØ& q c˜]ˆD�‰NÝûð	ús6   �%V Ã
WÎA?WÖWÖ6W×W×	X×"(XØXc                  óÐ  — t        j                  d¬«      } | j                  ddd¬«       | j                  dd¬	«       | j                  d
t        dd¬«       | j                  dt        dd¬«       | j                  ddd d¬«       | j                  dd d¬«       | j                  «       }|j                  r,t        |j                  |j                  |j                  ¬«      S |j                  r#|j                  D �cg c]  }t        |«      ‘Œ c}nt        t        g}t        ||j                  |j                  ¬«      \  }}|j                  rt        |j                  «      n)t         t#        j$                  «       j'                  d«      z  }t)        ||||j                  ¬«       t+        d|d   › d|d   › d |› �«       t+        d!|d"   › �«       t+        d#|d$z  › d%�«       y&c c}w )'NzPromueve poses explore al banco)Údescriptionz	--promoteÚCANDIDATES_JSONz4promueve las candidatas aprobadas de candidates.json)ÚmetavarÚhelpz	--dry-runÚ
store_true)Úactionz--min-jaccardr"  z&umbral de casi-duplicado (default 0.7))ÚtypeÚdefaultr=  z--min-tokensr$  z/tags de contenido minimos por linea (default 3)z--rootsÚ*z8carpetas a escanear (default Output/pilots Output/packs))ÚnargsrA  r=  z--outz8carpeta de revision (default Output/pose_review/<stamp>))rA  r=  )r1  r´   )r´   rµ   r  )r´   z[OK] r¡   z candidatas (r¢   z) -> z     descartes: r£   z     revisa r  z y edita candidates.jsonr   )ÚargparseÚArgumentParserÚadd_argumentr-  ÚintÚ
parse_argsr8  r1  r´   rV   r   Ú
PILOTS_DIRÚ	PACKS_DIRr¿   rµ   ÚoutÚREVIEW_ROOTr   r  r  r  rJ   )ÚapÚargsÚprV   rë   r¾   r  s          r*   ÚmainrP  ø  sÑ  € Ü	×	 Ñ	 Ð-NÔ	O€BØ‡O�O�KÐ):ØOð ô Qà‡O�O�K¨€OÔ5Ø‡O�O�O¬%¸ØAð ô Cà‡O�O�N¬°aØJð ô Là‡O�O�I S°$ØSð ô Uà‡O�O�G TØSð ô Uà�=‰=‹?€Dà‡|‚|Ü�t—|‘|¨T¯\©\Ø#'×#3Ñ#3ô5ð 	5ð /3¯jªj˜tŸzšzÓ*™z˜!Œd�1�g˜zÒ*ÜœyÐ)ð 
ä˜U°×0@Ñ0@Ø(,¯©ô9�N€Eˆ7à!%§¢Œt�D—H‘HŒ~Ü¤(§,¡,£.×"9Ñ"9¸/Ó"JÑJð ä�˜ °d×6FÑ6FÕGä	ˆE�'˜,Ñ'Ð(ð )Ø�kÑ"Ð# 5¨¨	ð3ô 4ä	Ð˜W ]Ñ3Ð4Ð
5Ô6Ü	ˆL˜ =Ñ0Ð1Ð1IÐ
JÔKØùò +s   Ã;G#Ú__main__)r"  r$  )rÐ   )r"  )FN)4Ú__doc__rD  r	  rM   r«   r  ÚsysÚcollectionsr   r   Úpathlibr   Úurllib.parser   r&   Úclean_bank_linesr   r   Úwd14_harvestr	   ÚstdoutÚreconfigureÚ__file__rd   r¨   r®   rI  rJ  rL  r”   r(   r9   r©   r¦   r+   r-  r2   rB   r\   rh   rp   rz   r¿   rÇ   rö   r  r  r   r8  rP  Ú__name__Ú
SystemExitrœ   r3   r*   Ú<module>r^     sJ  ðñó, Û Û Û 	Û Û 
Ý Ý Ý Ý ã ß 0Ý à ‡
�
× Ñ  Ð0BÐ Ô Cá�‹>×!Ñ!Ó#×*Ñ*×1Ñ1€Ø˜Ñ  8Ñ+€
Ø�xÑ 'Ñ)€	Ø˜Ñ! MÑ1€à	,€Ú
-€ò€	ðF˜#ð F #ó Fð#�ð #˜ð # ó #ð$˜3ó $ò (ð&
?˜dó 
?òòHó]ó@(òó6bòJ:ò
óxòvðD ˆzÒÙ
‘T“VÓ
Ðð r3   