+
    i fj_                     x  a  R{ t50 t R t^ RIt^ RIt^ RIHt ^ RIHtHt ^ RI	H
t
 ^tR]P                  ! R]P                  4      3R]P                  ! R]P                  4      3R	]P                  ! R
]P                  4      3R]P                  ! R]P                  4      3R]P                  ! R]P                  4      3R]P                  ! R]P                  4      3R]P                  ! R]P                  4      3R]P                  ! R]P                  4      3R]P                  ! R]P                  4      3R]P                  ! R]P                  4      3R]P                  ! R]P                  4      3R]P                  ! R]P                  4      33t] ^ k ]! 0 R|m4      t]0 R}m,          tR R ltR R  lt]P                  ! R!]P                  4      t]P                  ! R"]P                  4      tR#R$R%R$R&R$R'R$R(R)R*R)R+R)/tR, R- ltR. R/ lt]P                  ! R0]P                  4      R13]P                  ! R2]P                  4      R33]P                  ! R4]P                  4      R53]P                  ! R6]P                  4      R73]P                  ! R8]P                  4      R93]P                  ! R:]P                  4      R;3]P                  ! R<]P                  4      R=3]P                  ! R>]P                  4      R?33tR~R@ RA lltRB RC lt]P                  ! RD]P                  4      tRE RF ltRG RH lt]P                  ! RI]P>                  4      t ]P                  ! RJ]P>                  4      t!]P                  ! RK]P                  4      t"]P                  ! RL]P                  4      t#RM]P                  ! RN]P                  4      RO]P                  ! RP]P                  4      RQ]P                  ! RR]P                  4      RS]P                  ! RT]P                  ]P>                  ,          4      RU]P                  ! RV]P                  4      RW]P                  ! RX]P                  4      RY]P                  ! RZ]P                  4      R[]P                  ! R\]P                  4      R]]P                  ! R^]P                  4      R_]P                  ! R`]P                  4      /
t$]P                  ! Ra]P>                  4      t%]P                  ! Rb]P                  4      t&]P                  ! Rc]P                  ]P>                  ,          4      t']P                  ! Rd]P                  ]PP                  ,          4      t)Re Rf lt*Rg Rh lt+Ri Rj lt,Rk Rl lt-Rm Rn lt.Ro Rp lt/Rq Rr lt0Rs Rt lt1Ru Rv lt2R~Rw Rx llt3R~Ry Rz llt4R# )u  Extração estruturada de um acto do registo comercial do IRN.

Substitui o `mj_people_parser`, que era tolerante de propósito e guardava tudo
como texto: a quota ia concatenada no `cargo` ("sócio — 125.000,00 Euros") e o
cargo saía de um varrimento de 600 caracteres para trás. Para um grafo de
participações isso não serve — a quota tem de ser um número comparável e o papel
tem de vir da secção onde a pessoa está.

Este módulo lê os layouts reais, guardados em `tests/fixtures/registry/`. O que
eles ensinam, e que não se adivinharia:

* **A linha do NIF vem indentada.** `NIF/NIPC:` aparece a seguir ao nome mas com
  um espaço à esquerda. O parser antigo exigia-a colada ao `\n` e por isso
  devolvia zero pessoas em praticamente todo o corpus do IRN — falhou em silêncio
  durante meses. É a razão de existir deste ficheiro.
* **A secção das quotas tem dois nomes.** `SÓCIOS E QUOTAS:` numa constituição ou
  aumento, `QUOTA(S) E TITULAR(ES):` numa redução de capital.
* **Os montantes vêm em dois formatos.** `26.289,60` (pt-PT) e `15250.00` (ponto
  decimal, sem separador de milhares) coexistem no mesmo portal. Aplicar a regra
  portuguesa ao segundo daria 1.525.000 — um número plausível e cem vezes errado.
* **A ordem dos campos dentro do bloco varia.** Numa redução o `Estado civil` vem
  antes da `Nacionalidade`, num aumento não há `Nacionalidade` nenhuma. Portanto
  os campos lêem-se por etiqueta, não por posição.
* **O nome do titular traz a nacionalidade colada**: `TITULAR: FERNANDO JORGE
  BARBOSA DA COSTA, de Nacionalidade Portugusa` — com a gralha da fonte. Só se
  corta este sufixo concreto, porque as firmas têm vírgulas a sério
  (`CRESCENTIMOB - IMOBILIÁRIA, LDA`).
