
    9Kj=S                     t   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mZ ej                  j                  d e ee      j                               ddlZej                   dz  Zej$                  dz  Zg dZg dZeez   ZdZd	d	d
did
did
didg ddddd	d
did
did
did
didg dddddd	d
did
did
didedd
didddgdd
did
did
did
did
did
didddgddddgddd	d
did
didddgddddg ddddd
didg dddZd  Zd! Zd" Zg d#Zd$d%d&d'Zd( Zd) Zd.d*Z d+ Z!d, Z"e#d-k(  r e"        yy)/u  s13 — 블록 세트장 v2 (사용자 피드백 반영, 2026-07-05):

v1(s12) 대비 변경:
  1. grounding 확장 — **관련 씬 원문 전체**(scene_save, 자르기 금지) + 멤버 + 전 샷.
     창/문 개수는 텍스트 근거와 일치해야 함(개구부마다 인용 필수). 건물 창문 포함
     (텍스트 근거 없으면 certainty=inferred 로 정직하게 표기).
  2. 마커 = 원문자 — 구조/영역=알파벳(Ⓐ…), 개구부/설비=번호(①…). 도면 위에는
     마커만, "무엇인지"는 LLM 산출 텍스트(desc_ko)를 갤러리에 그대로 게시.
  3. 3차원 레이어 = 색상 — LLM 이 높이 레이어(rel_height+한국어 설명)를 정의,
     코드가 높이 순 램프 색으로 채움. 색상 의미 설명도 LLM 텍스트 그대로 게시.
  4. 크기/배치 = 여전히 LLM 상대 판단(100×100 캔버스).
사용: .venv/bin/python s13_blockset_v2.py [--only plan|render|html]
산출: plans/blockset_layout_v2.json, out/blockset/blockset_v2.png, blockset.html
    N)Pathblocksetzblockset.html)	building_massupper_shellterraceyardroadalleystairwallneighbor_mass)doorwindowgatefixture_roundfixture_rect	equipmentu  You are a set-layout analyst for film pre-production. You get one
real-world place's member descriptions, the FULL ORIGINAL TEXT of every scene
that plays there, and the full content of every shot. Build ONE top-down BLOCK
LAYOUT of the whole property as structured data for a code renderer — plain
blocks for structural understanding (relative sizes and positions), not art.

Canvas: 100 wide x 100 tall, x rightward, y downward. Use most of the canvas.
Sizes and positions are YOUR relative judgement, but every spatial relation the
texts imply (what is beside/under/above what, what connects what, which side an
entrance/stair/window is on) must be honoured.

HEIGHT LAYERS (3-6): you define them. Each layer = layer_id, name_en (1-3
words), desc_ko (one Korean sentence: what physical height this is, e.g. 지면 /
건물 옥상면 / 옥탑 지붕면), rel_height (number, 0 = ground, increasing upward).
Every element references one layer_id — the renderer colours by layer, because
a top-down drawing cannot show height. Neighbour buildings also get the layer
matching their described height.

Elements:
- kinds: building_mass, upper_shell (an enclosed upper-level unit — outline
  only, never interior), terrace, yard, road, alley, stair, wall, neighbor_mass
  (BLOCK kinds — marker must be a capital LETTER A,B,C...), and door, window,
  gate, fixture_round, fixture_rect, equipment (POINT kinds — marker must be a
  NUMBER 1,2,3...). Markers unique.
- shape "rect": x,y = top-left, w,h sizes, rot_deg rotates around centre.
  shape "circle": x,y = centre, w = h = diameter, rot_deg 0.
- doors/windows/gates sit ON their host block's edge line. "repeat" = how many
  identical openings the strip contains (1 for a single opening).
- COUNT-CRITICAL: the number and count of openings must match the texts. An
  upper_shell element's windows: mark exactly as many as the texts support, on
  the sides the texts support. The main building's facade windows: include them;
  if the texts give no exact count, choose a modest count and set
  certainty="inferred" (otherwise certainty="text").
- Simplify ALL neighbouring buildings to plain neighbor_mass rects (no detail,
  no openings). Include the road/alley approach around the street entrance.
- Include permanent fixtures the scenes rely on (round free-standing unit ->
  fixture_round, low rectangular unit -> fixture_rect, machine unit ->
  equipment). NO story props, no vehicles, no people, nothing temporary.