* **Os actos de capital dizem o capital resultante** (`Capital após o aumento`,
  `CAPITAL APÓS A REDUÇÃO`). É melhor fonte do que a constituição, que só dá o
  capital inicial — e resolve o caso da SEGUNOR, cujo capital ficava em branco por
  haver aumentos posteriores.
* **A mesma pessoa pode ser titular e gerente no mesmo acto** (numa constituição é
  a norma). São dois factos diferentes e saem como duas arestas.
N)Any)html_to_textparse_publication)is_valid_nifconstituicaou%   CONSTITUI[ÇC][ÃA]O\s+DE\s+SOCIEDADEtransmissao_quotasu+   (TRANSMISS[ÃA]O|CESS[ÃA]O)\s+DE\s+QUOTAS?aumento_capitalzAUMENTO\s+D[OE]\s+CAPITALreducao_capitalu!   REDU[ÇC][ÃA]O\s+D[OE]\s+CAPITALalteracao_contratou#   ALTERA[ÇC][ÕO]ES?\s+AO\s+CONTRATOcessacaou'   CESSA[ÇC][ÃA]O\s+DE\s+FUN[ÇC][ÕO]ES
designacaou3   (DESIGNA[ÇC][ÃA]O|NOMEA[ÇC][ÃA]O)\s+DE\s+MEMBRO
dissolucaou%   DISSOLU[ÇC][ÃA]O|LIQUIDA[ÇC][ÃA]Oprestacao_contasu   PRESTA[ÇC][ÃA]O\s+DE\s+CONTASmudanca_sedeu   MUDAN[ÇC]A\s+D[AE]\s+SEDEfusaou   FUS[ÃA]O|CIS[ÃA]Oinsolvenciau   INSOLV[ÊE]NCIAc                >    V ^8  d   QhR\         R,          R\         /#    act_typeNreturnstr)formats   "K/Volumes/www/segunor-intel-grid/backend/app/services/registry_act_parser.py__annotate__r   L   s      3: #     c                 n    V '       g   R # \          F   w  rVP                  V 4      '       g   K  Vu # 	  R # )outro)_ACT_CLASSESsearch)r   namepatterns   &  r   classify_actr#   L   s-    %>>(##K & r   c                >    V ^8  d   QhR\         R,          R\        /# r   r   bool)r   s   "r   r   r   U   s     4 4C$J 44 4r   c                &    \        V 4      \        9   # )u9   Vale a pena gastar três chamadas HTTP a abrir este acto?)r#   PEOPLE_CLASSES)r   s   &r   wants_contentr)   U   s    !^33r   z,\s*de\s+Nacionalidade\b.*$u3   (\d[\d.,\s]*\d|\d)\s*(Euros?|EUR|€|Escudos?|PTE)?euroEUReuroseuru   €escudoPTEescudosptec                |    V ^8  d   QhR\         R,          R\        \        R,          \         R,          3,          /# r   rawNr   )r   tuplefloat)r   s   "r   r   r   d   s0        S4Z  E%$,d
*B$C  r   c                n   V '       g   R# \         P                  V 4      pV'       g   R# \        P                  ! RRVP	                  ^4      4      pVP	                  ^4      ;'       g    RP                  4       P                  4       p\        P                  V4      pRV9   d$   VP                  RR4      P                  RR4      pMOVP                  R4      ^8X  d(   \        VP                  R4      ^,          4      ^8X  d   MVP                  RR4      p \        V4      V3#   \         d    Ru # i ; i)up  Devolve (valor, moeda). Os dois formatos que a fonte usa:

* `26.289,60 Euros` — ponto de milhares, vírgula decimal (pt-PT)
* `15250.00 Euros`  — ponto decimal, sem separador de milhares

A regra que os distingue: um único ponto seguido de exactamente dois dígitos
é decimal; tudo o resto são milhares. Assim `15250.00` dá 15250,00 e `1.000`
dá 1000 — que é o que a fonte quer dizer em cada caso.

Escudos não se convertem para euros. Uma constituição de 1998 diz
`5.000.000,00 Escudos`, e somar isso com euros na mesma cap table produziria
um total absurdo. A moeda viaja com o valor e quem soma verifica.
z\s ,.NN)	_MONEY_REr    resubgroupstriplower	_CURRENCYgetreplacecountlensplitr6   
ValueError)r4   mdigitsunitcurrencys   &    r   parse_moneyrM   d   s     AVVE2qwwqz*FGGAJ"##%++-D}}T"H
f}R(00c:	c	a	CS(9!(<$=$BR(V}h&& s   D$ $D43D4c                >    V ^8  d   QhR\         R,          R\         /# r   r!   Nr   r   )r   s   "r   r   r      s     / /t / /r   c                   V '       g   R# \         P                  ! RV P                  4       4      pRP                  R V 4       4      p\        P
                  ! RRV4      p\        P
                  ! RRV4      P                  4       # )uz   Minúsculas, sem acentos, espaços colapsados. Chave de comparação de nomes
e base do `entity_key` de quem não tem NIF.r8   NFDc              3   `   "   T F$  p\         P                  ! V4      R 8w  g   K   Vx  K&  	  R# 5i)MnN)unicodedatacategory.0cs   & r   	<genexpr>!normalize_name.<locals>.<genexpr>   s$     J1+*>*>q*AT*IQQs   .
.z
[^a-z0-9]+ \s+)rT   	normalizerA   joinr=   r>   r@   )r!   foldeds   & r   normalize_namer`      sd     ""5$**,7FWWJJJFVVM3/F66&#v&,,..r   z\br\.?\szrua z	\bav\.?\szavenida z\btrav\.?\sz	travessa u   \bpc\.?\s|\bpra[çc]a\bzpraca z	\blg\.?\szlargo u   \bn\.?[ºo°]\s*zn z
\besq\.?\besquerdou   \bdt[ºo°]?\.?\bdireitoc                f    V ^8  d   QhR\         R,          R\         R,          R\         R,          /# )r   streetNpostalr   r   )r   s   "r   r   r      s-      cDj #* d
 r   c                J   V '       g   V'       g   R# \        T ;'       g    R4      p\         F  w  r4VP                  WB4      pK  	  \        P                  ! RRV4      P	                  4       pV'       d$   V RVP	                  4        2P	                  4       pT;'       g    R# )u  Morada em forma comparável, para a resolução de identidade.

Não é para mostrar — é para responder à pergunta "esta `Andreia Filipa
Batista Balsemão Barbosa` que aparece como cônjuge é a mesma sócia
`ANDREIA FILIPA B. B. BARBOSA` que está noutra empresa?". O nome sozinho não
chega (homónimos foi o que estragou as relações antigas); o nome mais a rua e
o código postal já chegam para uma sugestão honesta.
Nr8   r\   r[   )r`   _ADDR_ABBREVr>   r=   r@   )rd   re   baser"   repls   &&   r   normalize_addressrj      s     &&,,B'D%{{4& &66&#t$**,Dq()//1<<4r   c                >    V ^8  d   QhR\         R,          R\         /# )r   nifNr   r   )r   s   "r   r   r      s      S4Z C r   c                    V '       g   R# \        V 4      '       g   R# V ^ ,          pVR9   d   R# VR8X  d   R# V P                  R4      '       d   R# R	# )
u  Tipo de entidade pelo primeiro dígito do NIF.

1/2/3 pessoas singulares · 5 pessoas colectivas residentes · 6 sector
público · 8 empresário em nome individual · 98 não residentes.

Dois casos que não se confundem, e ambos ficam **fora da travessia do
grafo**:

* `unknown` — não há NIF. Acontece nas publicações de 2006 importadas pela
  extensão, escritas em prosa. O nome e a quota valem para mostrar na ficha
  da empresa, mas um nó só com nome não se segue para lado nenhum sem se
  inventar uma identidade.
* `invalid` — há NIF mas falha o mod-11. Um dígito trocado num acto não pode
  fundir duas pessoas reais.
unknowninvalid1238person6public98foreigncompany)r   
startswith)rl   heads   & r   entity_kindry      sJ      q6Dv~s{
~~dr   um   ^\s*(quotas?\s+)?(amortizada|amortizadas|pr[óo]pria|pr[óo]prias|a\s+sociedade|da\s+sociedade|sociedade)\s*$c                >    V ^8  d   QhR\         R,          R\        /# rO   r%   )r   s   "r   r   r      s"     B BsTz Bd Br   c                     \        V 4      ;'       d-    \        \        P                  V P                  4       4      4      # N)r&   _OWN_QUOTA_REmatchr@   )r!   s   &r   is_own_quotar      s*    :AA$}224::<@AAr   c                f    V ^8  d   QhR\         R,          R\         R,          R\         R,          /# )r   rl   Nr!   r   r   )r   s   "r   r   r      s-     	, 	,C$J 	,cDj 	,S4Z 	,r   c                P    V '       d   RV  2# \        V4      pV'       d   RV 2# R# )u   Chave do nó. `nif:` quando há NIF, `name:` quando não há.

Um `nif UNIQUE` deixaria passar NULLs sem limite e cada acto criaria um nó
novo para o mesmo titular estrangeiro sem NIF.
znif:zname:N)r`   )rl   r!   norms   && r   
entity_keyr      s0     cU|$D!U4&>+t+r   z^.*?UTC\s*-\s*(?P<act>[^\n]+)$z-^[ \t]*(?P<label>[^\n:]{3,80}?)[ \t]*:[ \t]*$u}   (?:S[ÓO]CIOS\s+E\s+QUOTAS|QUOTA\(S\)\s+E\s+TITULAR\(ES\)|S[ÓO]CIO\(S\)\s+E\s+QUOTA\(S\)|TITULAR\(ES\)\s+E\s+QUOTA\(S\))\s*:u   GER[ÊE]NCIA|CONSELHO\s+DE\s+ADMINISTRA[ÇC][ÃA]O|ADMINISTRA[ÇC][ÃA]O|FISCAL\s+[ÚU]NICO|CONSELHO\s+FISCAL|REVISOR|SECRET[ÁA]RIO|DIRE[ÇC][ÃA]O|MESA\s+DA\s+ASSEMBLEIA|LIQUIDAT[ÁA]RIO|SUPLENTErl   zNIF\s*/\s*NIPC\s*:\s*(\d{9})\bcargozCargo\s*:\s*([^\n]+)causazCausa\s*:\s*([^\n]+)dataz^[ \t]*Data\s*:\s*([^\n]+)nacionalidadezNacionalidade\s*:\s*([^\n]+)estado_civilzEstado\s+civil\s*:\s*([^\n]+)conjugeu&   Nome\s+do\s+c[ôo]njuge\s*:\s*([^\n]+)regime_bensz!Regime\s+de\s+bens\s*:\s*([^\n]+)
residenciau(   Resid[êe]ncia\s*/\s*Sede\s*:\s*([^\n]+)paisu&   Pa[íi]s\s+de\s+registo\s*:\s*([^\n]+)z0^[ \t]*(\d{4})(?:\s*-\s*(\d{3}))?[ \t]+([^\n]+)$u~   CAPITAL\s+AP[ÓO]S\s+(?:O\s+AUMENTO|A\s+REDU[ÇC][ÃA]O|A\s+ALTERA[ÇC][ÃA]O)?\s*:?\s*([\d.,\s]+)\s*(Euros?|Escudos?|EUR|PTE)z<^[ \t]*CAPITAL\s*:\s*([\d.,\s]+)\s*(Euros?|Escudos?|EUR|PTE)ud   NIF\s+do\s+deposit[áa]rio\s*:\s*(?P<nif>\d{9}).*?Nome\s+do\s+deposit[áa]rio\s*:\s*(?P<name>[^\n]+)c                J    V ^8  d   QhR\         R\         R\         R,          /# )r   blockkeyr   Nr   )r   s   "r   r   r     s%      # C C$J r   c                     \         V,          P                  V 4      pV'       g   R # VP                  ^4      P                  4       pT;'       g    R # r|   )
_FIELD_RESr    r?   r@   )r   r   rI   values   &&  r   _fieldr     s>    3u%AGGAJE==Dr   c                L    V ^8  d   QhR\         R,          R\         R,          /# r3   r   )r   s   "r   r   r     s"      C$J 3: r   c                     V '       g   R # \         P                  RV 4      P                  4       P                  R4      P                  4       pVR,          ;'       g    R # )Nr8   r9   :Ni,  N)_NAT_SUFFIX_REr>   r@   )r4   r!   s   & r   _clean_person_namer     sI    b#&,,.44S9??AD:r   c                n    V ^8  d   QhR\         R\        \         R,          \         R,          3,          /# )r   r   r   N)r   r5   )r   s   "r   r   r   #  s,     * * *cDj#*&< = *r   c                .   \         P                  V 4      pV'       g   R# VP                  ^4      '       d&   VP                  ^4       RVP                  ^4       2MVP                  ^4      pY!P                  ^4      P                  4       ;'       g    R3# )u@   Código postal e localidade da linha logo abaixo da residência.N-r;   )
_POSTAL_REr    r?   r@   )r   rI   cps   &  r   _postal_fromr   #  ss    % A)*AGGAJ<q	%Bwwqz!))T))r   c                h    V ^8  d   QhR\         R\        \        \         \         3,          ,          /# )r   textr   )r   listr5   )r   s   "r   r   r   ,  s'      c d5c?3 r   c                   \        \        P                  V 4      4      pV'       g   RV 3.# . p\        V4       F  w  r4V^,           \	        V4      8  d   W^,           ,          P                  4       M
\	        V 4      pVP                  VP                  R4      P                  4       WP                  4       V 34       K  	  V# )u   Um corpo pode conter mais do que um acto. Devolve (título, corpo) por
acto; se não houver cabeçalho `UTC -`, devolve o corpo todo com título vazio.
r8   act)
r   _ACT_HEADER_REfinditer	enumeraterF   startappendr?   r@   end)r   matchesoutirI   r   s   &     r   _split_actsr   ,  s     >**401GT
|!#C'"()AG(<g!en""$#d)

AGGEN((*D,=>? # Jr   c                <    V ^8  d   QhR\         R\        R\        /# )r   segmentr   r   )r   int)r   s   "r   r   r   :  s!      S   r   c                   \         P                  W4       F  pVP                  R4      P                  4       pV'       g   K,  V Uu. uF  qDP	                  4       '       g   K  VNK  	  ppV'       g   K^  \        R V 4       4      \        V4      ,          R8  g   K  VP                  4       u # 	  \        V 4      # u upi )u   Fim de uma secção: o próximo cabeçalho de secção depois de `start`.

É isto que impede um titular sem NIF de roubar o NIF do titular seguinte, e
um bloco de gerência de apanhar o `Cargo:` de outro órgão.
labelc              3   T   "   T F  qP                  4       '       g   K  ^x  K   	  R# 5i)   N)isupperrV   s   & r   rY   "_section_bounds.<locals>.<genexpr>E  s     =g11gs   (
(gffffff?)_SECTION_REr   r?   r@   isalphasumrF   r   )r   r   rI   r   rX   letterss   &&    r   _section_boundsr   :  s     !!'1 &&(#3eyy{11e37s=g==GLPSS779 2 w< 4s   B<"B<c          	          V ^8  d   QhR\         R\        \        \        \         \        3,          ,          \        \        \         \        3,          ,          3,          /# r   r   r   )r   r5   r   dictr   )r   s   "r   r   r   J  s?     < <S <U4S#X+?d3PS8nAU+U%V <r   c                   \         P                  V 4      pV'       g   . . 3# WP                  4       \        WP                  4       4       p\        P
                  ! RV\        P                  R7      p. p. pV EFk  p\        P                  ! RV4      '       g   K#  RVP                  4       9  d   \        P                  ! RV\        P                  4      p\        V'       d   VP                  ^4      MR4      w  rTP                  RTRT	R	V'       d'   VP                  ^4      P                  4       R
,          MR/4       K  \        P                  ! RV\        P                  4      p
\        V
'       d   V
P                  ^4      MR4      w  r\        P                  ! RV\        P                  4      p\        V'       d   VP                  ^4      MR4      p\        VR4      pV'       g   V'       g   EK  \        VR4      p\!        V4      w  ppTP                  / R\#        V4      bRVbRVbR\%        V4      bR\'        V4      bRVbRV	bR	V
'       d'   V
P                  ^4      P                  4       R
,          MRbR\        VR4      bR\        VR4      bR\        \        VR4      4      bR\        VR4      bRVbRVbRVbR\)        W4      bR\        VR4      b4       EKn  	  WE3# )u]  Titulares e **quotas órfãs** — as que a fonte lista sem titular.

Acontece em 19 dos 246 actos medidos, e em 5 deles o valor órfão é exactamente
o que falta para fechar o capital declarado. Ou seja: é uma quota a sério cujo
titular a publicação não nomeia. Se se ignorasse, um acto assim substituiria a
estrutura conhecida por uma sem o maior sócio — no `510036899` a cap table
verificada de 213.684,21 em três titulares passaria a 10.685,21 em dois.

Daí devolverem-se em separado em vez de se deixarem cair: contam para o total e
tornam o acto inelegível para ser a fotografia actual.
z(?=^[ \t]*QUOTA\s*:))flagsz^[ \t]*QUOTA\s*:TITULARzQUOTA\s*:\s*([^\n]+)Nquota_amountquota_currency	quota_raw:NP   NzTITULAR\s*:\s*([^\n]*)rl   r   seqr!   kindr   r   r   r   r   codigo_postal
localidadeaddress_normr   )_QUOTA_SECTION_REr    r   r   r=   rG   	MULTILINEr~   upperIrM   r?   r   r@   r   r   r   rF   ry   r   rj   )r   rI   bodychunksr   orphanschunkr4   amountrL   quota_mname_mr!   rl   r   r   r   s   &                r   _parse_captabler   J  s    	  )A2v557?7EEG<=DXX-t2<<HF "C$&Gxx+U33EKKM)))3UBDDAC*3399Q<DIFNN (3ciil00237D 
 ))3UBDDA&7w}}Q'7M4eRTTB!V&,,q/FUE"CE<0
%e,J

 
3s8
D
 3
 K$	

 L.
 F
 h
 7'--*00237
 VE?;
 F5.9
 )&	*BC
 6%7
 *
 R
 *
  -j=!
" F5&)#
 	+ P <r   c                h    V ^8  d   QhR\         R\        \        \         \        3,          ,          /# r   r   r   r   r   )r   s   "r   r   r     s'     2 23 24S#X#7 2r   c           $       a . p\         P                  V 4       Uu. uF^  p\        P                  VP	                  R4      4      '       g   K/  VP                  4       VP	                  R4      P                  4       3NK`  	  upoR V3R llp\        P                  ! RV \        P                  \        P                  ,          4       Uu. uF  q"P                  4       NK  	  pp\        V4       EFl  w  rVV^,           \        V4      8  d   WE^,           ,          M