- 10 to 26 elements. name_en: 1-3 generic English words, no proper names.
  desc_ko: one short Korean sentence — what it PHYSICALLY is, its form and
  key spatial relation, present tense, PHYSICAL VISIBLE FACTS ONLY: never
  events, actions, characters or animals, usage stories, moments of motion,
  or authorial phrasing (verbatim shown to the human reviewer and fed to
  drawing stages — narrative causes hallucination).
- evidence: source = scene index / shot key / member id, quote = exact phrase
  copied from the given texts (original language). certainty="text" needs a
  real quote; "inferred" states the nearest supporting line.

Also output layout_notes_ko: 3-6 Korean sentences describing the overall
arrangement logic (verbatim shown to the human reviewer).objecttypenumberstring)widthheightorientation_noteF)r   
propertiesrequiredadditionalPropertiesarray)layer_idname_endesc_ko
rel_height)r   items)r   enumrectcircleintegermajorminortextinferred)sourcequoter,   r-   )markerr    r!   kindr   shapexywhrot_degrepeat
importance	certaintyevidence)canvaslayerselementslayout_notes_koc           
      t   t        | d   D ch c]"  }t        |j                  d      d   dd       $ c}      }t        j                  d      d   }|D ci c]  }|d   |
 }}g }|D ]0  }|j                  |      }|s|j                  d	| d