\        V 4      pWV p\        P                  ! RV\        P                  4      p	\        V	'       d   V	P	                  ^4      MR4      p
\        VR4      pV
'       g   V'       g   K  \        VR4      p\        V4      w  rTP                  R	T
RTR
\!        V4      R\        VR4      ;'       g    V! V4      ;'       g    RRV! V4      R\        VR4      R\        VR4      R\        VR4      R\        VR4      R\        \        VR4      4      R\        VR4      RVRVRVR\#        W4      /4       EKo  	  V# u upi u upi )u   Membros de órgãos sociais, com o cargo tirado da secção onde estão.

Cada bloco começa em `Nome/Firma:` e acaba no próximo `Nome/Firma:` ou no
fim da secção — sem isto o `Cargo:` de um membro colava-se ao anterior.
r   c                >    V ^8  d   QhR\         R\        R,          /# )r   posr   N)r   r   )r   s   "r   r   #_parse_organs.<locals>.__annotate__  s      s sTz r   c                 8   < R pS F  w  r#W 8:  d   TpK   V# 	  V# r|    )r   currentr   r   organ_positionss   &   r   	organ_for _parse_organs.<locals>.organ_for  s-    +LE| ,
 r   z^[ \t]*Nome/Firma\s*:zNome/Firma\s*:\s*([^\n]*)Nrl   r   r!   r   r   organr   r   r   r   r   r   r   r   r   )r   r   _ORGAN_LABELSr    r?   r   r@   r=   r   r   r   rF   r   r   r   r   ry   rj   )r   r   rI   r   startsr   r   r   r   r   r!   rl   r   r   r   r   s   &              @r   _parse_organsr     s    !#C %%g..A 01 	.AGGG$**,-.O  "$-EwPRPTPTWYWcWcPc!de!dAggi!dFef% 1us6{2fUmGc"7E!V&,,q/FUE"CE<0