|d           2 |dj                  |      fS c c}w c c}w )u`   관련 씬 원문 전체 — scene_save 에서 그룹 샷들이 속한 씬만, 자르기 금지.shots_r      N
scene_savesegmentsscene_indexz
=== SCENE z FULL TEXT ===
r*   

)sortedintsplitF	load_stepgetappendjoin)reconkidxssegssby_idxblocksis           s13_blockset_v2.pyscene_textsrW      s    U7^D^3qwws|Aqr*+^DED;;|$Z0D+/04aa!4F0FJJqMMMJqc)9!F)EF  V$$$ E0s   'B0B5c                 .   t        j                  | d         }t        |       \  }}dj                  d t	        | d   j                               D              }d|z   dz   |z   dz   |z   dz   }t        j                  d	t        |t        d
      }t        |       t        j                  d|       t        d| dt        |d          dt        |d                 |d   D ]1  }t        d|d    d|d    d|d    d|d    d|d    d|d           3 |S )NmembersrE   c              3   N   K   | ]  \  }}t        j                  ||        y wN)rI   
shot_block).0rO   rR   s      rV   	<genexpr>zgen_layout.<locals>.<genexpr>   s%      G'Etq!Q'Es   #%r?   zPLACE MEMBERS:
z:

FULL ORIGINAL SCENE TEXTS (every scene at this place):

z+

ALL SHOTS AT THIS PLACE (full content):

z

Build the block layout now.forest_blockset_layout_v2gpt)modelblockset_layout_v2zv2: scenes z
 | layers r;   z | elements r<   z  (r.   ) r    z [r/   /r   r8   z] rep=r6   )rI   members_blockrW   rM   rF   r#   llm	V2_SYSTEM	V2_SCHEMA_fix_markers	save_planprintlen)rN   rY   rP   scenesshot_blocksuserlayoutes           rV   
gen_layoutrr      s^   ooeI./Gu%LD&++ G'-eGn.B.B.D'EG GK(NO @@ CNN 0	0D
 UU.	4 FKK$f-	KvZF8,<(='> ?6*-./1 2JAhK=1Y<.1V9+Qq}o!K.!(}6 	7   M    c                    t               t        d      D cg c]  }t        d|z          }}t        dd      D cg c]  }t        |       }}| d   D ]s  }|d   t        v r|n|}t        |j                  d      xs d      j                         }||v xr |v}|st        fd	|D              }||d<   j                  |       u y
c c}w c c}w )uJ   마커 유일성/형식 보정 (결정론) — 블록=A~Z, 포인트=1~99.   A   rA   d   r<   r/   r.    c              3   ,   K   | ]  }|vs|  y wr[    )r]   cuseds     rV   r^   z_fix_markers.<locals>.<genexpr>   s     61Qs   	N)	setrangechrstrBLOCK_KINDSrK   stripnextadd)	rp   rU   lettersnumbersrq   poolmokr|   s	           @rV   ri   ri      s    5D$)"I.Iqs26{IG.$Q}-}!s1v}G-JF){2wh%2&,,.$Y(1D=666AAhK   /-s
   CC)z#ece7d9z#d9cfb6z#bfb08ez#9c8a66z#75664az#4f4534)z#7a3b2ez#3a1c14)z#6b4f3az#3a2c20)#ffffffz#2e5670)r   r   r   c           	      J   t        j                  |      }g }|D ]  \  }}|| z
  ||z
  }	}|j                  | |t        j                  |      z  z   |	t        j                  |      z  z
  ||t        j                  |      z  z   |	t        j                  |      z  z   f        |S r[   )mathradiansrL   cossin)
cxcydegptsaoutr1   r2   dxdys
             rV   _rotr      s    SA
C1RRB

Bdhhqk))B!,<<dhhqk))B!,<<> 	?  Jrs   c           	         t        | d   d       }t        dt        |            }i }t        |      D ]I  \  }}|dkD  r.t	        |t        t
              dz
  z  t        d|dz
        z        nd}t
        |   ||d   <   K ||fS )Nr;   c                     | d   S )Nr"   rz   )ls    rV   <lambda>zlayer_colors.<locals>.<lambda>   s    <rs   keyrA   r   r   )rF   maxrl   	enumerateroundRAMP)rp   layncolsrU   r   idxs          rV   layer_colorsr      s    
!'@
ACAs3xAD#1<=EeATQ'#aQ-78q"3iQz]  9rs   c           
         #$%&'() ddl m}m}m# t	         d   d         xs d}t	         d   d         xs d}d\  %$}t        |%z  $dz  z   |z         t        |%z  $dz  z   d	z         }	}|j                  d
||	fd      }
|j                  |
      'dR#fd	} |dd       |dd       |d       |d      f\  }}}}$%fd)'j                  $dfd|d       t        dt        |      dz   d      D ]&  }'j                   )|d       )||      gdd       ( t        dt        |      dz   d      D ]&  }'j                   )d|       )||      gdd       ( 'j                   )dd       )||      gdd       t               \  &}t         d         }t        |D cg c]  }|d   t        v s| c} fd !      }|D cg c]  }|d   t        vs| }})fd"(%&'()fd#}%&'()fd$}|D ]
  } ||        |D ]
  } ||        %)fd%}|r|D ]  } ||      \  \  }}}t!        |d&         dk  rd'nd}|r'j                  |||fgd(d       'j#                  ||z
  ||z
  ||z   ||z   gd)d*d+       'j                  ||f|d&   |d,d-.        t        |%z  $z   dz         }$d/z   }'j                  ||d0z
  fd1|d       |D ]V  }'j                  |||d2z   |d3z   g&|d4      d(d+       'j                  |d5z   |d6z   fd7|d8   d9d:|d;    |d       |d<z  }X |d=z  }'j                  ||fd>|d?       |dz  }'j                  ||d@z
  fdA|d       |dBz  }d} |}!|D ]P  }dC|d&    dD|d;    }"|dE   dFk(  r|"dGz  }"'j                  || rdHndz   |f|"|d       |dIz  }||	dJz
  kD  sJ| rMd|!}} R 'j                  ||	d/z
  fdK|d?       |j$                  j'                  ddL       |
j)                  |       t+        j,                  dMdNt/        |      t!        |      t!         dO         dP       t1        dQ|       y c c}w c c}w )SNr   )Image	ImageDraw	ImageFontr:   r   g      Y@r   )   2   i     (   RGBz#f7f5f0Fc                     dD ]  }	 j                  || |rdnd      c S  j                         S # t        $ r Y :w xY w)N)z#/System/Library/Fonts/Helvetica.ttcz,/System/Library/Fonts/Supplemental/Arial.ttfrA   r   )index)truetype	Exceptionload_default)szboldpr   s      rV   fontzrender.<locals>.font   sW    BA ))!RDqa)HHB %%''  s   3	??ru   T      r   c                 *    | z  z   dz   |z  z   fS )N   rz   )r1   r2   MSs     rV   pxzrender.<locals>.px   s"    1q5y!b&1q5.((rs      u^   BLOCK SET LAYOUT v2 — colour = height layer, circled markers (structure only, code-rendered)z#333)r   fillrA   
   z#e6e1d3r   r   z#8a857a)outliner   r<   r/   c                 N     t         fdd   D        d       d    d   z   fS )Nc              3   >   K   | ]  }|d    d    k(  r|d     yw)r   r"   Nrz   )r]   r   rq   s     rV   r^   z+render.<locals>.<lambda>.<locals>.<genexpr>   s.      A7G!!":!J-!?  o7Gs   r;   r   r3   r4   )r   )rq   rp   s   `rV   r   zrender.<locals>.<lambda>   s9     Avh7G ABCEC&1S6/*#,rs   r   c                     | d   | d   | d   | d   f\  }}}}||dz  z   ||dz  z   }}||f||z   |f||z   ||z   f|||z   fg}t        ||| j                  dd      xs d|      D cg c]  } 	| 	 c}S c c}w )Nr1   r2   r3   r4   r   r5   r   )r   rK   )
rq   r1   r2   r3   r4   r   r   cornersr   r   s
            rV   polyzrender.<locals>.poly   s    sVQsVQsVQsV3
1aQUAAIBq6AE1:Aq1u~1q5zB $RQUU9a-@-EAw OP O1A OPPPs   'A6c           	      8   j                  | d   d      }d| d   dv rdnd}}| d   d	k(  rC | d
   | d         \  }}| d   z  dz  }j                  ||z
  ||z
  ||z   ||z   g|||       y  |       }| d   dk(  rdn|}j                  |||       j                  ||d   gz   || d   dk(  rdn|d       | d   dk(  r| d
   | d   | d   | d   f\  }	}
}}|	|dz  z   |
|dz  z   }}t	        dt        t	        ||                  }t        d|      D ]  }||z  }||k\  r|	||z  z   |
f|	||z  z   |
|z   ffn|	|
||z  z   f|	|z   |
||z  z   ff\  }}t        ||| j                  dd      xs d||g      \  }}j                   |  | gdd        y y )Nr   z#ddd#3a3a3ar/   )r   r      r   r0   r&   r1   r2   r3   r   r   r   r   z#9a9a9ar   r   r   rA   curve)r   r   jointr   r4   r5   r   )rK   ellipsepolygonliner   rG   r~   r   )rq   r   ocowcxpcyprr   r   r1   r2   r3   r4   r   r   r   rU   tp1p2q1q2r   r   dr   r   s                         rV   
draw_blockzrender.<locals>.draw_block   s   xx*v.6.N!NA W:!!C&!C&)HC#
QAIIsQwaq#':   ,1g yO;)			#D'	2	sc!fX~GF)6QBg 	 	OV933337JAq!QQYAE	BAs3q!9~&A1a[EABa1q1u9a.1q1u9a!e*<=QU^a!eQQY%78 Bb"aeeIq&9&>QRIBBR)	C !	  rs   c                    | d   }|t         v rt         |   \  }}| d   | d   | d   | d   f\  }}}}t        dt        | j                  d      xs d            }||k\  }	t	        |      D ]j  }
|
dz   |z  }|
d	z   |z  }|	r|||z  z   |f|||z  z   ||z   fg}n||||z  z   f||z   |||z  z   fg} |d
     |d    }}j                  ||g||d       l y | d   dk(  rV | d   | d         \  }}| d   z  dz  }j                  ||z
  ||z
  ||z   ||z   gj                  | d   d      dd       y j                   |       j                  | d   d      d       j                   |        |       d
   gz   dd       y )Nr/   r1   r2   r3   r4   rA   r6   g)\(?g(\?r   r   r   r0   r&   r   z#cfcfcfr      r   r   )	
OPEN_STYLEr   rG   rK   r~   	rectangler   r   r   )rq   rO   r   r   r1   r2   r3   r4   repalong_xrU   t0t1segp0r   r   r   r   r   r   r   r   r   s                      rV   
draw_pointzrender.<locals>.draw_point  s   fI
?!!}HD"33337JAq!QaQUU8_123C1fG3Z$h#%$h#%BJ?QRZQ,?@Cq1r6z?QUABJ,?@CSVb#a&kBRH41E   wZ8#!C&!C&)HC#
QAIIsQwaq#':88AjM9='q  2 IId1gDHHQz]I$F'  )FF47d1gaj\)	FCrs   c                 &   | d   dk(  r | d   | d         d fS | d   | d   dz  z   | d   | d   dz  z   }}| d   z  dk  xs | d   z  dk  }|r7 | d   | d   z   |      }|d	   d
z   |d   dz
  f | d   | d   dz  z   |      fS  ||      d fS )Nr0   r&   r1   r2   r3   r   r4   "   r      rA   r   rz   )rq   r   r   smalledger   r   s        rV   
marker_poszrender.<locals>.marker_pos9  s    W:!afaf%t++3!C&1*$afqvz&9B#
R21S6A:?afqvor*DGbL$q'B,/AcFQsVaZ4G1LLL"bz4rs   r.      r   r   z#222r   z#111mm)r   r   anchorr      zHEIGHT LAYERS (colour)r      r   &   r   zh=r"   gz  r          z0openings: door/gate=dark tick, window=white panez#666r   MARKERSr   (rc   r8   r+   z *      <   uL   * = inferred (텍스트 근거 없는 추정) — 상세 설명은 페이지)parentsexist_okcode_renderblockset_v2r;   )r/   tagr   r<   r;   z	render ->)F)PILr   r   r   floatrG   newDrawr*   r~   r   r   r   listrF   r   rl   r   parentmkdirsaverI   runlogr   rk   )*rp   out_pathmarkersr   r   cwchLEGWHimgr   f_titlef_markf_legf_minr   
lay_sortedelsrq   rT   pointsr   r   r   mxmyleaderr   lxlyr   col2ly0r  r   r   r   r   r   r   r   s*   `                                  @@@@@@@rV   renderr$     s#   //	vh(	)	2UB	vh)	*	3eBIAq#rAvA~#$c"q&1q5.2*=&>qA
))EAq69
-CsA( %)TNDTNDHdSUh$V!GVUE) FFAr7 >f  & 1c"gk2&	1a"Q)$9A> '1c"gk2&	1a"R)$9A> 'KKAq2b":&	KC#F+D*
vj!
"C@1qyK'?Q@,-F
 =A&	 <aF=QD D4D D6 1 1   A)!}HRf!H+&*AR)	CIIrAvrAvrAvrAv6Y$A  /FFB8Qx[vF4FP  
R!VaZ"_	B	
RBFFBR=2fFM	RR"Wb2g.T!J-5H%Q 	 	0	Ra Bqq&9AiL>"J 	 	(
b  !GBFFB8GF  $"HBFFBQ<fF="HBD
C!H+b9/[>Z'4KC	Tcq)2.%fM
bB;tS"D  FFBB<gF  $ OO$6HHXHHmM#h-c(c&2B.CE F	+x { A
 >s   ,Q=QQ#"Q#c                 l  
 t         dz  }|j                  t        j                        }t	        |       \  
}dj                  
fd|D              }d}| d   D ]  }dj                  d |d   D              }|d   d	k(  rdnd
}|d|d    dt        j                  |d          | dt        j                  |d          d|d    dt        j                  |d          d|d   dkD  rdt        |d         z   nd d|d   dd|d   dd|d   dd|d   dd| d z  } d!| d"| d#t        j                  | j                  d$d             d%| d&| d't        j                  t        j                  | j                  d(i       d)d*             d+}	t        j                  |	       t        d,t               y )-Nblockset_v2.pngrx   c              3      K   | ]b  }d |d       dt        j                  |d          dt        j                  |d          d|d   ddt        j                  |d	          d
 d yw)z+<tr><td><span class='sw' style='background:r   z'></span></td><td>	</td><td>r    z</td><td>h=r"   r   </td><td class='ko'>r!   
</td></tr>N_htmlescape)r]   r   r   s     rV   r^   zbuild_html.<locals>.<genexpr>u  s      
 A	 6d1Z=6I5J K||AjM*+9U\\!I,5O4P Q<# $,,q|45Z	A s   A(A+r<   z<br>c              3      K   | ]8  }d t        j                  |d          dt        j                  |d           : yw)z<span class='src'>r,   z</span> r-   Nr+  )r]   vs     rV   r^   zbuild_html.<locals>.<genexpr>}  sE      B3@a !ak!: ;8||AgJ'(*3@s   >A r9   r8   r*   u     <span class='inf'>추정</span>z<tr><td class='mk'>(r.   z
)</td><td>r    r)  r!   r(  r/   r   r6   rA      ×z
</td><td>(r1   r   ,r2   rc   r3   r4   z</td><td class='ev'>r*  ul  <meta charset='utf-8'><title>블록 세트장 v2 — 코드 렌더</title><style>
body{font-family:sans-serif;background:#171717;color:#eee;margin:24px;max-width:1900px}
h1{font-size:22px} h3{color:#fd9} img{width:100%;max-width:1560px;border-radius:8px;background:#fff}
.guide{background:#1e2430;padding:12px 16px;border-radius:8px;font-size:13px;line-height:1.7;margin-bottom:14px}
.notes{background:#20301e;border-left:4px solid #4a4;padding:10px 14px;font-size:13px;line-height:1.7;margin:12px 0}
table{border-collapse:collapse;font-size:12px;margin-top:10px;width:100%}
td,th{border:1px solid #333;padding:5px 8px;vertical-align:top}
th{background:#222;color:#fd9} .src{color:#8ac} .ev{color:#9c9;max-width:460px}
.ko{color:#ffd;max-width:340px} .mk{font-weight:bold;color:#fd9}
.sw{display:inline-block;width:26px;height:16px;border:1px solid #999}
.inf{color:#fa5;font-size:11px}
details{margin-top:20px} summary{cursor:pointer;color:#8ac}
pre{white-space:pre-wrap;font-size:11px;color:#9c9;background:#1b1b1b;padding:8px;max-height:300px;overflow:auto}
</style>
<h1>블록 세트장 v2 — LLM 구조화(씬 원문 전체 grounding) → 코드 렌더</h1>
<div class='guide'>색상=<b>높이 레이어</b>(위에서 본 도면의 3차원 보완 — 아래 레이어 표의
한국어 설명은 LLM 산출 그대로), 원문자=<b>구조(알파벳)/개구부·설비(번호)</b> — 도면에는
마커만, 의미는 아래 마커 표의 desc(LLM 산출 그대로). 창/문 개수는 씬 원문 인용 근거
필수(근거 없는 건물 창은 '추정' 표기). 크기/배치=LLM 상대 판단(100×100). 옆집=민네모.</div>
<a href='z' target='_blank'><img src='uQ   '></a>
<div class='notes'><b>배치 논리 (LLM layout_notes_ko 원문):</b><br>
r=   u   </div>
<h3>① 높이 레이어 (색상 의미 — LLM 텍스트 원문)</h3>
<table><tr><th>색</th><th>ID</th><th>이름</th><th>상대 높이</th><th>설명 (desc_ko 원문)</th></tr>
u   </table>
<h3>② 마커 (LLM 텍스트 원문)</h3>
<table><tr><th>마커</th><th>이름</th><th>설명 (desc_ko 원문)</th><th>kind</th>
<th>레이어</th><th>반복</th><th>좌표/크기</th><th>근거 인용</th></tr>z?</table>
<details><summary>orientation / canvas</summary>
<pre>r:   F)ensure_asciiindentuZ  </pre></details>
<details><summary>(이력) v1 — 이름 라벨 직접 표기 방식 (사용자 피드백으로 대체)</summary>
<img src='out/blockset/blockset.png' style='max-width:1200px'>
<pre>v1 한계: 마커 대신 이름 텍스트 라벨(겹침), 높이 미표현, 창 개수 근거 부족(멤버+샷 요약만 사용).</pre></details>
zpage ->)OUTBrelative_torI   EXPr   rM   r,  r-  r   rK   jsondumpsPAGE
write_textrk   )rp   pngrelr  
layer_rowsrowsrq   evcertdocr   s             @rV   
build_htmlrB  q  s   
"
"C
//!%%
 C#F+D* 
  J DJ[[ B34Z=B B {^v-r. 	'(} 5Qy\23D6 :##(<<)#="> ?&	{)ELL:,G+H I34X;?s1X;//K L3
!AcF1:R#qzAcF1: F##%$j2 	3  
& *3% 0fjj*B/0 1 2  S TXRX Yll4::fjj26USTUVW X;!CD 	OOC	)Trs   c                     t        j                         } | j                  ddg d       | j                         }t	        j
                         }|j                  dv rt        |      }nt	        j                  d      }|j                  dv rt        |t        dz         |j                  d	v rt        |       t	        j                  d
d|j                  d       y )Nz--onlyall)rD  planr$  html)defaultchoices)rD  rE  rb   )rD  r$  r&  )rD  rF  stages13_blockset_v2)r/   rI  done)argparseArgumentParseradd_argument
parse_argsrI   
load_recononlyrr   	load_planr$  r4  rB  r  )apargsrN   rp   s       rV   mainrU    s    		 	 	"BOOHe=  ?==?DLLNEyyO#E"12yy%%vt//0yyO#6HHg(9499MNrs   __main__)T)$__doc__rL  rF  r,  r7  r   syspathlibr   pathinsertr   __file__r
  
forest_librI   OUTr4  r6  r9  r   POINT_KINDSKINDSrg   rh   rW   rr   ri   r   r   r   r   r$  rB  rU  __name__rz   rs   rV   <module>rb     s9       
  3tH~,,- . uuzuu:k!1=	h #h'FH3E!' 244 @$)	+
 #h*))!8,	O.
 I$).+ , %x())%u5*&0BC(#68*<(#68*<)y)#+gw5GH"*VZ4HI!(H*0();)/(:<%w/(-	4/ 0Q1$@ %*+0+ ,, #H-G$J D!Q)	X
%," J,6L.0
`!F;|O" zF rs   