%e,

D3K$fUG,HH	%0@HHDYu%VE7+F5&)VE?;F5.9)&	*BC6%7*R*-j=
 	 &6 JW fs   ,I 3I I%c                h    V ^8  d   QhR\         R\        \        \         \        3,          ,          /# r   r   )r   s   "r   r   r     s'       T#s(^(< r   c                     \         P                  V 4      pV'       g   . # VP                  R 4      p\        VP                  R4      4      pRVR VR\	        V4      RRRRRRRRR	RR
RRRRRRRRRRRRR/.# )rl   r!   r   r   u   depositárior   Nr   r   r   r   r   r   r   r   r   r   )_DEPOSITARIO_REr    r?   r   ry   )r   rI   rl   r!   s   &   r   _parse_depositarior     s    w'A	
''%.Caggfo.DeS&+c*:$vt~tYt\4$dND  r   c                x    V ^8  d   QhR\         R\        \        R,          \         R,          \        3,          /# )r   r   r   N)r   r5   r6   r&   )r   s   "r   r   r     s.      c eEDL#*d$BC r   c                J   \         P                  V 4      pV'       d5   \        VP                  ^4       RVP                  ^4       24      w  r#W#R3# \        P                  V 4      pV'       d5   \        VP                  ^4       RVP                  ^4       24      w  r#W#R3# R# )u  Capital do acto e se é o valor **resultante** (mais fiável) ou o inicial.

Os actos de capital publicam `Capital após o aumento` / `CAPITAL APÓS A
REDUÇÃO` — o valor actual. A constituição publica `CAPITAL :`, que é o
inicial e envelhece. Distinguir os dois é o que permite mostrar capital
actual sem inventar: a SEGUNOR foi constituída com 1.000 EUR e as quotas já
são de 125.000 cada.
r[   TF)NNF)_CAPITAL_AFTER_REr    rM   r?   _CAPITAL_RE)r   rI   r   rL   s   &   r   _capitalr     s     	  )A&!''!*Qqwwqzl'CD%%7#A&!''!*Qqwwqzl'CD&&r   c                z    V ^8  d   QhR\         R,          R\         R,          R\        \         \        3,          /# )r   r   Nr   r   r   r   r   )r   s   "r   r   r     s6     Y YC$J Y#* YS#X Yr   c                   T ;'       g    Rp/ R\         bRV'       d   \        V4      M/ bRVbR\        V4      bRRbRRbR	R
bR. bR. bR. bRRbR. bRR
bRR
bRR
bRR^ R^ R^ /bpVP                  4       '       g   V# \	        V4      pV'       gN   V'       dF   V^ ,          ^ ,          '       d0   V^ ,          ^ ,          VR&   \        V^ ,          ^ ,          4      VR&   . p. p. pV F  w  rV'       d   \        V4      MVR,          p
\        V	4      w  rV'       g	   V'       d   TpTpVP                  \        V	4      4       V
R8X  d   VP                  \        V	4      4       \        V	4      w  rpVf   K  V'       g   VR,          e   K  WR&   WR&   WR	&   K  	  \        V4       F  w  ppVVR&   K  	  WSR&   WsR&   WcR&   R\        V4      R\        V4      R\        V4      /VR&   WV,           pV Uu0 uF  pVR,          '       g   K  VR,          kK  	  pp\        V4      VR&   V'       dj   \        V4      ^8:  dZ   \        ;QJ d    R V 4       F  '       d   K   R
M	  RM! R V 4       4      '       d    \        \        R V 4       4      ^4      VR&   \!        VR,          RJ;'       d7    VR,          RJ;'       d$    \#        VR,          VR,          ,
          4      R8  4      VR&   \$        ;QJ d    R V 4       F  '       g   K   RM	  R
M! R V 4       4      VR&   \!        T;'       dD    V'       * ;'       d5    \        ;QJ d    R V 4       F  '       d   K   R
M	  RM! R V 4       4      4      VR&   V# u upi )u   Tudo o que um acto diz, em forma estruturada.

`act_type` é o título que vem da listagem; quando falta, tira-se do
cabeçalho `UTC -` do próprio corpo.
r8   parse_versionheaderr   	act_classcapitalNcapital_currencycapital_is_resultingFquotasofficersquota_orphansquota_totalquota_currenciescaptable_completecaptable_eligiblecaptable_linkablecountspeopler   r   r   r   c              3   6   "   T F  qR ,          RJx  K  	  R# 5ir   Nr   rW   qs   & r   rY   parse_act.<locals>.<genexpr>"  s     2eZdUV^3DD3PZd   Tc              3   2   "   T F  qR ,          x  K  	  R# 5ir  r   r  s   & r   rY   r  #  s     &M*Q'8'8*   g{Gz?c              3   2   "   T F  qR ,          x  K  	  R# 5i)rl   Nr   r  s   & r   rY   r  2  s     "<VU88Vr	  c              3   6   "   T F  qR ,          RJx  K  	  R# 5ir  r   r  s   & r   rY   r  8  s     &Uf'8'Dfr  )REGISTRY_PARSE_VERSIONr   r#   r@   r   r   extendr   r   r   r   rF   sortedallroundr   r&   absany)r   r   r   r   segmentsr   r   r   titler   	seg_classfoundfound_orphansr   rL   	resultingr   r  
everything
currenciess   &&                  r   	parse_actr    s    ::2D/T#D)r 	H 	\(+	
 	4 	D 	 	" 	B 	 	t 	B 	U 	U 	U  	8Q!Y:!C$ ::<<
4 HXa[^^"1+a.J'A7K#%F$&G%'H"+0L'c+6F	.w7MF#Gg./$OO.w78&.w&7#)9I0F#	N&."#*3&' #  &!1% "M
O"s6{Hc(mYPST[P\]CM!J/9Qz!Q?O=P=P%!$%%zJQ$Z0C c*o*ss2eZd2esss2eZd2e/e/e"3&M*&M#MqQM  $M$& 	< 	<	N$&	< 	<M"S^34t; C  #s"<V"<sss"<V"<<C
  $UUw;UU33&Uf&U333&Uf&U#U C J; Rs   3M>	M>c                z    V ^8  d   QhR\         R,          R\         R,          R\        \         \        3,          /# )r   htmlNr   r   r   )r   s   "r   r   r   =  s1     3 3t 3sTz 3T#s(^ 3r   c                 ,    \        \        V 4      V4      # r|   )r  r   )r  r   s   &&r   parse_act_htmlr  =  s    \$'22r   c                    V ^8  d   Qh/ ^ \         9   d=   \        \        \        \        P                  \        ,          3,          R3,          ;R&   # )r   .r   )__conditional_annotations__r5   r   r=   Pattern)r   s   "r   r   r      s@     ! !^ eE#rzz#./45 _!r   >   r   r   r   r	   r
   r   >   r   r   r   r   r|   )6r!  __doc__r=   rT   typingr   "app.services.mj_company_enrichmentr   r   app.services.nifr   r  compiler   r   	frozensetCAPTABLE_CLASSESr(   r#   r)   r   r<   rB   rM   r`   rg   rj   ry   r}   r   r   r   r   r   r   r   r   r   r   r   DOTALLr   r   r   r   r   r   r   r   r   r   r  r  r   )r!  s   @r   <module>r+     s  !D 
   N )  
 RZZ H"$$OP2::&TVXVZVZ[\

#?FG

#GNO2::&LbddSTFMN2::TVXVZVZ[\2::FMN$FMNRZZ =rttDEbjj/67BJJ1244899 * $  "$[[4 :BDDAJJMrttT	
E7E5%eYue	 F/ ZZRTT"F+ZZbdd#Z0ZZ%{3ZZ*BDD18<ZZbdd#X.ZZ#RTT*D1ZZrtt$j1ZZ$bdd+Y7	(D 

346DDB	, =r||LjjI2<<XJJKDD 
 

H DD	 
2::7>RZZ/6RZZ/6
BJJ4bddR\\6IJRZZ ?FBJJ?FrzzCRTTJ2::BBDDI"**H"$$O
BJJ@"$$G
 ZZKR\\Z
JJ/DD 
 jjXZ\Z^Z^acamamZmn**:DD299* <~2j(Yx3 3r   