+
    O[j'             !       i   ^ RI HtHtHtHtHtHtHt ^ RIH	t	 ^ RI
t
^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI t ^ RI!t!^ RI"H#t# ^ RI$H%t%H&t& ^ RI'H't' ^ RI(H)t)H*t*H+t+H,t,H-t-H.t. ]! ]/4      t0Rt1R	t2ER9t3]Ph                  ! R
4      t5Rt6Rt7Rt8Rt9]
Pt                  Pw                  ]6R4      t<]
Pt                  Pw                  ]<R4      t=]
Pt                  Pw                  ]<R4      t>]
Pt                  Pw                  ]<R4      t?]
Pt                  Pw                  ]<R4      t@]
Pt                  Pw                  ]<R4      tA]
Pt                  Pw                  ]6R4      tBRtC]
Pt                  Pw                  ]6R4      tD]
Pt                  Pw                  ]6R4      tE]
Pt                  Pw                  ]6RR4      tFRsG^ sHRR0tI0 ER:mtJER;tKER<tLR%tMR&]
Pt                  Pw                  ]6R&4      R']
Pt                  Pw                  ]6R'4      R(]
Pt                  Pw                  ]6R(4      R)]
Pt                  Pw                  ]6R)4      R*]
Pt                  Pw                  ]6R*4      R+]
Pt                  Pw                  ]6R+4      /tN0 ER=mtOR&R,.R'R,.R(R-R,.R)R,.R*R,.R+R,./tPR.tQ]
Pt                  Pw                  ]6RR/4      tRR0tS]
Pt                  Pw                  ]6RR14      tT0 R kR!kR"kR#kRkRkRkR2kR$kR3kR4kR5kR6kR7kR8kR9kR:kR;kR<kR=kR>kR?kR@kRAkRBkRCkRDkREkRFkRGkRHktU0 ER>mtV0 ER?mtWRKRL0tX0 ER@mtYRO0tZRPRQRRRS/t[RTRURVRM/t\RWR-/t]RTR'RVR(/t^RWR(/t_RX]
Pt                  Pw                  RYRZR[R\4      R]]
Pt                  Pw                  RYRZR[R^4      /t`0 ERAm]a! ^^%4       U u0 uF	  p R_V R` 2kK  	  up ,          tb0 ERBmtcRDRE0td]c]d,          te0 ERCmtfRatgRNthRbti]j! ]
P                  P                  Rc]m! ERD4      4      4      tn]j! ]
P                  P                  Rd]m! ERE4      4      4      to]j! ]
P                  P                  Re]m! ERF4      4      4      tp]j! ]
P                  P                  Rf]m! ERG4      4      4      tq^trRgRhRiRjR'RkRlRm]
Pt                  Pw                  RYRZRn4      RoRpRqRTRrRs/RtRhRuRkRvRjR(Rm]
Pt                  Pw                  RYRZRn4      RoRpRqRVRrRw//tsRx]
Pt                  Pw                  RYRyR[Rz4      ]
Pt                  Pw                  RYR[Rz4      Rz.R{]
Pt                  Pw                  RYR|R[R}4      ./ttRxRhR~RR&RRSR]tRx,          RRRRRR/R{RhRRR&RRQR]tR{,          RRRRRR/RRhRRR'RRR]
Pt                  Pw                  R']`RX,          4      ]
Pt                  Pw                  R(]`RX,          4      .RRRRRR/R]RhRRR'RRR]
Pt                  Pw                  R']`R],          4      ]
Pt                  Pw                  R(]`R],          4      .RRRRRR//tuRtvRtwRtxRty0 ERHmtz0 ERBmt{ERIt|^t}ERDt~ERJtERKtRtERLtERMt0 ERNmt]
Pt                  EP                  ]4      t]
Pt                  Pw                  ]6RIR4      t]
Pt                  Pw                  ]6RR4      tEROtERPtERQt^tERRtERSt]
Pt                  Pw                  ]6R4      t]
Pt                  Pw                  ]6R4      t]
Pt                  Pw                  ]6R4      t]
Pt                  Pw                  ]6RIR4      t]
P                  P                  RR4      tERTR ltRRhRR]RR/RRhRR]ARR/RRhRR]BRR//t^xtRt]j! ]
P                  P                  RR4      4      t]j! ]
P                  P                  R]m! ERU4      4      4      t];QJ d>    . R ]
P                  P                  RR4      EP9                  R4       4       F  NK  	  5M7! R ]
P                  P                  RR4      EP9                  R4       4       4      t]j! ]
P                  P                  R]m! ERQ4      4      4      t]
P                  P                  RR4      t]
P                  P                  RR4      tRtRt]
P                  P                  RR4      EPG                  4       EPI                  4       ERV9  t^tRt^<tRRRR/tRRRR/t]j! ]
P                  P                  RR4      4      t]
P                  P                  RR4      EPG                  4       EPI                  4       ERV9  tR tR tR tR tR t]
P                  P                  RR4      EPG                  4       EPI                  4       ERV9  t]j! ]
P                  P                  RR4      4      t]j! ]
P                  P                  RR4      4      t]j! ]
P                  P                  RR4      4      t]! ^]! ^]j! ]
P                  P                  RR4      4      4      4      t]! ^-]! ^\]j! ]
P                  P                  RR4      4      4      4      t]j! ]
P                  P                  RR4      4      tR]! ]4      ,          t]
P                  P                  RR4      EPG                  4       EPI                  4       ERV9  t]
P                  P                  RR4      EPG                  4       EPI                  4       ERV9  t]
P                  P                  RR4      EPG                  4       t]
P                  P                  RR4      EPG                  4       t]
P                  P                  R]
Pt                  Pw                  ]6R4      4      t]! ^]! ^]j! ]
P                  P                  RR4      4      4      4      t]! ^]! ERW]j! ]
P                  P                  RR4      4      4      4      t]
P                  P                  RR4      t]
Pt                  Pw                  ]6R4      t]
Pt                  Pw                  ]6R4      t]
Pt                  Pw                  ]6R4      t]
Pt                  Pw                  ]6R4      tRt]
P                  P                  RR4      EPG                  4       ;'       g    Rt]j! ]
P                  P                  RR4      4      t]
P                  P                  RR4      EPG                  4       EPI                  4       ERV9  t]j! ]
P                  P                  RR4      4      t]
Pt                  Pw                  ]6R4      tRRRRRRRRRRRRRR/t]EP                  ! 4       tRhRR]RR/]R&   RhRR]RR/]ER &   RhERR]RER/]ER&   ER tER tER tER tER tER	 tERXER
 ltERYER ltER tER tER tER tER tER tER tER tER tER tER tER tER tER tER tER tERTER ltER tERZER ltER tER  tER! tER" tER# tER$ tER% tER& tER[ER' ltER[ER( ltER\ER* ltER+ tER, tER- tER. tER/ tER0 tER]ER1 ltER2 tER3 Et ER4 EtER5 EtER6 Et0 ER^mEtRDRE0EtE]E],          Et]gEt]iEtER7Et	ER8Et
 ! ER9 ER:E]4      Et]%! RER;7       ! ER< ER=4      4       Et]%! RER;7       ! ER> ER?4      4       Et]%! RER;7       ! ER@ ERA4      4       Et]%! RER;7       ! ERB ERC4      4       EtERD ERE lEtERF ERG lEtERH ERI lEtERJ ERK lEt]EP*                  ! ERL]EP,                  ]EP.                  ,          4      Et]EP*                  ! ERM]EP,                  4      Et]EP*                  ! ERN]EP,                  ]EP.                  ,          4      EtERO ERP lEtERQ ERR lEtERS ERT lEtERUE]	/ERV ERW llEtERX ERY lEtERTERZ ER[ llEt ERTER\ ER] llEt!ERTER^ ER_ llEt"ER`EPG                  4       Et#ERaEPI                  4       Et%ERbEPI                  4       Et&ERXERc ERd llEt'ERe ERf lEt(RJR/ERg ERh llEt)ERTERi ERj llEt*ERk Et+ERl Et,ERm Et-ERn Et.ERo Et/ERp Et0ERq Et1ERr Et2ER[ERs lEt3ERt Et4ERu Et5ERTERv lEt6ERw Et7ER_ERx lEt8ERy Et9ERz Et:ER{ Et;ER| Et<R0Et=R'Et>R(Et?ER} Et@ER~ EtAER`ER lEtBER EtCERaER lEtDERaER lEtEERaER lEtFERaER lEtG]NEP                  4        F  EtI]
EP                  ! E]IRER7       K  	  ]
EP                  ! ]
Pt                  Pw                  ]NR',          RYRZR[4      RER7       ]
EP                  ! ]
Pt                  Pw                  ]NR',          RYRZRn4      RER7       ]
EP                  ! ]
Pt                  Pw                  ]NR(,          RYRZR[4      RER7       ]
EP                  ! ]
Pt                  Pw                  ]NR(,          RYRZRn4      RER7       ]
EP                  ! ]
Pt                  Pw                  ]NR&,          RYRn4      RER7       ]
EP                  ! ]
Pt                  Pw                  ]NR&,          RYRyR[4      RER7       ]
EP                  ! ]
Pt                  Pw                  ]NR&,          RYR|R[4      RER7       ]
EP                  ! ]
Pt                  Pw                  ]NR&,          RYR[4      RER7       ]
EP                  ! ]RER7       ]
EP                  ! ]RER7       ER EtK]0EP                  ER 4       EtMER EtNER EtOERbER lEtPER EtQER EtRER EtSERcER lEtTERcER lEtUER EtVER EtWER EtXER EtYER EtZER Et[ER Et\ER Et]ER Et^ER Et_ER Et`ER EtaER EtbER EtcER EtdER EteER EtfER EtgER[ER lEthERdER lEtiER EtjER EtkER EtlER EtmER EtnER EtoER EtpER EtqER EtrER EtsER[ER lEttER EtuER EtvER EtwER EtxERTER lEtyERTER lEtzER Et{ERTER lEt|ER Et}ER Et~ER EtER EtEReER lEtERfER lEtER EtER EtER EtER EtER EtERgER lEtER EtERhER lEtERiER lEtER EtERjER lEtERkER lEtER_ER lEt]3ER lEt]3ER lEtER EtER EtER EtER EtER EtER EtER EtER EtER EtER Et ! ER ER4      EtE]! 4       EtER EtER EtER EtERTER lEtERTER lEtER EtERdER lEtERlER lEt ! ER ER4      Et ! ER ER4      Et ! ER ER4      EtE]! 4       EtE]! 4       EtE]! 4       EtERmER lEtER EtERnER lEtER EtER EtER EtER EtERoER lEtERoER lEtERpER lEtER EtER EtER EtER EtER EtERRhERRR'RjR'RRUER]
Pt                  Pw                  RYRZRn4      ER]
Pt                  Pw                  RYRZR[R\4      ]
Pt                  Pw                  RYRZR[R^4      .ERER/ERRhERRR'RjR(RRMER]
Pt                  Pw                  RYRZRn4      ER]
Pt                  Pw                  RYRZR[R\4      ]
Pt                  Pw                  RYRZR[R^4      .ERER//EtER EtER  EtER EtER EtER EtER EtER EtER EtERqER lEtERrER lEtER	 EtER
 Et]0EP                  ER4      ER 4       Et]0EP                  ER4      ER 4       Et]0EP                  ER4      ER 4       Et. ERsNERtNERuNERvNERwNERxNERyNERzNER{NER|NER}NER~NERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNERNEtER EtER EtER EtERER lEtER EtER EtER EtERER lEtER EtER EtER[ER lEtER EtER EtER EtER EtER  EtER! EtER" EtER[ER# lEtERER% lEtERER& lEtERaER' lEt]0EP                  ER4      ]0EP                  ER(4      ER) 4       4       EtER* EtER+ Et]0EP                  ER,4      ER- 4       Et]0EP                  ER.ER/.ER07      ER1 4       EtERER2 lEtER3 EtER4 EtER5 EtER6 EtERER7 lEtER8 EtER9 EtER: Et]0EP                  ER$4      ER; 4       Et]0EP                  ER<4      ER= 4       Et]0EP                  ER>4      ER? 4       Et]0EP                  ER@ERAER/.ER07      ERB 4       Et]0EP                  ERCER/.ER07      ERD 4       Et]0EP                  EREER/.ER07      ERF 4       Et]0EP                  ERGER/.ER07      ERH 4       Et]0EP                  ERIER/.ER07      ERJ 4       Et]0EP                  ERK4      ERL 4       Et]0EP                  ERM4      ERN 4       Et]0EP                  ERO4      ERP 4       Et]0EP                  ERQ4      ERR 4       Et]0EP                  ERS4      ERT 4       Et]0EP                  ERU4      ERV 4       Et]0EP                  ERW4      ERX 4       Et]0EP                  ERY4      ERZ 4       Et ]0EP                  ER[4      ER\ 4       Et]0EP                  ER]4      ER^ 4       Et]0EP                  ER_4      ER` 4       Et]0EP                  ERaER/.ER07      ERb 4       Et]0EP                  ERcER/.ER07      ERd 4       Et]0EP                  ERe4      ERf 4       Et]0EP                  ERg4      ERh 4       Et]0EP                  ERi4      ERj 4       Et]0EP                  ERk4      ERl 4       Et	]0EP                  ERmER/.ER07      ERn 4       Et
]0EP                  ERo4      ERp 4       Et]0EP                  ERq4      ERr 4       Et]0EP                  ERs4      ERt 4       Et]0EP                  ERuER/.ER07      ERv 4       Et]0EP                  ERwER/.ER07      ERx 4       Et]0EP                  ERy4      ERz 4       Et]0EP                  ER{ER/.ER07      ER| 4       Et]0EP                  ER}4      ER~ 4       Et]0EP                  ER4      ER 4       Et]0EP                  ERER/.ER07      ER 4       Et]0EP                  ERER/.ER07      ER 4       Et]0EP                  ERER/.ER07      ER 4       Et]0EP                  ER4      ER 4       Et]0EP                  ER4      ER 4       Et]0EP                  ERER/.ER07      ER 4       Et]0EP                  ERER/.ER07      ER 4       Et]0EP                  ERER/.ER07      ER 4       EtEREtEREt]EP*                  ! ER4      EtEREtR)Et EREt!0 ERmEt"ERERERERERERERERERER/Et#ER Et$ERER lEt%ER Et&]
Pt                  Pw                  ]NR),          ER4      Et']
Pt                  Pw                  ]NR),          ER4      Et(ERTER lEt)]0EP                  ER4      ER 4       Et*ER_ER lEt+ER Et,]0EP                  ERER/.ER07      ER 4       Et-]0EP                  ERER/.ER07      ER 4       Et.]0EP                  ERER/.ER07      ER 4       Et/]0EP                  ERER/.ER07      ER 4       Et0]0EP                  ERER/.ER07      ]0EP                  ERER/.ER07      ER 4       4       Et1]0EP                  ERER/.ER07      ]0EP                  ERER/.ER07      ER 4       4       Et2]0EP                  ERER/.ER07      ER 4       Et3]0EP                  ERER/.ER07      ER 4       Et4]0EP                  ERER/.ER07      ER 4       Et5]0EP                  ERER/.ER07      ER 4       Et6]0EP                  ER4      ER 4       Et7]0EP                  ERER/.ER07      ER 4       Et8]0EP                  ERER/.ER07      ER 4       Et9]0EP                  ERER/.ER07      ER 4       Et:]0EP                  ERER/.ER07      ER 4       Et;]0EP                  ER4      ]0EP                  ER4      ER 4       4       Et<]0EP                  ER4      ]0EP                  ER4      ER 4       4       Et=]0EP                  ER4      ]0EP                  ER4      ER 4       4       Et>]0EP                  ER4      ]0EP                  ER4      ER 4       4       Et?]0EP                  ER4      ]0EP                  ER4      ER 4       4       Et@]0EP                  ER4      ER 4       EtA]0EP                  ER4      ER 4       EtB]0EP                  ER4      ER 4       EtC]0EP                  ER4      ER 4       EtD]0EP                  ER4      ]0EP                  ER4      ER 4       4       EtE]0EP                  ER4      ER 4       EtF]0EP                  ER4      ER 4       EtGEREtHREtIEREtJER EtKER EtLE]EtMERrER lEtNER EtOER EtP]0EP                  ER4      ER 4       EtQEREtREREtSER EtTER EtUER EtVER EtWER EtXER[ER lEtYER EtZER Et[ER Et\ER Et]ER Et^ER Et_ER Et`ER Eta]0EP                  ER4      ]0EP                  ER 4      ER 4       4       Etb]0EP                  ER4      ER 4       Etc]0EP                  ER4      ER 4       Etd]0EP                  ER4      ER 4       Ete]0EP                  ER4      ER	 4       Etf]0EP                  ER
4      ER 4       Etg]0EP                  ER4      ER 4       Eth]0EP                  ER4      ER 4       EtiEREtjER EtkER EtlERER lEtmER EtnER Eto]0EP                  ERERAER/.ER07      ER 4       Etp]
Pt                  Pw                  ]6ER4      EtqREtrER EtsER EttER EtuER EtvER EtwER EtxER EtyER  EtzER! Et{ER" Et|ERaER# lEt}]0EP                  ER$ERA.ER07      ER% 4       Et~]0EP                  ER&ER/.ER07      ER' 4       EtE]NEtERrER( lEt. EROEt]EP*                  ! ER)]EP                  4      EtER* EtER+ Et]0EP                  ER,4      ER- 4       Et]
Pt                  Pw                  ]6ER.4      Et0 ERmEtER/ EtER0 EtER1 EtER2 EtER3 EtER4 EtER5 EtER6 EtER7 EtER8 Et]0EP                  ER94      ER: 4       EtER; EtER< EtER= EtER> EtERTER? lEtE]EtER@ EtERAEtERBEt]
Pt                  Pw                  ]6RERC4      Et]
Pt                  Pw                  ]6RIERD4      Et]
Pt                  Pw                  ]6ERE4      EtEREtREtEREtREtERFRhERGERH]
Pt                  Pw                  ]NR',          R,4      .ERIERJ/ERKRhERLERH]
Pt                  Pw                  ]NR',          RU4      .ERIERM/ERNRhEROERH]
Pt                  Pw                  ]NR(,          R-4      .ERIERJ/ERPRhERQERH]
Pt                  Pw                  ]NR(,          RM4      .ERIERM/ERRRhERSERH]
Pt                  Pw                  ]NR&,          R,4      .ERIERJ/ERTRhERUERH]
Pt                  Pw                  ]NR&,          RS4      .ERIERM/ERVRhERWERH]
Pt                  Pw                  ]NR&,          RQ4      .ERIERM/ERXRhERYERH]
Pt                  Pw                  ]NR),          R,4      .ERIERZ/ER[RhER\ERH]
Pt                  Pw                  ]NR*,          R,4      .ERIERZ/ER]RhER^ERH]
Pt                  Pw                  ]NR+,          R,4      .ERIERZ/ER_RhER`ERH]
Pt                  Pw                  ]NR',          ]`RX,          4      ]
Pt                  Pw                  ]NR(,          ]`RX,          4      .ERIER)/ERaRhERbERH]
Pt                  Pw                  ]NR',          ]`R],          4      ]
Pt                  Pw                  ]NR(,          ]`R],          4      .ERIER)/ERcRhERdERH]
Pt                  Pw                  ]6ERe4      .ERIERfERgR//EtERhERiERjERk/EtERl EtERm EtERn EtERo EtERp EtERq EtERr EtERs EtERt EtERu EtERv EtERw Et]0EP                  ERx4      ERy 4       Et]0EP                  ERzER/.ER07      ER{ 4       Et]0EP                  ER|4      ER} 4       Et]0EP                  ER~ER/.ER07      ER 4       Et]0EP                  ERER/.ER07      ER 4       EtEREt]
Pt                  Pw                  ]6RER4      Et]
Pt                  Pw                  ]6ERER4      Et]
Pt                  Pw                  E]ER4      EtR']
Pt                  Pw                  ]6R'4      R(]
Pt                  Pw                  ]6R(4      R)]
Pt                  Pw                  ]6R)4      /EtERERERERRWERRVERERER/Et0 ERmEt0 ERmEt0 ERmEt0 ERmEt0 ERmEt0 ERmEtEREtER EtER EtER EtER EtER EtERER lEtER EtER EtER EtER EtER EtER EtER EtER EtER EtERTER lEtER EtER EtERER lEtER EtER Et]0EP                  ER4      ER 4       Et]0EP                  ER4      ER 4       Et]0EP                  ER4      ER 4       Et]0EP                  ER4      ER 4       Et]0EP                  ER4      ER 4       EtER EtE]]0EP                  ER&   ]
Pt                  Pw                  ]6ER4      Et]
Pt                  Pw                  ]6ER4      Et]
Pt                  EP                  ]
Pt                  Pw                  ]6ERe4      4      Et]Ph                  ! R
4      Et E]R! ]4      Et ]
Pt                  EP                  ]4      Et]
Pt                  EP                  ]4      EtER EtERTER lEtER EtER EtER EtER EtER EtERER lEtERER lEtER EtER[ER lEtER EtER EtERpER lEtERER lEtER EtER EtER Et]0EP                  ER4      ER 4       Et]0EP                  ER4      ER 4       Et]0EP                  ER4      ER 4       EtER EtE]Et ER EtE]EtERER lEtE]~EtER Et~E]EtER Et]0EP                  P                  ER4      EtER EtE]EtER EtE]EtERER lEtE]]0EP                  ER&   E]]0EP                  ER&   E]]0EP                  ER&   E]]0EP                  ER&   EREt]
Pt                  Pw                  ]6ER4      Et	]
Pt                  Pw                  ]6ER4      Et
EREt^EtERF]
Pt                  Pw                  ]NR',          R,4      ERK]
Pt                  Pw                  ]NR',          RU4      ERN]
Pt                  Pw                  ]NR(,          R-4      ERP]
Pt                  Pw                  ]NR(,          RM4      /EtER EtER EtER EtER EtER EtER EtER EtERER lEtER EtE]EtER EtE]EtER Et]0EP                  ER4      ER 4       Et]0EP                  ER4      ER 4       EtE]EtERER lEt]0EP                  P                  ER4      EtER EtE]]0EP                  ER&   EREt]
Pt                  Pw                  ]6RER4      Et]
Pt                  Pw                  ]6ERER4      Et ]
Pt                  Pw                  ]6ER4      Et!E]"! E]4      Et#E]"! E]4      Et$ER Et%ER Et&ER Et'ER Et(ER Et)ERER lEt*ER Et+ERTER lEt,ER Et-ER Et.ER Et/ERER lEt0ER Et1]0EP                  ER4      ER 4       Et2]0EP                  ER4      ER 4       Et3]0EP                  ER4      ER 4       Et4]0EP                  ER4      ER 4       Et5]0EP                  ER 4      ER 4       Et6]0EP                  ER4      ER 4       Et7]0EP                  P                  ER4      Et8ER Et9E]9]0EP                  ER&   EREt:]
Pt                  Pw                  ]6RIER4      Et;]
Pt                  Pw                  ]6ERER4      Et<ER Et=ERER	 lEt>]0EP                  P                  ER
4      Et?ER Et@E]@]0EP                  ER
&   ]0EP                  P                  ER4      EtAER EtBE]B]0EP                  ER&   ]0EP                  P                  ER4      EtCER EtDE]D]0EP                  ER&   ]0EP                  ERER/.ER07      ER 4       EtE]0EP                  ER4      ER 4       EtFER EtGE]G]0EP                  ER&   ER EtHER EtIER EtJER EtKER EtLER EtME]H]0EP                  ER&   E]I]0EP                  ER&   E]J]0EP                  ER&   E]K]0EP                  ER&   E]L]0EP                  ER &   E]M]0EP                  ER!&   ]0EP                  P                  ER4      EtNER" EtOE]O]0EP                  ER&   E]EtPERER# lEtER$ EtQ]
Pt                  Pw                  ]<ER%4      EtR]
Pt                  Pw                  ]<ER&4      EtSER'EtTER( EtERER) lEtUER* EtERmER+ lEtVER, EtWERpER- lEtER. EtE]EtXER[ER/ lEtER0 EtYE]EtZERER1 lEt]/ER28X  d   E]! ER34       E]! ER44       E]! 4        ]EP                  ! E]QER5RER67      EP                  4        ]EP                  ! E]YER7RER67      EP                  4        ]0EP                  ]7]8RRER87       R# R# u up i   E] d    REt ELi ; i  E] d    EREt^ Et ELi ; i(      )Flaskrequestredirectsend_from_directorymake_responseResponse	send_file)secure_filenameN)Path)	dataclassasdict)datetime)DictListMappingOptionalSequenceTupleuy   TripServer Admin GOLD v101 — Safe Update Architecture + Unified Trip Audit Center + Japan Media Cleanup + Netlify Fixesz!EITAN-ADMIN-GOLD-v101-20260718-01%Y-%m-%d %H:%M:%SC:\TripServerz0.0.0.0@  iJ  control_serverztripserver_control_server.pyzpending_admin_server.pyzrequest.jsonzstatus.jsonztripserver_control_server.logz tripserver_control_bootstrap.logTripServerControlServerzadmin_failsafe_status.json%presentation_music_upload_status.jsontmppending_music_uploads	downloads
tripserver.txt.json.md.html.htm.css.js.xmli  JAPANUSAUSA_TVMoneyapp	MoneyHomeTripForm
index.htmlusa2027-tv.htmlz-https://beautiful-kitsune-dafd66.netlify.app/netlify_exportsu  <section class="slide budget" data-key="budget">
<div class="slide-shell">
<div class="media-panel">
<img alt="תקציב הטיול" class="hero-image" data-local-base="media/usa-presentation/images/budget" loading="lazy" referrerpolicy="no-referrer" src="media/usa-presentation/images/budget.jpg"/>
<div class="image-overlay"></div>
<div class="image-caption">תכנון תקציבי</div>
</div>
<div class="info-panel">
<div class="badge">💰 תקציב</div>
<h1>תקציב — בלי דרמה</h1>
<div class="region">תמונת מצב תקציבית</div>
<p class="vibe">השקף הזה משאיר את המספרים בקובץ הטיול, ובמצגת מציג רק את התמונה הכללית.</p>
<ul class="summary-list"><li>המסגרת התקציבית מנוהלת בקובץ הטיול ובאפליקציית התקציב.</li><li>המעקב מחולק ללינה, פארקים, נסיעות, אוכל, קניות וקרוז.</li><li>המטרה: ליהנות מהטיול בלי להפוך כל עצירה לחישוב.</li></ul>
<div class="fun-note">את המספרים המדויקים משאירים למעקב התקציב — כאן נשארים באווירה של טיול.</div>
</div>
</div>
</section>netlify_build.svgz.map.jpg.jpeg.png.webp.gif.bmpz.ico.mp3.wav.m4a.aac.flac.ogg.opus.wma.webm.mp4.m4vz.woffz.woff2z.ttfbackupsbackup
_redirects_headersusa2027-presentation-tv.htmlmedia-timeline-report.json!media/usa-presentation/images-tv/flight_introjapan-flight-intro.htmljapan_experiencejapan-experience.htmlusa_presentationusa2027-presentation.htmlusa_presentation_tvusa_trip_tv	usa_musicmediausa-presentationmusicusa-roadtrip-theme.mp3usa_music_part2usa-part2-theme.mp3zday-02dmedia-manifest.jsonz%2026-07-13-v44-inline-source-of-truthTRIPSERVER_USA_VIDEO_MAX_BYTES"TRIPSERVER_USA_MEDIA_ZIP_MAX_BYTES/TRIPSERVER_USA_MEDIA_ZIP_MAX_UNCOMPRESSED_BYTES.TRIPSERVER_USA_MEDIA_ZIP_MAX_SINGLE_FILE_BYTESphonelabelu   מסך פלאפוןroot_keydescriptionu<   מצגת ארה״ב למסכי אייפון/אנדרואידfolderimages
rel_prefixmedia/usa-presentation/imagespresentation_key
backup_tagUSA_images_phonetvu   מסך טלוויזיהu-   מצגת ארה״ב למסך TV / LG C3 77 4KUSA_TV_imagesjapan_experience_musicjapan-experiencejapan-theme.mp3japan_flight_musicjapan-flightflight-intro.mp3u/   יפן קיץ 26 — שיר מצגת ראשיתtrippresentationmusic_targetsscopeu   כל שקפי מצגת יפןfuture_behavioru  פעיל כעת: העלאת שיר מצגת יפן מודדת את האורך לפני הטמעה. אם ממוצע השקף יוצא מתחת ל־5 שניות או מעל ל־10 שניות, מוצג מסך אישור לפני שמירת השיר וסנכרון המצגת.enabled_nowTu3   יפן קיץ 26 — מוזיקת פתיח טיסהu   פתיח הטיסה בלבדus   העלאת שיר תישמר לפתיח הטיסה בלבד; לא מסנכרנת את מצגת יפן הראשית.Fusa_music_part1u3   ארצות הברית קיץ 27 — שיר חלק 1z8usa2027-presentation.html / usa2027-presentation-tv.htmlu   שקפים 1–23 בלבדup   פעיל כעת: העלאת שיר חלק 1 מסנכרנת רק את מקטע 1 ולא משנה את מקטע 2.u3   ארצות הברית קיץ 27 — שיר חלק 2u   שקפים 24–44 בלבדup   פעיל כעת: העלאת שיר חלק 2 מסנכרנת רק את מקטע 2 ולא משנה את מקטע 1.      @      $@i@  admin_serveradmin_server_uploadszrestart_admin_server.cmdzadmin_restart.logzrestart_admin_server_helper.pyuploaded_filesTRIPSERVER_RESTART_TASKTripServerAdminRestartOncec                6   T ;'       g    \         P                  ;'       g    Rp\        P                  R8w  d   V#  \        P                  P                  V4      P                  4       p\        P                  P                  V4      pVR8X  d(   \        P                  P                  V4      '       d   V# V'       dH   \        P                  P                  VR4      p\        P                  P                  V4      '       d   V# R#   \         d    Tu # i ; i)zReturn a no-console Python executable for Windows scheduled tasks when available.

Windows scheduled restart tasks should run without a visible console.
On non-Windows or if pythonw.exe is unavailable, fall back to the normal interpreter.
pythonntpythonw.exe)sys
executableosnamepathbasenamelowerdirnameexistsjoin	Exception)	preferredexebaserc   	candidates   &    C:\TripServer\admin_server.pyget_pythonw_executabler   (  s     
1
1s~~
1
1C	ww$
ww$**,%= RWW^^C%8%8JV];Iww~~i((   
s+   A7D 5D 7D ?AD D DDrestartu   לוג אתחול פאנלr   noteuW   Restart helper, העלאת admin חדש, שחזור גיבוי ופעולות מחשב.controlu   לוג שרת בקרהuX   שרת הבקרה החיצוני שמפעיל ומעדכן את האדמין הראשי.control_bootstrapu!   לוג התקנת שרת בקרהu*   כתיבת והפעלת שרת הבקרה.  TRIPSERVER_IMAGE_MAX_LONG_EDGE1920TRIPSERVER_IMAGE_TARGET_BYTESc              #   f   "   T F'  qP                  4       '       g   K  \        V4      x  K)  	  R # 5iN)stripint).0qs   & r   	<genexpr>r   N  s2       "M2~Q  CJ  CJ  CL&#a&&2~s   11TRIPSERVER_IMAGE_QUALITIESz88,86,84,82,80,78,TRIPSERVER_AUDIO_MAX_BYTESTRIPSERVER_AUDIO_MP3_BITRATE192k TRIPSERVER_AUDIO_MP3_SAMPLE_RATE44100zF.mp3,.wav,.m4a,.aac,.flac,.ogg,.opus,.wma,.webm,.mp4,audio/*,video/mp4z-.jpg,.jpeg,.png,.webp,.bmp,.tif,.tiff,image/*TRIPSERVER_ENABLE_POWER_ACTIONS10i  shutdown
   כיבויrebootu   הפעלה מחדש   כיבוי מחשב   ריסטארט למחשב0TRIPSERVER_ADMIN_UPDATE_FAILSAFE_RESTART_SECONDS180 TRIPSERVER_ADMIN_UPDATE_FAILSAFEc           	      j    \         P                  ! \         P                  P                  V 4      R R7       V R,           p\	        VRRR7      ;_uu_ 4       p\
        P                  ! WR^R7       RRR4       \         P                  ! W 4       R #   + '       g   i     L(; i  \         d     R# i ; i)	Texist_ok.tmpwutf-8encodingFensure_asciiindentN)	r   makedirsr   r   openjsondumpreplacer   r   payloadr   fhs   &&  r   _json_safe_writer   f  s|    
BGGOOD)D9Vm#sW--IIga@ .


3 .-  s*   AB# B0B# B 	B# #B21B2c                  f    \         P                  P                  \        4      '       d^   \	        \        R RR7      ;_uu_ 4       p \
        P                  ! V 4      p\        V\        4      '       d   VuuRRR4       #  RRR4       M RRRR/#   + '       g   i     L; i  \         d     L&i ; i)rr   r   Nstateunknownmessageu4   עדיין אין נתוני Fail Safe שמורים.)
r   r   r   ADMIN_FAILSAFE_STATUS_PATHr   r   load
isinstancedictr   )r   datas     r   read_admin_failsafe_statusr   r  s    77>>4550#HHByy}dD)) IH) IH 6 Y	+abb IH  s:   (B" B" .B3
B" ?B" B	B" B" "B0/B0c                     R V RVR\         P                  ! R4      R\        /pVP                  V4       \	        \
        V4       V# )r   r   
updated_atr   admin_version)timestrftimeADMIN_PANEL_VERSIONupdater   r   )r   r   extrar   s   &&, r   write_admin_failsafe_statusr   ~  sF    7dmm$78,	G NN5/9N    c                     T ;'       g    R P                  4       pRV9   ;'       g     RV9   ;'       g    RV9   ;'       d    RV9   # ) 1116zno shutdown was in progress   איןr   r   )outputtxts   & r   is_no_pending_shutdown_messager     sJ    <<R


 CcMqq<CqqUXIpIp]imp]pqr   c            	         \        4       p \        V P                  R 4      ;'       g    R4      p\        V P                  R4      ;'       g    R4      p\        V P                  R4      ;'       g    R4      pVR9   d   RpRpMVR9   d   RpRpMVR9   d   R	pR
pMRpRp\        P                  ! T;'       g    R4      p\        P                  ! V4      pRV: RV: RV: RV: R2	# )r   r   r   r   r   u   🟠u   Fail Safe חמושu   🟢u   Fail Safe לא פעילu   🔴u   Fail Safe דורש בדיקהu   ⚪u   Fail Safe ללא סטטוסuW   אין ריסטארט פעיל כרגע או שעדיין אין בדיקת סטטוס.z<div class="status-card"><b> z
</b><span>z<br><small>z</small></span></div>>   armed>   none	cancelledauto_cancelled>   
arm_failedcancel_failed)r   strgethtml_libescape)r   r   r   updatedicontitlesafe_msgsafe_updateds           r   render_failsafe_status_cardr     s    %'D!..Y/E$((9%++,G$((<(..B/G	$	9	9)	1	1/-w   D   D  +D  EH??7+L`dfkmu  xD  E  Er   TRIPSERVER_ENABLE_WEBCAMTRIPSERVER_WEBCAM_INDEXTRIPSERVER_WEBCAM_WIDTH1280TRIPSERVER_WEBCAM_HEIGHT720TRIPSERVER_WEBCAM_FPS8TRIPSERVER_WEBCAM_JPEG_QUALITY78$TRIPSERVER_WEBCAM_MAX_STREAM_SECONDS1800      ?TRIPSERVER_ENABLE_CAMERA_AUDIO"TRIPSERVER_ENABLE_CAMERA_RECORDINGTRIPSERVER_FFMPEG_VIDEO_DEVICEr   TRIPSERVER_FFMPEG_AUDIO_DEVICE TRIPSERVER_CAMERA_RECORDINGS_DIRcamera_recordingsTRIPSERVER_CAMERA_RECORD_FPS15$TRIPSERVER_CAMERA_RECORD_MAX_SECONDS3600TRIPSERVER_CAMERA_AUDIO_BITRATE128kzcamera_setup.logzcamera_audio_stream.logcamera_live_hlszcamera_hls_stream.logu   התקןTRIPSERVER_OPENCV_PACKAGEzopencv-python)TRIPSERVER_OPENCV_INSTALL_TIMEOUT_SECONDS900%TRIPSERVER_CAMERA_AUTO_INSTALL_OPENCV,TRIPSERVER_CAMERA_AUTO_INSTALL_DELAY_SECONDS4zcamera_opencv_installed.okrunning
started_atfinished_atoklast_messagemodeidleauto_requestedu'   לוג התקנת רכיבי מצלמהu@   התקנת OpenCV דרך pip ובדיקת רכיבי מצלמה.camera_setupu   לוג אודיו מצלמהuX   FFmpeg DirectShow, בחירת מיקרופון וניסיונות הפעלת אודיו.camera_audiou+   לוג שידור מצלמה מאוחד HLSui   FFmpeg DirectShow וידאו+אודיו בתהליך אחד, כדי למנוע נעילת התקני USB.
camera_hlsc                    T ;'       g    R P                  RR4      P                  R4      pV'       d   VP                  R4      '       d   R# VP                  R4       Uu. uF  q"'       g   K  VR9  g   K  VNK  	  ppV'       d)   \	        V4      \	        VP                  R4      4      8w  d   R# RP                  V4      # u upi )r   \/	__MACOSX/N)...)r   r   
startswithsplitlenr   )raw_namerawppartss   &   r   safe_zip_relpathr1    s    >>r
"
"4
-
3
3C
8C#..--		#E1!Q0DQQEECJ#ciin"5588E? Fs    	C.C7Cc                 ~    \         P                  P                  T ;'       g    R 4      ^,          P                  4       # r   )r   r   splitextr   )filenames   &r   file_extr6    s+    77HNN+A.4466r   c                      \        V R 4      ;_uu_ 4       pVP                  ^4      R8H  uuRRR4       #   + '       g   i     R# ; i  \         d     R# i ; i)rbs   NF)r   readr   )r   r   s   & r   is_likely_jpeg_filer:    sF    $771:0  s+   A	 5
A	 A	 A	 A	 	AAc           	         \        V R4      ;_uu_ 4       pVP                  R4      pRRR4       XP                  R4      '       d   R# \        ^ \	        ^ \        V4      ^,
          4      4       F0  pW#,          ^8X  g   K  W#^,           ,          ^,          ^8X  g   K/   R# 	  R#   + '       g   i     L; i  \         d     R# i ; i)zGFast MP3 sniffing: ID3 tag or MPEG audio frame sync near the beginning.r8     Ns   ID3TF)r   r9  r*  rangemaxr,  r   )r   r   r   idxs   &   r   is_likely_mp3_filer@    s    
$774=D ??6""C3t9q=12CyD d7md&:t%C 3    s?   B8 B%B8 	3B8 B8 B8 !B8 %B5	0B8 8CCc                  R   \         P                  P                  R 4      RRRR.p V  F|  pV'       g   K  \         P                  P	                  V4      V8X  d   \
        P                  ! V4      M(\         P                  P                  V4      '       d   TMRpV'       g   Kz  Vu # 	  R# )FFMPEG_PATHffmpegzC:\ffmpeg\bin\ffmpeg.exez&C:\Program Files\ffmpeg\bin\ffmpeg.exez,C:\Program Files (x86)\ffmpeg\bin\ffmpeg.exeNr   environr   r   r   shutilwhichr   
candidatesr   founds      r   find_ffmpeg_executablerK    s    


}%#17J  	+-77+;+;I+F)+SY'gigngnguguv  hA  hAZc  GK5L   r   c                  R   \         P                  P                  R 4      RRRR.p V  F|  pV'       g   K  \         P                  P	                  V4      V8X  d   \
        P                  ! V4      M(\         P                  P                  V4      '       d   TMRpV'       g   Kz  Vu # 	  R# )FFPROBE_PATHffprobezC:\ffmpeg\bin\ffprobe.exez'C:\Program Files\ffmpeg\bin\ffprobe.exez-C:\Program Files (x86)\ffmpeg\bin\ffprobe.exeNrD  rH  s      r   find_ffprobe_executablerO    s    


~&$28J  	+-77+;+;I+F)+SY'gigngnguguv  hA  hAZc  GK5L   r   c                    \        T ;'       g    ^ 4      p\        P                  R8X  d   V\        \        R^ 4      ,          pV# )zCReturn process flags that suppress visible Windows console windows.r   CREATE_NO_WINDOW)r   r   r   getattr
subprocess)extra_flagsflagss   & r   hidden_subprocess_flagsrV    s8      q!E	ww$%7;;Lr   c           	          \        R R RRVRR7      pVP                  V4       \        VP                  R^ 4      4      VR&   \        P
                  ! V 3/ VB # )Tr   r   F)capture_outputtextr   errorstimeoutshellcreationflags)r   r   rV  r   rS  run)cmdr[  	overrideskwargss   &&, r   run_hidden_subprocessrb    sS    D79^emrsF
MM)5fjjRS6TUF?>>#(((r   c                      \        \        \        V 4      4      4      p\        V^<4      w  r#\        V^<4      w  rBV'       d   V RVR RVR 2# V RVR 2#   \         d    \        T 4      u # i ; i)<   :rY   )r   roundfloatdivmodr   r   )valuetotalminutessecondshourss   &    r   format_secondsrn  %  s    E%,'(!%,,WAgc]!GC=99!GC=)) 5zs   AA A A0/A0c           
         \        4       pV'       g	   R RRRRR/# VRRRRR	R
V .p \        V^R7      pVP                  ;'       g    RR,           VP                  ;'       g    R,           P	                  4       pVP
                  ^ 8w  d,   R RRT;'       g    RVP
                   2RVP
                  RV/# RpVP                  4        F)  pVP	                  4       pV'       g   K   \        V4      p M	  Ve   V^ 8:  d   R RRRRVRV/# R RRVR\        V4      RVRV/#   \         d     Ke  i ; i  \        P                   d    R RRRRT/u # \         d   pR RR\        T4      RT/u Rp?# Rp?ii ; i)r  FerroruB   ffprobe לא נמצא. ודא שקיים C:\ffmpeg\bin\ffprobe.exerN  r   -v-show_entrieszformat=duration-ofz"default=noprint_wrappers=1:nokey=1r[  
zffprobe failed rc=return_codeNu.   ffprobe לא החזיר משך שיר תקיןr.  Tduration_secondsduration_displayu$   ffprobe חרג מזמן הבדיקה)rO  rb  stdoutstderrr   
returncode
splitlinesrg  r   rn  rS  TimeoutExpiredrepr)r   rN  r_  cpr.  ri  lineexcs   &       r   probe_audio_duration_secondsr  1  s   %'GeW&kmvxz{{w*3	CE"33		R4'299??;BBD==A%#*U*U3Ebmm_1UWdfhfsfsu~  AH  I  INN$D::<Dd % =EQJ%*Z\acfhqsz{{d.7I>Z_K`bgilnw  zA  B  	B	  
 $$ beW&LiY`aa EeWd3iGDDEsk   D0 D0 "3D0 D0 5/D0 %D0D0 	D0 D-)D0 ,D--D0 0E4E4E4E/)E4/E4c                     T ;'       g    R P                  4       p V R8X  d   V\        9   d   V# R# V R8X  d   VR8X  d   R# VR8X  d   R# R# )r   r'   Nr(   rR   rx   rW   )upperPRESENTATION_MUSIC_SYNC_RULES)rr   	music_keys   &&r   music_key_to_rule_keyr  S  sQ    JJBDw%)FFyPDPu}#$))$r   c                 p    \         P                  V R 4      p\        P                  V\        R ,          4      # r(   )USA_PRESENTATION_ROOTSr   FOLDERS)rg   ra   s   & r   usa_folder_for_presentation_keyr  _  s*    %))*:EBH;;x00r   c                 p    \         P                  V R 4      p\        P                  V\        R ,          4      # r  )USA_EXTRA_HTML_ROOTSr   r  )	extra_keyra   s   & r   usa_folder_for_extra_html_keyr  d  s)    #''	59H;;x00r   c                     \        V 4      w  r\        P                  VP                  R 4      ;'       g    R\        R,          4      # )ra   r(   )usa_image_target_infor  r   target_variantinfos   & r   usa_folder_for_image_targetr  i  s5    0@N;;txx
+44ugenEEr   c                     \         P                  P                  \        R ,          V 4      \         P                  P                  \        R,          V 4      .# r(   r)   )r   r   r   r  )rel_paths   &r   usa_music_absolute_targetsr  n  s;     	WU^X.
WX&1 r   c                 `   \         P                  ! \        R R7       \        P                  ! R4      p\        V P                  ;'       g    R4      ;'       g    Rp\         P                  P                  \        RV R\         P                  ! 4        RV 24      p\         P                  P                  \        RV R\         P                  ! 4        R24      pV P                  V4        \        YVV P                  ;'       g    R4      p\        V4      p. p	V F  p
\        V
4       \        W4      pV
R,           p\        P                   ! Wl4       \         P"                  ! W4       V	P%                  R	\         P                  P'                  V
\(        4      R
V
R\         P                  P+                  V
4      R\        V
4      RV/4       K  	  R\         P                  P+                  V4      RVRV	RV/WV3 FA  p \         P                  P-                  V4      '       d   \         P.                  ! V4       KA  KC  	  #   \0         d     KT  i ; i  YV3 FS  p \         P                  P-                  T4      '       d   \         P.                  ! T4       KA  KC    \0         d     KQ  i ; i	  i ; i)Tr   %Y%m%d_%H%M%Saudio_upload
audio_abs___converted.mp3r   r   relr   sizesha256rD   targetsrS   )r   r   ADMIN_UPLOAD_TMP_DIRr   r   r
   r5  r   r   getpidsaveconvert_or_copy_audio_to_mp3file_sha256ensure_parent_dirbackup_existing_filerF  copy2r   appendrelpathBASE_DIRgetsizer   remover   )uploaded_filetarget_pathsbackup_groupstamp	safe_name
source_tmpconverted_tmprS   sharesultstarget_pathbackup_path
tmp_targetr/  s   &&&           r   %save_audio_upload_to_absolute_targetsr  v  sD   KK$t4MM/*E 6 6 H H.I[[^I2jqUVW`Va4bcJGGLL!5E7!BIIK=Xf7ghMz",ZH^H^HdHdbde-('Kk*.{IK$v-JLL3JJz/NNE277??;#I6S^`fhjhohohwhw  yD  iE  GO  Q\  ]h  Qi  ks  u@  A  B ( 6#yRY[bdij,A77>>!$$IIaL % -  	 ,A77>>!$$IIaL % 	 -sI   ,I C1I =;H??IIJ-;JJ-J'	#J-&J'	'J-c                  N    \         P                  P                  \        4      '       dT   \	        \        R RR7      ;_uu_ 4       p \
        P                  ! V 4      pRRR4       \        X\        4      '       d   V# / #  / #   + '       g   i     L-; i  \         d    / u # i ; ir   r   r   N)
r   r   r   %PRESENTATION_MUSIC_UPLOAD_STATUS_PATHr   r   r   r   r   r   fr   s     r   %read_presentation_music_upload_statusr    s    77>>?@@;S7SSWXyy| T%dD1149r9 A I TS  	s4   (B B BB <B B	B B$#B$c           	         \        4       pYT ;'       g    R &   VP                  R4      p\        V\        4      '       g   . pVP	                  ^ V4       VR,          VR&   \        \        4       \        R,           p\        VRRR7      ;_uu_ 4       p\        P                  ! W%R^R7       R	R	R	4       \        P                  ! V\        4       R	#   + '       g   i     L-; i)
r   _history:N   Nr   r   r   r   Fr   N)r  r   r   listinsertr  r  r   r   r   r   r   )rule_keystatusr   historyr   r  s   &&    r   &write_presentation_music_upload_statusr    s    02D"(		Yhhz"Ggt$$NN1fs|D;<
/&
8C	c3	)	)Q		$a8 
*JJs9: 
*	)s   CC!	c                 D   \        V \        4      '       g   R # V P                  R4      '       d   V P                  R4      # V P                  R4      p\        V\        4      '       d9   V'       d1   V^ ,          p\        V\        4      '       d   VP                  R4      # R # )Nr   r  r   r   r   r  )save_resultr  firsts   &  r   primary_saved_audio_pathr    su    k4((vv&&ooi(G'4  W
eT""99V$$r   c                    \        V \        4      '       g   . # V P                  R 4      '       d   V P                  R 4      .# V P                  R4      p\        V\        4      '       dS   V Uu. uFE  p\        V\        4      '       g   K  VP                  R 4      '       g   K4  VP                  R 4      NKG  	  up# . # u upi )r   r  r  )r  r  items   &  r   all_saved_audio_pathsr    s    k4((	v'((ooi(G'4  -4dWT
48N SWS[S[\bSc  WddI es   -B=
B=#B=c                     \        V R RRR7      ;_uu_ 4       pVP                  4       uuRRR4       #   + '       g   i     R# ; i)r   r   ignorer   rZ  N)r   r9  )r   r  s   & r   read_text_file_utf8r    s-    	dC'(	;	;qvvx 
<	;	;	;s	   3A	c                *   \        V 4       V R,           p \        VRRRR7      ;_uu_ 4       pVP                  V4       VP                  4         \        P
                  ! VP                  4       4       RRR4       \        P                  ! W 4       R#   \         d     L-i ; i  + '       g   i     L9; i  \         dP     \        P                  P                  T4      '       d   \        P                  ! T4       h   \         d     h i ; ii ; i)zWrite UTF-8 text atomically without creating a second backup.

Callers that already created a transaction backup use this helper so a path
correction cannot fail halfway through or leave a truncated presentation.
r   r   r   r   r   newlineN)r  r   writeflushr   fsyncfilenoOSErrorr   r   r   r   r  )r   new_texttmp_pathr  s   &&  r   write_text_file_utf8r    s     df}H(C'2>>!GGHGGI$	 ? 	

8"   ?>  	ww~~h''		(# 	  			sj   B8 "B%$B4B8 B"B%!B""B%%B5	0B8 8D$D )D ?D DDDDc                 B   \         P                  P                  V 4      '       g   \        V 4      h\	        W4      pV R ,           p\        VRRRR7      ;_uu_ 4       pVP                  V4       RRR4       \         P                  ! W@4       V#   + '       g   i     L(; i)r   r   r   r   r  N)r   r   r   FileNotFoundErrorr  r   r  r   )r   r  r  r  r  r  s   &&&   r   'write_text_file_utf8_atomic_with_backupr    sr    77>>$%%&t:Kf}H	hgr	:	:a	 
;JJx 
;	:s   BB	c                     \        WR 4      # r   ),calculate_scaled_slide_durations_ms_with_min)old_durationstarget_total_mss   &&r   #calculate_scaled_slide_durations_msr    s    7X\]]r   c                   a V '       g   \        R 4      h\        \        \        V4      4      4      pV^ 8:  d   \        R4      h\	        R V  4       4      pV^ 8:  d   \        R4      h\        V 4      pSf.   WR,          8  d   RM\        ^V\        ^V4      ,          4      pMG\        \        \        S4      4      4      pV^ 8:  d   \        R4      hWV,          8  d   \        R4      hV\        V4      ,          pV  Uu. uF1  p\        V\        \        \        V4      V,          4      4      4      NK3  	  ppV\	        V4      ,
          p	V	^ 8  d   VR;;,          V	,          uu&   MV	^ 8  d   V	) p
\        \        V4      ^,
          RR4       FU  p\        ^ W,          V,
          4      pV^ 8:  d   K%  \        W4      pW;;,          V,          uu&   W,          p
V
^ 8:  g   KU   M	  V
^ 8  d.   Sf   \        ^VR,          V
,
          4      VR&   M\        R4      h\	        V4      V8w  d&   VR;;,          V\	        V4      ,
          ,          uu&   \        ;QJ d    R V 4       F  '       g   K   R	M	  R
M! R V 4       4      '       d   \        R4      hSeL   \        ;QJ d    V3R lV 4       F  '       g   K   R	M	  R
M! V3R lV 4       4      '       d   \        R4      hV# u upi )u1   לא נמצאו זמני שקפים לחישוב.u6   משך יעד לא תקין לסנכרון שקפים.c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r   r   xs   & r   r   ?calculate_scaled_slide_durations_ms_with_min.<locals>.<genexpr>  s     61A   u:   סך זמני השקפים הנוכחי אינו תקין.i  u+   רצפת זמן שקף אינה תקינה.uS   משך היעד קצר מדי ביחס לרצפת זמן השקפים שנבחרה.u_   לא ניתן להגיע למשך היעד בלי לרדת מתחת לרצפת זמן השקף.c              3   >   "   T F  p\        V4      ^ 8*  x  K  	  R# 5ir   Nr  r  s   & r   r   r    s     
.13q6Q;s   TFu=   חישוב זמני השקפים יצר ערך לא תקין.c           	   3   v   <"   T F.  p\        V4      \        \        \        S4      4      4      8  x  K0  	  R # 5ir   )r   rf  rg  )r   r  minimum_per_slide_mss   & r   r   r    s-     /xjwefAU5I]C^=_9`0`jws   69uY   חישוב זמני השקפים ירד מתחת לרצפת זמן השקף שנבחרה.)

ValueErrorr   rf  rg  sumr,  r>  r=  minany)r  r  r  current_totalcountminimumscaler  new_durationsdiff	remainingiroomtakes   &&f           r   r  r    sz   LMM%o 678O!QRR666MUVVE#)T\9$s3[^_`bg[hHh?ieE"6789a<JKKW_,rsseM22EGTU}!S#eCFUN&;"<=}MUS//DaxbT!	E	s=)A-r26Aq-*W45Dqyt'D$IA~ 7 q=#+$'=+<y+H$Ib!   "C  D  D
=_,b_s=/AAA
s
.
.sss
.
...XYY'CC/xjw/xCCC/xjw/x,x,xtuu5 Vs   7K(c            
      >   \         P                  P                  \        R ,          \        R,          4      p \         P                  P                  V 4      '       g   \        V 4      h\        V 4      p\        P                  ! RV\        P                  R7      pV'       g   \        R4      hVP                  ^4      p\        P                  ! RV4       Uu. uF  p\        VP                  ^4      4      NK  	  ppV'       g   \        R4      hRV RVR	VR
VRV/# u upi )r'   rL   zconst\s+SLIDES\s*=\s*(\[.*?\]);rU  uW   לא נמצא מערך SLIDES במצגת יפן. אסור לנחש זמני שקפים.z"duration"\s*:\s*(\d+)uI   לא נמצאו ערכי duration במערך SLIDES של מצגת יפן.r   htmlmatchblock	durations)r   r   r   r  JAPAN_PRESENTATION_FILESr   r  r  researchSr  groupfinditerr   )r   r	  r
  r  mr  s         r   'get_japan_experience_slide_durations_msr  $  s    77<<(*BCU*VWD77>>$%%t$DII8$bddKErssKKNE.0kk:SUZ.[\.[S_.[M\deeD&$Ubcc ]s   #Dc           !      j  aa \        4       pVR ,          pVR,          pVR,          pVR,          p\        \        \        V 4      R,          4      4      p	Vf   RM#\        \        \        V4      R,          4      4      p
\	        WV
4      oR^ /oVV3R lp\
        P                  ! RW4      pSR,          \        S4      8w  d   \        R	4      hR
pVe   R\        V4      R R2pR
pVe   R\        V4      R R2pRV RV R\        V 4      R R\        S4       R\        V4      R,          R R\        S4      R,          R RV 2pVRVP                  ^4       V,           WVP                  ^4      R ,           pRV9   d#   \
        P                  ! RVR,           V^R7      pMRV9   d#   \
        P                  ! RVR,           V^R7      pMRV9   d#   \
        P                  ! RVR,           V^R7      pMbRV9   d#   \
        P                  ! RVR,           V^R7      pM9VRVP                  4        V,           R,           VVP                  4       R ,           pVV8X  d   \        R 4      h\        VR!,          VR"4      p\        4       pVP                  R4      ;'       g    . p\        V4      \        S4      8w  g   \        V4      \        S4      8w  d   \        R#4      hR$R%R!VR!,          R&TR'\        VR!,          4      R(\        S4      R)\        V4      R*,          R+\        S4      R*,          R,\        V 4      R-Vf   RM
\        V4      R.Vf   RM
\        V4      R/\        S4      R*,          \        ^\        S4      4      ,          R0VR1R2\        S4       R3\!        \        S4      R*,          4       R42/# )5r	  r
  r  r    Nri  c                 r   < SR ,          pSR ;;,          ^,          uu&   R\        SV,          4      ,           # )ri  z"duration":r   )r  r  indexr  s   & r   replace_durationOsync_japan_experience_presentation_to_target_duration.<locals>.replace_duration>  s/    'Ng!s=#3444r   z"duration"\s*:\s*\d+uT   מספר ערכי duration שהוחלפו אינו תואם למספר השקפים.r   z source song: .6fzs;z min slide: .3fzF// TripServer music sync v34.20 confirm: japan-experience.html; mode: ;z target total: zs; slides: z; old total: zs; new total: z>// TripServer music sync v34.20 confirm: japan-experience.htmlzH// TripServer music sync v34\.20 confirm: japan-experience\.html[^\n]*\nru  r  z;// TripServer music sync v34.19 safe: japan-experience.htmlzE// TripServer music sync v34\.19 safe: japan-experience\.html[^\n]*\nz6// TripServer music sync v34.14: japan-experience.htmlz@// TripServer music sync v34\.14: japan-experience\.html[^\n]*\nz// TripServer music sync:z!// TripServer music sync:[^\n]*\nu6   לא בוצע שינוי בפועל במצגת יפן.r   JAPAN_presentation_music_syncum   אימות לאחר כתיבה נכשל: זמני השקפים בקובץ אינם תואמים לחישוב.r  TrD   r  slidesold_total_secondsg     @@new_total_secondsrw  source_duration_secondsmin_slide_secondsaverage_slide_seconds	sync_moder   u   מצגת יפן עודכנה: u    שקפים, סך חדש r(  )r  r   rf  rg  r  r  subr,  r  r  startendr  r   r  r>  rn  )rw  r'  r$  minimum_per_slide_secondsr   r	  r
  r  r  r  min_msr  	new_blocksource_text
floor_textr  new_htmlr  verifyverify_durationsr  r  s   &&&&                @@r   5sync_japan_experience_presentation_to_target_durationr3  3  s   24D<DMEME%M%&6 7$ >?@O.6TCeLeFfimFm@n<oF@aghMaLE5
 .0@HIW~]++oppK*&u-D'Ec&J"MJ ,#E*C$DS#IL

PQZP[[\-u-='>s&C;sS`OaNb c=)$.s3>#mBTUYBYZ]A^^`ak`l	n 

 OU[[^$y04		!3FFHG8S66eglosgsu}  FG  H	F(	R66bdilpdprz  CD  E	AX	M66]_dgk_kmu}~	$	066>h^_`NU[[]+e3d:Xekkmn=UU4QRR9$v,RqrK46Fzz+.44"
M 22c:J6KsS`Oa6a  I  J  	JdV++d6l+#m$S/&8S/&8E"23!+B+J4PUVmPn%>%FTERkLl#m"4v"=QMHZA[![Y3C4F3GG`aops  uB  qC  DJ  qJ  bK  aL  LM  N r   c                b    \        V RV RR7      pR\        V 4       R\        V 4      R R2VR&   V# )	u   Synchronize japan-experience.html exactly to the uploaded song duration.

v34.20 keeps this exact-sync behavior only after the user explicitly approves it
or when the measured average slide time is already inside the safe 5–10 second range.
matched_music_lengthNr'  r$  r+  u8   מצגת יפן סונכרנה לפי שיר באורך  (r      שניות).r   )r3  rn  rg  )rw  results   & r   4sync_japan_experience_presentation_to_music_durationr:  t  sh     C( 0"&	F SSabrSsRttvw|  ~N  xO  PS  wT  Ta  bF9Mr   c                V
   \        RV 4      ;'       g    T pVR8X  d   RpRpRpMVR8X  d   RpRpR	pM\        R
4      h\        V4      p\        P                  ! V4      '       d   V^ 8:  d   \        R4      hVR p. pRK EF  p	\
        P                  V	4      p
V
'       g   K#  \        P                  P                  \        V	4      V
4      p\        P                  P                  V4      '       g   Ks  \        V4      p\        P                  ! R\        P                  ! V4      ,           R,           4      pVP!                  V4      pV'       g   \        RV RV
 R24      h\        VP#                  ^4      4      pVP%                  RV,           R,           V^R7      pVR8X  d    \        P$                  ! RRV R2V^R7      pM\        P$                  ! RRV R2V^R7      pRV RV RV R2p\        P                  ! R\        P                  ! V4      ,           R,           4      pVP!                  V4      '       d   VP%                  VR ,           V^R7      pMVVP!                  V4      pV'       d   VP'                  4       MVP'                  4       pVR!V V,           R ,           VVR! ,           pVV8X  d   \        R"V
 R#24      hV	R8X  d   R$MR%p\)        VV4      w  pppVP+                  R&V	R'VR(V
R)VR*VR+VR,VR-VR.\-        V4      /	4       EK  	  V'       g   \/        R/4      h. p. p V F4  p\1        VR),          VR+,          R04      pVVR1&   VP+                  V4       K6  	  V F  p\3        VR',          4      pVP+                  / R2R3bR)VR),          bR1VP                  R14      bR4\5        VR),          4      bR5VbR&VR&,          bR(VR(,          bR6VbR7VbR8VbR,VR,,          bR9VbR:VbR;VR.,          bR<VR-,          P6                  bR=VR(,           R>V R?VR,,          R R@V R2b4       K  	  R2R3R6TRFTR8TR:TRGTR=T RH\E        T4       RTRI RJ2/#   \8         d    \;        T4       F  p TR),          RA,           p\=        TRBRCRDRE7      ;_uu_ 4       pTP?                  TR*,          4       R!R!R!4       M  + '       g   i     M; i\        P@                  ! TTR),          4       K    \8         d     K  i ; i	  T F(  p \C        TR',          4       K    \8         d     K&  i ; i	  h i ; i)La4  Synchronize one USA song part transactionally across phone and TV.

The two-part music structure remains unchanged:
- PART_1_SECONDS controls slides 1-23.
- PART_2_SECONDS controls slides 24-44.

Before either presentation is changed, the prospective timeline is calculated with
all currently installed videos. Videos keep their full duration and image slides
receive the remaining song time equally. If the new song is too short, nothing is
written. If a later write/verification step fails, every changed presentation is
restored to its exact previous contents.
r(   rx   PART_1_SECONDSu   ארה״ב חלק 1u   שקפים 1–23rW   PART_2_SECONDSu   ארה״ב חלק 2u   שקפים 24–44u6   סוג שיר ארה״ב לא מוכר לסנכרון.u6   משך שיר לא תקין לסנכרון ארה״ב.r  rP   z	(const\s+z#\s*=\s*)([0-9]+(?:\.[0-9]+)?)(\s*;)u   לא נמצא u
    בתוך u&   . אסור לנחש זמני מצגת.z\g<1>z\g<3>r  u   //\s*שקפים\s*1-23:[^\n]*u(   // שקפים 1-23: usa-roadtrip-theme,     שניות.u   //\s*שקפים\s*24-44:[^\n]*u&   // שקפים 24-44: usa-part2-theme, z!// TripServer music sync v34.33: r7  u(   ) סונכרן לפי שיר באורך z-// TripServer music sync v(?:34\.14|34\.33): z[^\n]*\nru  Nu(   לא בוצע שינוי בפועל ב־r(  rj   r_   rg   r  r5  r   old_htmlr0  old_secondsprospective_timelineprospective_video_countuo   לא נמצאה מצגת ארה״ב לסנכרון: usa2027-presentation.html או usa2027-presentation-tv.htmlUSA_presentation_music_syncrD   r  Tr  media_timeline_refreshpart
const_nameru   new_secondsrw  video_counttimeline_total_secondsr   : u    עודכן מ־u    ל־z.music_sync_rollback.tmpr   r   r   r  r`   r  u'    סונכרן לפי שיר באורך r  r8  )rN   rP   )#r  r  rg  mathisfiniteUSA_PRESENTATION_FILESr   r   r   r   r  r   r  r  compiler   r  r  r(  r)  calculate_usa_timeline_for_htmlr  r,  r  r  %refresh_usa_media_after_timing_changer  total_secondsr   reversedr   r  r   write_usa_media_metadatarn  ) r  rw  keyrF  r`   ru   rl  seconds_textrI  rg   r5  r   r	  patternr
  	old_valuer0  r  same_part_stamprefreshed_match	insert_atr  prospective_inforA  prospective_videoswrittenr  r  r  media_refreshr   r   s    &&                              r   ,sync_usa_presentation_part_to_music_durationr_    s     y
1
>
>YC
%
%#	!	!%
%$QRR$%G==!!W\QRRc]LJ H)--.>?ww||;<LMxXww~~d##"4(**\BIIj,AADjjkt$~j\H:Mstuu%++a.)	;;x,6A4q;Q))vv>Bjkwjx  yE  AF  HP  XY  ZHvv?Cijviw  xD  BE  GO  WX  YH3E7"UGCklxky  zF  G**%UXZXaXabgXh%hkv%vw!!(++&**54<*KH &nnX6O3B--/I
+e3d:Xij=QQHtGzQRSTT!15J!JPWEdesu}E~B.0B 0nD9"$8%s+='>

 
	A HX   !R  S  	S GG)DA$v,PTU_P`b  AK(DNNN4  
 DA$GWBXYMNN dV $((8, +d6l3	
 )- #D);$< D,  j  tM2 w #G t$=> )$/E*F*T*T  d:./r*=MdS`NabeMffklxky  zF  G!  L 	dG7eWCNSZD[C\\^_fgj^kkxy #  W%D6l%??#sWbAARHHT*-. BAAA

3V-  & D(.>)?@  
 	sm   'DQ T(('S$R1	(	S$1S<&S$"T($S3/T(2S33
T(>TT(T!T( T!!T(c           
     r   . p. p\        V \        4      '       g
   RRRVRR./# V P                  R4      ;'       g    . pV EF.  p\        V\        4      '       d   VP                  R4      '       g   K3  VP                  R4      pVP                  R4      p V'       d   \        P                  P                  V4      '       dZ   \        V4       VR	,           p\        P                  ! Wg4       \        P                  ! Wu4       VP                  RVR
VRR/4       K  \        P                  P                  V4      '       d   \        P                  ! V4       VP                  RVR
RRR/4       EK1  	  RV'       * RVRV/#   \         d+   pTP                  RTR\        T4      /4        Rp?EKp  Rp?ii ; i)zIRestore every audio target from its pre-upload backup after sync failure.r  Frestoredfailedu   save_result לא תקיןr  r   rD   z.audio_rollback.tmpfromactionrestored_backupr   removed_new_filerp  N)r   r   r   r   r   isfiler  rF  r  r   r  r   r  r   r~  )	r  ra  rb  r  r  r   rD   r   r  s	   &        r   rollback_saved_audio_uploadrh    sf   HFk4((eZ8>Y=Z[[ooi(..BG$%%TXXf-=-=xx(#	>"''..00!$'22V)

3%vvxIZ [\77>>$''IIdOvr8EW XY $ f*j(HfEE  	>MM64$s)<==	>s1   F$FAF$F-FF6F11F6c                    \        W4      p\        P                  T;'       g    R / 4      p\        V4      p\	        V4      pR\
        P                  ! R4      RT ;'       g    R P                  4       RTRT;'       g    R RVP                  RR 4      RVP                  RR 4      RVP                  RR 4      R	TR
T;'       g    R RRRRRR RRRR/pV'       d&   \        P                  P                  V4      '       g   RVR&   V'       d   \        W74       V# \        V4      pVP                  RR 4      VR&   VP                  R4      '       Ed   RVR&   VP                  R4      VR&   VP                  R4      VR&    Rp	T ;'       g    R P                  4       R8X  d(   VR8X  d!   \        VP                  R4      4      p	RVR&   MqT ;'       g    R P                  4       R8X  d(   VR+9   d!   \        W8P                  R4      4      p	RVR&   M+T ;'       g    R P                  4       R8X  d   VR8X  d   RVR&   V	'       d   RVR&   \        V	\         4      '       dB   V	P                  R4      '       d+   V	P                  R4      VR &   V	P                  R!R 4      VR"&   MkV	.VR &   \        V	\         4      '       d   V	P                  R!R 4      MR VR"&   M7VP                  R4      ;'       g    VP                  R)4      ;'       g    R*VR&   V'       d   \        W74       V#   \"         d   p
RTR&   \%        T
4      TR#&   T ;'       g    R P                  4       R8X  dX   \'        T4      pYR$&   \)        TP                  R4      4      TR%&   TP                  R4      '       d   R&TR&    Rp
?
LR'TR&    Rp
?
LR(TR&    Rp
?
LRp
?
ii ; i),r   	timestampr   rr   r  r  r`   ru   rs   pathsprimary_pathduration_okFrw  Nrx  sync_performed	sync_noteu   v34.14: העלאת שיר קיימת מודדת את האורך ומסנכרנת את המצגת/המקטע הרלוונטיים כאשר כלל הסנכרון פעיל.uV   קובץ השיר נשמר אך לא נמצא נתיב קובץ למדידת אורך.rp  rN  r  Tr'   rl   uq   בוצע סנכרון בפועל: כל שקפי מצגת יפן סונכרנו לפי אורך השיר החדש.r(   u   בוצע סנכרון בפועל: מקטע השיר הרלוונטי עודכן גם במצגת ארה״ב הרגילה וגם במצגת TV כאשר הקבצים קיימים.ro   u   מוזיקת פתיח הטיסה נשמרה ונמדדה. לא שונה japan-experience.html כי פתיח הטיסה הוא מקטע נפרד.r  sync_resultsr   sync_summary
sync_erroraudio_rollbackaudio_rollback_performedu   סנכרון המצגת נכשל ולכן קובצי המוזיקה החדשים בוטלו ושוחזרו אוטומטית לגרסה הקודמת.u   סנכרון המצגת נכשל. בוצע ניסיון שחזור מוזיקה, אך לפחות יעד אחד דורש בדיקה ידנית.uu   השיר נשמר ונמדד, אך סנכרון המצגת נכשל. אין אישור שהמצגת מסונכרנת.r.  u1   ffprobe לא הצליח לזהות משך שיר.>   rx   rW   )r  r  r   r  r  r   r   r  r   r   r   r  r  r:  r_  r   r   r   r~  rh  bool)rr   r  r  r  ruler   rk  r  probesync_resultsync_excrollbacks   &&&         r   'register_existing_music_upload_durationr{  '  s   $T5H(,,X^^R@D#K0D!+.ET]]#67""$YHNN'2&'2&4

uDB%  AF  rww~~d++rw28D(.E		)R0F9yy $}%*YY/A%B!"%*YY/A%B!"	^K

!!#w.9@X3XRSXS\S\]oSpq 'Z{#**"##%.8?e3eJ8U^U^_qUrs 'Y{#**"##%0YBV5V 'y{#+/'(k400[__Y5O5O-8__Y-GF>*-8__Y-KF>*.9]F>*OYZegkOlOl[__Y-KrtF>*  ))G,ww		%0@wwDww.x@M#  	^',F#$#'>F< 

!!#u,6{C+3'(59(,,t:L5M12<<%% +AF;' +{F;' '^{#	^sK   =
L AL AL )L >1L 0)L 3L N=%A:N8$N8.N88N=c                 	   \        V \        4      '       g   R # R.pV P                  R4      '       d$   VP                  RV P                  R4       24       V P                  R4      '       d$   VP                  RV P                  R4       24       V P                  R4      '       Ed   TP                  RV P                  R4       R	\	        V P                  R
4      ;'       g    ^ 4      R R24       V P                  R4      '       Ed   TP                  RV P                  R4      ;'       g    R R24       V P                  R4      ;'       g    .  EFV  p\        V\        4      '       g   K  VP                  RVP                  RR 4       24       VP                  R4      '       dx   TP                  RVP                  RR 4       RVP                  R4       R\	        VP                  R4      ;'       g    VP                  R
4      ;'       g    ^ 4      R R24       MKTP                  RVP                  RR 4       R\	        VP                  R4      ;'       g    ^ 4      R R24       VP                  R4      '       g   EK3  VP                  RVP                  R4       24       EKY  	  EM1V P                  R4      '       d   VP                  R 4       VP                  R!V P                  R4       24       V P                  R"4      '       d   VP                  R#4       MV P                  R$4      '       dI   VP                  R%4       VP                  \
        P                  ! V P                  R$4      R&^R'7      4       M]VP                  R(4       MKVP                  R)4       V P                  R*4      '       d$   VP                  R+V P                  R*4       24       V P                  R,4      '       d$   VP                  R-V P                  R,4       24       V P                  R.4      '       d$   VP                  R/V P                  R.4       24       VP                  R0\        ,           4       R1P                  V4      # )2r   u   סטטוס אורך שיר:r`      שיר/מקטע: ru   u"   תחום סנכרון עתידי: rm  u   משך שזוהה: rx  r7  rw  r      שניות)rn  u6   סנכרון שקפים: בוצע בפועל עבור 
   המצגתr(  rp  u
   מצגת: r   rF  u
   מקטע: u    | קבוע שעודכן: u    | סך חדש: rG      שניותu   שקפים: r!  r#  rD   u   גיבוי מצגת קודם: rr  u"   סנכרון שקפים: נכשל.u   שגיאת סנכרון: rt  u`   שחזור מוזיקה: בוצע בהצלחה; קובצי השיר הקודמים הוחזרו.rs  ud   שחזור מוזיקה: לא הושלם במלואו; יש לבדוק את פירוט השחזור.Fr   u7   סנכרון שקפים: לא בוצע בשלב הזה.un   אזהרה: השיר נשמר, אבל לא זוהה משך תקין ולכן אין אישור לסנכרון.rp  u   שגיאה: rN  z	ffprobe: rl  u   נתיב שנבדק: u   קובץ סטטוס: ru  )	r   r   r   r  rg  r   dumpsr  r   )r  linesr  s   &  r   music_upload_duration_detailsr  m  s<   fd##*+Ezz'(G)<(=>?zz'9&**W:M9NOPzz-  *6::6H+I*J"USYS]S]^pSqSvSvuvMwx{L|  }I  J  	K::&''LLQRXR\R\]dReRuRuiuQvvwxy

>288b8dD))LL:dhhvb.A-B!CDxx--z$((722F1GGabfbjbjkwbxay  zJ  KP  QU  QY  QY  Zg  Qh  QM  QM  lp  lt  lt  uG  lH  QM  QM  LM  KN  OR  JS  S^  &_  `|DHHXb4I3JJZ[`aeaiaij}a~  bD  bD  CD  \E  FI  [J  JU  &V  Wxx))'EdhhxFXEY%Z[ 9 ZZ%%LL=>LL4VZZ5M4NOPzz455  A,--  D  ETZZ

3C(DSXabcdLLRS  F  	G::gLL<

7(;'<=>zz)yI!6 789zz.!!,VZZ-G,HIJ	LL(+PPQ99Ur   c                  D   \        4       p . p\        P                  4        EFk  w  r#\        V \        4      '       d   V P                  V4      MR p\        V\        4      '       Ed   VP                  R4      '       Ed   VP                  R4      '       Ed;   VP                  R4      '       d   R\        P                  ! \        VP                  R4      ;'       g    R4      4       R2pR\        P                  ! \        VP                  R	4      ;'       g    VP                  R	4      ;'       g    R
4      4       R2pMVP                  R4      '       d<   Rp\        P                  ! \        VP                  R4      ;'       g    R4      4      pMyR\        P                  ! \        VP                  R4      ;'       g    R4      4       R2pRpM:Rp\        P                  ! \        VP                  R4      ;'       g    R4      4      p\        P                  ! \        VP                  R4      ;'       g    R4      4      pMRpRpRpVP                  R\        P                  ! VP                  R	R4      4       RV RV RV R2	4       EKn  	  RP                  V4      # )Nrj  rm  rn  u'   <span class='badge safe'>סונכרן: rx  r   </span>u<   משך זוהה וסנכרון בוצע בפועל עבור r`   r  r(  rr  u?   <span class='badge warn'>נמדד, סנכרון נכשל</span>u   שגיאת סנכרוןu#   <span class='badge safe'>נמדד: uB   משך זוהה. עדיין לא בוצע סנכרון שקפים.u5   <span class='badge warn'>שגיאת מדידה</span>rp  u   לא זוהה משךu>   <span class='badge warn'>אין העלאה אחרונה</span>u6   טרם נרשם סטטוס העלאה לשיר הזה.   —z<tr><td><b></b></td><td>	</td><td>
</td></tr>)r  r  itemsr   r   r   r   r   r   r  r   )r   rowsrT  rv  stbadgedetailrj  s           r   render_music_upload_status_rowsr    sz   02DD288:	(t44TXXc]$b$BFF;$7$7vvm$$66*++EhooVYZ\Z`Z`asZtZzZzxzV{F|E}  ~E  FE[\d\k\kloprpvpvw~p  qe  qe  DH  DL  DL  MT  DU  qe  qe  Ye  mf  ]g  \h  hi  jFVVL))]E%__S1E1b1bIb-cdFA(//RUVXV\V\]oVpVvVvtvRwBxAy  zA  BEaFO!RVVG_-V-V@V)WX BFF;,?,E,E2(FGITEMFIk(//$((722F"G!HV[U\\efoeppy  {A  zB  BL  M  	N+ ;, 774=r   c            
          \        4       ;'       g    R p \        4       ;'       g    R pRRR\        V 4      RV R\        V4      RV/p ^ RIpRVR&   V#   \         d
    RTR&    T# i ; i)	r   pillowFrC  ffmpeg_pathrN  ffprobe_pathNT)rK  rO  ru  PILr   )r  r  r  r  s       r   media_engine_statusr    s    (*00bK*,22Lxk):M;Xacghtcu  xF  HT  UF!x M  ! xM!s   	A A'&A'c                     \        V 4      p . ROp\        T 4      pT FA  pTR8  g   Y1R,          8X  d"   TR 8w  d   TR RT 2u # \        T4       R2u # TR,          pKC  	  R#   \         d    \        T 4      u # i ; i)B   .1fr   z BN)r  KBMBGBr  )r   r   r   rg  )numunitsri  units   &   r   format_bytesr    s    #h $E#JE4<49,,0CKeC[$(NE
|2=NN 	  3xs   A% %A>=A>c                 
   \        V4       \        P                  P                  V 4      '       d    \        P                  P	                  V 4      M^ p ^ RIHpHp VP                  V 4      ;_uu_ 4       pVP                  4        RRR4       VP                  V 4      ;_uu_ 4       pVP                  V4      p\        VP                  4      pVP                  R9   g#   VP                  R8X  dc   RVP                  9   dR   VP                  R4      pVP!                  RVP                  R4      p	V	P#                  V4       V	P                  R4      pM"VP                  R8w  d   VP                  R4      pRp
VP                  '       d   \%        VP                  4      M^ p\&        '       d   V\&        8  d   \&        \)        V4      ,          p\%        ^\+        \-        VP                  ^ ,          V,          4      4      4      \%        ^\+        \-        VP                  ^,          V,          4      4      4      3pVP/                  WP0                  P2                  4      pRp
. p\4        ;'       g    RpV F  pV R	V R
2pVP7                  VR\+        V4      RRR7       VP9                  VV\        P                  P	                  V4      34       \        P                  P	                  V4      \:        8:  g   K   M	  V Uu. uF  pV^,          \:        8:  g   K  VNK  	  ppV'       d
   V^ ,          M\=        VR R7      pV F.  w  pppVV^,          8w  g   K   \        P>                  ! V4       K0  	  \        PB                  ! V^,          V4       \        P                  P	                  V4      pRRRV^ ,          RVRVRVR\        VP                  4      RV
R\%        ^ VV,
          4      /uuRRR4       #   + '       g   i     EL{; iu upi   \@         d     K  i ; i  + '       g   i     R# ; i  \D         d    \G        T 4      '       d|   TR
,           p\H        PJ                  ! T T4       \        PB                  ! TT4       \        P                  P	                  T4      pRRRRRTRTRRRRRRR\%        ^ TT,
          4      /u # \M        R4      h\L         d    h \@         d!   p\M        R\O        T4      ,           4      hRp?ii ; i) a  Create a real optimized JPG file; never writes a fake .jpg.

Smart behavior:
- Uses Pillow when installed.
- Applies EXIF orientation.
- Converts alpha/transparency to a white background.
- Downscales only when the long edge is larger than IMAGE_OPTIMIZER_MAX_LONG_EDGE.
- Uses progressive/optimized JPEG and a quality loop to reduce weight without aggressive damage.
- If Pillow is missing, accepts only true JPEG bytes and copies them safely.
)ImageImageOpsNRGBAPtransparencyRGBFTz.qr   JPEG)qualityoptimizeprogressivec                     V ^,          # )    r  s   &r   <lambda>.convert_or_copy_image_to_jpg.<locals>.<lambda>  s    _cde_fr   rT  r  optimized_jpgr  original_size
final_sizeoriginal_dimensionsfinal_dimensionsresizedsaved_bytescopied_real_jpeg_without_pillowsourcer   zmPillow is not installed, so non-JPG images cannot be converted. Install Pillow with: py -m pip install pillowz%Image conversion/compression failed: )r  LA)   r  r  r  )X   T   P   )(r  r   r   r   r  r  r  r  r   r1  exif_transposetupler  r  r  convertnewalpha_compositer>  IMAGE_OPTIMIZER_MAX_LONG_EDGErg  r   rf  resize
ResamplingLANCZOSIMAGE_OPTIMIZER_QUALITIESr  r  IMAGE_OPTIMIZER_TARGET_BYTESr  r  r   r   ImportErrorr:  rF  r  r  r~  )source_pathr  original_namer  r  r  imgr  rgba
backgroundr  max_edger   new_sizetmp_candidates	qualitiesr  tmp_candidater  under_targetchosenr   _sizer  r  r  s   &&&                       r   convert_or_copy_image_to_jpgr    s    k"46GGNN;4O4OBGGOOK0UVMIN'ZZ$$JJL %ZZ$$))#.C"'/xx>)chh#o.TWT\T\B\{{6*"YYvtyy:NO
**40 ((/U"kk%(G(+s388}aH,,<Y1Y5hG3uSXXa[5-@'A#BCSCPUVYV^V^_`VadiViPjLkElmjj+;+;+C+CDN1AA\I$#.-r'$ ?Gtaef%%wrww}?]&^_77??=15QQ % .<g^TtAwJf?fDD^Lg(4\!_#nRf:gF(6$u6!9$		$ )7 JJvay+.5J6!9j%':"E#((O7s1mj&@A	O %$ %$$> h % G %$$b  J{++$v-JLLj1JJz;/5J98j%y"I5s1mj&@A	 	   I  J  	J  N@49LMMNs   !P6 4O7!P6 &C P""P"*CP"-BP"7P"?PP5P"P/A=P",
P6 7P		P6 P"P	P"P	P""P3	-P6 3P6 6BTT!
T,T-TTc                   \        V4       \        P                  P                  V 4      '       d    \        P                  P	                  V 4      M^ pV^ 8:  d   \        R4      hV\        8  d(   \        R\        V4       R\        \        4       24      h\        V 4      p\        4       pV'       Ed   VR,           pVRRRRR	V R
RRR\        R\        V.p\        V^R7      pVP                  ^ 8w  gJ   \        P                  P                  V4      '       d%   \        P                  P	                  V4      ^ 8:  dz    \        P                  P                  V4      '       d   \        P                  ! V4       \        RTP                   ;'       g    TP"                  ;'       g    RR R ,           4      h\        P                  P	                  V4      p	V'       d   V	\%        VR,          4      8  d    \        P                  ! V4       VR,           p
\&        P(                  ! W
4       \        P*                  ! W4       \        P                  P	                  V4      pRRRVRVR\-        ^ W;,
          4      RV/# \        P*                  ! Wa4       \        P                  P	                  V4      pRRRVRVR\-        ^ W;,
          4      RVR\        /# V'       dq   VR,           p
\&        P(                  ! W
4       \        P*                  ! W4       \        P                  P	                  V4      pRRRVRVR\-        ^ W;,
          4      RR/# \        R4      h  \         d     ELi ; i  \         d     ELji ; i)!zStore uploaded audio as a real .mp3 file.

If FFmpeg exists, transcode supported audio/video containers to MP3.
If FFmpeg is missing, accept only files that are already real MP3 bytes, even if their extension is wrong.
u   קובץ האודיו ריק.u'   קובץ האודיו גדול מדי:    . מגבלה: z.ffmpeg.tmp.mp3-y-hide_banner	-loglevelrp  -i-vn-codec:a
libmp3lame-b:a-arrt  z'FFmpeg failed to convert audio to MP3: zunknown errorNg?	.copy.tmpr  )copied_existing_mp3_smaller_than_reencoder  r  r  rC  converted_to_mp3_ffmpegbitratecopied_real_mp3_without_ffmpeg	not_foundzqFFmpeg is not installed, so this audio file cannot be converted to MP3. Install FFmpeg or upload a real MP3 file.P)r  r   r   r   r  r  AUDIO_UPLOAD_MAX_BYTESr  r@  rK  AUDIO_MP3_BITRATEAUDIO_MP3_SAMPLE_RATErb  r{  r  r   rz  ry  r   rF  r  r   r>  )r  r  r  r  source_is_mp3rC  tmp_mp3r_  r^  converted_sizer  r  s   &&&         r   r  r  &  s    k"46GGNN;4O4OBGGOOK0UVM899--B<P]C^B__mnz  |R  oS  nT  U  V  	V&{3M#%Fv 11+%(
 $C5>>QbggnnW&=&=QXAY]^A^77>>'**IIg& F3::KvKvY\YcYcKvKvgvx}x~J  A  B  B1^c-$2F.GG		'" %{2JLL1JJz/5JGZgiu  xB  DQ  SV  WX  Zg  Zt  Su  w  AG  H  H


7(WW__[1
1?MS_akmz|  AB  DQ  D^  }_  ai  kq  s|  ~O  P  	P ;.
[-


:+WW__[1
8/=Zfhr  uB  DG  HI  KX  Ke  Df  hp  r}  ~  	~
  I  J  J9    s*   >$M #M 5M' M$#M$'M65M6audioc           
      X   \         P                  ! \        R R7       \        P                  ! R4      p\        V P                  ;'       g    R4      ;'       g    Rp\         P                  P                  \        RV R\         P                  ! 4        RV 24      pV P                  V4        \        W4      p\        YQV P                  ;'       g    R4      pRVR\         P                  P                  V4      R	\        V4      R
VRV/ \         P                  P                  V4      '       d   \         P                   ! V4       # #   \"         d     # i ; i   \         P                  P                  T4      '       d   \         P                   ! T4       i i   \"         d     i i ; i; i)Tr   r  r  audio_r  r   r   r  r  rD   rS   )r   r   r  r   r   r
   r5  r   r   r  r  r  r  r  r  r   r  r   )r  r  r  r  r  r  r  rS   s   &&&     r   save_audio_upload_to_targetr  g  s\   KK$t4MM/*E 6 6 H H.I[[^Iww||0F5'299;-qQZP[2\]Hx 	*;E,XMDZDZD`D`^`aVRWW__[-I8U`alUmow  zE  GN  PU  V	ww~~h''		(# ( 			ww~~h''		(# ( 		sC   .AE ;EEEF);FF)F&#F)%F&&F)c                 Z   \         P                  ! \        R R7       \        P                  ! R4      p\        V P                  ;'       g    R4      ;'       g    Rp\         P                  P                  \        RV R\         P                  ! 4        RV 24      p\         P                  P                  \        RV R\         P                  ! 4        R24      pV P                  V4        \        YgV P                  ;'       g    R4      p\        V4      p	. p
V F  p\         P                  P                  W4      p\        V4       \        W4      pVR,           p\        P                   ! W~4       \         P"                  ! W4       V
P%                  R	VR
VR\         P                  P'                  V4      R\        V4      RV/4       K  	  R\         P                  P'                  V4      RV	RV
RV/Wg3 FA  p \         P                  P)                  V4      '       d   \         P*                  ! V4       KA  KC  	  #   \,         d     KT  i ; i  Yg3 FS  p \         P                  P)                  T4      '       d   \         P*                  ! T4       KA  KC    \,         d     KQ  i ; i	  i ; i)Tr   r  r  audio_multi_r  r  r   r   r  r   r  r  rD   r  rS   )r   r   r  r   r   r
   r5  r   r   r  r  r  r  r  r  rF  r  r   r  r  r   r  r   )r  base_folder	rel_pathsr  r  r  r  r  rS   r  r  r  r  r  r  r/  s   &&&&            r   %save_audio_upload_to_multiple_targetsr  y  s0   KK$t4MM/*E 6 6 H H.I[[^I2l5'299;-WXYbXc4deJGGLL!5eWAbiik]Zh7ijMz",ZH^H^HdHdbde-(!H'',,{=Kk*.{IK$v-JLL3JJz/NNE8V[&"''//ZeJfhpr}  J  sK  MU  Wb  c  d " 6#yRY[bdij,A77>>!$$IIaL % -  	 ,A77>>!$$IIaL % 	 -sI   ,I C.I :;H<<I
IJ*;JJ*J$	 J*#J$	$J*c                      \         P                  ! \        R R7       \        P                  ! 4       p \         P                  ! \        4       F  p\         P
                  P                  \        V4      p \         P
                  P                  V4      '       dJ   V \         P
                  P                  V4      ,
          \        8  d   \         P                  ! V4       K  K  K  	  R#   \         d     K  i ; i  \         d     R# i ; iTr   N)r   r   PENDING_MUSIC_UPLOAD_DIRr   listdirr   r   rg  getmtimePENDING_MUSIC_MAX_AGE_SECONDSr  r   )nowr   r   s      r   !cleanup_old_pending_music_uploadsr    s    
,t<iikJJ78D77<< 8$?D77>>$''C"''2B2B42H,HKh,hIIdO -i' 9
   s7   A2C; 5A*C)C; )C84C; 7C88C; ;D
	D
c                 0   \        4        \        P                  ! \        R R7       \        P
                  ! 4       P                  p\        P                  ! R4      p\        V P                  ;'       g    R4      ;'       g    Rp\        P                  P                  \        V RV RV 24      p\        P                  P                  \        V R24      p\        P                  P                  \        V R24      pV P                  V4        \        YgV P                  ;'       g    R4      p	RTR	\        P                  ! R
4      R\        P                  ! 4       RT;'       g    RP                  4       RTRV P                  ;'       g    RRVR\        P                  P!                  V4      R\#        V4      RV	/
p
\%        VRRR7      ;_uu_ 4       p\&        P(                  ! WR^R7       RRR4       T
 \        P                  P+                  V4      '       d   \        P,                  ! V4       # #   + '       g   i     LO; i  \.         d     # i ; i  \.         d]    Yx3 FS  p \        P                  P+                  T4      '       d   \        P,                  ! T4       KA  KC    \.         d     KQ  i ; i	  h i ; i   \        P                  P+                  T4      '       d   \        P,                  ! T4       i i   \.         d     i i ; i; i)Tr   r  r  r  r8   r    r   token
created_atr   created_epochrr   r  r  pending_pathr  r  rS   r   r   r   Fr   N)r  r   r   r  uuiduuid4hexr   r   r
   r5  r   r   r  r  r  r  r  r   r   r   r   r  r   )r  rr   r  r  r  r  r  pending_mp3	meta_pathrS   metar  r/  s   &&&          r   save_pending_audio_uploadr    s_   %'KK(48JJLEMM/*E 6 6 H H.I[[^I65'5'9+8VWJ'',,7E7$HK5%GIz",ZmF\F\FbFb`bcU$--(;<TYY[TZZR&&(]3399rKBGGOOK0k+.U
 )S733qIIdE!< 4	ww~~j))		*% * 43  		  )A77>>!$$IIaL % 	 * 		ww~~j))		*% * 		s   AI (%I AI H70	I :;I
7I	I 
IIK-;J,(K,J;7K:J;;KK L;LLLLLLc                    T ;'       g    R P                  4       p \        P                  ! RV 4      '       g   \        R4      h\        P
                  P                  \        V  R24      p\        P
                  P                  V4      '       g   \        R4      h\        VRRR7      ;_uu_ 4       p\        P                  ! V4      pRRR4       \        X\        4      '       d   VP                  R	4      V 8w  d   \        R
4      hVP                  R4      ;'       g(    \        P
                  P                  \        V  R24      p\        P
                  P                  V4      '       g   \        R4      h\         P                   ! 4       \#        VP                  R4      ;'       g    ^ 4      ,
          \$        8  d   \'        V 4       \        R4      hWCR&   V#   + '       g   i     EL; i)r   [0-9a-fA-F]{32}u1   אסימון העלאה זמנית לא תקין.r    uo   העלאת השיר הזמנית לא נמצאה. ייתכן שפג תוקפה או שהיא כבר טופלה.r   r   r   Nr  u5   קובץ ההעלאה הזמנית אינו תקין.r  r8   u+   קובץ השיר הזמני לא נמצא.r  uP   פג תוקף העלאת השיר הזמנית. העלה את השיר מחדש.)r   r  	fullmatchr  r   r   r   r  r   r  r   r   r   r   r   r   r   rg  r  discard_pending_music_upload)r  r  r  r  r  s   &    r   read_pending_music_uploadr    si   [[b!E<<*E22LMM5%GI77>>)$$  !R  S  	S	iw	/	/1yy| 
0dD!!TXXg%6%%?PQQ88N+eerww||<TY^X__cVd/eL77>>,'' MNNyy{U488O499::=ZZ$U+ rss'K 
0	/	/s   0GG*	c                 ~   T ;'       g    R P                  4       p \        P                  ! RV 4      '       g   R# R Fk  p\        P                  P                  \        W,           4      p \        P                  P                  V4      '       d   \        P                  ! V4       Kk  Km  	  R#   \         d     K  i ; i)r   r  N)r8   r    )
r   r  r  r   r   r   r  r   r  r   )r  suffixr   s   &  r   r  r    s    [[b!E<<*E22#ww||4enE	ww~~d##		$ $ $
  		s   *;B--B<;B<c                    V P                  R 4      pV'       d&   \        P                  P                  V4      '       g   \	        R4      h\        V4      p\        P                  P                  V4      p. pV F  p\        P                  P                  W4      p	\        V	4       \        W4      p
V	R,           p\        P                  ! WK4       \        P                  ! W4       VP                  RVRV	R\        P                  P                  V	4      R\        V	4      RV
/4       K  	  RVRVRVR	V P                  R	4      R
V P                  R4      /# )r  uX   קובץ השיר הזמני לא נמצא ולכן לא ניתן להטמיע אותו.r   r  r   r  r  rD   r  rS   pending_tokenr  )r   r   r   r   r  r  r  r   r  r  rF  r  r   r  )pending_metar  r  r  r  r  r  r  r  r  r  r  s   &&&&        r   (commit_pending_audio_to_multiple_targetsr    s@   ##N3Lrww~~l;; z{{
l
#C77??<(DGggll;9+&*;E 6)
\.


:+xfbggooVaFbdlny  {F  oG  IQ  S^  _  	`  D(CGWlFVFVW^F_apr~  sC  sC  DK  sL  M  Mr   c                 N   \        R V 4      p\        P                  T;'       g    R/ 4      p/ R\        P                  ! R4      bRR bRV bRT;'       g    RbRVP                  RR4      bRVP                  RR4      bR	VP                  R	R4      bR
\        V4      bR\        V4      ;'       g    RbR\        T;'       d    VP                  R4      4      bRT;'       g    / P                  R4      bRT;'       g    / P                  RR4      bRT;'       g    / P                  RR4      bR\        V4      bRVbRVbp	V'       d4   V.V	R&   \        V\        4      '       d   VP                  RR4      MRV	R&   V'       d   \        V4      V	R&   V'       d   \        Wy4       V	# )r'   r   rj  r   rr   r  r  r`   ru   rs   rk  rl  rm  r  rw  rx  rN  rn  ro  approval_actionrp  r   rq  rr  )r  r  r   r   r   r  r  ru  r   r   r~  r  )
r  r  rw  rx  ro  rr  r  r  rv  r  s
   &&&&&&&   r   !build_japan_music_duration_statusr    s   $Wi8H(,,X^^R@DT]]#67 	Y 	HNN	
 	'2& 	'2& 	4 	&{3 	0=CC 	tE55eiio6 	U[[b--.@A 	U[[b--.@"E 	EKKR$$Y3 	${+ 	Y  	?!F$ "-~CMk[_C`C`B!?fh~#J/|.x@Mr   c                    \        4       p\        VP                  R 4      ;'       g    . 4      pV^ 8:  d   \        R4      h\	        V 4      pV\	        V4      ,          pV\
        ,          pV\        ,          pV\
        8  d   RpMV\        8  d   RpMRpRVRVRVR\        V4      R	VR
VRVRVRVP                  RR4      /	# )r  u-   לא נמצאו שקפים במצגת יפן.	too_shorttoo_longr  r   slide_countsong_secondssong_displayr&  minimum_total_secondsmaximum_total_secondsloop_total_secondspresentation_pathr   r   )r  r,  r   r  rg  &JAPAN_EXPERIENCE_MIN_AVG_SLIDE_SECONDS&JAPAN_EXPERIENCE_MAX_AVG_SLIDE_SECONDSrn  )rw  r   r!  durationaverage	min_total	max_totalr   s   &       r   japan_experience_music_analysisr.  #  s    24Ddhh{+11r2KaHII%&H{++GDDIDDI77	9	9{x0iTXXfb1
 
r   c                 *   VP                  R 4      p\        VP                  R4      ;'       g    ^ 4      p\        VP                  R4      ;'       g    ^ 4      p\        P                  ! \        VP                  R4      ;'       g    R4      4      p\        P                  ! \        VP                  R4      ;'       g    R4      4      p\        P                  ! \        VP                  R4      ;'       g    ^ 4      4      p	\        P                  ! V 4      p
VR8X  d-   RpR	pR
V RV RVR R\        R R2	pRV
 RV
 RV
 R2pRV	 R2pM:VR8X  d&   RpRpR
V RV RVR R\        R R2	pRV
 RV
 R2pRpM\        RRRR7      # R \        P                  ! V4       R!\        P                  ! V4       R"\        P                  ! V4       R#\        P                  ! V4       R$T;'       g    R% R&V R'V R(VR R)\        P                  ! V4       R*V R+2# ),r   r&  r!  r#  r   r  r&  r  u0   נדרש אישור לפני הטמעת השירuC   אזהרה: השיר קצר מדי ביחס למספר השקפיםu   השיר שזוהה באורך u   . במצגת יש u:    שקפים, ולכן זמן ממוצע לשקף יהיה .2fu:    שניות — פחות מהמינימום שהוגדר: z.0fu    שניות לשקף.z>
        <form action="/confirm_japan_experience_music_upload/u   " method="post"><input type="hidden" name="action" value="loop_min_5"><button class="primary">הטמע את השיר בלופ ושמור לפחות 5 שניות לכל שקף</button></form>
        <form action="/confirm_japan_experience_music_upload/u   " method="post"><input type="hidden" name="action" value="accept_as_is"><button class="warn">הטמע בכל זאת וסנכרן לפי אורך השיר המקורי</button></form>
        <form action="/confirm_japan_experience_music_upload/u   " method="post"><input type="hidden" name="action" value="cancel"><button class="danger">אל תטמיע את השיר הזה</button></form>
        u3   בחירת הלופ תאריך את המצגת ל־u~    לפחות. קובץ האודיו עצמו יישמר, ותגית ה־audio במצגת תמשיך לנגן אותו בלופ.r   uE   אזהרה: השיר ארוך מדי ביחס למספר השקפיםu6    שניות — מעל המקסימום שהוגדר: u   " method="post"><input type="hidden" name="action" value="accept_as_is"><button class="warn">הטמע בכל זאת וסנכרן לפי אורך השיר</button></form>
        <form action="/confirm_japan_experience_music_upload/u   במצב הזה אין אפשרות לופ, כי הבעיה אינה שיר קצר אלא שיר ארוך מדי ביחס למצגת.u   אין צורך באישורuN   משך השיר נמצא בטווח התקין. העלה שוב אם נדרש.Tr  z
<!DOCTYPE html>
<html lang="he" dir="rtl"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>a(  </title>
<style>
body{margin:0;font-family:Arial,'Segoe UI',sans-serif;background:linear-gradient(180deg,#0f172a,#020617);color:white;min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px}
.card{width:min(820px,94vw);background:#111827;border:1px solid #334155;border-radius:28px;padding:26px;box-shadow:0 24px 90px rgba(0,0,0,.45)}
.badge{display:inline-flex;background:#7c2d12;color:#fed7aa;border:1px solid #fb923c;border-radius:999px;padding:8px 14px;font-weight:900;margin-bottom:12px}
h1{margin:0 0 12px;font-size:clamp(28px,5vw,42px)}
p{color:#e5e7eb;line-height:1.7;font-size:17px}
.meta{background:#020617;border:1px solid #334155;border-radius:18px;padding:14px;margin:14px 0;color:#bfdbfe;line-height:1.7}
.actions{display:grid;gap:10px;margin-top:16px}
button,a{border:0;border-radius:14px;padding:14px 16px;color:white;font-weight:950;cursor:pointer;text-decoration:none;font-size:16px;width:100%}
.primary{background:#16a34a}.warn{background:#ca8a04}.danger{background:#dc2626}.back{display:inline-flex;width:auto;background:#334155;margin-top:12px}
form{margin:0}
.usa-image-target-panel{display:none;margin-top:16px}.usa-image-target-panel.active{display:block}.image-target-choice .sub-card{border-color:rgba(96,165,250,.28)}.tool-head.compact{margin-top:10px;padding-top:4px}.tool-head.compact h3{margin-top:0}code{direction:ltr;display:inline-block;background:rgba(15,23,42,.65);border:1px solid rgba(148,163,184,.25);border-radius:8px;padding:2px 6px;color:#dbeafe}
</style></head><body><div class="card"><span class="badge">z</span><h1></h1><p>u'   </p><div class="meta"><b>קובץ:</b> r  u   <br><b>משך שיר:</b> u   <br><b>שקפים:</b> u)   <br><b>ממוצע צפוי לשקף:</b> u    שניות<br><b>סטטוס:</b> השיר עדיין לא הוטמע בנתיבי המצגת. הוא נשמר זמנית בלבד עד לבחירה.</div><p>z</p><div class="actions">uf   </div><a class="back" href="/admin#japan">חזרה בלי לבצע שינוי</a></div></body></html>
)
r   rg  r   r   r   r   rn  r(  r)  admin_status_page)r  analysisrw  r  r   avgr!  r#  r  
loop_total
token_safer   r  r   optionsr   s   &&&&            r   $render_japan_music_confirmation_pager9  ?  s8   LL!E
45::
;Chll=166Q7K??3x||N'C'I'Ir#JKLOOC(8(8(I(O(OR$PQM=Q0R0W0WVW!XYJ'JBU-l^;Mk] [<<?9D~5c::OQ 	
??Il K??Il K??Il K	
 EZL  QO  P	*	BW-l^;Mk] [<<?9Dz5c::OQ 	
??Il K??Il K	 W !?  BR  W[  \  	\N OW  O^  O^  _d  Oe  Nf f@ AIPU@V?WWbckcrcrsxcybz  {C  DL  DS  DS  T[  D\  C]  ]F  GT  G]  G]  X]  F^  ^x  yE  xF  F]  ^i  ]j  jS  TW  X[  S\  \z  {C  {J  {J  KO  {P  zQ  Ql  mt  lu u r   c           	      L   R p \        V RR4      p\        VP                  R4      4      pVP                  R4      '       g   \        VP                  R4      4       \	        VP                  R4      4      pTR\        VP                  R4      ;'       g    VP                  R	4      ;'       g    R
4      ,           ,          p\        RRRVR7      ^3# \        VP                  R4      4      pVP                  R4      R9   d   \        VP                  R4      WBV4      ^3# \        VP                  R4      R4      #   \         d^   pT'       d2   TP                  R4      '       d   \        TP                  R4      4       \        RRR\        T4      R7      R3u R p?# R p?ii ; i)Nr'   rl   r  r  r  rS   u   

שגיאת ffprobe:
rp  r.     לא ידוע;   השיר לא הוטמע — בדיקת אורך נכשלהu   המערכת לא הצליחה לזהות משך תקין ולכן לא שמרה את השיר בנתיבי המצגת ולא שינתה את המצגת.Fr  detailsrw  r   accept_as_isu#   שגיאה בהכנת שיר יפןu?   השיר לא הוטמע ולא בוצע שינוי במצגת.r   >   r   r  )r  r  r   r  media_details_textr   r3  r.  r9  %commit_japan_experience_pending_musicr   r~  )r  r  rw  r>  r4  r  s   &     r   6handle_japan_experience_music_upload_with_confirmationrB  w  s   Lm0Iab,\-=-=n-MNyy()9)9')BC()9)9')BCG2S79K9r9ruyyY^O_9r9rcr5sssG$%b  e@  EJ  T[  \  ^a  a  a2599=O3PQ<< $==78H8H8QS[dpqsvvv4\5E5Eg5NP^__ mL,,W55()9)9')BC !F  IJ  OT  ^b  cf  ^g  h  jm  m  	mms7   B)D; .#D; AD;  D; ;F#F%3FF#F#c           
          T;'       g    R P                  4       p\        V 4      pVP                  R4      R8w  g   VP                  R4      R8w  d   \        RRRR7      R	3# \	        VP                  R
4      4      pVP                  R4      '       gX   \        V 4       \        RRR\        VP                  R4      ;'       g    VP                  R4      ;'       g    R4      R7      ^3# \        VP                  R4      4      pRR0pVP                  R4      R8X  d   VP                  R4       W9  d   \        RRRR7      R	3# VR8X  d7   \        V 4       \        RR. /VRRRR7      p\        RRR \        V4      R7      # \        V\        R,          \        R,          R!4      pVR8X  dz   \        \        VP                  R"4      ;'       g    ^ 4      \        VP                  R4      ;'       g    ^ 4      4      p\!        VR#VP                  R4      \"        R$7      p	R%p
R&pR'pMZ\%        VP                  R4      4      p	VP                  R4      R8X  d   R(p
R)pR*pM#VP                  R4      R+8X  d   R,p
R-pR.pMR/p
R0pR1p\        RWsWVR7      p\        V 4       R2R3P'                  VR,           Uu. uF  qR4,          NK  	  up4      ,           R5VR6,           2,           pVR7\)        VP                  R84      4      ,           ,          pVR7\        V4      ,           ,          p\        WR VR7      # u upi   \*        \,        3 dI   p\        T 4       \/        T\,        4      '       d   R9MR	p\        R:\        T4      RR7      T3u Rp?# Rp?i\0         dC   p \        T 4       M  \0         d     Mi ; i\        R;R<R\3        T4      R7      R=3u Rp?# Rp?ii ; i)>r   rr   r'   r  rl   u%   העלאה זמנית לא תואמתuN   הקובץ הזמני אינו שייך לשיר מצגת יפן הראשית.Fr1    r  r  r<  u   הקובץ הזמני קיים, אבל ffprobe לא הצליח לזהות את משך השיר בזמן האישור. לא בוצע שינוי.rp  r.  r;  r=  rw  r?  cancelr   r  
loop_min_5u'   בחירת סנכרון לא תקינהuB   האפשרות שנשלחה אינה תואמת למצב השיר.r  Nu   המשתמש ביטל את ההעלאה אחרי אזהרת זמן שקפים. השיר לא הוטמע והמצגת לא שונתה.)rx  ro  r  u   העלאת השיר בוטלהuN   השיר לא הוטמע בנתיבי המצגת והמצגת לא שונתה.TJAPAN_musicr&  -short_song_audio_loop_min_5_seconds_per_slider6  u   השיר הוטמע, אך לא דחס את המצגת. המצגת הוארכה כך שלכל שקף יש לפחות 5 שניות, והשיר יתנגן בלופ.uC   השיר הוטמע בלופ והמצגת סונכרנה בבטחהu   השיר נשמר בנתיבי המצגת. בגלל שהוא קצר מדי, זמני השקפים נקבעו לרצפת 5 שניות לשקף והמוזיקה תמשיך בלופ.u   השיר הוטמע לאחר אישור מפורש למרות שהוא יוצר פחות מ־5 שניות בממוצע לשקף.u2   השיר הוטמע לפי האורך המקוריu   השיר נשמר והמצגת סונכרנה לפי אורך השיר המקורי, בהתאם לאישור שניתן במסך האזהרה.r   u{   השיר הוטמע לאחר אישור מפורש למרות שהוא יוצר מעל 10 שניות בממוצע לשקף.u=   השיר הארוך הוטמע לפי האורך המקוריu   השיר נשמר והמצגת סונכרנה לפי אורך השיר הארוך, בהתאם לאישור שניתן במסך האזהרה.u   השיר נמצא בטווח התקין 5–10 שניות בממוצע לשקף, ולכן הוטמע וסונכרן ללא אזהרה.<   מוזיקת יפן הועלתה והמצגת סונכרנהum   השיר נשמר, משך השיר זוהה, וזמני השקפים עודכנו לפי האורך החדש.   נשמר אל:
ru  r      

SHA256 MP3 סופי:
r  

rS     u%   העלאה זמנית לא זמינהu)   שגיאה באישור הטמעת שירu   השיר לא הוטמע או שהפעולה לא הושלמה במלואה. בדוק את הפירוט לפני ניסיון חוזר.r   )r   r  r   r3  r  r  r   r.  addr  r  r  r  JAPAN_MUSIC_TARGETSr>  rg  r3  'JAPAN_EXPERIENCE_LOOP_MIN_SLIDE_SECONDSr:  r   r@  r  r  r   r   r~  )r  rd  r  rw  r4  allowedr  r  target_secondsrx  ro  r   r   r  r>  r  s   &&              r   rA  rA    s   <{,,B%%'07F#w.,2B2B;2OSk2k$%L  O_  di  j  lo  o  o,\-=-=n-MNyy(/$%b  ev  {@  JM  NS  NW  NW  X_  N`  NG  NG  di  dm  dm  ns  dt  NG  NG  xG  JH  I  KN  N  N2599=O3PQ!8,<< K/KK% $%N  QU  Z_  `  be  e  eX(/67OR[]_Q`bguy  FM  _g  hF$%E  HX  ]a  kH  IO  kP  Q  Q>|WU\M]_r  tL  `M  O\  ]\! x||4H'I'N'NQ!OQVW\W`W`asWtWyWyxyQz{NOI(-		2D(E*Q	K |IYE LGNuyyYkOlmK||G$3 _	L kg&*4 Z	W i e	V J23K[mx  `f  g$U+$tyy;W`Ka1bKa4v,,Ka1b'cc  iC  DO  PX  DY  CZ  g[  [6.{w/GHHH69&AAA D'JJ 2c )* f$U+"3(9:: !H#c(W\]_eee {	(/ 		 !L  OX  ]b  lp  qt  lu  v  x{  {  	{{s   L5 AL5 #A9L5 L5 +AL5 <L5 AL5 "L5 3B?L5 2L0
A,L5 0L5 5O=N	O	OON$#O$N2/O1N22OOOc           
         V '       g   R # . pV P                  R4      '       d$   VP                  RV P                  R4       24       V P                  R4      e   V P                  R4      e   VP                  R\        V P                  R4      4       24       VP                  R\        V P                  R4      4       24       \        V P                  R4      ;'       g    ^ 4      pV^ 8  d   VP                  R\        V4       24       V P                  R	4      '       d$   VP                  R
V P                  R	4       24       V P                  R4      '       d$   VP                  RV P                  R4       24       V P                  R4      '       d$   VP                  RV P                  R4       24       V P                  R4      '       d$   VP                  RV P                  R4       24       V P                  R4      em   TP                  RV P                  R4      ;'       g    \	        V P                  R4      4       R\        V P                  R4      ;'       g    ^ 4      R R24       V P                  R4      '       d$   VP                  RV P                  R4       24       V P                  R4      '       dM   V P                  R4      '       d6   VP                  RV P                  R4       RV P                  R4       24       V P                  R4      '       d$   VP                  RV P                  R4       24       RP                  V4      # ) r   r  u   מצב עיבוד: r  r  u   גודל לפני: u   גודל אחרי: r  u   חיסכון: r  u   מידות מקור: r  u   מידות סופיות: r  u   איכות JPG: r  u   ביטרייט MP3: rw  u   משך סרטון: rx  r7  r  r~  codecu   קידוד וידאו: widthheightu   רזולוציית וידאו:    ×rC  zFFmpeg: ru  )r   r  r  r   rn  rg  r   )rS   r  saveds   &  r   r@  r@    s   Eyy*599V+<*=>?yy!-%))L2I2U*<		/8R+S*TUV*<		,8O+P*QRSEIIm,11219LL>,u*=)>?@yy&'',UYY7L-M,NOPyy#$$0;M1N0OPQyy'		)(<'=>?yy+EIIi,@+ABCyy#$0*5995G+H+y+yN[`[d[dew[xLy*zz|  ~C  DI  DM  DM  N`  Da  Df  Df  ef  ~g  hk  }l  lx  y  	zyy.uyy/A.BCDyyeii116uyy7I6J"UYYW_M`Labcyyx		( 345699Ur   皙?gQ?c                       ] tR tRtRtRtR# )
MediaErrori  z3Raised when media or presentation validation fails.r  N)__name__
__module____qualname____firstlineno____doc____static_attributes__r  r   r   r[  r[    s    =r   r[  )frozenc                   ,   a  ] tR tRt o V 3R ltRtV tR# )PresentationParti  c                J   < V ^8  d   Qh/ S[ ;R&   S[ ;R&   S[;R&   S[;R&   # )r  r)  r*  rl  r`   )r   rg  r   )format__classdict__s   "r   __annotate__PresentationPart.__annotate__  s3     J  
H  N	 
 J r   r  Nr\  r]  r^  r_  __annotate_func__ra  __classdictcell__rg  s   @r   rd  rd          r   rd  c                   ,   a  ] tR tRt o V 3R ltRtV tR# )PresentationInfoi  c                f   < V ^8  d   Qh/ S[ S[R3,          ;R&   S[ S[R3,          ;R&   S[;R&   # )r  .slide_basesr0  part1_last_slide_number)r   r   rd  r   )rf  rg  s   "r   rh  PresentationInfo.__annotate__  s=     sCx   !3&''  ! 	 r   r  Nrj  rm  s   @r   rp  rp    rn  r   rp  c                   ,   a  ] tR tRt o V 3R ltRtV tR# )TimelineEntryi  c                z   < V ^8  d   Qh/ S[ ;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[;R&   S[ ;R&   # )	r  r  r   kindmedia_secondstimeline_secondsr)  r*  
part_index)r   r   rg  )rf  rg  s   "r   rh  TimelineEntry.__annotate__  se     J  I  I	 
     L  
J  O r   r  Nrj  rm  s   @r   rv  rv    rn  r   rv  c                   ,   a  ] tR tRt o V 3R ltRtV tR# )TimelineResulti  c                f   < V ^8  d   Qh/ S[ S[R3,          ;R&   S[;R&   S[ S[R3,          ;R&   # )r  .entriesrQ  warnings)r   rv  rg  r   )rf  rg  s   "r   rh  TimelineResult.__annotate__  s<     =#%&&    CHo	 r   r  Nrj  rm  s   @r   r~  r~    rn  r   r~  c                $    V ^8  d   QhR\         /# r  returnr  )rf  s   "r   rh  rh         ( (C (r   c                     V P                  ^4      p\        V4      ^8w  d   \        R4      h\        P                  ! RV4      ^ ,          # )   B   קובץ הווידאו נקטע בזמן קריאת מבנה MP4.z>Ir9  r,  r[  structunpackr  s   & r   	_read_u32r    <    66!9D
4yA~]^^==t$Q''r   c                $    V ^8  d   QhR\         /# r  r  )rf  s   "r   rh  rh  $  r  r   c                     V P                  ^4      p\        V4      ^8w  d   \        R4      h\        P                  ! RV4      ^ ,          # )   r  z>Qr  r  s   & r   	_read_u64r  $  r  r   c                0    V ^8  d   QhR\         R\         /# )r  r)  r*  r  )rf  s   "r   rh  rh  +  s      # C r   c              #   8  "   TpV^,           V8:  d   V P                  V4       \        V 4      pV P                  ^4      p^pV^8X  d   \        V 4      p^pMV^ 8X  d	   W#,
          pWF8  g   W4,           V8  d   R# WSV,           W4,           3x  W4,          pK  R# 5i)r  N)seekr  r9  r  )r  r)  r*  posr  box_typeheaders   &&&    r   _iter_boxesr  +  s     
C
'S.	s|66!919Q<DFQY9D=CJ,fcj00 s   BBc                0    V ^8  d   QhR\         R\        /# r  r   r  )r   rg  )rf  s   "r   rh  rh  =  s     )Z )Zt )Z )Zr   c           	        \        V 4      p V P                  4       '       g   \        RV P                   24      hV P	                  4       P
                  pV^8  d   \        RV P                   24      hV P                  R4      ;_uu_ 4       pRp\        V^ V4       F  w  rEpVR8X  g   K  WV3p M	  V'       g   \        RV P                   R24      h\        W#^ ,          V^,          4       EFV  w  rEpVR8w  d   K  VP                  V4       VP                  ^4      p\        V4      ^8w  d    EMV^ ,          pV^8X  d>   VP                  V^,           ^,           ^,           4       \        V4      p	\        V4      p
M<VP                  V^,           ^,           ^,           4       \        V4      p	\        V4      p
V	^ 8:  g   V
^ 8:  d   \        R	V P                   R
24      hW,          p\        P                  ! V4      '       d   V^ 8:  g   VR8  d   \        RV P                   RV 24      h\        V4      u uuRRR4       # 	  RRR4       \        RV P                   R
24      h  + '       g   i     L); i)z9Read duration from the ISO BMFF mvhd atom without ffmpeg.u#   קובץ וידאו לא נמצא: u%   קובץ וידאו קטן/פגום: r8  Ns   moovu'   לא נמצא אטום moov בקובץ u.   . יש לשמור MP4 תקין עם faststart.s   mvhdu+   משך וידאו לא תקין בקובץ r(  u+   משך וידאו לא סביר בקובץ rJ  u4   לא נמצא משך וידאו תקין בקובץ iQ )r   is_filer[  r   statst_sizer   r  r  r9  r,  r  r  rK  rL  rg  )r   	file_sizer  moovr  content_startbox_endversion_flagsversion	timescaler*  rl  s   &           r   mp4_duration_secondsr  =  s)   :D<<>>>tyykJKK		##I2~@LMM	4A0;Aq)0L,HW7"%/ 1M FtyykQ  A  B  B0;AAwQ0P,HW7"FF=!FF1IM=!Q&#A&G!|}q(1,q01%aL	$Q<}q(1,q01%aL	$Q<A~Q #NtyykYZ![\\*G==))W\W|=S #NtyykY[\c[d!eff>!= 
 1Q 
@ KDII;VWX
YYA 
s   I)+I):FI)I))I9	zQ<section\b(?=[^>]*\bclass=[\"'][^\"']*\bslide\b[^\"']*[\"'])[^>]*>(.*?)</section>z%\bdata-local-base=[\"']([^\"']+)[\"']z$<img\b[^>]*\bsrc=[\"']([^\"']+)[\"']c                <    V ^8  d   QhR\         R\        R\         /# )r  section_htmlr  r  r   r   )rf  s   "r   rh  rh  s  s!     $ $ $C $C $r   c                    \         P                  V 4      pV'       d5   \        VP                  ^4      P	                  RR4      4      P
                  # \        P                  V 4      pV'       dL   \        VP                  ^4      P                  R^4      ^ ,          P	                  RR4      4      P                  # RV^,           R 2# )   r%  r&  ?slide-rY   )	_DATA_LOCAL_BASE_REr  r   r  r   r   _IMG_SRC_REr+  stem)r  r  r
  srcs   &&  r   _base_from_slide_htmlr  s  s    &&|4EEKKN**456;;;


\
*C
CIIaL&&sA.q199$DEJJJEAIc?##r   c                0    V ^8  d   QhR\         R\        /# r  r	  r  )r   rp  )rf  s   "r   rh  rh  }  s     f fC f,< fr   c                 @  a  \        \        P                  S 4      4      p\        ;QJ d    . R  \	        V4       4       F  NK  	  5M! R  \	        V4       4       4      pV'       g   \        \
        P                  ! RS \
        P                  4      4      p\        ;QJ d&    . R \        \        V4      4       4       F  NK  	  5M! R \        \        V4      4       4       4      pV'       g   \        R4      hR V 3R llpV! R4      pV! R4      p\        \        V! R4      4      4      p^Tu;8:  d   \        V4      8  g   M \        R	V R
\        V4       R24      h\        ^ V^,
          VR4      \        V\        V4      ^,
          VR4      3p\        W(VR7      # )c              3   \   "   T F"  w  r\        VP                  ^4      V4      x  K$  	  R# 5i)r  N)r  r  )r   r  r  s   &  r   r   ,inspect_presentation_html.<locals>.<genexpr>  s'     cIb-aggaj!<<Ibs   *,z4<(?:section|div)\b[^>]*\bclass=[\"'][^\"']*\bslide\bc              3   <   "   T F  pR V^,           R 2x  K  	  R# 5i)r  rY   Nr  r   r  s   & r   r   r    s     M:LQfQU3K0:L   u1   לא נמצאו שקפים בקובץ המצגת.c                0    V ^8  d   QhR\         R\        /# )r  r   r  )r   rg  )rf  s   "r   rh  /inspect_presentation_html.<locals>.__annotate__  s     ! !S !U !r   c                    < \         P                  ! R \         P                  ! V 4       R2S4      pV'       g   \        RV  R24      h\	        VP                  ^4      4      # )z
\bconst\s+z \s*=\s*([0-9]+(?:\.[0-9]+)?)\s*;u   לא נמצא המשתנה u    בקובץ המצגת.)r  r  r   r[  rg  r  )r   r  r	  s   & r   number)inspect_presentation_html.<locals>.number  sS    IIBIIdO#44TUW[\:4&@WXYYQWWQZ  r   r<  r=  PART_1_LAST_SLIDE_NUMBERuF   חלוקת השירים אינה תקינה: PART_1_LAST_SLIDE_NUMBER=u   , מספר שקפים=r(  u   שיר ראשוןu   שיר שני)rr  r0  rs  )r  _SLIDE_SECTION_REr  r  	enumerater  Ir=  r,  r[  r   rf  rd  rp  )	r	  slide_sectionsrr  startsr  part1_secondspart2_seconds
part1_lastr0  s	   f        r   inspect_presentation_htmlr  }  sp   +44T:;N%cSaIbc%%cSaIbccKbkk"Y[_acaeaefgeM%F:LMeeM%F:LMMLMM! ! +,M+,MU6"<=>?J
-S--TU_T``vwz  |G  xH  wI  IJ  K
 	

 	JNM;NOS%5%9=/ZE Zdeer   c                0    V ^8  d   QhR\         R\        /# r  )r   rp  )rf  s   "r   rh  rh    s     M MD M-= Mr   c                 J    \        \        V 4      P                  R R7      4      # )r   r   )r  r   	read_textr   s   &r   inspect_presentation_filer    s    $T$Z%9%97%9%KLLr   min_image_secondsc          
          V ^8  d   QhR\         \        ,          R\         \        ,          R\        \        \        3,          R\        R\
        /# )r  rr  r0  video_durationsr  r  )r   r   rd  r   rg  r~  )rf  s   "r   rh  rh    s[     cd cd#cd$%cd S%Z(cd
 cd cdr   c                 	  aa V '       g   \        R 4      hVP                  4        UUu/ uF(  w  rE\        V4      P                  4       \	        V4      bK*  	  pppR.\        V 4      ,          oR.\        V 4      ,          oR.\        V 4      ,          p. p\        V4       EF  w  r\        \        V
P                  V
P                  ^,           4      4      pV'       g   K@  . pV F  pVP                  W,          P                  4       4      pVf   K.  \        P                  ! V4      '       d   V^ 8:  d   \        RV^,            RV 24      hVP                  V4       VSV&   RW}&   K  	  V Uu. uF  qV9  g   K  VNK  	  pp\        V3R lV 4       4      pV'       g.   V
P                   \        V4      ,          pV F  pVSV&   K
  	  EK.  VV
P                   \"        ,           8  d+   \        V
P$                   RVR R	V
P                   R R
24      h\'        RV
P                   V,
          4      pV'       d   V\        V4      ,          pVV8  d-   \        V
P$                   RVR R\        V4       RVR R24      hV F  pSV,          SV&   K  	  V F  pVSV&   K
  	  VR8  d#   VP                  V
P$                   RVR R24       M[V\        V4      ,          pV F  pSV,          V,           SV&   K  	  V\"        8  d#   VP                  V
P$                   RVR R24       V
P                   \        V3R lV 4       4      ,
          pSVR,          ;;,          V,          uu&   EK  	  . pRp/ p\        V4       F9  w  pp
\        V
P                  V
P                  ^,           4       F  pVVV&   K
  	  K;  	  \        V 4       F^  w  ppTpVSV,          ,          pVP                  \)        VVW},          SV,          SV,          VVVP                  V^ 4      R7      4       K`  	  \        R V 4       4      p\+        VV,
          4      R8  d   \        RVR RVR R24      h\-        \/        V4      V\/        V4      R7      # u uppi u upi )u-   אין שקפים לחישוב ציר זמן.        imageu)   משך וידאו לא תקין בשקף rJ  videoc              3   6   <"   T F  pSV,          x  K  	  R # 5ir   r  )r   r  ry  s   & r   r   $allocate_timeline.<locals>.<genexpr>  s     BMq-**M   u)   : אורך הסרטונים המצטבר r  u#    שנ׳ ארוך ממשך השיר ua    שנ׳. אי אפשר להציג את כולם עד הסוף בלי לחרוג מהמוזיקה.u7   : לאחר ניכוי הסרטונים נשארו רק u    שנ׳ ל־u    שקפי תמונה (u    שנ׳ לשקף).r  u%   : שקפי התמונות יוצגו r0  u=    שנ׳ בלבד בגלל כמות/אורך הסרטונים.uj   : כל השקפים הם סרטונים; לאחר כל סרטון תישאר תמונת הסיום עוד u    שנ׳.c              3   6   <"   T F  pSV,          x  K  	  R # 5ir   r  )r   r  r  s   & r   r   r    s     $C7aYq\\7r  )r  r   rx  ry  rz  r)  r*  r{  c              3   8   "   T F  qP                   x  K  	  R # 5ir   )rl  r   r/  s   & r   r   r    s     ,e99er  {Gzt?u0   כשל פנימי בחישוב ציר הזמן: r  u    במקום )r  rQ  r  r  )r[  r  r   r   rg  r,  r  r  r=  r)  r*  r   rK  rL  r  r  rl  EPSILONr`   r>  rv  absr~  r  )rr  r0  r  r  kvnormalized_videoskindsr  r{  rE  indicesvideo_indicesr  r*  image_indicesvideo_totalequalr  	per_imageholdresiduer  cursorpart_for_indexp_ir   r)  expectedr  ry  s   &&&$                         @@r   allocate_timeliner    s    HII>M>S>S>UV>UdaQq1>UVK((IEC,,MIK((EH%e,
uTZZA67A(,,[^-A-A-CDH#}}X..(a-$'PQRUVQVPWWYZbYc%dee$$Q'#+a "  %,FGq/EGFBMBBLL3w</E$	! //::,GTWGXX{<<$  %FG 
 T\\K78	!C$66I,, zzl"YZcdgYh i}-..DYsOSeg  #,Q/	! #"(	! #3zzl"G	RU  WT  U s=11D",Q/$6	! #g~zzl  #M  NR  SV  MW  W_  `
 ,,$C7$C!CC'"+')s -v $&GFNu%	Ttzz488a<0A #N1 1 & [)4)A,X+A.!*1)--a3		
 *  ,e,,H
6H%KFSV<Wcdlmpcqqyz{{%.SXYaSbccu W& Gs   .R/R<Rc                R    V ^8  d   QhR\         R\        \        \         3,          /# )r  	media_dirr  )r   r   r   )rf  s   "r   rh  rh  
  s"      4 DdO r   c                 X   \        V 4      p / pV P                  4       '       g   V# \        R  V P                  4        4       R R7      pV F[  pVP                  P                  4       pVP                  V4      pVe&   VP                  P                  4       \        9   g   KW  W1V&   K]  	  V# )c              3      "   T FC  qP                  4       '       g   K  VP                  P                  4       \        9   g   K?  Vx  KE  	  R # 5ir   )r  r  r   MEDIA_EXTENSIONSr  s   & r   r   &media_files_by_base.<locals>.<genexpr>  s/     p$7q99;188>>K[_oKo$7s   A A
Ac                 6    V P                   P                  4       # r   )r   r   )r/  s   &r   r  %media_files_by_base.<locals>.<lambda>  s,      AB  AG  AG  AM  AM  AOr   r  )	r   is_dirsortediterdirr  r   r   r  VIDEO_EXTENSIONS)r  r9  rI  r   rT  previouss   &     r   media_files_by_baser  
  s    YI FpI$5$5$7p  wO  PJiioo::c?t{{0026FF3K	 
 Mr   c                h    V ^8  d   QhR\         R\        \        \        ,          ,          R\        /# r  r  rr  r  )r   r   r   r   r   )rf  s   "r   rh  rh    s+      d (3-1H TX r   c           	      @   \        V 4      pV'       d    V Uu0 uF  q3P                  4       kK  	  upMR p. p\        VP                  4       4       F  w  rgVe	   Wd9  d   K  VP                  P                  4       pRVP
                  RVP                  RV\        9   d   RMR/p	V\        9   d   \        \        V4      ^4      V	R&   VP                  V	4       K  	  R^R\        R	\        P                  ! 4       P                  4       P                  R
R7      RV/# u upi )Nr   filetyper  r  r*  r  patchVersiongeneratedAtrl  timespecr  )r  r   r  r  r  r  r   r  rf  r  r  PATCH_VERSIONr   r  
astimezone	isoformat)
r  rr  filesbrQ  r  rT  r   extr  s
   &&        r   build_manifestr    s    	*E2=+.+Qwwy+.4GEEKKM*	3#5kk!DIIDIIs&66GG

 ""$%9$%?CDT + 	1x||~002<<i<P	  /s   Dc                h    V ^8  d   QhR\         R\        \        \        ,          ,          R\         /# r   )r   r   r   r   )rf  s   "r   rh  rh  1  s+      d (3-1H TX r   c                    \        V 4      p V P                  R R R7       \        W4      pV \        ,          pVP	                  R4      pVP                  \        P                  ! VR^R7      RR7       \        P                  ! WC4       V# )Tparentsr   z	.json.tmpFr   r   r   )
r   mkdirr  MANIFEST_NAMEwith_suffix
write_textr   r  r   r   )r  rr  manifesttargetr   s   &&   r   write_manifestr  1  sn    YIOOD4O0i5H&F


[
)CNN4::hU1EPWNXJJsMr   c                    V ^8  d   QhR\         R\        \        \        ,          ,          R\        \        \
        3,          /# r   )r   r   r   r   r   rg  )rf  s   "r   rh  rh  <  s7      $ Xhsm5L X\]`bg]gXh r   c                     \        W4      pVR ,           Uu/ uF-  pVR,          R8X  g   K  VR,          \        VR,          4      bK/  	  up# u upi )r  r  r  r   r*  )r  rg  )r  rr  r  r  s   &&  r   video_duration_mapr  <  sY    i5H W%%D<7" 	.VeD,--%  s
   AAu,  
/* EITAN_VIDEO_MEDIA_CSS_START — generated by admin */
.hero-video{
  width:100%;height:100%;object-fit:cover;display:block;
  filter:saturate(1.12) contrast(1.08) brightness(.96);
  background:#020617;
}
.hero-video::-webkit-media-controls{display:none!important}
/* EITAN_VIDEO_MEDIA_CSS_END */
u-)  
  /* EITAN_VIDEO_MEDIA_RUNTIME_START — generated by admin */
  const EITAN_VIDEO_MEDIA_PATCH_VERSION = '2026-07-12-video-sync-v1';
  const EITAN_MEDIA_MANIFEST_NAME = 'media-manifest.json';
  const eitanManifestUrls = new Set();
  const eitanVideoDurations = new Map();
  let eitanSlideStarts = new Array(slides.length).fill(0);
  let eitanSlideEnds = new Array(slides.length).fill(0);
  let eitanSlideTimelineDurations = new Array(slides.length).fill(0);
  let eitanMediaPrepared = false;
  let eitanMediaPreparePromise = null;

  function eitanBaseName(value) {
    const clean = String(value || '').split('?')[0].replace(/\\/g, '/');
    const name = clean.slice(clean.lastIndexOf('/') + 1);
    return name.replace(/\.[^.]+$/, '');
  }

  function eitanBaseForSlide(slide, slideIndex) {
    const img = slide && slide.querySelector ? slide.querySelector('img.hero-image') : null;
    if (img) return eitanBaseName(img.dataset.localBase || img.getAttribute('src') || '');
    const media = slide && slide.querySelector ? slide.querySelector('video.hero-video') : null;
    if (media) return String(media.dataset.mediaBase || eitanBaseName(media.dataset.mediaSource || media.src));
    return `slide-${slideIndex + 1}`;
  }

  function eitanBuildTimeline(videoDurationsByIndex = new Map()) {
    const durations = new Array(slides.length).fill(0);
    const starts = new Array(slides.length).fill(0);
    const ends = new Array(slides.length).fill(0);
    const tiny = 0.05;

    parts.forEach((part, partIndex) => {
      const indices = [];
      for (let i = part.start; i <= part.end; i++) indices.push(i);
      const videoIndices = indices.filter(i => videoDurationsByIndex.has(i));
      const imageIndices = indices.filter(i => !videoDurationsByIndex.has(i));
      const videoTotal = videoIndices.reduce((sum, i) => sum + Number(videoDurationsByIndex.get(i) || 0), 0);

      if (!videoIndices.length) {
        const equal = part.seconds / Math.max(1, indices.length);
        indices.forEach(i => { durations[i] = equal; });
      } else {
        if (videoTotal > part.seconds + 0.035) {
          throw new Error(`${part.label}: משך הסרטונים (${videoTotal.toFixed(2)} שנ׳) ארוך ממשך השיר (${part.seconds.toFixed(2)} שנ׳).`);
        }
        const remaining = Math.max(0, part.seconds - videoTotal);
        if (imageIndices.length) {
          const perImage = remaining / imageIndices.length;
          if (perImage < tiny) {
            throw new Error(`${part.label}: לא נותר זמן שימושי לשקפי התמונות לאחר ניכוי הסרטונים.`);
          }
          videoIndices.forEach(i => { durations[i] = Number(videoDurationsByIndex.get(i)); });
          imageIndices.forEach(i => { durations[i] = perImage; });
        } else {
          const hold = remaining / Math.max(1, videoIndices.length);
          videoIndices.forEach(i => { durations[i] = Number(videoDurationsByIndex.get(i)) + hold; });
        }
        const residue = part.seconds - indices.reduce((sum, i) => sum + durations[i], 0);
        durations[indices[indices.length - 1]] += residue;
      }
    });

    let cursor = 0;
    durations.forEach((duration, i) => {
      starts[i] = cursor;
      cursor += duration;
      ends[i] = cursor;
    });
    if (Math.abs(cursor - totalDuration) > 0.01) {
      throw new Error(`כשל בחישוב הסנכרון: ${cursor.toFixed(3)} במקום ${totalDuration.toFixed(3)} שנ׳.`);
    }
    eitanSlideTimelineDurations = durations;
    eitanSlideStarts = starts;
    eitanSlideEnds = ends;
    window.__USA_PRESENTATION_TIMELINE__ = durations.map((duration, i) => ({
      slide: i + 1,
      base: eitanBaseForSlide(slides[i], i),
      type: videoDurationsByIndex.has(i) ? 'video' : 'image',
      mediaSeconds: Number(videoDurationsByIndex.get(i) || 0),
      timelineSeconds: duration,
      start: starts[i],
      end: ends[i]
    }));
  }

  eitanBuildTimeline();

  function eitanManifestUrlForImage(img) {
    const source = img.dataset.localBase || img.getAttribute('src') || '';
    const slash = source.replace(/\\/g, '/').lastIndexOf('/');
    if (slash < 0) return EITAN_MEDIA_MANIFEST_NAME;
    return source.slice(0, slash + 1) + EITAN_MEDIA_MANIFEST_NAME;
  }

  function eitanReadInlineManifest() {
    const node = document.getElementById('usa2027-inline-media-manifest');
    if (!node) return { token:'missing', items:[] };
    try {
      const data = JSON.parse(node.textContent || '{}');
      return { token:String(data.token || 'unknown'), items:Array.isArray(data.items) ? data.items : [] };
    } catch(e) {
      return { token:'invalid', items:[] };
    }
  }

  async function eitanReadManifest(url) {
    const data = eitanReadInlineManifest();
    const baseUrl = new URL('.', document.baseURI || window.location.href).href;
    return { url:baseUrl, items:data.items.map(item => {
      if (!item || !item.url) return item;
      return {...item, file:item.url};
    }) };
  }

  function eitanWaitVideoMetadata(video, timeoutMs = 10000) {
    if (Number.isFinite(video.duration) && video.duration > 0) return Promise.resolve(video.duration);
    return new Promise((resolve, reject) => {
      let timer;
      const done = () => {
        clearTimeout(timer);
        video.removeEventListener('loadedmetadata', onReady);
        video.removeEventListener('durationchange', onReady);
        video.removeEventListener('error', onError);
      };
      const onReady = () => {
        if (Number.isFinite(video.duration) && video.duration > 0) {
          const value = video.duration;
          done();
          resolve(value);
        }
      };
      const onError = () => { done(); reject(new Error(`וידאו לא נטען: ${video.dataset.mediaBase || ''}`)); };
      timer = setTimeout(() => { done(); reject(new Error(`תם הזמן לטעינת נתוני הווידאו: ${video.dataset.mediaBase || ''}`)); }, timeoutMs);
      video.addEventListener('loadedmetadata', onReady);
      video.addEventListener('durationchange', onReady);
      video.addEventListener('error', onError);
      try { video.load(); } catch(e) {}
    });
  }

  async function preparePresentationMedia() {
    if (eitanMediaPrepared) return true;
    if (eitanMediaPreparePromise) return eitanMediaPreparePromise;
    eitanMediaPreparePromise = (async () => {
      const images = [...document.querySelectorAll('img.hero-image')];
      const manifestResults = [await eitanReadManifest('inline')];
      const itemByBase = new Map();
      manifestResults.forEach(result => {
        result.items.forEach(item => {
          if (!item || !item.base || item.type !== 'video' || !item.file) return;
          const assetUrl = new URL(item.url || item.file, document.baseURI || window.location.href).href;
          itemByBase.set(String(item.base).toLowerCase(), { ...item, assetUrl });
        });
      });

      const videoDurationsByIndex = new Map();
      for (let i = 0; i < slides.length; i++) {
        const slide = slides[i];
        const img = slide.querySelector('img.hero-image');
        if (!img) continue;
        const base = eitanBaseForSlide(slide, i);
        const item = itemByBase.get(String(base).toLowerCase());
        if (!item) continue;

        const video = document.createElement('video');
        video.className = 'hero-image hero-video';
        video.muted = true;
        video.defaultMuted = true;
        video.autoplay = false;
        video.loop = false;
        video.controls = false;
        video.playsInline = true;
        video.setAttribute('playsinline', '');
        video.setAttribute('webkit-playsinline', '');
        video.preload = 'metadata';
        video.dataset.mediaBase = base;
        video.dataset.mediaSource = item.assetUrl;
        video.setAttribute('aria-label', img.getAttribute('alt') || base);

        let selectedSrc = item.assetUrl;
        try {
          if (typeof getCachedObjectUrl === 'function') {
            const cached = await getCachedObjectUrl(item.assetUrl);
            if (cached) selectedSrc = cached;
          }
        } catch(e) {}
        video.src = selectedSrc;
        img.replaceWith(video);

        let duration = Number(item.duration || 0);
        try {
          const actual = await eitanWaitVideoMetadata(video, 10000);
          if (Number.isFinite(actual) && actual > 0) duration = actual;
        } catch(e) {
          if (!(Number.isFinite(duration) && duration > 0)) throw e;
        }
        if (!(Number.isFinite(duration) && duration > 0)) {
          throw new Error(`משך הווידאו לא תקין בשקף ${i + 1}.`);
        }
        eitanVideoDurations.set(i, duration);
        videoDurationsByIndex.set(i, duration);
      }

      eitanBuildTimeline(videoDurationsByIndex);
      eitanMediaPrepared = true;
      window.__USA_PRESENTATION_MEDIA_READY__ = true;
      return true;
    })();
    try {
      return await eitanMediaPreparePromise;
    } catch (e) {
      eitanMediaPreparePromise = null;
      throw e;
    }
  }

  function pauseAllPresentationVideos(except = null) {
    document.querySelectorAll('video.hero-video').forEach(video => {
      if (video !== except) {
        try { video.pause(); } catch(e) {}
      }
    });
  }

  function syncPresentationVideo(globalSeconds) {
    if (!eitanMediaPrepared) return;
    const activeIndex = timeToSlide(globalSeconds);
    document.querySelectorAll('video.hero-video').forEach(video => {
      const slide = video.closest('.slide');
      const slideIndex = slides.indexOf(slide);
      if (slideIndex !== activeIndex) {
        try { video.pause(); } catch(e) {}
        return;
      }
      const mediaDuration = Number(eitanVideoDurations.get(slideIndex) || video.duration || 0);
      const local = Math.max(0, globalSeconds - Number(eitanSlideStarts[slideIndex] || 0));
      const playbackPoint = Math.max(0, Math.min(Math.max(0, mediaDuration - 0.04), local));
      try {
        if (Math.abs((video.currentTime || 0) - playbackPoint) > 0.45) video.currentTime = playbackPoint;
        if (local < mediaDuration - 0.04 && playing) {
          const promise = video.play();
          if (promise && typeof promise.catch === 'function') promise.catch(() => {});
        } else {
          video.pause();
          if (mediaDuration > 0 && local >= mediaDuration - 0.04) video.currentTime = Math.max(0, mediaDuration - 0.04);
        }
      } catch(e) {}
    });
  }
  /* EITAN_VIDEO_MEDIA_RUNTIME_END */
aF  
  function slideDurationInPart(part) {
    const indices = [];
    for (let i = part.start; i <= part.end; i++) indices.push(i);
    return indices.reduce((sum, i) => sum + Number(eitanSlideTimelineDurations[i] || 0), 0) / Math.max(1, indices.length);
  }

  function slideToGlobalTime(slideIndex) {
    const safe = Math.max(0, Math.min(slides.length - 1, Number(slideIndex) || 0));
    return Number(eitanSlideStarts[safe] || 0);
  }

  function timeToSlide(seconds) {
    const target = Math.max(0, Math.min(totalDuration, Number(seconds) || 0));
    let low = 0;
    let high = eitanSlideEnds.length - 1;
    while (low < high) {
      const mid = Math.floor((low + high) / 2);
      if (target < eitanSlideEnds[mid] - 0.0005) high = mid;
      else low = mid + 1;
    }
    return Math.max(0, Math.min(slides.length - 1, low));
  }
c                `    V ^8  d   QhR\         R\         R\         R\         R\        R\         /# )r  r	  rV  replacementrb   rU  r  r  )rf  s   "r   rh  rh  i	  s8       c  # VY be r   c                 p    \         P                  ! WV ^VR7      w  rVV^8w  d   \        RV RV R24      hV# )r  r  rU  u"   לא הצלחתי לעדכן את u#    בקובץ המצגת (נמצאו u    התאמות).)r  subnr[  )r	  rV  r  rb   rU  r   r  s   &&&&&  r   _replace_oncer"  i	  sP    WWW4qNNGz=k]Jmnsmt  uD  E  F  	FNr   c                R    V ^8  d   QhR\         R\        \         \        3,          /# r  )r   r   ru  )rf  s   "r   rh  rh  p	  s'     q q# q%T	*: qr   c                   a R V 9   d   V R3# RV P                  4       9  d   \        R4      h\        P                  ! RR\         R2V ^\        P
                  R7      p Rp\        V VR R	\        P                  R
7      p Rp\        WR\        ,           R,           R\        P                  R
7      p RpRp\        WVR4      p RpRp\        WVR\        P                  R
7      p RoRp\        WV3R lR\        P                  R
7      p Rp\        WRR\        P                  R
7      p Rp	\        W	RR\        P                  R
7      p Rp
\        W
R R!\        P                  R
7      p R"p\        WR R#\        P                  R
7      p R$p\        V VR%R&\        P                  R
7      p R'pR(p\        WVR)\        P                  R
7      p V P                  R*R+4      p V P                  R,R-4      p V P                  R.R/4      p V R03# )1EITAN_VIDEO_MEDIA_RUNTIME_STARTFz</head>u,   קובץ המצגת חסר תגית </head>.z<style>
z
</style>
</head>r   z8(\bconst\s+totalDuration\s*=\s*parts\.reduce\([^;]+;\s*)c                 V    V P                  ^4      R,           \        ,           R,           # )r  ru  )r  JS_RUNTIME_PATCH)r  s   &r   r  )patch_presentation_html.<locals>.<lambda>~	  s    !''!*t#&66=r   u   מנוע המדיהr  z\s*function\s+slideDurationInPart\s*\(part\)\s*\{.*?\}\s*function\s+slideToGlobalTime\s*\(slideIndex\)\s*\{.*?\}\s*function\s+timeToSlide\s*\(seconds\)\s*\{.*?\}\s*(?=function\s+getAudioDrivenSeconds)ru  z

  u   פונקציות הסנכרוןz)(\s*await\s+applyCachedAudioSources\(\);)u   \1

    let eitanMediaStartError = null;
    setLoader(3, 'בודק תמונות וסרטונים…');
    const eitanMediaStartPromise = preparePresentationMedia().catch(e => {
      eitanMediaStartError = e;
      return false;
    });u    התחלת טעינת המדיהz-(await\s+Promise\.allSettled\(\[)(.*?)(\]\);)z%\1\n      eitanMediaStartPromise,\2\3u:   שילוב טעינת המדיה במחסום הטעינהu{  

    if (eitanMediaStartError) {
      playing = false;
      musicEnabled = false;
      pauseAllAudio();
      pauseAllPresentationVideos();
      const message = eitanMediaStartError && eitanMediaStartError.message
        ? eitanMediaStartError.message
        : String(eitanMediaStartError || 'כשל מדיה');
      window.__USA_PRESENTATION_MEDIA_ERROR__ = message;
      setLoader(0, 'שגיאת מדיה: ' + message);
      if (startWithMusic) {
        startWithMusic.disabled = false;
        startWithMusic.textContent = '⚠️ בדוק את קבצי המדיה';
      }
      showToast(message);
      return;
    }
z)(await\s+Promise\.allSettled\(\[.*?\]\);)c                 4   < V P                  ^4      S,           # )r  r  )r  media_error_checks   &r   r  r(  	  s    qwwqzL]?]r   u+   בדיקת תוצאת טעינת המדיהz(if\s*\(nextPart\s*!==\s*currentPartIndex\)\s*\{\s*alignAudioToTime\(seconds,\s*musicEnabled\)\.catch\(\(\)\s*=>\s*\{\}\);\s*\})z'\1\n    syncPresentationVideo(seconds);u   סנכרון הסרטוןz>(function\s+seekToSlide\s*\(slideIndex\)\s*\{.*?\bupdate\(\);)z*\1\n    syncPresentationVideo(targetTime);u%   סנכרון בעת מעבר ידניz?(function\s+pausePresentation\s*\(\)\s*\{.*?pauseAllAudio\(\);)z%\1\n    pauseAllPresentationVideos();u&   עצירת סרטונים בהשהיהz@(function\s+finishPresentation\s*\(\)\s*\{.*?pauseAllAudio\(\);)u$   עצירת סרטונים בסיוםz(async\s+function\s+prepareOfflineCache\s*\(\)\s*\{.*?try\s*\{\s*if\s*\(navigator\.storage.*?\}\s*catch\(e\)\s*\{\}\s*)(const\s+urls\s*=\s*allOfflineAssetUrls\(\);)z\1try { await preparePresentationMedia(); } catch(e) { setOfflineStatus(e.message || String(e)); prepareOfflineCacheBtn.disabled = false; return; }\n    \2u3   הכנת סרטונים לשמירה אופלייןz4function\s+allOfflineAssetUrls\s*\(\)\s*\{.*?\n\s*\}ug  function allOfflineAssetUrls() {
    // מקור אמת יחיד: HTML המצגת + רשימת המדיה המוטמעת.
    // אין לסרוק את ה-DOM בנוסף, אחרת תמונה ישנה שהוחלפה בסרטון
    // נספרת לצד הסרטון ונוצר פער שקרי בין קובץ הטיול למצגת.
    const inline = eitanReadInlineManifest();
    const declared = inline.items
      .map(item => item && (item.url || item.file))
      .filter(src => src && !/^data:/i.test(src))
      .map(absoluteAssetUrl);
    return [...new Set([canonicalPresentationUrl(), ...declared])];
  }u1   רשימת המדיה לשמירה אופלייןu'   טוען תמונות ומוזיקה…u#   טוען מדיה ומוזיקה…u0   מכין מוזיקה וטוען תמונות…u,   מכין מוזיקה וטוען מדיה…u'   טוען תמונות ראשונות…u!   טוען מדיה ראשונה…T)
r   r[  r  r(  	CSS_PATCHr  r"  r  TIMING_FUNCTIONS_PATCHr   )r	  total_patterntiming_patternstart_anchor
start_codepreload_patternpreload_replacementpreload_done_patternsync_anchorseek_patternpause_patternfinish_patterncache_prepare_patternoffline_patternoffline_replacementr+  s   &              @r   patch_presentation_htmlr<  p	  s   (D0U{ 

$GHH66*	)4GH$VW_a_c_cdD PM=ddD	0  t6L/Lx/WYz  CE  CG  CG  HD
 @LJ Z9[\D GOB0C  FB  JL  JN  JN  OD( H5]  `M  UW  UY  UY  ZD VK,VXs{}{{  AD UL-Z  ]D  LN  LP  LP  QD WM.V  YA  IK  IM  IM  NDXN/WY  HJ  HL  HL  MD D 	g=ddD NO
 0CEx  AC  AE  AE  FD <<AChiD<<JLz{D<<ACfgD:r   c                <    V ^8  d   QhR\         R\        R\        /# )r  r   rD   r  )r   ru  )rf  s   "r   rh  rh  	  s!      $ 4 4 r   c                `   \        V 4      p V P                  4       '       g   \        R V  24      hV P                  RR7      p\	        V4      w  r4V'       g   R# V'       dx   V P
                  R,          pVP                  RRR7       \        P                  ! 4       P                  R4      p\        P                  ! WV P                   RV R	2,          4       V P                  V P                  R
,           4      pVP                  VRR7       \!        V4       \"        P$                  ! Wp4       R# )u#   קובץ המצגת לא נמצא: r   r   F.admin_backupsTr  %Y%m%d_%H%M%S_%fr(  .bakr   )r   r  r[  r  r<  parentr  r   r  r   rF  r  r   r  r  r  r  r   r   )r   rD   originalr   changed
backup_dirr  temps   &$      r   patch_presentation_filerG  	  s    :D<<>>>tfEFF~~w~/H.x8G[[#33
5''(:;T499+QugT(BBCDKK&01DOOGgO.g&JJtr   c                ^    V ^8  d   QhR\         R\         R\        \         ,          R\         /# )r  r'  r  output_pathr  )r   r   )rf  s   "r   rh  rh  	  s0      T d QYZ^Q_ ko r   c                    \        V 4      p\        WP                  4      p\        VP                  VP                  V4      pVf   \        V4      R,          pR\        R\        V 4      R\        V4      RVP                  R\        VP                  4      RVP                   Uu. uF  p\        V4      NK  	  up/p\        V4      P                  \        P                  ! VR^R	7      R
R7       \        V4      # u upi )NrH   r  rs   mediaDirectorytotalSecondsr  r  Fr   r   r   )r  r  rr  r  r0  r   r  r   rQ  r  r  r  r   r  r   r  )r'  r  rI  r  videostimelineentryr   s   &&&     r   write_timeline_reportrP  	  s    $%67D	+;+;<F !1!14::vFH9o(DD-.#i...D**+x/?/?@/?eF5M/?@G 	  G%PQ!R]d e As   $C:c                     T ;'       g    R P                  4       P                  4       p V R9   d   R # V R9   d   R# V \        9  d   \        R4      hV # )r_   rj   uh   יעד מדיה למצגת ארה״ב לא תקין. יש לבחור פלאפון או טלוויזיה.>   r_   iphonemobile
   טלפון   פלאפון>   rj   screen
television   טלויזיה   טלוויזיה)r   r   USA_IMAGE_TARGETSr  r  s   &r   normalize_usa_image_targetr\  
  s]    $//668>>@NTT]]..  D  E  	Er   c                 6    \        V 4      p V \        V ,          3# r   )r\  rZ  r[  s   &r   r  r  
  s    /?N,^<<<r   c                 |    \        V 4      w  r\        P                  P                  \	        V 4      VR ,          4      # rc   )r  r   r   r   r  r  s   & r   usa_image_dir_for_targetr`  
  s.    0@N77<<3NCT(^TTr   c                $   \        V 4      w  rVP                  R4      p\        P                  V4      pV'       g	   RRRRRV /# \        P                  P                  \        V4      V4      p\        P                  P                  V4      '       g   RRRRRV RV/# \        V4      pVR	,          R
,           pTpR F  pVP                  W4      pK  	  Wu8X  d   RRRRRV RV/# \        VRV  24      p	\        WG4       RRRV RVRV	R\        V4      /# )zWMake sure each USA presentation points to the media folder that exists in its own root.rg   r   Freasonpresentation_key_not_foundr  presentation_file_missingr   re   r&  already_correctUSA_presentation_image_path_TrD   r  )rI   z$media/usa-presentation/media/images/)r  r   rM  r   r   r   r  rg  r  r   r  r  r  )
r  r  rg   r5  r   r	  desiredr0  wrongrD   s
   &         r   )ensure_usa_presentation_uses_image_targetri  !
  s*   0@Nxx 23%))*:;H5(,H(Tbcc77<<78HI8TD77>>$5(,GSacikoppt$D< 3&GH^##E3 _5(,=xY_aeff!$*F~FV(WXF(tX~vtXvW_almqarssr   c                     \        V 4      w  rVP                  R 4      p\        P                  V4      pV'       g   \        R4      h\        P
                  P                  \        V4      V4      # )rg   u?   לא נמצא מיפוי קובץ מצגת ליעד המדיה.)r  r   rM  r  r   r   r   r  )r  r  rg   r5  s   &   r    usa_presentation_path_for_targetrk  9
  s[    0@Nxx 23%))*:;HZ[[77<<78HI8TTr   c                 <    \        \        \        V 4      4      4      # r   )r  r   r`  r[  s   &r   usa_media_files_for_targetrm  B
  s    t$<^$LMNNr   c                     \        V 4      pVP                  R 4      '       d.   \        VP                  R4      ;'       g    ^ 4      pV^ 8  d   V# \        \	        V 4      4      # )r  rw  )r  r   rg  r  r   )r   rw  ri  s   &  r   probe_video_duration_secondsro  F
  sP    (.Eyyeii 2388q919LT
++r   c                 H   \        4       pV'       g   R RRRR^ R^ RR/# VRR	R
RRRRRV .
p \        V^R7      pVP                  ^ 8w  d6   R RRRR	VP                  ;'       g    VP                  ;'       g    RRR RV/# \
        P                  ! VP                  ;'       g    R4      pVP                  R4      ;'       g    / .^ ,          pR \        V4      R\        VP                  R4      ;'       g    R4      P                  4       R\        VP                  R4      ;'       g    ^ 4      R\        VP                  R4      ;'       g    ^ 4      R\        VP                  R4      ;'       g    R4      RV/#   \         d   pR RRRR	\        T4      RT/u Rp?# Rp?ii ; i)r  FrT  r   rU  rV  rN  r   rq  rp  z-select_streamszv:0rr  z&stream=codec_name,width,height,pix_fmtrs  r   rt  N{}streams
codec_namepix_fmt)rO  rb  r{  rz  ry  r   loadsr   ru  r   r   r   r   r~  )r   rN  r_  r  r   streamr  s   &      r   probe_video_stream_inforx  O
  s   %'GeWi!Xq)UWXXw 15AvtC
Y"33==A%)Wryy?[?[BII?[?[Y[]b]c>dfoqxyyzz"))++t,((9%--"q1$v,SL1>>Y?EEGSG,112c&**X.33!4s6::i066B7w
 	
  YeWi$s)YPWXXYsS   5E9 "E9 6E9 ?"E9 "E9 3E9 51E9 '#E9 #E9 /	E9 9F!FF!F!c                (   \        V4       \        P                  P                  V 4      '       d    \        P                  P	                  V 4      M^ pV^ 8:  d   \        R4      hV\        8  d(   \        R\        V4       R\        \        4       24      h\        V 4      p\        4       pVR,           pRpV'       EdG   VP                  R4      ;'       g    RpVR8X  d   VR	R
RRRV RRRRRRRV.p	RpMVR	R
RRRV RRRRRRRRRRRRRV.p	Rp\        V	RR7      p
V
P                  ^ 8w  gJ   \        P                  P                  V4      '       d%   \        P                  P	                  V4      ^ 8:  dz    \        P                  P                  V4      '       d   \        P                  ! V4       \        R T
P                  ;'       g    T
P                   ;'       g    R!R0R" ,           4      h\        P"                  ! Wa4       MK\%        \'        V 4      4       VR#,           p\(        P*                  ! W4       \        P"                  ! W4       R$p\-        V4      pV^ 8:  d   \        R%4      h\        V4      pR&TR'TR(\        P                  P	                  V4      R)\/        ^ V\        P                  P	                  V4      ,
          4      R*TR+\1        V4      RVP                  R4      ;'       g    VP                  R4      ;'       g    RR,VP                  R,4      ;'       g    VP                  R,4      ;'       g    ^ R-VP                  R-4      ;'       g    VP                  R-4      ;'       g    ^ R.T;'       g    R//
#   \         d     ELi ; i)1zTCreate a browser-safe MP4. Preserve H.264 by remuxing; transcode only when required.u   קובץ הסרטון ריק.u'   קובץ הסרטון גדול מדי: r  z.video.tmp.mp4
copied_mp4rT  r   h264r  r  r  rp  r  z-mapz0:v:0-an-c:vcopy	-movflags
+faststartremuxed_h264_faststartlibx264-presetmedium-crf20-pix_fmtyuv420ptranscoded_h264_faststartiX  rt  u0   FFmpeg לא הצליח להכין MP4 תקין: u   שגיאה לא ידועהNr  #copied_validated_mp4_without_ffmpeguA   לא זוהה משך תקין לסרטון לאחר השמירה.r  r  r  r  rw  rx  rU  rV  rC  r  i)r  r   r   r   r  r  USA_VIDEO_MAX_SINGLE_FILE_BYTESr  rx  rK  r   rb  r{  r  r   rz  ry  r   r  r   rF  r  ro  r>  rn  )r  r  r  r  r  rC  r  r  rT  r_  r  tmp_copyr*  
final_infos   &&&           r   normalize_video_to_mp4r  j
  sT   k"+-77>>++F+F277??;'ADqy899--B<PTCUBVVdeq  sR  fS  eT  U  V  	V";/D#%F//JDv!..YF?4gt[7E66;V`bC+D4gt[7E69iSY[_y+|ZQC /D"34==ARWW^^J%?%?277??S]C^bcCc77>>*--IIj) OTVT]T]  UK  UKacajaj  UK  UK  oK  MR  MS  TT  U  V  V


:+ 	T+./,[+


8)4+K8H1}\]](5Jbggook2s1dRWW__[%AABHN84(JJDHHW,=JJ(BBDHHW,=BB*..*EEdhhx.@EEA&''K !  s   6$N N NNc                     \        \        4       Uu. uF)  p\        P                  P	                  WV,           4      NK+  	  up# u upi r   )r  USA_MEDIA_EXTENSIONSr   r   r   )r  	media_keyr  s   && r   usa_media_sibling_pathsr  
  s3    @FG[@\]@\BGGLLO4@\]]]s   /Ac                   \        V 4      w  r\        V4      pVP                   Uu0 uF  qDP                  4       kK  	  pp\	        \        \        V 4      4      4      p/ pVP                  4        FQ  w  rHWE9   g   K  \        V4      P                  P                  4       \        9   g   K;  \        \        V4      4      Wt&   KS  	  \        VP                  VP                  V4      p	W9V3# u upi )zQCalculate a prospective USA timeline against current media without writing files.)r  r  rr  r   r  r   r`  r  r  USA_VIDEO_EXTENSIONSro  r   r  r0  )
r  	html_text_target_infor  r   rQ  	media_maprM  r   rN  s
   &&        r   rO  rO  
  s    #8#H N$Y/D(,(8(89(8zz|(8G9#D)A.)Q$RSIFoo'
?tDz00668<PP7D	BFL ( !!1!14::vFH6!! :s   C*c                 X   \        V 4      w  r\        V 4      p\        P                  P	                  V4      '       g   \        R V 24      h\        \        V4      4      pVP                   Uu0 uF  qUP                  4       kK  	  pp\        \        \        V 4      4      4      pT;'       g    / P                  4        FX  w  r\        V4      P                  4       p
W9  d   \        RV R24      hV	f   VP                  V
R4       KK  \        V	4      Wz&   KZ  	  / pVP                  4        FQ  w  rYWV9   g   K  \        V	4      P                   P                  4       \"        9   g   K;  \%        \        V	4      4      W&   KS  	  \'        VP                  VP(                  V4      pWLV3# u upi )uP   קובץ המצגת לא נמצא ולכן אי אפשר לאמת סנכרון: u   שם המדיה u'    אינו תואם לשקף במצגת.N)r  rk  r   r   rg  r  r  r   rr  r   r  r`  r  r   r  popr  r  ro  r  r0  )r  r`  target_infor'  r  r   rQ  r  rT  r   r  rM  rN  s   &&           r   validate_usa_media_prospectiver  
  sr   "7"GN8H77>>+,,"r  tE  sF  !G  H  	H$T*;%<=D(,(8(89(8zz|(8G9#D)A.)Q$RSIoo2,,.	HNN/u4[\]]<MM!T":IL / Foo'
?tDz00668<PP7D	BFL ( !!1!14::vFH6!! :s   .F'c                  aa \          Uu0 uF  p\        V4      P                  4       kK  	  upo. oVV3R lp\        P                  ! RV \        P
                  4       F  pV! VP                  ^4      4       K  	  \        P                  ! RV \        P
                  4       F  p \        P                  ! VP                  ^4      4      pT.pT'       g   K6  TP                  4       p\        T\        4      '       d@   RT9   d   T! TP                  R4      4       TP                  TP                  4       4       Ko  \        T\         4      '       g   K  TP                  T4       K  	  S# u upi   \         d     K  i ; i)a  Return active presentation audio URLs in deterministic document order.

The active HTML is the contract. Do not assume a fixed track count: collect audio
element sources and canonical entries from the music-segment JSON. Editing-source
files that merely exist in the music directory are inventoried by the live-source
gate, but are not declared active unless the presentation references them.
c                 ,  < \         P                  ! \        T ;'       g    R 4      4      P                  4       P	                  RR4      pV'       d   VP                  R4      '       d   R# VP                  R^4      ^ ,          P                  R^4      ^ ,          P                  R4      pVP                  4       P                  R4      '       g   R# \        V4      P                  P                  4       S9  d   R# VS9  d   SP                  V4       R# R# )r   r%  r&  #Nr  zmedia/usa-presentation/music/)http://https:////data:blob:r  )r   unescaper   r   r   r*  r+  lstripr   r   r  r  )r.  ri  rJ  	supporteds   & r   rN  3_usa_audio_urls_from_presentation_html.<locals>.add
  s    !!#ciiR.1779AA$L(()XYYC"1%++C215<<SA{{}''(GHH;##%Y6LL r   z2<(?:audio|source)\b[^>]*?\bsrc=["\']([^"\']+)["\']zM<script\b[^>]*?\bid=["\']usa2027-music-segments["\'][^>]*>([\s\S]*?)</script>	canonical)USA_AUDIO_EXTENSIONSr   r   r  r  r  r  r   rv  r   r  r   r   r   extendvaluesr  )	r  r  rN  r
  r   stacknoderJ  r  s	   &      @@r   &_usa_audio_urls_from_presentation_htmlr  
  s(    *>>)=AQ)=>IE
  RT]_a_c_cdEKKN emoxz|z~z~	jjQ0G 	e99;D$%%$&-.T[[]+D$''T" @ L; ?$  		s   "E-'%E22F Fc                .   \        V 4      w  r\        V 4      p\        P                  P	                  V4      '       g	   RRRRRV/# Ve   Vf   \        V 4      w  rp\        \        \        V 4      4      4      pVP                  R4      ;'       g    Rp. p\        VP                  4       EF  w  rVP                  \        V
4      P                  4       4      pVf   \        RV	^,            R	V
 R
V  R24      h\        V4      P                  P                  4       pRV	^,           RT
RV\         9   d   RMRRV R\        V4      P"                   2/pV\         9   d[   \%        \'        VP                  \        V
4      P                  4       4      ;'       g    \)        \        V4      4      4      ^4      VR&   VP+                  V4       EK   	  \-        V 4      p\/        V4      p\1        V4      pV'       g   \3        RV  R24      hV F  p\        P                  P4                  ! V.VP7                  R4      O5!  p\        P                  P	                  V4      '       d%   \        P                  P9                  V4      ^ 8:  d   \        RV R
V  R24      hVP+                  RRR\        V4      P:                  RV/4       K  	  \<        P>                  ! VRR)R7      p\@        PB                  ! VPE                  R4      4      PG                  4       R,          p\<        P>                  ! R^RVRV/RR)R7      pRV R2p\/        V4      p\H        PJ                  ! R\H        PL                  4      pVPO                  V4      '       d   VPQ                  VV^R 7      pM0\H        PP                  ! R!VR",           V^\H        PL                  R#7      pVV8w  d   \S        VVR$4       \/        V4      pVV9  d   \3        R%4      hRR&RVRVR'\U        V4      R(\W        V4      /# )*a/  Embed the authoritative active-media contract in the presentation HTML.

Slide media is resolved from the target's own media directory. Active audio is
discovered from the presentation itself, so the contract supports any number of
tracks without treating editing-source files as active playback files.
r  Frb  presentation_missingr   re   rf   u&   חסרה מדיה פעילה לשקף rJ  r7  )slider   r  r  r  urlr&  r*  uA   לא נמצאו הפניות אודיו פעילות במצגת (u'   חסר קובץ מוזיקה פעיל: r  r   
separatorsr   N   Nschemar  r  zC<script id="usa2027-inline-media-manifest" type="application/json">	</script>zQ<script\b[^>]*\bid=["\']usa2027-inline-media-manifest["\'][^>]*>[\s\S]*?</script>r  z(<script\b)z\n\1r   USA_inline_media_manifestuW   האימות נכשל: רשימת המדיה המוטמעת לא נשמרה במצגת.Tr  r  r   re  ),r  rk  r   r   rg  r  r  r   r`  r   r  rr  r   r   r  r  r  r   rf  rg  ro  r  r  r  r  RuntimeErrorr   r+  r  r  r   r  hashlibr  encode	hexdigestr  rN  r  r  r(  r  r,  r  )r  r  rM  r  r'  	_timeliner  re   r  r?  r   r   r  r  root_dirhtml_before_manifest
audio_urls	audio_url
audio_pathr  r  r   scriptr	  rxr   r1  s   &&&                        r   write_inline_usa_media_manifestr  
  s    #8"GN8H77>>+,,eX'=vGXYY|v~"@"P#D)A.)Q$RSI.QQ2QJEt//0	}}SY__./<#&LSSTWIUWX\W]]_`n_oop$qrr4j%%'q&$3J^C^dkmr  xB  wC  CD  EI  JN  EO  ET  ET  DU  uV  W&&$U6::c$ioo6G+H+s+sLhilmqirLs%tvwxDT 1 +>:H./@A78LMJ^_m^nnopqq	WW\\(BY__S-AB
ww~~j))RWW__Z-HA-M#&Mi[XZ[iZjjk$lmmfWVDO,@,@yQR	  
 

5uLINN9++G45??A#FEjj(1WU75APUblmGRSZR[[deF01D	hjljnjn	oB	yy&&Q&/&&')94qPRPTPTU$/0A7Lgh !23Fftuuf.wuWSZPXYdevYwxxr   c                    \        V 4      w  r\        V 4      p\        V 4      p\        P                  P                  V4      '       g	   R RRRRV/# \        V 4      w  rEp\        \        V4      VP                  4      p\        \        V4      \        V4      \        V4      \        ,          4      p\        WV4      p	R RRV R\        V4      RV	R	\        V4      R
\        V4      RVP                  R\!        VP"                  4      /# )r  Frb  r  r   Tr  r  inline_manifestreportrH  rQ  r  )r  rk  r`  r   r   rg  r  r  r   rr  rP  USA_MEDIA_TIMELINE_REPORT_NAMEr  r   r,  rQ  r  r  )
r  r  r'  r  r  rN  rM  manifest_pathreport_pathr  s
   &         r   rS  rS  ,  s    "7"GN8H(8I77>>+,,eX'=vGXYY;NKDF"4	?D4D4DEM'->(?iRVW`Ra  eC  SC  DK5nFSOd.C&?#k"s6{//D**+	 	r   c                     \        V 4      w  r\        V 4      p\        V 4      p\        P                  P                  V4      '       g   \        V4      h\        \        V4      R R7      p\        V 4      pRV RVR\        V4      R\        RVRV/# )T)rD   r  rs   patched_nowpatch_versionpath_updatemetadata)r  ri  rk  r   r   rg  r  rG  r   rS  ru  USA_MEDIA_PATCH_VERSION)r  r  r  r'  rD  r  s   &     r   $ensure_usa_presentation_media_enginer  B  s    "7"GN;NKK8H77>>+,, 122%d+<&=dKG'7H.)tG}0{H r   c                    \        V 4      p\        P                  P                  V4      '       g   RRRR/# \	        V4      p\
        ;QJ d3    R \        V 4      P                  4        4       F  '       g   K   RM(	  RM$! R \        V 4      P                  4        4       4      pRV9  d   V'       g	   RRRRRR	/# \        V 4      #   \         d   pRRR
\        T4      /u Rp?# Rp?ii ; i)z^Keep reports current after PART_1_SECONDS/PART_2_SECONDS changes without changing music logic.r  Frb  r  c              3   v   "   T F/  p\        V4      P                  P                  4       \        9   x  K1  	  R # 5ir   )r   r  r   r  r  s   & r   r   8refresh_usa_media_after_timing_change.<locals>.<genexpr>[  s4       F  REAa--/3GG  REs   79Tr%  skippedno_video_mediarp  N)rk  r   r   rg  r  r  rm  r  r  r   r~  )r  r'  r	  
has_videosr  s   &    r   rP  rP  T  s    
1<^Lww~~/00%+ABB"#45S  FQklzQ{  RC  RC  RE  FSSS  FQklzQ{  RC  RC  RE  F  F
,D8$	4;KLL3NCC 1eWd3i001s4   5C >C 9:C 4C <
C C+C& C+&C+c                 Z   V FS  p\        W4       FA  p \        P                  P                  V4      '       d   \        P                  ! V4       KA  KC  	  KU  	  \        P                  P                  V4      '       d   \        P                  ! V4       F}  p\        P                  P                  W%4      p\        P                  P                  V4      '       g   KI  \        P                  ! V\        P                  P                  W4      4       K  	  R # R #   \
         d     EK  i ; ir   )r  r   r   r   r  r   isdirr  r   rg  rF  r  )r  affected_keysrollback_dirrT  r   r   r  s   &&&    r   _restore_media_transactionr  c  s    +I;D77>>$''IIdO ( <  
ww}}\""JJ|,D'',,|2Cww~~c""S"'',,y"?@ - #  s   ;DD*)D*c                    \        V 4      P                  P                  4       pVP                  R 4      '       g6   VP	                  R4      '       g   RV9   g   VP	                  R4      '       d   R# \        V 4      P
                  P                  4       pV\        \        4      \        \        4      ,          \        ,          9   # )r(  rA  .before_r   F)
r   r   r   r*  endswithr  setr  AUDIO_UPLOAD_EXTENSIONS!USA_MEDIA_ACTIVE_EXTRA_EXTENSIONS)r   r   r  s   &  r   _usa_media_is_active_filer  {  s    :??  "Dst}}V44
d8Jdmm\bNcNc
t*


!
!
#C3+,s3J/KKNooppr   c                    \        V 4      p / pV P                  4       '       g   V# V P                  R 4       F  pVP                  4       '       g   K  \	        V4      '       g   K.  VP                  V 4      P                  4       pR\        V4      RVP                  4       P                  R\        \        V4      4      /W&   K  	  V# )*r   r  r  )r   r  rglobr  r  relative_toas_posixr   r  r  r  )rootr  r   r  s   &   r   _usa_media_tree_inventoryr    s    :DD;;==

3<<>>7==""4(113CTFDIIK4G4GS^_bcg_hSijDI   Kr   c                	   \        \        \        ,          4      R,          R,          p\        \        \        ,          4      R,          R,          pVP	                  4       '       g   \        RV 24      h\        V 4      p \        V4      pV'       g   \        R4      hR! F  pWT9  g   K  \        RV 24      h	  \        P                  ! 4       P                  R4      p\        \        4      R,          R,          V,          pVP                  P                  R	R	R
7       VP                  4       '       d   \         P"                  ! W74       MVP                  R	R	R
7       \        \$        P&                  ! R\(        R7      4      pVR,          p	 VP+                  4        F  w  rZV	\        V4      ,          pVP                  P                  R	R	R
7       \         P,                  ! V
R,          V4       \/        \1        V4      4      V
R,          8w  g   Kt  \        RV,           4      h	  VP3                  VP4                  R,           V,           4      pVP                  P                  R	R	R
7       VP                  4       '       d   \         P6                  ! VR	R7       VP                  4       '       d*   \8        P:                  ! \1        V4      \1        V4      4        \         P"                  ! W4       \         P6                  ! TR	R7       T'       d   \?        R4      p\?        R4      pMR;r\        T4      p\        T4      pR pT! T4      T! T4      8w  d   \        R4      hRR	R\1        T4      R\1        T4      R\A        T4      R\A        T4      RR	R\1        T4      RT RTR T/
\         P6                  ! TR	R7       #   \<         dp    TP                  4       '       d   \         P6                  ! TR	R7       TP                  4       '       d*   \8        P:                  ! \1        T4      \1        T4      4       h i ; i  \<         do     TP                  4       '       d   \         P6                  ! TR	R7       TP                  4       '       d   \         P"                  ! Ys4       h   \<         d     h i ; ii ; i  \         P6                  ! TR	R7       i ; i)"zExplicitly copy phone media to TV after a user-requested manual action.

This is not run by ordinary trip/presentation update packages. The two targets remain
separate so device-specific media can be maintained without accidental overwrites.
rS   rT   u6   תיקיית מקור המדיה אינה קיימת: uC   לא נמצאו קובצי מדיה פעילים בתיקיית USAu   חסר במקור האמת: r@  rC   USA_TV_media_mirrorTr  usa_tv_media_mirror_prefixdirr   r  zmedia_stage_hash_mismatch:z.mirror_old_ignore_errorsr_   rj   Nc                     V P                  4        UUu/ uF8  w  r\        V4      P                  P                  4       R 8w  g   K/  WR,          bK:  	  upp# u uppi r    r  r  r   r  r   invr  r  s   &  r   
comparable.sync_usa_phone_media_to_tv.<locals>.comparable  sC    -0YY[^[caDGNN<P<P<RV]<]MAkM[^^^   ,AA'USA_TV_media_mirror_verification_failedr  r  r  active_source_filesactive_target_filesmedia_hashes_equalrD   prune_requestedphone_engine	tv_engine)zmusic/usa-roadtrip-theme.mp3zmusic/usa-part2-theme.mp3)!r   r  USA_MEDIA_COPY_SOURCEUSA_MEDIA_COPY_TARGETr  r  ru  r  r  r   r  r   r  rB  r  r   rF  copytreetempfilemkdtempr  r  r  r  r   	with_namer   rmtreer   r   r   r  r,  )prunerebuildsrc_rootdst_rootr  r  r  backup_rootworkstagedrowr  oldr  r  	src_after	dst_afterr  s   &&                r   sync_usa_phone_media_to_tvr    s    G123g=@RRHG123g=@RRH??"XYaXb cddKE&x0F`aaL#&B3%$HII M LLN##$67Ex.9,/DDuLKTD9.$6  (>DXYZD&&F20HCd3i'FMMt<LLVf-3v;'3x=8"#?##EFF '   !?%!GHdT:::<<MM#T2??JJs8}c#h/	OOF-
 	c.?HL<TBI'++L-h7	-h7		_i Jy$99HII$c(mXs8}!3y>3H#i. $#k2BuL+y
  	d$/E  	  &--"Mzz||RZZC#h-@	4  	  &--"M!!##V__[%K 	  			 	d$/s   A?P: A/P: -P: 1)P: N= 1P: BP: = P7-P7+P77P: :R3R!-R!
R! R3!R/,R3.R//R33R6 6Sc                    aaa \        \        R ,          4      R,          R,          p \        \        R,          4      R,          R,          p\        V 4      \        V4      uooR o\        \	        S! S4      4      \	        S! S4      4      ,
          4      p\        \	        S! S4      4      \	        S! S4      4      ,
          4      p\        VVV3R l\	        S! S4      4      \	        S! S4      4      ,           4       4      pRV'       * ;'       d    V'       * ;'       d    V'       * R\        S4      R\        S4      R	VR
VRV/# )r(   rS   rT   r)   c                     V P                  4        UUu/ uF8  w  r\        V4      P                  P                  4       R 8w  g   K/  WR,          bK:  	  upp# u uppi r  r  r  s   &  r   c.validate_usa_media_source_alignment.<locals>.c  sB    b#!Q@T@T@VZa@aH+bbbr  c              3   n   <"   T F*  pS! S4      V,          S! S4      V,          8w  g   K&  Vx  K,  	  R # 5ir   r  )r   r  ar  r  s   & r   r   6validate_usa_media_source_alignment.<locals>.<genexpr>  s,     O#8aAaDGqtAw<N#8s   #5
5r  source_counttarget_count
missing_tvextra_tv
mismatched)r   r  r  r  r  r,  )r  dstr"  r#  r$  r  r  r  s        @@@r   #validate_usa_media_source_alignmentr&    s    
wu~

(+=
=C
wx 
!G
+.@
@C$S)+DS+IDAqbAaD	C!I-.Jc!A$i#ad)+,HO3qt9s1Q4y#8OOJj.DD\DD*n3q6.QZxZ9 9r   c           
      <
   \        V4      w  r#V \        9  d   R # VP                  ;'       g    Rp\        V4      pV\        9  d   \        R4      h\        V4      p\        P                  ! VRR7       \        P                  ! \        RR7       \        P                  ! RV RV  R2\        R7      p\        P                  P                  VR4      p\        P                  ! VRR7       \        P                  P                  T\        V4      ;'       g	    W,           4      p	VP                  V	4       \        P                  P!                  V	4      p
V
^ 8:  d$   \"        P$                  ! VRR	7       \        R
4      hV\&        9   dK   V
\(        8  d@   \"        P$                  ! VRR	7       \        R\+        V
4       R\+        \(        4       24      h V\,        9   d8   \        P                  P                  WpR,           4      p\/        WV4      pRpRpM6\        P                  P                  WpR,           4      p\1        WV4      pRpRp\3        W V/4      w  ppp\5        W`4       F  p\        P                  P7                  V4      '       g   K*  \"        P8                  ! V\        P                  P                  V\        P                  P;                  V4      4      4       \=        VVR,          R,           4       K  	  \        P                  P                  W`V,           4      p\5        W`4       F@  p\        P                  P?                  V4      '       g   K*  \        P@                  ! V4       KB  	  VR,           p\"        P8                  ! VV4       \        PB                  ! VV4       \E        V4      p/ RVbRVbRR bRVR,          bRV bRVbR\        P                  P                  VR,          \        P                  P;                  V4      4      PC                  \        PF                  R4      bRVbRVPI                  RV4      bR VbR!\K        V4      bR"\        P                  P!                  V4      bR#\M        V4      bR$VPN                  bR%\Q        VPR                  4      bR&Vb\"        P$                  ! VRR	7       #   \T         d-    \W        Y`.T4        \Y        T4       h   \T         d     h i ; ii ; i  \"        P$                  ! TRR	7       i ; i)'Nr   uH   סיומת לא נתמכת. העלה תמונה או סרטון MP4/M4V.Tr   
usa_media_r  r  rz  r  u   קובץ המדיה ריק.u'   קובץ התמונה גדול מדי: r  rA   r  r2   r  rh   _media_singler   r  requested_targetmirrored_to_tvtarget_labelr`   rT  rx  r  re   r&  r   r  rS   r  r  rH  rI  timeline_warningspresentation_media_engine)-r  USA_IMAGE_KEYSr5  r6  r  r  r`  r   r   r  r	  r
  r   r   r
   r  r  rF  r  USA_IMAGE_EXTENSIONS$USA_IMAGES_ZIP_MAX_SINGLE_FILE_BYTESr  r  r  r  r  r  rg  r  r   r  r   r  r   r  sepr   r  r,  rQ  r  r  r   r  rS  )r  r  r  r  r  r  r  work_dirr  r  uploaded_sizepreparedrS   canonical_extrx  r  rA  rM  siblingr  r  engines   &&&                   r   save_usa_presentation_mediar9    sq   "7"GN&!**00bM
=
!C
&&cdd(8IKK	D)KK$t4N3C1YKq'QWklH77<<*5LKKt,'',,x)G)\)\IO]K{#GGOOK0Mhd3677
""}7['[hd3B<P]C^B__mnz  |`  oa  nb  c  d  	d54&&ww||H&.@AH*;-PE"MDww||H&.@AH0VE"MD-KNhp\q-r*"F.yDGww~~g&&Wbggll<AQAQRYAZ&[\$Wk,.G/.YZ E
 ggll9-.GH.yDGww~~g&&		'" E !6)
Xz*


:{+5nE
n

 d
 K0	

 9
 D
 277<<L 9277;K;KK;XYaabdbhbhjmn
 K
 EIIfd+
 U
 k+.
 BGGOOK0
 3v;
 %&:&H&H
  &:&C&C!D
  (!
4 	hd3  "9k<H	$^4 	  			 	hd3sK   B9S CS ES S> S,+S>,S:7S>9S::S>>T Tc                    \        WV4      # )zGBackward-compatible name: now accepts either an image or MP4/M4V video.)r9  )	image_keyr  r  s   &&&r   save_usa_presentation_imager<  =  s    &yPPr   c                 t  a( \        V4      w  r\        V4      p\        P                  ! VR R7       \        P                  ! \        R R7       \
        P                  ! RV R2\        R7      p\        P                  P                  VR4      p\        P                  P                  VR4      p\        P                  P                  VR4      p\        P                  P                  VR4      p\        P                  ! VR R7       \        P                  ! VR R7       \        P                  ! VR R7       V P                  V4       \        P                  P                  V4      \        8  d4   \        P                  ! VR R	7       \        R
\        \        4       24      h. p	. p
/ p. p \         P"                  ! VR4      ;_uu_ 4       pVP%                  4        Uu. uF  qP'                  4       '       d   K  VNK  	  pp\)        V4      \*        8  d   \        R\)        V4       24      h\-        R V 4       4      pV\.        8  d   \        R4      h\1        4       pV EF  pVP2                  ;'       g    RP5                  RR4      p\        P                  P7                  V4      pV'       d/   VP9                  R4      '       g   VP9                  R4      '       d   K  \        P                  P;                  V4      w  ppVP=                  4       pVP?                  4       pV\@        9  d   V
PC                  VR,           4       K  V\D        9  d   V
PC                  VR,           4       EK  VV9   d   \        RV R24      hVPF                  \H        8  d   V
PC                  VR,           4       EKT  V\J        9   d1   VPF                  \L        8  d   V
PC                  VR,           4       EK  V\N        9   d1   VPF                  \P        8  d   V
PC                  VR,           4       EK  VPS                  V4       \        P                  P                  VVV,           4      pVPU                  VR4      ;_uu_ 4       p\U        VR4      ;_uu_ 4       p\        PV                  ! VV4       RRR4       RRR4       V\J        9   d8   \        P                  P                  VVR,           4      p\Y        VVV4      pRpM6\        P                  P                  VVR,           4      p\[        VVV4      pR pVVV3VV&   VPC                  V4       EK  	  RRR4       V'       g   \        R!4      hVP]                  4        UUu/ uF  w  ppVV^ ,          bK  	  ppp\_        VV4      w  pp p!V F  p\a        VV4       F  p"\        P                  Pc                  V"4      '       g   K*  \        Pd                  ! V"\        P                  P                  V\        P                  P7                  V"4      4      4       \g        V"VR",          R#,           4       K  	  K  	  VP]                  4        EF  w  pw  p#pp\a        VV4       F@  p"\        P                  Pi                  V"4      '       g   K*  \        Pj                  ! V"4       KB  	  \        P                  P                  V\        P                  P7                  V#4      4      p$V$R$,           p%\        Pd                  ! V#V%4       \        P4                  ! V%V$4       VR8X  dd   V	PC                  \        P                  P7                  V$4       R%VPm                  R&R4       R'\        VPm                  R(^ 4      4       R)24       EK9  V	PC                  \        P                  P7                  V$4       R*\        VPm                  R+^ 4      4       R,\        VPm                  R(^ 4      4       24       EK  	  \o        V4      p&\q        \s        V4      4      o(\u        V(3R- l\D         4       4      p'WV'R.VR/VR0VR1,          R2RR3\)        V!4      R4V Pv                  R5\y        V Pz                  4      R6V&/3\        P                  ! VR R	7       # u upi   + '       g   i     EL; i  + '       g   i     EL; i  + '       g   i     EL; iu uppi   \|         d,    \        Y<T4        \        T4       h   \|         d     h i ; ii ; i  \        P                  ! TR R	7       i ; i)7Tr   usa_media_zip_r  r  z
upload.zipextractr5  rz  r  u&   קובץ ZIP גדול מהמגבלה: r   u$   יותר מדי קבצים ב־ZIP: c              3   N   "   T F  p\        ^ VP                  4      x  K  	  R# 5ir  r>  r  r  s   & r   r   2save_usa_presentation_media_zip.<locals>.<genexpr>]  s     ;UAq{{++U   #%u7   הגודל לאחר חילוץ גדול מהמגבלה.r   r%  r&  r(  r'  u    — פורמט לא נתמךu&    — השם אינו תואם לשקףu*   נמצאה כפילות עבור השקף u    בתוך ה־ZIP.u2    — גדול ממגבלת הקובץ הכלליתu!    — הסרטון גדול מדיu#    — התמונה גדולה מדיwbNrA   r  r2   r  ud   לא נמצאו ב־ZIP קובצי תמונה או וידאו עם שמות שקפים תקינים.rh   
_media_zipr   u    — סרטון rx  r7  r  r  u    — תמונה r  u    → c              3   T   <"   T F  qP                  4       S9  g   K  Vx  K  	  R # 5ir   r   )r   rT  existings   & r   r   rB    s     V))+X:Us   (
(r  r*  r,  r`   r+  rH  rI  r-  r.  )Ar  r`  r   r   r  r	  r
  r   r   r  r  USA_MEDIA_ZIP_MAX_BYTESrF  r  r  r  zipfileZipFileinfolistr  r,  USA_MEDIA_ZIP_MAX_FILESr  $USA_MEDIA_ZIP_MAX_UNCOMPRESSED_BYTESr  r5  r   r   r*  r4  r   r   r  r  r/  r  #USA_MEDIA_ZIP_MAX_SINGLE_FILE_BYTESr  r  r0  r1  rN  r   copyfileobjr  r  r  r  r  rg  r  r  r   r  r   r  r  r   r  rQ  r  r  r   r  rS  ))r  r  r  r  r3  zip_pathextract_dirprepared_dirr  importedr  r5  affectedzfr  infosrj  seenr  r-  	base_namer  r  r  r  r%  destrS   rx  rT  r  r`  rA  rM  r7  prepared_pathr  r  r8  missingrG  s)   &&                                      @r   save_usa_presentation_media_zipr\  B  s   "7"GN(8IKK	D)KK$t47Gq'IOcdHww||Hl3H'',,x3K77<<*5L77<<*5LKKd+KKt,KKt,x 	wwx #::hd3A,OfBgAhijjHGHH]4__Xs++r "@1XXZQQE@5z33 #GE
|!TUU;U;;E;; !Z[[5D MM//R88sCGG,,X6	 I$8$8$=$=ATATU`AaAaGG,,Y7	czz|iik22NN9/N#NO~-NN9/W#WX4<$'QRVQWWi%jkk>>$GGNN9/c#cd..4>>Dc3cNN9/R#RS..4>>Dh3hNN9/T#TUk4#:>WWT3''3VT0B0Bc&&sC0 1C'..77<<dVmDD264KE"D77<<dVmDD8yQE"D"&e!4%M  ,`   D  E  E3;>>3CD3Cic4S$q'\3C	D-KN\e-f*"FC29cB77>>'**LL"'',,|RWWEUEUV]E^*_`(+l2Kl2Z[ C 
 2:1A-C--u29cB77>>'**IIg& C WW\\)RWW-=-=m-LMF&JLL
3JJz6*w277#3#3F#;"<<LUYYWijlMmLnnpq}  D  H  H  IU  VW  X  rY  qZ  Z[  !\  ]277#3#3F#;"<<L\Z_ZcZcdstuZvMwLxx}  K  LQ  LU  LU  Vb  cd  Le  f  ~g  !h  i 2B 6nE&tI7VVV'nK0d3v;$&:&H&H&:&C&C!D'	,
 	
$ 	hd3w AD 1C0B0B'''G ,++d ED  "9E	$^4 	  			 	hd3s   +c$ 
c
b9b?A7c
79c
1c
c
Fc
<b6b")b61Bc
c$ c$ =cA	c$ !C c$ &Gc$ c
"b3-	b66c	c

c	c$ $d<ddddddd d7c                    \        W4      # )zHBackward-compatible name: ZIP may now contain images and MP4/M4V videos.)r\  )r  r  s   &&r    save_usa_presentation_images_zipr^    s    *=IIr   r   c                     R V P                   R&   RV P                   R&   RV P                   R&   V P                   P                  RR4       V P                   P                  RR4       V # )	z7no-store, no-cache, must-revalidate, max-age=0, privateCache-Controlno-cachePragmar   ExpiresETagNzLast-Modified)headersr  responses   &r   no_cache_responserh    sc    (aH_%!+HX"%HY&$/Or   c                     \        V 4      # r   )rh  rf  s   &r   add_global_no_cache_headersrj    s    X&&r   c                 6   \         P                  P                  V 4      p\         P                  P                  \         P                  P                  W!4      4      pW28w  d8   VP	                  V\         P
                  ,           4      '       g   \        R 4      hV# )u!   נתיב קובץ לא מורשה)r   r   abspathr   r*  r2  r  )	directory	file_namer  r   s   &&  r   _safe_static_pathro    sc    77??9%DT =>I!5!5dRVVm!D!D<==r   c                    V '       d   V P                  R 4      '       g   R# V R,          P                  R^4      ^ ,          P                  4       pRV9  d   \        R4      hVP                  R^4      w  r4VR8X  d:   \	        V4      pV^ 8:  d   \        R4      h\        ^ W,
          4      pV^,
          pM'\	        V4      pV'       d   \	        V4      MV^,
          pV^ 8  g   Wa8  g   Wv8  d   \        R4      hV\        Wq^,
          4      3# )	zbytes=N   NNr   -u   טווח HTTP לא תקיןr   u   טווח suffix לא תקיןu   טווח מחוץ לקובץ)r*  r+  r   r  r   r>  r  )ri  r  specleftrightr  r)  r*  s   &&      r   _parse_single_http_rangerw    s    ((229??3"1%++-D
$677**S!$KDrzUQ;<==At}%QhD	!c%jtaxqyEMS[788#c!8$$$r   c              #     "   Tp\        V R 4      ;_uu_ 4       pVP                  V4       V^ 8  d<   VP                  \        W44      4      pV'       g   MV\	        V4      ,          pVx  KB  RRR4       R#   + '       g   i     R# ; i5i)r8  N)r   r  r9  r  r,  )r   r)  length
chunk_sizer  r   chunks   &&&&   r   _stream_file_ranger|    se     I	dD		R
!mGGC
67EU#IK 
			s   BAA7-
B7B		Bc           	      f    \        W4      p\        P                  P                  V4      '       g   R# \	        V4      pV\
        9   EdE   \        P                  P                  V4      p\        P                  ! V4      ^ ,          ;'       g    Rp\        P                  P                  RR4      p V'       d   \        Wd4      MRpT'       d   Tw  rY,
          ^,           p\        P                   R8X  d   RM\#        Y)T4      p\        T^TRR7      pRT	 RT
 RT 2TP                  R&   \%        T4      TP                  R&   R	TP                  R
&   \        T4      # \'        \)        Y%RRR7      4      pR	TP                  R
&   \        T4      #  \'        \+        WR^ R7      4      p\        V4      #   \         d<    \        RR7      pRT 2TP                  R&   R	TP                  R
&   \        T4      u # i ; i  \,         d    \'        \+        Y4      4      p Lui ; i  \.         d    Ru # i ; i)File not found	video/mp4Ranger   Ni  )r  zbytes */zContent-RangebyteszAccept-RangesHEADT)r  mimetypedirect_passthroughzbytes rs  r&  zContent-LengthF)r  conditionalas_attachment)r  max_age)r~  rM  r  )	Forbidden  )ro  r   r   rg  r6  r  r  	mimetypes
guess_typer   re  r   rw  r   r   rh  methodr|  r   r   r	   r   	TypeErrorr  )rm  rn  	full_pathr  r  content_typerange_headerparsedrg  r)  r*  ry  bodys   &&           r   serve_file_no_cacher    s   " %i;	ww~~i((((y!&&77??9-D$//	:1=LLL"??..w;L3IU1,E[_ #
q$^^v5r;Mi`f;g#D|`de6<UG1SE4&4Q  158[  !124;  1(22$Yy]aqv%wxH07H_-$X..	P$%8[`jk%lmH !**+  3#3/6>tf4E  14;  1(22	3&  	P$%8%NOH	P    sy   1H  AH  #H  2F2 :F2 H  BH  0H  G; '
H  2AG85H  7G88H  ;HH  HH   H0/H0c                   a ^ RI pVP                  ! 4       p\        V R4      ;_uu_ 4       o\        V3R lR4       F  pVP	                  V4       K  	  RRR4       VP                  4       #   + '       g   i     TP                  4       # ; i)r   Nr8  c                  &   < S P                  R4      # r     r9  r   s   r   r  file_sha256.<locals>.<lambda>0  s    "''+"6r   r   r  r  r   iterr   r  )r   r  hr{  r   s   &   @r   r  r  ,  sh    A	dD		R6<EHHUO = 
 ;;= 
	 ;;=   )A,,B	c                     \         P                  P                  V 4      pV'       d   \         P                  ! VR R7       R# R# r  )r   r   r   r   )r   rB  s   & r   r  r  5  s*    WW__T"F
FT* r   c                 V   \         P                  P                  V 4      '       d&   \         P                  P                  V 4      '       g   R # \        P
                  ! R4      p\        \        V4      4      ;'       g    Rp\        \         P                  P                  V 4      4      ;'       g    Rp\         P                  P                  \        V4      p\         P                  ! VRR7       \         P                  P                  WR RV 24      p\        P                  ! W4       V# )Nr  uploadsr  Tr   r  )r   r   r   rg  r   r   r
   r   r   r   UPLOAD_BACKUP_DIRr   rF  r  )r  r  r  
safe_groupr  rE  r  s   &&     r   r  r  ;  s    77>>+&&bggnn[.I.IMM/*E \!23@@yJ 0 0 =>HH&I/<JKK
T*'',,zWAi[+ABK
LL*r   c           
        \        V4       \        P                  ! \        RR7       \        P
                  ! R4      p\        \        P                  P                  V4      4      ;'       g    Rp\        P                  P                  \        RV R\        P                  ! 4        RV 24      p V P                  V4       \        P                  P                  V4      pV^ 8:  d   \        R4      h\        W4      p\        P                  ! WQ4       \        P                  P                  V4      pW8w  d   \!        RV R	V 24      hR
VRVRVR\#        V4      / \        P                  P%                  V4      '       d   \        P&                  ! V4       # #   \(         d     # i ; i   \        P                  P%                  T4      '       d   \        P&                  ! T4       i i   \(         d     i i ; i; i)zPSave uploaded file atomically: tmp -> validate size -> backup old -> os.replace.Tr   r  z
upload.bintmp_r  uploaded file is emptyzsize mismatch after save: tmp=z, final=r   r  rD   r  )r  r   r   r  r   r   r
   r   r   r   r  r  r  r  r  r   IOErrorr  r   r  r   )	r  r  r  r  safe_targetr  r  r  r  s	   &&&      r   atomic_save_uploadr  H  s   k"KK$t4MM/*E!"''"2"2;"?@PPLKww||0DqQ{m2\]H8$wwx(19566*;E


8)WW__[1
:4&UVVVZ;PXZefqZrs	ww~~h''		(# ( 			ww~~h''		(# ( 		sC   1B+F+ ;FF('F(+G;-;G*(G;*G85G;7G88G;c                      \         P                  P                  V 4      p\        P	                  4        F-  w  r#\         P                  P                  V4      V8X  g   K+  Vu # 	  R #   \
         d     R # i ; ir   )r   r   rl  r  r  r   )folder_pathabs_pathrT  ri  s   &   r   folder_key_for_pathr  b  sa    77??;/!--/JCwwu%1
 *
   s   AA(  A( $A( (A76A7c                 ,   \         P                  P                  V 4      '       g   R # \        V 4      p\        P                  V. 4       FI  p\         P                  P                  \         P                  P                  W4      4      '       g   KG  Vu # 	  \         P                  P                  V R4      p\         P                  P                  V4      '       d   R# \        R \         P                  ! V 4       4       4      pV'       d
   V^ ,          # R # )Nr-   c              3   r   "   T F-  qP                  4       P                  R4      '       g   K)  Vx  K/  	  R# 5i)r"   N)r"   r#   )r   r  )r   r  s   & r   r   !find_html_file.<locals>.<genexpr>{  s&     d#:aggi>P>PQb>c#:s   &7
7)
r   r   r  r  APP_ENTRY_FILESr   r   r   r  r  )r  
folder_keyr   
index_path
html_filess   &    r   find_html_filer  m  s     77==%%$[1J$((R8	77>>"'',,{>?? 9 k<8J	ww~~j!!d2::k#:ddJ!}r   c                 p   0 Rmp\         P                  ! V 4       F  p\         P                  P                  W4      p\         P                  P	                  V4      '       g   KI  VP                  4       P                  4       V9   g   Kn   \         P                  ! V4       K  	  R#   \         d     K  i ; i)r	  N>   htmr	  r  r   download	index.htm)	r   r  r   r   rg  r   r   r  r   )r  wrong_namesr   r  s   &   r   clean_wrong_main_filesr    s~    NK

;'GGLL3	ww~~i((::<;.		)$ (  s   
B&&B54B5c                     V R 8X  d   R# R# )r)   r.   r-   r  r_  s   &r   preferred_main_upload_filenamer    s      r   c                    \         V ,          p\        P                  ! VR R7       VP                  ;'       g    Rp\	        V4      pV \
        9   d   \        V4       \        V 4      pM+T;'       g"    R\        \        P                  ! 4       4       2p\        P                  P                  W%4      p\        WV  R2R7      pWW3# )Tr   r   upload__mainr  )r  r   r   r5  r
   APP_FOLDERSr  r  r   r   r   r   r  )rc   r  r  original_filenamer  r5  r  r9  s   &&      r   save_uploaded_filer    s    &/KKKd+%..44" 12I{+1&9<<'#diik*:); <'',,{5KF8SXIYZFr   c                     V \         9  d   R # \        R,          p\        P                  ! VRR7       \         V ,          p\        P                  P                  W#4      p\        WRR7      pW53# )Nr'   Tr   JAPAN_presentationsr  )r  r  r   r   r   r   r  )rg   r  japan_folderr5  r  r9  s   &&    r   save_japan_presentationr    sY    777#LKKt,'(89H'',,|6KI^_Fr   c                    V \         9  d   R # \        V 4      p\        P                  ! VRR7       \         V ,          p\        P                  P                  W#4      pV R8X  d   RMRp\        YV R8X  d   RMRR7      p \        V4      pWvR	&   W63#   \         d    TP                  R
4      p T'       d=   \        P                  P                  T4      '       d   \        P                  ! Y4       h \        P                  P                  T4      '       d   \        P                  ! T4       h   \         d     h i ; ii ; i)NTr   rP   rj   r_   USA_TV_presentationsUSA_presentationsr  r.  rD   )rM  r  r   r   r   r   r  r  r   r   rg  rF  r  r   r  )	rg   r  
usa_folderr5  r  r  r9  r8  rD   s	   &&       r   save_usa_presentationr    s%   5501ABJKK
T*%&67H'',,z4K-1FFTGNcs  xM  dMI_  Sf  gF5nE.4*+   	H%	"''..00V1
 		 ,,		+& 	  			sN   ?B E .D.6$D.D.1E 2$D.D.-E .D<9E ;D<<E c                 j    V \         9  d   R # \         V ,          p\        V\        V4      RR7      pW#3# )NUSA_music_all_screensr  )USA_MUSIC_FILESr  r  )r  r  r  r9  s   &&  r   save_usa_musicr    s=    'y)H2=B\]eBf  vM  NFr   c                     V \         9  d   R # V R8X  d   \        R4      M\         V ,          p\        P                  P	                  \        V 4      V4      p\        YV \        9   d   RMRR7      pW$3# )NrQ   r)   USA_TV_extra_htmlUSA_extra_htmlr  )USA_EXTRA_HTML_FILESr  r   r   r   r  r  r  )r  r  r5  r  r9  s   &&   r   save_usa_extra_htmlr    st    ,,;D;U-h7[opy[zH'',,<YGRK`i  nB  aBI\  HX  YFr   c                 :   \         P                  ! \        R R7       \        P                  ! R4      p\         P
                  P                  \        RV R\         P                  ! 4        24      pV P                  V4        \         P
                  P                  V4      pV^ 8:  d   \        R4      h\        V4      p. pV F  p	\         P
                  P                  W4      p
\        V
4       \        W4      pV
R,           p\        P                  ! W\4       \         P                   ! W4       VP#                  RV	RV
R	\         P
                  P                  V
4      R
\        V
4      RV/4       K  	  R	VR
VRV/ \         P
                  P%                  V4      '       d   \         P&                  ! V4       # #   \(         d     # i ; i   \         P
                  P%                  T4      '       d   \         P&                  ! T4       i i   \(         d     i i ; i; i)Tr   r  multi_upload_r  r  r   r  r   r  r  rD   r  )r   r   r  r   r   r   r   r  r  r  r  r  r  r  rF  r  r   r  r   r  r   )r  r  r  r  r  r  r  r  r  r  r  r  r  s   &&&&         r   save_file_to_multiple_targetsr    s   KK$t4MM/*Eww||0M%"))+2WXHx wwx(19566(#!H'',,{=Kk*.{IK$v-JLL.JJz/NNE8V[&"''//ZeJfhpr}  J  sK  MU  Wb  c  d " hY@	ww~~h''		(# ( 			ww~~h''		(# ( 		sC   C9G
 <;F99GG
H;H	H	HHHHc                 d    V \         9  d   R # \        V\        R,          \         V ,          R4      # )Nr'   rG  )rO  r  r  )r  r  s   &&r   save_japan_musicr    s2    ++0@PRefoRpr  A  Ar   c                    \        V 4      pV'       g   R # VP                  4       pRpW29   d&   VP                  V4      \        V4      ,           pWR  # VP	                  R4      '       d   V\        R4      R  # VP	                  R4      '       d   V\        R4      R  # RpWR9   d&   VP                  V4      \        V4      ,           pWR  # R # )N/media/images/media/images/zimages/z/images/)r1  r   r  r,  r*  )r-  safer   markerr?  marker2s   &     r   normalize_japan_image_relr    s    H%DJJLEFkk&!CK/Dz((C()**	""C	NO$$Gkk'"S\1Dzr   c                 	   \         P                  P                  \        R ,          RR4      p\         P                  ! VRR7       \
        P                  ! R4      p\         P                  P                  \        RV R24      p\         P                  ! \        RR7       V P                  V4       . . . rep \         P                  P                  V4      \        8  d,   \        R\         P                  P                  V4       24      h\        P                  ! VR	4      ;_uu_ 4       pVP                  4        Uu. uF  qP                  4       '       d   K  VNK  	  p	p\!        V	4      \"        8  d   \        R
\!        V	4       24      h\%        R V	 4       4      p
V
\&        8  d   \        RV
 24      hV	 EF  p\)        VP*                  4      p\         P                  P-                  VP*                  ;'       g    RP/                  RR4      4      pV'       g   VP1                  VR,           4       K~  VP2                  \4        8  d   VP1                  VR,           4       K  \7        V4      \8        9  d   VP1                  VR,           4       K  \;        V4      '       g   VP1                  VR,           4       EK  \         P                  P                  ! V.VP=                  R4      O5!  p\?        V4       \         P                  PA                  V4      '       d   VP1                  V4       \C        VR4       VR,           pVPE                  VR	4      ;_uu_ 4       p\E        VR4      ;_uu_ 4       p\F        PH                  ! VV4       RRR4       RRR4       \         P.                  ! W4       VP1                  V4       EK  	  RRR4        \         PJ                  ! V4       \O        T4      \O        T4      \O        T4      3# u upi   + '       g   i     L; i  + '       g   i     L; i  + '       g   i     Lr; i  \L         d     Lki ; i   \         PJ                  ! T4       i   \L         d     i i ; i; i)r'   rS   rd   Tr   r  japan_images_.zipzip_size_exceeded:r   too_many_files:c              3   N   "   T F  p\        ^ VP                  4      x  K  	  R# 5ir  rA  r   r  s   & r   r   (save_japan_images_zip.<locals>.<genexpr>%       $NSDNN%;%;rC  zip_uncompressed_size_exceeded:r   r%  r&  u,    — לא בתיקיית images/media/images    — גדול מדי    — סיומת לא נתמכת    — נתיב לא בטוחJAPAN_images_zipr   rD  N)(r   r   r   r  r   r   r   r  r  r  JAPAN_IMAGES_ZIP_MAX_BYTESr  rI  rJ  rK  r  r,  JAPAN_IMAGES_ZIP_MAX_FILESr  'JAPAN_IMAGES_ZIP_MAX_UNCOMPRESSED_BYTESr  r5  r   r   r  r  &JAPAN_IMAGES_ZIP_MAX_SINGLE_FILE_BYTESr6  JAPAN_IMAGE_EXTENSIONSr1  r+  r  r   r  r   rF  rO  r  r   r  )r  
image_rootr  tmp_ziprS  r  overwrittenrU  r  rV  total_uncompressedr  r   r  r  r  rY  s   &                r   save_japan_images_zipr    s=   gg.BJKK
T*MM/*Eggll/=t1LMGKK$t4w%'R{H(77??7#&@@1"''//'2J1KLMM__Wc**b&(kkmImd;;=TTmEI5z66 ?3u:,!?@@!$$N$N!N!$KK #BCUBV!WXX/>ww'')<)<"(E(EdC(PQNN4*X#XY>>$JJNN3)?#?@C=(>>NN3)J#JK',,NN4*G#GHjB399S>B!&)77>>&))&&s+(1CD#f_
WWT3''64
D3I3IT&&vt4 4J'

:.$3  +D	IIg (VG_f[.AAAK J8 4J3I''; +*H  			IIg 		s   6A2Q (P2;PPBP2<P2EP2P4PP4P2Q Q P2PPP/*P22Q	=Q QQR Q/.R /Q=:R <Q==R c                 t   \        V4      pV'       g   R # VP                  4       pV R8X  dC   VP                  R4      '       d
   VR,          # VR	9   g   VP                  R4      '       d   V# R # V R8X  dC   VP                  R4      '       d
   VR,          # VR
9   g   VP                  R4      '       d   V# R # R # )Nr(   zusa/:r  NNzmedia/usa-presentation/r'   zjapan/rq  zmedia/>   r.   rO   rG   >   r-   rn   rM   rK   )r1  r   r*  )rr   r-  r  r   s   &&  r   normalize_trip_package_relr  J  s    H%DJJLEu}F##8O ddhmhxhx  zS  iT  iTKwH%%8Oiimrm}m}  G  nH  nHKr   c                 	   V R9  d   R# \         V ,          p\        P                  ! VRR7       \        P                  ! R4      p\        P
                  P                  \        V P                  4        RV R24      p\        P                  ! \        RR7       VP                  V4       . . . rvp \        P
                  P                  V4      \        8  d,   \        R\        P
                  P                  V4       24      h\        P                  ! VR4      ;_uu_ 4       pVP                  4        U	u. uF  qP!                  4       '       d   K  V	NK  	  p
p	\#        V
4      \$        8  d   \        R	\#        V
4       24      h\'        R
 V
 4       4      pV\(        8  d   \        RV 24      hV
 EF  p	\+        W	P,                  4      p\        P
                  P/                  V	P,                  ;'       g    RP1                  RR4      4      pV'       g"   VP3                  VR,           V ,           4       K  V	P4                  \6        8  d   VP3                  VR,           4       K  \9        V4      pV\:        9  d   VP3                  VR,           4       K  \=        V4      '       g   VP3                  VR,           4       EK  \        P
                  P                  ! V.VP?                  R4      O5!  p\A        V4       \        P
                  PC                  V4      '       d    VP3                  V4       \E        W R24       VR,           pVPG                  V	R4      ;_uu_ 4       p\G        VR4      ;_uu_ 4       p\H        PJ                  ! VV4       RRR4       RRR4       \        P0                  ! VV4       VP3                  V4       EK  	  RRR4        \        PL                  ! V4       \Q        T4      \Q        T4      \Q        T4      3# u up	i   + '       g   i     L; i  + '       g   i     L; i  + '       g   i     Lr; i  \N         d     Lki ; i   \        PL                  ! T4       i   \N         d     i i ; i; i)r(   NTr   r  	_package_r  r  r   r  c              3   N   "   T F  p\        ^ VP                  4      x  K  	  R# 5ir  rA  r  s   & r   r   (save_trip_package_zip.<locals>.<genexpr>q  r  rC  r  r   r%  r&  u     — לא שייך לחבילת r  r  r  _package_zipr   rD  >   r(   r'   ))r  r   r   r   r   r   r   r  r   r  r  TRIP_PACKAGE_ZIP_MAX_BYTESr  rI  rJ  rK  r  r,  TRIP_PACKAGE_ZIP_MAX_FILESr  'TRIP_PACKAGE_ZIP_MAX_UNCOMPRESSED_BYTESr  r5  r   r   r  r  &TRIP_PACKAGE_ZIP_MAX_SINGLE_FILE_BYTESr6  TRIP_PACKAGE_EXTENSIONSr1  r+  r  r   r  r   rF  rO  r  r   r  )rr   r  r  r  r  rS  r  r  rU  r  rV  r  r  r   r  r  r  r  rY  s   &&                 r   save_trip_package_zipr  `  sR   ##$-KKKd+MM/*Eggll/DJJL>5'QU1VWGKK$t4w%'R{H(77??7#&@@1"''//'2J1KLMM__Wc**b&(kkmImd;;=TTmEI5z66 ?3u:,!?@@!$$N$N!N!$KK #BCUBV!WXX0}}Eww'')<)<"(E(EdC(PQNN4*L#Lt#ST>>$JJNN3)?#?@sm55NN3)J#JK',,NN4*G#GHkCCIIcNC!&)77>>&))&&s+(61FG#f_
WWT3''64
D3I3IT&&vt4 4J'

:v.$3  +D	IIg (VG_f[.AAAK J8 4J3I''; +*H  			IIg 		s   0A2Q "P85PPB=P8EP8$P%9PP%5P8Q Q P8P"P%%P50P88Q	Q QQRQ54R5R RRRc                 z    T ;'       g    R P                  4       P                  4       p V R9   d   R# V R9   d   R# R # )r   r(   r'   >   USr(   AMERICA>   JPr'   )r   r  )rr   s   &r   normalize_netlify_trip_keyr    s9    JJB%%'D''r   c                     \        V 4      p \        P                  ! R 4      pV R8X  d   RV R2# V R8X  d   RV R2# RV R2# )r  r(   "USA2027_NETLIFY_DEPLOY_FROM_ADMIN_r  r'   $JAPAN2026_NETLIFY_DEPLOY_FROM_ADMIN_NETLIFY_DEPLOY_)r  r   r   )rr   r  s   & r   netlify_output_filenamer    sU    %d+DMM/*Eu}3E7$??w5eWDAAUG4((r   c                     \         P                  P                  T ;'       g    R 4      P                  4       pV\        9   d   R# V\
        9   d   R# \        V 4      \        9   # )r   FT)r   r   r   r   NETLIFY_SKIP_FILESNETLIFY_CONTROL_FILESr6  NETLIFY_STATIC_EXTENSIONS)r   r   s   & r   netlify_is_static_filer    sM    77DJJB'--/D!!$$D>666r   c                 t  a T ;'       g    R P                  RR4      P                  R4      p V P                  4       oVR8X  du   \        P                  P                  S4      \        9   d   R# \        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      '       d   R# R# )r   r%  r&  ./USA_NETLIFY_PHONEFc              3   F   <"   T F  pSP                  V4      x  K  	  R # 5ir   )r*  )r   r  lows   & r   r   .netlify_should_copy_relpath.<locals>.<genexpr>  s     R4Q&s~~f%%4Qs   !T)	r   r  r   r   r   r   NETLIFY_USA_EXCLUDED_FILESr  NETLIFY_USA_EXCLUDED_PREFIXES)r  profiler  s   &&@r   netlify_should_copy_relpathr     s~    99"

dC
(
/
/
5C
))+C%%77C $>>3R4QR333R4QRRRr   c                 
   . p\         P                  P                  V 4      '       g   \        V 4      h\         P                  ! V 4       EF  w  rVpV Uu. uF8  qP                  4       \        9  g   K  VP                  R 4      '       d   K6  VNK:  	  upVR&   \         P                  P                  WP4      p	V	R 8X  d   Rp	V EF&  p
\         P                  P                  WZ4      p\        V4      '       g   K6  V	'       d    \         P                  P                  W4      MT
pVP                  RR4      p\        WR7      '       g   K  TpV'       d    VP                  R4      R,           V,           p\        V4      pV'       g   K  \         P                  P                  ! V.VP                  R4      O5!  p\!        V4       \"        P$                  ! W4       VP'                  V4       EK)  	  EK  	  \)        VR R7      # u upi )r(  NNNr   r%  r&  r  c                 "    V P                  4       # r   r   r  s   &r   r  *netlify_copy_static_tree.<locals>.<lambda>  s
    	r   r  )r   r   r  r  walkr   NETLIFY_SKIP_DIRSr*  r  r   r  r   r   r   r1  r+  r  rF  r  r  r  )source_roottarget_rootr  r  copieddirpathdirnames	filenamesdrel_dirr   r  
source_relr  r  r%  s   &&&&            r   netlify_copy_static_treer2    sw   F77==%%,,(*(<$9"*k(Qggi?P.PqYZYeYefiYjqq(k''//'7c>GD'',,w-C)#..8?g4TJ#++D#6J.zKKCll3'#-3#C(D'',,{=TZZ_=Cc"LL"MM$#  )=. &122- ls   H 3H H c                    a \         P                  ! R \         P                  \         P                  ,          4      pV3R lpTP	                  Y0;'       g    R4      # )zV(?P<attr>\b(?:href|src|poster|data-href)\s*=\s*)(?P<quote>[\"'])(?P<url>.*?)(?P=quote)c                    < V P                  R 4      pS! V4      pVf   V P                  ^ 4      # V P                  R4      V P                  R4      ,           V,           V P                  R4      ,           # )r  attrquoter*  )r
  r  new_urlreplacers   &  r   repl#netlify_replace_attrs.<locals>.repl  s^    kk% 3-?;;q>!{{6"U[[%99GCekkRYFZZZr   r   )r  rN  r  r  r(  )r  r8  attr_rer9  s   &f  r   netlify_replace_attrsr<    sG    jjrtvtxtx{}{{t  AG[ ;;t__"--r   c                     \        T ;'       g    R 4      P                  4       P                  4       pRV9   ;'       g-    RV9   ;'       g     RV9   ;'       g    RV9   ;'       g    RV9   # )r   z$beautiful-kitsune-dafd66.netlify.appmoneyappz	/moneyappztrip-budgetzvacation-budget)r   r   r   )r  us   & r   netlify_is_budget_urlr@    s{    CII2$$&A.!3 	" 	"?	" 	"!	" 	" A	" 	" !r   c                 f  a  \        S 4      o T;'       g    R pV 3R lp\        W#4      pS R8X  dR   \        P                  ! RRV\        P                  R7      p\        P                  ! RRV\        P                  R7      pMWS R8X  dQ   \        P                  ! RR	V\        P                  R7      p\        P                  ! R
R	V\        P                  R7      p\        P                  ! R\
        V\        P                  R7      p\        P                  ! R\
        V\        P                  R7      pV# )r   c                    < \        T ;'       g    R 4      P                  4       pVP                  4       p\        V4      '       d   \        # SR8X  d
   RV9   d   R# SR8X  d   RV9   g   RV9   d   R# R# )	r   r(   zusa2027-presentation/USA/usa2027-presentation.htmlr'   rK   rM   #./japan-flight-intro.html?from=tripN)r   r   r   r@  NETLIFY_BUDGET_APP_URL)r  r?  r  rr   s   &  r   attr_replacer.netlify_patch_trip_html.<locals>.attr_replacer  sg    		rN  "ggi ##))5=3s:37? 9S @D[_bDb8r   r(   zEhttps?://[^'\"\s<>]+/USA/usa2027-presentation\.html(?:\?[^'\"\s<>]*)?rC  r  z@(?<![\w./-])(?:\./)?usa2027-presentation\.html(?:\?[^'\"\s<>]*)?r'   zEhttps?://[^'\"\s<>]+/JAPAN/japan-flight-intro\.html(?:\?[^'\"\s<>]*)?rD  zChttps?://[^'\"\s<>]+/JAPAN/japan-experience\.html(?:\?[^'\"\s<>]*)?zAhttps?://[^'\"\s<>]+/Moneyapp/?(?:index\.html)?(?:\?[^'\"\s<>]*)?Bhttps?://beautiful-kitsune-dafd66\.netlify\.app(?:/index\.html)?/?)r  r<  r  r(  r  rE  )rr   r  rY  rF  s   f&  r   netlify_patch_trip_htmlrI    s^   %d+D??D	 !5Du}vv^  aA  CG  OQ  OS  OS  TvvY[{  ~B  JL  JN  JN  O	vv^  aF  HL  TV  TX  TX  Yvv\  _D  FJ  RT  RV  RV  W66VXnpt|~  }A  }A  BD66WYoqu}  ~B  ~B  CDKr   c           	      D   . p\        V4      p\        P                  ! V 4       EF4  w  r4pV EF&  p\        V4      R9  d   K  \        P                  P                  W64      p \        VRRRR7      ;_uu_ 4       pVP                  4       p	RRR4       X	p
VR8X  dR   \        P                  ! RRV	\        P                  R	7      p	\        P                  ! R
RV	\        P                  R	7      p	MWVR8X  dQ   \        P                  ! RRV	\        P                  R	7      p	\        P                  ! RRV	\        P                  R	7      p	\        P                  ! R\        V	\        P                  R	7      p	\        P                  ! R\        V	\        P                  R	7      p	\        P                  P                  Wp4      P                  RR4      R9   d   \        W4      p	W8w  ds   \        VRRRR7      ;_uu_ 4       pVP                  V	4       RRR4       VP!                  \        P                  P                  Wp4      P                  RR4      4       EK&  EK)  	  EK7  	  \%        VR R7      #   + '       g   i     EL; i  + '       g   i     L}; i  \"         d    h i ; i)r"   r   r   r   r  Nr(   z,https?://work-room\.tail978ec2\.ts\.net/USA//USA/r  zhttps?://[^'\"\s<>]+/USA/r'   z.https?://work-room\.tail978ec2\.ts\.net/JAPAN/r  zhttps?://[^'\"\s<>]+/JAPAN/zBhttps?://work-room\.tail978ec2\.ts\.net/Moneyapp/?(?:index\.html)?z/https?://[^'\"\s<>]+/Moneyapp/?(?:index\.html)?r%  r&  r   r   r  c                 "    V P                  4       # r   r   r%  s   &r   r  .netlify_patch_all_html_files.<locals>.<lambda>,  s
    r   r     r#   r"   >   r-   USA/index.html)r  r   r'  r6  r   r   r   r9  r  r(  r  rE  r  r   rI  r  r  r   r  )
build_rootrr   patchedr,  r  r.  r   r   r   rY  rC  s   &&         r   netlify_patch_all_html_filesrR    s   G%d+D!#!4ID~%6677<<.D$giHHB779D I5=66"QSZ\`hjhlhlmD66">UWUYUYZDW_66"SUY[_gigkgklD66"@$TVTXTXYDvvce{  ~B  JL  JN  JN  OvvPRhjnvxvzvz{77??44<<T3GKkk24>D#dC'2FF" GNN277??4#D#L#LTSV#WX $'  "54 '233) IHH GF  s>   #J:I+	E-J8I?	
AJ+I<6	J?J
JJc                     \         P                  P                  V R 4      pRp\        VRRRR7      ;_uu_ 4       pVP	                  V4       RRR4       R #   + '       g   i     R # ; i)r-   u  <!DOCTYPE html>
<html lang="he" dir="rtl"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>טיול ארצות הברית 2027</title><meta http-equiv="refresh" content="0; url=/USA/"><script>location.replace('/USA/');</script></head><body style="font-family:Arial,sans-serif;direction:rtl;text-align:center;padding:40px"><h1>טיול ארצות הברית 2027</h1><p>מעביר לקובץ הטיול...</p><p><a href="/USA/">פתח טיול ארה״ב</a></p></body></html>r   r   r   r  N)r   r   r   r   r  )rP  r   r	  r   s   &   r   netlify_write_usa_root_indexrT  /  sP    77<<
L1DVD	dC'2	6	6"
 
7 
7	6s   AA'	c                 4   \         P                  P                  V R 4      p\         P                  P                  V4      '       g   R# \	        VRRRR7      ;_uu_ 4       pVP                  4       pRRR4       RX9   g   RV9   d   R# \        P                  ! R	R
V^\        P                  R7      pWC8X  d
   RV,           p\	        VRRRR7      ;_uu_ 4       pVP                  V4       RRR4       R#   + '       g   i     L; i  + '       g   i     R# ; i)r-   Fr   r   r   r  Nzid="top"zid='top'z(<body\b[^>]*>)z<\1\n<div id=\"top\" style=\"position:absolute;top:0\"></div>r   z5<div id="top" style="position:absolute;top:0"></div>
r   r   r  T)
r   r   r   rg  r   r9  r  r(  r  r  )rP  r   r   rY  r  s   &    r   netlify_ensure_japan_top_anchorrV  8  s    77<<
L1D77>>$	dC')	<	<wwy 
=TZ4/vv(*ikowx  AC  AE  AE  FHKdR	dC'2	6	6"
 
7 
=	< 
7	6s   C3D3D	D	c                D   \         P                  P                  V R4      p\         P                  P                  V4      '       d   R# RP                  . R
O4      p\	        VRRRR7      ;_uu_ 4       pVP                  V4       RRR4       R	#   + '       g   i     R	# ; i)zLEnsure USA Netlify bundles have a root control file for the /USA entry path.rE   Fru  r   r   r   r  NT)z/USA /USA/ 301z/USA/* /USA/:splat 200r   r   r   r   rg  r   r  rP  r   	redirectsr   s   &   r   netlify_write_usa_redirectsr[  H  st    77<<
L1D	ww~~d		  I
 
dC'2	6	6"
 
7 
7	6   2BB	c                D   \         P                  P                  V R4      p\         P                  P                  V4      '       d   R# RP                  . R
O4      p\	        VRRRR7      ;_uu_ 4       pVP                  V4       RRR4       R	#   + '       g   i     R	# ; i)zjEnsure Japan Netlify bundles include the same redirect compatibility file used by the manual Netlify ZIPs.rE   Fru  r   r   r   r  NT)z;/JAPAN/japan-flight-intro.html /japan-flight-intro.html 200z7/JAPAN/japan-experience.html /japan-experience.html 200z/JAPAN/ /index.html 200z/JAPAN/* /index.html 200z5/japan-flight-intro.html /japan-flight-intro.html 200z1/japan-experience.html /japan-experience.html 200r   rX  rY  s   &   r   netlify_write_japan_redirectsr^  W  st    77<<
L1D	ww~~d		  I 
dC'2	6	6"
 
7 
7	6r\  c                 
   \        T;'       g    R 4      P                  4       pV'       d/   VP                  R4      '       g   VP                  R4      '       d   R# VP                  4       pVP                  R4      '       d   R# VP	                  R^4      ^ ,          P	                  R^4      ^ ,          P                  4       pV'       g   R# VP                  R4      '       d   VP                  R4      pMk\
        P                  P                  V4      p\
        P                  P                  \
        P                  P                  Wu4      4      P                  RR4      pVP                  R4      pV'       d   VR8X  d   RpV# )	r   r  r  Nr&  r%  r(  r-   )
r  r  mailto:tel:sms:javascript:r  r  zabout:r  )r   r   r*  r   r+  r   r   r   normpathr   r   )rP  html_relraw_urlr  r  cleanr  r   s   &&&     r   netlify_local_ref_to_pathrh  j  s   
gmm

"
"
$C#..%%)<)<
))+C
~~yzzIIc1a &&sA.q1779Ekk#wwx(ggrww||D89AA$L
))C.C#*Jr   c                    \        V4      pV'       g   R # \        P                  P                  ! V .VP	                  R4      O5!  p\        P                  P                  V4      '       d   R# \        P                  P                  V4      '       dF   \        P                  P                  \        P                  P                  VR4      4      '       d   R# VP                  R4      '       dY   \        P                  P                  \        P                  P                  ! V .VP	                  R4      ORN5!  4      '       d   R# R # )Fr&  Tr-   )r1  r   r   r   r+  rg  r  r  )rP  r  r  r   s   &&  r   netlify_path_existsrj    s    C D77<<
5TZZ_5D	ww~~d	ww}}Trww~~bggll4.NOO}}SbggnnRWW\\*-etzzRU-eXd-effr   c                   Rp\         P                  P                  ! V .VP                  R4      O5!  p. . . rep\         P                  P	                  V4      '       g   RRRRV,           .R. R. R	. /# \         P
                  ! V4       F  w  rxp	\        V	\        P                  R
7       F  p
\         P                  P                  Wz4      p\        V
4      pV\        9  d   K:  \         P                  P                  W4      P                  RR4      p\         P                  P                  V4      pV^ 8:  d   VP                  RV,           4       VP                  RVRV/4       K  	  K  	  \        P                   ! R\        P"                  4      p. pTP%                  \        T;'       g    R4      4       F  p\'        V RV4      pV'       g   K  VP)                  R4      '       g   VP                  RV,           4       VP                  V4       \+        W4      '       d   Km  VP                  RV,           R,           V,           4       K  	  V'       d   V'       g   VP                  R4       V Uu0 uF  pVR,          kK  	  pp\        \-        V4      4       FD  pVV9  g   K  VP)                  VR,           4      '       g   K,  VP                  RV,           4       KF  	  \-        V4      p\        VV,
          4      pV'       d(   VP                  RRP                  V4      ,           4       RV'       * R\        \-        V4      4      R\        \-        V4      4      RVR\/        V4      R	\        \-        V4      4      RV/# u upi )af  Discover and validate every USA phone-presentation audio asset dynamically.

The music folder, not a fixed two-file list, is the source of truth for packaged
audio inventory. Every local audio URL referenced by the presentation must exist.
Every supported audio file present in the folder is counted, hashed later by the
ZIP verifier, and must be non-empty.
z USA/media/usa-presentation/musicr&  r  FrZ  u?   חסרה תיקיית המוזיקה של מצגת ארה״ב: r  r  
referencedr  r%  u   קובץ מוזיקה ריק: r   r  zO[\"']([^\"']+\.(?:mp3|wav|m4a|aac|flac|ogg|opus|wma|webm)(?:[?#][^\"']*)?)[\"']r   USA/usa2027-presentation.htmlz!USA/media/usa-presentation/music/u_   המצגת מפנה לקובץ אודיו מחוץ לתיקיית המוזיקה התקנית: u6   קובץ מוזיקה שמוצהר במצגת חסר:  => u   המצגת מצהירה על מוזיקה אך תיקיית המוזיקה אינה מכילה קובצי אודיו תקיניםuY   קובץ מוזיקה מוצהר אינו חלק ממלאי תיקיית המוזיקה: us   קובצי מוזיקה קיימים בתיקייה אך אינם מזוהים כהפניה ישירה במצגת: , r  unreferenced)r   r   r   r+  r  r'  r  r   r   r6  r  r  r   r  r  r  rN  r  findallrh  r*  rj  r  r,  )rP  presentation_textmusic_rel_root
music_rootrZ  r  r  r,  r  namesr   fullr  r  r  quoted_audio_rerl  r.  r  packagedreferenced_setrp  s   &&                    r   !netlify_discover_usa_music_assetsrz    s&    8NjE>+?+?+DEJ "beF77==$$eX(ilz(z'{  ~H  JL  NU  WY  [g  ik  l  	lWWZ0E5cii0D77<<.D4.C..''//$3;;D#FC77??4(Dqy>DELL&#vt45 1 1 jj!suwuyuyzOJ&&s+<+B+B'CD'
4SUXY~~ABBOO}  AD  D  E#":33MMRUXX[aadggh E %  Z  	[)./VH/c*o&h3>>.32F#G#GMMux{{| ' _N(^34L  N  QU  QZ  QZ  [g  Qh  h  	i 	&j&V%F3x=)UfS_-  0s   4Nc                   a- \        V4      p. . . rCpR .pVR8X  d   V. R7O,          pMVR8X  d   V. R8O,          pV F.  p\        W4      '       d   K  VP                  RV,           4       K0  	  \        P                  ! R\        P
                  4      p\        P                  ! V 4       EF  w  rp
V
 EF  p\        V4      R99  d   K  \        P                  P                  W4      p\        P                  P                  W4      P                  RR4      p\        VRR	R
R7      ;_uu_ 4       pVP                  4       pRRR4       RX9   g   RV9   d   VP                  RV,           4       \        4       p\        P                   ! RV\        P
                  4      pV'       d    \"        P$                  ! VP'                  ^4      4      pVP)                  R4      ;'       g    .  Uu0 uF^  p\+        V\,        4      '       g   K  \/        VP)                  R4      ;'       g    R4      P                  RR4      P1                  R4      kK`  	  ppVP5                  V4       EF  p\7        WV4      pV'       g   K  \        P                  P9                  V4      ^,          '       gp   VP;                  R4      '       gY   \        P                  P                  ! V .VP=                  R4      O5!  p\        P                  P?                  V4      '       g   K  VP                  VR,           V,           4       \        W4      '       d   K  \/        T;'       g    R4      P                  RR4      P=                  R^4      ^ ,          P=                  R^4      ^ ,          P1                  R4      p\        P                  P9                  V4      ^ ,          PA                  4       o-\C        V-3R lV 4       R4      pV'       d   \7        WV4      MRpV'       d   \        V V4      '       d   EK  VP                  RV,           R,           V,           R,           V,           4       EK  	  EK  	  EK  	  VR8X  Ed   Rp\        P                  P                  V RR4      pR.pV F.  p\        W4      '       d   K  VP                  RV,           4       K0  	  \        P                  PE                  V4      '       EdA   \        VRR	R
R7      ;_uu_ 4       pVP                  4       pRRR4       \G        V X4      pTPI                  VP)                  R4      ;'       g    . 4       TPI                  VP)                  R4      ;'       g    . 4       VP                  RR4      pR V9   d   VP                  R!V,           4       R"VPA                  4       9   d   VP                  R#V,           4       \        P                  ! R$\        P
                  4      pVP!                  V4      p V '       g   VP                  R%4       M^V P'                  ^4      P=                  R^4      ^ ,          P=                  R^4      ^ ,          p!V!R&8w  d   VP                  R'V!,           4       \        P                   ! R(V\        P
                  4      p"V"'       g   VP                  R)4       MV"P'                  ^ 4      p#R:p$V$ F$  p%V%V#9  g   K  VP                  R*V%,           4       K&  	  R;p&V& F$  p'V'V#9   g   K  VP                  R+V',           4       K&  	  V#\J        8w  d   VP                  R,4       \        P                  P                  \L        R,          R4      p(\        P                  PE                  V(4      '       g   VP                  R-4       M}\        V(RR	R
R7      ;_uu_ 4       pVP                  4       p)RRR4       \O        X)V4      p*V*P)                  R.4      '       g+   TPI                  V*P)                  R4      ;'       g    . 4       R< F/  p+\        V V+4      '       g   K  VP                  R/V+,           4       K1  	  R.V'       * R\Q        \        V4      4      R\Q        \        V4      4      R0\S        V4      /p,VR8X  d]   R1\U        4       9   dN   R2XP)                  R2^ 4      R3VP)                  R3. 4      R4VP)                  R4. 4      R5VP)                  R5. 4      /V,R6&   V,#   + '       g   i     EL; iu upi   \2         d    TP                  RT,           4        ELi ; i  + '       g   i     EL:; i  + '       g   i     EL; i)=r-   r(   rm  r'   u   חסר קובץ חובה: 9\b(?:href|src|poster|data-href)\s*=\s*[\"']([^\"']+)[\"']r%  r&  r   r   r   r  Nzwork-room.tail978ec2.ts.net
tail978ec2u2   נשאר קישור לשרת הפרטי בתוך: S<script\b[^>]*\bid=["\']usa2027-inline-media-manifest["\'][^>]*>([\s\S]*?)</script>r  r  r   u>   Manifest מדיה מוטמע אינו JSON תקין בתוך:  -> r  r  c              3      <"   T FX  p\         P                  P                  V4      ^ ,          P                  4       S8X  g   K>  \	        V4      \
        9   g   KT  Vx  KZ  	  R# 5ir  )r   r   r4  r   r6  r  )r   r?  raw_stems   & r   r   )netlify_validate_build.<locals>.<genexpr>  sd       +a6IRWWM]M]^_M`abMcMiMiMkowMw1  }E  FG  }H  L`  }`116Is   ;A#A#
A#   קישור פנימי חסר: rn  rO   z,USA/media/usa-presentation/images/budget.jpgu0   חסר קובץ מצגת ארה״ב עדכני: rZ  r  rI   uF   מצגת הפלאפון מפנה בטעות לתיקיית images-tv: rG   u=   מצגת הפלאפון מכילה הפניה למצגת TV: zR<section\b[^>]*data-key=['\"]budget['\"][\s\S]*?<img\b[^>]*src=['\"]([^'\"]+)['\"]uL   לא נמצא שקף תקציב עם תמונת budget במצגת ארה״בz(media/usa-presentation/images/budget.jpguR   שקף התקציב אינו משתמש בתמונת התקציב המשותפת: z@<section\b[^>]*data-key=[\'"]budget[\'"][^>]*>[\s\S]*?</section>u@   לא נמצא שקף התקציב המלא במצגת ארה״בub   שקף התקציב של Netlify אינו גרסת ללא-סכומים; חסר מלל מאושר: uH   שקף התקציב של Netlify עדיין מכיל סכום אסור: uc   שקף התקציב ב-ZIP אינו זהה לשקף ללא-הסכומים המאושר של Netlifyu_   מצגת השרת הפרטי חסרה ולכן לא ניתן לאמת סנכרון עם Netlifyr  uL   קובץ TV הוכנס בטעות לחבילת Netlify של הפלאפון: checked_refsmusic_inventoryr  r  rl  rp  rR   )rO  rm  rE   )rK   rM   rE   rN  )u   תקציב — בלי דרמהuD   השקף הזה משאיר את המספרים בקובץ הטיולud   המסגרת התקציבית מנוהלת בקובץ הטיול ובאפליקציית התקציבuK   את המספרים המדויקים משאירים למעקב התקציב)z$81,297u
   ₪243,890z$51,430u
   ₪154,290z$11,622z$10,000)z USA/usa2027-presentation-tv.htmlzUSA/usa2027-tv.html)+r  rj  r  r  rN  r  r   r'  r6  r   r   r  r   r   r9  r  r  r   rv  r  r   r   r   r   r  r   rq  rh  r4  r  r+  r  r   nextrg  rz  r  USA_NETLIFY_BUDGET_SLIDE_HTMLr  $_v57_validate_dual_presentation_syncr  r,  locals).rP  rr   rZ  r  r  requiredr  r;  r,  r  r.  r   r   re  r   rY  declared_media_urlsinline_matchinline_payloadr  rf  candidate_dirraw_normactive_sibling
active_relpresentation_relr'  required_phone_assetsrr  r  normalized_textbudget_ref_rebudget_match
budget_srcbudget_section_matchbudget_sectionrequired_budget_textsrequired_textforbidden_budget_textsforbidden_textprivate_presentation_pathprivate_presentation_text	dual_sync	forbiddenr9  r  s.   &&                                           @r   netlify_validate_buildr    s;   %d+D%'RlF~Hu}UU	VV":33MM6<=  jjUWYW[W[\G!#!4ID~%6677<<.Dwwt8@@sKHdC')DDwwy E,48LRU]]^"%%99%{  ~B  DF  DH  DH  ILo%)ZZ0B0B10E%FNlzl~l~  @G  mH  mN  mN  LN  mN  +g  mNfg  S]  ^_  ae  Sf+a3quuU|/A/Ar+B+J+J4QT+U+\+\]`+a  mN'  +g #??40/
gNww'',Q//S8I8I$&GGLL$Mciin$MM77==77 ##Hv$5$;<*:;;  #7==b199$DJJ3qQRSTZZ[^_`abcdkklopH!ww//9!<BBDH%)  +a6I  +a  cg  &hNdr!::Q_!`x|J!&9*j&Q&Q MM"BX"MPV"VY`"`ci"ilo"op' 1#  "5L u}:GGLLU<WX:!
 )C&z77PSVVW ) 77>>+,,'wyQQUW$&GGI! R?
L]^OMM/--h7==2>OOO//
;AArB/77cBO2oEfiyyz-1F1F1HH]`ppqJJ'|  A  C  C  DM(//@Llm)//288a@CII#qQRST
!KKMM"v  zD  #D  E#%99-p  sB  DF  DH  DH  $I '`a!5!;!;A!>)% &;M$N:  'K  N[  '[  \ &; *r&&<N%7&p  tB  'B  C '= "%BBMM  #H  I(*WU^E`(a%77>>";<<  A3S7S\]]ac02	- ^@AZ\mn	 }}T**MM)--"9"?"?R@TI":y99loxxy U J&V*=z6RUV^R_K`bpru  wC  sD  EFu}*fh6_((!4_(("5/--lB?O//C	
{ MM EDD +g  oMM"bem"mno@ RQQT ^]]sZ   -d	%<d"d'dd!*dde	edd#eee	e-	c                    \        V4       \        P                  P                  V4      '       d   \        P                  ! V4       . p\
        P                  ! VR \
        P                  R7      ;_uu_ 4       p\        P                  ! V 4       F  w  rEp\        VR R7       F  p\        P                  P                  WG4      p\        P                  P                  W4      P                  RR4      p	\        V	4      p
V
'       g   Kf  VP                  W4       VP                  V
4       K  	  K  	  RRR4       V#   + '       g   i     T# ; i)r   )compressionc                 "    V P                  4       # r   r   r%  s   &r   r  (zip_directory_contents.<locals>.<lambda>M  s
    	r   r  r%  r&  N)r  r   r   r   r  rI  rJ  ZIP_DEFLATEDr'  r  r   r  r   r1  r  r  )
source_dirrP  r  rU  r,  r  r.  r   rv  r  r  s   &&         r   zip_directory_contentsr  F  s    h	ww~~h
		(E	3G4H4H	I	IR%'WWZ%8!G	y.ABww||G2ggood7??cJ',$T" C &9 
J L 
J	I Ls   8B;D==E	c                    \        V 4      p V R)9  d   \        R4      h\        V ,          p\        P                  P                  V4      '       g   \        V4      h\        P                  ! R4      p\        P                  ! \        RR7       \        P                  ! \        RR7       \        P                  P                  \        V P                  4       R,           V,           4      p\        P                  P                  V4      '       d   \        P                   ! V4       \        P                  ! VRR7       . pV R 8X  d5   VP#                  \%        WR RR7      4       \'        V4       \)        V4       M2VP#                  \%        WRR	7      4       \+        V4       \-        V4       \/        W04      pV R 8X  Ed   \        P                  P                  VR R
4      p\        P                  P1                  V4      '       g   \3        R4      h\5        VRRRR7      ;_uu_ 4       pVP7                  4       pRRR4       \8        P:                  ! R\8        P<                  4      p	V	P?                  R X^R7      w  rV
^8w  d   \3        R4      h\5        VRRRR7      ;_uu_ 4       pVPA                  V4       RRR4       VPC                  R4       \E        W04      pVPG                  R4      '       g;   \3        RRP                  VPG                  R4      ;'       g    . 4      ,           4      h\        P                  P                  \        \I        V 4      4      p\K        W<4      pRT RTRTRTR \M        V4      R!\M        V4      R"TR#TR$\N        R%V R 8X  d   R&MR'R(\        P                  P                  V4      '       d    \        P                  PQ                  V4      M^ /pW3#   + '       g   i     EL; i  + '       g   i     ELH; i)*r(   trip_not_supportedr  Tr   r  r  )r  r  r   r  rO    usa_netlify_presentation_missingr   r   strictr  Nzm<section\b[^>]*class=[\'"][^\'"]*\bbudget\b[^\'"]*[\'"][^>]*data-key=[\'"]budget[\'"][^>]*>[\s\S]*?</section>c                     \         # r   )r  )_ms   &r   r  *build_netlify_deploy_zip.<locals>.<lambda>}  s    4r   r  ,usa_netlify_budget_slide_full_replace_failedr   r  z=USA/usa2027-presentation.html#budget-slide-approved-no-amountr  netlify_validation_failed:
ru  rZ  rr   r)  rP  rP  r  r+  patched_html
validationbudget_app_urlpresentation_linkrC  rD  
size_bytes>   r(   r'   ))r  r  r  r   r   r  r  r   r   r   NETLIFY_BUILD_DIRNETLIFY_EXPORT_DIRr   r   r   rF  r  r  r2  rT  r[  rV  r^  rR  rg  r  r   r9  r  rN  r  r!  r  r  r  r   r  r  r,  rE  r  )rr   r)  r  rP  r+  rQ  r'  r   presentation_htmlbudget_slide_rer  r  rP  r  r>  s   &              r   build_netlify_deploy_zipr  X  s   %d+D##-..$-K77==%%,,MM/*EKK!D1KK"T2/1Ce1KLJ	ww~~j!!j!KK
T*Fu}.{u^qrs$Z0#J/.{rRS'
3%j1*:<Gu}GGLLU<WXww~~/00ABB#S78LLPR "	 M **|DD
 $3#7#74 $8 $
 
 A:MNN#S7BGG2HH&' HVW'
9J>>$9DIIjnnU]F^FdFdbd<eeffww||.0G0MNH":8E{jHU#f+j0=Ty277>>(3K3Kbggooh/QRG I MLL HGGs   &O!$O5!O2	5P	c                    \         P                  P                  V 4      pR V RV/pV'       d   \         P                  P                  V 4      '       d    \         P                  P	                  V 4      VR&   \
        P                  ! R\
        P                  ! \         P                  P                  V 4      4      4      VR&   \        V 4      R,          VR&   V# V#   \         d   p\        T4      TR&    Rp?T# Rp?ii ; i)	r   r   r  r   mtimer  r  rp  N)r   r   r   rg  r  r   r   	localtimer   r  r   r~  )r   r   r  r  s   &   r   describe_pathr    s    WW^^D!FD(F+D"''..&&	&77??40DL MM*=t~~bggN^N^_cNd?efDM(.s3DN K4K  	& IDMK	&s   BC C>%C99C>c                     ^ p\         P                  P                  V 4      '       g   ^ # \         P                  ! V 4       F.  w  r4pV F"  pVe   \	        V4      V9   g   K  V^,          pK$  	  K0  	  V# r   )r   r   r  r'  r6  )r  
extensionsrj  r,  r  r.  r   s   &&     r   count_filesr    s_    E77==!#ID!Xd^z%A
  "/ Lr   c                    . p\         P                  P                  V 4      '       g   V# \         P                  ! V 4       F  w  r4pV Fx  pVe   \	        V4      V9   g   K  \         P                  P                  W64      p\         P                  P                  Wp4      P                  RR4      pVP                  V4       Kz  	  K  	  \        VR R7      # )Nr%  r&  c                 "    V P                  4       # r   r   r%  s   &r   r  %list_relative_files.<locals>.<lambda>  s
    qwwyr   r  )
r   r   r  r'  r6  r   r  r   r  r  )	r  r  r  r,  r  r.  r   rv  r  s	   &&       r   list_relative_filesr    s    E77==!#ID!Xd^z%Aww||G2ggood199$DS!	  "/ %011r   c                    \        T ;'       g    R 4      P                  4       P                  RR4      pVP                  R^4      ^ ,          P                  R^4      ^ ,          pVP	                  R4      '       d   VR,          pK"  V# )r   r%  r&  r  r  r  :r  NN)r   r   r   r+  r*  )r   ri  s   & r   normalize_web_pathr    sm    

O!!#++D#6EKKQ"((a03E


4
 
 b	Lr   c                
   T ;'       g,    \         P                  P                  \        R,          R4      p \         P                  P                  \        R,          RR4      p\	        V\
        4      pRV R\         P                  P                  V 4      R\        V4      R^ R	^ R
^ R^ R^ R^ R^ R^ R^ R. R. R. /pVR,          '       g   VR,          P                  R4       V#  \        V RRRR7      ;_uu_ 4       pVP                  4       pRRR4       \        P                  ! RX\        P                  4       Uu. uFH  qwP!                  ^4      P#                  4       '       g   K)  TP!                  ^4      P#                  4       NKJ  	  ppT'       gy   \        P                  ! RT\        P                  4       Uu. uFH  qwP!                  ^4      P#                  4       '       g   K)  TP!                  ^4      P#                  4       NKJ  	  pp. p	. p
. p. pT F  p\%        T4      pTP'                  R4      '       d    T	P                  T\        R4      R 4       KD  TP'                  R4      '       d   T
P                  T4       Kn  TP'                  R4      '       g   TP'                  R 4      '       d   TP                  T4       K  TP                  T4       K  	  \)        \+        T	4      R! R"7      pT Uu/ uF  pTP-                  4       TbK  	  ppT Uu0 uF  pTP-                  4       kK  	  ppT Uu. uF  pTP-                  4       T9  g   K  TNK  	  ppT Uu. uF  pTP-                  4       T9  g   K  TNK  	  ppTP/                  R\        T4      R	\        T	4      R
\        T
4      R\        T4      R\        T4      R\        T4      R\        T4      R\        T4      R\        \        P0                  ! R#T4      4      RTR$,          RTR$,          /4       TR,          ^ 8X  d   TR,          P                  R%4       TR,          '       d   TR,          P                  R&4       TR,          '       d   TR,          P                  R'4       T#   + '       g   i     EL; i  \         d5   pTR,          P                  R\        T4      ,           4       Tu Rp?# Rp?ii ; iu upi u upi u upi u upi u upi u upi )(zQCount images that Japan experience actually uses, not just files in media/images.r'   rM   rS   rd   r'  presentation_existsfolder_imagesimage_slidesexternal_image_usesembedded_image_usesremote_image_usesother_src_usesunique_external_imagesmissing_external_imagesunused_folder_imageschapter_slidesnotesmissing_external_listunused_folder_listuy   קובץ המצגת japan-experience.html לא נמצא, לכן נספרו רק קבצים בתיקיית התמונות.r   r   r  r  Nu8   לא ניתן לקרוא את קובץ מצגת יפן: z"["\']src["\']\s*:\s*(["\'])(.*?)\1z\bsrc\s*:\s*(["\'])(.*?)\1r  z
data:imager  r  c                 "    V P                  4       # r   r   r%  s   &r   r  3analyze_japan_presentation_images.<locals>.<lambda>  s
    !'')r   r  z["\']chapter["\']\s*:\s*true:N(   Nu\   לא נמצאו src בשקפי מצגת יפן. ייתכן שמבנה המצגת השתנה.uc   יש תמונות שהמצגת מבקשת אבל אינן קיימות בתיקיית media/images.uQ   יש תמונות בתיקייה שאינן בשימוש במצגת הפעילה.)r   r   r   r  r  r  rg  r,  r  r   r9  r   r~  r  r  r  r  r   r  r*  r  r  r   r   rq  )r'  r  folder_filesr9  r   r  r  r  refsexternalembeddedremoteotherrefrg  unique_externalr  folder_lower
used_lowerr  r[  unuseds   &                     r   !analyze_japan_presentation_imagesr    s@   )ddRWW\\'':JLc-dgg.BJ&z3IJL.rww~~.?@\*qqQ! !!1!bF" '((w   [  	\#S78LLPR	I M )+4Y[dfhfjfj(k  C(k1ovovwxoyoo  pBAGGAJ(kD  C,.KK8UW`bdbfbf,g~,gqkrkrstkuk{k{k}"
  ",g~HHFE"3'O,,OOE#o"6"789l++OOC i((E,<,<Z,H,HMM#LL  S]0CDO*67,QAGGIqL,L7%45_!'')_J5-QosL1PssoGQ)K\cSYY[
-Jcc\FK
MMD	s8}s8}S[#e* #o"6!3w<F#bjj)H)TUfSk  n"w}~'((w   E  	F$%%wrsMe MLL wY\`ad\eef C~$ 85QKsx   "R# 9R
R# :&S%%#S%:&S*%#S*3S/S42S9S9S>6S>R 	R#  R# #S".)SS"S"c                  :   \        4       p R V P                  R^ 4      RV P                  R^ 4      RV P                  R^ 4      RV P                  R^ 4      RV P                  R^ 4      RV P                  R^ 4      R	V P                  R	^ 4      R
V P                  R
R4      /# )image_slides_totalr  external_files_usedr  embedded_imagesr  r  r  r  r  r  F)r  r   )usages    r   compact_japan_usage_for_healthr    s    -/Eeii:uyy)>B599%:A>?A6!599-F#J		*@! D%))$4a8uyy)>F	 	r   c                  	  a . oV3R  lp V ! R\         4       V ! R\        P                  P                  \        R,          R4      4       V ! R\        P                  P                  \        R,          R4      4       V ! R\        P                  P                  \        R,          R4      4       V ! R	\        P                  P                  \        R,          R
RRR4      4       V ! R\        P                  P                  \        R,          R
RRR4      4       V ! R\        P                  P                  \        R,          R4      4       V ! R\        P                  P                  \        R,          R4      4       V ! R\        P                  P                  \        R,          R4      4       V ! R\        P                  P                  \        R,          R4      4       V ! R\        P                  P                  \        R,          R
RRR4      4       V ! R\        P                  P                  \        R,          R
RRR4      4       V ! R\        P                  P                  \        R,          R
RRR4      4       V ! R \        P                  P                  \        R,          R
RRR4      4       V ! R!\        P                  P                  \        R",          R4      4       V ! R#\        P                  P                  \        R$,          R4      4       V ! R%\        P                  P                  \        R&,          R4      4       \        \        P                  P                  \        R,          R
RR'4      \        4      p\        4       pVR(,          pVR),          ;'       d    VR*,          ^ 8H  pV'       d   R+MR,pVR-,           R.VR/,           R0V R1VR2,           R3VR*,           2	pR4pVR*,          '       d-   R4P                  R5 VR6,          R7,           4       4      pR8V R92pR4p	VR2,          '       d^   R4P                  R: VR;,          R7,           4       4      p
R4pVR2,          ^8  d   R<VR2,          ^,
           R=2pR>VR2,           R?V
 R@V RA2p	RBV RCVRD,           REV RFV RGV RH\        P                  ! \        4       RIV V	 RJR4P                  S4       RK2# )Lc                   < \        V4      pVP                  R 4      '       d   RMRpVP                  R 4      '       d   RV9   d   VP                  R^ 4      R MRpVP                  RR4      pVP                  RR4      pSP                  R\        P                  ! V 4       R	V R	V R	\        P                  ! V4       R	\        P                  ! V4       R
\        P                  ! V4       R24       R# )r   u   ✅ קייםu
   ❌ חסרr  r   r  r  r  <tr><td>r  </td><td><code></code></td></tr>N)r  r   r  r   r   )r`   r   r  r  r  r  r  r  s   &&     r   rN   render_admin_status.<locals>.add'  s   T"#'88H#5#5<-1XXh-?-?FdN$((61%a(X]%(hhx'hxu56ixyQUPVV_`h`o`opu`v_w  xA  BJ  BQ  BQ  RU  BV  AW  Wf  go  gv  gv  w{  g|  f}  }N  O  	Pr   u   פאנל פעילu   טיול יפן ראשיr'   r-      פתיח טיסה יפןrK      מצגת יפןrM   u   מוזיקת מצגת יפןrS   rm   rU   rn   u   מוזיקת פתיח יפןrp   rq   u   טיול ארה״ב ראשיr(   u   טיול ארה״ב TVr)   r.   u   מצגת ארה״בrO   u   מצגת ארה״ב TVrG   u+   שיר ארה״ב חלק 1 — פלאפוןrT   rV   u+   שיר ארה״ב חלק 2 — פלאפוןrX   u!   שיר ארה״ב חלק 1 — TVu!   שיר ארה״ב חלק 2 — TVu   תקציב טיוליםr*   u   תקציב משפחתיr+      טופס פתיחת טיולr,   rd   r  r  r  u   ✅ תקיןu   ⚠️ לבדיקהr  u    קבצים חיצוניים + r  u#    מוטמעות · בתיקייה: u    · לא בשימוש: r  u    · חסרות: r   c              3   V   "   T F  pR \         P                  ! V4       R2x  K!  	  R# 5iz
<li><code>z</code></li>Nr   r   r  s   & r   r   &render_admin_status.<locals>.<genexpr>O  s1        B  XARS*X__Q-?,@ M  XA   ')r  N   NuF   <div class='warn'><b>תמונות חסרות למצגת יפן</b><ul></ul></div>c              3   V   "   T F  pR \         P                  ! V4       R2x  K!  	  R# 5ir  r  r  s   & r   r   r  S  s&     }V|QRHOOA,>+?|LV|r  r  u   <p>ועוד u+    קבצים שלא מוצגים כאן.</p>ue   <details class='details'><summary>תמונות בתיקיית יפן שלא בשימוש במצגת (z)</summary><ul>z</ul>z
</details>u  
<!DOCTYPE html>
<html lang="he" dir="rtl">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>סטטוס TripServer</title>
<style>
body{margin:0;background:#0f172a;color:white;font-family:Arial;padding:24px}.wrap{max-width:1180px;margin:auto}a{color:#93c5fd}table{width:100%;border-collapse:collapse;background:#1e293b;border-radius:18px;overflow:hidden}th,td{border-bottom:1px solid #334155;padding:10px;text-align:right;vertical-align:top}th{background:#111827;color:#bfdbfe}code{direction:ltr;display:block;white-space:normal;color:#fde68a}.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px;margin:18px 0}.card{background:#1e293b;border:1px solid #334155;border-radius:18px;padding:16px}.num{font-size:30px;font-weight:900;color:#fde68a}
.small{color:#cbd5e1;font-size:13px;line-height:1.5;margin-top:6px}.warn{background:rgba(127,29,29,.38);border:1px solid rgba(248,113,113,.35);color:#fecaca;border-radius:16px;padding:14px;margin:14px 0}.details{background:#111827;border:1px solid #334155;border-radius:16px;padding:14px;margin:14px 0;color:#cbd5e1}summary{cursor:pointer;font-weight:900;color:#fde68a}ul{margin:10px 0 0}
</style></head><body><div class="wrap"><a href="/admin">⬅ חזרה לפאנל</a><h1>סטטוס קבצים פעילים</h1><p>כאן רואים בפועל מה מותקן כרגע ב־C:\TripServer, כולל גודל, תאריך שינוי ו־SHA קצר. זה נועד למנוע מצב של “העליתי אבל אני רואה גרסה ישנה”.</p><div class="cards"><div class="card"><div>קובצי מדיה מצגת ארה״ב</div><div class="num">u   </div><div class="small">כרטיסיות תמונה/סרטון מסונכרנות לשקפי ארה״ב.</div></div><div class="card"><div>מצגת יפן — תמונות בשימוש בפועל</div><div class="num">r  z</div><div class="small">    · ug   </div></div><div class="card"><div>קבצים בתיקיית תמונות יפן</div><div class="num">u   </div><div class="small">זה מספר קבצים בתיקייה, לא מספר התמונות שהמצגת משתמשת בהן.</div></div><div class="card"><div>גרסת פאנל</div><div>z</div></div></div>u   <table><thead><tr><th>רכיב</th><th>מצב</th><th>גודל bytes</th><th>עודכן</th><th>SHA16</th><th>נתיב</th></tr></thead><tbody>%</tbody></table></div></body></html>
)ADMIN_SERVER_PATHr   r   r   r  r  r0  r  r   r   r   )rN  usa_img_countjapan_usagejapan_img_countjapan_usage_okjapan_usage_badgejapan_usage_detailsmissing_htmlmissing_itemsunused_htmlunused_itemsmorer  s               @r   render_admin_statusr  %  s;   DP ./"BGGLL1A<$PQ"BGGLL1AC\$]^277<<(8:QRS&WW5EwPbdkm~(  A&WW5EwP^`gi{(|}&WU^\(RS "'',,wx/@BS"TUrww||GEN<WXY "'',,wx/@B`"ab5rww||GENT[]oqx  {S  8T  U5rww||GENT[]oqx  {P  8Q  R+RWW\\'(:KWVhjq  tL  .M  N+RWW\\'(:KWVhjq  tI  .J  K!277<<
0C\#RS!277<<0Dl#ST&WZ5H,(WXWU^WFXZb ceyzM35K!/2O !67ggKHa<bfg<gN*8>S,-
..M,-
. /*+ ,)*@AB C"#<=>		@  L,--   BWbczW{|  XA   B  B_`m_nnyzK)**ww}VabvVwx{V|}}-.3!+.D"E"J!KKvwD}  J  Ka  b  ~c  cr  s  r@  @E  FJ  EK  KU  VR S`  Ra  a|
  }
H  IW  }
X  |
Y  Yr  sD  rE  EI  J]  I^  ^E  FU  EV  VU  V^  Ve  Ve  fy  Vz  U{  {M  NZ  M[  \g  [h  hw  xz  x  x  @D  xE  wF F r   c                    \         P                  P                  V 4      pV^ 8:  d   R# V\        8  d   RRVR R\        R R23#  \        P
                  ! V RR7        \        T RRRR7      ;_uu_ 4       pTP                  4       pR	R	R	4       . ROpT Uu. uF  qfX9  g   K  TNK  	  ppT'       d   RRRP                  T4      ,           3# R#   \        P                   d   pRR\        T4      ,           3u R	p?# R	p?i\         d   pRR
\        T4      ,           3u R	p?# R	p?ii ; i  + '       g   i     L; i  \         d   pRR\        T4      ,           3u R	p?# R	p?ii ; iu upi )r   Fu   הקובץ גדול מדי: r       bytes. המגבלה היא  bytes.Tdoraiseu*   בדיקת קומפילציה נכשלה:
Nu$   שגיאה בבדיקת הקובץ:
r   r   r  r  u*   לא ניתן לקרוא את הקובץ:
u|   הקובץ עבר קומפילציה, אבל לא נראה כמו admin_server.py של TripServer. חסרים סימנים: ro  )Fu   הקובץ ריק.)r   
@app.routeapp.runr  
ADMIN_PORTrestart_process_laterupload_admin_serverrun_self_test_suiteTOK)r   r   r  ADMIN_MAX_UPLOAD_BYTES
py_compilerN  PyCompileErrorr   r   r~  r   r9  r   )r  r  r  r   contentrequired_tokensr  r[  s   &       r   validate_admin_server_uploadr#  b  s{   77??8$Dqy**$$4T!H<XYopqXrryzzzJ8T2P(C'(CCrggiG D
 ZO"1J/'5Iuu/GJ  U  X\  Xa  Xa  bi  Xj  j  j  	j! $$ OCc#hNNN J=S	IIIJ DC PCd3iOOOP Ks~   C E  6D-E  E,$E,D*%C>8D*>D*D*D%D*%D*-D=	8E  =E   E)E$E)$E)c                   \         P                  P                  V 4      pV^ 8:  d   R# V\        8  d   RRVR R\        R R2R3#  \        P
                  ! V R4      ;_uu_ 4       pVP                  4       pV'       g   RuuRRR4       # . p. pV F  pVP                  ;'       g    RP                  R	R
4      pVP                  R
4      p	V	'       d   VP                  4       '       d   KZ  V	P                  R
4      '       g   RV	P                  R
4      9   d   VP                  V4       K  V	P                  4       R8X  g1   R
V	9  g   K  V	P                  4       P                  R4      '       g   K  VP                  V	4       K  	  V'       d-   RRRP!                  VR,          4      ,           R3uuRRR4       # RV9   d   Rp
M&\#        V4      ^8X  d   V^ ,          p
MRuuRRR4       # \         P$                  ! VRR7       \         P                  P!                  VR4      pVP'                  V
R4      ;_uu_ 4       p\'        VR4      ;_uu_ 4       p\(        P*                  ! W4       RRR4       RRR4       RRR4       \-        X4      w  rV'       g#   \         P.                  ! V4       RRV,           R3# RRX
 2V3#   + '       g   i     L_; i  + '       g   i     Lj; i  + '       g   i     Lu; i  \0         d     LZi ; i  \        P2                   d    Ru # \0         d    pRR\5        T4      ,           R3u Rp?# Rp?ii ; i)a  Validate a controlled admin update ZIP and extract only the admin Python file.

Supported package format:
- root admin_server.py, or
- exactly one root-level .py file that passes TripServer admin validation.

For safety, this route does not execute arbitrary scripts from the ZIP.
FNu"   קובץ ה־ZIP גדול מדי: r   r  r  r   r   r%  r&  r)  admin_server.py.pyu:   קובץ ה־ZIP כולל נתיבים לא בטוחים: ro  Nrr  NTr   zadmin_server_from_zip.pyrD  u-   admin_server.py שבתוך ה־ZIP נדחה:
u!   ZIP תקין. נבחר קובץ: u   שגיאה בבדיקת ZIP:
)Fu   קובץ ה־ZIP ריק.N)Fu   ZIP עדכון אדמין חייב לכלול admin_server.py בשורש, או קובץ Python יחיד בשורש החבילה.N)Fu)   קובץ ZIP לא תקין או פגום.N)r   r   r  ADMIN_MAX_PACKAGE_UPLOAD_BYTESrI  rJ  rK  r5  r   r   r  r*  r+  r  r   r  r   r,  r   r   rF  rO  r#  r  r   
BadZipFiler~  )rP  r3  r  rU  rV  unsafepy_candidatesr  r   rg  selectedextracted_pathr  r%  validr>  r  s   &&               r   $extract_admin_server_from_zip_uploadr/  ~  s    77??8$Dqy66,,:4(B^_}~  _A  AH  I  KO  O  	O+I__Xs++rKKME> ,+
 FM++44T3?

3##C((DEKK4D,DMM$';;=$55#U:Ju{{}OeOefkOlOl!((/  Z]a]f]fgmnpgq]rrtxx) ,+* !M1,]#q((+ g5 ,+8 KK40WW\\(4NON3''3^T0J0Jc""3, 1K'= ,B 6nE>*JWTVZZZ8
C^SS 1K0J''= ,+H "d"  HGG I6cBDHHIs   L &K$ 
L K$'+K$K$)K$AK$	"K$0K$!K$.
L 9%K$
L )AK$;K	J>'K	/K$7L K7 *L 6L >K	K	K!K$$K4	/L 7LL LL M
!M
*M
+M?M
M
/adminc                    V'       d   R MRpV'       d   RMRp\         P                  ! V 4      p\         P                  ! V4      P                  RR4      p\         P                  ! V4      P                  RR4      p	V'       d   RV	 R2MRp
\        T;'       g    R	4      P	                  4       pVP                  R
4      '       d   VP                  R4      '       d   R	p\         P                  ! VRR7      pRV RV RV RV RV RV
 RV R2# )z#16a34az#dc2626z#052e1bz#3f1d1dru  <br>z<pre>z</pre>r   r0  r&  r  Tr6  z
<!DOCTYPE html>
<html lang="he" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>aD  </title>
<style>
body{margin:0;font-family:Arial;background:#0f172a;color:white;min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px}
.card{width:min(780px,94vw);background:#1e293b;border-radius:24px;padding:26px;box-shadow:0 18px 70px rgba(0,0,0,.35)}
.badge{display:inline-block;background:z;border:1px solid a  ;color:white;border-radius:999px;padding:8px 14px;font-weight:bold;margin-bottom:12px}
h1{margin:0 0 12px;font-size:30px}
p{line-height:1.7;color:#e2e8f0}
pre{white-space:pre-wrap;direction:ltr;text-align:left;background:#020617;color:#fde68a;border:1px solid #334155;border-radius:14px;padding:14px;overflow:auto;max-height:360px}
a,button{display:inline-block;margin:8px 0 0 8px;background:#2563eb;color:white;border:0;border-radius:12px;padding:12px 16px;text-decoration:none;font-weight:bold;cursor:pointer}
button.restart{background:#ea580c}
.advanced-note{margin-top:10px;color:#cbd5e1;font-size:13px;line-height:1.55}
form{display:inline}
</style>
</head>
<body>
<div class="card">
<div class="badge">TripServer Admin</div>
<h1>z	</h1>
<p>z</p>
z

<a href="u  ">חזרה</a>
<form action="/restart_admin_server" method="post" onsubmit="return confirm('זו בדיקת אתחול מתקדמת. להפעיל מחדש את הפאנל עכשיו?')"><button class="restart">בדיקת אתחול פאנל — מתקדם</button></form>
<div class="advanced-note">מיועד לבדיקה יזומה בלבד אחרי עדכון/שחזור קובץ אדמין.</div>
</div>
</body>
</html>
)r   r   r   r   r   r*  )r   r   r  r>  back_urlcolorbg
safe_titlesafe_messagesafe_detailsdetails_htmlsafe_back_urls   &&&&&       r   r3  r3    s   IEiB'J??7+33D&AL??7+33D&AL3:U<./L,,H-335M##C((M,D,DT,J,J OOM>M 	| ) *,,>ug F L >  

 5   r   c                     \         P                  ! \        R R7       \        P                  ! R4      p\         P
                  P                  \        V  RV R24      p\        P                  ! \        V4       V# )Tr   r  r  r&  )
r   r   ADMIN_BACKUP_DIRr   r   r   r   rF  r  r  )r  r  r  s   &  r   backup_current_admin_serverr>    sV    KK 40MM/*E'',,/F81UG31GHK
LL"K0r   c                     \         P                  ! \        R R7       \        P                  ! \         P                  P                  \        R4      4      p V '       g   R# \        V \         P                  P                  R7      # )Tr   zadmin_server_backup_*.pyNr  )r   r   r=  globr   r   r>  r   )rC   s    r   latest_admin_backuprA    sM    KK 40ii%57QRSGwBGG,,--r   c                 X    \         P                  ! \        R R7       \        \        RRR7      ;_uu_ 4       pVP                  \        P                  ! R4      R,           \        V 4      ,           R,           4       RRR4       R#   + '       g   i     R# ; i  \         d     R# i ; i)	Tr   r  r   r   r   z | control-bootstrap | ru  N)
r   r   r  r   CONTROL_BOOTSTRAP_LOG_PATHr  r   r   r   r   r   r   s   & r   log_control_bootstraprE    sv    
Ht,,cGDDHHT]]#67:SSVYZaVbbeiij EDDD /   6B AB<B B	B B B)(B)c                  j   \         P                  ;'       g    R p \        P                  P	                  V 4      P                  4       pVR8X  de   \        P                  P                  \        P                  P                  V 4      R4      p\        P                  P                  V4      '       d   V# V # )r   z
python.exer   )	r   r   r   r   r   r   r   r   r   )r   r   r   s      r   quiet_pythonw_pathrH    sw    
..
$
$HC77C &&(D|GGLL!5}E	77>>)$$Jr   c                       \         P                  P                  R \         R2RR7      ;_uu_ 4       p V P                  ^8H  uuRRR4       #   + '       g   i     R# ; i  \
         d     R# i ; i)zhttp://127.0.0.1:
/ping.jsonr  rt  NF)urllibr   urlopenCONTROL_PORTr  r   )resps    r   control_server_is_aliverO    s\    ^^##&7~Z$PZ]#^^bf;;#% _^^^ s.   1A! A
A! A	A! A! !A0/A0c                 X    \         P                  ! \        R R7       \        \        RRR7      ;_uu_ 4       pVP                  \        P                  ! R4      R,           \        V 4      ,           R,           4       RRR4       R#   + '       g   i     R# ; i  \         d     R# i ; i	Tr   r  r   r   r    | ru  N)
r   r   r  r   ADMIN_RESTART_LOG_PATHr  r   r   r   r   rD  s   & r   log_admin_restartrT    sr    
Ht,(#@@BHHT]]#67%?#g,NQUUV A@@@ rF  c                   RP                  . RNRNRNRNRNRNRNR	NR
V : 2NRV: 2NRV: 2NR\        : 2NR\        : 2NR\        T;'       g    ^ 4      : 2NRV: 2NRV: 2NRV: 2NR	NRNRNRNRNRNRNRNR	NRNRNRNRNRNRNR	NR NRNR!NR"NRNR#NR	NR$NR%NR&NR'NR"NR(NR)NR	NR*NR+NR,NR-NRNR.NR/NR0NR1NR2NR3NR4NR5NR6NR7NR8NR9NR:NR;NR<NR=NR>NR	NR?NRNR@NRNR#NRANRBNR#NRNRCNRDNRENRFNRGNRHNRINR<NRJNR#NR	NRKNRLNRMNRNNRONRPNRQNRRNRSNRTNRUNR	NRVNRWNRXNRYNRZNR[NR\NR]NR^NR_NR`NRaNR_NRbNR	NRcNRdNReNRfNRgNRhNRiNRjNRkNRlNRmNRnNRoNRpNRqNR	NRrNRsNR	N4      R,           # )ta:  Build a simple and conservative restart helper.

v29 change: stop doing rollback/health gating inside the helper. The logs from
the real Windows machine showed the new Flask server starts, but the helper's
own health request sometimes times out and then incorrectly rolls back or
leaves the port in a bad state. Since uploaded admin files already pass
compile + TripServer validation before replacement, the safest behavior is:
wait, release port 8000, start admin_server.py, write logs, exit. Control Server and
the browser then verify availability through /ping.json.
ru  z# -*- coding: utf-8 -*-z	import osz
import syszimport subprocesszimport timezimport socketzimport hashlibr   zscript_path = zpython_exe = zwork_dir = zlog_path = zadmin_port = zcurrent_pid = zbackup_path = zexpected_sha = z	reason = zdef log(message):z    try:z=        os.makedirs(os.path.dirname(log_path), exist_ok=True)z9        with open(log_path, 'a', encoding='utf-8') as fh:zd            fh.write(time.strftime('%Y-%m-%d %H:%M:%S') + ' | restart-v29 | ' + str(message) + '\n')z    except Exception:z        passzdef file_sha256(path):z    h = hashlib.sha256()z     with open(path, 'rb') as fh:z=        for chunk in iter(lambda: fh.read(1024 * 1024), b''):z            h.update(chunk)z    return h.hexdigest()zdef port_open():zS        with socket.create_connection(('127.0.0.1', int(admin_port)), timeout=0.7):z            return Truez        return Falsez!def wait_port_closed(timeout=12):z$    deadline = time.time() + timeoutz!    while time.time() < deadline:z        if not port_open():z        time.sleep(0.4)z    return not port_open()zdef pids_on_port():z    pids = []z    if os.name != 'nt':z        return pidsz        cp = subprocess.run(['netstat', '-ano', '-p', 'tcp'], capture_output=True, text=True, shell=False, timeout=10, creationflags=(getattr(subprocess, 'CREATE_NO_WINDOW', 0) if os.name == 'nt' else 0))z:        out = (cp.stdout or '') + '\n' + (cp.stderr or '')z&        marker = ':' + str(admin_port)z%        for line in out.splitlines():zB            if marker not in line or 'listen' not in line.lower():z                continuez             parts = line.split()z            if parts:z                try:z(                    pid = int(parts[-1])z/                    if pid and pid not in pids:z(                        pids.append(pid)z!                except Exception:z                    passz    except Exception as exc:z+        log('netstat failed: ' + repr(exc))z    return pidszdef kill_pid(pid):z        pid = int(pid)z&    if pid <= 0 or pid == os.getpid():zF        log('skip kill pid=' + str(pid) + ' self=' + str(os.getpid()))z        if os.name == 'nt':zM            # No /T. Kill only the process that owns port 8000, never a tree.z            cp = subprocess.run(['taskkill', '/PID', str(pid), '/F'], capture_output=True, text=True, shell=False, timeout=12, creationflags=(getattr(subprocess, 'CREATE_NO_WINDOW', 0) if os.name == 'nt' else 0))z            log('taskkill pid=' + str(pid) + ' rc=' + str(cp.returncode) + ' out=' + ((cp.stdout or cp.stderr or '').strip()[:500]))z%            return cp.returncode == 0z        os.kill(pid, 9)z        return Truez@        log('kill failed pid=' + str(pid) + ' err=' + repr(exc))zdef release_port():zR    # Give the old request time to finish and Flask to exit if it exits naturally.z    if wait_port_closed(10):z$        log('port closed naturally')z        returnz    pids = pids_on_port()zs    log('port still open; killing owners without rollback; current_pid=' + str(current_pid) + ' pids=' + str(pids))z    for pid in pids:z        kill_pid(pid)z    wait_port_closed(10)zW    log('port open after release=' + str(port_open()) + ' pids=' + str(pids_on_port()))zdef start_server():z    flags = 0z    if os.name == 'nt':z        flags = getattr(subprocess, 'CREATE_NEW_PROCESS_GROUP', 0) | getattr(subprocess, 'CREATE_NO_WINDOW', 0) | getattr(subprocess, 'DETACHED_PROCESS', 0) | getattr(subprocess, 'CREATE_BREAKAWAY_FROM_JOB', 0)z    env = os.environ.copy()z/    env.setdefault('PYTHONIOENCODING', 'utf-8')z9    os.makedirs(os.path.dirname(log_path), exist_ok=True)z;    with open(log_path, 'a', encoding='utf-8') as log_file:zu        log_file.write(time.strftime('%Y-%m-%d %H:%M:%S') + ' | restart-v29 | starting admin: ' + script_path + '\n')z        log_file.flush()z        proc = subprocess.Popen([python_exe, script_path], cwd=work_dir, stdin=subprocess.DEVNULL, stdout=log_file, stderr=log_file, close_fds=(False if os.name == 'nt' else True), creationflags=flags, start_new_session=(os.name != 'nt'), env=env)zy        log_file.write(time.strftime('%Y-%m-%d %H:%M:%S') + ' | restart-v29 | started admin pid=' + str(proc.pid) + '\n')z    return proc.pidzdef main():z    log('simple restart started reason=' + str(reason) + ' script=' + script_path + ' python=' + python_exe + ' expected_sha=' + str(expected_sha) + ' backup=' + str(backup_path))z    time.sleep(2.5)z    if expected_sha:z        try:z-            actual = file_sha256(script_path)zJ            log('active sha=' + actual + ' expected=' + str(expected_sha))z         except Exception as exc:z1            log('sha check failed: ' + repr(exc))z    release_port()z    start_server()zO    # Do not call /health or /ping here and do not roll back. Previous versionszL    # produced false timeout failures even though Flask was already running.zP    log('simple restart helper finished; Control Server will verify /ping.json')z    return 0zif __name__ == '__main__':z    raise SystemExit(main()))r   rS  r  r   )script_path
python_exer3  current_pidr  expected_sharb  s   &&&&&&&r   build_restart_helper_coderZ  $  sH    99 J!JJ 	J 		J
 	J 	J 	J 	J (J 
~&J h\"J ,/0J 
~&J [--A.12J (J  ,)*!J" F:#J$ 	%J& 	'J( 	)J* 	H+J, 	D-J. 	p/J0 	 1J2 	3J4 	5J6 	!7J8 	#9J: 	+;J< 	H=J> 	&?J@ 	#AJB 	CJD 	EJF 	GJH 	^IJJ 	"KJL 	 MJN 	OJP 	QJR 	,SJT 	/UJV 	,WJX 	&YJZ 	"[J\ 	"]J^ 	%_J` 	aJb 	cJd 	eJf 	"gJh 	iJj 	kJl 	WmJn 	FoJp 	1qJr 	0sJt 	MuJv 	#wJx 	+yJz 	 {J| 	}J~ 	3J@ 	:AJB 	3CJD 	,EJF 	#GJH 	'IJJ 	6KJL 	MJN 	OJP 	QJR 	SJT 	!UJV 	 WJX 	YJZ 	1[J\ 	Q]J^ 	_J` 	aJb 	&cJd 	XeJf 	_gJh 	OiJj 	0kJl 	"mJn 	oJp 	'qJr 	KsJt 	uJv 	wJx 	yJz 	]{J| 	'}J~ 	/J@ 	AJB 	$CJD 	~EJF 	GJH 	 IJJ 	#KJL 	bMJN 	OJP 	QJR 	SJT 	"UJV 	]WJX 	&YJZ 	:[J\ 	D]J^ 	F_J` 	AaJb 	#cJd 	BeJf 	EgJh 	#iJj 	kJl 	mJn 	oJp 	~qJr 	sJt 	uJv 	wJx 	8yJz 	U{J| 	+}J~ 	<J@ 	AJB 	CJD 	ZEJF 	WGJH 	[IJJ 	KJL 	MJN 	%OJP 	'QJR 	SJ JT 
UJ Jr   c                 l     \        V R R4       R#   \         d   pR\        T4      3u Rp?# Rp?ii ; i)z<tripserver_restart_helper>execFNr  )rN  r   r~  )helper_coder  s   & r   validate_restart_helper_sourcer^    s9     :FC  d3i s    3.33c           	         \        WV\        P                  ! 4       W4V4      p\        V4      w  rxV'       g   \	        R V,           4      h\        \        4       \        \        RRR7      ;_uu_ 4       p	V	P                  V4       RRR4       \        P                  ! \        RR7       \        #   + '       g   i     L2; i)z%Generated restart helper is invalid: r   r   r   NTr  )rZ  r   r  r^  r  r  ADMIN_RESTART_HELPER_PATHr   r  r  rN  )
rV  rW  r3  r  rY  rb  r]  r  r  r   s
   &&&&&&    r   write_restart_helperra    s    +KXryy{\gw}~K-k:HBBTIJJ/0	'w	?	?2
 
@0$?$$ 
@	?s   3B//B?	c                   \         P                  ! R4       \        P                  P	                  \
        4      p\        P                  ;'       g    Rp\        V4      p\        P                  P                  V4      ;'       g    \        p \        RV R\         RV RV R\        P                  ! 4        RV  R	V R
\        P                   24       \        W4W`WR7      p^ p\        P                   R8X  dG   \#        \%        \&        R^ 4      \%        \&        R^ 4      ,          \%        \&        R^ 4      ,          4      p\&        P(                  ! WW.T\&        P*                  \&        P*                  \&        P*                  \        P                   R8X  d   RMRV\        P                   R8g  R7       \        RV,           4       \        P,                  ! ^ 4       R#   \.         EdZ   p	\        R\1        T	4      ,           4        \&        P(                  ! YS.T\&        P*                  \&        P*                  \&        P*                  \        P                   R8X  d   RMR\#        4       \        P                   R8g  R7       \        P,                  ! ^ 4        Rp	?	R#   \.         d   p
\        R\1        T
4      ,           4        \        P2                  ! YDT.4        Rp
?
 Rp	?	R#   \.         dE   p\        R\1        T4      ,           4       \        P,                  ! ^4        Rp? Rp
?
 Rp	?	R# Rp?ii ; iRp
?
ii ; iRp	?	ii ; i)zHard self-restart for Windows/iPhone admin workflow.

v23: the helper can force-release a stuck port safely and roll back to the previous admin
backup if the newly uploaded admin does not pass /ping.json after boot.
g333333?r   z hard restart requested | reason= | version=
 | script=
 | python= | pid=
 | backup= | expected_sha=z | argv=r  rY  rb  r   CREATE_NEW_PROCESS_GROUPDETACHED_PROCESSCREATE_BREAKAWAY_FROM_JOBFTcwdstdinry  rz  	close_fdsr]  start_new_sessionzhard restart helper launched: zhard restart helper failed: z direct restart fallback failed: zexecv fallback failed: N)r   sleepr   r   rl  r  r   r   r   r   r  rT  r   r  argvra  r   rV  rR  rS  PopenDEVNULL_exitr   r~  execv)r  rY  rb  rV  rW  quiet_pythonr3  helper_pathrU  r  exc2exc3s   &&&         r   r  r    s=    	JJsO''//"34K++8J)*5Lww{+77xH<VHKPcOddnozn{  |F  GQ  FR  RY  Z\  Zc  Zc  Ze  Yf  fp  q|  p}  }M  NZ  M[  [c  dg  dl  dl  cm  n  	o*;H  uA  Q77d?+GJ@Z\],^ahis  vH  JK  bL  -L  OV  Wa  c~  @A  OB  -B  CE'$$%%%% "4uT!ww$		
 	:[HI
 849DE		l8hjN`N`isi{i{  EO  EW  EW  mo  mt  mt  x|  m|  di  BF  Wn  Wp  EG  EL  EL  PT  ET  VHHQKK 	@4:MN+%>?? !";d4j"HI		sh   EG M 'L;BJL8#L3?K!L;!L0,1L+L3!L;+L00L33L88L;;M c                   \         P                  R8w  d   \        R4      h\        V4      pRV RV  R2pRRR\        RVR	R
RRR.p\
        P                  ! VRRR^\        4       R7      pVP                  ;'       g    VP                  ;'       g    RP                  4       pVP                  ^ 8w  d0   \        RT;'       g    \        VP                  4      ,           4      h\
        P                  ! RRR\        .RRR^\        4       R7      pVP                  ;'       g    VP                  ;'       g    RP                  4       p	VP                  ^ 8w  d0   \        RT	;'       g    \        VP                  4      ,           4      h\        R\        ,           R,           V,           R,           V,           R,           V	,           4       R\        RVRVRV	/# )ad  Launch restart helper as an independent Windows Scheduled Task.

This is more reliable than subprocess.Popen from the Flask process because the
helper is not a child of the admin process it is about to kill. On Windows,
self-restart helpers launched as child processes can be terminated together
with the old server or stuck in the same job/process group.
r   z3Task Scheduler restart is supported only on Windows"" "schtasks/Create/TN/TR/SCONCEz/STz23:59/FTF)rX  rY  r\  r[  r]  r   zFailed to create restart task: /RunzFailed to run restart task: z2restart helper launched via Task Scheduler | task=re  z
 | create=z | run=taskr   creater^  )r   r   r  r   RESTART_TASK_NAMErS  r^  rV  ry  rz  r   r{  r   rT  )
ry  rW  r3  rx  task_command
create_cmd	cp_create
create_outcp_runrun_outs
   &&&       r   #launch_restart_helper_via_schedulerr    s    
ww$PQQ)*5L|nC}A6L 	I |vwJ z$TQV`b  sJ  sL  MI""<<i&6&6<<"CCEJq <
@g@gcR[RfRfNghii^^Z8IJ[_fjrw  BD  Tk  Tm  nF}}3333::<GA9W=^=^FL]L]H^_``JM^^ammp||  @L  L  OY  Y  \e  e  ho  o  p%xxUZ\cddr   c                f   \         P                  P                  \        4      p\        P
                  ;'       g    Rp\         P                  P                  V4      ;'       g    \        p\        RV R\         RV RV R\         P                  ! 4        RV  RV 24       \        W4WPWR	7      p \        WdV4      pVR
,           \        VP                  R4      4      ,           R,           \        VP                  R4      4      ,           #   \         Ed   p\        R\!        T4      ,           4       ^ p	\         P"                  R8X  dG   \%        \'        \(        R^ 4      \'        \(        R^ 4      ,          \'        \(        R^ 4      ,          4      p	\+        T4      p
\(        P,                  ! Y.T\(        P.                  \(        P.                  \(        P.                  \         P"                  R8X  d   RMRT	\         P"                  R8g  R7       \        RT,           4       TR,           u Rp?# Rp?ii ; i)a@  Launch a detached restart helper through Task Scheduler.

v27: this is the important architectural fix. The helper is no longer a
direct child of the Flask/admin process. It is started by Windows Task
Scheduler, then it can safely kill the old process on port 8000 and start the
new admin without dying with its parent.
r   z%scheduler restart requested | reason=rc  rd  re  rf  rg  rh  ri  z | task=r  zFTask Scheduler restart launch failed, falling back to detached Popen: r   rj  rk  rl  FTrm  z9restart helper launched through fallback detached Popen: z | fallback=detached-popenN)r   r   rl  r  r   r   r   r  rT  r   r  ra  r  r   r   r   r~  r   rV  rR  rS  r   rt  ru  )r  rY  rb  rV  rW  r3  ry  	task_infor  rU  rx  s   &&&        r   launch_safe_external_restartr    s=    ''//"34K++8Jww{+77xH
/x{CVBWWabmannx  zD  yE  EL  MO  MV  MV  MX  LY  Yc  do  cp  p@  AM  @N  	O '{p|  MK:7QYZ	Z'#immF.C*DD|SVYZcZgZghpZqVrrr : 	beijmenno77d?+GJ@Z\],^ahis  vH  JK  bL  -L  OV  Wa  c~  @A  OB  -B  CE-j9'$$%%%% "4uT!ww$		
 	UXccd999):s    1AD H0DH+%H0+H0c                      \        V R RRR7      ;_uu_ 4       pVP                  4       pRRR4       RP                  XV) R 4      P                  4       #   + '       g   i     L3; i  \         d     R# i ; i)r   r   r   r  Nr   )r   	readlinesr   r   r   )r   	max_linesr   r  s   &&  r   read_log_tailr  D  si    $gi@@BLLNE AwwuiZ[)*0022 A@  s'   A( A*A( A%	 A( (A76A7c                      \        V 4      pVe   \        W$4      pVe   \        W44      pV#   \         d    Tp L/i ; ir   )r   r   r>  r  )ri  default	min_value	max_valuer  s   &&&& r   safe_intr  M  sM    U Y'Y'M  s   - ==c                    \         P                  V 4      pV'       g   R # VR,          p\        P                  P	                  V4      pV'       d    \        P                  P                  V4      M^ pV'       dI   \        P                  ! R\        P                  ! \        P                  P                  V4      4      4      MRpV'       d   \        W1R7      MRpRV RVR,          RVP                  RR	4      RVR
VRVR\        V4      RVRV/	# )Nr   r      לא קיים עדייןr  uM   אין עדיין לוג. הוא יווצר אחרי פעולה ראשונה.rT  r`   r   r   r   r  
size_labelr   tail)LOG_FILE_REGISTRYr   r   r   r   r  r   r   r  r   r  r  )log_keyr  r  r   r   r  r   r  s   &&      r   log_file_summaryr  Y  s      )D<DWW^^D!F$*277??4 D\bdmm/@P@PQU@V1WX  iCG7==3  DSDwg$&l4(7
 
r   c           
          \        V \        ^\        4      p . p\         F*  p\	        W R7      pV'       g   K  VP                  V4       K,  	  RRR\        R\        P                  ! R4      RV RV/# )	r  r  r  Tr  
checked_atr   r  logs)	r  LOG_TAIL_DEFAULT_LINESLOG_TAIL_MAX_LINESr  r  r  r   r   r   )r  r  rT  r  s   &   r   build_logs_payloadr  o  sn    $:B@RSIE 94LL !
 	d&dmm$78 r   c                     \        \        P                  P                  R \        4      4      p . pV R,           EF  pVR,          '       d   RMRpVR,          '       d   RMRp\
        P                  ! VR,          ;'       g    R4      P                  R	R
4      pVP                  R\
        P                  ! VR,          4       R\
        P                  ! VR,          4       RV RV R\
        P                  ! VR,          4       R\
        P                  ! VR,          4       R\
        P                  ! VR,          4       RV R24       EK  	  RRP                  V4       R2# )r  r  r   r  warnu   קייםu   לא נוצר עדייןr  u   אין תוכן להצגה.ru  r2  z>
<div class="log-card">
  <div class="log-head">
    <div><h2>r`   z</h2><p>r   z"</p></div>
    <span class="badge ">u:   </span>
  </div>
  <div class="meta"><b>נתיב</b><code>r   u6   </code></div>
  <div class="stats"><span>גודל: <b>r  u    </b></span><span>עודכן: <b>r   z</b></span></div>
  <pre>z</pre>
</div>u
  
<!DOCTYPE html>
<html lang="he" dir="rtl"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>לוגים TripServer</title>
<style>
body{margin:0;background:#07111f;color:white;font-family:Arial;padding:22px}.wrap{max-width:1120px;margin:auto}a{color:#dbeafe;text-decoration:none}.hero{background:linear-gradient(135deg,#1e3a8a,#0f172a 62%,#111827);border:1px solid #1d4ed8;border-radius:28px;padding:22px;margin-bottom:16px;box-shadow:0 20px 70px rgba(0,0,0,.28)}h1{margin:0 0 8px;font-size:34px}p{color:#cbd5e1;line-height:1.6}.actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px}.actions a{background:#2563eb;color:white;border-radius:999px;padding:10px 14px;font-weight:900}.actions a.secondary{background:#1e293b;border:1px solid #334155}.log-card{background:#101c31;border:1px solid #253650;border-radius:24px;padding:18px;margin:14px 0;box-shadow:0 18px 55px rgba(0,0,0,.22)}.log-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px}.log-head h2{margin:0 0 6px;font-size:24px}.badge{white-space:nowrap;border-radius:999px;padding:7px 11px;font-weight:900}.badge.ok{background:#14532d;color:#bbf7d0;border:1px solid #22c55e}.badge.warn{background:#451a03;color:#fed7aa;border:1px solid #f97316}.meta{margin-top:10px;color:#cbd5e1}code{direction:ltr;display:block;background:#0b1220;border:1px solid #334155;border-radius:12px;padding:10px;color:#fde68a;margin-top:6px;white-space:normal}.stats{display:flex;gap:12px;flex-wrap:wrap;color:#cbd5e1;margin:12px 0}.stats span{background:#0b1220;border:1px solid #334155;border-radius:999px;padding:8px 10px}pre{direction:ltr;text-align:left;white-space:pre-wrap;background:#020617;color:#fde68a;border:1px solid #334155;border-radius:16px;padding:14px;overflow:auto;max-height:420px;font-size:13px;line-height:1.55}@media(max-width:700px){body{padding:14px}.hero{padding:18px;border-radius:22px}h1{font-size:28px}.log-head{display:block}}
</style></head><body><div class="wrap"><div class="hero"><a href="/admin">⬅ חזרה לפאנל</a><h1>📜 מרכז לוגים</h1><p>צפייה נוחה בלוגי האדמין, עדכונים ופעולות מערכת בלי לפתוח קבצים ידנית במחשב. המסך לקריאה בלבד ולא מוחק או משנה שום דבר.</p><div class="actions"><a href="/admin/logs">רענן</a><a class="secondary" href="/admin/logs?lines=250">הצג 250 שורות</a><a class="secondary" href="/admin/logs?lines=500">הצג 500 שורות</a><a class="secondary" href="/admin/logs.json" target="_blank">JSON טכני</a><a class="secondary" href="/admin/self-test">בדיקה עצמית</a></div></div>r   </div></body></html>
)
r  r   argsr   r  r   r   r   r  r   )r   cardsr  	badge_cls
badge_textr  s         r   render_admin_logsr    s}    !1!1';Q!RSGE NND	#'>>Z7Q
tF|LL/LMUUVZ\bc  ood7m,-Xhood6l6S5T U!{"ZL 1**2//$v,*G)H I))1l9K)L(MMmnvn}n}  C  DM  N  oO  nP Pv 	
 			  P
 QS  QX  QX  Y^  Q_  P` ` r   c                  6    \         P                  ;'       g    R # r3  )r   remote_addrr  r   r   get_client_ipr    s    $$"$r   c                     \         P                  ! T ;'       g    R P                  R^4      ^ ,          4      pVP                  ^8H  ;'       d    V\         P                  ! R4      9   pVP                  ^8H  ;'       d    V\         P                  ! R4      9   pVP
                  ;'       g5    VP                  ;'       g!    VP                  ;'       g    T;'       g    T#   \         d     R# i ; i)r   %100.64.0.0/10zfd7a:115c:a1e0::/48F)		ipaddress
ip_addressr+  r  
ip_networkis_loopback
is_privateis_link_localr   )ip_textiptailscale_ipv4tailscale_ipv6s   &   r   is_private_or_loopback_ipr    s    !!7==b"7"7Q"?"BCqXXR93G3G3X-Xq^^R93G3GH]3^-^~~ffff"2B2BffnffXff s:   C! 3C! /C! ?,C! ,C!  C! 	C! C! !C0/C0c                      \         '       g   R# \        4       p \        V 4      '       g   R RV  23# \        P                  R8w  d   R# R# )FuW   פעולת מחשב חסומה מכתובת שאינה מקומית/רשת ביתית: r   )Fuj   פעולות כיבוי/ריסטארט מחשב כבויות בהגדרת TRIPSERVER_ENABLE_POWER_ACTIONS.)Fu<   פעולות מחשב נתמכות כאן רק על Windows.r  )POWER_ACTIONS_ENABLEDr  r  r   r   r  s    r   power_action_allowedr    sR       C  	C	B$R((oprosttt	ww$TTr   c                      \        V 4      p\        \        \        \        V4      4      #   \         d
    \        p L1i ; ir   )r   r   POWER_DEFAULT_DELAY_SECONDSr>  POWER_MIN_DELAY_SECONDSr  POWER_MAX_DELAY_SECONDS)	raw_valuedelays   & r   normalize_power_delayr    s>    ,I &,CU(KLL  ,+,s   + ??c           	      (   V R 8X  d   RpRpMV R8X  d   RpRpM\        R4      h\        V4      pRV 2pR VR\        V4      R	V.p\        P                  ! VR
R
R\        4       R7      pVP                  ^ 8w  dB   \        VP                  ;'       g    VP                  ;'       g    RP                  4       4      h\        RV  RV R\        4        24       Y4VP                  P                  4       ;'       g    VP                  P                  4       3# )r   z/sr   r   z/rr   zunknown power actionzTripServer Admin scheduled z/tz/cTFrX  rY  r\  r]  zshutdown command failedzPOWER z scheduled in zs by )r  r  r   rS  r^  rV  r{  r  rz  ry  r   rT  r  )rd  delay_secondsr  r`   r  commentr_  	completeds   &&      r   run_power_commandr    s   %	8	+/00!-0E+E73GtT3u:tW
=Cs4d%_v_xyIq I,,]]	0@0@]]D]ddfggvhnUG5@QRS))//1MMY5E5E5K5K5MMMr   c                     \         P                  ! R R.RRR\        4       R7      p \        R\	        4        RV P
                   RV P                  P                  4        RV P                  P                  4        24       V P
                  V P                  ;'       g    V P                  ;'       g    R	P                  4       3# )
r   /aTFr  zPOWER cancel requested by z | rc=z | out=z | err=r   )	rS  r^  rV  rT  r  r{  ry  r   rz  )r  s    r   cancel_power_commandr    s    
D1$TY^  oF  oH  II2=?2C6)J^J^I__fgpgwgwg}g}g  gA  AH  IR  IY  IY  I_  I_  Ia  Hb  c  d)"2"2"L"Li6F6F"L"L"!S!S!UUUr   c                    \         '       g   Rp \        RV 4       RV 3# \        4       w  rV'       g   \        RV4       RV3# \        \        4      p \
        P                  ! RR.RRR\        4       R7        \        RV4      w  rEpV R	V R
2p \        RYT;'       g    RR7       RT  RT;'       g    R 23#   \         d     LPi ; i  \         d-   pR\        T4      ,           p \        RT 4       RT 3u Rp?# Rp?ii ; i)z:Schedule a Windows reboot before applying an admin update.uA   Fail Safe כבוי בהגדרת TRIPSERVER_ADMIN_UPDATE_FAILSAFE.r   Fr   r  Tr  r   u    Fail Safe נקבע לעוד r>  r   r  )r  windows_outputu    פלט Windows: u=   Fail Safe לא הצליח לקבוע ריסטארט Windows: N)ADMIN_UPDATE_FAILSAFE_ENABLEDr   r  r  %ADMIN_UPDATE_FAILSAFE_RESTART_SECONDSrS  r^  rV  r   r  r~  )msgrQ  rb  r  r`   final_delayr   r  s           r   !arm_admin_update_failsafe_restartr    s   ((Q#L#6cz*,OG#L&9f}!"GHE
D)$TQVf}f  	A%6x%G"F4[MN#GS\b\j\jfjku-fnn-=>>>    MPTUXPYY#L#6czs6   %B; 9;C 5C ;C	C	D!C>8D>Dc                  f    \         '       g   R# \        4       p \        V 4      '       g   R RV  23# R# )Fuc   גישה למצלמה חסומה מכתובת שאינה מקומית/רשת ביתית/Tailscale: )FuE   מצלמת החדר כבויה בהגדרת TRIPSERVER_ENABLE_WEBCAM.r  )CAMERA_ENABLEDr  r  r  s    r   camera_access_allowedr    sC    >]]	B$R(({|~{  A  A  	Ar   c                      R \         RRRRR\        /p  ^ RIpRV R&   \        VRR4      V R&   V #   \         d   pRT R&   \        T4      T R	&    Rp?T # Rp?ii ; i)
enabledopencvFopencv_versionr   camera_indexNT__version__rp  )r  CAMERA_INDEXcv2rR  r   r   )r  r  r  s      r   camera_engine_statusr    sv    5:JBP^`lmF#x#*3r#B  M  # xc(wM#s   / AAAc                   P   a  ] tR tRt o R tR tR tR tR tR t	R t
R	 tR
tV tR# )WebcamManageri  c                    \         P                  ! 4       V n        R V n        RV n        RV n        ^ V n        RV n        RV n        R # Nr  r   F)		threadingRLocklockcap	opened_atlast_frame_atframes
last_errorstop_requestedselfs   &r   __init__WebcamManager.__init__  s<    OO%	 #r   c                    ^ RI pV# r  )r  )r  r  s   & r   _import_cv2WebcamManager._import_cv2  s
    
r   c                   V P                  4       pV P                  e#   V P                  P                  4       '       d   V# RV n        \        P
                  R8X  d   \        VR^ 4      M^ pVP                  \        V4      p VP                  \        VR^4      \        4       VP                  \        VR^4      \        4       VP                  \        VR^4      \        4       V'       d   VP                  4       '       g6    VP                  4        R\         R2V n        \!        V P                  4      hW0n        \"        P"                  ! 4       V n        ^ V n        R	V n        V#   \         d     Li ; i  \         d     Lri ; i)
NFr   	CAP_DSHOWCAP_PROP_FRAME_WIDTHCAP_PROP_FRAME_HEIGHTCAP_PROP_FPSu.   לא הצלחתי לפתוח מצלמה index=uW   . בדוק הרשאות Windows או מצלמה תפוסה באפליקציה אחרת.r   )r  r  isOpenedr  r   r   rR  VideoCapturer  r  CAMERA_WIDTHCAMERA_HEIGHT
CAMERA_FPSr   releaser  r  r   r  r  )r  r  backendr  s   &   r   _open_lockedWebcamManager._open_locked  sD    88DHH$5$5$7$7J#24''T/'#{A.q|W5	GGGC!7;\JGGGC!8!<mLGGGC3Z@ #,,.. !O|n  ]t  uDOt//
  		
  s%   A#E) E: )E76E7:FFc                d   V P                   ;_uu_ 4        V P                  e$   \        V P                  RR 4      ! 4       '       g	   RV n        MV P                  '       d   \	        R4      hV P                  4       pV P                  P                  4       w  r#V'       d   Vf3   \        P                  ! R4       V P                  P                  4       w  r#V'       d   Vf   RV n	        \	        V P                  4      hVP                  RV\        \        VR^4      4      \        .4      w  r$V'       g   R	V n	        \	        V P                  4      hV ;P                  ^,          un        \        P                  ! 4       V n        VP                  4       uuR R R 4       #   + '       g   i     R # ; i)
Nr  c                      R # Fr  r  r   r   r  )WebcamManager.read_jpeg.<locals>.<lambda>2  s    Ur   Fu"   המצלמה כובתה ידניתg333333?u,   לא התקבלה תמונה מהמצלמה.r2   IMWRITE_JPEG_QUALITYu4   קידוד תמונת המצלמה ל־JPG נכשל.)r  r  rR  r  r  r  r9  r   rr  r  imencoder   CAMERA_JPEG_QUALITYr  r  tobytes)r  r  r  frameencodeds   &    r   	read_jpegWebcamManager.read_jpeg,  s!   YYY
 xxwtxx]'S'U'U&+#$$$"#GHH##%CIB

4  HHMMO	"P"4??33,,vus73H^`a;b7cex6yzKB"X"4??33KK1K!%D??$/ YYYs   AF!A<FB5FF/	c                   V P                   ;_uu_ 4        R V n        V P                  e    V P                  P                  4        RV n        RV n        RRR4       R#   \         d     L%i ; i  + '       g   i     R# ; i)TNr  )r  r  r  r
  r   r  r  s   &r   stopWebcamManager.stopF  sg    YYY"&Dxx#HH$$& DH DN Y
 !  YYs.   A/AA/A,)A/+A,,A//B 	c                   V P                   ;_uu_ 4        V P                  e    V P                  P                  4        RV n        RV n        RV n        RV n         RRR4       R#   \         d     L4i ; i  + '       g   i     R# ; i)zRelease stale webcam handles and allow the next stream to start.

This is intentionally lighter than a full camera reset: it does not stop
audio or recording. It is used before assigning a new MJPEG src in the UI.
Nr  Fr   T)r  r  r
  r   r  r  r  r  s   &r   prepare_new_stream WebcamManager.prepare_new_streamQ  ss     YYYxx#HH$$& DH DN"'D DO Y ! 	 YYs-   A7A&A7&A41A73A44A77B	c                    V P                  4        V P                  ;_uu_ 4        RV n        RV n        ^ V n        RV n        RRR4       R#   + '       g   i     R# ; i)z>Stop all current webcam capture state and clear sticky errors.Fr   r  NT)r  r  r  r  r  r  r  s   &r   force_resetWebcamManager.force_resetc  sI    		YYY"'D DODK!$D	 
  Y
 s   AA	c                ~   V P                   ;_uu_ 4        \        V P                  R J;'       d    V P                  P                  4       4      pR\        RTR\
        R\        R\        R\        R\        RV P                  '       d6   \        P                  ! R	\        P                  ! V P                  4      4      MR
RV P                  '       d6   \        P                  ! R	\        P                  ! V P                  4      4      MR
RV P                  RV P                   /uuR R R 4       #   + '       g   i     R # ; i)Nr  activer  rU  rV  fpsjpeg_qualityr  r   r   r  r  r  )r  ru  r  r  r  r  r  r  r	  r  r  r   r   r  r  r  r  r  r$  s   & r   r  WebcamManager.statusm  s    YYY$(($.FF4883D3D3FGF>&-z 3cgcqcqcqT]]+>t~~@^_wykok}k}k}/BDNNSWSeSeDf!g  DF$++doo YYYs   A2D+AD+AD++D<	)r  r  r  r  r  r  r  N)r\  r]  r^  r_  r  r  r  r  r  r  r!  r  ra  rl  rm  s   @r   r  r    s2     $4%4	!$ r   r  c                     \         P                  ! \        R R7       \        \         P                  P                  \        R4      RRR7      ;_uu_ 4       pVP                  \        P                  ! R4      R,           \        V 4      ,           R,           4       R	R	R	4       R	#   + '       g   i     R	# ; i  \         d     R	# i ; i)
Tr   zcamera_security.logr  r   r   r   rR  ru  N)r   r   r  r   r   r   r  r   r   r   r   rD  s   & r   log_camera_eventr*    s    
Ht,"'',,x)>?wWW[]HHT]]#67%?#g,NQUUV XWWW s1   AB8 AB$B8 $B5	/B8 5B8 8CCc                   a R. R. R. R. RR/ R/ /RRRR/o\        4       p V '       g   R	SR&   S# \        P                  R
8w  d   RSR&   S#  \        P                  ! V RRRRRRR.RRRR^\        4       R7      pVP                  ;'       g    RR,           VP                  ;'       g    R,           pVR"R SR&   RpRpRpV3R lpV3R lpVP                  4        EFV  pVP                  4       p	RV	9   d	   RpRpRpK#  RV	9   d	   RpRpRpK2  \        P                  ! RV\        P                  R7      p
V
'       d+   V'       d#   V'       d   V! WTV
P                  ^4      4       K  \        P                  ! RV4      pV'       d<   VR#9   d5   R V	9  d.   VP                  ^4      P                  4       pV! W<4       TpTpK  \        P                  ! R!V\        P                  R7       FF  w  rVP                  4       R8X  d   RMRpV! WP                  4       4       VP                  4       pTpKH  	  EKY  	  S#   \          d   p\#        T4      SR&    Rp?S# Rp?ii ; i)$a  Return DirectShow audio/video devices available to FFmpeg on Windows.

v22 fix: FFmpeg on Windows usually prints devices under section headers like
"DirectShow audio devices" and then plain quoted names. Older builds only
looked for a non-standard `"name" (audio)` suffix, so microphones could be
missed even when they existed. This parser supports both formats and also
stores Alternative names, which are often more reliable than friendly names.
r  r  	video_alt	audio_altalternativesrp  r   r.  u   FFmpeg לא נמצא.r   uk   זיהוי התקני מצלמה/מיקרופון דרך DirectShow נתמך כאן בעיקר ב־Windows.r  z-list_devicestrue-fdshowr  dummyTr   r   rX  rY  r   rZ  r[  r]  ru  Nc                    < V '       d	   V'       g   R # V R8X  d   RMRpVSV,          9  d   SV,          P                  V4       R # R # )Nr  r  )r  )rx  r   bucketdevicess   && r   
add_device(ffmpeg_dshow_devices.<locals>.add_device  s;    t $WWF76?*&&t, +r   c                    < V '       d   V'       d	   V'       g   R # V R8X  d   RMRpVSR,          P                  V / 4      V&   VSV,          9  d   SV,          P                  V4       R # R # )Nr  r,  r-  r.  )
setdefaultr  )rx  r   alt
alt_bucketr6  s   &&& r   add_alt%ffmpeg_dshow_devices.<locals>.add_alt  s[    t3(,[JADGN#..tR8>'*--
#**3/ .r   zdirectshow video deviceszdirectshow audio deviceszAlternative name\s+"([^"]+)"r  z\]\s+"([^"]+)"zalternative namez"([^"]+)"\s+\((video|audio)\)i>   r  r  )rK  r   r   rS  r^  rV  ry  rz  r|  r   r  r  r  r  r   rq  r   r   )rC  r  r.  sectioncurrent_namecurrent_kindr7  r=  r  r  	alt_match
name_matchr   rx  r  r6  s                  @r   ffmpeg_dshow_devicesrD    sj    GRb+r>\cegiprt[uw~  AC  EJ  LN  OG#%F2	ww$ I?$NN^_fdGTSZ[13
	 %%2-1A1A1G1GRHUV	-	0 NN$D**,C)S0!##)S0!##		"A4rttTI\lIOOA4FG#4d;Jg);;@RZ]@]!''*0027)#& jj)I4WYW[W[\
"&**,'"9ww4.#zz|#	 ]5 %B N  $s8N$s>   ?H8 H8 (BH8 <H8 H8 8H8 B1H8 8IIIc                     T ;'       g    R P                  4       p\        P                  ! RV4      p0 RmpV Uu0 uF  p\        V4      ^8  g   K  WC9  g   K  VkK!  	  up# u upi )r   u   [a-z0-9א-ת]+>   hdmicprousbarrayr  r  cameradevicerw  webcamcapture
microphone   מערך
   מצלמה   מיקרופון)r   r  rq  r,  )r   rY  tokensr  ts   &    r   _device_tokensrU    sY    JJBDZZ)40F qD?v!Q1AAAv???s   A"A"A"c                 ^  a T ;'       g    \        4       p \        '       d   R \        RRRRRR/.# \        ;'       g$    V P                  R4      ;'       g    R.^ ,          p\	        V4      p. pV P                  R	4      ;'       g    / P                  R
/ 4      p\        V P                  R
4      ;'       g    . 4       F  w  rV\	        V4      p^dV,
          pV'       d(   V'       d    V^\        W',          4      ,          ,          pVP                  4       o\        ;QJ d    V3R lR 4       F  '       g   K   RM	  RM! V3R lR 4       4      '       d
   V^,          pVP                  R VRRRVRR/4       VP                  V4      p	V	'       g   K  VP                  R V	RRV 2RV^,
          RR/4       K  	  VP                  R RR7       . p
\        4       pV FM  pVR ,          '       g   K  VR ,          V9  g   K$  V
P                  V4       VP                  VR ,          4       KO  	  V
# )r   r  envscore  r;  Fr  r   r.  r  c              3   ,   <"   T F	  qS9   x  K  	  R # 5ir   r  )r   r   r  s   & r   r   -preferred_audio_candidates.<locals>.<genexpr>  s     a!`ACx!`   Tfriendlyalternative for c                 &    V P                  R ^ 4      # )rX  r   )r   s   &r   r  ,preferred_audio_candidates.<locals>.<lambda>  s    AEE'1-r   rT  reverse)rM  rK  logitechc920c922briorI  )rD  CAMERA_AUDIO_DEVICECAMERA_VIDEO_DEVICEr   rU  r  r,  r   r  r  sortr  rN  )r6  r  video_tokensr  r.  r  r   rS  rX  r;  r9  rW  r  r  s   &            @r   preferred_audio_candidatesrl    s   //-/G,hwUTYZ[[DDGKK$8$@$@RD!#DE!%(LDKK/552::7BGLW[[177R8%aFR#l3444Ejjl3a!`a333a!`aaaRKEVT8Z%PUVWt$3KKh2B4&0I7TY\]T]_dfjkl 9 	II-tI<F5Dv;;3v;d2MM#HHS[!  Mr   c                    T ;'       g    \        4       p \        '       d   R \        RRRRRR/.# V P                  R4      ;'       g    / P                  R/ 4      p. p\        V P                  R4      ;'       g    . 4       Fe  w  r4^dV,
          pVP	                  R VRR	RVRR/4       VP                  V4      pV'       g   KB  VP	                  R VRR
V 2RV^,
          RR/4       Kg  	  . p\        4       pV FM  p	V	R ,          '       g   K  V	R ,          V9  g   K$  VP	                  V	4       VP                  V	R ,          4       KO  	  V# )r   r  rW  rX  rY  r;  Fr.  r  r]  r^  T)rD  ri  r   r  r  r  rN  )
r6  r.  r  r  r   rX  r;  r9  rW  r  s
   &         r   preferred_video_candidatesrn    s8   //-/G,hwUTYZ[[KK/552::7BGLDW[[177R8aVT8Z%PUVWt$3KKh2B4&0I7TY\]T]_dfjkl 9 F5Dv;;3v;d2MM#HHS[!  Mr   c                      \        4       p \        V 4      p\        V 4      pWR &   W R&   V'       d   V^ ,          R,          MRpV'       d   V^ ,          R,          MRpW4V 3# )video_candidatesaudio_candidatesr   r   )rD  rn  rl  )r6  rp  rq  r  r  s        r   selected_ffmpeg_devicesrr    se    "$G1':1':"2"2+;Q'E+;Q'E  r   c                     . pV '       d   VP                  R V ,           4       V'       d   VP                  RV,           4       RP                  V4      # )zvideo=audio=re  )r  r   )video_deviceaudio_devicer0  s   && r   dshow_input_namerw  %  s=    EX,-X,-88E?r   c           	          V '       d&   \         P                  P                  V 4      '       g   R # \        V R4      ;_uu_ 4       pVP	                  ^ \         P
                  4       VP                  4       pVP	                  \        ^ W1,
          4      4       VP                  4       P                  RRR7      pRRR4       XV) R #   + '       g   i     L; i  \         d     R # i ; i)r   r8  r   r   rZ  N)r   r   r   r   r  SEEK_ENDtellr>  r9  decoder   )r   	max_charsr   r  r   s   &&   r   tail_text_filer~  .  s    
277>>$//$GGAr{{#779DGGC4+,-779##GI#>D	 
 YJK     s4   C $C C A3C8C C	C C('C(c                   `   a  ] tR tRt o R tR tR tR tRR ltR t	R t
R	 tR
 tR tRtV tR# )CameraAudioStreamManageri<  c                    \         P                  ! 4       V n        R V n        RV n        RV n        RV n        \        V n        R V n	        . V n
        R # )Nr  r   )r  r  r  procr  rL  r  CAMERA_AUDIO_LOG_PATHlog_path
log_handlecandidates_triedr  s   &r   r  !CameraAudioStreamManager.__init__=  sB    OO%		- "r   c                     V P                   '       d   V P                   P                  4        R T n         R #   \         d     Li ; ir   )r  closer   r  s   &r   _close_log_locked*CameraAudioStreamManager._close_log_lockedG  s=    	%%'   		s   7 7 AAc                X    \         P                  ! \        R R7       \        \        RRR7      ;_uu_ 4       pVP                  \        P                  ! R4      R,           \        V4      ,           R,           4       RRR4       R#   + '       g   i     R# ; i  \         d     R# i ; irQ  )
r   r   r  r   r  r  r   r   r   r   r  r   r   s   && r   _append_audio_log_locked1CameraAudioStreamManager._append_audio_log_lockedO  sr    	KK40+S7CCr':;eCc'lRUYYZ DCCC 		rF  c                h   \         P                  ! \        R R7       V P                  R\	        V4      ,           4       \        \        R4      pR)\        P                  ! R4      ,           R,           \	        V4      ,           R,           P                  RRR	7      p VP                  V4       VP                  4        VR
RRRRRRRRRV,           RRRRRRRRRRRR.p\        \        \        R^ 4      4      p\        P                   ! V\        P"                  \        P$                  W6R 7      p\        P&                  ! R!4       VP)                  4       e    VP                  4        VP+                  4        \-        \        R#4      pV P                  R$\	        V4      ,           4       V P.                  P1                  R%VR&R'/4       R(\	        V4      ,           R,           VR*R" ,           V n        R+# V P.                  P1                  R%VR&R /4       Ws3#   \         d     ELci ; i  \         d     Li ; i),Tr   ztrying audio device: abru  r   z | ffmpeg audio start | device=r   r   ry  r  -nostdinr  warningr0  r1  
-rtbufsize64Mr  rt  r  -acr   r  r   r  r  r  96kmp3zpipe:1rj  ro  ry  rz  r]  g      ?Ni	  zdevice failed immediately: rL  r  Fu;   FFmpeg לא הצליח לפתוח את המיקרופון: H
======================================================================
r  NN)r   r   r  r  r   r   r  r   r   r  r  r  r   rV  rR  rS  rt  ru  PIPErr  pollr  r~  r  r  r  )	r  rC  
audio_namelogfhr  r_  r]  r  errs	   &&&      r   _start_candidate_locked0CameraAudioStreamManager._start_candidate_lockedW  s-   
Ht,%%&=J&OP*D1(4==9L+MMPqqtw  yC  uD  D  GK  K  S  S  T[  dm  S  n	KKKKM NJY'<h6K5#ugz<QVX\^cem

 0
D^`a0bc:+=+=joo^c  B

499;" !!6=C))*G#j/*YZ!!(((Je)LM[^abl^mmpttwz  |A  |B  xC  CDO$$h
D$%GH{-  		  s$   !H  H# H H #H10H1c                    V P                   ;_uu_ 4        V'       d   V P                  4        V P                  4       uuR R R 4       #   + '       g   i     R # ; ir   )r  stop_lockedstart_locked)r  r   s   &&r   r)  CameraAudioStreamManager.startw  s2    YYY  "$$& YYYs   (AA	c                B   V P                   e)   V P                   P                  4       f   V P                   # \        '       g   \        R4      h\	        4       pV'       g   \        R4      h\        4       w  r#p\        V4      p. V n        V'       gB   VP                  R4      ;'       g    RR	R  pRV,           V n	        \        V P                  4      hRpV F  pVP                  R4      ;'       g    Rp	V	'       g   K(  V P                  W4      w  rV
eP   Wn         Wn        \        P                  ! 4       V n        Wn        RV n	        \        RV	 24       V P                   u # V P                  pK  	  R V n         V P!                  4        V'       g   Rp\        V4      h)
NuK   אודיו מצלמה כבוי בהגדרת TRIPSERVER_ENABLE_CAMERA_AUDIO.uJ   FFmpeg לא נמצא. נדרש FFmpeg כדי להזרים אודיו חי.r.  r   u   לא נמצא התקן מיקרופון ב־FFmpeg. בדוק הרשאות Windows או הגדר TRIPSERVER_FFMPEG_AUDIO_DEVICE.
r   zaudio stream started | device=u`   כל ניסיונות פתיחת האודיו נכשלו. בדוק לוג אודיו מצלמה.i<)r  r  CAMERA_AUDIO_ENABLEDr  rK  rr  rl  r  r   r  r  r  r   r  rL  r*  r  )r  rC  r  r  r6  rI  raw_tailr  r  r   r  r  s   &           r   r  %CameraAudioStreamManager.start_locked}  sd   99 TYY^^%5%=99##lmm')kll35'/8
 "E*00b%&9H b  em  mDOt//
C776?((bD66vDKD 	"'"&))+""$ #A$!HIyy J  	 {J:&&r   c              #    "    V P                   ;_uu_ 4        V P                  4       pR R R 4       Xe   VP                  4       fm   VP                  '       d   VP                  P	                  R4      MRpV'       g0   VP                  4       e   R\        \        R4      ,           V n        MVx  K  V P                  4        R #   + '       g   i     L; i  \         d     L2\         d@   p\        T4      T n        T P                  R\        T4      ,           4       Rx   R p?LvR p?ii ; i  T P                  4        i ; i5i)Nr<  r   u5   שידור האודיו נסגר על ידי FFmpeg. @  zstream exception: )r  r  r  ry  r9  r~  r  r  GeneratorExitr   r   r  r~  r  )r  r  r{  r  s   &   r   stream_chunks&CameraAudioStreamManager.stream_chunks  s     	((* "tyy{':26+++((.3yy{.*adr  tI  KO  eP  +P IIK!   	 	!#hDO))*>c*JKI	
 IIKsz   EC C/C $C >.C ,D1 -C 3EC	C D.#D1 %D..D./5D)$D1 )D..D1 1EEc                4   V P                   pR V n         Ve6   VP                  4       f$    VP                  4        VP                  ^R7       V P                  4        RV n        R #   \         d'     TP                  4         L7  \         d      LEi ; ii ; i)Nrt  r  )r  r  	terminatewaitr   killr  r  r  r  s   & r   r  $CameraAudioStreamManager.stop_locked  s    yy			 3 		!	$ 	   IIK  s)   "A& &B2BBBBBc                    V P                   ;_uu_ 4        V P                  4        \        R 4       RRR4       R#   + '       g   i     R# ; i)zaudio stream stoppedN)r  r  r*  r  s   &r   r  CameraAudioStreamManager.stop  s,    YYY34 YYYs	   ;A	c                   V P                   ;_uu_ 4        \        V P                  R J;'       d    V P                  P                  4       R J 4      pR\        RTRV P
                  RV P                  '       d6   \        P                  ! R\        P                  ! V P                  4      4      MRRV P                  R\        R	V P                  /uuR R R 4       #   + '       g   i     R # ; i)
Naudio_enabledr$  rL  r  r   r   r  r  r  )r  ru  r  r  r  rL  r  r   r   r  r  r  r  r'  s   & r   r  CameraAudioStreamManager.status  s    YYY$))4/LLDIINN4D4LMF!5&$++eietetetdmm,?PTP_P_A`az|doo1"D$9$9 YYYs   A"C8ACC)	)r  rL  r  r  r  r  r  r  Nr  )r\  r]  r^  r_  r  r  r  r  r)  r  r  r  r  r  ra  rl  rm  s   @r   r  r  <  s>     #@'"'H(5
 r   r  c                   B   a  ] tR tRt o R tR tR	R ltR tR tRt	V t
R# )
CameraRecordingManageri  c                    \         P                  ! 4       V n        R V n        RV n        RV n        RV n        RV n        RV n        RV n	        RV n
        R V n        R # r  )r  r  r  r  r  	file_pathr  r  
with_audioru  rv  r  r  s   &r   r  CameraRecordingManager.__init__  sQ    OO%		r   c                   V P                   ec   V P                   P                  4       eE    V P                  '       d   V P                  P                  4        R T n        R T n         RT n        R # R # R #   \         d     L(i ; i)Nr  )r  r  r  r  r   r  r  s   &r   _refresh_locked&CameraRecordingManager._refresh_locked  sn    99 TYY^^%5%A???OO))+ #DODI!DO &B   s   A3 A3 3B Bc                   V P                   ;_uu_ 4        V P                  4        V P                  e(   V P                  P                  4       f   \	        R4      h\
        '       g   \	        R4      h\        4       pV'       g   \	        R4      h\        4       w  r4pV'       g   \	        R4      hV'       d   V'       g   \	        R4      h\        P                  ! \        RR7       \        P                  ! R4      p\        P                  P                  \        R	V R
24      p\        P                  P                  \        R	V R24      p\        Y1'       d   TMR4      p	VRRRRRRR\!        \"        4      R\$         R\&         2RV	R\!        \(        4      RRRRRRRR.p
V'       d   V
R R!R"\*        .,          p
M
V
R#.,          p
V
R$R%V.,          p
\-        VR&4      p\/        \1        \2        R'^ 4      4      p\2        P4                  ! V
\2        P6                  \2        P8                  WR(7      V n        Wn        \        P                  ! 4       V n        Wpn        Wn         RV n!        \E        V4      V n#        W0n$        V'       d   TMRV n%        \M        R)\O        4        R*T R+T R,V PJ                  ;'       g    R- 24       VuuR R R 4       #   + '       g   i     R # ; i).NuR   יש כבר הקלטה פעילה. עצור אותה לפני התחלה חדשה.uQ   הקלטת מצלמה כבויה בהגדרת TRIPSERVER_ENABLE_CAMERA_RECORDING.uP   FFmpeg לא נמצא. נדרש FFmpeg כדי להקליט וידאו/אודיו.uy   לא נמצא התקן מצלמה ב־FFmpeg. בדוק הרשאות Windows או הגדר TRIPSERVER_FFMPEG_VIDEO_DEVICE.ua   ביקשת הקלטה עם אודיו, אבל לא נמצא התקן מיקרופון ב־FFmpeg.Tr   r  room_camera_rA   z.ffmpeg.logr   r  r  r0  r1  r  512M
-framerate-video_sizer  r  -tr}  r  r  veryfastr  23r  r  -c:aaacr  r|  r  r  r  rj  r  zrecording started by  | file=	 | video=	 | audio=no-audio)(r  r  r  r  r  CAMERA_RECORDING_ENABLEDrK  rr  r   r   CAMERA_RECORDINGS_DIRr   r   r   r   rw  r   CAMERA_RECORD_FPSr  r  CAMERA_RECORD_MAX_SECONDSCAMERA_AUDIO_BITRATEr   rV  rR  rS  rt  r  ru  r  r  r  r  r  ru  r  ru  rv  r*  r  )r  r  rC  r  r  r6  r  r  r  
input_namer_  r  r]  s   &&           r   r)  CameraRecordingManager.start  s   YYY  "yy$)9)A"#wxx++"#vww+-F"#uvv$;$=!E'"  $_  `  `%"  $G  H  HKK-=MM/2EWW\\"7<wd9STFww||$9\%P[;\]H)%*"MJdG\6c"34m~UVWdVeEfj$,E(F	9j&$
T]	C v/CDDwKv66C4(E3GJHbde4fgM"((JOOJL^L^gl  KDI#O"iikDO#N$M DO":.DO %)3D4]_4EXfXU^_d^eenos  pA  pA  pO  pO  EO  oP  Q  RU YYYs&   AK'AK7K?G6K6
KK	c                r   V P                   ;_uu_ 4        V P                  4        V P                  pVf!   V P                  ;'       g    RuuR R R 4       #  VP                  '       d6   VP                  P                  R4       VP                  P                  4         TP                  ^
R7        T P                  '       d   T P                  P                  4        R T n        R T n        RT n        \        R\        4        RT P                   24       T P                  uuR R R 4       #   \         d'     TP                  4         L  \         d      Li ; ii ; i  \         d'     TP                  4         L  \         d      Li ; ii ; i  \         d     Li ; i  + '       g   i     R # ; i)Nr      qrt  r  zrecording stopped by r  )r  r  r  r  ro  r  r  r   r  r  r  r  r  r  r*  r  r  s   & r   r  CameraRecordingManager.stop  s^   YYY  "99D|~~++	 Y
:::JJ$$T*JJ$$&		"	%???OO))+ #DODI!DO4]_4EXdnnM]^_>>= Y  NN$    IIK    1 YYs   3F%	F%D,)5D,E 2FFAF%,E8E
F%
E	EF%E	EF% F,E><F%>F		F
F%F	FF%F"F%!F""F%%F6	c                    V P                   ;_uu_ 4        V P                  4        \        V P                  R J;'       d    V P                  P	                  4       R J 4      pV P
                  '       dY   \        P                  P                  V P
                  4      '       d*   \        P                  P                  V P
                  4      M^ pR\        RTRV P
                  RV P
                  '       d*   \        P                  P                  V P
                  4      MRRTRV P                  '       d6   \        P                  ! R\        P                  ! V P                  4      4      MRR	V'       dB   V P                  '       d0   \!        \        P                  ! 4       V P                  ,
          4      M^ R
V P"                  RV P$                  RV P&                  RV P(                  RV P*                  /uuR R R 4       #   + '       g   i     R # ; i)Nrecording_enabledr$  r  rn  r   r  r  r   elapsed_secondsr  ru  rv  r  r  )r  r  ru  r  r  r  r   r   r   r  r  r   r  r   r   r  r   r  ru  rv  r  r  )r  r$  r  s   &  r   r  CameraRecordingManager.status=  sT   YYY  "$))4/LLDIINN4D4LMF6:nnnX\XfXfIgIg277??4>>2mnD#%=&T^^RWW--dnn=UWTeietetetdmm,?PTP_P_A`az|!TXTcTcTc3tyy{T__'D#Eijdoo 1 1 1 1DMMdoo	 YYYs2   AG<3.G<"AG<4>G<3>G<2G<A-G<<H	)
rv  r  r  r  r  r  r  r  ru  r  NT)r\  r]  r^  r_  r  r  r)  r  r  ra  rl  rm  s   @r   r  r    s%     
	"+Z"B r   r  c                   b   a  ] tR tRt o RtR tR tR tR tRR lt	RR lt
R	 tR
 tR tRtV tR# )CameraHlsStreamManageriR  a\  Unified video+audio live stream using one FFmpeg DirectShow process.

Some USB webcams expose camera and microphone as one physical device. Opening
video through OpenCV and audio through a separate FFmpeg process can fail or
lock the device. HLS captures `video=...:audio=...` in one process, closer to
how Zoom/Teams uses the camera+mic together.
c                    \         P                  ! 4       V n        R V n        RV n        RV n        RV n        RV n        RV n        RV n	        R # )Nr  r   Tr  )
r  r  r  r  r  ru  rv  r  r  r  r  s   &r   r  CameraHlsStreamManager.__init__Z  sC    OO%			r   c                X    \         P                  ! \        R R7       \        \        RRR7      ;_uu_ 4       pVP                  \        P                  ! R4      R,           \        V4      ,           R,           4       RRR4       R#   + '       g   i     R# ; i  \         d     R# i ; i)	Tr   r  r   r   r   z	 | hls | ru  N)
r   r   r  r   CAMERA_HLS_LOG_PATHr  r   r   r   r   r  s   && r   _logCameraHlsStreamManager._logd  ss    	KK40)3AAR':;kICPWLX[__` BAAA 		rF  c                    \         P                  ! \        R R7       \         P                  ! \        4       Fc  pVP	                  4       P                  R4      '       g   K*   \         P                  ! \         P                  P                  \        V4      4       Ke  	  R#   \         d     Kw  i ; i  \         d-   pT P                  R\        T4      ,           4        Rp?R# Rp?ii ; i)Tr   zclean hls dir failed: N).m3u8.tsr   )r   r   CAMERA_HLS_DIRr  r   r  r  r   r   r   r  r~  )r  r   r  s   &  r   _clean_dir_locked(CameraHlsStreamManager._clean_dir_lockedl  s    		<KK6

>2::<(()ABB		"'',,~t"DE 3 %  	<II.c:;;	<s<   AB3 #8B!B3 !B0,B3 /B00B3 3C*>!C%%C*c           
        \          R\         2p. pVRRR3 F  pW29  g   K  VP                  V4       K  	  . p\        ^^^
3 F1  p \	        V4      pT^ 8  g   K  Y49  g   K   TP                  T4       K3  	  . pVR,           F)  pVP                  RV RV 2RVR	\        V4      .34       K+  	  V F  pVP                  RV R
2RV.34       K  	  V F$  pVP                  RV 2R	\        V4      .34       K&  	  VP                  R. 34       \        4       p. p	V F;  w  r\        V4      pW9  g   K  V	P                  W34       VP                  V4       K=  	  V	#   \
         d     EK*  i ; i)aq  Return DirectShow option fallbacks for webcams.

Some USB webcams, including EMEET models, work in OpenCV but reject a
forced FFmpeg DirectShow combination such as -video_size 1280x720
together with -framerate 15. FFmpeg then fails with: Could not set video
options. v25 tries progressively safer combinations and finally lets the
driver auto-negotiate the video mode.
r  1280x720640x480	1920x1080:N   Nzsize=z,fps=r  r  z	,auto-fpszauto-size,fps=zdriver-auto)
r  r  r  r  r   r   r   r  r  rN  )r  preferred_sizecommon_sizesr  
fps_valuesrI  r%  r  rW  uniquer`   optsrT  s   &            r   _hls_input_option_candidates3CameraHlsStreamManager._hls_input_option_candidatesx  s    )>=/:#ZKHD'##D) I 
&B3D4y axD2!!$' 4 
b>>C~&6eC5AMSacoqtuxqyCz{| " DtfI68MNO !Cu5c#h7OPQ ="-.u%KE+Cum,	 &
 )  s   EE/.E/c                	   \        4       pV'       g   \        R 4      hV P                  4        \        P                  P                  \        R4      p\        P                  P                  \        R4      p\        W4      p\        P                  ! \        P                  P                  \        4      RR7       RpV P                  4        EF  w  rV P                  4        VRRRR	R
RRRR.
\        V	4      ,           RVRRRRRRRRR\        \        4      .,           p
V'       d   V
RRR\        RRRR.,          p
M
V
R .,          p
V
RR!R"RR#R$R%R&R'VV.,          p
\!        \        R(4      p RE\"        P$                  ! R*4      ,           R+,           V,           R,,           V,           R-,           R.P                  V
4      ,           R),           P'                  R/R0R17      pVP)                  V4       VP+                  4        \/        \1        \2        R2^ 4      4      p\2        P4                  ! V
\2        P6                  \2        P6                  WR37      p\"        P"                  ! 4       R4,           p\"        P"                  ! 4       V8  Ed%   VP9                  4       e   EM\        P                  P;                  V4      '       d   \        P                  P=                  V4      ^8  d   Wn        \"        P"                  ! 4       V n         Wn!        W n"        \G        V4      V n$        RV n%        V'       d   R6MR7V,           V n&        T PO                  R8V,           R9,           \        V4      ,           R:,           \        T;'       g    R;4      ,           4        R# \"        PP                  ! R<4       EK?   VP9                  4       f#   VPS                  4        VPU                  ^R=7        TPY                  4        \[        \        R>4      pR?T9   g   R@T9   d*   T PO                  RAT,           R,,           T,           4       EKf  T PO                  RAT,           R,,           T,           4       EK  	  RBV,           R),           V'       d   VRFR5 MR,           V n%        V PO                  RCV,           4       RD#   \,         d     ELi ; i  \,         d(     TPW                  4         L  \,         d      ELi ; ii ; i  \,         d     EL
i ; i)GuT   FFmpeg לא נמצא. נדרש FFmpeg לשידור וידאו+אודיו מאוחד.stream.m3u8zseg_%05d.tsTr   r   r  r  r  r  r  r0  r1  r  r  r  r}  r  r  	ultrafastz-tunezerolatencyr  r  z-rr  r  r  r  r   r  r   r|  hlsz	-hls_timez-hls_list_size5z
-hls_flagsz.delete_segments+omit_endlist+program_date_timez-hls_segment_filenamer  ru  r   z | unified HLS start | mode=z	 | input=z
cmd=r   r   r   ry  rj  r         @Nzhls_av:zhls_video_only:zHLS started ok | mode=r  r  r  gffffff?rt  ih  zCould not set video optionszError opening inputz)HLS candidate failed; trying next | mode=u[   FFmpeg לא הצליח לפתוח שידור מאוחד אחרי כל מצבי DirectShow: z"HLS failed all candidates | input=Fr  i).rK  r  r  r   r   r   r  rw  r   r   r  r  r  r   r  r  r   r   r   r  r  r  r   rV  rR  rS  rt  ru  r  r   r  r  r  ru  rv  ru  r  r  r  r  rr  r  r  r  r  r~  )r  
video_namer  rC  playlistsegment_patternr  last_err
mode_labelinput_optionsr_  r  r  rU  r  deadlines   &&&             r   _start_ffmpeg_locked+CameraHlsStreamManager._start_ffmpeg_locked  s   ')uvv 77<<>'',,~}E%j=

BGGOO$784H)-)J)J)L%J""$j+yg|V ]#$ j	9k7MItS1B-C'C v/CUGUZ\_``we[#/?N'	 C ,d3E04==AT3UUXvv  zD  D  GR  R  U_  _  bj  j  mp  mu  mu  vy  mz  z  }A  A  I  I  JQ  Zc  I  dF# ,GJ@Z\],^_E##Cz/A/A*J\J\ej  ADyy{S(H))+(99;*77>>(++0IB0N $I&*iikDO(2%(2%&*:&6DO&(DO.8>OS] ]DIII6CkQTWXbTccfqqtw  yC  yQ  yQ  GQ  uR  R  S

4 99;&NN$IIaI( &&94@H,8<QU]<]		E
RU``cmmnIIAJNQ\\_iij} *M~ x  {E  E  HL  L  dl  PX  Y^  Y_  P`  rt  u		6CDQ  .  IIK    sO   +BR &4R2S' R/.R/2S$>SS S$S  S$'S65S6c                \   V P                   ;_uu_ 4        V'       d   V P                  4        V P                  e(   V P                  P                  4       f    R R R 4       R# \        '       g   \        R4      h\        4       w  r4pV'       g   \        R4      h \        P                  4         \        P                  4        V'       d   \        '       d   \        V4      M. pV'       d   V'       d   RpVR,           FV  pVP                  R4      ;'       g    Rp	V	'       g   K(  V P                  W94      '       d    R R R 4       R# V P                  pKX  	  V P                  VR4      '       d   RV,           V n         R R R 4       R# \        T;'       g    V P                  ;'       g    R4      hV P                  VR4      '       d    R R R 4       R# \        V P                  ;'       g    R4      h  \         d     ELUi ; i  \         d     ELRi ; i  + '       g   i     R # ; i)	NTu<   מצלמה כבויה בהגדרת TRIPSERVER_ENABLE_WEBCAM.u|   לא נמצא התקן וידאו ב־FFmpeg. בדוק הרשאות מצלמה או הגדר TRIPSERVER_FFMPEG_VIDEO_DEVICE.r   Nr  Nr   uc   האודיו נכשל ולכן הופעל וידאו בלבד. שגיאת אודיו אחרונה:
u   שידור מאוחד נכשל.)r  r  r  r  r  r  rr  CAMERA_MANAGERr  r   CAMERA_AUDIO_STREAMr  rl  r   r		  r  )
r  r  r   r  r  r6  
audio_rowslast_audio_errorr  r  s
   &&&       r   r)  CameraHlsStreamManager.start  s   YYY  "yy$)9)A	 Y
 ">"#abb$;$=!E'"  $b  c  c##%#((* AKOcOc3G<ikJj#% %b>>C!$!6!6BJ% 00CC#5 Y6 (,$ * ,,UB77 'M  P`  '`DO? Y@ ##3#k#kt#k#kJkll((33E YF tSS2STT/    ! YYs   AH#H/+HG60HHHH-H5%H
H&H
'H2HHH-HHH/H6HHHHHHHHH+	c                "   V P                   pR V n         Ve6   VP                  4       f$    VP                  4        VP                  ^R7       RV n        RV n        R #   \         d'     TP                  4         L.  \         d      L<i ; ii ; i)Nrt  r  r  )r  r  r  r  r   r  r  r  r  s   & r   r  "CameraHlsStreamManager.stop_locked  s    yy			 3 		!	$ 	  IIK  s)   "A B)A;;B
B	B

Bc                    V P                   ;_uu_ 4        V P                  4        V P                  R 4       RRR4       R#   + '       g   i     R# ; i)zHLS stoppedN)r  r  r  r  s   &r   r  CameraHlsStreamManager.stop"  s/    YYYIIm$ YYYs   "AA	c                   V P                   ;_uu_ 4        \        V P                  R J;'       d    V P                  P                  4       R J 4      p\        P
                  P                  \        R4      pRTRV P                  RV P                  RV P                  RV P                  RV P                  '       d6   \        P                  ! R\        P                  ! V P                  4      4      MR	R
\        P
                  P!                  V4      R\        P
                  P!                  V4      '       d    \        P
                  P#                  V4      M^ R\        R\$        RV P&                  /uuR R R 4       #   + '       g   i     R # ; i)Nr  r$  r  r  ru  rv  r  r   r   playlist_existsplaylist_sizer  r  r  )r  ru  r  r  r   r   r   r  r  r  ru  rv  r  r   r   r  r   r  r  r  )r  r$  r	  s   &  r   r  CameraHlsStreamManager.status'  s   YYY$))4/LLDIINN4D4LMFww||NMBH&		doo 1 1 1 1eietetetdmm,?PTP_P_A`az|!277>>(#;bggnnX>V>V!:\]~/doo YYYs   B$E9:A:E959E99F
	)rv  r  r  r  r  r  ru  r  Nr3  TT)r\  r]  r^  r_  r`  r  r  r  r  r		  r)  r  r  r  ra  rl  rm  s   @r   r  r  R  sA     
<&PKZ$UL%
 r   r  c                     \         P                  ! \        R R7       . p\        P                  ! \         P                  P                  \        R4      4       Ft  p VP                  R\         P                  P                  V4      RVR\         P                  P                  V4      R\         P                  P                  V4      /4       Kv  	  VP                  R R R7       VR	V  #   \         d     K  i ; i  \         d    . u # i ; i)
Tr   z*.mp4r   r   r  r  c                 &    V P                  R ^ 4      # )r  r`  r%  s   &r   r  (list_camera_recordings.<locals>.<lambda>M  s    w!2r   rb  N)r   r   r  r@  r   r   r  r   r  r   r   rj  )limitr  r   s   &  r   list_camera_recordingsr	  ?  s    
)D9IIbggll+@'JKDBGG,,T2DBGGOOD1RWW--d3	  L 	

2D
AVe}    	s7   AC; A0C)C; )C84C; 7C88C; ;D
Dc                 .   \         P                  ! \        R R7       R\        P                  ! R4       RV  R2p \        \        RRR7      ;_uu_ 4       pVP                  V4       R	R	R	4       V#   + '       g   i     T# ; i  \         d     T# i ; i)
Tr   [r   z] ru  r  r   r   N)	r   r   r  r   r   r   CAMERA_SETUP_LOG_PATHr  r   )r   r  r   s   &  r   append_camera_setup_logr#	  T  s    KK4(t}}012"WIR@D'w??2HHTN @ K	 @? K  Ks/   B A1'B 1B	<B B BBc           	          \        ^\        R\        V 4      4      4      p \        P
                  P                  \        4      '       g   R#  \        \        RRRR7      ;_uu_ 4       pVP                  4       pRRR4       RP                  XV ) R 4      #   \         d    ^Pp  Li ; i  + '       g   i     L8; i  \         d   pRT 2u Rp?# Rp?ii ; i)	r  ,  r   r   r   r   r  Nu+   שגיאה בקריאת לוג התקנה: )r>  r  r   r   r   r   r   r"	  r   r  r   )r  r   r   r  s   &   r   read_camera_setup_log_tailr&	  _  s    BCU,- 77>>/00C'wyQQUW<<>D RwwtUFG}%%  
 RQ  C<SEBBCsG   B B< (B)9B< B&%B&)B9	4B< <CCCCc                  t     ^ RI p R\        V RR4      3#   \         d   pR\        T4      3u Rp?# Rp?ii ; i)r   NTr  r   F)r  rR  r   r   )r  r  s     r   opencv_import_statusr(	  n  s<    WS-444 c#hs    7277c                  n   \        4       w  r\        4       ;'       g    R p\        ;_uu_ 4        \        \        4      pRRR4       RV RVR\        V4      RVR\        P                  RR\        P                   R	\         2R
\        R\        R\        R\        R\        RX/#   + '       g   i     Lm; i)r   Nr  opencv_inforC  r  python_executablepip_commandr}  z" -m pip install --upgrade opencv_packagesetup_log_pathmarker_pathauto_install_enabledauto_install_delay_seconds	installer)r(	  rK  CAMERA_SETUP_LOCKr   CAMERA_SETUP_STATEru  r   r   CAMERA_OPENCV_PACKAGEr"	  CAMERA_SETUP_MARKER_PATHCAMERA_AUTO_INSTALL_OPENCV!CAMERA_AUTO_INSTALL_DELAY_SECONDS)r  r  r  r   s       r   camera_setup_statusr9	  v  s    #%HB(*00bK		'( 
 	"t${#{S^^3>>**EF[E\]/// :$&GU  
	s   B$$B4	c                 D   \         P                  ! \        P                  RRR.RRRR^<R\	        4       R7      p V P
                  ^ 8X  dK   \        R	V P                  ;'       g    V P                  ;'       g    R
P                  4       ,           4       R# \        R4        \         P                  ! \        P                  RRR.RRRR^R\	        4       R7      p\        R\        VP
                  4      ,           4       VP                  '       d    \        RVP                  RR ,           4       VP                  '       d    \        RVP                  RR ,           4       VP
                  ^ 8H  #   \         d'   p\        R\        T4      ,           4        Rp?R# Rp?ii ; i)z@Make pip available in the same Python interpreter when possible.-mpipz	--versionTr   r   FrX  rY  r   rZ  r[  r\  r]  zpip available: r   z-pip not available, trying ensurepip --upgrade	ensurepip	--upgradezensurepip return code: zensurepip stdout:
Nzensurepip stderr:
zensurepip exception: i)rS  r^  r   r   rV  r{  r#	  ry  rz  r   r   r   r~  )checkepr  s      r   ensure_pip_availablerB	    st   NNCNND%EVZaepw  AJ  TV  ^c  sJ  sL  ME1 1U\\5W5WU\\5W5WUW4^4^4` `aKL
^^S^^T;L]ahlw~  HQ  [^  fk  {R  {T  U 9C<N NO999#$9BIIef<M$MN999#$9BIIef<M$MN}}!!  7$s) CDs    BE.  -E. .F9FFc                 X    \         P                  ! \        R R7       \        \        RRR7      ;_uu_ 4       pVP                  \        P                  ! R4      R,           \        V 4      ,           R,           4       RRR4       R#   + '       g   i     R# ; i  \         d     R# i ; i)	Tr   r   r   r   r   rR  ru  N)
r   r   r  r   r6	  r  r   r   r   r   )r  r   s   & r   write_camera_setup_markerrD	    sq    
Ht,*C'BBbHHT]]#67%?#d)KdRS CBBB rF  c                     \         ;_uu_ 4        \        P                  R RR\        P                  ! R4      RRRRRR	R
V /4       RRR4       \        R\        V 4      ,           4       \        R\        P                  ,           4       \        4       '       ga   Rp\        RV,           4       \         ;_uu_ 4        \        P                  R RR\        P                  ! R4      RRRVR
V /4       RRR4       R# \        P                  RRRR\        .p\        RRP                  V4      ,           4       RpRp \        P                  ! VRRRR\        R\        4       R7      p\        R\        VP                   4      ,           4       VP"                  '       d    \        RVP"                  R&R ,           4       VP$                  '       d    \        RVP$                  R&R ,           4       \'        4       w  r5VP                   ^ 8X  d0   V'       d(   RV,           p\        RV,           4       \)        V4       MLVP                   ^ 8X  d%   V'       g   RV,           p\        RV,           4       MR p\        RV,           4       Rp \         ;_uu_ 4        \        P                  R RR\        P                  ! R4      R\1        V4      RVR
V /4       RRR4       R#   + '       g   i     EL; i  + '       g   i     R# ; i  \        P*                   d     R!\         R"2p\        R#T,           4        L\,         d/   pR$\/        T4      ,           p\        R%T,           4        Rp?LRp?ii ; i  + '       g   i     R# ; i)'r  Tr  r   r  r   r  Fr  u   מתקין OpenCV...r  Nz OpenCV install requested | mode=zPython executable: ug   pip לא זמין וגם ensurepip לא הצליח. אי אפשר להתקין OpenCV אוטומטית.zERROR: r;	  r<	  installr?	  z	Command: r   r   r   r=	  zpip return code: zpip stdout:
zpip stderr:
u   OpenCV הותקן וזוהה: z	SUCCESS: uE   pip הסתיים בהצלחה אבל import cv2 עדיין נכשל: z	WARNING: u;   pip נכשל. בדוק את הלוג במסך ההתקנה.u5   התקנת OpenCV עברה את מגבלת הזמן (r8  z	TIMEOUT: u   שגיאה בהרצת pip: zEXCEPTION: i )r3	  r4	  r   r   r   r#	  r   r   r   rB	  r5	  r   rS  r^  %CAMERA_OPENCV_INSTALL_TIMEOUT_SECONDSrV  r{  ry  rz  r(	  rD	  r}  r   r~  ru  )r  r  r_  r  r  r  r  s   &      r   run_opencv_install_workerrH	    s   		!!9dL$--PcBdfsuwy}  @E  GU  Wm  ou  w{  #|  	} 
>TJK1CNNBC!!w	C0%%y%ViHjlprw  zH  JM  OU  W[  '\  ] >>4	;@U
VCK#((3-78	B
C!5NN913	
	 	  3c):N:N6O OP#Oi6F6Fvw6O$OP#Oi6F6Fvw6O$OP')1$2T9C#K#$56%c*!!Q&rY\``C#K#$56OC#IO4B 
	!!9e]DMMReDfhlnrsunv  yG  IL  NT  VZ  #[  	\ 
	a 
		 B $$ 3EFkEllyzc 12 5+d3i7 3445 
		sg   6K:4K*8BK> 
AK> &K> 5K> K> *K> =M,K'	*K;	>1M)1M):M);$M$$M),M=	c                 r   \         ;_uu_ 4        \        P                  R 4      '       d   RuuRRR4       # \        P                  R RR\        P
                  ! R4      RRRRR	R
RV /4       RRR4       \        P                  ! \        RV /RRR7      pVP                  4        R#   + '       g   i     LB; i)r  FNTr  r   r  r   r  r  u   מתחיל התקנה...r  ztripserver-opencv-installer)r  ra  r   daemon)Fu)   התקנת OpenCV כבר רצה כרגע.)Tuu   התקנת OpenCV התחילה ברקע. אפשר לרענן את מסך המצלמה/התקנה ולבדוק לוג.)
r3	  r4	  r   r   r   r   r  ThreadrH	  r)  )r  rT  s   & r   start_opencv_install_backgroundrL	    s    		!!),,E 
	 	!!9dL$--PcBdfsuwy}  @E  GU  Wq  sy  {  #@  	A 
 	 964.Wt  ~B  	CAGGI I  I 
	s   B&5B&&B6	c                 
  a  \         '       g   \        R 4       R# \        4       w  rV'       d`   \        ;_uu_ 4        \        P                  RRRR\        V4      ,           RR/4       RRR4       \        R\        V4      ,           4       R# \        ;_uu_ 4        R\        R	&   RRR4       V 3R
 lp\        P                  ! VRRR7      pVP                  4        R#   + '       g   i     L~; i  + '       g   i     LT; i)z>Auto install disabled by TRIPSERVER_CAMERA_AUTO_INSTALL_OPENCVr  Tr     OpenCV כבר זמין: r  readyNzalready available: r   c                  f  <  \         ^ 8  d   \        P                  ! \         4       \        4       w  rV '       d`   \	        R\        V4      ,           4       \        ;_uu_ 4        \        P                  RRRR\        V4      ,           RR/4       RRR4       R# \        R	\        S4      ,           R
,           \        V4      ,           4       \        R\        S4      ,           R7       R#   + '       g   i     R# ; i  \         d'   p\        R\        T4      ,           4        Rp?R# Rp?ii ; i)r   zavailable before auto install: r  Tr  rN	  r  rO	  Nz Auto install triggered | reason=z | cv2 import failed: zauto:r  z"Auto install scheduler exception: )r8	  r   rr  r(	  rD	  r   r3	  r4	  r   r#	  rL	  r   r~  )ok2info2r  rb  s      r   delayed_auto5maybe_start_camera_auto_install.<locals>.delayed_auto  s    	V014

<=-/JC)*KcRWj*XY&&&--tT>KehklqhrKrtz  }D  /E  F '#$FV$TWo$oruv{r|$|}+3v;1FG	 '&  	V#$H4PS9$TUU	VsB   
C? AC? %,C+C? AC? +C<	6C? <C? ?D0
D++D0z tripserver-opencv-auto-installerr  r   rJ	  )Fu'   התקנה אוטומטית כבויה.)Fu   OpenCV כבר מותקן.)Tu7   התקנת OpenCV אוטומטית תתחיל ברקע.)r7	  r#	  r(	  r3	  r4	  r   r   rD	  r  rK	  r)  )rb  r  r  rT	  rT  s   f    r   maybe_start_camera_auto_installrW	    s    %% `a??#%HB	%%tT>C]`cdh`iCikqsz&{| !"7#d)"CD11		/3+, 
V 	3U^bcAGGIJJ-  
	s   ,C
C2C/	2D	c                  :   \        4       w  r\        4       pVP                  R / 4      p\        VP                  R4      4      pVP                  R4      '       d   RMRpVP                  R4      '       d   RMRpV'       d   RMVP                  R4      '       d   RMRpV '       d   RMR\        P
                  ! V4       R	2p\        P
                  ! \        ^x4      4      ;'       g    R
p	RP                  . RNV NRNVP                  R4      '       d   RMR NRNV NRNVP                  R4      '       d   RMR NRNV NRNV'       d   RMVP                  R4      '       d   RMR NRNV NRN\        P
                  ! VP                  RR4      4       NRNVP                  R4      '       d   RMR NRN\        P
                  ! VP                  RR4      4       NRN\        P
                  ! \        VP                  RR4      4      4       NR N\        P
                  ! VP                  R!4      ;'       g    R4       NR"N\        P
                  ! \        VP                  R#4      ;'       g    R$4      4       NR%N\        P
                  ! \        VP                  R&4      ;'       g    R4      4       NR'N\        P
                  ! \        VP                  R(4      ;'       g    R4      4       NR)N\        P
                  ! \        4       NR*NV	 NR+N4      # ),r2	  r  r  r  r  rC  r  r   '   <div class='warn'>גישה חסומה: </div>u$   אין עדיין לוג התקנה.u5	  
<!DOCTYPE html><html lang="he" dir="rtl"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>התקנת רכיבי מצלמה</title>
<style>
body{margin:0;background:#07111f;color:white;font-family:Arial,'Segoe UI',sans-serif;padding:18px}.wrap{max-width:1050px;margin:auto}a{color:#bfdbfe;text-decoration:none}.hero{background:linear-gradient(135deg,#0f766e,#0f172a 62%,#111827);border:1px solid #14b8a6;border-radius:28px;padding:22px;margin-bottom:16px;box-shadow:0 20px 70px rgba(0,0,0,.28)}h1{margin:0 0 8px;font-size:34px}p{color:#cbd5e1;line-height:1.7}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px}.card{background:#111827;border:1px solid #334155;border-radius:20px;padding:16px;margin-top:14px}.badge{display:inline-block;border-radius:999px;padding:8px 14px;font-weight:900;margin:8px 6px 0 0}.badge.ok{background:#064e3b;color:#bbf7d0;border:1px solid #22c55e}.badge.warn{background:#7f1d1d;color:#fecaca;border:1px solid #f87171}.badge.idle{background:#334155;color:#e2e8f0;border:1px solid #64748b}button,.btn{border:0;border-radius:14px;padding:13px 16px;font-weight:950;color:white;background:#2563eb;margin:8px 8px 0 0;cursor:pointer;display:inline-block}button:disabled{background:#475569;cursor:not-allowed;opacity:.55}.warn{background:#7f1d1d;border:1px solid #f87171;color:#fecaca;border-radius:16px;padding:13px;line-height:1.65;margin:12px 0}.good{background:#052e2b;border:1px solid #14b8a6;border-radius:16px;padding:13px;color:#ccfbf1;line-height:1.65;margin:12px 0}.note{background:#0b1220;border:1px solid #334155;border-radius:16px;padding:13px;color:#cbd5e1;line-height:1.65;margin:12px 0}code,pre{direction:ltr;text-align:left;white-space:pre-wrap;word-break:break-word}pre{background:#020617;border:1px solid #334155;color:#fde68a;border-radius:12px;padding:12px;overflow:auto;max-height:440px}@media(max-width:700px){body{padding:13px}h1{font-size:28px}}
</style></head><body><div class="wrap"><div class="hero"><a href="/admin/camera">⬅ חזרה למצלמה</a><h1>🧩 התקנת רכיבי מצלמה</h1><p>OpenCV מותקן אוטומטית חד־פעמית ברקע כאשר פאנל האדמין עולה. FFmpeg לא מותקן כאן; הוא רק מזוהה מהנתיב שכבר קיים אצלך.</p><span class="badge z
">OpenCV: 
   מותקן   חסר</span><span class="badge z
">FFmpeg:    זמין   לא נמצאz">Installer: u   רץ עכשיוu   הצלחה אחרונהu
   ממתין</span></div>u   
<div class="grid"><div class="card"><h2>התקנה אוטומטית חד־פעמית</h2><p>אם OpenCV חסר, הפאנל מריץ לבד את הפקודה:</p><pre>r,	  u   </pre><div class="note">אין כפתור התקנה נוסף. ההתקנה מופעלת ברקע אחרי עליית הפאנל, כדי שתוכל לעשות את זה מרחוק בלי CMD ידני.</div>ua   <div class="good">OpenCV כבר מותקן וזמין. אין צורך להתקין שוב.</div>uF   </div>
<div class="card"><h2>סטטוס</h2><p><b>Python:</b></p><pre>r+	  z</pre><p><b>OpenCV:</b> r*	  z</p><p><b>FFmpeg:</b></p><pre>r  u,   </pre><p><b>הודעה אחרונה:</b><br>r  r   u   </p><p><b>התחיל:</b> r  u   <br><b>הסתיים:</b> r  u   </p><p><a class="btn" href="/camera/setup">רענן</a><a class="btn" href="/camera/setup/status.json" target="_blank">JSON טכני</a></p></div></div>
<div class="card"><h2>לוג התקנה</h2><p>נתיב לוג: <code>z</code></p><pre>z!</pre></div></div></body></html>
)
r  r9	  r   ru  r   r   r&	  r   r   r"	  )
rQ  rb  r  instr  opencv_badgeffmpeg_badge	run_badgeallowed_blocklog_tails
             r   render_camera_setup_pagerg	    s   +-OG "F::k2&D488I&'G!::h//4VL!::h//4VL!FI!B)PQYQ`Q`agQhPiio'pM9#>?iiCiH  {  |H  {I	 IS	 dj  dn  dn  ow  dx  dx  T`  ~F  SG	 Ga	 bn  ao	 oy	 HN  HR  HR  S[  H\  H\  zD  bq  yr	 rL		 M	V	  L	W		 W	d		 z	A
  e	v	  e
i
  e
m
  e
m
  n
r
  e
s
  e
s
  H
a
  y
E  d	G	 GT	 Ub  Tc	cg	
 hp  hw  hw  x~  xB  xB  CP  QS  xT  hU  gV
 Vd
 LR  LV  LV  W_  L`  L`  eH  fh  di
i@ AIPVPZPZ[noqPr@s?t uM NV  N]  N]  ^a  bh  bl  bl  mz  {}  b~  ^  N@  MA A_ `h  `o  `o  pv  pz  pz  {H  pI  p\  p\  M\  `]  _^ ^J KS  KZ  KZ  [^  _c  _g  _g  hv  _w  _C  _C  {C  [D  KE  JF F` ai  ap  ap  qt  uy  u}  u}  ~J  uK  uQ  uQ  OQ  qR  aS  `T Tm nv  n}  n}  ~A  BF  BJ  BJ  KX  BY  B_  B_  ]_  ~`  na  mbbG HPWlGmFn o @H  II r   c                     \        4       w  rpR \        \        4       4      R\        4       ;'       g    RRV RVRVR\        P	                  4       R\
        P	                  4       R\        R	\        R
\        P	                  4       R\        /# )rC  r  r   ru  rv  r6  audio_stream	recordingrecordings_diraudio_log_path
hls_streamhls_log_path)
rr  ru  rK  r	  r  CAMERA_RECORDERr  r  CAMERA_HLS_STREAMr  )r  r  r6  s      r   camera_av_statusrq	    s    35E'$-/0-/5527+224_++-//'..0+ r   c               #     "   \         P                   ! 4       p   \        ^ 8  d'   \         P                   ! 4       V ,
          \        8  d   MB\        P                  4       pRV,           R,           x  \         P                  ! \
        4       Kt  \        P                  4        R#   \         d     L#\         d   p\        T4      \        n	         Rp?LFRp?ii ; i  \        P                  4        i ; i5i)Ts>   --frame
Content-Type: image/jpeg
Cache-Control: no-cache

s   
N)r   CAMERA_MAX_STREAM_SECONDSr	  r  rr  CAMERA_FRAME_INTERVAL_SECONDSr  r   r   r  r  )startedr  r  s      r   camera_stream_generatorrv	  +  s     iikG(1,$))+2GKd1d",,.E[^ccfmmmJJ45 	   -$'H!!- 	sY   C41B# 
C AB# C4#C.C 0C9C:CC CC C11C4c                     \        4       w  r\        4       p\        4       p\        P	                  4       pVP                  R / 4      pVP                  R/ 4      pVP                  R/ 4      ;'       g    / pV '       d   RMR\        P                  ! V4       R2pRp	VP                  R4      '       g   Rp	VP                  R4      '       g
   V	R	,          p	VP                  R
4      '       d   RMRp
VP                  R
4      '       d   RMRpVP                  R
4      '       d   VP                  R4      '       d   RMVP                  R
4      '       d   RMRpVP                  R
4      '       d   VP                  R4      '       d   RMRpVP                  R
4      '       d   RMRpVP                  R
4      '       d   RMRpV '       d   VP                  R4      '       g   RMRpV '       d   VP                  R4      '       g   RMRpV '       d   VP                  R4      '       g   RMRp\        ^4      pRP                  R V 4       4      ;'       g    RpRP                  VP                  R. 4      4      ;'       g    RpRP                  VP                  R. 4      4      ;'       g    RpRP                  . RNV NRNV
 NRNV NRNV NRNV NR NV NR!NV NV	 NR"NV NR#NV NR$NV NR%NV NR&N\        P                  ! \        4       NR'NV NR(N\        ^<,           NR)NV NR*NVP                  R4      '       d   R+MR, NR-NVP                  R4      '       d   R.MR/ NR0NV
 NR1N\        P                  ! VP                  R24      ;'       g    R4       NR3N\        P                  ! VP                  R44      ;'       g    VP                  R44      ;'       g    R4       NR5N\        P                  ! VP                  R64      ;'       g    VP                  R64      ;'       g    R4       NR7N\        P                  ! VP                  R84      ;'       g    \        4       NR9N\         NR:N\         NR;N\         NR<NVP                  R=4       NR>N\        P                  ! VP                  R?4      ;'       g    R@4       NRAN\!        VP                  RB4      ;'       g    ^ 4       NRCN\        P                  ! VP                  RD4      ;'       g5    VP                  RD4      ;'       g    VP                  RD4      ;'       g    R@4       NREN\        P                  ! V4       NRFN\        P                  ! V4       NRGN4      # )Hrj	  rm	  r6  r   rY	  rZ	  r  u   <div class='warn'><b>OpenCV לא מותקן.</b><br>הפאנל מנסה להתקין אותו אוטומטית. אפשר לראות את הלוג דרך: <a class='btn' href='/camera/setup'>🧩 סטטוס רכיבי מצלמה</a></div>rC  u   <div class='warn'><b>FFmpeg לא נמצא.</b><br>שידור מאוחד וידאו+אודיו והקלטות דורשים FFmpeg ב־PATH או ב־<code>C:\ffmpeg\bin\ffmpeg.exe</code>.</div>r$     פעיל   כבויr  r  r  u   כלולu   וידאו בלבדu
   מקליטu   לא מקליטrecdisabledc              3   ,  "   T F  pR \         P                  ! VR,          4       R\        P                  ! R\        P                  ! VR,          4      4       R\        VR,          4       R\         P                  ! VR,          4       R2	x  K  	  R	# 5i)
z<div class='file-row'><div><b>r   </b><br><span>r   r  r  r  z6</span></div><a class='mini' href='/camera/recordings/u"   ' target='_blank'>פתח</a></div>Nr   r   r   r   r  r  r   r  s   & r   r   &render_admin_camera.<locals>.<genexpr>U  s      D )f)F(G~VZVcVcdwy}  zH  zH  IM  NU  IV  zW  WX  VY  Y]  ^j  ko  pv  kw  ^x  ]y  yo  px  p  p  @D  EK  @L  pM  oN  Np  	q   BBuG   <div class='muted'>אין עדיין הקלטות בתיקייה.</div>ro  r  u   לא זוהו דרך FFmpegr  u  
<!DOCTYPE html>
<html lang="he" dir="rtl"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>מצלמת חדר</title>
<style>
body{margin:0;background:#07111f;color:white;font-family:Arial,'Segoe UI',sans-serif;padding:18px}.wrap{max-width:1120px;margin:auto}a{color:#bfdbfe;text-decoration:none}.hero{background:linear-gradient(135deg,#0f766e,#0f172a 62%,#111827);border:1px solid #14b8a6;border-radius:28px;padding:22px;margin-bottom:16px;box-shadow:0 20px 70px rgba(0,0,0,.28)}h1{margin:0 0 8px;font-size:34px}h2{margin:0 0 10px}p{color:#cbd5e1;line-height:1.7}.grid{display:grid;grid-template-columns:1.45fr .9fr;gap:16px}.card{background:#111827;border:1px solid #334155;border-radius:20px;padding:16px;margin-top:14px}.cam-box{background:#020617;border:1px solid #334155;border-radius:22px;overflow:hidden;min-height:280px;display:flex;align-items:center;justify-content:center}#hlsVideo,#cameraView{width:100%;height:auto;background:#020617;display:none}.placeholder{color:#94a3b8;text-align:center;padding:28px;line-height:1.7}button,.btn{border:0;border-radius:14px;padding:13px 16px;font-weight:950;color:white;background:#2563eb;margin:8px 8px 0 0;cursor:pointer;display:inline-block}button.stop{background:#dc2626}button.gray,.btn.gray{background:#475569}button.snap{background:#0f766e}button.record{background:#ea580c}button:disabled{background:#475569;cursor:not-allowed;opacity:.55}.badge{display:inline-block;border-radius:999px;padding:8px 14px;font-weight:900;margin:8px 6px 0 0}.badge.ok{background:#064e3b;color:#bbf7d0;border:1px solid #22c55e}.badge.idle{background:#334155;color:#e2e8f0;border:1px solid #64748b}.badge.rec{background:#7c2d12;color:#fed7aa;border:1px solid #fb923c}.warn{background:#7f1d1d;border:1px solid #f87171;color:#fecaca;border-radius:16px;padding:13px;line-height:1.65;margin:12px 0}.note{background:#0b1220;border:1px solid #334155;border-radius:16px;padding:13px;color:#cbd5e1;line-height:1.65;margin:12px 0}.good{background:#052e2b;border:1px solid #14b8a6;border-radius:16px;padding:13px;color:#ccfbf1;line-height:1.65;margin:12px 0}code,pre{direction:ltr;text-align:left;white-space:pre-wrap}pre{background:#020617;border:1px solid #334155;color:#fde68a;border-radius:12px;padding:10px;overflow:auto}.row{display:flex;justify-content:space-between;gap:10px;border-bottom:1px solid #263548;padding:9px 0;color:#cbd5e1}.row b{color:white}.file-row{display:flex;justify-content:space-between;gap:12px;align-items:center;border-bottom:1px solid #263548;padding:10px 0;color:#cbd5e1}.file-row span,.muted{color:#94a3b8}.mini{background:#1d4ed8;color:white;border-radius:10px;padding:8px 10px;font-weight:900;white-space:nowrap}label{display:block;color:#e2e8f0;margin-top:8px;font-weight:800}input[type=checkbox]{transform:scale(1.25);margin-left:8px}@media(max-width:850px){.grid{grid-template-columns:1fr}body{padding:13px}h1{font-size:28px}.file-row{align-items:flex-start}}
</style></head><body><div class="wrap"><div class="hero"><a href="/admin">⬅ חזרה לפאנל</a><h1>📷 מצלמת חדר</h1><p>v28 חוזר לברירת מחדל יציבה: וידאו דרך OpenCV/MJPEG, כי אצל EMEET SmartCam C965 הווידאו דרך FFmpeg DirectShow נכשל. האודיו מוזרם בנפרד דרך FFmpeg, וה־HLS המאוחד נשאר רק ככלי בדיקה מתקדם.</p><p><a class="btn gray" href="/camera/setup">סטטוס רכיבי מצלמה</a> <a class="btn gray" href="/admin/logs">לוגים</a></p><span class="badge u   ">שידור מאוחד: r]	  u   ">אודיו: u   ">הקלטה: r`	  uz  
<div class="grid"><div><div class="card"><h2>שידור חי וידאו + אודיו</h2><div class="cam-box"><video id="hlsVideo" controls playsinline webkit-playsinline></video><img id="cameraView" alt="שידור מצלמה"><div id="placeholder" class="placeholder">השידור כבוי.<br>לחץ “הפעל וידאו + אודיו”. הווידאו יעבוד דרך OpenCV, והאודיו דרך FFmpeg.</div></div><audio id="audioPlayer" controls playsinline style="width:100%;margin-top:12px;display:none"></audio><div id="cameraMsg" class="note" style="display:none"></div><div><button onclick="startStableMjpegAudio()" u   >הפעל וידאו + אודיו</button><button class="stop" onclick="stopStableStream()">כבה וידאו + אודיו</button><button class="snap" onclick="openSnapshot()" u  >פתח צילום רגעי</button><button class="gray" onclick="resetCameraDevices()">שחרור/איפוס מצלמה</button><button class="gray" onclick="location.reload()">רענן סטטוס</button></div><div class="note">מתקדם בלבד: אם תרצה לבדוק שוב HLS מאוחד דרך FFmpeg, השתמש בכפתור הבא. אצל המצלמה שלך הוא כנראה נכשל ולכן לא ברירת מחדל.</div><button class="gray" onclick="startUnifiedStream(true)" ua   >בדיקה מתקדמת: HLS מאוחד</button><button class="gray" onclick="startMjpegOnly()" u   >וידאו בלבד</button></div>
<div class="card"><h2>⏺️ הקלטה למחשב</h2><p>הקלטות נשמרות מקומית בתיקייה: <code>u   </code></p><form method="post" action="/camera/record/start"><label><input type="checkbox" name="with_audio" value="1" checked>כלול אודיו בהקלטה</label><button class="record" type="submit" u   >התחל הקלטה</button></form><form method="post" action="/camera/record/stop"><button class="stop" type="submit">עצור הקלטה</button></form><div class="good">משך הקלטה מקסימלי להגנה מדיסק מלא: uU    דקות.</div></div>
<div class="card"><h2>🎞️ הקלטות אחרונות</h2>u   <p><a class="btn gray" href="/camera/recordings">פתח רשימת הקלטות מלאה</a></p></div></div>
<div><div class="card"><h2>סטטוס טכני</h2><div class="row"><b>OpenCV</b><span>r[	  u   לא מותקןz1</span></div><div class="row"><b>FFmpeg</b><span>r^	  r_	  u7   </span></div><div class="row"><b>HLS פעיל</b><span>u5   </span></div><div class="row"><b>HLS מצב</b><span>r  u9   </span></div><div class="row"><b>וידאו HLS</b><span>ru  u9   </span></div><div class="row"><b>אודיו HLS</b><span>rv  u5   </span></div><div class="row"><b>לוג HLS</b><span>r  z7</span></div><div class="row"><b>Camera index</b><span>u;   </span></div><div class="row"><b>רזולוציה</b><span>rW  z7</span></div><div class="row"><b>Frames MJPEG</b><span>r  uG   </span></div><div class="row"><b>קובץ הקלטה פעיל</b><span>rn  r   u>   </span></div><div class="row"><b>גודל הקלטה</b><span>r  uB   </span></div><div class="row"><b>שגיאה אחרונה</b><span>r  u_   </span></div></div>
<div class="card"><h2>התקנים שזוהו</h2><p><b>וידאו:</b><br>u   </p><p><b>אודיו:</b><br>u  </p><p class="muted">אם נבחר התקן לא נכון, אפשר להגדיר במערכת: <code>TRIPSERVER_FFMPEG_VIDEO_DEVICE</code> / <code>TRIPSERVER_FFMPEG_AUDIO_DEVICE</code>.</p><p><a class="btn gray" href="/camera/audio-test.json" target="_blank">בדיקת אודיו טכנית</a><a class="btn gray" href="/camera/hls/status.json" target="_blank">JSON HLS</a></p></div>
<div class="note"><b>הערת שימוש:</b> זה כולל אודיו והקלטה. ודא שכל מי שנמצא בבית יודע שהמערכת קיימת ומתי היא פעילה.</div></div></div></div>
<script>
function setMsg(id, text, isError=false){ const el=document.getElementById(id); if(!el)return; el.style.display=text?'block':'none'; el.textContent=text||''; el.className=isError?'warn':'note'; }
async function startStableMjpegAudio(){
  setMsg('cameraMsg','מפעיל וידאו יציב דרך OpenCV ואודיו דרך FFmpeg...');
  const audio=document.getElementById('audioPlayer');
  const video=document.getElementById('hlsVideo');
  const img=document.getElementById('cameraView');
  const ph=document.getElementById('placeholder');
  try{ await fetch('/camera/hls/stop', {method:'POST', cache:'no-store'}); }catch(e){}
  video.pause(); video.removeAttribute('src'); video.load(); video.style.display='none';
  // Start audio immediately from the user click, before async video prep can cause iPhone/Safari to block playback.
  try{
    audio.style.display='block';
    audio.src='/camera/audio-stream?restart=1&ts='+Date.now();
    audio.load();
    const p=audio.play();
    if(p && p.catch) p.catch(e=>setMsg('cameraMsg','הווידאו יופעל. אם אין אודיו, לחץ Play בנגן האודיו. '+e,false));
  }catch(e){ setMsg('cameraMsg','הווידאו יופעל, אך האודיו לא התחיל: '+e,false); }
  try{ await fetch('/camera/prepare-video', {method:'POST', cache:'no-store'}); }catch(e){}
  img.onload=()=>{ph.style.display='none'; img.style.display='block'; setMsg('cameraMsg','וידאו פעיל. האודיו בנגן הנפרד. אם אין קול, לחץ Play בנגן האודיו או פתח בדיקת אודיו טכנית.');};
  img.onerror=()=>setMsg('cameraMsg','שגיאת וידאו. לחץ שחרור/איפוס מצלמה ונסה שוב.',true);
  img.src='/camera/stream?ts='+Date.now();
}
async function stopStableStream(){
  try{ await fetch('/camera/hls/stop', {method:'POST', cache:'no-store'}); }catch(e){}
  try{ await fetch('/camera/audio-stop', {method:'POST', cache:'no-store'}); }catch(e){}
  try{ await fetch('/camera/stop', {method:'POST', cache:'no-store'}); }catch(e){}
  const audio=document.getElementById('audioPlayer'); audio.pause(); audio.removeAttribute('src'); audio.load(); audio.style.display='none';
  const video=document.getElementById('hlsVideo'); video.pause(); video.removeAttribute('src'); video.load(); video.style.display='none';
  const img=document.getElementById('cameraView'); img.style.display='none'; img.removeAttribute('src');
  document.getElementById('placeholder').style.display='block'; setMsg('cameraMsg','הווידאו והאודיו כובו.');
}

async function startUnifiedStream(withAudio){
  setMsg('cameraMsg','מפעיל שידור מאוחד דרך FFmpeg...');
  const video=document.getElementById('hlsVideo'); const img=document.getElementById('cameraView'); const ph=document.getElementById('placeholder');
  try{
    img.style.display='none'; img.removeAttribute('src');
    const res=await fetch('/camera/hls/start?audio='+(withAudio?'1':'0'), {method:'POST', cache:'no-store'});
    const data=await res.json().catch(()=>({ok:false,error:'תגובה לא קריאה מהשרת'}));
    if(!res.ok || !data.ok) throw new Error(data.error || ('HTTP '+res.status));
    ph.style.display='none'; video.style.display='block';
    video.src='/camera/hls/stream.m3u8?ts='+Date.now(); video.load();
    try{ await video.play(); setMsg('cameraMsg', data.with_audio ? 'שידור וידאו+אודיו פעיל.' : 'וידאו פעיל, אבל האודיו נכשל. בדוק לוג HLS.'); }
    catch(e){ setMsg('cameraMsg','השידור הופעל. באייפון לחץ Play בנגן אם הוא לא התחיל לבד. '+e, false); }
  }catch(e){ setMsg('cameraMsg','שגיאת שידור מאוחד: '+e, true); }
}
async function stopUnifiedStream(){
  try{ await fetch('/camera/hls/stop', {method:'POST', cache:'no-store'}); }catch(e){}
  const video=document.getElementById('hlsVideo'); video.pause(); video.removeAttribute('src'); video.load(); video.style.display='none';
  const img=document.getElementById('cameraView'); img.style.display='none'; img.removeAttribute('src');
  document.getElementById('placeholder').style.display='block'; setMsg('cameraMsg','השידור כובה.');
}
async function startMjpegOnly(){
  setMsg('cameraMsg','מפעיל גיבוי וידאו בלבד...');
  const video=document.getElementById('hlsVideo'); video.pause(); video.removeAttribute('src'); video.load(); video.style.display='none';
  const img=document.getElementById('cameraView'); const ph=document.getElementById('placeholder');
  try{ await fetch('/camera/prepare-video', {method:'POST', cache:'no-store'}); }catch(e){}
  img.onload=()=>{ph.style.display='none'; img.style.display='block'; setMsg('cameraMsg','וידאו בלבד פעיל.');};
  img.onerror=()=>setMsg('cameraMsg','שגיאת וידאו בלבד. לחץ שחרור/איפוס מצלמה ונסה שוב.',true);
  img.src='/camera/stream?ts='+Date.now();
}
function openSnapshot(){ window.open('/camera/snapshot?ts='+Date.now(), '_blank'); }
async function resetCameraDevices(){
  await stopUnifiedStream();
  try{ await fetch('/camera/audio-stop', {method:'POST', cache:'no-store'}); }catch(e){}
  try{ const res=await fetch('/camera/reset', {method:'POST', cache:'no-store'}); const data=await res.json(); setMsg('cameraMsg', data.message || 'איפוס בוצע.'); }catch(e){ setMsg('cameraMsg','שגיאת איפוס: '+e,true); }
}
</script>
</body></html>
)r  r  rq	  r	  r  r   r   r   r	  r   r  r  r  r  r  r  r  )rQ  rb  r8  av
cam_status
rec_status
hls_statusr6  re	  engine_blockhls_texthls_cls
audio_text	audio_clsrec_textrec_clsdisabled_hlsdisabled_videodisabled_av
recordingsrec_rowsvideo_devicesaudio_devicess                          r   render_admin_camerar	  =  s
   +-OG!#F		B&&(JR(Jb)JffY#))rG!B)PQYQ`Q`agQhPiio'pML::h G66(  ]  	]'^^H55z:H nnX..dFG)~~h77JNN<<X<X  yC  yG  yG  HP  yQ  yQ_t  WaJ"x00Z^^L5Q5QW]I)~~h77|=NH!~~h//eVG&-RVVH5E5E:BL(/vzz(7K7KZRTN%,BFF84D4D*2K'+Jww   S S 
S  IIgkk'267XX;XMIIgkk'267XX;XMR R @	 R
 A	H	  @	I	R
 I	b	R
 c	k	  b	l	R
 l	F
R
 G
P
  F
Q
R
 Q
_
R
 `
j
  _
k
R
 k
ER
 FM  ENR
 N\R
 ]e  \fR
 fsR
 tA  sBR
 CO  BPR
Pz	R {	I
  z	J
R J
{R |J  {KR KzR {G  zHR HiR jx  iyRyxR yA  yH  yH  I^  y_  x`R `lR mx  lyR ye	R f		  A
C
  f	C
  e	D
RD
?R @HjRIXR iohrhrs{h|h|Xd  CT  XUR UFR UW  U[  U[  \d  Ue  Ue  GQ  kz  F{R {rR s{  r|R |qR rz  rA  rA  BL  BP  BP  QW  BX  B^  B^  \^  r_  q`R `YR Zb  Zi  Zi  jt  jx  jx  yG  jH  jh  jh  LN  LR  LR  Sa  Lb  jh  jh  fh  Zi  YjR jc	R d	l	  d	s	  d	s	  t	~	  t	B
  t	B
  C
Q
  t	R
  t	r
  t	r
  V
X
  V
\
  V
\
  ]
k
  V
l
  t	r
  t	r
  p
r
  d	s
  c	t
R t
iR jr  jy  jy  zD  zH  zH  IS  zT  zk  zk  Xk  jl  imR mdR eq  drR rmR nz  m{R {}R ~K  }LR LCR DN  DR  DR  S[  D\  C]R ]dR em  et  et  u  uC  uC  DO  uP  u\  u\  T\  e]  d^R ^\R ]i  jt  jx  jx  yD  jE  jJ  jJ  IJ  ]K  \LR LNR OW  O^  O^  _i  _m  _m  nz  _{  _G  _G  I  M  M  NZ  [  _G  _G  _i  _m  _m  nz  _{  _G  _G  G  OH  NIRILR MUOO\iLjKkR lIR JR  JY  JY  Zg  Jh  IiRHiR Rr   c                 |    \        \        V ,          4      pV'       g	   R V  R2R3# \        \        V ,          V4      # )zNo HTML file found in z folderrM  )r  r  r  )rc   rn  s   & r   	serve_appr	    s8    wv/I'xw7<<wv	::r   	usa_phoneu6   ארצות הברית 2027 — פלאפון / מחשב	media_rel	music_relopen_urlrC  usa_tvu/   ארצות הברית 2027 — טלוויזיה$/USA_TV/usa2027-presentation-tv.htmlc                 ~   \         P                  V 4      pV'       g   \        R V  24      h\        P                  VR,          \        P
                  P                  \        VR,          4      4      pW\        P
                  P                  W!R,          4      \        P
                  P                  W!R,          4      3# )u   יעד מצגת לא מוכר: ra   rs   r	  )PRESENTATION_CONTROL_TARGETSr   KeyErrorr  r   r   r   r  )
target_keycfgr  s   &  r   _pc_target_pathsr	    s    
&
*
*:
6C8EFF;;s:Xs:(OPDbggll4^)<=rww||DVaRb?cccr   c                 D   \         P                  P                  V 4      pR T RTRV'       d    \         P                  P                  V 4      M^ RV'       dJ   \        P
                  ! R\        P                  ! \         P                  P                  V 4      4      4      /# R/# )r   r   r  r  r   r   )r   r   rg  r  r   r   r  r   )r   r   s   & r   _pc_file_infor	    s|    WW^^D!F&%Q_e2DNN277CSCSTXCY4Z[	  ln	 r   c                    \         P                  ! R V \         P                  4      pV'       g   R#  \        P                  ! \
        P                  ! VP                  ^4      P                  4       4      4      p\        T\        4      '       d&   \        TP                  R4      \        4      '       g   R# TR3#   \         d   pRR\        T4      ,           3u Rp?# Rp?ii ; i)r~  Nu=   רשימת המדיה המוטמעת אינה JSON תקין: r  r   )Nu<   לא נמצאה רשימת מדיה מוטמעת במצגת.)Nu@   מבנה רשימת המדיה המוטמעת אינו תקין.)r  r  r  r   rv  r   r  r  r   r   r~  r   r   r   r  )r	  r  r   r  s   &   r   _pc_extract_inline_manifestr	    s    
		hjnprptptuASSa**X..qwwqz/?/?/ABC gt$$Jw{{77KT,R,RWWB;	  aTW[\_W````as   AB: :C#CC#C#c                 t   \        T;'       g    R 4      P                  4       pV'       d   VP                  R4      '       d   R# VP                  R^4      ^ ,          P                  R^4      ^ ,          P	                  R\
        P                  4      pVP                  \
        P                  4      '       d   VP                  \
        P                  4       Uu. uF  qD'       g   K  VNK  	  ppV'       d&   V^ ,          P                  4       R9   d
   VR,          p\
        P                  P                  \
        P                  P                  ! V .VO5!  4      # \
        P                  P                  \
        P                  P                  \
        P                  P                  V4      V4      4      # u upi )r   Nr  r  r&  r  NN)r  r  r  r  r  >   r(   r'   r)   )r   r   r*  r+  r   r   r2  r  r   rd  r   r   )r  r'  r  r.  r  bitss   &&&   r   _pc_local_url_pathr	    s   
ciiR.


 C#..!PQQ
))C
A

$
$S!
,Q
/
7
7RVV
DC
~~bff99RVV,2,a,2DGMMO'AA8DwwT 9D 9::77BGGLL9J)KSQRR	 3s   	F5'F5c                     \         P                  ! R V \         P                  4      p\        4       . r2V F1  pWB9   d   WC9  d   VP	                  V4       VP                  V4       K3  	  V# )\bid=["\']([^"\']+)["\'])r  rq  r  r  r  rN  )r	  idsrW  dupri  s   &    r   _pc_duplicate_idsr	    sT    
**0$
=Cr#=U-JJu  Jr   c                    a \        \        P                  ! R V \        P                  4      4      o\        \        P                  ! RV \        P                  4      4      p\	        V3R lV 4       4      # )r	  z\bhref=["\']#([^"\']+)["\']c              3   L   <"   T F  q'       g   K  VS9  g   K  Vx  K  	  R # 5ir   r  )r   r  r	  s   & r   r   %_pc_broken_anchors.<locals>.<genexpr>  s     8TQ!1C<!!Ts   	$$
$)r  r  rq  r  r  )r	  r  r	  s   & @r   _pc_broken_anchorsr	    sL    
bjj4dBDDA
BCrzz8$EFD8T888r   c                ^   . pV P                  R4      ;'       g    .  EF
  p\        P                  P                  W4      p\	        V4      pVR,          '       d   \        V4      pVP                  R4      '       d%   \        VP                  R4      ;'       g    ^ 4      MRVR&   \        VP                  R4      4      VR&   VP                  RR	4      ;'       g    VP                  R
R	4      VR&   VP                  RR	4      VR&   MRVR&   RVR&   RVR&   VP                  V4       EK  	  V# )zSReturn actual audio durations from files. QA must never trust stale HTML constants.r	  r   r  rw  Nr*  probe_okrp  r   r.  rN  Fu   קובץ המוזיקה חסר)	r   r   r   r   r	  r  rg  ru  r  )r	  r  r  r  r   r  rw  s   &&     r   _pc_probe_music_for_timeliner	    s   Gww{#))r)ww||D&T">>06ELQIIVZOOuUYY/A%B%G%GaHaeD#EIIdO4D!IIgr2JJeiir6JDM#ii	26DO#D$D<DMt * Nr   c                  a \        S4      \        V P                  4      8w  g;   \        ;QJ d    R S 4       F  '       d   K   RM	  RM! R S 4       4      '       g   V P                  # \        ;QJ d*    . V3R l\	        V P                  4       4       F  NK  	  5# ! V3R l\	        V P                  4       4       4      # )zQBuild timeline parts from probed MP3 durations while preserving slide boundaries.c              3      "   T F;  qP                  R 4      ;'       d    VP                  R4      ;'       g    ^ ^ 8  x  K=  	  R# 5ir	  r*  Nr`  r  s   & r   r   ._pc_parts_with_actual_audio.<locals>.<genexpr>+  sI       8C  uBopj8I8j8jquuU_O`OeOedeijNj8j  uB   AAAFTc           	   3      <"   T FJ  w  r\        VP                  VP                  \        SV,          R ,          4      VP                  4      x  KL  	  R# 5ir*  N)rd  r)  r*  rg  r`   )r   r  rE  music_resultss   &  r   r   r	  -  sF      ,GA 	TXXu]15Ej5Q/RTXT^T^__,s   AA)r,  r0  allr  r  )r  r	  s   &fr   _pc_parts_with_actual_audior	  )  s    
=S_,CC  8C  uB  8CCCC  8C  uB  8C  5C  5Czz5  ,5 5  ,  r   c                 6   . pR p\        V4      \        V P                  4      8w  d   R# \        \        V P                  V4      ^4       F  w  pw  rg\	        VP                  R4      ;'       g    ^ 4      pVP                  R4      '       d   V^ 8:  d   RpVP                  RV R24       Kc  \        \	        VP                  4      V,
          4      p	W8  d   RpVP                  RV RVP                  R RVR R	V	R 24       K  	  VR
P                  V4      3# )TFr*  r	  u   חלק u7   : לא ניתן למדוד את קובץ המוזיקהu   : בקוד r  u    שנ׳ · בקובץ u    שנ׳ · פער rR  )FuT   מספר קובצי המוזיקה אינו תואם למספר חלקי המצגת.)
r,  r0  r  ziprg  r   r  r  rl  r   )
r  r	  	tolerancer  r  r  rE  r  actualdeltas
   &&&       r   _pc_audio_mismatch_detailr	  3  s	   	DB
=S_,ll"3tzz-#@C+4TXXj)..Q/xx
##v{BKK'!$[\]%%f,-BgaSDLL+==STZ[^S__qrwx{q|}~ D uzz$r   c                   a2 \        V 4      w  rr4R V RVR,          R\        P                  ! R4      R\        V4      R. R. R. R. R	. R
/ R/ RR/o2RbV23R llp\        P
                  P                  V4      '       g   V! RRV4       S2#  \        V4      p\        V4      p\        W4      p\        Wx4      p	\        Wx4      w  rV! RRR\        VP                  4       RVP                   R24       T! RYV
'       d   RMR4       \#        \%        T4      4      p/ p. p. p^ pTP                   EF  p\'        T4      P)                  4       pTP+                  T4      p\-        TT4       Uu. uF,  p\        P
                  P                  T4      '       g   K*  TNK.  	  pp\        T4      ^8  d   TP/                  RTRT/4       Tf   TP/                  T4       K  T\        P
                  P1                  T4      ,          p\%        T4      P2                  P)                  4       \4        9   g   EK   \7        \'        T4      4      p\9        T4      TT&   S2R,          P/                  RTR\        P
                  P;                  T4      R\9        T4      R\        P
                  P1                  T4      /4       EK  	  TS2R&   T! R T'       * T'       g   R!MR"R#P=                  TR$,          4      ,           4       T! R%T'       * T'       g   RMR&P=                  R' T 4       4      4        \?        TP                  Y4      p\A        T	4       EFU  w  ppTPB                   Uu. uF  pTPD                  T8X  g   K  TNK  	  ppT Uu. uF  pTPF                  R(8X  g   K  TNK  	  ppT Uu. uF  pTPF                  R)8X  g   K  TNK  	  pp\I        R* T 4       4      p\I        R+ T 4       4      p T'       d   T \        T4      ,          MR,p!T'       d   T!R-8  d   R.M
T!R/8  d   R0MR1p"S2R,          P/                  RTPJ                  R2TPL                  R3\        T4      R4\        T4      R5TR6\        T4      R7T R8T!R9\O        R,T \        T4      R/,          ,
          4      R:T"/
4       EKX  	  TPP                  S2R;&   S2R	,          PS                  TPT                  4       T! R<RR=TPP                  R> R?24       T F5  p#T#P+                  R@4      '       g   K  TT#P+                  R^ 4      ,          pK7  	  TS2RA&   \        T4      ^8H  ;'       d5    \V        ;QJ d    RB T 4       F  '       d   K   RM	  RM! RB T 4       4      p$T! RCT$R&P=                  RD T 4       4      4       \Y        T4      p%\[        T4      p&T! RET%'       * R#P=                  T%R$,          4      4       T! RFT&'       * R#P=                  T&R$,          4      4       . p'\]        TRG4      ;'       g    Rp(RHT(9   ;'       d    RIT(9   ;'       g    RJT(9   p)T! RKT)'       * T)'       g   RMRL4       Rc F  p*T*T9   g   K  T'P/                  T*4       K  	  T! RMT''       * R#P=                  T'4      4       \_        T4      w  p+p,. p-^ p.T+'       d   T+P+                  RN4      ;'       g    . p/\        T/4      p.T/ Fs  p#\a        Y#T#P+                  RO4      4      p0T0'       g   K(  \        P
                  P                  T04      '       d   KO  T-P/                  ROT#P+                  RO4      RPT0/4       Ku  	  T! RQRT. RRT+P+                  RSRT4       24       T! RUT-'       * T-'       g   RMR#P=                  RV T-R$,           4       4      4       M
T! RQRT,4       RWT.RT-RXT.'       d
   T.^,           M^ /S2R
&   \V        ;QJ d    RY T 4       F  '       d   K   RM	  RM! RY T 4       4      '       d   RZMR[S2R\&   TPb                   Uu. uF  p\9        TPL                  4      NK  	  upS2R]&   T U1u. uF'  p1\9        T1P+                  R4      ;'       g    ^ 4      NK)  	  up1S2R^&   R3\        TP                  4      R4\        T4      R6\        TP                  4      \        T4      ,
          R_TR`\        P
                  P1                  T4      /S2R&   \V        ;QJ d#    Ra S2R,           4       F  '       d   K   RM	  RM! Ra S2R,           4       4      S2R&   S2#   \         d    pT! RR\!        T4      4       S2u Rp?# Rp?ii ; iu upi   \         d+   pS2R	,          P/                  RT RT 24        Rp?EKJ  Rp?ii ; iu upi u upi u upi   \         d   pT! R<R\!        T4      4        Rp?ELRp?ii ; iu upi u up1i )dr  r`   generated_atr   rs   r0  checksrM  r[  r  offlinetotalsr  Fr   Nc                    < SR ,          P                  RT R\        V4      R\        T;'       g    R4      RT;'       g    V'       d   RMR/4       R# )r	  r   r  r  r   levelrp  Nr  ru  r   )r   r  r  r	  r  s   &&&&r   r@	  9_pc_base_build_presentation_control_report.<locals>.checkN  sZ    xtT"XxV\\WYIZ\cej  fH  fHwyos  @G  !I  	Jr   u   קובץ מצגתu   מבנה המצגתTu   נמצאו u,    שקפים; חלק 1 מסתיים בשקף r(  u=   משך השירים בקוד תואם לקבצים בפועלrp  r   r  r  r*  r  u   משך הסרטון u    לא נקרא: u'   קובצי מדיה לכל השקפיםu   הכול קייםu   חסרים: ro  :N   Nu=   אין תמונה וסרטון כפולים לאותו שקףz; c              3   2   "   T F  qR ,          x  K  	  R# 5i)r   Nr  r  s   & r   r   =_pc_base_build_presentation_control_report.<locals>.<genexpr>w  s6       Ov  cu  ^_  RX  PY  PY  cu   r  r  c              3   8   "   T F  qP                   x  K  	  R # 5ir   )ry  r   es   & r   r   r	    s     >v!oovr  c              3   8   "   T F  qP                   x  K  	  R # 5ir   )rz  r	  s   & r   r   r	    s     A&Q00&r  r  r	  greenry   yellowredr"  r!  rH  video_secondsimage_countimage_secondsper_image_secondsreserve_to_5_secondsr  timeline_totalu   חישוב ציר הזמןu	   סה״כ r  u?    שניות; סרטונים נשמרים במלוא אורכם.r   rU   c              3   t   "   T F.  qP                  R 4      ;'       d    VP                  R4      x  K0  	  R# 5i)r   r	  Nr`  r  s   & r   r   r	    s-     .l^kYZuuX/T/T155CT/T^ks   88u    שני קובצי המוזיקהc              3      "   T F`  p\         P                  P                  VR ,          4      VP                  R4      '       d   RVP                  R^ 4      R R2MR,           x  Kb  	  R# 5i)r   r	  u    ✓ r*  r      שנ׳u    חסר/לא מדידN)r   r   r   r   r  s   & r   r   r	    s       BU  GT  BC"''BRBRSTU[S\B]  NO  NS  NS  T^  N_  N_chijininoyz{i|  ~A  iB  BI  bJ  e|  C}  C}  GTs   A A*'A*u!   אין מזהי HTML כפוליםu/   אין עוגנים פנימיים שבוריםallOfflineAssetUrlsquerySelectorAlleitanReadInlineManifesteitanManifestUrlsu=   Registry אופליין אינו סופר מדיה כפולהu|   הפונקציה מאחדת DOM עם Registry ועלולה לספור גם תמונה ישנה וגם סרטון מחליף.uE   אין תלות במנגנוני אופליין שנכשלו בעברr  r  r   u&   רשימת אופליין מוטמעתu    פריטי מדיה; token=r  r  uA   כל קובצי רשימת האופליין קיימים בשרתc              3   F   "   T F  p\        VR ,          4      x  K  	  R# 5i)r  Nr  r  s   & r   r   r	    sK       Q~  i}  de  RU  VW  X]  V^  R_  R_  i}   !inline_countexpected_with_htmlc              3   B   "   T F  qP                  R 4      x  K  	  R# 5i)r	  Nr`  r  s   & r   r   r	    s     6`R_QuuZ7H7HR_   rN  html_fallbackaudio_timeline_sourcedeclared_song_secondsactual_song_secondsmedia_bytespresentation_bytesc              3   j   "   T F)  qR ,          ;'       g    VP                  R4      R8H  x  K+  	  R# 5ir  r	  r  Nr`  r   r  s   & r   r   r	    s,     XGW!w==!%%.I"==GWs   33)r   N)znavigator.serviceWorkeroffline-manifest.jsonusa-offline-sw.js)2r	  r   r   r	  r   r   rg  r  r  r	  r	  r	  r,  rr  rs  r   r~  r  r   r   r   r   r  r  r  r  r  ro  rg  r   r   r  r  r  r{  rx  r  r`   rl  r>  rQ  r  r  r	  r	  r	  _v51_extract_js_function_bodyr	  r	  r0  )3r	  r	  r  r'  r  r@	  r	  r  r	  actual_partsaudio_match_okaudio_match_detailr  r  r  missing_slidesduplicate_siblingstotal_media_bytesr   rT  r   r/  siblingsr*  rN  r{  rE  r	  r  rM  rd   r  image_totalr  r  r  music_ok
duplicatesbroken_anchorsr  r  offline_unionr  inlineinline_erroroffline_missingr	  r  
local_pathr  r  s3   &                                                 @r   *_pc_base_build_presentation_control_reportr

  D  s	   .>z.J+C *W&9:&78Xr8RB
B2xT5FJ77>>+,,!5*;<
"#45(.4S?24G-Ft-[*#T[T=M=M9N8OO{  }A  }Y  }Y  |Z  Z[  ,\  	]M~  |Jsw  PW  	X
 $DO4ION  $ioo}}S!6y#F\F!"''..YZJ[AAF\x=1%%vtWh&GH<!!$'RWW__T22:""$(88^7D	B',X$x ''vrww?O?OPT?UWachiqcrtz|~  }D  }D  }L  }L  MQ  }R  )S  T !" 'F9	
35GdrI\  yG  JN  JS  JS  Tb  cf  Tg  Jh  yh  i	
IOaKamce  FJ  FO  FO  Ov  cu  Ov  Fv  w>$T%5%5|U ), 7J"*"2"2Q"2Qallj6Pqq"2GQ!(>AAFFg,=aaF>!(>AAFFg,=aaF>>v>>KA&AAK7=s6{23I%+yC/?WS\`cScxinF7O""^T\\s7|]CKZes6{O[J]_h&Cs6{S?P1P(Q&$  !8 $,#9#9 z!!("3"34*DIh>T>TUX=Y  ZY  3Z  	[ 88H&!!44  $F7O=!Q&ll33.l^k.l333.l^k.l+lH	
,h		  BU  GT  BU  9U  V"4(J'-N	
-:~tyyTW?YZ	
;=OQUQZQZ[ijm[nQopI(/DEKKD&$.uu4MQU4U4t4tYlptYtM	
I}K\!"  (fg [D=U# [ 

QW`S`bfbkbklubvw6t<FLOL

7#))r5zD+DTXXe_UJz"''.."<"<&&txx
'ST  	6Njkqkukuv}  D  lE  kF  ?G  	HQWfSf  sBhj  HL  HQ  HQ  Q~  ix  y|  i}  Q~  H~  	6|L'y/Sg  ~Jiuxyiy  PQ  RF93636`R_6`3336`R_6`3`3`ifuF"#AE&LAuQYY'7&LF"#LY$ZMqU155+<+A+A%BM$ZF !s4++,mS=Qs4++,s?/CC(*>Pa@bF8
 3XvhGWX333XvhGWXXF4LMG  #UDI6 ]  ^z")),@FVWZV[*\]]^ R>>  >*E49==>R 'M$Zs   A;d ''e e -Be"6f e=0e=6f <fff  f8f>A	f Cf f8.!f=f=d=d82d=8d=e:e55e:=f f5f00f5c                 \    \         P                  ! \        V e   V 4      4      # R4      4      # )Nr   r   r   r   ri  s   &r   _pc_hr
    s&    ??3(9uBCCrBCCr   c                    a
 \         P                  P                  R R4      o
S
\        9  d   Ro
\	        S
4      p RP                  V
3R l\        P                  4        4       4      pV R,          '       d   RMRpV R,          '       d   RMRp. pV P                  R. 4       F}  pVP                  R	R
4      pVP                  RV R\        VR,          4       RVR,          R RVR,           RVR,          R RVR,           RVR,          R RVR,          R R24       K  	  RP                  R V P                  R. 4       4       4      pRP                  R V P                  R. 4       4       4      ;'       g    R pRP                  R! V P                  R". 4       4       4      ;'       g    R#p	R$\        \        S
,          R%,          4       R&\        S
4       R'\        S
4       R(T R)T R*V R,          '       d   R+MR, R-T R.\        V R/,          4       R0RP                  V4      ;'       g    R1 R2V R3V R4V P                  R5/ 4      P                  R6^ 4       R7V P                  R5/ 4      P                  R8^ 4       R9V	 R:2# );r  r	  r   c           
   3      <"   T F5  w  rR VS8X  d   RMR R\        V4       R\        VR,          4       R2x  K7  	  R# 5iz<a class="target r$  r   z$" href="/admin/presentations?target=r  r`   </a>Nr
  )r   rT  r	  r  s   &  r   r   >_pc_base_render_presentation_control_center.<locals>.<genexpr>  sh      <HC VH<<`afgjak`llnotux  zA  vB  pC  oD  DH  	I<   =A r  u   כל הבדיקות עברוu1   נמצאו נושאים שדורשים טיפולbadr0  r  r	  <article class="part "><h2>r`   z%</h2>
        <div class="metric"><b>r"  r0  uJ   </b><span>שניות בשיר</span></div>
        <div class="metric"><b>rH     </b><span>סרטונים · r	  u4    שנ׳</span></div>
        <div class="metric"><b>r	  uL   </b><span>שקפי תמונה</span></div>
        <div class="hero-number">r	  uj    שנ׳</div><p>זמן לכל שקף תמונה</p>
        <small>רזרבה עד רצפת 5 שניות: r	  u    שניות</small></article>c           
   3      "   T FL  pR VR,          '       d   RMR R\        VR,          4       R\        VR,          4      ;'       g    R R	2x  KN  	  R
# 5i)r  r     ✅   ❌</td><td><b>r   r  r  r  r  Nr
  r	  s   & r   r   r
    s       {  bz  ]^XqwweE%B,uUVW]U^O_N``mnstuv~t  oA  oJ  oJ  EJ  nK  KU  X  bzs   A0AAr	  c              3      "   T FL  pR \        VR,          4       R\        VR,          4       RVR,          R R\        VR,          4       R2	x  KN  	  R	# 5i
r  r   r  r  r*  r0  u    שנ׳</td><td>r  r  N)r
  r  r   r  s   & r   r   r
    s       H  oG  jkXeAfI&6%7yqyAQ@RR[\]^h\ijm[nn~  @L  MN  OU  MV  @W  X  Xb  e  oGs   AArM  uD   <tr><td colspan="4">אין סרטונים במצגת זו.</td></tr>c              3   @   "   T F  pR \        V4       R2x  K  	  R# 5iz<li>z</li>Nr
  r  s   & r   r   r
    s     R7Q!eAhZu-7Q   r  u&   <li>לא נמצאו אזהרות.</li>ul
  <!DOCTYPE html><html lang="he" dir="rtl"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>מרכז בקרת מצגות</title>
<style>:root{--bg:#07111f;--panel:#101c31;--line:#2b3d58;--text:#f8fafc;--muted:#a8b3c7;--blue:#60a5fa;--green:#22c55e;--yellow:#f59e0b;--red:#ef4444}*{box-sizing:border-box}body{margin:0;background:radial-gradient(circle at 85% 0,#173563,transparent 28rem),var(--bg);color:var(--text);font-family:Arial,'Segoe UI',sans-serif}.wrap{width:min(1180px,94%);margin:auto;padding:26px 0 60px}a{color:#bfdbfe}.head{background:linear-gradient(135deg,#172554,#0f172a);border:1px solid var(--line);border-radius:28px;padding:24px;box-shadow:0 20px 55px #0005}.head h1{margin:0 0 8px;font-size:clamp(28px,5vw,46px)}.head p{color:var(--muted);line-height:1.6}.actions,.targets{display:flex;gap:9px;flex-wrap:wrap;margin-top:14px}.actions a,.target{text-decoration:none;border-radius:999px;padding:10px 14px;font-weight:900;background:#243653;border:1px solid #466080}.target.active{background:#2563eb;border-color:#93c5fd}.summary{margin:18px 0;border-radius:20px;padding:16px;font-weight:900}.summary.ok{background:#123524;border:1px solid #23804a}.summary.bad{background:#421d25;border:1px solid #a83245}.parts{display:grid;grid-template-columns:repeat(auto-fit,minmax(270px,1fr));gap:14px}.part{background:var(--panel);border:2px solid var(--line);border-radius:24px;padding:18px}.part.green{border-color:#15803d}.part.yellow{border-color:#d97706}.part.red{border-color:#dc2626}.part h2{margin:0 0 14px}.metric{display:flex;justify-content:space-between;gap:12px;padding:9px 0;border-bottom:1px solid var(--line)}.metric b{font-size:20px}.metric span,.part p,.part small{color:var(--muted)}.hero-number{font-size:44px;font-weight:950;color:#bfdbfe;margin-top:15px}.panel{background:var(--panel);border:1px solid var(--line);border-radius:22px;padding:18px;margin-top:16px;overflow:auto}table{width:100%;border-collapse:collapse}th,td{padding:10px;border-bottom:1px solid var(--line);text-align:right;vertical-align:top}th{color:#bfdbfe}code{direction:ltr;unicode-bidi:isolate}ul{line-height:1.8}@media(max-width:650px){th,td{font-size:12px;padding:7px 4px}.hero-number{font-size:36px}}</style></head><body><main class="wrap"><section class="head"><h1>🎛️ מרכז בקרת המצגות</h1><p>ניתוח חי של ציר הזמן, המדיה, קבצים חסרים ומוכנות אופליין. הנתונים נקראים מהקבצים הפעילים בשרת ולא מרשימה קשיחה.</p><div class="actions"><a href="/">🏠 ראשי</a><a href="/admin">📁 אדמין</a><a href="r	  Q   " target="_blank">▶️ פתח מצגת</a><a href="/admin/presentations?target=uI   ">🔄 הרץ שוב</a><a href="/admin/presentations/report.json?target=5" target="_blank">JSON</a></div><div class="targets">z%</div></section>
<div class="summary r  r
     ⚠️r   u    · נבדק ב־r	  z</div><section class="parts">uP   <article class="part red">לא ניתן לחשב את ציר הזמן.</article>u   </section>
<section class="panel"><h2>בדיקת תקינות</h2><table><thead><tr><th>מצב</th><th>בדיקה</th><th>פירוט</th></tr></thead><tbody>u   </tbody></table></section>
<section class="panel"><h2>סרטונים פעילים</h2><table><thead><tr><th>שקף</th><th>קובץ</th><th>משך</th><th>גודל</th></tr></thead><tbody>u   </tbody></table></section>
<section class="panel"><h2>מוכנות לשמירה מקומית</h2><p>ברשימה המוטמעת: <b>r	  r	  u:   </b> פריטי מדיה. יחד עם HTML המצגת: <b>r	  u   </b> קבצים צפויים. בדיקה זו מאמתת שהקבצים קיימים בשרת; מצב המטמון במכשיר עצמו נבדק מתוך המצגת.</p></section>
<section class="panel"><h2>אזהרות</h2><ul>z$</ul></section></main></body></html>)	r   r  r   r	  !build_presentation_control_reportr   r  r  r
  )r  target_buttonsstatus_textstatus_class
part_cardsrE  cls
check_rows
video_rowsr  r  s             @r   +_pc_base_render_presentation_control_centerr/
    s   \\h4F11.v6FWW 4::< N 5;4LL0FyK!$<<4ULJ

7B'hhx'3C5uT']?S>T U  $^ 4S9 :  $] 344PQUVeQfgjPk l  $] 34 5""&':";C!@ A77;<R7STW6XXuy 	z (   {  bh  bl  bl  mu  wy  bz  {  {J  H  ou  oy  oy  zB  DF  oG  H  H  R  R  LRJwwRvzz*b7QRR~~V~H{' |'A(  B(^(  _(e(  B(f(  g(q(  B(r(  |'s(  {'t(  t(E*  F*K*  L*R*  F*S*  E*T*  T*]+  ^+c+  d+j+  ^+k+  ]+l+  l+a,  b,p,  a,q, q,!N"fTllU$I;-Whinou  wE  pF  jG  iH  He  fh  fm  fm  nx  fy  fO  fO  }O  eP PS T^  S_ _b cm  bn njjpjtjtu~  @B  kC  kG  kG  HV  WX  kY  jZ  ZT  U[  U_  U_  `i  jl  Um  Uq  Uq  rF  GH  UI  TJ J119
:^b br   z/admin/presentationsc                      \        4       # r   )"render_presentation_control_centerr  r   r   !admin_presentation_control_centerr2
    s    -//r   z /admin/presentations/report.jsonc                      \         P                  P                  R R4      p V \        9  d   Rp \	        \
        P                  ! \        V 4      R^R7      RR7      # r  r	  Fr   application/json; charset=utf-8r  r   r  r   r	  r   r   r  r'
  r  s    r   &admin_presentation_control_report_jsonr9
    S    \\h4F11DJJ@HW\efg  wX  Y  Yr   r&  c                      R # )u  
<!DOCTYPE html>
<html lang="he" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>מרכז ניהול</title>
<style>
body{margin:0;font-family:Arial;background:linear-gradient(135deg,#081229,#102447);color:white;min-height:100vh}
.hero{text-align:center;padding:50px 20px 20px}
.hero h1{font-size:42px;margin:0}
.hero p{color:#d8e6ff;font-size:18px}
.grid{width:min(1100px,92%);margin:40px auto;display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:22px}
.card{text-decoration:none;color:white;border-radius:28px;padding:28px;min-height:180px;box-shadow:0 10px 30px rgba(0,0,0,.25);transition:.2s transform,.2s box-shadow}
.card:hover{transform:translateY(-4px);box-shadow:0 16px 40px rgba(0,0,0,.35)}
.card h2{font-size:30px;margin:0 0 12px}
.card p{line-height:1.6;margin:0}
.icon{font-size:52px;margin-bottom:15px}
.admin{background:linear-gradient(135deg,#0f9b0f,#38ef7d)}
.money{background:linear-gradient(135deg,#5f2c82,#49a09d)}
.homebudget{background:linear-gradient(135deg,#11998e,#38ef7d)}
.japan{background:linear-gradient(135deg,#ff416c,#ff4b2b)}
.usa{background:linear-gradient(135deg,#0052d4,#4364f7,#6fb1fc)}
.control{background:linear-gradient(135deg,#7c3aed,#2563eb)}
.control{background:linear-gradient(135deg,#7c3aed,#2563eb,#0891b2)}
.footer{text-align:center;color:#b8c8e6;padding:25px}

.image-guide{margin:12px 0 16px;background:#0f172a;border:1px solid #334155;border-radius:14px;padding:12px;color:#e2e8f0}
.image-guide summary{cursor:pointer;font-weight:bold;color:#bfdbfe;margin-bottom:10px}
.image-guide-table{width:100%;border-collapse:collapse;margin-top:10px;font-size:14px}
.image-guide-table th,.image-guide-table td{border-bottom:1px solid #334155;padding:9px;text-align:right;vertical-align:top}
.image-guide-table th{color:#93c5fd;background:#111827}
.image-guide-table td:first-child{white-space:nowrap;color:#fde68a}


.image-upload-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px;margin-top:16px}
.image-upload-card{margin:0}
.image-file-input{position:absolute;opacity:0;width:1px;height:1px;pointer-events:none}
.image-upload-label{display:block;height:100%;cursor:pointer;background:#0f172a;border:1px solid #334155;border-radius:18px;padding:15px;transition:.18s transform,.18s border-color,.18s background;box-shadow:0 8px 22px rgba(0,0,0,.14)}
.image-upload-label:hover{transform:translateY(-2px);border-color:#60a5fa;background:#13213a}
.image-key{display:inline-flex;background:#1d4ed8;color:#dbeafe;border-radius:999px;padding:4px 9px;font-size:12px;font-weight:900;margin-bottom:8px}
.image-title{display:block;color:#fff;font-size:17px;font-weight:950;margin-bottom:7px;line-height:1.25}
.image-desc{display:block;color:#cbd5e1;font-size:14px;line-height:1.45;min-height:42px}
.upload-current{display:block;margin-top:10px;color:#93c5fd;font-size:12.5px;font-weight:900}.upload-status{display:block;margin-top:8px;color:#fde68a;font-size:13px;font-weight:900;border-top:1px solid #334155;padding-top:10px}
@media(max-width:640px){.image-upload-grid{grid-template-columns:1fr}.image-title{font-size:16px}.image-desc{min-height:auto}}

.app-hero{background:radial-gradient(circle at top right,rgba(59,130,246,.35),transparent 35%),linear-gradient(135deg,#172554,#0f172a);border:1px solid #334155;border-radius:28px;padding:26px;margin-bottom:18px;box-shadow:0 20px 60px rgba(0,0,0,.25)}
.app-hero h1{text-align:right;margin:0 0 8px;font-size:36px;letter-spacing:-.8px}.app-hero p{margin:0;color:#cbd5e1;line-height:1.65}.top-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:16px}.pill-link{display:inline-flex;align-items:center;gap:8px;background:#1d4ed8;color:white!important;text-decoration:none;border-radius:999px;padding:10px 14px;font-weight:900;border:1px solid #60a5fa}.pill-link.secondary{background:#334155;border-color:#475569}.dashboard-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:14px;margin:18px 0}.dash-card{background:linear-gradient(180deg,#1e293b,#111827);border:1px solid #334155;border-radius:22px;padding:16px;box-shadow:0 10px 32px rgba(0,0,0,.18)}.dash-card b{display:block;font-size:18px;margin-bottom:6px}.dash-card span{color:#cbd5e1;font-size:14px;line-height:1.5}.box{box-shadow:0 16px 44px rgba(0,0,0,.20);border:1px solid #334155}.box h2{font-size:25px;letter-spacing:-.4px}.box h3{color:#bfdbfe;margin-top:20px}.split-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px}.mini-panel{background:#0f172a;border:1px solid #334155;border-radius:16px;padding:14px}.mini-panel h3{margin-top:0}.danger-zone{background:linear-gradient(135deg,#451a1a,#1e293b)!important;border-color:#7f1d1d!important}.safe-zone{background:linear-gradient(135deg,#132f25,#1e293b)!important;border-color:#166534!important}.field-label{display:block;color:#cbd5e1;font-size:13px;font-weight:900;margin:12px 0 6px}select,input[type=text]{width:100%;box-sizing:border-box;padding:13px;background:#0f172a;color:white;border-radius:12px;border:1px solid #334155}label.check{display:flex;align-items:center;gap:8px;margin-top:12px;color:#e2e8f0;font-weight:bold}.small-danger{background:#991b1b!important}.cancel{background:#475569!important}.muted{color:#94a3b8;font-size:13px;line-height:1.6}.success-dot{display:inline-block;width:10px;height:10px;background:#22c55e;border-radius:50%;box-shadow:0 0 14px #22c55e;margin-left:8px}.quick-nav{box-shadow:0 12px 32px rgba(0,0,0,.22)}@media(max-width:720px){.wrap{width:min(100%,94%);padding:18px 0}.app-hero{padding:20px}.app-hero h1{font-size:28px}.quick-nav{overflow:auto;flex-wrap:nowrap}.quick-nav a{white-space:nowrap}.dashboard-grid{grid-template-columns:1fr}}


</style>
</head>
<body>
<div class="hero">
<h1>מרכז ניהול</h1>
<p>מערכת מרכזית לניהול קבצים, תקציבים ולוחות זמנים</p>
</div>
<div class="grid">
<a class="card admin" href="/admin"><div class="icon">📁</div><h2>ניהול קבצים</h2><p>העלאת קבצים ישירות למחשב.</p></a>
<a class="card money" href="/Moneyapp/"><div class="icon">💰</div><h2>תקציב טיולים</h2><p>ניהול תקציב חופשות וסנכרון נתונים.</p></a>
<a class="card homebudget" href="/MoneyHome/"><div class="icon">🏠</div><h2>תקציב משפחתי</h2><p>ניהול תקציב חודשי, Limits, הוצאות בפועל וארכיון חודשים.</p></a>
<a class="card admin" href="/TripForm/"><div class="icon">🧾</div><h2>טופס פתיחת טיול</h2><p>טופס קליטת נתונים לטיול חדש.</p></a>
<a class="card admin" href="/admin/camera"><div class="icon">📷</div><h2>מצלמת חדר</h2><p>צפייה חיה במצלמת המחשב, אודיו והקלטות דרך הפאנל.</p></a>
<a class="card usa" href="/admin#trips"><div class="icon">🧳</div><h2>טיולים</h2><p>יפן קיץ 26, ארצות הברית קיץ 27 וכל טיול עתידי במקום אחד.</p></a>
<a class="card control" href="/admin/presentations"><div class="icon">🎛️</div><h2>בקרת מצגות</h2><p>זמן לכל תמונה, סרטונים, קבצים חסרים, אופליין ובדיקת תקינות חיה.</p></a>
</div>
<div class="footer">TripServer</div>
</body>
</html>
r  r  r   r   homer<
    s    Er   c                      \        4       # r   )rV  r  r   r   local_no_window_flagsr>
  C  s    "$$r   c                      \        T ;'       d     \        P                  P                  V 4      4      #   \         d     R # i ; ir  )ru  r   r   r  r   r  s   &r   local_existing_dirr@
  G  s9    D00RWW]]4011 s   4 #4 AAc                    \         P                  P                  \         P                  P                  \         P                  P	                  \         P                  P                  \        T ;'       g    R 4      4      4      4      4      # r3  )r   r   rl  rd  
expandvars
expanduserr   r  s   &r   local_norm_pathrD
  N  sR    77??277++BGG,>,>rww?Q?QRUVZV`V`^`Ra?b,cdeer   c                 0  a \        V4      '       g   R # \        V4      pVP                  4       o\        ;QJ d    V3R lV  4       F  '       g   K   RM	  RM! V3R lV  4       4      '       d   R # V P	                  RVRVRVRRR\        V4      /4       R # )	Nc              3   V   <"   T F  qR ,          P                  4       S8H  x  K   	  R# 5i)r   Nr   )r   r  r  s   & r   r   (local_add_unique_path.<locals>.<genexpr>W  s!     
954<3&5s   &)TFr`   r   key_hintreadonlywritable)r@
  rD
  r   r  r  ru  )r  r`   r   rH
  rJ
  normr  s   &&&&& @r   local_add_unique_pathrL
  R  st    d##4 D
**,C
s
95
9sss
95
999	LL'5&$
HjRWYceijrestur   c            
      r   . p . pR F=  p\         P                  P                  V4      pV'       g   K,  VP                  V4       K?  	  \         P                  P                  R4      p\         P                  P                  R4      pV'       d    V'       d   VP                  WE,           4       R F=  p\         P                  P                  V4      pV'       g   K,  VP                  V4       K?  	  \         P                  R8X  d   Rp \         P
                  ! V4       F  pVP                  4       R9   d   K  \         P                  P                  Wg4      p\         P                  P                  V4      '       g   K`  VP                  V4       VP                  \         P                  P                  VR4      4       VP                  \         P                  P                  VR4      4       K  	  \        4       p	V F  p
V
'       g   K  \        V
4      p
V
P                  4       V	9   d   K/  V	P                  V
P                  4       4       R F.  p\        V R\         P                  P                  W4      R	4       K0  	  \        V R
\         P                  P                  V
R4      R	4       K  	  \         P                  R8X  d   R F  pV R2pR F4  p\         P                  P                  W4      p\        V RV R2VR	4       K6  	   \         P
                  ! V4       Fl  p\        T;'       g    R4      P!                  4       P                  4       pVR9   g   K=  \        V RV R2\         P                  P                  W4      R	4       Kn  	  K  	  V #   \         d     ELi ; i  \         d     K  i ; i)USERPROFILE	HOMEDRIVEHOMEPATHOneDriver   C:\UserszOneDrive - Personal	Downloadsu   הורדות במחשבr   u   הורדות OneDriveCDEFGHIJKLMNOPQRSTUVWXYZz:\u   הורדות בכונן re  r   )rN
  HOME)rQ
  OneDriveConsumerOneDriveCommercial>   publicr  	all usersdefault user)rS
     הורדות)r[
  rS
  >   r   r[
  )r   rE  r   r  r   r  r   r   r   r  r   r  rD
  rN  rL
  r   r   )r  basesrW  valrF  hp
users_rootr   r/  checkedr   r(  letterdriver   rg  s                   r   discover_download_foldersrc
  \  s   EE&jjnnS!3LL ' 
	$B	
	#B	bRWEjjnnS!3LL F 
ww$ 

	

:.::<#UUGGLL277==##LLOLLa!<=LLa1F!GH / eGt$::<7"DJJL!0C!%)BBGGLLQUD[]hi 1 	e%<bggll4Q\>]_jk  
ww$ 1FhcNE4GGLL4	%e/Gxq-QS\^ij 5JJu-D

O11399;E ==-e7OPVxWX5Y[][b[b[g[ghm[t  wB  C . 1 L?  		:  s8   A1N >A3N 	&N'0'N'3N'N$#N$'N65N6c                     ^ p \        \        P                  ! V 4      4      pR F  pY29   g   K  T^,          pK  	  T#   \         d     ^ # i ; i)r   )r%  r   r'   r(   r*   r+   r,   )r  r   r  r   )r   rX  ru  r   s   &   r   tripserver_scorere
    sV    EBJJt$% k=QJE k L  s   ? AAc                  	   . p . p VP                  \        P                  P                  \        P                  P	                  \
        4      4      4       VP                  \        4       VP                  \        P                  ! 4       4       R F  p\        P                  P                  V4      pV'       g   K,  VP                  \        P                  P                  VR4      \        P                  P                  VRR4      \        P                  P                  VRR4      \        P                  P                  VRR4      .4       K  	  \        P                  R8X  Ed   R F  pVP                  \        P                  P                  VR4      4        \        P                  ! V4       F]  pRVP                  4       9   g   VP                  4       R9   g   K/  VP                  \        P                  P                  WE4      4       K_  	  K  	   \        P                  ! R4       F  p\        P                  P                  RV4      p\        P                  P!                  V4      '       g   KJ  VP                  \        P                  P                  VRR4      \        P                  P                  VRR4      \        P                  P                  VRR4      .4       K  	   \        P                  P                  \        P                  P	                  \
        4      4      p\#        ^4       F3  p	VP                  V4       \        P                  P                  V4      pK5  	  \%        4       p
. pV F  pV'       g   K  \'        V4      pVP                  4       pW9   g   \)        V4      '       g   KA  V
P+                  V4       \-        V4      pV^8  g5   \        P                  P/                  V4      P                  4       R8X  g   K  VP                  W34       K  	  VP1                  R R	7       \3        VR
,          ^R7       F%  w  pw  ppV^8X  d   RMRV 2p\5        V VVR4       K'  	  V #   \         d     EL6i ; i  \         d     EK6  i ; i  \         d     ELi ; i  \         d     ELSi ; i)rN
  
TripServerDesktop	DocumentsrS
  r   r   rR
  c                 :    V ^ ,          ) \        V ^,          4      3# r  )r,  r%  s   &r   r  -discover_tripserver_folders.<locals>.<lambda>  s    !uc!A$i0r   r  r	  )r)  u   TripServer נוסף )rN
  rU
  rQ
  rV
  rW
  )zC:\zD:\zE:\>   rr   tripsserver)r  r   r   r   rl  __file__r   r  getcwdrE  r   r  r   r   r  r   r  r=  r  rD
  r@
  rN  re
  r   rj  r  rL
  )r  rI  rW  r   rb
  r   userupcurr  rW  scoredr  nr  rX  r?  r   r`   s                      r   discover_tripserver_foldersru
    sy   EJ"''//"''//(*CDE hbiik"\zz~~c"4T<0T9l;T;=T;=	  ] 
ww$-Ebggll5,?@JJu-D#tzz|3tzz|Gb7b"))"'',,u*CD .	 .
	

;/WW\\+t477==$$%%RLARlCRlC'  0ggoobggooh78qAc"''//#&C 
 5DFAggi;033 #A:))!,224DMM5*%  KK0K1'r
!<]eT #q0DSE.JeUD,? = Ly  ,    		  sX   AQ= A R 2RAR" 7A5R" -BR4 =RRRR"R10R14SSc                    \         P                   ! 4       pV '       g%   \        '       d   V\        ,
          ^<8  d   \        # / p. pVP                  \	        4       4       VP                  \        4       4       V'       g[    VP                  RRR\        P                  P                  \        P                  P                  \        4      4      RRRRRR	/4       R
^ R^ R^ /pV Fo  pVP                  R4      ;'       g    RpVP                  V^ 4      ^,           WF&   WF,          ^8X  d   TMV RWF,           2pRVR,          RVR,          RRRR	/W'&   Kq  	  VsVsV#   \         d     Li ; i)rd  r`   u   תיקיית האדמיןr   rH
  r   rI
  FrJ
  Tr   r  r  )r   LOCAL_FILE_ROOTS_CACHELOCAL_FILE_ROOTS_CACHE_TSr  rc
  ru
  r  r   r   r   rl  rn
  r   r   )forcer  roots	all_itemscountsr  hintrT  s   &       r   build_local_file_rootsr~
    sz   
))+C--39R3RUW3W%%EI.01023	g'BFBGGOO\^\c\c\k\klt\uLv  yC  EQ  S]  _d  fp  rv  w  x 1lAvq9Fxx
#--vzz$*Q.la'dvQv|n-EtG}fd6lJPUWacgh
	 
 # #L  		s   AE E+*E+c                     \        4       pT ;'       g    R P                  4       P                  4       p W9   d   V # RV9   d   R# RV9   d   R# V'       d#   \        \	        VP                  4       4      4      # R# )r   r   r   )r~
  r   r   r  r  keysra   rz
  s   & r   normalize_local_root_keyr
    se    "$EB%%'--/Heu',4UZZ\"#=+=r   c                     \        4       p\        V 4      p W9  d   \        R 4      h\        P                  P                  \        P                  P                  W,          R,          4      4      # )u3   לא נמצאה תיקיית בסיס מאושרת.r   )r~
  r
  r  r   r   rl  rd  r
  s   & r   local_root_pathr
    sO    "$E'1HNOO77??277++EOF,CDEEr   c                    \        V 4      pT;'       g    R P                  R\        P                  4      P                  R\        P                  4      P	                  4       pV'       dN   \        P
                  P                  V4      '       g   \        P                  ! RV4      '       d   \        R4      h\        P
                  P                  \        P
                  P                  \        P
                  P                  W!4      4      4      p \        P
                  P                  W#.4      pYB8w  d   \        R4      hT#   \         d    \        R4      hi ; i)r   r%  r&  z
^[A-Za-z]:u`   נתיב מוחלט נחסם. ניתן לגלוש רק בתוך התיקיות המאושרות.u   נתיב לא תקין.u;   ניסיון יציאה מתיקיית הבסיס נחסם.)r
  r   r   r2  r   r   isabsr  r
  r  rl  rd  r   
commonpathr   )ra   r  r  r  commons   &&   r   safe_local_pathr
    s    8$DB''bff5==c266JPPRHRWW]]8,,0Q0Q{||WW__RWW--bggll4.JKLF4##TN3 ~VWWM	  42334s    E Ec                     \        V 4      p \        P                  P                  W4      pVR 8X  d   R# VP	                  RR4      #   \
         d     R# i ; i)r(  r   r%  r&  )r
  r   r   r  r   r   )ra   r  r  r  s   &&  r   rel_for_localr
  '  sQ    8$Dggooi.CZr;S[[s%;; s   'A A AAc                     \         P                  P                  V 4      '       d   R # \         P                  P                  V 4      ^,          P	                  4       pVR9   d   R# V\
        9   d   R# R# )r  r  rY  r  >   r7   r6   r2   r4   r3   r5   )r   r   r  r4  r   LOCAL_FILE_TEXT_EXTENSIONS)r   r  s   & r   local_file_kindr
  0  sU    	ww}}T
''

4
 
#
)
)
+C
@@
((r   c                 6    R RRRRRRR/P                  V R4      # )r  u   📁r  u   🖼️rY  u   📄r  u   📦r`  )rx  s   &r   local_file_iconr
  ;  s(    67IvvvvNRRSWY_``r   c                 
   \         P                  P                  T ;'       g    R P                  RR4      4      P	                  4       p \
        P                  ! RRV 4      p V P	                  R4      p V R9   d   \        R4      hV # )r   r%  r&  z[\x00-\x1f<>:\"/\\|?*]r  z .u)   שם קובץ/תיקייה לא תקין.>   r   r(  r)  )r   r   r   r   r   r  r(  r  )r   s   &r   local_safe_namer
  @  sl    77TZZR00s;<BBDD66+S$7D::dDDEEKr   c                    \         P                  P                  V 4      '       g   V # \         P                  P                  V 4      p\         P                  P	                  \         P                  P                  V 4      4      w  r#\        ^R4       FR  p\         P                  P                  W RV V 24      p\         P                  P                  V4      '       d   KP  Vu # 	  \        R4      h)r  r  _copyu2   לא ניתן ליצור שם יעד ייחודי.)	r   r   r   r   r4  r   r=  r   r  )r   rc   r   r  r  r   s   &     r   local_unique_destinationr
  H  s    77>>$WW__T"F  !1!1$!78ID1d^GGLL6qc#)?@	ww~~i((  I
JJr   c                 8   \        \        P                  P                  V\        P                  P	                  V 4      4      4      p\        P                  P                  V 4      '       d   \        P                  ! W4       V# \        P                  ! W4       V# r   )	r
  r   r   r   r   r  rF  r  r  r  dest_dirr  s   && r   local_copy_itemr
  T  sc    %bggll8RWW=M=Mc=R&STF	ww}}S$ M 	S!Mr   c                     \        \        P                  P                  V\        P                  P	                  V 4      4      4      p\
        P                  ! W4       V# r   )r
  r   r   r   r   rF  mover
  s   && r   local_move_itemr
  ]  s;    %bggll8RWW=M=Mc=R&STF
KKMr   c                 z   \         P                  P                  V4      '       dH   T;'       g    \        W4      pV P	                  W$4       \         P                  P                  V4      ^3# ^ p^ p\         P                  ! V4       F  w  rxp	V U
u. uF  qR9  g   K  V
NK  	  up
VR&   V	 Fo  p\         P                  P                  W{4      p \         P                  P                  V4      p\        W4      pV P	                  W4       W],          pV^,          pKq  	  K  	  WV3# u up
i   \         d     K  i ; i)r  r"  >   __pycache__$RECYCLE.BINSystem Volume Information)	r   r   rg  r
  r  r  r'  r   r   )rU  ra   r  base_arcarcrj  r  r,  r-  r.  r/  r5  r/  r  r  s   &&&&           r   add_path_to_zipr
  c  s
   	ww~~i  <<-<
 wwy)1,,EE(*	(:$9"*t(Q7s.sqq(t!HW/Awwq)#H0 
 " ); < u  s   D&D&AD++D:9D:/admin/local-filesc                   / pVe   \        V4      VR&   Ve/   \        V4      R8w  d   \        V4      P                  RR4      VR&   VP                  4        F  w  rVVf   K  \        V4      WE&   K  	  T pV'       d0   VR\        P                  P                  VRR7      ,           ,          p\        P                  ! VRR	7      # )
zBuild HTML-safe admin local-file URLs with proper percent-encoding.
This is required for Hebrew names, spaces and characters like & in filenames.
r  r   r%  r&  r   r  T)doseqr3  )r   r   r  rK  parse	urlencoder   r   )endpointra   r  r   paramsr  r  r  s   &&&,    r   local_file_hrefr
  y  s     FXvH 3X..tS9v=AFI  CsV\\++F$+?????3d++r   c                    \        V 4      p \        4       p \        W4      p\        P                  P                  T4      '       g   \	        RRRTR7      R3# \        P                  P                  T4      '       g4   \        \        P                  ! \        R	T \        Y4      4      4      4      # \        Y4      p. pT'       d   TR
8w  d   TP                  R4       Uu. uF  qf'       g   K  TR
8w  g   K  TNK  	  pp. pTP!                  R\        RT 4       R24       T FZ  p	TP!                  T	4       TP!                  R\        RT RP#                  T4      4       R\        P$                  ! T	4       R24       K\  	  MTP!                  R4       . p
RpT'       de   TRG9  d^   \        P                  P'                  TP)                  R\        P*                  4      4      P)                  RR4      pR\        RY4       R2p . p\        P,                  ! T4       F  pTRH9   d   K  \        P                  P#                  Y>4      p \        P                  P                  T4      p\        P.                  ! T4      pTP!                  T'       * TP1                  4       YT34       K  	  TP3                  4        TR\4         pT EF  w  pprp\        Y4      p\7        T4      p\9        T4      p\        P$                  ! T4      p\        P$                  ! TRR7      p\:        P<                  ! R\:        P>                  ! TP@                  4      4      p\        P                  P                  T4      '       d   RM\C        TPD                  4      pRT R2p\        P                  P                  T4      '       d   R\        RT T4       RT RT R2pRpM\RT RT R2pR\        R T T4       R!2pTR"8X  d<   TPD                  \F        8:  d'   TR#\        R	T T4       R$\        R%T T4       R&2,          pT
P!                  R'T R(T R(\        P$                  ! T4       R(T R(T R(T R)24       EK  	  \I        T4      \4        8  d&   T
P!                  R*\4         R+\I        T4       R,24       . pTPM                  4        Fq  w  p p!T T 8X  d   R.MRp"TP!                  R/T" R0\        RT 4       R1\        P$                  ! T!R2,          RR7       R\        P$                  ! T!R3,          4       R2	4       Ks  	  . p#TPM                  4        F{  w  p p!T T 8X  d   R4MRp$T#P!                  R5\        P$                  ! T RR7       R6T$ R7\        P$                  ! T!R3,          4       R8\        P$                  ! T!R2,          4       R92	4       K}  	  TR:P#                  T
4      ,           p%\        P$                  ! T4      p&\        P$                  ! T RR7      p'\        P$                  ! TR
8w  d   TMRRR7      p(R;P#                  T4      p)R<RP#                  T4       R=T& R>T) R?T' R@T( RAT' R@T( RBT' RCT( RDRP#                  T#4       RET% RF2#   \         d%   p\	        R RR\        T4      R7      R3u Rp?# Rp?ii ; iu upi   \         d     EK  i ; i  \         d>   pT
P!                  R-\        P$                  ! \K        T4      4       R)24        Rp?EL_Rp?ii ; i)I   נתיב נחסםu?   מנהל הקבצים לא פתח את הנתיב המבוקש.Fr=  rD  N   תיקייה לא קיימתuB   התיקייה המבוקשת לא קיימת במחשב השרת.rM  /admin/local-files/previewr(  r&  z	<a href="r
  u   ">שורש</a>r  r
  u   שורשr   r%  z,<tr><td></td><td><a class="file-name" href="u^   ">⬆️ תיקייה למעלה</a></td><td>תיקייה</td><td></td><td></td><td></td></tr>Tr3  z%Y-%m-%d %H:%Mr  z*<input type="checkbox" name="path" value="z<a class="file-name" href="r   u!   <span class="muted">פתח</span>z<span class="file-name">r  /admin/local-files/downloadu   ">הורד</a> rY  u    · <a href="u   ">תצוגה</a> · <a href="/admin/local-files/editu   ">עריכה</a>z<tr><td class="select-cell">r  r  u8   <tr><td></td><td colspan="5" class="muted">מוצגים u&    פריטים ראשונים מתוך uA   . השתמש בתיקיות משנה כדי לצמצם.</td></tr>uC   <tr><td></td><td colspan="5">שגיאה בקריאת תיקייה: zactive-rootz<a class="root-btn z" href="z	" title="r   r`   z	 selectedz<option value="r}  >u    — z	</option>ru   / ui  
<!DOCTYPE html><html lang="he" dir="rtl"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>קבצי מחשב</title>
<style>
:root{--bg:#07111f;--panel:#101c31;--line:#253650;--text:#f8fafc;--muted:#a8b3c7;--brand:#3b82f6;--danger:#dc2626;--ok:#16a34a}
*{box-sizing:border-box}body{margin:0;font-family:Arial,'Segoe UI',sans-serif;background:linear-gradient(180deg,#07111f,#0f172a);color:var(--text)}.wrap{width:min(1220px,94%);margin:auto;padding:22px 0 50px}a{color:#bfdbfe}.hero,.box{background:rgba(16,28,49,.92);border:1px solid var(--line);border-radius:24px;padding:18px;margin:14px 0;box-shadow:0 18px 50px rgba(0,0,0,.24)}h1{margin:0 0 8px;font-size:34px}p{color:var(--muted);line-height:1.6}.root-bar,.ops{display:flex;gap:10px;flex-wrap:wrap;margin:14px 0}.root-btn,.btn{display:inline-flex;text-decoration:none;border:1px solid var(--line);background:#172033;border-radius:999px;padding:10px 13px;font-weight:900;color:#dbeafe}.root-btn.active-root{background:#2563eb;color:white;border-color:#60a5fa}.path{direction:ltr;text-align:left;background:#020617;border:1px solid #334155;border-radius:16px;padding:12px;color:#fde68a;overflow:auto}table{width:100%;border-collapse:collapse;margin-top:12px}th,td{border-bottom:1px solid #253650;padding:10px;text-align:right;vertical-align:middle}th{color:#cbd5e1}.file-name{font-weight:900;text-decoration:none;color:#fff}.muted{color:var(--muted)}.select-cell{width:44px;text-align:center}button,input,select,textarea{font-family:inherit}button{border:0;background:#2563eb;color:white;padding:11px 14px;border-radius:12px;font-weight:950;cursor:pointer}button.danger{background:#dc2626}button.ok{background:#16a34a}button:hover{filter:brightness(1.08)}input[type=text],input[type=file],select,textarea{background:#020617;color:#fff;border:1px solid #334155;border-radius:12px;padding:10px;max-width:100%}.note{background:#0f172a;border:1px solid #334155;border-radius:16px;padding:12px;color:#cbd5e1;line-height:1.6}.mini-form{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:8px 0}.danger-note{border-color:#7f1d1d;background:rgba(127,29,29,.25)}@media(max-width:760px){table,thead,tbody,tr,td,th{display:block}thead{display:none}tr{border:1px solid #253650;border-radius:18px;margin:10px 0;padding:8px}td{border:0;padding:7px}.select-cell{width:auto;text-align:right}}
</style></head><body><div class="wrap">
<div class="hero"><a class="btn" href="/admin">⬅ חזרה לפאנל</a><h1>📁 קבצי מחשב — גישה מלאה לתיקיות מאושרות</h1><p>הפאנל סורק את מחשב השרת ומציג תיקיות הורדות ו־TripServer שנמצאו בפועל. בתוך התיקיות האלה אפשר לקרוא, להוריד, להעלות, למחוק, ליצור תיקייה, לערוך טקסט, להעתיק ולהעביר קבצים.</p><div class="root-bar">uj   <a class="root-btn" href="/admin/local-files?refresh=1">🔄 סרוק מחדש</a></div><div class="path">z</div><p class="muted">u  </p></div>
<div class="note"><b>חשוב:</b> זה עדיין לא נותן ל־ChatGPT גישה ישירה למחשב שלך. אבל זה כן נותן לך דרך לנהל קבצים במחשב השרת מתוך הפאנל, ליצור ZIP ולהעלות אליי לצ׳אט כשצריך ניתוח.</div>
<div class="box">
<h2>פעולות בתיקייה הנוכחית</h2>
<form class="mini-form" action="/admin/local-files/upload" method="post" enctype="multipart/form-data"><input type="hidden" name="root" value="z*"><input type="hidden" name="path" value="u   "><input type="file" name="files" multiple><button class="ok" type="submit">⬆ העלה לכאן</button></form>
<form class="mini-form" action="/admin/local-files/mkdir" method="post"><input type="hidden" name="root" value="u  "><input type="text" name="folder_name" placeholder="שם תיקייה חדשה"><button type="submit">📁 צור תיקייה</button></form>
</div>
<div class="box"><form action="/admin/local-files/bulk" method="post"><input type="hidden" name="root" value="z/"><input type="hidden" name="base_path" value="u  ">
<div class="ops"><button name="action" value="zip" type="submit">⬇ ZIP למסומנים</button><button class="danger" name="action" value="delete" type="submit" onclick="return confirm('למחוק את כל הפריטים המסומנים?')">🗑 מחק מסומנים</button><button name="action" value="copy" type="submit">📋 העתק מסומנים אל היעד</button><button name="action" value="move" type="submit" onclick="return confirm('להעביר את הפריטים המסומנים?')">📦 העבר מסומנים אל היעד</button><button name="action" value="rename" type="submit">✏️ שנה שם למסומן אחד</button><input type="text" name="new_name" placeholder="שם חדש למסומן אחד"><select name="dest_root">u  </select><input type="text" name="dest_path" placeholder="נתיב יעד יחסי. ריק = שורש התיקייה שנבחרה"></div>
<table><thead><tr><th></th><th>שם</th><th>סוג</th><th>גודל</th><th>עודכן</th><th>פעולות</th></tr></thead><tbody>z3</tbody></table></form></div>
</div></body></html>
)r(  r   >   r
  r
  )'r
  r~
  r
  r   r3  r   r   r   r   r  r   r   r  r
  r
  r+  r  r   r   r   r   r2  r  r  r   rj  LOCAL_FILE_LIST_LIMITr
  r
  r   r   r  st_mtimer  r  LOCAL_FILE_PREVIEW_MAX_BYTESr,  r~  r  )*ra   r  rz
  currentr  breadcrumbsr/  r0  accrE  r  parent_linkrB  r  r   r   r  r  limited_not_dir_sortr  rx  r   r  safe_relmodifiedr  checkboxmainactionsroot_buttonsrT  r  r,
  dest_optionsr,  	body_rowssafe_currentroot_key_saferel_path_safecrumbss*   &&                                        r   render_admin_file_managerr
    s   '1H"$EZ!(5 77>>'"" !?  BF  KP  Za  b  dg  g  	g77==!!))/:VX`bopx  cC  +D  E  F  	FX/HKHO$NN3/B/q1c/BY7KX'V&WWefgDJJt?;OQY[^[c[cdg[h+i*jjlmum|m|  ~B  nC  mD  DH   I  J  	:&DKHI-!1!1#rvv!>?GGcRD_UiksE|D}  ~\  ]#BJJw'DDD77<<.Dt,WWT]F
DJJL$bIJ ( 	001/6+HeT/C"4(D"4(D -Is$7H}}%5t~~bkk7RSHGGMM$//5\"**5MDCH:RPHww}}T""4_EY[ceh5i4jjlmqlrrst}s~  C  D=1$q7K%o6SU]_b&c%ddst6>bjj4P&P?[]egj/k.l  mJ  KZ  [t  v~  @C  KD  JE  EU   V  VGKK6xj	$yYaYhYhimYnXooxy}x~  H  IQ  HR  R[  \c  [d  dn  o  p# 07$ w<//KKRShRi  jP  QT  U\  Q]  P^  ^_  `  a L[[]	T"hmB1#hOceh?i>jjst|  uD  uD  EI  JP  EQ  Y]  u^  t_  _a  bj  bq  bq  rv  w~  r  b@  aA  AE  F  	G # L[[]	T"%/;rohooc.N-OqQYPZZ[\d\k\klpqxly\z[{  |A  BJ  BQ  BQ  RV  W]  R^  B_  A`  `i  j  	k # diio-I??7+LOOHD9MOOCHRtTMZZ$Ff gi  gn  gn  o{  g|  f}  }g	  h	t	  g	u	  u	L
  M
S
  L
T
 T
P Q^  P_  _I  JW  IX Xqq~p  @j  kx  jy yoo|n}  ~m  n{  m| |} ~@  ~E  ~E  FR  ~S  }T TE FO  EP P [  Z !46w  }B  LO  PS  LT  U  WZ  Z  	ZZ C0  0  BYZbZiZijnorjsZtYuu  A  	B  	BBsu   Y4 	Z&-Z&6Z&AZ> AZ+#DZ> 6C,Z> 4Z#?ZZ#Z#+Z;6Z> :Z;;Z> >\	2\\c                 v   \        V 4      w  r\        P                  ! V R R7      p\        P                  ! VR,          R R7      p\        \	        \        V 4      4      4      p. p\         EF  w  rgp\        P                  ! VR R7      p	\        P                  ! VR R7      p
\        P                  ! VR R7      p\        P                  ! VR,           V,           R,           V,           P                  4       R R7      p\        P                  ! RV ,           R,           V,           R R7      pVP                  VP                  4       4      pV'       d^   VP                  P                  4       \        9   d+    \        \        V4      4      pRVP                   RVR R	2pMRVP                   2pMRp\        P                  ! VR R7      pVP                  RV: RV: RV	: RV: RV: RV: RV	: RV
: RV: RV: RV: R24       EK  	  RP!                  V4      #   \         d    RTP                   R
2p Li ; i)Tr3  r`   r   zmedia-file-rs  u   קיים כעת: 🎬 r  r0  r  u    · משך לא זוההu   קיים כעת: 🖼️ u1   לא נמצא כרגע קובץ מדיה לשקףz.
<form class="image-upload-card" data-search="zt" action="/upload_usa_media" method="post" enctype="multipart/form-data">
<input type="hidden" name="target" value="z0">
<input type="hidden" name="image_key" value="z'">
<input class="image-file-input" id="u   " type="file" name="file" accept=".jpg,.jpeg,.png,.webp,.bmp,.tif,.tiff,.mp4,.m4v,image/*,video/mp4" onchange="if(this.files && this.files.length){this.closest('form').querySelector('.upload-status').textContent='מעלה ומאמת מדיה ל־z3...';this.closest('form').submit();}">
<label for="z6" class="image-upload-label">
<span class="image-key">z"</span>
<span class="image-title">z!</span>
<span class="image-desc">z%</span>
<span class="upload-current">u\   </span>
<span class="upload-status">לחץ ובחר תמונה או סרטון MP4 עבור z</span>
</label>
</form>
ru  )r  r   r   r  r   r`  USA_IMAGE_UI_ITEMSr   r   r  r  ro  r   r   r   r  r   )r  r  r  r,  current_filesr  r;  r   descsafe_keyr7  	safe_descsearch_textinput_idr
  r*  current_textr
  s   &                 r   render_usa_image_upload_cardsr
    s   "7"GN//.=K??;w#7tDL'-En-U(VWME"4"4	$??9D9__U$7
OOD5	ooy3'>'Dt'K&R&R&T\`a??=>#AC#G)#S[_`##IOO$56~~##%)==c;CLIH%;GLL>hWZ^[f#gL ";7<<.INL|4@ K8\8XWaclnz  }IJ 	K' #5B 99U+ ! c%;GLL>Ia#bLcs   3(HH87H8z/admin/c                      R \        4       ,           R,           \        R4      ,           R,           \        R4      ,           R,           # )u.  
<!DOCTYPE html>
<html lang="he" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TripServer Admin</title>
<style>
:root{--bg:#07111f;--panel:#101c31;--panel2:#14233c;--line:#253650;--text:#f8fafc;--muted:#a8b3c7;--brand:#3b82f6;--brand2:#60a5fa;--good:#16a34a;--warn:#f59e0b;--bad:#dc2626;--glass:rgba(16,28,49,.74)}
*{box-sizing:border-box}body{margin:0;font-family:Arial,'Segoe UI',sans-serif;background:radial-gradient(circle at 85% -10%,rgba(59,130,246,.35),transparent 28%),radial-gradient(circle at 10% 10%,rgba(20,184,166,.18),transparent 24%),linear-gradient(180deg,#07111f,#0f172a 52%,#07111f);color:var(--text);min-height:100vh}a{color:inherit}.wrap{width:min(1180px,94%);margin:auto;padding:22px 0 48px}.app-shell{min-height:calc(100vh - 44px)}
.hero{display:grid;grid-template-columns:1fr auto;gap:16px;align-items:center;background:linear-gradient(135deg,rgba(30,64,175,.92),rgba(15,23,42,.88));border:1px solid rgba(147,197,253,.25);border-radius:30px;padding:22px;box-shadow:0 25px 70px rgba(0,0,0,.30);position:relative;overflow:hidden}.hero:after{content:"";position:absolute;inset:auto -60px -90px auto;width:260px;height:260px;border-radius:50%;background:rgba(96,165,250,.16);pointer-events:none}.hero>*{position:relative;z-index:1}.hero h1{margin:0 0 8px;font-size:clamp(28px,5vw,44px);letter-spacing:-1px}.hero p{margin:0;color:#dbeafe;line-height:1.65;max-width:760px}.hero-actions{display:flex;gap:10px;flex-wrap:wrap;justify-content:flex-end;position:relative;z-index:2}.hero-actions form{margin:0}.hero-actions button{margin:0;border-radius:999px;padding:11px 15px;box-shadow:none}.btn-link,.back-home{position:relative;z-index:3;display:inline-flex;align-items:center;justify-content:center;gap:8px;text-decoration:none;border:1px solid rgba(148,163,184,.35);background:rgba(15,23,42,.65);border-radius:999px;padding:11px 15px;font-weight:900;white-space:nowrap}.btn-link:hover,.back-home:hover{border-color:var(--brand2);background:rgba(59,130,246,.22)}
.status-strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:16px 0}.status-card{background:var(--glass);border:1px solid var(--line);border-radius:20px;padding:14px;box-shadow:0 16px 40px rgba(0,0,0,.18)}.status-card b{display:block;font-size:16px;margin-bottom:5px}.status-card span{color:var(--muted);font-size:13px;line-height:1.45}.dot{display:inline-block;width:10px;height:10px;background:#22c55e;border-radius:50%;box-shadow:0 0 16px #22c55e;margin-left:7px}.main-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:18px}.main-card{margin-top:0;border:1px solid var(--line);background:linear-gradient(180deg,rgba(30,41,59,.94),rgba(15,23,42,.98));border-radius:26px;padding:20px;text-align:right;cursor:pointer;color:white;box-shadow:0 20px 55px rgba(0,0,0,.24);min-height:160px;transition:.18s transform,.18s border-color,.18s background;position:relative;overflow:hidden}.main-card:after{content:"›";position:absolute;left:18px;bottom:10px;font-size:42px;color:rgba(191,219,254,.35);transform:rotate(180deg)}.main-card:hover{transform:translateY(-4px);border-color:var(--brand2);background:linear-gradient(180deg,rgba(37,99,235,.28),rgba(15,23,42,.98))}.main-card .icon{font-size:34px;margin-bottom:10px}.main-card h2{margin:0 0 8px;font-size:24px}.main-card p{margin:0;color:var(--muted);line-height:1.55}.main-card.danger-card{border-color:rgba(248,113,113,.45);background:linear-gradient(180deg,rgba(127,29,29,.65),rgba(15,23,42,.98))}.main-card.admin-card{border-color:rgba(251,191,36,.45)}
.screen{display:none;margin-top:18px}.screen.active{display:block}.section-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:20px 0 14px}.section-title h2{margin:0 0 6px;font-size:32px;letter-spacing:-.5px}.section-title p{margin:0;color:var(--muted);line-height:1.55}.section-actions{display:flex;gap:10px;flex-wrap:wrap}.back-btn{border:1px solid var(--line);background:#1e293b;color:white;border-radius:999px;padding:10px 14px;cursor:pointer;font-weight:900}.back-btn:hover{background:#334155}.sub-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:14px}.sub-card{background:linear-gradient(180deg,var(--panel),#0f172a);border:1px solid var(--line);border-radius:22px;padding:18px;cursor:pointer;min-height:126px;transition:.18s transform,.18s border-color}.sub-card:hover{transform:translateY(-3px);border-color:var(--brand2)}.sub-card h3{margin:0 0 8px;font-size:22px}.sub-card p{margin:0;color:var(--muted);line-height:1.55}.tool-panel{display:none;background:rgba(16,28,49,.92);border:1px solid var(--line);border-radius:26px;padding:20px;box-shadow:0 20px 60px rgba(0,0,0,.22);margin-top:16px}.tool-panel.active{display:block}.tool-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:14px}.tool-head h3{font-size:26px;margin:0 0 6px}.tool-head p{margin:0;color:var(--muted);line-height:1.55}.form-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:14px}.upload-box{background:#0b1220;border:1px solid #24344d;border-radius:18px;padding:16px}.upload-box h4{margin:0 0 8px;font-size:18px}.upload-box p{color:var(--muted);line-height:1.55;margin:8px 0 0;font-size:14px}.note{color:var(--muted);font-size:14px;line-height:1.65}.warning{background:rgba(127,29,29,.38);border:1px solid rgba(248,113,113,.35);color:#fecaca;border-radius:16px;padding:13px;line-height:1.6;margin:12px 0}.good{background:rgba(22,101,52,.30);border:1px solid rgba(74,222,128,.35);color:#bbf7d0;border-radius:16px;padding:13px;line-height:1.6;margin:12px 0}.mini-note{background:#0f172a;border:1px solid var(--line);border-radius:14px;padding:12px;color:#cbd5e1;line-height:1.6;font-size:14px}input[type=file],select,input[type=text]{width:100%;padding:14px;background:#07111f;color:white;border-radius:14px;border:1px solid #334155;font-size:15px}input[type=file]::file-selector-button{border:0;border-radius:10px;background:#1d4ed8;color:white;padding:10px 12px;margin-left:10px;font-weight:900}button{border:0;background:#2563eb;color:white;padding:13px 17px;border-radius:14px;font-size:15px;font-weight:950;cursor:pointer;margin-top:12px;box-shadow:0 12px 30px rgba(37,99,235,.20)}button:hover{filter:brightness(1.08)}button:disabled{opacity:.55;cursor:not-allowed;filter:none;box-shadow:none}button.orange{background:#ea580c}button.danger{background:#dc2626}button.cancel{background:#475569}.preview-links{display:flex;gap:10px;flex-wrap:wrap;margin-top:12px}.preview-links a{display:inline-flex;text-decoration:none;background:#172033;border:1px solid #334155;border-radius:12px;padding:10px 12px;font-weight:900;color:#dbeafe}.preview-links a:hover{border-color:var(--brand2)}.field-label{display:block;color:#cbd5e1;font-size:13px;font-weight:900;margin:12px 0 6px}label.check{display:flex;align-items:center;gap:8px;margin-top:12px;color:#e2e8f0;font-weight:bold}.danger-zone{background:linear-gradient(135deg,rgba(69,26,26,.72),rgba(16,28,49,.94))!important;border-color:rgba(248,113,113,.35)!important}.split-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:14px}.filter-bar{position:sticky;top:0;z-index:8;background:rgba(7,17,31,.92);backdrop-filter:blur(12px);border:1px solid var(--line);border-radius:18px;padding:12px;margin:10px 0 14px;display:grid;grid-template-columns:1fr auto;gap:10px;align-items:center}.jump-days{display:flex;gap:6px;flex-wrap:wrap;max-width:500px;justify-content:flex-end}.jump-days button{margin:0;padding:7px 9px;border-radius:10px;background:#1e293b;box-shadow:none;font-size:12px}.image-upload-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}.image-upload-card{margin:0}.image-file-input{position:absolute;opacity:0;width:1px;height:1px;pointer-events:none}.image-upload-label{display:block;height:100%;cursor:pointer;background:#0b1220;border:1px solid #283950;border-radius:18px;padding:15px;transition:.18s transform,.18s border-color,.18s background;box-shadow:0 8px 22px rgba(0,0,0,.14)}.image-upload-label:hover{transform:translateY(-2px);border-color:#60a5fa;background:#13213a}.image-key{display:inline-flex;background:#1d4ed8;color:#dbeafe;border-radius:999px;padding:4px 9px;font-size:12px;font-weight:900;margin-bottom:8px}.image-title{display:block;color:#fff;font-size:17px;font-weight:950;margin-bottom:7px;line-height:1.25}.image-desc{display:block;color:#cbd5e1;font-size:14px;line-height:1.45;min-height:42px}.upload-status{display:block;margin-top:12px;color:#fde68a;font-size:13px;font-weight:900;border-top:1px solid #334155;padding-top:10px}.breadcrumb{display:flex;gap:8px;align-items:center;color:#bfdbfe;font-size:14px;margin:16px 0 0}.breadcrumb button{margin:0;background:transparent;border:1px solid #334155;box-shadow:none;padding:7px 10px}.mobile-footer{display:none;position:fixed;bottom:12px;right:12px;left:12px;z-index:20}.mobile-footer button{width:100%;box-shadow:0 12px 40px rgba(0,0,0,.35)}
@media(max-width:860px){.hero{grid-template-columns:1fr;padding:18px}.hero h1{font-size:30px}.hero p{font-size:14px;line-height:1.55}.hero-actions{justify-content:flex-start}.status-strip{display:none}.main-grid{grid-template-columns:repeat(2,1fr);gap:10px}.main-card{min-height:128px;padding:14px;border-radius:22px}.main-card .icon{font-size:27px;margin-bottom:7px}.main-card h2{font-size:20px;margin-bottom:6px}.main-card p{font-size:12.5px;line-height:1.38}.sub-grid,.form-grid,.split-grid{grid-template-columns:1fr}.section-head,.tool-head{display:block}.section-actions{margin-top:12px}.filter-bar{grid-template-columns:1fr}.jump-days{justify-content:flex-start;max-width:none}.wrap{width:min(100%,94%);padding:14px 0 72px}.mobile-footer{display:none}.image-upload-grid{grid-template-columns:1fr}.image-desc{min-height:auto}}@media(max-width:340px){.main-grid{grid-template-columns:1fr}.main-card{min-height:120px}}
</style>
</head>
<body>
<div class="wrap app-shell">
<div class="hero">
<div>
<h1><span class="dot"></span>TripServer Admin</h1>
<p>מסך ניהול לפי היגיון עבודה: בוחרים תחום, נכנסים לתת־קטגוריה, ואז מעלים רק את מה שצריך. בלי גלילה אינסופית ובלי לחפש ידיים ורגליים.</p>
</div>
<div class="hero-actions">
<form action="/power/cancel" method="post" onsubmit="return confirm('לבטל ריסטארט Fail Safe / כיבוי או ריסטארט מתוזמן של Windows?')"><button class="orange">בטל ריסטארט Fail Safe</button></form>
<a class="btn-link" href="/admin/status">📊 סטטוס קבצים</a>
<a class="btn-link" href="/admin/platform">🛡️ מרכז בקרת איכות</a>
<a class="btn-link" href="/admin/health">🩺 בדיקת מערכת</a>
<a class="btn-link" href="/admin/self-test">🧪 בדיקה עצמית מלאה</a>
<a class="btn-link" href="/admin/logs">📜 לוגים</a>
<a class="btn-link" href="/">🏠 ראשי</a>
</div>
</div>

<div id="screen-home" class="screen active"><div class="upload-box" style="margin:14px 0;border:2px solid #2563eb"><h3>📦 עדכון גורף — ZIP אחד</h3><p>העלה חבילת עדכון אחת. האדמין בודק Manifest, מזהה כל רכיב לפי מזהה קשיח, מציג תוכנית התקנה, מגבה ומעדכן את כולם יחד.</p><div class="preview-links"><a href="/admin/update-package">פתח מתקין עדכונים גורף</a><a href="/admin/usa-media-alignment">בדוק וסנכרן מדיית USA ↔ TV</a></div></div>
<div class="status-strip">
<div class="status-card"><b>📁 העלאה בטוחה</b><span>שמירה זמנית, גיבוי, החלפה אטומית, גודל ו־SHA אחרי שמירה.</span></div>
uP  
<div class="status-card"><b>🧭 מבנה היררכי</b><span>מסך ראשי → תחום → תת־תחום → פעולה.</span></div>
<div class="status-card"><b>🖥️ מחשב</b><span>כיבוי/ריסטארט עם טיימר, אישור כתוב וביטול.</span></div>
<div class="status-card"><b>📜 לוגים</b><span>צפייה בלוגי האדמין, עדכונים ופעולות מערכת מתוך הפאנל.</span></div>
</div>
<div class="main-grid">
<button class="main-card" onclick="showScreen('trips')"><div class="icon">🧳</div><h2>טיולים</h2><p>כל הטיולים במקום אחד: יפן קיץ 26, ארצות הברית קיץ 27, ובהמשך כל יעד חדש.</p></button>
<a class="main-card" href="/admin/usa-music-segments" style="text-decoration:none;color:inherit"><div class="icon">🎵</div><h2>מקטעי מוזיקה</h2><p>הוספת שירים, שיוך שקפים וחישוב זמן לכל תמונה בכל שיר.</p></a>
<button class="main-card" onclick="showScreen('netlify')"><div class="icon">🌐</div><h2>Netlify Builder</h2><p>בניית חבילת Deploy מסונכרנת מהמקור הפעיל: טיול, מצגות, תמונות, סרטונים, שירים ו־Manifest.</p></button>
<button class="main-card" onclick="showScreen('budgets')"><div class="icon">💰</div><h2>תקציבים</h2><p>אפליקציית תקציב חופשה ואפליקציית תקציב חודשי/משפחתי.</p></button>
<button class="main-card" onclick="showScreen('tripform')"><div class="icon">🧾</div><h2>טופס פתיחת טיול</h2><p>טופס קליטת טיול חדש, שמירה כ־TripForm/index.html.</p></button>
<button class="main-card danger-card" onclick="showScreen('power')"><div class="icon">🖥️</div><h2>פעולות מחשב</h2><p>כיבוי, ריסטארט, טיימר וביטול פעולה מתוזמנת.</p></button>
<a class="main-card" href="/admin/camera" style="text-decoration:none"><div class="icon">📷</div><h2>מצלמת חדר</h2><p>הפעלת מצלמת החדר, אודיו והקלטות — רק בלחיצה ידנית.</p></a>
<a class="main-card" href="/admin/logs" style="text-decoration:none"><div class="icon">📜</div><h2>לוגים</h2><p>צפייה בלוגי האדמין, עדכונים ופעולות מערכת מתוך הדפדפן.</p></a>
<button class="main-card admin-card" onclick="showScreen('admin-tools')"><div class="icon">⚙️</div><h2>ניהול האדמין</h2><p>העלאת admin.py/admin_server.py, restart ושחזור גיבוי.</p></button>
<a class="main-card" href="/admin/local-files" style="text-decoration:none"><div class="icon">📁</div><h2>קבצי מחשב</h2><p>גישה מלאה לתיקיות הורדות ו־TripServer שהתגלו במחשב: קריאה, העלאה, מחיקה, העתקה, העברה ו־ZIP.</p></a>
<a class="main-card" href="/admin/live-usa-audit" style="text-decoration:none;border-color:rgba(34,197,94,.55)"><div class="icon">🔍</div><h2>ביקורת מערכת USA</h2><p>יצירת חבילת מקור אמת חיה: טיולים, מצגות, מדיה, אדמין פעיל ו־Netlify שנבנה דרך המנגנון עצמו.</p></a>
</div>
</div>

<div id="screen-netlify" class="screen">
<div class="section-head"><div class="section-title"><h2>🌐 Netlify</h2><p>בחר טיול, והפאנל יבנה ZIP מוכן להעלאה ל־Netlify מתוך הקבצים העדכניים שנמצאים כעת בתיקיות הטיול בשרת.</p></div><div class="section-actions"><button class="back-btn" onclick="showScreen('home')">⬅ חזרה למסך הראשי</button></div></div>
<div class="sub-grid">
<div class="sub-card" onclick="window.location.href='/admin/netlify/builder'"><h3>🧭 בחר טיול ובנה ZIP עדכני</h3><p>המערכת סורקת את תיקיות הטיולים הפעילות, שואלת עבור איזה טיול ליצור חבילה, ומרכיבה אותה מחדש מקובץ הטיול, המצגות, התמונות, הסרטונים והשירים העדכניים באותו רגע.</p></div>
<div class="sub-card" onclick="window.location.href='/admin/netlify/download/USA'"><h3>🇺🇸 בנייה מהירה — ארצות הברית 27</h3><p>בונה מחדש חבילת iPhone/מחשב מהמקור הפעיל. רק נתיבי הפריסה וקישור אפליקציית התקציב משתנים. שקף התקציב זהה וללא סכומים בכל הגרסאות.</p></div>
<div class="sub-card" onclick="window.location.href='/admin/netlify/download/JAPAN'"><h3>🇯🇵 בנייה מהירה — יפן 26</h3><p>בונה מחדש חבילה מלאה מתוך קובצי יפן הפעילים, כולל המצגות והמדיה העדכניות.</p></div>
</div>
<div class="mini-note" style="margin-top:14px"><b>Netlify הוא תוצר Build ולא מקור אמת:</b> אין צורך לתחזק ידנית קובץ Netlify נפרד. בכל לחיצה החבילה נוצרת מחדש מהגרסה הפעילה בשרת, נבדקת, ומקבלת build-manifest.json עם חתימות.</div>
</div>

<div id="screen-trips" class="screen">
<div class="section-head"><div class="section-title"><h2>🧳 טיולים</h2><p>כאן נמצאים כל הטיולים הפעילים. טיול חדש יתווסף למסך הזה, בלי להעמיס על המסך הראשי.</p></div><div class="section-actions"><button class="back-btn" onclick="showScreen('home')">⬅ חזרה למסך הראשי</button></div></div>
<div class="sub-grid">
<div class="sub-card" onclick="showScreen('japan')"><h3>🇯🇵 יפן קיץ 26</h3><p>קובץ טיול, מצגות, תמונות ומוזיקה של טיול יפן 2026.</p></div>
<div class="sub-card" onclick="showScreen('usa')"><h3>🇺🇸 ארצות הברית קיץ 27</h3><p>קובץ טיול, מצגת, TV, מדיה לשקפים ומוזיקה של טיול ארצות הברית 2027.</p></div>
</div>
<div class="mini-note" style="margin-top:14px">פורמט עבודה להמשך: כל טיול עתידי יופיע כאן ככרטיס חדש עם שם יעד + עונה/שנה, ואז יוביל למסך משנה באותו מבנה של קובץ טיול, מצגות, מדיה ובדיקות.</div>
</div>

<div id="screen-japan" class="screen">
<div class="section-head"><div class="section-title"><h2>🇯🇵 יפן</h2><p>בחר קודם מה אתה מעדכן: קובץ הטיול, המצגות או המדיה.</p></div><div class="section-actions"><button class="back-btn" onclick="showScreen('trips')">⬅ חזרה לרשימת הטיולים</button><a class="btn-link" href="/JAPAN/" target="_blank">פתח קובץ טיול יפן</a></div></div>
<div class="sub-grid">
<div class="sub-card" onclick="showTool('japan','japan-trip')"><h3>📄 קובץ טיול יפן</h3><p>העלאת index.html או חבילת ZIP מלאה.</p></div>
<div class="sub-card" onclick="showTool('japan','japan-presentations')"><h3>🎬 מצגות יפן</h3><p>פתיח טיסה ומצגת יפן.</p></div>
<div class="sub-card" onclick="showTool('japan','japan-media')"><h3>🖼️🎵 מדיה יפן</h3><p>ZIP תמונות ושירי MP3.</p></div>
<div class="sub-card" onclick="window.open('/JAPAN/','_blank')"><h3>🔎 בדיקה מהירה — טיול</h3><p>פתיחת קובץ הטיול יפן בחלון חדש.</p></div>
<div class="sub-card" onclick="window.open('/JAPAN/japan-experience.html','_blank')"><h3>🎬 בדיקה מהירה — מצגת</h3><p>פתיחת מצגת יפן בחלון חדש.</p></div>
</div>
<div id="tool-japan-trip" class="tool-panel">
<div class="tool-head"><div><h3>📄 קובץ טיול יפן</h3><p>קובץ יחיד נשמר כ־JAPAN/index.html. ZIP מלא מעדכן גם מצגות ומדיה אם הן קיימות בחבילה.</p></div><button class="back-btn" onclick="hideTools('japan')">חזרה לתת־קטגוריות</button></div>
<div class="preview-links"><a href="/JAPAN/" target="_blank">פתח קובץ טיול יפן</a><a href="/JAPAN/japan-flight-intro.html" target="_blank">פתח פתיח טיסה</a><a href="/JAPAN/japan-experience.html" target="_blank">פתח מצגת יפן</a></div>
<div class="form-grid"><div class="upload-box"><h4>קובץ HTML ראשי</h4><form action="/upload/JAPAN" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".html,.htm"><button>העלה קובץ טיול יפן</button></form><p>יישמר כ־C:\TripServer\JAPAN\index.html</p></div><div class="upload-box"><h4>ZIP מלא יפן</h4><form action="/upload_trip_package/JAPAN" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".zip,application/zip,application/x-zip-compressed"><button>העלה ZIP מלא של יפן</button></form><p>מתאים לחבילה עם index.html, japan-experience.html, japan-flight-intro.html ותיקיית media.</p></div></div>
</div>
<div id="tool-japan-presentations" class="tool-panel">
<div class="tool-head"><div><h3>🎬 מצגות יפן</h3><p>שמות היעד קבועים כדי שהקישורים מתוך קובץ הטיול לא יישברו.</p></div><button class="back-btn" onclick="hideTools('japan')">חזרה לתת־קטגוריות</button></div>
<div class="form-grid"><div class="upload-box"><h4>✈️ פתיח טיסה</h4><form action="/upload_presentation/flight_intro" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".html,.htm"><button>העלה פתיח טיסה</button></form><p>יישמר כ־japan-flight-intro.html</p></div><div class="upload-box"><h4>🎌 מצגת יפן</h4><form action="/upload_presentation/japan_experience" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".html,.htm"><button>העלה מצגת יפן</button></form><p>יישמר כ־japan-experience.html</p></div></div>
<div class="preview-links"><a href="/JAPAN/japan-flight-intro.html" target="_blank">בדיקת פתיח</a><a href="/JAPAN/japan-experience.html" target="_blank">בדיקת מצגת</a></div>
</div>
<div id="tool-japan-media" class="tool-panel">
<div class="tool-head"><div><h3>🖼️🎵 מדיה יפן</h3><p>תמונות ושירים נשמרים לנתיבים שהמצגת מחפשת בפועל. ספירה מדויקת של תמונות בשימוש נמצאת במסך סטטוס קבצים.</p></div><button class="back-btn" onclick="hideTools('japan')">חזרה לתת־קטגוריות</button></div>
<div class="form-grid"><div class="upload-box"><h4>ZIP תמונות מצגת יפן</h4><form action="/upload_japan_images_zip" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".zip,application/zip,application/x-zip-compressed"><button>העלה ZIP תמונות יפן</button></form><p>הפאנל מסנן קובצי תמונה נתמכים. הספירה החשובה היא לא כמה קבצים יש בתיקייה, אלא כמה src מופיעים בפועל בתוך japan-experience.html. בחבילות/ZIP מלאים הוא לא משנה שמות קבצים כדי לא לשבור קישורים פנימיים במצגת.</p></div><div class="upload-box safe-zone"><h4>🎵 שיר מצגת יפן — בדיקה לפני הטמעה</h4><form action="/upload_japan_music/japan_experience_music" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".mp3,.wav,.m4a,.aac,.flac,.ogg,.opus,.wma,.webm,.mp4,audio/*,video/mp4" required><button>בדוק שיר והמשך להטמעה</button></form><p><b>פעולה בטוחה:</b> השיר נשמר זמנית, ffprobe מזהה את האורך, ורק אם ממוצע השקף בטווח 5–10 שניות הוא מוטמע ומסונכרן אוטומטית. אם הוא קצר מדי או ארוך מדי, יוצג מסך אישור לפני שמירת השיר בנתיבי המצגת ולפני שינוי japan-experience.html.</p><div class="preview-links"><a href="/admin/presentation-music" target="_blank">סטטוס סנכרון מוזיקה</a><a href="/JAPAN/japan-experience.html" target="_blank">פתח מצגת יפן</a></div></div><div class="upload-box safe-zone"><h4>✈️ מוזיקת פתיח טיסה — העלאה</h4><form action="/upload_japan_music/japan_flight_music" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".mp3,.wav,.m4a,.aac,.flac,.ogg,.opus,.wma,.webm,.mp4,audio/*,video/mp4" required><button>העלה מוזיקת פתיח טיסה</button></form><p>פתיח הטיסה הוא מקטע נפרד. השיר נשמר ונמדד, אבל לא משנה את japan-experience.html.</p></div></div>
</div>
</div>

<div id="screen-usa" class="screen">
<div class="section-head"><div class="section-title"><h2>🇺🇸 ארצות הברית</h2><p>אזור ארה״ב מחולק לקובץ טיול, מצגות, מדיה לשקפים ומוזיקה/TV.</p></div><div class="section-actions"><button class="back-btn" onclick="showScreen('trips')">⬅ חזרה לרשימת הטיולים</button><a class="btn-link" href="/USA/" target="_blank">פתח קובץ טיול ארה״ב</a><a class="btn-link" href="/USA_TV/usa2027-tv.html" target="_blank">פתח קובץ טיול TV</a></div></div>
<div class="sub-grid">
<div class="sub-card" onclick="showTool('usa','usa-trip')"><h3>📄 קובץ טיול</h3><p>HTML ראשי, ZIP מלא וגרסת טלוויזיה.</p></div>
<div class="sub-card" onclick="showTool('usa','usa-presentation')"><h3>🎬 מצגת</h3><p>מצגת עם סכומים וגרסת TV.</p></div>
<div class="sub-card" onclick="showTool('usa','usa-images')"><h3>🖼️ מדיה לשקפים</h3><p>ZIP מלא או העלאה לפי שקף/יום.</p></div>
<div class="sub-card" onclick="showTool('usa','usa-music')"><h3>🎵 מוזיקה</h3><p>שיר חלק 1 ושיר חלק 2 של המצגת.</p></div>
<div class="sub-card" onclick="window.open('/USA/','_blank')"><h3>🔎 בדיקה מהירה — טיול פלאפון/מחשב</h3><p>פתיחת קובץ הטיול הראשי של ארה״ב.</p></div>
<div class="sub-card" onclick="window.open('/USA_TV/usa2027-tv.html','_blank')"><h3>📺 בדיקה מהירה — טיול TV</h3><p>פתיחת קובץ הטיול של ארה״ב למסך טלוויזיה.</p></div>
</div>
<div id="tool-usa-trip" class="tool-panel">
<div class="tool-head"><div><h3>📄 קובץ טיול ארה״ב</h3><p>קובץ הטיול הראשי נשמר כ־USA/index.html. גרסת TV נשמרת בנפרד.</p></div><button class="back-btn" onclick="hideTools('usa')">חזרה לתת־קטגוריות</button></div>
<div class="preview-links"><a href="/admin/platform/release-matrix" target="_blank">🔄 מטריצת סנכרון ארה״ב</a><a href="/USA/" target="_blank">פתח קובץ טיול ארה״ב — פלאפון/מחשב</a><a href="/USA_TV/usa2027-tv.html" target="_blank">פתח קובץ טיול ארה״ב — TV</a><a href="/USA/usa2027-presentation.html" target="_blank">פתח מצגת ארה״ב</a><a href="/USA_TV/usa2027-presentation-tv.html" target="_blank">פתח מצגת TV</a></div>
<div class="form-grid"><div class="upload-box"><h4>HTML ראשי</h4><form action="/upload/USA" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".html,.htm"><button>העלה קובץ טיול ארה״ב</button></form><p>יישמר כ־C:\TripServer\USA\index.html</p></div><div class="upload-box"><h4>ZIP מלא ארה״ב</h4><form action="/upload_trip_package/USA" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".zip,application/zip,application/x-zip-compressed"><button>העלה ZIP מלא של ארה״ב</button></form><p>מתאים לחבילת Netlify/שרת עם index.html, מצגת, media ותמונות.</p></div><div class="upload-box"><h4>גרסת טלוויזיה</h4><form action="/upload_usa_extra_html/usa_trip_tv" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".html,.htm"><button>העלה קובץ ארה״ב TV</button></form><p>יישמר כ־usa2027-tv.html.</p></div></div>
</div>
<div id="tool-usa-presentation" class="tool-panel">
<div class="tool-head"><div><h3>🎬 מצגת ארה״ב</h3><p>המצגת הרגילה והמצגת המותאמת למסך טלוויזיה נשמרות בשמות קבועים.</p></div><button class="back-btn" onclick="hideTools('usa')">חזרה לתת־קטגוריות</button></div>
<div class="form-grid"><div class="upload-box"><h4>מצגת ארה״ב עם סכומים</h4><form action="/upload_usa_presentation/usa_presentation" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".html,.htm"><button>העלה מצגת ארה״ב</button></form><p>יישמר כ־usa2027-presentation.html</p></div><div class="upload-box"><h4>מצגת ארה״ב TV</h4><form action="/upload_usa_presentation/usa_presentation_tv" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".html,.htm"><button>העלה מצגת TV</button></form><p>יישמר כ־usa2027-presentation-tv.html</p></div></div>
<div class="preview-links"><a href="/USA/usa2027-presentation.html" target="_blank">בדיקת מצגת</a><a href="/USA_TV/usa2027-presentation-tv.html" target="_blank">בדיקת מצגת TV</a></div>
</div>
<div id="tool-usa-images" class="tool-panel">
<div class="tool-head"><div><h3>🖼️ קובצי מדיה מצגת ארה״ב</h3><p>מדיית USA היא מקור האמת היחיד. כל העלאה נשמרת ב־USA ומסונכרנת אוטומטית, באותם שמות ובאותם נתיבים פנימיים, גם ל־USA_TV.</p></div><button class="back-btn" onclick="hideTools('usa')">חזרה לתת־קטגוריות</button></div>
<div class="good"><b>מקור אמת יחיד:</b> המדיה הפעילה נמצאת תחת <code>C:/TripServer/USA/media/usa-presentation</code>. האדמין משכפל ומאמת אותה אוטומטית תחת <code>C:/TripServer/USA_TV/media/usa-presentation</code>, תוך שמירת נתיבי TV הקיימים.</div>
<div class="sub-grid image-target-choice"><div class="sub-card" onclick="selectUsaImageTarget('phone')"><h3>📱 מסך פלאפון</h3><p>תמונות מותאמות למצגת אייפון/אנדרואיד. יעד: usa2027-presentation.html.</p></div><div class="sub-card" onclick="selectUsaImageTarget('tv')"><h3>📺 מסך טלוויזיה</h3><p>תמונות מותאמות למצגת TV / LG C3. יעד: usa2027-presentation-tv.html.</p></div></div>
<div id="usa-images-phone-section" class="usa-image-target-panel">
<div class="tool-head compact"><div><h3>📱 מדיה לשקפים — מסך פלאפון</h3><p>העלה ZIP מלא או קובץ תמונה/סרטון בודד. הקבצים יישמרו רק בתיקיית הפלאפון.</p></div></div>
<div class="form-grid"><div class="upload-box"><h4>ZIP מדיה מלא — פלאפון</h4><form action="/upload_usa_media_zip" method="post" enctype="multipart/form-data"><input type="hidden" name="target" value="phone"><input type="file" name="file" accept=".zip,application/zip,application/x-zip-compressed"><button>העלה ZIP תמונות/סרטונים לפלאפון</button></form><p>שמות נתמכים: intro, roadtrip-map, day-01 עד day-36, budget, summary ומדיית bonus. ניתן לשלב JPG/PNG/WEBP עם MP4/M4V באותו ZIP.</p></div><div class="upload-box"><h4>בדיקת מצגת פלאפון</h4><p>אחרי העלאה פתח את המצגת הרגילה ובדוק שאין cache ישן.</p><div class="preview-links"><a href="/USA/usa2027-presentation.html?from=admin-phone-images" target="_blank">פתח מצגת פלאפון</a><a href="/admin/status" target="_blank">סטטוס מדיה</a></div></div></div>
<div class="filter-bar"><input id="imageSearchPhone" type="text" placeholder="חיפוש שקף לפלאפון: יום 18, Disney Springs, קרוז..." oninput="filterImages('phone')"><div class="jump-days"><button onclick="jumpImage('phone','intro')">פתיחה</button><button onclick="jumpImage('phone','day-01')">יום 1</button><button onclick="jumpImage('phone','day-18')">יום 18</button><button onclick="jumpImage('phone','day-28')">קרוז</button><button onclick="jumpImage('phone','budget')">תקציב</button><button onclick="jumpImage('phone','summary')">סיום</button></div></div>
<div class="image-upload-grid" id="usaImageGridPhone">
r_   u  
</div>
</div>
<div id="usa-images-tv-section" class="usa-image-target-panel">
<div class="tool-head compact"><div><h3>📺 מדיה לשקפים — מסך טלוויזיה</h3><p>תאימות לאחור בלבד: גם העלאה מכאן תנותב למקור USA ותסונכרן אוטומטית ל־USA_TV. אין יותר מדיית TV עצמאית.</p></div></div>
<div class="form-grid"><div class="upload-box"><h4>ZIP מדיה מלא — טלוויזיה</h4><form action="/upload_usa_media_zip" method="post" enctype="multipart/form-data"><input type="hidden" name="target" value="tv"><input type="file" name="file" accept=".zip,application/zip,application/x-zip-compressed"><button>העלה ZIP תמונות/סרטונים לטלוויזיה</button></form><p>ניתן לכלול תמונות וסרטוני MP4/M4V בשמות השקפים. השמירה מתבצעת ל־C:/TripServer/USA_TV/media/usa-presentation/images.</p></div><div class="upload-box"><h4>בדיקת מצגת TV</h4><p>אחרי העלאה פתח את מצגת הטלוויזיה ובדוק שאין cache ישן.</p><div class="preview-links"><a href="/USA_TV/usa2027-presentation-tv.html?from=admin-tv-images" target="_blank">פתח מצגת TV</a><a href="/admin/status" target="_blank">סטטוס מדיה</a></div></div></div>
<div class="filter-bar"><input id="imageSearchTv" type="text" placeholder="חיפוש שקף לטלוויזיה: יום 18, Disney Springs, קרוז..." oninput="filterImages('tv')"><div class="jump-days"><button onclick="jumpImage('tv','intro')">פתיחה</button><button onclick="jumpImage('tv','day-01')">יום 1</button><button onclick="jumpImage('tv','day-18')">יום 18</button><button onclick="jumpImage('tv','day-28')">קרוז</button><button onclick="jumpImage('tv','budget')">תקציב</button><button onclick="jumpImage('tv','summary')">סיום</button></div></div>
<div class="image-upload-grid" id="usaImageGridTv">
rj   u:  
</div>
</div>
</div>
<div id="tool-usa-music" class="tool-panel">
<div class="tool-head"><div><h3>🎵 מוזיקת מצגת ארה״ב</h3><p>העלאת שיר קיימת + מדידת אורך + סנכרון המקטע הרלוונטי במצגת הרגילה ובמצגת TV.</p></div><button class="back-btn" onclick="hideTools('usa')">חזרה לתת־קטגוריות</button></div>
<div class="good"><b>כלל עבודה פעיל:</b> למצגת ארה״ב יש שני שירים. שיר חלק 1 מסנכרן רק שקפים 1–23. שיר חלק 2 מסנכרן רק שקפים 24–44. לא משנים את המקטע השני כשמעלים את הראשון, ולהפך.</div>
<div class="form-grid"><div class="upload-box safe-zone"><h4>שיר חלק 1 — Road Trip</h4><form action="/upload_usa_music/usa_music" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".mp3,.wav,.m4a,.aac,.flac,.ogg,.opus,.wma,.webm,.mp4,audio/*,video/mp4" required><button>העלה שיר חלק 1 וסנכרן שקפים 1–23</button></form><p>הקובץ נשמר כ־media/usa-presentation/music/usa-roadtrip-theme.mp3 גם ב־USA וגם ב־USA_TV, ואז PART_1_SECONDS מתעדכן בשתי המצגות.</p></div><div class="upload-box safe-zone"><h4>שיר חלק 2 — Orlando / Miami / Cruise</h4><form action="/upload_usa_music/usa_music_part2" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".mp3,.wav,.m4a,.aac,.flac,.ogg,.opus,.wma,.webm,.mp4,audio/*,video/mp4" required><button>העלה שיר חלק 2 וסנכרן שקפים 24–44</button></form><p>הקובץ נשמר כ־media/usa-presentation/music/usa-part2-theme.mp3 גם ב־USA וגם ב־USA_TV, ואז PART_2_SECONDS מתעדכן בשתי המצגות.</p></div></div><div class="preview-links"><a href="/admin/presentation-music" target="_blank">סטטוס סנכרון מוזיקה</a><a href="/USA/usa2027-presentation.html" target="_blank">פתח מצגת ארה״ב</a><a href="/USA_TV/usa2027-presentation-tv.html" target="_blank">פתח מצגת TV</a></div>
</div>
</div>

<div id="screen-budgets" class="screen">
<div class="section-head"><div class="section-title"><h2>💰 תקציבים</h2><p>שתי אפליקציות נפרדות: תקציב חופשה ותקציב חודשי/משפחתי.</p></div><div class="section-actions"><button class="back-btn" onclick="showScreen('home')">⬅ חזרה למסך הראשי</button></div></div>
<div class="form-grid"><div class="upload-box"><h4>💼 אפליקציית ניהול תקציב חופשה</h4><form id="budgetAppInstallForm" action="/upload/Moneyapp" method="post" enctype="multipart/form-data" onsubmit="return submitBudgetAppInstall(event)"><input id="budgetAppInstallFile" type="file" name="file" accept=".html,.htm,text/html" required><button id="budgetAppInstallButton" type="submit">התקן ואמת אפליקציית תקציב חופשה</button></form><div id="budgetAppInstallClientStatus" class="mini-note" style="display:none;margin-top:10px"></div><p>הקובץ ייבדק לפני החלפה ויישמר כ־Moneyapp/index.html. האדמין מאמת חוזה זהות קבוע ויכולות נדרשות, ולכן גרסאות עתידיות תקינות מתקבלות בלי לשנות מספר גרסה קשיח באדמין.</p><div class="preview-links"><a href="/admin/budget-app/status">בדוק גרסה מותקנת</a><a href="/Moneyapp/?fresh=1" target="_blank">פתח תקציב חופשה</a></div></div><div class="upload-box"><h4>🏠 אפליקציית תקציב חודשי / משפחתי</h4><form action="/upload/MoneyHome" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".html,.htm"><button>העלה תקציב חודשי</button></form><p>יישמר כ־MoneyHome/index.html.</p><div class="preview-links"><a href="/MoneyHome/" target="_blank">פתח תקציב חודשי</a></div></div></div>
</div>

<div id="screen-tripform" class="screen">
<div class="section-head"><div class="section-title"><h2>🧾 טופס פתיחת טיול</h2><p>טופס הקליטה ליצירת טיול חדש.</p></div><div class="section-actions"><button class="back-btn" onclick="showScreen('home')">⬅ חזרה למסך הראשי</button><a class="btn-link" href="/TripForm/" target="_blank">פתח טופס</a></div></div>
<div class="upload-box"><h4>העלאת טופס HTML</h4><form action="/upload/TripForm" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".html,.htm"><button>העלה טופס פתיחת טיול</button></form><p>יישמר כ־TripForm/index.html.</p></div>
</div>

<div id="screen-power" class="screen">
<div class="section-head"><div class="section-title"><h2>🖥️ פעולות מחשב</h2><p>פעולות Windows אמיתיות. הן מוגנות באישור כתוב, טיימר וחסימת גישה מחוץ לרשת מקומית.</p></div><div class="section-actions"><button class="back-btn" onclick="showScreen('home')">⬅ חזרה למסך הראשי</button></div></div>
<div class="tool-panel active danger-zone"><div class="warning"><strong>זהירות:</strong> כיבוי או ריסטארט מנתקים את השרת עד שהמחשב עולה מחדש. השתמש בטיימר ולא ב־0 שניות.</div><div class="split-grid"><div class="upload-box"><h4>⏻ כיבוי מחשב</h4><form action="/power/shutdown" method="post" onsubmit="return confirm('לקבוע כיבוי למחשב? אפשר לבטל עם כפתור ביטול לפני שהטיימר נגמר.')"><label class="field-label">טיימר לפני כיבוי</label><select name="delay"><option value="60">עוד דקה</option><option value="300">עוד 5 דקות</option><option value="900">עוד 15 דקות</option><option value="1800">עוד 30 דקות</option></select><label class="field-label">הקלד בדיוק: כיבוי</label><input type="text" name="confirm_text" autocomplete="off" placeholder="כיבוי"><label class="check"><input type="checkbox" name="ack" value="1"> אני מבין שזה יכבה את המחשב</label><button class="danger">קבע כיבוי מחשב</button></form></div><div class="upload-box"><h4>🔄 ריסטארט למחשב</h4><form action="/power/reboot" method="post" onsubmit="return confirm('לקבוע ריסטארט למחשב? אפשר לבטל עם כפתור ביטול לפני שהטיימר נגמר.')"><label class="field-label">טיימר לפני ריסטארט</label><select name="delay"><option value="60">עוד דקה</option><option value="300">עוד 5 דקות</option><option value="900">עוד 15 דקות</option><option value="1800">עוד 30 דקות</option></select><label class="field-label">הקלד בדיוק: הפעלה מחדש</label><input type="text" name="confirm_text" autocomplete="off" placeholder="הפעלה מחדש"><label class="check"><input type="checkbox" name="ack" value="1"> אני מבין שזה יפעיל את המחשב מחדש</label><button class="orange">קבע ריסטארט למחשב</button></form></div></div><form action="/power/cancel" method="post" onsubmit="return confirm('לבטל כיבוי/ריסטארט מתוזמן של Windows?')"><button class="cancel">בטל כיבוי/ריסטארט מתוזמן</button></form><p class="note">פעולות נרשמות ללוג C:\TripServer\admin_restart.log.</p></div>
</div>

<div id="screen-admin-tools" class="screen"><div class="good"><b>חדש:</b> לעדכוני מערכת מרובי קבצים השתמש ב־<a href="/admin/update-package">מתקין ZIP גורף</a>. העלאת admin ישירה נשארה למסלול חירום/תחזוקה בלבד.</div>
<div class="section-head"><div class="section-title"><h2>⚙️ ניהול אפליקציית האדמין</h2><p>כאן מעדכנים את הקובץ שמפעיל את הפאנל עצמו. נתמך קובץ Python ישיר, ומגרסה זו גם ZIP עדכון מבוקר.</p></div><div class="section-actions"><button class="back-btn" onclick="showScreen('home')">⬅ חזרה למסך הראשי</button><a class="btn-link" href="/admin/status">סטטוס</a><a class="btn-link" href="/admin/health">בדיקת מערכת</a><a class="btn-link" href="/admin/self-test">בדיקה עצמית מלאה</a><a class="btn-link" href="/admin/logs">לוגים</a></div></div>
<div class="tool-panel active"><div class="warning"><strong>פעולה רגישה:</strong> עדכון admin_server.py מחליף את המנוע שמריץ את הפאנל. הצלחה נקבעת רק לאחר שהגרסה החדשה עלתה בפועל ואומתו Runtime, קובץ הדיסק ו־SHA זהה.</div><div class="good"><b>מנגנון עדכון בטוח:</b> העלאה → בדיקת Python וסימני TripServer → גיבוי → שליחה ל־Control Server → עצירת האדמין בלבד → החלפה → הפעלת האדמין החדש → אימות Runtime ו־SHA. כאשר Control Server v93 פעיל, כשל באימות מחזיר אוטומטית את הגיבוי ומאמת גם את השחזור. עדכון אדמין רגיל אינו מתזמן ריסטארט מלא של Windows.</div><div class="form-grid"><div class="upload-box"><h4>העלאת admin חדש</h4><form action="/upload_admin_server" method="post" enctype="multipart/form-data" onsubmit="return confirm('להעלות admin_server.py חדש? האדמין יגובה, יוחלף ויאומת על ידי שרת הבקרה. הצלחה תוצג רק לאחר אימות Runtime ו־SHA.')"><input type="file" name="file" accept=".py,.zip,text/x-python,text/plain,application/zip"><button class="orange">העלה admin חדש / ZIP עדכון מבוקר</button></form><p>ניתן להעלות קובץ Python ישיר או ZIP מבוקר הכולל admin_server.py בשורש החבילה. ZIP אינו מריץ סקריפטים חופשיים. עדכון רגיל מפעיל מחדש את האדמין בלבד — לא את מחשב Windows.</p></div><div class="upload-box"><h4>פעולות תחזוקה</h4><form action="/restart_admin_server" method="post" onsubmit="return confirm('זו בדיקת אתחול מתקדמת. להפעיל מחדש את הפאנל עכשיו?')"><button class="orange">בדיקת אתחול פאנל — מתקדם</button></form><form action="/restore_admin_server_backup" method="post" onsubmit="return confirm('לשחזר את הגיבוי האחרון של admin_server.py?')"><button class="danger">שחזר גיבוי אחרון</button></form><div class="preview-links"><a href="/admin/self-test">🧪 הרץ בדיקה עצמית מלאה</a><a href="/admin/logs">📜 צפה בלוגים</a><a href="/admin/control">🛰️ שרת בקרה</a></div><p><b>הערה:</b> בדיקת אתחול מיועדת רק לבדיקה יזומה או אחרי עדכון/שחזור אדמין.<br>גיבויים: C:\TripServer\backups\admin_server</p></div></div></div>
</div>

<div class="mobile-footer"><button onclick="showScreen('home')">🏠 חזרה למסך הראשי</button></div>
</div>
<script>
function showScreen(name){
  document.querySelectorAll('.screen').forEach(s=>s.classList.remove('active'));
  const el=document.getElementById('screen-'+name);
  if(el){el.classList.add('active'); location.hash=name==='home'?'':name; window.scrollTo({top:0,behavior:'smooth'});}
}
function hideTools(group){
  document.querySelectorAll('#screen-'+group+' .tool-panel').forEach(t=>t.classList.remove('active'));
  window.scrollTo({top:document.getElementById('screen-'+group).offsetTop-10,behavior:'smooth'});
}
function showTool(group, tool){
  hideTools(group);
  const el=document.getElementById('tool-'+tool);
  if(el){el.classList.add('active'); setTimeout(()=>el.scrollIntoView({behavior:'smooth',block:'start'}),70); location.hash=tool;}
}
function selectUsaImageTarget(target){
  document.querySelectorAll('.usa-image-target-panel').forEach(el=>el.classList.remove('active'));
  const panel=document.getElementById(target==='tv'?'usa-images-tv-section':'usa-images-phone-section');
  if(panel){panel.classList.add('active'); setTimeout(()=>panel.scrollIntoView({behavior:'smooth',block:'start'}),60);}
}
function filterImages(target){
  const isTv=target==='tv';
  const inputId=isTv?'imageSearchTv':'imageSearchPhone';
  const gridId=isTv?'usaImageGridTv':'usaImageGridPhone';
  const q=(document.getElementById(inputId)?.value||'').toLowerCase().trim();
  document.querySelectorAll('#'+gridId+' .image-upload-card').forEach(card=>{card.style.display=!q||card.dataset.search.includes(q)?'block':'none';});
}
function jumpImage(target,key){
  const gridId=target==='tv'?'usaImageGridTv':'usaImageGridPhone';
  const card=document.querySelector('#'+gridId+' input[name="image_key"][value="'+key+'"]')?.closest('.image-upload-card');
  if(card){card.scrollIntoView({behavior:'smooth',block:'center'}); card.querySelector('.image-upload-label').style.borderColor='#fbbf24'; setTimeout(()=>card.querySelector('.image-upload-label').style.borderColor='',1600);}
}
async function submitBudgetAppInstall(event){
  event.preventDefault();
  const form=event.currentTarget;
  const fileInput=document.getElementById('budgetAppInstallFile');
  const button=document.getElementById('budgetAppInstallButton');
  const status=document.getElementById('budgetAppInstallClientStatus');
  if(!fileInput || !fileInput.files || !fileInput.files.length){
    status.style.display='block'; status.textContent='לא נבחר קובץ להתקנה.'; return false;
  }
  button.disabled=true;
  status.style.display='block';
  status.textContent='מעלה את הקובץ לשרת, מתקין ומאמת...';
  try{
    const body=new FormData();
    body.append('file', fileInput.files[0], fileInput.files[0].name);
    const response=await fetch('/upload/Moneyapp?client_ts='+Date.now(), {method:'POST', body, cache:'no-store', credentials:'same-origin', redirect:'follow'});
    const html=await response.text();
    if(!html){ throw new Error('השרת החזיר תשובה ריקה (HTTP '+response.status+').'); }
    document.open(); document.write(html); document.close();
  }catch(error){
    status.textContent='ההעלאה לא הגיעה למסך תוצאה: '+(error && error.message ? error.message : String(error));
    button.disabled=false;
  }
  return false;
}
window.addEventListener('load',()=>{const h=(location.hash||'').replace('#',''); if(['trips','japan','usa','budgets','tripform','power','admin-tools'].includes(h)) showScreen(h); if(h.startsWith('usa-')){showScreen('usa'); setTimeout(()=>showTool('usa',h),80);} if(h.startsWith('japan-')){showScreen('japan'); setTimeout(()=>showTool('japan',h),80);}});
</script>
</body>
</html>
)r   r
  r  r   r   adminr
    si    %J "#K%$J]'KBD $G,EB-D0EJT $D)UJ*T^-Uh hr   c                 l    R \         P                  ! V 4       R\         P                  ! \        4       R2# )z-
    <form action="/probe_presentation_music/z\" method="post" enctype="multipart/form-data">
      <input type="file" name="file" accept="u   " required>
      <button>בדוק אורך בלבד</button>
    </form>
    <span>בדיקה זמנית בלבד: הקובץ נמחק בסיום, אין שמירה ואין שינוי למצגת.</span>
    )r   r   MEDIA_AUDIO_ACCEPT)r  s   &r   render_probe_formr
  
  s<    --5__X-F,G H..6oo>P.Q-R S r   c                     . p \         P                  4        EF  w  rR P                  R VP                  R4      ;'       g    .  4       4      pV P	                  R\
        P                  ! VP                  RR4      4       R\
        P                  ! V4       R\
        P                  ! VP                  RR4      4       R	\
        P                  ! VP                  R
R4      4       RV R	\
        P                  ! VP                  RR4      4       R\        V4       R24       EK  	  \        4       ;'       g    Rp\        4       '       d   RMRpRV R\
        P                  ! V4       R\        4        RRP                  V 4       R2	# )r2  c              3   `   "   T F$  p\         P                  ! \        V4      4      x  K&  	  R # 5ir   r
  r  s   & r   r   2render_presentation_music_panel.<locals>.<genexpr>  s"     a@_!hooc!f55@_s   ,.rt   z
        <tr>
          <td><b>r`   r   r}	  z</span></td>
          <td>ru   z</td>
          <td>rs   z </td>
          <td class='ltr'>rv   u   </td>
          <td><span class='badge safe'>העלאה פעילה דרך מסך הטיול</span><br><span>בדיקת אורך זמנית נשארה ככלי עזר בלבד:</span><br>z</td>
        </tr>
        r_	  r  r  u	  
<!DOCTYPE html><html lang="he" dir="rtl"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>סנכרון מוזיקה למצגות</title>
<style>
body{margin:0;background:linear-gradient(180deg,#07111f,#0f172a);color:white;font-family:Arial,'Segoe UI',sans-serif;padding:20px}.wrap{width:min(1100px,94vw);margin:auto}.hero{background:linear-gradient(135deg,#1e3a8a,#0f172a);border:1px solid #334155;border-radius:28px;padding:22px;margin-bottom:16px}h1{margin:0 0 8px;font-size:clamp(28px,5vw,42px)}p{color:#cbd5e1;line-height:1.65}a{display:inline-flex;text-decoration:none;color:white;border:1px solid #334155;background:#172033;border-radius:999px;padding:10px 14px;font-weight:900;margin:6px 0}.note{background:#0b1220;border:1px solid #334155;border-radius:18px;padding:14px;margin:14px 0;color:#dbeafe;line-height:1.7}table{width:100%;border-collapse:collapse;background:#101c31;border:1px solid #334155;border-radius:20px;overflow:hidden}th,td{padding:13px;border-bottom:1px solid #334155;text-align:right;vertical-align:top}th{background:#0b1220;color:#bfdbfe}td span{color:#94a3b8;font-size:12px}.ltr{direction:ltr;text-align:left;word-break:break-word}.badge{display:inline-flex;border-radius:999px;padding:6px 10px;font-weight:900;margin:4px 0}.safe{background:#14532d;color:#bbf7d0;border:1px solid #22c55e}.warn{background:#7c2d12;color:#fed7aa;border:1px solid #f97316}input[type=file]{max-width:260px;color:#dbeafe;margin:8px 0}button{border:0;border-radius:999px;padding:10px 14px;background:#2563eb;color:white;font-weight:900;cursor:pointer}button:hover{filter:brightness(1.1)}@media(max-width:760px){body{padding:14px}table,thead,tbody,tr,td,th{display:block}thead{display:none}tr{border:1px solid #334155;border-radius:16px;margin:12px 0;padding:8px}td,th{border:0}.ltr{direction:ltr;text-align:right}}
</style></head><body><div class="wrap"><div class="hero"><a href="/admin#trips">⬅ חזרה לפאנל</a><h1>🎵 סנכרון מוזיקה למצגות — העלאה קיימת + סנכרון פעיל</h1><p>גרסה זו מתחברת להעלאות השירים הקיימות: יפן מצגת ראשית מודדת את השיר לפני הטמעה ומבקשת אישור אם קצב השקפים יוצא מטווח 5–10 שניות. ארה״ב חלק 1 מסנכרן רק שקפים 1–23, וחלק 2 מסנכרן רק שקפים 24–44. פתיח הטיסה נשמר ונמדד ללא שינוי למצגת הראשית.</p><span class="badge z">ffprobe: uj  </span></div><div class="note"><b>סדר הפיתוח:</b> v34.14 לא מוסיף מנגנון העלאה חדש. הוא משתמש בהעלאות הקיימות ומוסיף עליהן מדידה, מסך אישור לפני הטמעה כשצריך, וסנכרון בפועל רק לאחר בחירת המשתמש. טפסי בדיקת אורך זמניים נשארו כלי עזר בלבד ואינם מחליפים את כפתורי ההעלאה.</div><h2>סטטוס העלאות אחרונות</h2><table><thead><tr><th>שיר</th><th>סטטוס</th><th>זמן עדכון</th><th>פירוט</th></tr></thead><tbody>u+  </tbody></table><h2>כללי סנכרון פעילים ובדיקת אורך זמנית</h2><table><thead><tr><th>שיר / יעד</th><th>תחום סנכרון</th><th>מצגת</th><th>נתיבי מוזיקה</th><th>התנהגות עתידית</th><th>בדיקה זמנית</th></tr></thead><tbody>r  )
r  r  r   r   r  r   r   r
  rO  r  )r  rT  rv  r  rN  ffprobe_badges         r   render_presentation_music_panelr
    s   D288:	++a@Y@_@_]_@_aa //$((72"678xWZG[F\ ]txx345 6txxr:;< =") $txx(9"=>? @u vG  HK  vL  uM M		 		 ; &'::?G577FVMO
 P
]
  O
^
  ^
i
  j
r
  j
y
  j
y
  z
A  j
B  i
C  Cm  nM  nO  mP  P{  |~  |C  |C  DH  |I  {J J	 r   /admin/presentation-musicc                      \        4       # r   )r
  r  r   r   admin_presentation_musicr
  ,  s    *,,r   $/probe_presentation_music/<rule_key>POST)methodsc                    V \         9  d   \        R RRR7      R3# \        P                  P	                  R4      pV'       d   VP
                  R8X  d   \        RRRR7      R	3# \        P                  '       dB   \        P                  \        R-,           8  d"   \        R
R\        \        4       R2RR7      R3# \        P                  P                  \        RR4      p\        P                  ! VRR7       \        VP
                  ;'       g    R4      ;'       g    Rp\        P                  P                  V\        P                   ! R4      V,           4      p VP#                  V4       \%        V4      p\         P	                  V / 4      pVP	                  R4      '       d   RVP	                  RR4       RVP	                  RR4       RVP	                  R4       RVP	                  R4      R RVP	                  R4       R 2p\        R!R"RVR#7       \        P                  P'                  V4      '       d   \        P(                  ! V4       # # RVP	                  RR4       R$VP	                  R4      ;'       g    R% R&VP	                  R'4      ;'       g    VP	                  R(4      ;'       g    R) R*2p\        R+R,RVR#7      R	3 \        P                  P'                  V4      '       d   \        P(                  ! V4       # #   \*         d     # i ; i  \*         d     # i ; i   \        P                  P'                  T4      '       d   \        P(                  ! T4       i i   \*         d     i i ; i; i).u   סוג שיר לא מוכרuA   לא נמצא כלל סנכרון מתאים לשיר שנבחר.Fr1  rM  r  r      לא נבחר קובץu3   בחר קובץ אודיו לבדיקה זמנית.rD  %   קובץ מוזיקה גדול מדי/   קובץ האודיו גדול מהמגבלה: r(    r   music_probeTr   r  zprobe_%Y%m%d_%H%M%S_r  r}  r`   u#   
תחום סנכרון עתידי: ru   u   
משך שזוהה: rx  r7  rw  r  u    שניות)
ffprobe: rN  uk   

בדיקה זמנית בלבד: הקובץ לא נשמר קבוע, ולא בוצע שינוי במצגת.u'   בדיקת אורך שיר הצליחהub   ffprobe זיהה את משך השיר. לא בוצע סנכרון ולא נשמר שיר קבוע.r=  z

ffprobe: r_	  u   
שגיאה: rp  r.  r;  u=   

לא בוצע סנכרון ולא נשמר שיר קבוע.u%   בדיקת אורך שיר נכשלהu;   לא ניתן לזהות את משך השיר עם ffprobe.r  )r  r3  r   r  r   r5  content_lengthr  r  r   r   r   r  r   r
   r   r   r  r  r   r  r   )r  r  	probe_dirr  r  r9  rv  r>  s   &       r   probe_presentation_musicr
  1  s|   44 !>  AD  IN  O  QT  T  	T==V$D4==B& !9;puz{  ~A  A  	A'"8"8;QT_;_"_ !HL{  }I  J`  }a  |b  bc  Kd  in  o  qt  t  	tXum<IKK	D) 8 89DDWIWW\\)T]]3I%JY%VWF		&-f5,002>::d#DHHWR$8#9 :559XXgb5I4J K&&,jj1C&D%ER

SeHfgjGk l"JJy12 3||  %%N  Qu  z~  HO  P	ww~~f%%		&! &   45 6

9-@@A B!::g.VV&**U2CVVW XJJ 	 !!H  KH  MR  \c  d  fi  i	ww~~f%%		&! & 		y 			ww~~f%%		&! & 		sm   B7L) ;L+L) >L) L) 3L) 
;LLLL&%L&)M9+;M(&M9(M63M95M66M9c                     V'       d   R pMVR8X  d   RpMRpT P                  RTRTRTRTR\        T;'       g    R	4      /4       R
# )passr  r  failcategoryr   r  severityr>  r   N)r  r   )r  r
  r   r  r>  r
  r  s   &&&&&& r   add_self_test_resultr
  Z  sQ    		Y	NNH&H3w}}"% r   c                    W8X  d   R # T ;'       g    RP                  R4      P                  R4       Uu. uF  q"'       g   K  VNK  	  ppT;'       g    RP                  R4      P                  R4       Uu. uF  q"'       g   K  VNK  	  pp\        V4      \        V4      8w  d   R# \        W44       FI  w  rVVP	                  R4      '       d%   VP                  R4      '       d   V'       g    R# K@  WV8w  g   KH   R# 	  R # u upi u upi )Tr   r&  F<r
  )r   r+  r,  r	  r*  r  )rv  rd  rE  
rule_partsaction_parts	rule_partaction_parts   &&     r   route_rule_matches_actionr
  j  s    ~$(JJB#5#5c#:#@#@#EN#E4$$#EJN&,ll%9%9#%>%D%DS%IR%ITTDD%ILR
:#l++"%j"?	$$););C)@)@# #@  ORs   	DD7	DDc           	      h    \        \        \        P                  ! R T ;'       g    R4      4      4      # )z'<form[^>]+action=[\"\']([^\"\']+)[\"\']r   )r  r  r  rq  )r  s   &r   collect_admin_form_actionsr
  |  s%    #bjj!KY__Z\]^__r   c                     \         P                  ! R T ;'       g    R4      p\        4       . r2V F1  pWB9   d   WC9  d   VP                  V4       VP	                  V4       K3  	  V# )z\bid=[\"\']([^\"\']+)[\"\']r   )r  rq  r  r  rN  )r  r	  rW  r
  r  s   &    r   collect_duplicate_idsr
    sW    
**3Y__"
ECub*<D2d#  r   c            
      J   \         P                  ! \        R R7       \         P                  P	                  \        R\         P
                  ! 4        R\        \        P                  ! 4       4       R24      p  \        V RRR7      ;_uu_ 4       pVP                  R4       R	R	R	4       \        V R
RR7      ;_uu_ 4       pVP                  4       pR	R	R	4       XR8H  V 3 \         P                  P                  V 4      '       d   \         P                  ! V 4       # #   + '       g   i     L; i  + '       g   i     Lg; i  \         d     # i ; i   \         P                  P                  T 4      '       d   \         P                  ! T 4       i i   \         d     i i ; i; i)Tr   
self_test_r  r   r   r   r   zTripServer self testNr   )r   r   r  r   r   r  r   r   r   r  r9  r   r  r   )	test_pathr   r   s      r   check_temp_write_permissionr    s*   KK$t41Z		}AcRVR[R[R]N^M__c3deI)S733rHH+, 4)S733r779D 4--y8	ww~~i((		)$ ) 4333  			ww~~i((		)$ ) 		sr   8E D E >D.E ;ED+	&E .D>	9E EEF";FF"FF"FF"c                ,  a? \         P                   ! 4       p. p \        P                  ! \        RR7       \	        VRRR\        4        \        P                  ! \        P                  RRR	\        .RR^(\        4       R
7      p\	        TRRVP                  ^ 8H  VP                  ;'       g    VP                  ;'       g    RERR 4        \        \        4      w  rV\	        VRR\!        V4      V4        \#        R4      w  rx\%        4       p	\	        TRR\!        V	4      V	'       g   TMR4        \'        4       p
\)        V
P+                  RR4      4      pRR0pW9  pV
P+                  RR4      ;'       g    Rp\	        VRRVRV RV 24       \-        \.        P1                  4       4       F6  w  pp\	        VRRV R 2\2        P4                  P7                  V4      V4       K8  	   \9        4       w  pp\	        VRR!VV4       R"\:        3R#\<        33 FK  w  pp \2        P>                  ! VRR$7       \	        VRV\2        P4                  P7                  V4      V4       KM  	   \-        R% \@        PB                  PE                  4        4       4      p. R&NR'NR(NR)NR*NR+NR,NR-NR.NR/NR0NR1NR2NR3NR4NR5NR6NR7NR8NR9NR:NR;NR<NR=NR>NR?NR@NRANRBNRCNRDNRENRFNRGNRHNRINRJNRKNRLNRMNRNNRONRPNRQNpV Uu. uF  pVV9  g   K  VNK  	  pp\	        TRRRSV'       * V'       d   RTPG                  V4      M\I        V4       RU24        \K        4       p\M        V4      p. pV FV  o?\N        ;QJ d    V?3RW lV 4       F  '       g   K   RM	  RM! V?3RW lV 4       4      '       d   KE  VPQ                  S?4       KX  	  \	        TRRRXV'       * V'       d   RTPG                  V4      M\I        V4       RY24       \S        V4      p\	        TRRRZV'       * V'       d   RTPG                  V4      MR4       \	        VRRR[R*V9   R\4       \	        TRRR]R^V9   ;'       d    R_V9   ;'       d    R`V9   Ra4       \	        TRRRbRcV9  ;'       d     RdV9  ;'       d    ReV9   ;'       d    RfV9   Rg4       \	        TRRRh\U        \W        4       P+                  Ri4      4      ;'       d#    \U        \W        4       P+                  Rj4      4      Rk4       \	        TRRRlRmV9   ;'       d    RnV9   ;'       d    RoV9   Rp4       \	        TRRq\Y        Rr4      Rs8H  ;'       d<    \Z        P+                  RrR.4      ^ ,          Rs8H  ;'       d    RoV9   ;'       d    RtV9   Ru4       \	        TRRRvRwV9   ;'       d     RxV9   ;'       d    RyV9   ;'       d    RzV9   R{4       \	        TR|R}R~\W        4       9   ;'       d    \I        \\        4      ^8H  R4       \	        TR|R\U        \W        4       P+                  R4      4      ;'       d    R\^        P`                  Pb                  9   R4       \	        VRRRR-V9   R4       \	        TRRRR1V9   ;'       d    RV9   R4       \	        TRRRRV9   ;'       d-    RV9   ;'       d     RV9   ;'       d    RV9   ;'       g    RV9   R4       \	        TRRRRV9   ;'       d     RV9   ;'       g    RV9   ;'       g    RV9   R4        \e        4       p\	        VRRRRV9   R4        \g        4       p\	        VRRRRV9   R4        \i        4       p\	        VRRRRV9   R4        \k        4       p\	        TRRRV9   ;'       d    R2V9   ;'       d    R5V9   R4       \m        4       p\	        TRR\!        VP+                  R4      4      VP+                  R4      '       g   RMRVP+                  RR4       2RR7       \o        4       p \	        TRRRV 9   ;'       d    RV 9   R4       \	        TRR\q        R4      ;'       d    \q        R4      '       * R4        \s        4       p!\	        TRR\!        V!P+                  R4      4      V!P+                  R4      '       g   RMR4       \	        TRR\!        V!P+                  R4      4      V!P+                  R4      ;'       g    R4       \	        TRR\!        V!P+                  R4      4      V!P+                  R4      ;'       g    R4       \	        VRR\t        Pw                  R4      \t        4       \y        \z        \|        4      ;'       d0    0 ERmP                  \        \z        P                  4       4      4      p"\	        VRRV"R4       V '       EdY    ^ RIBHCp# \2        P4                  PG                  \        R4      p$\2        P4                  PG                  \        R4      p%V#P                  RERER4      P                  V$R4       \        V$V%R4      p&\2        P4                  P                  V%4      ;'       d    \        V%4      p\	        VRRV\        V&4      4       \2        P4                  PG                  \        R4      \2        P4                  PG                  \        R4      3 FA  p' \2        P4                  P                  V'4      '       d   \2        P                  ! V'4       KA  KC  	   \I        \        4      p(\         U)u0 uF  p)V)^ ,          kK  	  p*p)\	        VRRV(^,8H  \)        V(4      4       \	        VRRV*\        \        4      8H  R\I        V*4       R\I        \        4       24       RPG                  R \         4       4      p+ER U,u. uF  p,V,V+9   g   K  V,NK  	  p-p,\	        TRRV-'       * V-'       d   RTPG                  V-4      MR4       . EROp.V. U,u. uF  p,V,V+9  g   K  V,NK  	  p/p,\	        TRRV/'       * V/'       d   RTPG                  V/4      MR4       \	        TRR\        RR08H  ;'       d    RGX9   ;'       d    RV9   \)        \-        \        4      4      4       \        ^ ^RR4      \        ^^RR4      3p0\        ERV0RRRR/4      p1\        V1P                  ^ ,          P                  R,
          4      R8  ;'       dX    \        V1P                  ^,          P                  R,
          4      R8  ;'       d     \        V1P                  R,
          4      R8  p2\	        VRRV2RV1P                  R RV1P                  ^,          P                  R 24        \        ER\        ^ ^RR4      3RRRR/4       Rp3\	        TRRT3V3'       d   RMR4        \        4       p4V4P+                  R4      '       g#   \	        VRRRV4P+                  RR4      RR7       M\	        VRRRV4P+                  RR4      4       \	        VRRV4P+                  R^ 4      ^ 8  V4P+                  R^ 4       R24       \	        VRRV4P+                  R^ 4      ^ 8H  RV4P+                  R^ 4       24       \	        VRRR\e        4       9   R4         \.        P1                  4        UUu/ uF'  w  ppV\2        P4                  PG                  VR4      bK)  	  p5ppV5P1                  4        UU%u. uF4  w  pp%V%P                  4       Pw                  R4      '       d   K-  V RV% 2NK6  	  p6pp%\	        TRRV6'       * V6'       d   RTPG                  V64      MR4        . EROp7. EROp8\        ;QJ d    R V7 4       F  '       d   K   RM	  RM! R V7 4       4      p9\        ;QJ d    R V8 4       F  '       d   K   RM	  RM! R V8 4       4      p:\	        TRRT9;'       d    T:V9'       d   V:'       d   RMRV9 RV: 24        \	        TRR\q        R4      ;'       d3    \q        R4      ;'       d     \q        R4      ;'       d    \q        ER 4      R4       \	        VRER\q        R4      '       * R4       \	        TRER\        ER4      \        8H  ;'       d    \        ER4      \        8H  \         ER\         ER24       \        \         P                   ! 4       V,
          ^4      p;\        ER V 4       4      p<\        ER	 V 4       4      p=\        ER
 V 4       4      p>ERV>^ 8H  ERV<ERV=ERV>ER\I        V4      ERV;ER\        ER\        ER\         P                  ! ER4      ERV/
#   \
         d$   p\	        TRRR\        T4      4        Rp?EL$Rp?ii ; i  \
         d&   p\	        TRRR\        T4      RR7        Rp?ELRp?ii ; i  \
         d$   p\	        TRRR\        T4      4        Rp?ELRp?ii ; i  \
         d$   p\	        TRRR\        T4      4        Rp?ELRp?ii ; i  \
         d$   p\	        TRRR\        T4      4        Rp?ELRp?ii ; i  \
         d$   p\	        TRR!R\        T4      4        Rp?ELaRp?ii ; i  \
         d%   p\	        TRTR\        T4      4        Rp?EK  Rp?ii ; iu upi   \
         d&   p. p\	        TRRRVR\        T4      4        Rp?ELRp?ii ; i  \
         d$   p\	        TRRRR\        T4      4        Rp?ELRp?ii ; i  \
         d$   p\	        TRRRR\        T4      4        Rp?EL%Rp?ii ; i  \
         d$   p\	        TRRRR\        T4      4        Rp?EL9Rp?ii ; i  \
         d$   p\	        TRRRR\        T4      4        Rp?ELMRp?ii ; i  \
         d$   p\	        TRRR\        T4      4        Rp?ELRp?ii ; i  \
         d$   p\	        TRRR\        T4      4        Rp?E
LuRp?ii ; i  \
         d&   p\	        TRRR\        T4      RR7        Rp?E	LRp?ii ; i  \
         d     E	K  i ; i  \2        P4                  PG                  \        R4      \2        P4                  PG                  \        R4      3 FS  p' \2        P4                  P                  T'4      '       d   \2        P                  ! T'4       KA  KC    \
         d     KQ  i ; i	  i ; iu up)i u up,i u up,i   \         d    Rp3 ELi ; i  \
         d$   p\	        TRRR\        T4      4        Rp?ELRp?ii ; i  \
         d$   p\	        TRRR\        T4      4        Rp?ELRp?ii ; iu uppi u up%pi   \
         d$   p\	        TRRR\        T4      4        Rp?ELeRp?ii ; i  \
         d$   p\	        TRRR\        T4      4        Rp?ELRp?ii ; i  \
         d%   p\	        TRERR\        T4      4        Rp?ELgRp?ii ; i(   a<  Non-destructive self-test for the admin panel.

It checks code validity, routes/forms, folders, media engine availability,
presentation image mappings, power guards, Control Server and Fail Safe status.
It intentionally does not upload real files, restart the server, shut down Windows,
or modify active trip files.
Tr  u   קודu>   קומפילציית Python לקובץ האדמין הפעילFNz-Werrorr;	  r  rX  rY  r[  r]  u   קומפילציה עם Werrorr  r  r
  uF   בדיקת קובץ אדמין מול מנגנון upload_admin_serverz	self-test   עדכון אדמיןu4   שרת בקרה חיצוני Control Server פעיל   פורט 8010 עונהu   בדיקת Control Serverr   r   r   r   r   r   u*   סטטוס Fail Safe ניתן לקריאהzstate=rR  u   נתיביםu   תיקיית u    קיימתu:   כתיבה/מחיקה בתיקיית tmp של האדמיןu$   תיקיית גיבויי אדמיןu&   תיקיית גיבויי העלאותr   c              3   L   "   T F  p\        VP                  4      x  K  	  R # 5ir   )r   rv  )r   rv  s   & r   r   &run_self_test_suite.<locals>.<genexpr>  s     K2J$s499~~2Js   "$r&  r0  /admin/status/admin/health/admin/self-test/admin/self-test.jsonr
  /admin/logs/admin/logs.jsonr
  ./confirm_japan_experience_music_upload/<token>/admin/camera/camera/stream/camera/snapshot.jpg/camera/prepare-video/camera/reset/camera/stop/camera/status.json/camera/audio-stream/camera/audio-test.json/camera/audio-stop/camera/record/start/camera/record/stop/camera/recordings/healthrJ  /upload_admin_server/restart_admin_server/restore_admin_server_backup/upload/<folder>'/upload_presentation/<presentation_key>+/upload_usa_presentation/<presentation_key>/upload_usa_image/upload_usa_media/upload_usa_images_zip/upload_usa_media_zip"/upload_usa_extra_html/<extra_key>/upload_japan_music/<music_key>/upload_japan_images_zip/upload_trip_package/<trip>/admin/netlify/download/<trip>/upload_usa_music/<music_key>/power/<action>/power/cancelu   ממשקu)   כל routes המרכזיים קיימיםro  z routesu&   קריאת routes מהאפליקציהc              3   <   <"   T F  p\        VS4      x  K  	  R # 5ir   )r
  )r   rv  rd  s   & r   r   r	    s     Q540v>>5s   u:   כל טפסי הפאנל מחוברים ל־route קייםu    טפסיםu-   אין IDs כפולים במסך האדמיןu4   כפתור בדיקה עצמית קיים בפאנלu   נבדק href=/admin/self-testu6   כפתור טיולים מרכזי קיים בפאנלzshowScreen('trips')u   יפן קיץ 26u   ארצות הברית קיץ 27uo   המסך הראשי מוביל למסך טיולים ולא מציג יעדים כקטגוריות ראשיותuV   מרכז בקרת האיכות נגיש בלי כרטיס כפול במסך הראשיz+class="main-card presentation-control-card"zTrip Platform QAzhref="/admin/platform"u   מרכז בקרת איכותuh   נבדקו הסרת הכרטיס הכפול והגישה הקבועה מבר הפעולות העליוןuE   מרכז בקרת המצגות מחובר למסלולי HTML ו-JSONr2
  r9
  z7/admin/presentations + /admin/presentations/report.jsonuC   קישורי פתיחה מהירה לקבצי טיול קיימיםu   פתח קובץ טיול יפןu#   פתח קובץ טיול ארה״ב/USA_TV/usa2027-tv.htmluG   נבדקו קישורי פתיחה מהירה ל־JAPAN, USA ו־USA_TVu3   USA_TV נשמר ונפתח באותו שם קבועr)   r.   z"/upload_usa_extra_html/usa_trip_tvz9save=USA_TV/usa2027-tv.html; open=/USA_TV/usa2027-tv.htmlu5   מסך Netlify קיים ומחובר להורדת ZIPzshowScreen('netlify')/admin/netlify/builderz/admin/netlify/download/USAz/admin/netlify/download/JAPANu>   נבדקו כרטיס Netlify ושתי פעולות הורדהu   סנכרוןu8   מטריצת ששת היעדים רשומה באדמיןUSA_RELEASE_MATRIX_V57u4   נדרשים בדיוק שישה יעדי ארה״בu@   שער השוואת מצגות עם/ללא סכומים פעילr  u]   Netlify נחסם אם קיים שינוי שאינו שקף התקציב או נתיב Deployu)   כפתור לוגים קיים בפאנלu   נבדק href=/admin/logsu0   כפתור מצלמת חדר קיים בפאנלu   מצלמת חדרu   נבדק href=/admin/camerau_   מסך מוזיקה מציג העלאה קיימת, בדיקה ואישור לפני הטמעהz*/upload_japan_music/japan_experience_musicz/upload_usa_music/usa_musicz!/upload_usa_music/usa_music_part2u'   בדוק שיר והמשך להטמעהu   העלה שיר וסנכרןu   כפתורי ההעלאה הם הפעולה הראשית; מצגת יפן כוללת בדיקת טווח 5–10 שניות לפני הטמעה; probe נשאר כלי עזר בלבדuF   כפתור אתחול מתקדם מוצג ככלי בדיקה בלבדu-   בדיקת אתחול פאנל — מתקדםu+   מיועד לבדיקה יזומה בלבדu)   מיועדת רק לבדיקה יזומהu   בדיקה יזומהu   נבדק ניסוח UXu   ניתוח HTML של הפאנלu,   מסך סטטוס נבנה ללא שגיאהu"   סטטוס קבצים פעיליםu(   מסך Health נבנה ללא שגיאהu   בדיקת מערכתu,   מסך לוגים נבנה ללא שגיאהu   מרכז לוגיםrQ  u3   מסך מצלמת חדר נבנה ללא שגיאהu'   OpenCV זמין להפעלת מצלמהr  uG   התקנה אוטומטית ברקע פעילה; בדוק /camera/setupzOpenCV r  u9   מסך סטטוס רכיבי מצלמה נבנה תקיןu   התקנה אוטומטיתzpip installu<   מצלמה מוגנת לרשת פרטית/Tailscale בלבדz
100.64.1.2z8.8.8.8u)   Tailscale מותר, ציבורי חסוםu%   בדיקת מסך/מנוע מצלמה   מדיהu2   Pillow זמין להמרת/דחיסת תמונותr  z"py -m pip install --upgrade Pillowu-   FFmpeg זמין להמרת אודיו ל־MP3rC  r  u*   שים FFmpeg ב־C:\ffmpeg\bin\ffmpeg.exeu1   ffprobe זמין לבדיקת אורך שיריםrN  r  u,   שים ffprobe ב־C:\ffmpeg\bin\ffprobe.exeu8   קובץ סטטוס העלאות מוזיקה מוגדרr   ui   כללי סנכרון מוזיקה למצגות קיימים עם סטטוס אורך לאחר העלאהuX   v34.25 מודד משך ומסנכרן את מצגת האייפון ואת מצגת ה-TVu   בדיקת מנוע מדיה)r  zself_test_image.pngzself_test_image.jpgr  PNGzself_test.pngu1   סימולציית PNG → JPG בתיקיית tmpu
   ארה״בu?   44 כרטיסיות מדיה למצגת ארה״ב קיימותuE   כרטיסיות ארה״ב תואמות למפת שמות המדיהzui=z keys=ru  c              3   D   "   T F  pR P                  V4      x  K  	  R# 5i)r   Nr   r	  s   & r   r   r	  O  s     J7ItCHHTNN7I    uP   אין תיאורים שגויים ידועים במדיה למצגת ארה״בu7   תיאורי קרוז/אורלנדו מסונכרניםuF   האדמין מקבל תמונה או MP4/M4V בכל כרטיס שקףrA   rB   r  g      >@u   חלק 1g      8@u   חלק 2r  r  r	  g      .@rz   gMbP?g      @g      K@u;   סימולציית תזמון סרטונים ותמונותztotal=r  z; image=u   חלקg      0@u:   סרטונים ארוכים ממשך השיר נחסמיםu   לא נחסםu&   בדיקת כרטיסיות ארה״בr  u   יפןu'   מצגת יפן קיימת לניתוחr'  u6   מצגת יפן משתמשת בתמונות בפועלr  u    תמונותuA   אין תמונות חיצוניות חסרות למצגת יפןr  u   חסרות: ub   ספירת תמונות יפן מוצגת כספירת שימוש ולא כספירת תיקייהu$   תמונות בשימוש בפועלu   ניתוח מצגת יפןr-   re  u   העלאותu<   קבצים ראשיים נשמרים תמיד כ־index.htmlu'   מפת יעדי העלאה ראשייםc              3   <   "   T F  p\        V4      R Jx  K  	  R # 5ir   r1  r  s   & r   r   r	  z  s     M}!&q)5}r  c              3   <   "   T F  p\        V4      R J x  K  	  R # 5ir   r;  r  s   & r   r   r	  {  s     M_(+t3_r  u/   הגנת ZIP Slip / נתיבים מסוכניםzsafe=z unsafe=u
   אבטחהu)   זיהוי IP מקומי/בית/Tailscale	127.0.0.1z192.168.1.10zfd7a:115c:a1e0::1u<   כתובת ציבורית נחסמת לפעולות מחשבu8   טווח טיימר כיבוי/ריסטארט מוגבלr   999999rs  r  u-   בדיקות אבטחת פעולות מחשבc              3   D   "   T F  qR ,          R8X  g   K  ^x  K  	  R# 5ir  r
  Nr  r	  s   & r   r   r	         Cwtx.F*Bw    
 c              3   D   "   T F  qR ,          R8X  g   K  ^x  K  	  R# 5ir  r  Nr  r	  s   & r   r   r	    rA  rB  c              3   D   "   T F  qR ,          R8X  g   K  ^x  K  	  R# 5ir  r
  Nr  r	  s   & r   r   r	    rA  rB  r  passedr  rb  rj  r  r  r  r  r   r  r  >   rx   rW   ro   rl   )r  i  )r  r     r  )Nassauu   נסאוu   פארק דיסני)zDisney Springsu   קרוז – יום ים 1u   קרוז – יום ים 2u   קרוז – יום ים 3zSt. Maartenz
St. ThomasCocoCay)r  r  r  r/  r	  r  )r  r  r  )r-   zmedia/images/a.jpgrO  )z	../x.htmlza/../../x.htmlz__MACOSX/a.jpg)br   r  rN  r  r
  r   r~  rS  r^  r   r   rV  r{  rz  ry  r#  ru  bootstrap_control_serverrO  r   r   r   r  r  r  r   r   r  r  r=  r  r   appurl_map
iter_rulesr   r,  r
  r
  r  r  r
  callableglobalsr  r  r4  r  __code__co_namesr  render_admin_healthr  r	  r  rg	  r  r  r  r  r   r  r   issubsetr  r
  r  r  r  r  r  r  r   r:  r@  r  r
  r/  r  r  rd  r  r  r  rz  rQ  r[  r  r   r	  r  r  r  rf  r  r   ADMIN_STARTED_ATr   )@include_media_conversionru	  r  r  r  r.  r  bootstrap_okbootstrap_infoalivefsr   
bad_statesr  r  rT  r  r   r`   rulesexpected_routesroutemissing_routes
admin_htmlr
  missing_actionsdup_idsstatus_htmlhealth_html	logs_htmlcamera_html
cam_engine
setup_htmlmedia_statusrules_okr  r  r  rS   r/  	usa_countr  usa_keysui_blobwordr  r  missing_words
demo_partsdemodemo_okoverflow_rejectedr  main_targetsbad_targetssafe_examplesunsafe_examplesok_safe	ok_unsafeelapsedrG  warnedrb  rd  s@   &                                                              @r   r  r    s}     iikGGD,d;Wh0prv  yJ  	Kx~~s~~y$N_`qu  }A  KM  ]t  ]v  wWh0PRVRaRaefRfimitit  jL  jLx|  yD  yD  jL  jL  HL  NS  NT  iU  	VL23DEWh0xz~  @E  {F  HL  	Mn'?'L$')W&=?uw{  }B  xC  [`  ES  f~  	')BFF7I./"O4
$ffY#++tW&=?kmosyz  zA  AD  EH  DI  rJ  	K #7==?3[WncU+6VXZX_X_XeXefqXrt  	A 4F.0DWn6rtvx|}
 
01AB	13DEt	SKKt, .%tATVZ[nK#++2H2H2JKK


*
,;
=O
Qh
 kF
 HU
 Wi
 kQ
 SC
 ET
 Vf
 h~
 @W
 Yh
 jx
 zO
 Qg
 iB
 DX
 Zp
 rG
 I]

#
%;
=T
Vt
 
 !J
 Ly
  	
 "5	
 7O	
 Qh	
 jN	

 .

 0J

 Li
 -
 /N
 Pa
 cr
 .=S_EU@R%%_SWj2]cq_q  Q_sws|s|  ~L  tM  hk  lq  hr  gs  sz  e{  	|
gW
,Z8F3Q5Q333Q5QQQ&&v.  	Wj2n  uD  qD  ds  FJ  FO  FO  P_  F`  |  @G  |H  {I  IT  yU  	V'
3Wj2agncn  GNptpypy  {B  qC  TX  	YWj2hj|  AK  kK  Mm  	nWj2j  mB  FP  mP  mi  mi  Ug  ku  Uu  mi  mi  z[  _i  zi  k\  	]Wj  3K  Mz  BL  ML  MQ  MQ  Qc  ku  Qu  MQ  MQ  zR  V`  z`  MQ  MQ  eC  GQ  eQ  S}  	~Wj2y  |D  EL  EN  ER  ER  Sv  Ew  |x  |~  |~  }E  FM  FO  FS  FS  T|  F}  }~  @y  	zWj2w  z[  _i  zi  zM  zM  nS  Wa  na  zM  zM  f  CM  fM  OX  	YWn6k  nL  MU  nV  Zk  nk  nN  nN  p  pC  pC  DL  OQ  NR  pS  TU  pV  Zk  pk  nN  nN  pI  MW  pW  nN  nN  \@  DN  \N  PK  	LWj2i  lC  GQ  lQ  l^  l^  Vn  r|  V|  l^  l^  A^  bl  Al  l^  l^  qP  T^  q^  ``  	aWn6p  sK  OV  OX  sX  s}  s}  ]`  aw  ]x  |}  ]}  u  	vWn6x  {C  DK  DM  DQ  DQ  Rx  Dy  {z  {Q  {Q  e  i  iH  iH  iQ  iQ  Q  Sr  	sWj2]_lpz_z  }X  	YWj2dfu  zD  gD  gj  gj  I\  `j  Ij  lI  	JWj  3T  VB  FP  VP  Vd  Vd  Ur  v@  U@  Vd  Vd  Eh  lv  Ev  Vd  Vd  |e  is  |s  |c  |c  wU  Yc  wc  f]	  	^	Wj2z  }l  pz  }z  }h  }h  An  r|  A|  @g  @g  Bm  q{  B{  @g  @g  AX  \f  Af  jB  	Ct)+Wj2`  cG  KV  cV  X\  	]p)+Wj2\^u  zE  _E  GK  	Lt%'	Wj2`bw  |E  cE  GK  	L	o)+Wl4ik~  CN  lN  lU  lU  Sc  gr  Sr  lU  lU  wF  JU  wU  W[  	\)+
Wl4]_cdndrdrs{d|_}  Q[  Q_  Q_  `h  Qi  Qi  @I  qx  yC  yG  yG  HX  Y[  y\  x]  o^  ir  	s-/
Wl4o  rO  S]  r]  r}  r}  bo  s}  b}  C  	DWl4r  uN  O[  u\  uI  uI  e~  H  eI  aI  Kv  	w
	d*,Wj2fhlmym}m}  G  nH  iI  wC  wG  wG  HP  wQ  wQ  Ko  W[  	\Wj2acghthxhx  zB  iC  dD  FR  FV  FV  Wd  Fe  FV  FV  iV  	WWj2egklxl|l|  ~G  mH  hI  KW  K[  K[  \j  Kk  K^  K^  o^  	_Wj2l  oT  o]  o]  ^E  oF  Hm  	n;TB  R  R  H^  Hg  Hg  hk  lI  lN  lN  lP  hQ  HRWj  3^  `h  jD  	E
  	!WW\\"68MNFWW\\"68MNFIIfk+=>CCFER0QE'GG,?,GB *6ikm  pB  CH  pI  J ggll#79NOQSQXQXQ]Q]^r  uJ  RK  Lww~~a((		! ) Lp*+	(:;(:DGG(:;Wl4u  xA  EG  xG  IL  MV  IW  	XWl4{  ~F  JM  N\  J]  ~]  ad  eh  iq  er  ds  sy  z}  ~L  zM  yN  _O  	P))J7IJJ&Sg&SdW[_fWfTT&S	gWl  5G  MV  IV  py  X\  Xa  Xa  bk  Xl  C  	D h*2J($d'6I(JWl4m  tA  pA  _l  CG  CL  CL  MZ  C[  rv  	wWl4|  S  X^  `f  Wg  g  k  k  l  CM  lM  k  k  R]  ak  Rk  mp  qw  xL  qM  mN  	O&q!T:>@PQRTUW[]g@hi
 !?cSWY\^bMcddll1o66=>F  j  j3t||\]OoOoruOuKvy~K~  j  j  DG  HL  HZ  HZ  ]a  Ha  Db  ej  DjWl4qsz  E  FJ  FX  FX  Y\  E]  ]e  fj  fr  fr  st  fu  fF  fF  GJ  eK  }L  	M	%o0@AtX0V/X[^`dfikoZpq % 	Wl4p  sD  N_  FJ  et  	u
`79455 (4]_dfqfufu  wJ  LN  gO  Zc  d (4]_cepetet  vI  KM  fN  O (4lnyn}n}  M  OP  oQ  TU  oU  Ze  Zi  Zi  jx  z{  Z|  Y}  }J  WK  L (4w  zE  zI  zI  Jc  ef  zg  kl  zl  p|  }H  }L  }L  Mf  hi  }j  |k  nl  m (  5Y  [A  EX  EZ  [Z  \`  a
sOV}}_)#tRWW\\$==_<H<N<N<P~<P[S&X^XdXdXfXoXop|X}(#ax(<P~Wn6t  {F  wF  bm  HL  HQ  HQ  R]  H^  sw  	x{NK#M}M###M}MMCM_MCCCM_MM	Wn6gipi~i~u~  IP  U^  AE  fk  ls  kt  t|  }F  |G  dH  	IwWl4_az  |G  bH  bU  bU  Mf  gu  Mv  bU  bU  {T  Ua  {b  bU  bU  g@  AT  gU  W[  	\Wl4r  yR  S\  y]  u]  _c  	dWl4n  qF  GJ  qK  Of  qf  qe  qe  k@  AI  kJ  Ne  ke  jA  iB  BC  D[  C\  \g  gh  	i DIIK')1-GCwCCFCwCCFCwCCFfk&F&W7&&dmm$787 C  DWh0prwy}  B  zC  	D  	DD  xWh0PRWY]^aYbmvwwx  LWh0xz  BF  GJ  BK  	L  	LL  nW&=?Z\acghkclmmn  W&=?kmrtxy|t}~~  FWn6rty{  AD  |E  	F  	FF  	S .%S	RR	S T nWj2Z\acghkclmmn:  gWj2SUZ\`ad\effg  tWj2`bgimnqirsst  pWj2\^ceijmenoop  tWj2`bgimnqirsst  oWl4[]bdhildmnno  dWj2PRWY]^aYbccd  	Q *6ikprvwzr{  GP  Q  Q	Q ! 	 ggll#79NOQSQXQXQ]Q]^r  uJ  RK  Lww~~a((		! )  	 L < h K  	% $	%  pWl4\^ceijmenoop  `Wh0LeUYZ]U^__`
 `~ sWn6_afhlmphqrrs  {Wn6ginptuxpyzz{  wWl4cejlpqtluvvws  /AE 
A"AE5 -AE5 AE5 )AF( 79AG 1AAH
 'AH; AAI,#BAJ# /	AJ=AJ;AJ# ?;AK =AK B+AK 	AK AK 5AK AK A7AK AK 'AK <(AK %AK 2AK AK AK +&AK BAK $AK AK AK AK *AK 	AK AK #AK /AL AL8 )AM) AN $AN 1BAN 9$AN AN 5BAO 8?AO 8AAO  ?AO 	C
AO< ;AP/!AT	 8AS&
A9AT	 	AS+AS+8AT	 	AS0AS0#AAT	 ,AT	 9B=AT	 7AAT	 !AS5 5AT	 AAT: B#AT: 7AU7 -AU+;AU7 *AU1 AU10AU7 <&AV( %AV( AV( %AV( ?	AV( 	AV( AV(  AW :AW @AW @ A<AW EAE2EAE-E-AE2E5AF%F AF F AF%F(AGF3AGGAGGAHG$AHHAHH
AH8HAH3H3AH8H;AI)IAI$I$AI)I,AJI7AJJAJJAJ# J#AKJ.AKKAKKALK!AK?K?ALLAL5LAL0L0AL5L8AM&MAM!M!AM&M)ANM4ANNANNAON%AOOAOOAO9OAO4O4AO9O<AP,PAP'P!AQ P'AP,P,AQ P/AP?P>AP?QAAS#R;ASS
AS#SAS	SAS#SAS	SAS#S&AT	 S5ATTAT	 TATTAT	 T	AT7TAT2T2AT7T:AU(UAU#U#AU(U+AU7 U7AV%VAV V AV%V(AWV3AWWAWWAXW$AXXAXc                    a
 \         P                  P                  R 4      R8H  p \        V R7      pVR,          '       d   RMRpVR,          '       d   RMRp/ pVR,           F+  pVP	                  VR,          . 4      P                  V4       K-  	  R	 o
. pVP                  4        FL  w  rxR
P                  V
3R lV 4       4      p	VP                  R\        P                  ! V4       RV	 R24       KN  	  RV RV RVR,           RVR,           RVR,           RVR,           RVR,           R\        P                  ! VR,          4       R\        P                  ! VR,          4       RR
P                  V4       R 2# )!
conversionr   rV  r  r
  u   הבדיקה עברהu   נמצאו כשליםr  r
  c                 R   V P                  R 4      pVR8X  d   RpRpRpMVR8X  d   RpRpRpMRpRpR	p\        P                  ! V P                  R
4      ;'       g    R4      P                  RR4      pRV RV RV R\        P                  ! V P                  RR4      4       RV R2# )r  r
  r
     תקיןr  r&
  u
   אזהרהr
  r
  u   כשלr>  r   ru  r2  z<tr class='z'><td>r   r  r   r  )r   r   r   r   )r  r  markr,
  r`   r>  s   &     r   row_html(render_admin_self_test.<locals>.row_html  s    (#VDCEvDC EDCE//$((9"5";";<DDT6RSEvQugYxtxxX^_aOb?c>ddmnumv  wA  B  	Br   r   c              3   4   <"   T F  pS! V4      x  K  	  R # 5ir   r  )r   r  r  s   & r   r   )render_admin_self_test.<locals>.<genexpr>  s     8%$x~~%s   z<section class='group'><h2>u`   </h2><table><thead><tr><th>מצב</th><th>בדיקה</th><th>פירוט</th></tr></thead><tbody></tbody></table></section>uK
  
<!DOCTYPE html>
<html lang="he" dir="rtl">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>בדיקה עצמית TripServer</title>
<style>
body{margin:0;background:#0f172a;color:white;font-family:Arial;padding:22px}.wrap{max-width:1180px;margin:auto}a{color:#bfdbfe;text-decoration:none}.hero{background:linear-gradient(135deg,#1d4ed8,#0f172a 62%,#111827);border:1px solid #334155;border-radius:26px;padding:22px;margin-bottom:16px;box-shadow:0 20px 70px rgba(0,0,0,.25)}h1{margin:0 0 8px;font-size:34px}p{color:#cbd5e1;line-height:1.65}.badge{display:inline-block;border-radius:999px;padding:8px 14px;font-weight:900;margin-top:8px}.badge.ok{background:#064e3b;color:#bbf7d0;border:1px solid #22c55e}.badge.bad{background:#7f1d1d;color:#fecaca;border:1px solid #ef4444}.summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:14px 0}.card{background:#1e293b;border:1px solid #334155;border-radius:18px;padding:14px}.num{font-size:30px;font-weight:950;color:#fde68a}.actions{display:flex;gap:10px;flex-wrap:wrap;margin:12px 0 0}.actions a{display:inline-flex;background:#1e293b;border:1px solid #475569;border-radius:999px;padding:10px 13px;font-weight:900}.group{background:#111827;border:1px solid #334155;border-radius:22px;padding:16px;margin:14px 0}.group h2{margin:0 0 12px;color:#dbeafe}table{width:100%;border-collapse:collapse;overflow:hidden;border-radius:14px}th,td{padding:10px;border-bottom:1px solid #334155;text-align:right;vertical-align:top}th{background:#0b1220;color:#bfdbfe}td:last-child{direction:ltr;text-align:left;color:#cbd5e1;word-break:break-word}tr.pass td:first-child{color:#bbf7d0;font-weight:900}tr.warn td:first-child{color:#fde68a;font-weight:900}tr.fail td:first-child{color:#fecaca;font-weight:900}.note{background:#0b1220;border:1px solid #334155;border-radius:16px;padding:13px;color:#cbd5e1;line-height:1.65}@media(max-width:700px){body{padding:14px}h1{font-size:28px}table,thead,tbody,tr,th,td{display:block}thead{display:none}tr{border:1px solid #334155;border-radius:14px;margin:10px 0;padding:8px}td{border:0;padding:7px}td:last-child{text-align:right;direction:rtl}}
</style></head><body><div class="wrap"><div class="hero"><a href="/admin">⬅ חזרה לפאנל</a><h1>🧪 בדיקה עצמית מלאה</h1><p>בדיקה לא־הרסנית של קוד, routes, טפסים, נתיבים, מדיה, מצגות, אבטחה, Control Server ו־Fail Safe. היא לא מבצעת העלאות אמיתיות, לא מאתחלת את השרת ולא מכבה את המחשב.</p><span class="badge r  u  </span><div class="actions"><a href="/admin/self-test">הרץ שוב</a><a href="/admin/self-test?conversion=1">בדיקה כולל סימולציית המרת תמונה</a><a href="/admin/self-test.json" target="_blank">JSON טכני</a><a href="/admin/status">סטטוס קבצים</a><a href="/admin/health">Health</a></div></div><div class="summary"><div class="card"><div>סה״כ בדיקות</div><div class="num">rj  uB   </div></div><div class="card"><div>עברו</div><div class="num">rG  uF   </div></div><div class="card"><div>אזהרות</div><div class="num">r  uD   </div></div><div class="card"><div>כשלים</div><div class="num">rb  u@   </div></div><div class="card"><div>משך</div><div class="num">r  u/   s</div></div></div><div class="note">גרסה: r  u   <br>נבדק: r  rZ	  r  )
r   r  r   r  r:  r  r  r   r   r   )include_conversionr   badge_classr  groupedr  groups_htmlr
  r  r  r  s             @r   render_admin_self_testr    s   !,,**<8C?!;MNG!$--$UK,3DMM(?VJG	""4
+R077= #B" K"==?ww8%8889R8S  Tt  uy  tz  zT  U  	V +m ny  mz  z|  }G  |H  Hn  ov  w~  o  n@  @B  CJ  KS  CT  BU  U[  \c  dn  \o  [p  pt  u|  }E  uF  tG  GG  HO  Pa  Hb  Gc  cR  S[  Sb  Sb  cj  kt  cu  Sv  Rw  wE  FN  FU  FU  V]  ^j  Vk  Fl  Em  ms  tv  t{  t{  |G  tH  sI I r   c                     R p Rp \        \        4       4      p V '       d   RMRp \	        4       p/ RR	bR
RbR\
        bR\        bR\        bR\        bR\        bR\        \        4      bR\        4       bR\        bRV bRVbRVbRR	bRRbR\        P                  4        UUu/ uF7  w  rEVRVR,          R\         P"                  P%                  VR,          4      /bK9  	  uppbR\'        4       b#   \         d   p\        T4      p Rp?LRp?ii ; i  \         d   pRRR\        T4      /p Rp?ELRp?ii ; iu uppi )Fznot checkedr  u   פורט 8010 לא עונהNr   r   r   r  TserviceTripServer Adminr  r  r  hostportusa_image_keysjapan_presentation_imagespower_actions_enabledcontrol_server_okcontrol_server_statusfailsafe_statusrestart_helper_legacyrestart_helper_statuszDlegacy hidden from Health; active path is Control Server + Fail Safer  r   r   media_engine)ru  rO  r   r~  r   r   rU  r  
ADMIN_HOSTr  r,  r/  r  r  r  r  r   r   r   r  )control_alivecontrol_infor  failsafe_inforT  r  s         r   health_payloadr    s    M L!4673@/FcC24d% 	& 	&	
 	# 	
 	
 	#n- 	$%C%E 	 !6 	] 	  	= 	  	 !g  	fwf}f}f  AfYbY\vtF|Xrww~~d6l7STTf  A!" 	+-#   !Cy!  C )YS	BC$ As4   C0 
D #=D;
0D;DDD8D33D8c                     \        4       p V P                  R / 4      p\        VP                  R4      4      p\        VP                  R4      4      pVP                  R4      ;'       g    RpVP                  R4      ;'       g    Rp\        V P                  R4      4      pV P                  R/ 4      pRBR	 lp\        P                  ! \        V 4      4      P                  R
R4      P                  RR4      P                  RR4      p	RP                  . RNV! R4       NRN\        P                  ! \        4       NRN\        P                  ! \        4       NRN\         NRN\        P                  ! \        4       NRNV! V P                  RR4      RR4       NRN\        P                  ! \        V P                  R/ 4      P                  RR4      4      4       NR NV! VR!R"4       NR#NV! VR$R%4       NR&N\        P                  ! V4       NR'N\        P                  ! V4       NR(NV! VRR)4       NR*NV'       d   R+MR, NR-NV! \        \        4      ^,8H  R.\        \        \        4      4      R/,           4       NR0N\        \        4       NR1NT! VP                  R24      ;'       d    VP                  R3^ 4      ^ 8H  RR44       NR5NVP                  R6^ 4       NR7NVP                  R8^ 4       NR9NVP                  R:^ 4       NR;NVP                  R<^ 4       NR=NVP                  R>^ 4       NR?NVP                  R3^ 4       NR@NV	 NRAN4      # )Cr  r  rC  r  r_	  r  r  r  r  c                 D    V '       d   R MRpV '       d   TMTpRV RV R2# )r  r
  z<span class="badge r  r  r  )r  text_oktext_badr,
  r   s   &&&  r   r  "render_admin_health.<locals>.badge  s)    deg$SEC588r   z, 'z,
 '{z{
 }z
}r   uC  
<!DOCTYPE html>
<html lang="he" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>בדיקת מערכת TripServer</title>
<style>
:root{--bg:#07111f;--panel:#101c31;--line:#253650;--muted:#a8b3c7;--blue:#60a5fa;--green:#22c55e;--red:#ef4444;--yellow:#fbbf24}
*{box-sizing:border-box}body{margin:0;font-family:Arial,'Segoe UI',sans-serif;background:radial-gradient(circle at 80% -10%,rgba(59,130,246,.35),transparent 28%),linear-gradient(180deg,#07111f,#0f172a);color:white;min-height:100vh;padding:20px}
.wrap{width:min(980px,94vw);margin:auto}.hero{background:linear-gradient(135deg,rgba(30,64,175,.9),rgba(15,23,42,.92));border:1px solid rgba(147,197,253,.25);border-radius:28px;padding:22px;box-shadow:0 25px 70px rgba(0,0,0,.32)}
h1{margin:0 0 8px;font-size:clamp(28px,5vw,42px)}p{color:#dbeafe;line-height:1.65;margin:8px 0}.actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px}a{display:inline-flex;align-items:center;justify-content:center;gap:8px;text-decoration:none;border:1px solid rgba(148,163,184,.35);background:rgba(15,23,42,.65);border-radius:999px;padding:11px 15px;font-weight:900;color:white}
a:hover{border-color:var(--blue);background:rgba(59,130,246,.22)}.grid{display:grid;grid-template-columns:repeat(2,1fr);gap:14px;margin:18px 0}.card{background:rgba(16,28,49,.9);border:1px solid var(--line);border-radius:22px;padding:18px;box-shadow:0 16px 45px rgba(0,0,0,.22)}.card h2{margin:0 0 10px;font-size:22px}.line{display:flex;justify-content:space-between;gap:12px;border-top:1px solid #263852;padding-top:10px;margin-top:10px;color:#cbd5e1;direction:rtl}.ltr{direction:ltr;text-align:left;overflow-wrap:anywhere;color:#fde68a}.badge{display:inline-flex;border-radius:999px;padding:6px 10px;font-weight:900;font-size:13px}.badge.ok{background:rgba(22,101,52,.45);border:1px solid rgba(74,222,128,.45);color:#bbf7d0}.badge.bad{background:rgba(127,29,29,.45);border:1px solid rgba(248,113,113,.45);color:#fecaca}.note{background:rgba(15,23,42,.75);border:1px solid #334155;border-radius:18px;padding:14px;color:#cbd5e1;line-height:1.6}pre{white-space:pre-wrap;direction:ltr;text-align:left;background:#020617;color:#fde68a;border:1px solid #334155;border-radius:18px;padding:16px;overflow:auto;max-height:360px}
@media(max-width:760px){body{padding:14px}.grid{grid-template-columns:1fr}.hero{padding:18px;border-radius:24px}.card{padding:15px}.line{display:block}.ltr{margin-top:5px}}
</style>
</head>
<body><div class="wrap">
<div class="hero">
<h1>🩺 בדיקת מערכת</h1>
<p>זה מסך קריא לבני אדם. נקודת הקצה הטכנית עדיין קיימת ב־<span class="ltr">/health?json=1</span> למקרה שצריך בדיקה אוטומטית.</p>
<div class="actions"><a href="/admin">⬅ חזרה לפאנל</a><a href="/admin/status">📊 סטטוס קבצים</a><a href="/health?json=1" target="_blank">JSON טכני</a><a href="/admin/self-test">🧪 בדיקה עצמית מלאה</a><a href="/admin/logs">📜 לוגים</a></div>
</div>
<div class="grid">
<div class="card"><h2>מצב שרת</h2><div>Tu-   </div><div class="line"><b>גרסה</b><span>u?   </span></div><div class="line"><b>עלה בתאריך</b><span>u4   </span></div><div class="line"><b>פורט</b><span>z0</span></div><div class="line"><b>Host</b><span>z:</span></div><div class="line"><b>Control Server</b><span>r  Frx	     לא פעילz5</span></div><div class="line"><b>Fail Safe</b><span>r  r   r   uE   </span></div></div>
<div class="card"><h2>מנוע מדיה</h2><div>u   Pillow תקיןu   Pillow חסרr   u   FFmpeg תקיןu   FFmpeg חסרu   </div><div class="line"><b>תמונות</b><span>המרה ודחיסה ל־JPG</span></div><div class="line"><b>אודיו</b><span>המרה ל־MP3</span></div><div class="line"><b>FFmpeg</b><span class="ltr">z?</span></div><div class="line"><b>ffprobe</b><span class="ltr">uI   </span></div></div>
<div class="card"><h2>פעולות מחשב</h2><div>ry	  u@   </div><div class="line"><b>כיבוי / ריסטארט</b><span>u   מופעל בפאנלu   מנוטרל בהגדרותu   </span></div><div class="line"><b>הגנות</b><span>POST, רשת מקומית, אישור כתוב, טיימר וביטול</span></div></div>
<div class="card"><h2>כיסוי מצגת ארה״ב</h2><div>u   44 שקפיםu    שקפיםu:   </div><div class="line"><b>מדיה לשקפים</b><span>u   </span></div><div class="line"><b>העלאה</b><span>תמונה → JPG דחוס / MP4-M4V → MP4 H.264</span></div></div>
<div class="card"><h2>כיסוי מצגת יפן</h2><div>r  r  u   לבדיקהuI   </div><div class="line"><b>תמונות בשימוש בפועל</b><span>r  uG   </span></div><div class="line"><b>קבצים חיצוניים</b><span>r  uG   </span></div><div class="line"><b>תמונות מוטמעות</b><span>r  uE   </span></div><div class="line"><b>קבצים בתיקייה</b><span>r  uJ   </span></div><div class="line"><b>לא בשימוש / חסרות</b><span>r  r
  u   </span></div></div>
</div>
<div class="note"><b>ארכיטקטורת התאוששות פעילה</b><br>מסלול העדכון וההתאוששות נשען על Control Server ו־Fail Safe בלבד.</div>
<h2>מידע טכני מלא</h2><pre>z</pre>
</div></body></html>
)r  r\	  )r  r   ru  r   r   r   r   r   r   rU  r  r  r,  r/  )
r   rS   	pillow_ok	ffmpeg_okr  r  power_okr  r  	json_texts
             r   rS  rS    s}   GKK+EUYYx()IUYYx()I))M*==oK99^,??LGKK 789H++92>K9
 G-55eWEMMcSYZbbcfhmnI    .  . /4Dk]/ . ;h/ . iqhwhw  yL  iM  hN/ . NM/ . NV  N]  N]  ^n  No  Mp/ . pd/ . eo  dp/ . p`/ . ai  ap  ap  q{  a|  `}/ . }w/ . x}  ~E  ~I  ~I  J]  _d  ~e  gq  sB  xC  wD/ . Dy/ . zB	  zI	  zI	  J	M	  N	U	  N	Y	  N	Y	  Z	k	  m	o	  N	p	  N	t	  N	t	  u	|	  ~	G
  N	H
  J	I
  zJ
  yK
/ .K
2/ 0 38	CTVe2f1g1 0 hi1 0 joox  {L  N]  j^  i_1 0 _q1 0 rz  rA  rA  BM  rN  qO1 0 ON1 0 OW  O^  O^  _k  Ol  Nm1 0m61 2 7<HjR\6]5^3 2 __3 2 {C  `w  If  _g3 2g?3 4 @ESEX\^E^`oqtux  zH  vI  rJ  MZ  rZ  @[  ?\5 4 \V5 4 WZ  [i  Wj  Vk5 4k;5 6 <AQfAg  B_  B_lwl{l{  }V  XY  mZ  ^_  m_  ak  m{  <|  ;}7 6 }F7 6 GR  GV  GV  Wk  mn  Go  Fp7 6 pw7 6 xC  xG  xG  H]  _`  xa  wb7 6 bi7 6 ju  jy  jy  zK  MN  jO  iP7 6 PU	7 6 V	a	  V	e	  V	e	  f	u	  w	x	  V	y	  U	z	7 6 z	D7 6 EP  ET  ET  Uk  mn  Eo  Dp7 6 ps7 6 t  tC  tC  D]  _`  ta  sb7 6b'7 < (1k= <2=   r   c                     \         P                  P                  R 4      R8X  d   \        RR7       \	        \         P                  P                  R4      \         P                  P                  R4      ;'       g    R4      # )refreshr   T)ry
  r  r   r   )r   r  r   r~
  r
  r  r   r   admin_local_filesr    sV    ||	"c)T*$W\\%5%5f%=w||?O?OPV?W?]?][]^^r   r
  c            	         \        \        P                  P                  R 4      4      p  \	        T \        P                  P                  R4      ;'       g    R4      p\        P                  P                  T4      '       g   \        R	R
RTR7      R3# \        TR\        P                  P                  T4      R7      #   \
         d%   p\        RRR\        T4      R7      R3u Rp?# Rp?ii ; i)r  r   r   r
  O   הקובץ המבוקש לא נמצא בתוך התיקיות המאושרות.Fr=  rD  N   קובץ לא נמצאuJ   לא ניתן להוריד תיקייה או קובץ שאינו קיים.rM  Tr  download_name)r
  r   r  r   r
  r   r3  r   r   r   rg  r	   r   )ra   r   r  s      r   admin_local_files_downloadr  "  s    '(8(8(@AHjx)9)9&)A)G)GRH 77>>$ !9  <H  MR  \`  a  cf  f  	fTRWW=M=Md=STT	  j !4  7H  MR  \_  `c  \d  e  gj  j  	jjs#   +B> B> >C-	C("C-(C-r
  c                  L   \        \        P                  P                  R 4      4      p  \	        T \        P                  P                  R4      ;'       g    R4      p\        P                  P                  T4      '       g   \        R	R
RTR7      R3# \        P                  P                  T4      p\        P                  P                  T4      ^,          P                  4       pT\        9  g   T\        8  d    \        RRRT R\!        T4       2R7      R3#  \#        TR4      P%                  4       p TP'                  R4      p\,        P.                  ! TR,          4      p\1        Y4      p\        P                  P3                  T4      P5                  RR4      p	\7        RY	4      p
\7        RY4      p\7        RY4      pRT
 RT RT R \,        P.                  ! \        P                  P9                  T4      4       R!\,        P.                  ! T4       R"T R#2#   \
         d%   p\        RRR\        T4      R7      R3u Rp?# Rp?ii ; i  \(         d    TP'                  RRR7      p EL(i ; i  \
         d%   p\        RRR\+        T4      R7      R3u Rp?# Rp?ii ; i)$r  r   r   r
  r  Fr=  rD  Nr  uH   לא ניתן להציג תיקייה או קובץ שאינו קיים.rM  u   אין תצוגה מקדימהuo   ניתן להציג רק קבצי טקסט קטנים. אפשר להוריד את הקובץ במקום זאת.ru  r8  r   cp1255r   ry  u    שגיאה בקריאת קובץu0   לא ניתן היה לקרוא את הקובץ.r   :Ni Nr%  r&  r
  r
  r
  u	  <!DOCTYPE html><html lang='he' dir='rtl'><head><meta charset='UTF-8'><meta name='viewport' content='width=device-width, initial-scale=1.0'><title>תצוגת קובץ</title><style>body{margin:0;font-family:Arial;background:#07111f;color:#f8fafc}.wrap{width:min(1100px,94%);margin:auto;padding:22px}a{color:#bfdbfe}pre{direction:ltr;text-align:left;white-space:pre-wrap;background:#020617;border:1px solid #334155;border-radius:18px;padding:16px;overflow:auto;color:#fde68a}</style></head><body><div class='wrap'><a href='u.   '>⬅ חזרה לתיקייה</a> · <a href='u$   '>הורד קובץ</a> · <a href='u   '>ערוך</a><h1>📄 r2  z	</p><pre></pre></div></body></html>)r
  r   r  r   r
  r   r3  r   r   r   rg  r  r4  r   r
  r
  r  r   r9  r|  UnicodeDecodeErrorr~  r   r   r
  r   r   r
  r   )ra   r   r  r  r  r.  r!  safe_contentrel_rawback_rawr4  download_urledit_urls                r   admin_local_files_previewr  .  s   '(8(8(@AHjx)9)9&)A)G)GRH 77>>$ !9  <F  KP  Z^  _  ad  d  	d77??4 D
''

4
 
#
)
)
+C
,,7S0S !A  Du  z  LP  KQ  QS  T`  ae  Tf  Sg  Ih  i  kn  n  	n[4##%	=jj)G
 ??77#34LH+Gwww'//S9H3XHH"#@(TL8(LH a  bj  ak  kY	  Z	f	  Y	g	  g	K
  L
T
  K
U
  U
l
  m
u
  m
|
  m
|
  }

  }
D  }
D  }
M  }
M  NR  }
S  m
T  l
U  U]  ^f  ^m  ^m  nr  ^s  ]t  t}  ~J  }K  Ke  h  h-  j !4  7H  MR  \_  `c  \d  e  gj  j  	jj " 	=jj)j<G	= [ !CEw  }B  LP  QT  LU  V  X[  [  	[[s_   +H H I4 7I I(IIII1-I4 0I11I4 4J#?JJ#J#r
  GETc                     \        \        P                  P                  R 4      4      p  \	        T \        P                  P                  R4      ;'       g    R4      p\        P                  P                  T4      '       g   \        R	R
RTR7      R3# \        P                  P                  T4      ^,          P                  4       pT\        9  d   \        RRRTR7      R3# \        P                  R8X  dn   \        P                  P                  RR4      p \!        TR4       \#        TRRRR7      ;_uu_ 4       pTP%                  T4       RRR4       \        RRRTR7      #  \#        TR4      P)                  4       p TP+                  R4      p\/        Y4      p\        P                  P1                  T4      P3                  R R!4      p	\5        R"Y	4      p
\6        P8                  ! T RR#7      p\6        P8                  ! TRR#7      pR$T
 R%\6        P8                  ! \        P                  P;                  T4      4       R&\6        P8                  ! T4       R'T R(T R)\6        P8                  ! T4       R*2#   \
         d%   p\        RRR\        T4      R7      R3u Rp?# Rp?ii ; i  + '       g   i     ELc; i  \
         d%   p\        RRR\'        T4      R7      R3u Rp?# Rp?ii ; i  \,         d    TP+                  RRR7      p EL}i ; i  \
         d%   p\        RRR\'        T4      R7      R3u Rp?# Rp?ii ; i)+r  r   r   r
  u7   הקובץ אינו בתוך תיקייה מאושרת.Fr=  rD  Nr  uH   לא ניתן לערוך תיקייה או קובץ שאינו קיים.rM  u   עריכה חסומהuP   עריכה דרך הדפדפן מותרת רק לקבצי טקסט מוכרים.r
  r!  local_file_editr   r   r  u   הקובץ נשמרuK   קובץ הטקסט עודכן ונוצר גיבוי לפני השינוי.Tu   שגיאה בשמירהu0   לא ניתן היה לשמור את הקובץ.r   r8  r  r   ry  u   שגיאה בקריאהu=   לא ניתן היה לקרוא את הקובץ לעריכה.r%  r&  r
  r3  u  <!DOCTYPE html><html lang='he' dir='rtl'><head><meta charset='UTF-8'><meta name='viewport' content='width=device-width, initial-scale=1.0'><title>עריכת קובץ</title><style>body{margin:0;font-family:Arial;background:#07111f;color:#f8fafc}.wrap{width:min(1200px,94%);margin:auto;padding:22px}a{color:#bfdbfe}textarea{width:100%;min-height:70vh;direction:ltr;text-align:left;background:#020617;color:#fde68a;border:1px solid #334155;border-radius:18px;padding:16px;font-family:Consolas,monospace}button{background:#16a34a;color:white;border:0;border-radius:14px;padding:14px 18px;font-weight:900}</style></head><body><div class='wrap'><a href='u7   '>⬅ חזרה לתיקייה</a><h1>✏️ עריכת r2  z@</p><form method='post'><input type='hidden' name='root' value='z*'><input type='hidden' name='path' value='z'><textarea name='content'>u   </textarea><p><button type='submit' onclick="return confirm('לשמור שינוי בקובץ?')">שמור קובץ</button></p></form></div></body></html>)r
  r   r  r   r
  r   r3  r   r   r   rg  r4  r   r
  r  formr  r   r  r~  r9  r|  r  r
  r   r   r
  r   r   r   )ra   r   r  r  rY  r  r.  r!  r  r  r4  r  r  s                r   admin_local_files_editr  L  s   '(:(:6(BCHRx););F)C)I)IrJ 77>>$ !9  <F  KP  Z^  _  ad  d  	d
''

4
 
#
)
)
+C
,, !8  ;M  RW  ae  f  hk  k  	k~~||	2.	V '89dC'2>>! ?$%:  =J  OS  ]a  b  b_4##%	=jj)G
 H+Gwww'//S9H3XHH??840D
//'
.C c
  d
l
  c
m
  m
d  em  et  et  uw  u|  u|  uE  uE  FJ  uK  eL  dM  MU  V^  Ve  Ve  fj  Vk  Ul  ll  mq  lr  r\  ]`  \a  a|  }E  }L  }L  MT  }U  |V  Vq  t  t;  R !46oty  DG  HK  DL  M  OR  R  	RR ?>>  	V$%>@rw|  GK  LO  GP  Q  SV  V  V	V " 	=jj)j<G	= _ !:<{  AF  PT  UX  PY  Z  \_  _  	__s   +I6 I6 #J< <J(J< &L K. 6J%J J% J%(J9	3	J< <K+K& K+&K+.LL LL ML=7M=Mz/admin/local-files/uploadc            	         \        \        P                  P                  R 4      4      p  \	        T \        P                  P                  R4      ;'       g    R4      p\        P                  P                  T4      '       g   \        R	R
RTR7      R3# \        P                  P                  R4      p. p T F  pT'       d+   TP                  ;'       g    RP                  4       '       g   K7   \        TP                  4      p\%        \        P                  P'                  Y4      4      pTP)                  T4       TP+                  \        P                  P-                  T4      4       K  	  T'       g   \        RRRR7      R3# \        RR\/        T4       R2RRP'                  T4      R7      #   \
         d%   p\        RRR\        T4      R7      R3u Rp?# Rp?ii ; i  \
         d3    R\        \!        \"        P"                  ! 4       4      4      ,           p ELi ; i  \
         d%   p\        RRR\1        T4      R7      R3u Rp?# Rp?ii ; i)r  r   r   r
  %   התיקייה אינה מאושרת.Fr=  rD  Nr
  uP   לא ניתן להעלות לקובץ או לתיקייה שאינה קיימת.r  r  r
  u/   בחר קובץ אחד לפחות להעלאה.r1     העלאה הושלמה   נשמרו u*    קבצים בתיקייה הנוכחית.Tru     שגיאה בהעלאהu2   לא ניתן היה לשמור את הקבצים.r   )r
  r   r  r   r
  r   r3  r   r   r   r  r  getlistr5  r   r
  r   r   r
  r   r  r  r   r,  r~  )ra   rc   r  r  rX  r  r   r  s           r   admin_local_files_uploadr  q  sJ   '(8(8(@AH@ 7<<+;+;F+C+I+IrJ 77==   !?  BT  Y^  hn  o  qt  t  	tMM!!'*EETAQZZ--244669&qzz2 .bggll6.HIFFF6NLL))&12  $%=?puz{  ~A  A  A !:k#e*U  =A  FJ  TX  T]  T]  ^c  Td  e  	e'  @ !46]bgqtuxqyz|@  9 3s499;'7#889  T !:<puz  EI  JM  EN  O  QT  T  	TTs~   +F2 F2 5H$ H$ ,H$ /G$A2H$ 7H$ *H$ 2G!=GG!G!$9H!H$  H!!H$ $I/IIIz/admin/local-files/mkdirc            	         \        \        P                  P                  R 4      4      p  \	        T \        P                  P                  R4      ;'       g    R4      p \        \        P                  P                  R	4      ;'       g    R4      p \	        T \        P                  P                  \        Y4      T4      4      p\        P                  ! TRR7       \        RRRTR7      #   \
         d%   p\        RRR\        T4      R7      R3u Rp?# Rp?ii ; i  \
         d%   p\        R
RR\        T4      R7      R3u Rp?# Rp?ii ; i  \
         d%   p\        RRR\        T4      R7      R3u Rp?# Rp?ii ; i)r  r   r   r
  r  Fr=  rD  Nfolder_nameu   שם תיקייה חסרu$   כתוב שם תיקייה תקין.r   u   תיקייה נוצרהu2   התיקייה החדשה נוצרה בהצלחה.Tu$   שגיאה ביצירת תיקייהu4   לא ניתן היה ליצור את התיקייה.r   )r
  r   r  r   r
  r   r3  r   r
  r   r   r   r
  r   r~  )ra   rc   r  r   r  s        r   admin_local_files_mkdirr    s   '(8(8(@AH@ 7<<+;+;F+C+I+IrJFw||//>DD"Ec 277<<h8WY]+^_
FU+ !:<puy  DJ  K  	K  @ !46]bgqtuxqyz|@  F !;=chmwz{~w  A  CF  F  	FF  c !GI  EJ  TX  Y\  T]  ^  `c  c  	ccsf   +C+ C+ *D 	D AE +D6DDDE(EEEE>E93E>9E>z/admin/local-files/bulkc            	         \        \        P                  P                  R 4      4      p \        P                  P                  R4      ;'       g    RP	                  4       P                  4       p\        P                  P                  R4      pV'       g   \        RRRR7      R3#  VR	,           Uu. uF  p\        W4      NK  	  ppTR8X  Edl   \        P                  ! R4      p\        P                  P                  \         R4      p\        P"                  ! TRR7       \        P                  P                  TRT  RT R24      p^ p	^ p
 \$        P&                  ! TR\$        P(                  4      ;_uu_ 4       pT Fn  p\        P                  P+                  T4      '       g   K*  \-        YT4      w  rY,          p	Y,          p
T	\.        8  g   KU  \1        R\3        \.        4       24      h	  RRR4       T
^ 8:  d   \        RRRR7      R3# \5        TR\        P                  P7                  T4      R7      # TR8X  Ed!   . p. pT F  p \        P                  P=                  T4      \?        T 4      8X  d   \1        R4      h\        P                  PA                  T4      '       d   \B        PD                  ! T4       M;\        P                  P+                  T4      '       d   \        P8                  ! T4       TPG                  \I        Y4      4       K  	  \        R R!\K        T4       R"\K        T4       2\K        T4      ^ 8H  R#P                  TT,           4      R7      # TR$8X  Ed   \K        T4      ^8w  d   \        R%R&RR7      R3#  \M        \        P                  P                  R'4      ;'       g    R(4      pT^ ,          p\        P                  P                  \        P                  PO                  T4      T4      p\        T \I        T T4      4      p\        P                  P+                  T4      '       d   \1        R)4      h\        PP                  ! TT4       \        R*R+RT R,T 2R7      # TR:9   Ed   \        \        P                  P                  R04      4      p\        P                  P                  R14      ;'       g    R(p \        TT4      p\        P                  PA                  T4      '       g   \1        R24      h . p. pT F5  p TR/8X  d   \S        TT4      pM\U        TT4      pTPG                  T4       K7  	  \        R5R6\K        T4       R7\K        T4       2\K        T4      ^ 8H  R#P                  TT,           4      R7      # \        R8R9RTR7      R3# u upi   \         d%   p\        R
RR\        T4      R7      R3u Rp?# Rp?ii ; i  + '       g   i     EL; i  \         ds   p \        P                  P+                  T4      '       d   \        P8                  ! T4       M  \         d     Mi ; i\        RRR\;        T4      R7      R3u Rp?# Rp?ii ; i  \         d5   pTPG                  \I        Y4       R\;        T4       24        Rp?EKa  Rp?ii ; i  \         d%   p\        R-R.R\;        T4      R7      R3u Rp?# Rp?ii ; i  \         d%   p\        R3R4R\        T4      R7      R3u Rp?# Rp?ii ; i  \         d,   pTPG                  T R\;        T4       24        Rp?EK5  Rp?ii ; i);r  rd  r	  r   u   לא נבחרו פריטיםu6   סמן קובץ או תיקייה לפני פעולה.Fr1  rD  :Ni,  Nr
  u*   אחד הנתיבים אינו מאושר.r=  Nr  r   Tr   local_files_export_r  r  r   u!   ZIP גדול מדי. מגבלה: u   לא נוספו קבציםu9   לא נמצאו קבצים תקינים לבניית ZIP.r  u   שגיאה ביצירת ZIPuC   לא ניתן היה ליצור חבילת קבצים להורדה.r   deleteu1   אסור למחוק את שורש התיקייה.rJ  u   מחיקה הסתיימהu   נמחקו u    פריטים. שגיאות: ru  renameu   שינוי שםu2   בחר פריט אחד בלבד לשינוי שם.new_namer   u4   כבר קיים קובץ/תיקייה בשם הזה.u   שם שונהu&   הפריט שונה שם בהצלחה.u   
→ u   שגיאה בשינוי שםu5   לא ניתן היה לשנות את שם הפריט.r~  	dest_root	dest_pathu(   יעד אינו תיקייה קיימת.u   יעד לא תקיןuV   בחר תיקיית יעד קיימת בתוך אחת התיקיות המאושרות.u   הפעולה הסתיימהu   בוצעו u    פעולות. שגיאות: u   פעולה לא מוכרתu0   הפעולה המבוקשת אינה נתמכת.>   r~  r
  )+r
  r   r  r   r   r   r  r3  r
  r   r   r   r   r   r   r   r  r   rI  rJ  r  r   r
  LOCAL_FILE_ZIP_MAX_BYTESr  r  r	   r   r  r~  rl  r
  r  rF  r  r  r
  r,  r
  r   r  r
  r
  )ra   rd  r,  r  rk  r  r  out_dirrP  rj  r  rU  r/  added_bytesadded_countdeletedrZ  r  r  rY  r  dest_relr
  doner  s                            r   admin_local_files_bulkr    sv   '(8(8(@AHllx(11E88:@@BF||##F+H !?Ay  D  E  GJ  J  	JE;CD>J>C/>J o.'',,x/
Gd+77<<+>xj%PT)UV	m30D0DEEA77>>!,, />rQ/O,K(E(E77(+L\ZrMsLt)uvv  F z()E  HC  HM  N  PS  S  SXTIYIYZbIcdd A	L77??1%)BB$%XYY77==##MM!$WW^^A&&IIaL}X9:  !!<CPWL>Yvwz  |B  xC  wD  ?E  KN  OU  KV  XY  KY  dh  dm  dm  nu  x~  n~  d  @  	@ u:?$%68lqvwy|||
	`&w||'7'7
'C'I'IrJH(C77<< 4h?D"8]8T-JKDww~~d## !WXXIIc4 $_6^cgtwsxx~  @D  E  rF  G  G !!,W\\-=-=k-JK	<<##K066B	x&y(;H77==** !KLL + A3V#,Q9F,Q9FF#  !!>+cRVi[Xuvy  {A  wB  vC  AD  JM  NT  JU  WX  JX  cg  cl  cl  mq  tz  mz  c{  |  	|9;mrw  BH  I  KN  N  Nm K E !46bglvyz}v~  BE  E  	EE FEE  	m77>>(++IIh' $%B  EJ  OT  ^b  cf  ^g  h  jm  m  m	m(  Lx!; <BtCykJKKL"  	`$%CE|  BG  QU  VY  QZ  [  ]`  `  `	`  	x$%;  >V  [`  jm  nq  jr  s  ux  x  x	x  32d3i[1223s  &V) 1V$V) .W/ ;AWW0W/ *W/ AY/);Y/%0Y/*Z1 6B=Z1 <[# 1\$V) )W4WWWW,	&	W/ /Y,;;X76Y'7YY'YY'!Y,'Y,/Z.:(Z))Z.1[ <[[ [ #\.\\\] ]]z/admin/local-files/zipc                      \        4       # r   )r  r  r   r   admin_local_files_zipr     s     "##r   r  c                      \        4       # r   )r  r  r   r   admin_self_testr     s    !##r   r  c                  ^    \         P                  P                  R 4      R8H  p \        V R7      # )r}  r   r~  )r   r  r   r  )r  s    r   admin_self_test_jsonr     s(    !,,**<8C?8JKKr   z/pingc                      R ^RR/3# )r  r`  no-storer  r  r   r   pingr     s    
333r   rJ  c            
      2    R RRRR\         R\        R\        /# )r  Tr  r  r  r  r  )r   rU  r  r  r   r   	ping_jsonr     s/     $	#5yBUWceuw}  @J  K  Kr   r  c                      \         P                  P                  R R4      p \         P                  P                  R4      R8w  d   RV 9   d   \	        R4      # \        4       # )Acceptr   r   r   z	text/htmlr  )r   re  r   r  r   r  )accepts    r   healthr     sJ    __  2.F||3&;&+@((r   z/health.jsonc                      \        4       # r   )r  r  r   r   health_jsonr  &   s    r   r  c                      \        4       # r   )rS  r  r   r   admin_healthr  +         r   r
  c                      \        4       # r   )r  r  r   r   admin_statusr  0   r  r   z/admin/controlc                  h   \        R 4      w  r\        4       pRp \        P                  P	                  \
        4      '       d"   \        \
        RRRR7      P                  4       pRp \        P                  P	                  \        4      '       d%   \        \        RRRR7      P                  4       RR pRT'       d   RMR	 R
T'       d   RMR R\        P                  ! \        T 4      4       R\        P                  ! \        T4      4       R\         R\         R\        P                  ! T;'       g    R4       R\        P                  ! T;'       g    R4       R2p\        T4      #   \         d   p\        T4      p Rp?EL$Rp?ii ; i  \         d   p\        T4      p Rp?LRp?ii ; i)zcontrol-pager   r   r   r   r  Na  <!doctype html><html lang='he' dir='rtl'><head><meta charset='utf-8'><meta name='viewport' content='width=device-width,initial-scale=1'><title>TripServer Control</title><style>body{font-family:Arial;background:#071120;color:#eef;margin:0;padding:22px}.box{max-width:960px;margin:auto;background:#111827;border:1px solid #334155;border-radius:22px;padding:24px}a,button{display:inline-block;margin:8px;padding:14px 18px;border-radius:14px;background:#2563eb;color:white;text-decoration:none;border:0;font-size:18px}pre{direction:ltr;text-align:left;background:#020617;color:#facc15;padding:16px;border-radius:14px;white-space:pre-wrap;overflow:auto}.pill{display:inline-block;padding:8px 14px;border-radius:999px;background:z#166534z#991b1bu   }</style></head><body><div class='box'><a href='/admin'>⬅ חזרה</a><h1>שרת בקרה חיצוני</h1><div class='pill'>rx	  r  z</div><p>Bootstrap: rR  u   </p><form action='/restart_admin_server' method='post'><button>אתחל פאנל ראשי דרך שרת הבקרה</button></form><a href='http://127.0.0.1:uM   /status.json' target='_blank'>Status מקומי</a><a href='http://127.0.0.1:u?   /log' target='_blank'>לוג מקומי</a><h2>Status</h2><pre>r   z</pre><h2>Log</h2><pre>r  i)rK  rO  r   r   r   CONTROL_STATUS_PATHr   r9  r   r~  CONTROL_LOG_PATHr   r   r   rM  r   )rW  rX  rY  r)
  r  rf	  r	  s          r   admin_control_pager  6   sh   #;N#K L#%EK577>>-..dCVX[fmv  ?A  ?F  ?F  ?HH277>>*++=Ms]dmv8w8|8|8~  @F  @G  9HX l  z  mv  EN  lO  OO  ^c  PZ  ix  Oy  yM  NV  N]  N]  ^a  bn  ^o  Np  Mq  qt  u}  uD  uD  EH  IW  EX  uY  tZ  Zv  wC  vD  DQ  R^  Q_  _^  _g  _n  _n  oz  oF  oF  ~F  _G  ^H  H_  `h  `o  `o  px  pD  pD  |D  `E  _F  F`  cD 449[4 1S	X1s6   A
E- ((F $F -F8F		FF1F,,F1r  c                      \        4       # r   )r  r  r   r   
admin_logsr  E   s    r   r  c                  \    \        \        P                  P                  R \        4      4      # )r  )r  r   r  r   r  r  r   r   admin_logs_jsonr  J   s    gll..w8NOPPr   z/camera/hls/startc            
         \        4       w  rV '       g	   R RRV/R3# \        4       '       g	   R RRR/R3# \        P                  P	                  RR4      R8g  p \
        P                  VR	R
7      p\
        P                  4       pR \        V4      RRR\        VP	                  R4      4      RV/#   \         d0   pR RR\        T4      R\
        P                  4       /R3u Rp?# Rp?ii ; i)r  Frp  r  u>   FFmpeg לא נמצא. נדרש FFmpeg לשידור מאוחד.  r  r   r   T)r  r   r	  z/camera/hls/stream.m3u8r  r  r   N)r  rK  r   r  r   rp	  r)  r  ru  r   r   )rQ  rb  r  r  r  r  s         r   camera_hls_startr  O   s    +-OGeWf-s22!##eW&fgilll!!'3/36J[$$
D$I"))+d2h
,E|UYZ`ZdZdeqZrUsu}  @F  G  	G [eWc#h:K:R:R:TUWZZZ[s   AB/ /C):$C$C)$C)z/camera/hls/stopc                      \        4       w  rV '       g	   R RRV/R3# \        P                  4        R RR\        P                  4       /# )r  Frp  r  Tr  )r  rp	  r  r  rQ  rb  s     r   camera_hls_stopr  _   sH    +-OGeWf-s22$"3":":"<==r   z/camera/hls/status.jsonc                  ~    \        4       w  rV '       g	   R RRV/R3# R RR\        P                  4       R\        4       /# )r  Frp  r  Tr  r6  )r  rp	  r  rD  r  s     r   camera_hls_status_jsonr  h   sD    +-OGeWf-s22$"3":":"<iI]I_``r   z/camera/hls/<path:filename>c                    \        4       w  rV'       g   VR 3# \        V 4      pV'       d-   RV9   g&   VP                  4       P                  R4      '       g   R# \	        \
        VRR7      pRVP                  R&   RVP                  R	&   VP                  4       P                  R4      '       d   R
VP                  R&   V# VP                  4       P                  R4      '       d   RVP                  R&   V# )r  r&  r  r  F)r  .no-store, no-cache, must-revalidate, max-age=0r`  ra  rb  z,application/vnd.apple.mpegurl; charset=utf-8Content-Typez
video/mp2t)r  r  )zinvalid hls filerD  )r  r1  r   r  r   r  re  )r5  rQ  rb  r  rN  s   &    r   camera_hls_filer  p   s    +-OGs{H%D3$;djjl&;&;<L&M&M&&~tGD$TDLL!'DLLzz|W%%'U^$ K 
		u	%	%'3^$Kr   /camera/setupc                  `    \        4       w  rV '       g   \        R VRRR7      R3# \        4       # )u   גישה נחסמהFr  r  r4  r  )r  r3  rg	  r  s     r   camera_setup_pager	     s1    +-OG !65Sbcehhh#%%r   z/camera/setup/status.jsonc                  B    \        4       w  r\        4       pWR &   WR&   V# access_allowedaccess_reason)r  r9	  rQ  rb  r   s      r   camera_setup_status_jsonr     s*    +-OG!#G '%ONr   z/camera/setup/opencvc            
         \        4       w  rV '       g   \        R VRRR7      R3# \        P                  P	                  R4      ;'       g    RP                  4       pV\        8w  d   \        RR\         2RRR7      R	3# \        4       P	                  R
4      '       d   \        RRRRR7      # \        RR7      w  r4\        V'       d   RMRVR,           VR\        \        4       4      R7      # )u   התקנת OpenCV נחסמהFr  r  r  confirmr   u   אישור חסרu;   כדי להתקין OpenCV צריך לכתוב בדיוק: rD  r  u   OpenCV כבר מותקןu\   אין צורך להריץ התקנה נוספת. אפשר לחזור למסך המצלמה.Tr  manualrQ	  u   התקנת OpenCV התחילהu   התקנת OpenCV כבר רצהuZ   

פתח את מסך סטטוס רכיבי מצלמה כדי לעקוב אחרי הלוג.)r  r4  r>  )r  r3  r   r  r   r   CAMERA_SETUP_CONFIRM_TEXTr  rL	  r   r9	  )rQ  rb  r  ru	  r   s        r   camera_setup_opencvr     s3   +-OG !?E\klnqqq||	*00b779G++ !48s  uN  tO  7P  UZ  et  u  wz  z  	z!!(++ !;  >\  ae  p  @  	@6HEG=Noqx  |Z  rZ  _f  q@  JM  Na  Nc  Jd  e  er   r  c                      \        4       # r   )r	  r  r   r   admin_camerar     r  r   r  c                      \        4       w  r\        P                  4       pVP                  \	        4       4       WR &   WR&   V# r  )r  r	  r  r   r  r  s      r   camera_status_jsonr     s@    +-OG##%GNN')* '%ONr   r  c                  2   \        4       w  rV '       g   VR 3# \        4       P                  R4      '       g   R	#  \        P	                  4       p\        V4      pRVP                  R&   RVP                  R&   V#   \         d   pRT 2R3u Rp?# Rp?ii ; i)
r  r  z
image/jpegr  r  r`  u   שגיאת מצלמה: r   Nu?   OpenCV לא מותקן. הרץ: py -m pip install opencv-pythonr  )r  r  r   r	  r  r   re  r   )rQ  rb  r  rg  r  s        r   camera_snapshotr     s    +-OGs{!%%h//UU4((* '+7(,\) 4(.334s   >A: :BBBBr  c                      \        4       w  rV '       g   VR 3# \        P                  4        \        R\	        4        24       RRRR/# )r  zvideo prepare requested by r  Tr   z&camera video handle released and ready)r  r	  r  r*  r  r  s     r   camera_prepare_videor     sH    +-OGs{%%'2=?2CDE$	#KLLr   r  c                  *   \        4       w  rV '       g   VR 3#  \        P                  4         \        P                  4        \
        P                  4        \        R\        4        24       RRRR/#   \         d     LRi ; i  \         d     LNi ; i)r  zfull camera reset requested by r  Tr   z'camera/audio/recording handles released)	r  r	  r  r   ro	  r	  r!  r*  r  r  s     r   camera_resetr     s    +-OGs{  "  6}6GHI$	#LMM    s"   A3 B 3B BBBr  c                      \        4       w  rV '       g   VR 3# \        4       P                  R4      '       g   R# \        \	        4       RRRRR/R7      # )	r  r  z)multipart/x-mixed-replace; boundary=framer`  r  X-Accel-Bufferingnor  re  r  )r  r  r   r   rv	  r  s     r   camera_streamr$     sj    +-OGs{!%%h//UU+-8cn}  @p  rE  GK  nL  M  Mr   r  c                  v    \        4       w  rV '       g   VR 3# \        P                  4        \        RRRR7      # )r  u   מצלמה כובתהu   המצלמה שוחררה והזרם הופסק. אם נורית המצלמה עדיין דולקת, סגור גם את דף השידור בדפדפן ורענן.Tr1  )r  r	  r  r3  r  s     r   camera_stopr&     sD    +-OGs{4  7[  `d  e  er   r  c                  h   \        4       w  rV '       g   VR 3# \        4       '       g   R#  \        P                  P	                  R4      R8H  p\
        P                  VR7       \        \
        P                  4       RRR	R
R/R7      #   \         d   pR\        T4      ,           R3u Rp?# Rp?ii ; i)r  r   r   )r   u   שגיאת אודיו: r   Nz
audio/mpegr`  r  r!  r"  r#  )uE   FFmpeg לא נמצא. נדרש FFmpeg כדי להזרים אודיו.r  )r  rK  r   r  r   r	  r)  r   r   r   r  )rQ  rb  r   r  s       r   camera_audio_streamr(     s    +-OGs{!##[[9,,""9-4!!'!2 '557,Yh  k[  ]p  rv  Yw  x  x  9(3s83S889s   8B B1B,&B1,B1r  c                     \        4       w  rV '       g	   R RRV/R3# \        4       pV'       g	   R RRR/R3# \        4       p\        V4      p. pVR,           F  pVP	                  R4      ;'       g    Rp\
        P
                  ! 4       pVR	R
RRRRRRRRV,           RRRRRR.p	 \        P                  ! V	RRRR^\        4       R7      p
TP                  RTRVP	                  R4      R V
P                  ^ 8H  RV
P                  R\        \
        P
                  ! 4       V,
          ^4      R V
P                  ;'       g    RR)R! /4       K  	  R \        ;QJ d    R" V 4       F  '       g   K   RM	  RM! R" V 4       4      R#VR$\!        4       R%,          R&VR'VR(\"        /#   \         d>   pTP                  RTRTP	                  R4      R RR\        T4      /4        R!p?EK  R!p?ii ; i)*r  Frp  r  u   FFmpeg לא נמצאr  r'  r   r   r  r  r  r  r0  r1  r  r  r  rt  r  r   r  nullrs  Tr   r   r3  rL  r  r{  rl  stderr_tailNc              3   B   "   T F  qP                  R 4      x  K  	  R# 5ir  Nr`  r   r   s   & r   r   )camera_audio_test_json.<locals>.<genexpr>!  s     37aeeDkk7r	  rC  r,  :Nr  Nr6  r  	audio_logr  )r  rK  rD  rl  r   r   rS  r^  rV  r  r{  rf  rz  r   r~  r  rr  r  )rQ  rb  rC  r6  rI  r  r  r   ru	  r_  r  r  s               r   camera_audio_test_jsonr1   !  s   +-OGeWf-s22#%FeW&<=sBB"$G+G4JG"~~wwv$$"))+~z;	4QXZfhmosu}  AE  vE  GK  MP  RW  Y]  _e  gj  k	k"s4dU\enxy  Ja  Jc  dINNHdHcggh6GyOcOcghOhjv  yB  yM  yM  OX  Z_  `d  `i  `i  `k  nu  `u  wx  Zy  {H  KT  K[  K[  Ka  Ka  _a  ch  ci  Jj  k  l  ##373###3733XvzSjSlmoSpr{  ~E  GP  RY  [f  h}  ~  ~  	kNNHdHcggh6GuV]_cdg_hijj	ks   %BF=FG'*1G""G'r  c                  v    \        4       w  rV '       g   VR 3# \        P                  4        \        RRRR7      # )r  u   אודיו כובהuC   שידור האודיו הופסק והמיקרופון שוחרר.Tr1  )r  r	  r  r3  r  s     r   camera_audio_stopr3  !  sA    +-OGs{24y  C  D  Dr   r  c            
         \        4       w  rV '       g   \        R VRR7      R3#  \        P                  P	                  R4      R8H  p\
        P                  VR7      p\        RRV 2R	\        \
        P                  4       4      R
7      #   \         dJ   p\        T4      \
        n
        \        R\        T4      R\        \        4       4      R
7      R3u Rp?# Rp?ii ; i)u   הקלטה נחסמהFr1  r  r  r   )r  u   הקלטה התחילהu   ההקלטה נשמרת אל:
Tr=  u   הקלטה לא התחילהr   N)r  r3  r   r  r   ro	  r)  r   r  r   r  rq	  )rQ  rb  r  r  r  s        r   camera_record_startr5   !  s    +-OG !8&UKSPP{\\%%l3s:
 &&*&= !:>]^d]e<fkoy|  ~M  ~T  ~T  ~V  zW  X  	X {%(X" !?Se]`aqas]tuwzzz{s   A$B C>CCCr  c            	      H   \        4       w  rV '       g   \        R VRR7      R3#  \        P                  4       p\        RRT;'       g    R 2R\	        \        P                  4       4      RR	7      #   \         d%   p\        R
\	        T4      RRR7      R3u Rp?# Rp?ii ; i)u    עצירת הקלטה נחסמהFr1  r  u   הקלטה נעצרהu   קובץ ההקלטה:
u   לא היה קובץ פעילTr  )r  r>  r4  u"   שגיאה בעצירת הקלטהr  r   N)r  r3  ro	  r  r   r  r   )rQ  rb  r  r  s       r   camera_record_stopr7  .!  s    +-OG !CVPUVX[[[z %%' !8<TU[U~U~_~T  ;A  FJ  TW  Xg  Xn  Xn  Xp  Tq  |K  L  	L z !Es3xTYdstvyyyzs#   #A2 
'A2 2B!=BB!B!r  c                      \        4       w  rV '       g   VR 3# RP                  R \        ^d4       4       4      ;'       g    RpR\        P                  ! \
        4       RV R2# )r  r   c              3   ,  "   T F  pR \         P                  ! VR,          4       R\        P                  ! R\        P                  ! VR,          4      4       R\        VR,          4       R\         P                  ! VR,          4       R2	x  K  	  R	# 5i)
z?<div style='border-bottom:1px solid #334155;padding:12px 0'><b>r   z$</b><br><span style='color:#94a3b8'>r   r  r  r  z'</span><br><a href='/camera/recordings/u)   ' target='_blank'>פתח/נגן</a></div>Nr~	  r	  s   & r   r   )camera_recordings_page.<locals>.<genexpr>?!  s     /D J(//Z^_eZfJgIh  iM  NR  N[  N[  \o  qu  q  q  @D  EL  @M  qN  NO  MP  PT  Ua  bf  gm  bn  Uo  Tp  pW  X`  Xg  Xg  hl  ms  ht  Xu  Wv  v_  	`/r	  u   <p>אין הקלטות.</p>u2  <!DOCTYPE html><html lang='he' dir='rtl'><head><meta charset='UTF-8'><meta name='viewport' content='width=device-width,initial-scale=1'><title>הקלטות מצלמה</title><style>body{margin:0;background:#07111f;color:white;font-family:Arial;padding:18px}.wrap{max-width:900px;margin:auto}a{color:#93c5fd}.card{background:#111827;border:1px solid #334155;border-radius:22px;padding:18px}</style></head><body><div class='wrap'><a href='/admin/camera'>⬅ חזרה למצלמה</a><h1>🎞️ הקלטות מצלמה</h1><div class='card'><p>תיקייה: <code></code></p>z</div></div></body></html>)r  r   r	  r   r   r  )rQ  rb  r  s      r   camera_recordings_pager<  :!  s    +-OGs{77 *3/  ' ' 
' 	 J	  K	S	  K	Z	  K	Z	  [	p	  K	q	  J	r	  r	}	  ~	B
  }	C
  C
]
  `
  `
r   z"/camera/recordings/<path:filename>c                     \        4       w  rV'       g   VR 3# \        P                  P                  T ;'       g    R4      pVP	                  4       P                  R4      '       g   R# \        \        VRR7      # )r  r   rA   F)r  )u   קובץ לא מורשהr  )r  r   r   r   r   r  r   r  )r5  rQ  rb  r   s   &   r   camera_recording_filer>  F!  s`    +-OGs{77HNN+D::<  ((..4d%PPr   r  c                  
   \         P                  P                  R 4      p V '       d   V P                  R8X  d   \	        RRRR7      R3# V P                  ;'       g    RpVP                  4       pVP                  R4      pVP                  R4      pV'       g   V'       g   \	        R	R
RR7      R3# V'       d   \        M\        p\         P                  '       d2   \         P                  VR,           8  d   \	        RRVR R2RR7      R3# \        P                  ! \        RR7       \        P                  ! \        RR7       \        P                  ! R4      pV'       d   RMRp\        P                   P#                  \        RV V 24      pRp	 V P%                  V4       V'       d   \        P                   P#                  \        RV R\        P&                  ! 4        24      p
\)        W4      w  rp	V'       gn   \        P*                  ! V4        V
'       d>   \        P                   P/                  V
4      '       d   \0        P2                  ! V
RR7       \	        RRRTR7      R3# T	pTpM@\5        V4      w  rV'       g(   \        P*                  ! V4       \	        RRRVR7      R3# TpRp\0        P6                  ! V\8        4       \;        \8        4      p\        P*                  ! V4       V	'       d7    \0        P2                  ! \        P                   P=                  V	4      RR7       \?        4       w  ppV'       g   \	        RR RVR7      R!3# \A        R"4      w  pp\C        R#R$\8        R%7      pR&\D        PF                  ! V4       R'V R(\8         R)V R*V R+\H         R,V R-V R.\J        PL                  ! VR^R/7       R0\N         R1\P         R22p\	        R3R4RVR7      #   \,         d     ELi ; i  \,         d     ELi ; i  \,         d     ELyi ; i  \,         d     EL6i ; i  \,         d     EL
i ; i  \,         Ed   p \        P                   PS                  T4      '       d   \        P*                  ! T4       M  \,         d     Mi ; i T	'       dx   \        P                   PS                  \        P                   P=                  T	4      4      '       d6   \0        P2                  ! \        P                   P=                  T	4      RR7       M  \,         d     Mi ; i\	        R5R6R\U        T4      R7      R!3u Rp?# Rp?ii ; i)7r  r   r
  L   בחר קובץ admin_server.py או ZIP עדכון אדמין להעלאה.Fr1  rD  r&  r     קובץ לא תקיןuk   ניתן להעלות כאן קובץ Python עם סיומת .py או ZIP עדכון אדמין מבוקר.    קובץ גדול מדיu?   הקובץ גדול מהמותר. המגבלה היא בערך r   r  r
  Tr   r  admin_server_upload_Nadmin_zip_extract_r  r  $   העלאת ZIP אדמין נדחתהuU   הקובץ הפעיל לא הוחלף. נמצאה בעיה בחבילת העדכון.r=  %   העלאת admin_server.py נדחתהuS   הקובץ הפעיל לא הוחלף. נמצאה בעיה בקובץ שהעלית.u"   קובץ Python ישיר תקין.u'   הגנת העדכון לא הופעלהu   הקובץ עבר בדיקה, אבל עדכון האדמין לא נשלח כי מנגנון ההגנה לא הוכן. הקובץ הפעיל לא הוחלף.r   zadmin-uploadapply_update*admin_upload_v34_3_control_server_failsafe)rb  r  u   מקור העלאה:
u   

בדיקת מקור:
u   

קובץ ממתין:
u   

SHA256 חדש:
u   

הגנת עדכון:
z#

Control Server:
http://127.0.0.1:z/

Bootstrap:
rR  

Request:
r   u   

לוג בקרה:
u   
לוג התקנה:
u   

העדכון ייחשב מוצלח רק לאחר אימות Runtime ו־SHA. בעדכוני v101 ומעלה לא מתוזמן ריסטארט מלא של Windows; במקרה כשל Control Server מבצע שחזור מבוקר כאשר v93 פעיל.u'   עדכון נשלח לשרת הבקרהu   הקובץ החדש עבר בדיקה ונשלח למנגנון העדכון החיצוני. הצלחה תיקבע רק לאחר אימות Runtime ו־SHA."   שגיאה בעדכון אדמין&   הקובץ הפעיל לא הוחלף.)+r   r  r   r5  r3  r   r  r(  r  r
  r   r   CONTROL_DIRr  r   r   r   r   r  r  r/  r  r   r  rF  r  r#  r  CONTROL_PENDING_ADMIN_PATHr  r   r  rK  write_control_requestr   r   rM  r   r  r  rC  r   r~  )r  r  
lower_nameis_pyis_zipr	  r  r  r  extracted_admin_pathr3  r.  r>  admin_candidate_pathsource_notenew_shafailsafe_okr  rW  rX  reqr  s                         r   r  r  T!  sT   ==V$D4==B& !9  <J  OT  U  WZ  Z  	ZMM''RM$$&J&E  (FV !9  <i  ns  t  vy  y  	y.4*:PE'"8"856>"I !;?~  @E  FG  H  HO  >P  UZ  [  ]`  `  	`KKd+KK$t4MM/*EV5Fww||04HPVx2XYHAS		(ww||$8<NugUVWYW`W`WbVc:deH3WX`3k0E0YYx('BGGMM($;$;V]]8cg=h()O  Ri  ns  }D  E  GJ  J  J#7 !K9(CNEYYx(()P  Sh  mr  |C  D  FI  I  I#+ >K)+EF89YYx bggoo.BCSWX &G%H"]$%N  Qp  uz  DQ  R  TW  W  W'?'O$n#N;g  wQ  R$X__]%C$D E%%0M 2%%?$@ A&i (%%2O 411= ?'.N+; <CeAFG H!!1 2 3##="> ?G
G 	 !!J  Mk  pt  ~E  F  	F] !&$& !&$& !&$& $  .  
S	ww~~h''8)< 			#rwwG[7\(](]bggoo.BCSWX 		 !EGoty  DH  IL  DM  N  PS  S  	S
SsA  P< +AP< >O" O4 $O4 O4 P< +P< P P< ,.P< P 0P< 95P* .%P< BP< "O1-P< 0O11P< 4P?P< PP< PP< PP< P'#P< &P''P< *P95P< 8P99P< <U	;RURURUTAT!5TUT%"U$T%%UUUr   c                      \        R 4      w  r\        RRR7      p\        RRRRV  RV R	\        P                  ! VR
^R7       R\
         2R7      # )zmanual-restartrestart_admin manual_panel_restart_v34_control)rb  u'   אתחול נשלח לשרת הבקרהuy   שרת הבקרה החיצוני יאתחל את פאנל האדמין הראשי. המתן כמה שניות ורענן.TzControl bootstrap: rR  rJ  Fr   z

Control log:
r=  )rK  rO  r3  r   r  r  )rW  rX  rX  s      r   restart_admin_serverr\  !  s    #;<L#M L
8Z
[CF  ID  IM  Yl  my  lz  z}  ~L  }M  M[  \`  \f  \f  gj  y~  GH  \I  [J  J\  ]m  \n  Wo  p  pr   r!  c            	      v   \        4       p V '       g   \        R RRR7      R3#  \        V 4      w  rV'       g   \        RRRVR7      R3# \        R	4      p\        P
                  ! V \        4       R
pRV  RV 2p\        RVRVR7      #   \         d%   p\        RRR\        T4      R7      R3u Rp?# Rp?ii ; i)   אין גיבוי לשחזורB   לא נמצא קובץ גיבוי בתיקיית הגיבויים.Fr1  rM  '   הגיבוי האחרון לא תקיןuM   הגיבוי לא שוחזר כי הוא לא עבר בדיקת תקינות.r=  rD  admin_server_before_restoreu   הגיבוי האחרון שוחזר אל admin_server.py. לחץ בדיקת אתחול פאנל — מתקדם כדי להפעיל אותו.u   שוחזר מתוך:
uT   

גיבוי בטיחות לגרסה שהייתה פעילה לפני השחזור:
u"   שחזור גיבוי הסתייםT"   שגיאה בשחזור גיבוי   השחזור לא הושלם.r   N)	rA  r3  r#  r>  rF  r  r  r   r~  )r  r.  r>  safety_backupr  detr  s          r   restore_admin_server_backuprf  !  s#   %'K !A  DH  MR  S  UX  X  	X
J5kB$%N  Q`  ej  t{  |  ~A  A  A34QR["34 ^&{m  4K  LY  KZ  [ !Est]`aa J !EGfkpz~  @C  {D  E  GJ  J  	JJs#   %B	 
>B	 	B8B3-B83B8zeitan-tripserver-artifact/v1zeitan-platform-artifactz$^[A-Za-z0-9][A-Za-z0-9._+\-]{0,127}$z!2026.07.15-FX-WALLETS-CHILDREN-v6zvacation-budget-appforeign_budget_sourcesido_private_budgetmichael_private_budgetexpense_budget_ownervisible_version_badgebudgetSourcesRowstripIdoBudgetInputtripMichaelBudgetInputbudgetOwnerbudgetAppVersionBadgec                   \         P                  ! R\         P                  ! \        4      ,           R,           \	        T ;'       g    R4      \         P
                  \         P                  ,          R7      pV'       g   R#  \        P                  ! VP                  ^4      P                  4       4      p\        T\        4      '       g   R# TR3#   \         d*   pRRTP                  P                  ,           3u Rp?# Rp?ii ; i)	zReturn the embedded EITAN artifact identity JSON, or a structured error.

The block must be placed in the HTML head and use:
<script id="eitan-platform-artifact" type="application/json">...</script>
z<script\b[^>]*\bid=["\']z["\'][^>]*>(.*?)</script\s*>r   r  Nzidentity_json_invalid:)Nidentity_block_missing)Nidentity_json_not_object)r  r  r   "EITAN_ARTIFACT_IDENTITY_ELEMENT_IDr   r  r  r   rv  r  r   r   	__class__r\  r   r   )rY  r
  r   r  s   &   r   extract_eitan_artifact_identityrv  !  s     II#bii0R&SSVuuDJJBddRTTkE
 --G**U[[^1134 gt$$//B;	  G-0F0FFFFGs   3C DC?9D?Dc                 v   . p\        V \        4      '       g   R .# V P                  R4      \        8w  d   VP	                  R4       \        V P                  R4      ;'       g    R4      P                  4       p\        V P                  R4      ;'       g    R4      P                  4       p\        V P                  R4      ;'       g    R4      P                  4       pV'       d   WQ8w  d   VP	                  R4       V'       d   Wb8w  d   VP	                  R4       V'       d   \        P                  V4      '       g   VP	                  R4       V P                  R4      p\        V\        4      '       d;   \        ;QJ d    R V 4       F  '       g   K   RM	  R	M! R V 4       4      '       d   VP	                  R
4       \        4       p	MV U
u0 uF  qP                  4       kK  	  p	p
\        \        V4      V	,
          4      pV'       d(   VP	                  RRP                  V4      ,           4       V# u up
i )identity_missingr  artifact_idr   artifact_typer  featuresc              3      "   T F7  p\        V\        4      '       * ;'       g    VP                  4       '       * x  K9  	  R # 5ir   )r   r   r   r  s   & r   r   3validate_eitan_artifact_identity.<locals>.<genexpr>"  s0     0obn]^Z35G1G1X1Xqwwy=1Xbns
    AATFfeatures_formatzfeatures_missing:r   )r   r   r   EITAN_ARTIFACT_CONTRACT_SCHEMAr  r   r   EITAN_ARTIFACT_VERSION_PATTERNr  r  r  r  r  r   )identityexpected_idexpected_typerequired_featuresrZ  ry  rz  r  raw_featuresfeature_setr  missing_featuress   &&&&        r    validate_eitan_artifact_identityr  !  s   Fh%%"##||H!??hhll=177R8>>@K_5;;<BBDM(,,y)//R0668G{1m$7o&8BB7KKi <<
+LlD))SS0obn0oSSS0obn0o-o-o'(e*67,Qwwy,7c"34{BC)CHH5E,FFGM	 8s   H6c           
      P   R V R\         P                  P                  V 4      RRR/ R\        /pVR,          '       g   RVR&   V#  \	        V 4      P                  4       pVP                  RR	R
7      p\        V4      VR&   \        P                  ! V4      P                  4       VR&   RVR,          P                  4       9   ;'       g    RVR,          P                  4       9   VR&   \        P                  4        UUu/ uF
  w  rEWEV9   bK  	  ppp\        V4      w  rxVe   \!        V\"        \$        \&        R7      MT;'       g    R.p	\)        VRJ;'       d)    V	'       * ;'       d    \+        VP-                  4       4      4      p
\)        \.        V9   ;'       d    \+        VP-                  4       4      4      p\1        T;'       g    / P3                  R4      ;'       g    V'       d   \.        MR4      pWR&   T;'       g    / VR&   WR&   V
'       d   RMV'       d   RMRVR&   R\)        V4      /VCVR&   VP                  4        UUu. uF  w  rMV'       d   K  VNK  	  ppp\)        VR,          ;'       d    T
;'       g    T4      VR&   VR,          '       g   RVR&   V# V'       d   RRP5                  V4      ,           VR&   V# V
'       g$   V'       g   R RP5                  V	4      ,           VR&   V# u uppi u uppi   \6         d   p\9        T4      TR&   Tu Rp?# Rp?ii ; i)!r   r   r.  Fmarkerscontract_schemafile_not_foundrp  r   r   ry  r  r  z<!DOCTYPE html:Ni  N<html:Ni  Nr	  Nr  r  r  rx  r  r   r  identity_errorsartifact_contract_v1	legacy_v6invalidcontract_modehtml_structure_missingzmissing_required_features: ro  zartifact_contract_invalid: )r   r   rg  r  r   
read_bytesr|  r,  r  r  r  r  r   BUDGET_APP_REQUIRED_MARKERSr  rv  r  BUDGET_APP_EXPECTED_ARTIFACT_ID!BUDGET_APP_EXPECTED_ARTIFACT_TYPEBUDGET_APP_REQUIRED_FEATURESru  r	  r  "BUDGET_APP_LEGACY_REQUIRED_VERSIONr   r   r   r   r~  )r   r  r.  rY  rT  r  feature_markersr  identity_errorr  contract_validlegacy_validr  presentmissing_markersr  s   &               r   inspect_budget_app_filer  "  s   "''..&29D >>(W(4j##%zz')z43xV ,668X'4:+;+;+==__DQVKL]L]L_A_VB]BcBcBefBe;33$.Bef#B4#H  ! ;7;:	

 )7(L(L:L'M 	 hd2ll?7JllsSbSiSiSkOlm.$6 . .O**,-

 x~~2**95uu`l:\rtv!Y#>>rZ"1:H 6^j{py_$d7mGGY3B3H3H3JZ3J<3RY333JZT&\NN~/M/MOWF||4DM
 	 9DIIo<VVDM   9DIIo<VVDM= g* [  S	Ws   BL  5L  <K47L  L  L  '2L  +L  L  L  (L  L  ,L  	K:K: L  8	L  L  L  "L  *L  L  L  L  4L   L%L L% L%zinstall_receipt.jsonzinstall_attempt.jsonc                     \        V P                  R 4      4      pV'       d   RMRp\        P                  ! RT RT;'       g    / /R^R7      p\	        VRW$R7      # )	r.  B   אפליקציית התקציב תואמת לחוזה ההתקנהM   אפליקציית התקציב אינה עומדת בחוזה התאימות	installedreceiptFr   u   הבדיקה קוראת ישירות את C:\TripServer\Moneyapp\index.html ומאמתת זהות, גרסה ויכולות נדרשות.r=  )ru  r   r   r  r3  )r  r  r  r   r>  s   &&   r   budget_status_htmlr  P"  se    	dhhw	 BTVP  ]lEjj+tY2FUZcdeGU  %r  wy  K  Kr   z/admin/budget-app/statusc                  >   \         P                  P                  \        R ,          R4      p \	        V 4      p/ p/ p \         P                  P                  \        4      '       d4   \        P                  ! \        \        4      P                  RR7      4      p \         P                  P                  \        4      '       d4   \        P                  ! \        \        4      P                  RR7      4      p\        P                  ! RTRTRT/R	^R
7      p\        TP!                  R4      4      pT'       d   RMRp\#        TRYeR7      T'       d   ^3# R3#   \         d   pR\        T4      /p Rp?LRp?ii ; i  \         d   pR\        T4      /p Rp?LRp?ii ; i)r*   r-   r   r   rp  Nr  r  last_install_attemptFr   r.  r  r  u   הבדיקה קוראת ישירות את C:\TripServer\Moneyapp\index.html, מאמתת את חוזה הזהות ומציגה גם את ניסיון ההתקנה האחרון.r=  i  )r   r   r   r  r  rg  BUDGET_APP_RECEIPTr   rv  r   r  r   r~  BUDGET_APP_ATTEMPT_LOGr  ru  r   r3  )r  r  r  attemptr  r>  r  r   s           r   budget_app_statusr  V"  st   WW\\'*-|<F"6*DGG'77>>,--jj&8!9!C!CW!C!UVG'77>>011jj&<!=!G!GQX!G!YZG jj+tYAWY`apu~  AG	dhhw	 BTVP  ]lEU  %Y  ^`  r  |~  ux  H  H  DG  H  H  'DI&'
  'DI&'s6   AE (E: 3E: E7 E22E7:FFFc                    R \         P                  ! 4       P                  RR7      RT R\        '       d   \        P                  MRR\        '       d   \        P
                  MRR\        '       d   \        P                  MRR\        '       d   \        P                  MR	R
\        '       d   \        P                  MRRVe   \        VRR4      MRRT;'       g    / /	p \        P                  ! \        R,          RR7       \        \        4      P                  \         P"                  ! VR^R7      RR7       V#   \$         d     T# i ; i)atrl  r  stagerequest_pathr   request_methodr  r
  Nr  r5  r   r*   Tr   Fr   r   r   )r   r  r
  r   r   r  r  r
  r  rR  r   r   r  r   r  r  r   r  r   )r  uploadedr   r   s   &&& r   record_budget_install_attemptr  l"  s    hlln&&	&:RGG'..,,RGG'00ggw**29MGHj"5SU"
G
GJ'$7#$//

7QV_`0als/t N  Ns    AD< <E
Ec                ,
   \        RV 4       V '       d   V P                  '       g   \        RRRR7      R3# \        V P                  4      R09  d   \        RR	RR7      R3# \        P
                  ! \        R
,          RR7       \        P                  ! RR\        R
,          R7      w  r\        P                  ! V4       \        P                  P                  \        R
,          R4      pRp V P                  V4       \        RV RVR\        P                  P                  V4      /4       \        V4      pVP                  R4      '       gK   \!        V4      R3 \        P                  P#                  V4      '       d   \        P$                  ! V4       # # \        P                  P)                  V4      '       d   \        P                  P                  \*        RR
4      p\        P
                  ! VRR7       \        P                  P                  VR\,        P.                  ! R4      ,           R,           4      p\0        P2                  ! W44       \        P4                  ! W#4       \        V4      pVP                  R4      '       d&   VP                  R4      VP                  R4      8w  dO   V'       d<   \        P                  P)                  V4      '       d   \0        P2                  ! WC4       \7        R4      hR\8        P:                  ! 4       P=                  RR7      RV P                  RTRVP                  R4      ;'       g    R R!\>        R"VP                  R"4      RVR,          RVR,          R#VR$R%/
p\A        \B        4      PE                  \F        PH                  ! VR^R&7      R'R(7       \        R)W4       \        R*R+R\F        PH                  ! VR^R&7      R,7       \        P                  P#                  V4      '       d   \        P$                  ! V4       # #   \&         d     # i ; i  \&         d     # i ; i  \&         ds   p	\        R-R.R\K        T	4      R,7      R/3u Rp	?	 \        P                  P#                  T4      '       d   \        P$                  ! T4       # #   \&         d     # i ; iRp	?	ii ; i   \        P                  P#                  T4      '       d   \        P$                  ! T4       i i   \&         d     i i ; i; i)1zOValidate and atomically install Moneyapp through the established /upload route.request_receivedr
  u:   בחר קובץ HTML של אפליקציית התקציב.Fr1  rD  r"   rA  u0   ניתן להתקין כאן רק קובץ HTML.r*   Tr   budget_upload_)r  r  r  r-   Ntemporary_file_saved	temp_pathr  r.  rC   index_before_budget_r  r   post_install_verification_failedinstalled_atrl  r  source_filenamer  r  r   r  r  rD   upload_routez/upload/Moneyappr   r   r   installation_completedu7   התקנת אפליקציית התקציב הושלמהu   הקובץ הוחלף דרך מנגנון ההעלאה הראשי, נקרא מחדש מהדיסק וכל התכונות הנדרשות אומתו.r=  u5   התקנת אפליקציית התקציב נכשלהu5   הגרסה הקודמת נשמרה או שוחזרה.r   rN  )&r  r5  r3  r6  r   r   r  r	  mkstempr  r   r   r  r  r  r   r  r   r  r   rg  r  r   r   rF  r  r   r  r   r  r
  r  r   r  r  r   r  r~  )
r  fdr  r  rD   r   rE  r  r  r  s
   &         r   install_budget_app_uploadedr  "  sA   !"4h?8,,, !9;w  }B  C  EH  H  	H!!"*;; !9;mrwxz}}}KK
#d3$$,<WRYZdRefMBHHRLWW\\'*-|<FF&i %&<hV_agikipipixix  zC  jD  IE  	F+I6	}}W%%%i0#5<	ww~~i(("))I*>(= 77>>&!!h	:FJKK
T2WW\\*.Dt}}UdGe.eho.opFLL(


9%+F3	}}W%%x)@IMMRZD[)["''..00V,ABBHLLN44i4Hx00fy}}Y/<<9=Y]]?;If%i)f.
 	 ++DJJwU[\,]ho+p%&>R !Z  ]q  vz  DH  DN  DN  OV  ej  st  Du  v	ww~~i(("))I*>( 		y 		  u !X  [R  W\  fj  kn  fo  p  ru  u  	u	ww~~i(("))I*>( 		u	ww~~i(("))I*>( 		s   .A-Q ;P!$Q >C9Q 8$Q A,Q 
BQ $;P2!P/.P/2Q ?Q S R;'S (S -;R**R87R8;S  S T;T TTTTTz/admin/budget-app/installc                  R    \        \        P                  P                  R 4      4      # )r  )r  r   r  r   r  r   r   install_budget_appr  "  s     'w}}'8'8'@AAr   r"  c           	         V \         9  d   \        R RRR7      R3# \        P                  P	                  R4      pV'       d   VP
                  R8X  d   \        RRRR7      R	3# V R
8X  d   \        V4      # V \        9   d+   \        VP
                  4      R9  d   \        RRRR7      R	3#  \        W4      w  r#RVR,           RVR,          R RVR,           2pVP	                  R4      '       d   VRVR,           2,          p\        RRV R2RVR7      #   \         d%   p\        RRR\        T4      R7      R3u Rp?# Rp?ii ; i) u   תיקייה לא מוכרתuP   היעד שנבחר אינו קיים במפת התיקיות של האדמין.Fr1  rM  r  r   r
  ;   בחר קובץ מתאים ולאחר מכן נסה שוב.rD  r*   rA  u;   לאזור הזה ניתן להעלות רק קובץ HTML.   יעד:
r      

גודל:
r  r    bytes

SHA256:
r  rD      

גיבוי קודם:
r  u%   הקובץ נשמר בהצלחה כ־uQ   . אם אתה רואה גרסה ישנה, פתח מחדש עם רענון מלא.Tr=  r  u[   הקובץ לא נשמר. הקובץ הקודם נשאר במקומו אם היה קיים.r   NrN  )r  r3  r   r  r   r5  r  r  r6  r  r   r~  )rc   r  r5  r9  r>  r  s   &     r   uploadr  "  s   W !?  BT  Y^  _  ad  d  	d==V$D4==B& !9;x  ~C  D  FI  I  	I*400$--!8@Q!Q !9;x  ~C  D  FI  I  	I}-f;fVn-_VF^A<NNabhiqbrast::h3F84D3EFFG !:>cdlcm  n  =@  EI  SZ  [  	[ } !:  =Z  _d  nr  sv  nw  x  z}  }  	}}s   ,A*D E"E;EEr#  c                    \         P                  P                  R 4      pV'       d   VP                  R8X  d   \	        RRRR7      R3# \        VP                  4      R9  d   \	        RRRR7      R3# \        W4      pV'       g   \	        R	R
RR7      R3# Vw  r4RVR,           RVR,          R RVR,           2pVP                  R4      '       d   VRVR,           2,          p\	        RRV 2RVR7      # )r  r   r
  r  Fr1  rD  rA  E   ניתן להעלות כאן רק קובץ HTML של מצגת יפן.   סוג מצגת לא מוכרJ   לא נמצא יעד שמירה מתאים למצגת יפן שנבחרה.rM  r  r   r  r  r   r  r  rD   r     מצגת יפן הועלתה'   הקובץ נשמר בשם הקבוע: Tr=  rN  )r   r  r   r5  r3  r6  r  rg   r  rX  r5  r9  r>  s   &     r   upload_presentationr  "  sJ   ==V$D4==B& !9;x  ~C  D  FI  I  	I&77 !9  <C  HM  N  PS  S  	S#$4;E !@  CO  TY  Z  \_  _  	_H&.)8JJ]^dem^n]opGzz(/x0@/ABB;?fgofp=qvz  EL  M  Mr   r$  c                 p   \         P                  P                  R 4      pV'       d   VP                  R8X  d   \	        RRRR7      R3# \        VP                  4      R9  d   \	        RRRR7      R3# \        W4      pV'       g   \	        R	R
RR7      R3# Vw  r4RVR,           RVR,          R RVR,           2pVP                  R4      '       d   VRVR,           2,          pTR\        P                  ! VP                  R4      ;'       g    / R^R7      ,           ,          p\	        RRV R2RVR7      # )r  r   r
  r  Fr1  rD  rA  uI   ניתן להעלות כאן רק קובץ HTML של מצגת ארה״ב.r  uN   לא נמצא יעד שמירה מתאים למצגת ארה״ב שנבחרה.rM  r  r   r  r  r   r  r  rD   r  u(   

מנוע תמונות/סרטונים:
r.  r   u    מצגת ארה״ב הועלתהr  uA   , מנוע הסרטונים הותקן והסנכרון אומת.Tr=  rN  )	r   r  r   r5  r3  r6  r  r   r  r  s   &     r   upload_usa_presentationr  "  s   ==V$D4==B& !9;x  ~C  D  FI  I  	I&77 !9  <G  LQ  R  TW  W  	W!"29E !@  CS  X]  ^  `c  c  	cH&.)8JJ]^dem^n]opGzz(/x0@/ABB<tzz&**UpJqJwJwuw  GL  UV  @W  W  WG?Cjksjt  uv  Bw  |@  JQ  R  Rr   r%  r&  c                     \         P                  P                  R R4      P                  4       p \         P                  P                  RR4      P                  4       p\         P                  P                  R4      pV'       d   VP
                  R8X  d   \        RRRR7      R	3#  \        WV4      pV'       g   \        R
RRR7      R3# VP                  R4      R8X  d   RMRpRVP                  RR4       RV RVR,           RVR,          R RVR,           RVR,           RVP                  R^ 4       RVP                  R ^ 4      R! R"2pVP                  R#4      '       d9   TR$R%P                  VP                  R#4      ;'       g    . 4      ,           ,          pVR&\        VP                  R'4      4      ,           ,          pTR(\        P                  ! VP                  R)4      ;'       g    / R^R*7      ,           ,          p\        V R+2V R,V  R-VP                  RR.4       R/2R0VR17      #   \         d%   p\        R2R3R\        T4      R17      R	3u R4p?# R4p?ii ; i)5r;  r   r  r_   r  r
  r  Fr1  rD  u   שקף לא מוכרuY   מפתח המדיה שנשלח אינו תואם לשקף קיים במצגת ארה״ב.rM  rx  r  u
   סרטוןu
   תמונה   יעד תצוגה: r,  u   
סוג מדיה: u   
יעד קובץ:
r   r  r  r   r  r  u   

מצב שמירה:
r  &   

מספר סרטונים במצגת: rH     
סך ציר זמן: rI  r  r  r-     

אזהרות תזמון:
ru  rL  rS      

מנוע מצגת:
r.  r   u    מצגת ארה״ב הועלהu2    החליף את המדיה הקודמת בשקף u
    עבור u   היעדuN   . ציר הזמן וה־manifest של היעד שנבחר חושבו מחדש.Tr=  u    שגיאה בהעלאת מדיהu   הקובץ לא נשמר והמדיה הקודמת נשארה. בדוק פורמט, שם שקף ואורך הסרטונים מול משך השיר.N)r   r  r   r   r  r5  r3  r9  r   r@  r   r  r   r~  )r;  r  r  r9  kind_her>  r  s          r   upload_usa_imager  "  s      b1779I\\%%h8>>@N==V$D4==B& !9;x  ~C  D  FI  I  	I,YnM$%;  >Y  ^c  d  fi  i  i"(**V"4"?,\!&**^R"@!A B  'y )!!' 0 1 .+ ,x() *##)&>"2 3339::mQ3O2P Q##)::.F#J3"O{\ 	 ::)**7$))FJJObDcDiDigi:jjjG6.vzz'/BCCC-

6::Fa;b;h;hfhw|  FG  1H  H  	H i67iI)T^_e_i_ijx  {E  `F  _G  GU  V	
 	
   . bI	

  	s9   &#H/ 
BH/ $$H/ 	A$H/ .A H/ /I:IIIr'  r(  c            
         \         P                  P                  R R4      P                  4       p \         P                  P                  R4      pV'       d   VP
                  R8X  d   \        RRRR7      R3# VP
                  ;'       g    RpVP                  4       P                  R	4      '       g   \        R
RRR7      R3# \         P                  '       d:   \         P                  \        R2,           8  d   \        RR\        R R2RR7      R3#  \        W4      w  r4rVRVP                  RR4      ,           R,           pTRV'       d   RP                  V4      MR,           ,          pVRVP                  R^ 4       2,          pVRVP                  R^ 4      R R2,          pVP                  R4      '       d9   TRRP                  VP                  R4      ;'       g    . 4      ,           ,          pTR\        P                  ! VP                  R4      ;'       g    / R^R 7      ,           ,          pV'       d'   VR!RP                  VR",          4      ,           ,          pV'       d'   VR#RP                  VR",          4      ,           ,          p\        R$R%\        V4       R&VP                  RR'4       R(2R)VR*7      #   \         P"                   d    \        R+R,RR7      R3u # \$         d%   p\        R+R-R\'        T4      R*7      R3u R.p?# R.p?i\(         d%   p\        R/R0R\+        T4      R*7      R13u R.p?# R.p?ii ; i)3r  r_   r  r   r
  r  Fr1  rD  r  rA  uP   ניתן להעלות כאן רק ZIP של תמונות וסרטוני מצגת.rC  -   קובץ המדיה גדול מהמגבלה: r   r  r
  r  r,  ru  u&   נשמרו בתיקיית המדיה:
u   לא נשמרו קבצים.r  rH  r  rI  r  r  r-  r  r  r.  r      

דולגו:
:N   Nu;   

שקפים שעדיין אין להם קובץ מדיה:
u    ZIP מדיה ארה״ב נטעןr  u    קובצי מדיה ל־u   יעד נבחרur   . כל הסרטונים אומתו, וציר הזמן וה־manifest של היעד שנבחר חושבו מחדש.Tr=     ZIP לא תקיןW   הקובץ שהועלה אינו ZIP תקין או שלא ניתן לפתוח אותו.uj   הקובץ לא עומד במגבלות או בתנאי הסנכרון. לא בוצע שינוי חלקי.Nu   שגיאה בהעלאת ZIPua   לא ניתן היה לעבד את קובצי המדיה. הפעולה בוטלה ושוחזרה.r       )r   r  r   r   r  r5  r3  r   r  r
  rH  r\  r   r   r  r,  rI  r)  r  r   r   r~  )	r  r  r  rS  r  r[  target_resultr>  r  s	            r   upload_usa_images_zipr  #  s    \\%%h8>>@N==V$D4==B& !9;x  ~C  D  FI  I  	IMM''RM ))&11 !9  <N  SX  Y  [^  ^  	^'"8"8;RUd;d"d !;?l  nE  FG  mH  HO  >P  UZ  [  ]`  `  	`G4STX4i17'-*;*;NB*OORVV<W_		(@S  fC  D  	D=m>O>OP]_`>a=bcc+M,=,=>VXY,Z[^+__jkk0117$))MDUDUViDjDpDpnp:qqqG-

=;L;LMh;i;o;omo  D  MN  1O  O  	O*TYYwt}-EEEGWZ^ZcZcdklpdqZrrrG .#h-(A-BSBSTbduBvAw  xj  k	
 	
  ` !4  7P  UZ  [  ]`  `  	` E !4  7c  hm  wz  {~  w  @  BE  E  	E G !>  Ad  in  x|  }@  xA  B  DG  G  	GGsb   B'J= :$J= <J= J= :-J= (AJ= =%L?$L?-L?.LL?L?L?L:4L?:L?r)  c                    \         P                  P                  R 4      pV'       d   VP                  R8X  d   \	        RRRR7      R3# \        VP                  4      R9  d   \	        RRRR7      R3# \        W4      pV'       g   \	        R	R
RR7      R3# Vw  r4RVR,           RVR,          R RVR,           2pVP                  R4      '       d   VRVR,           2,          p\	        RRV 2RVR7      # )r  r   r
  r  Fr1  rD  rA  u0   ניתן להעלות כאן רק קובץ HTML.u   סוג קובץ לא מוכרuL   לא נמצא יעד שמירה מתאים לקובץ ארה״ב שנבחר.rM  r  r   r  r  r   r  r  rD   r  u'   קובץ ארה״ב נוסף הועלהr  Tr=  rN  )r   r  r   r5  r3  r6  r  )r  r  rX  r5  r9  r>  s   &     r   upload_usa_extra_htmlr  D#  s9   ==V$D4==B& !9;x  ~C  D  FI  I  	I&77 !9;mrwxz}}}	0E !@  CQ  V[  \  ^a  a  	aH&.)8JJ]^dem^n]opGzz(/x0@/ABBFJqrzq{H|  BF  PW  X  Xr   r  c                 X    \         P                  P                  R R4      p\        W4      # )rd  r   )r   r  r   rA  )r  rd  s   & r   %confirm_japan_experience_music_uploadr  U#  s#    \\h+F0??r   r*  c                    \         P                  P                  R 4      pV'       d   VP                  R8X  d   \	        RRRR7      R3# \         P
                  '       dB   \         P
                  \        R$,           8  d"   \	        RR\        \        4       R	2RR7      R
3# V R8X  d   \        V4      # \        W4      pV'       g   \	        RRRR7      R3# \        RW4      pRRP                  VR,           Uu. uF  qDR,          NK  	  up4      ,           RVR,           2,           pVR\        VP                  R4      4      ,           ,          pVR\        V4      ,           ,          pVP                  R4      '       dN   V R8X  d8   VP                  R4      '       d   \	        RRRVR7      # \	        RRRVR7      ^3# \	        R R!RVR7      # \	        R"R#RVR7      ^3# u upi )%r  r   r
  r  Fr1  rD  r
  r
  r(  r
  rl   !   סוג מוזיקה לא מוכרuQ   לא נמצא יעד שמירה מתאים לקובץ המוזיקה של יפן.rM  r'   rJ  ru  r  r   rK  r  rL  rS   rm  rn  rI  uw   השיר נשמר, משך השיר זוהה, וכל שקפי מצגת יפן סונכרנו לפי האורך החדש.Tr=  uA   מוזיקת יפן נשמרה — סנכרון מצגת נכשלu   השיר נשמר ומשך השיר זוהה, אך סנכרון שקפי מצגת יפן נכשל. אין אישור שהמצגת מסונכרנת.u+   מוזיקת פתיח טיסה הועלתהu   הקובץ נשמר ומשך השיר זוהה. פתיח הטיסה הוא מקטע נפרד ולכן japan-experience.html לא שונה.uA   מוזיקת יפן נשמרה — בדיקת אורך נכשלהo   השיר נשמר, אבל ffprobe לא הצליח לזהות משך תקין. אין אישור לסנכרון.r  )r   r  r   r5  r3  r
  r  r  rB  r  r{  r   r@  r  )r  r  r9  duration_statusr  r>  s   &     r   upload_japan_musicr  [#  s   ==V$D4==B& !9;x  ~C  D  FI  I  	I'"8"8;QT_;_"_ !HL{  }I  J`  }a  |b  bc  Kd  in  o  qt  t  	t,,EdKKi.F !D  GZ  _d  e  gj  j  	j=gyYO 499viGX-YGXt6llGX-Y#ZZ_y  {A  BJ  {K  zL  ^M  MGv*6::g+>???Gv5oFFFG=))00""#344()g  jc  hl  v}  ~  ~$%h  k@  EJ  T[  \  ^a  a  a !N  Q]  bf  pw  x  	x`  cT  Y^  ho  p  ru  u  u .Zs   8G
r+  c            	         \         P                  P                  R 4      p V '       d   V P                  R8X  d   \	        RRRR7      R3# V P                  ;'       g    RP                  4       P                  R4      '       g   \	        RR	RR7      R3# \         P                  '       d:   \         P                  \        R!,           8  d   \	        R
R\        R R2RR7      R3#  \        V 4      w  rpRV'       d   RP                  VR,          4      MR,           pV'       d'   VRRP                  VR,          4      ,           ,          pV'       d'   VRRP                  VR,          4      ,           ,          p\	        RR\        V4       R2RVR7      #   \        P                   d    \	        RRRR7      R3u # \         d%   p\	        RRR\        T4      R7      R3u R p?# R p?ii ; i)"r  r   r
  r  Fr1  rD  r  rA  :   ניתן להעלות כאן רק ZIP תמונות יפן.rC  r  r   r  r
     יובאו:
ru  N   N   לא יובאו תמונות.(   

הוחלפו קבצים קיימים:
Nx   Nr      ZIP תמונות יפן נטעןr  u(    תמונות תחת JAPAN/media/images.Tr=  r  r  "   שגיאה בהעלאת ZIP יפן;   לא ניתן היה לעבד את קובץ התמונות.r   Nr  )r   r  r   r5  r3  r   r  r
  r  r  r   r,  rI  r)  r   r~  )r  rS  r  r  r>  r  s         r   upload_japan_images_zipr  t#  sF   ==V$D4==B& !9;x  ~C  D  FI  I  	IMMR&&(11&99 !9;w  }B  C  EH  H  	H'"8"8;UXc;c"c !;?l  nH  IJ  mK  KR  >S  X]  ^  `c  c  	ch)>t)D&;!(TYYx~%>PopDtyyQ\]aQbGcccG*TYYwt}-EEEG !C{SVW_S`Ra  bJ  FK  PT  ^e  f  	f ` !4  7P  UZ  [  ]`  `  	` h !E  HE  JO  Y]  ^a  Yb  c  eh  h  	hhs7   ">F !-F AF %G&8G&G&G!G&!G&r-  c           	         \        V 4      ;'       g    \        V 4      pV'       g   \        R RRR7      R3#  \        V4      w  r#\	        VR\
        P                  P                  V4      RR^ R7      pRVP                  R	&   WP                  R
&   \        VP                  RR4      4      VP                  R&   V#   \         d%   p\        RRR\        T4      R7      R3u Rp?# Rp?ii ; i)   טיול לא מוכרuW   לא נמצאה תיקיית טיול פעילה עם index.html עבור הבחירה.Fr1  rM  Tapplication/zipr  r  r  r  r  r  r`  zX-TripServer-Netlify-Tripr  r   X-TripServer-Netlify-Files%   יצירת ZIP ל־Netlify נכשלהub   לא הצלחתי להכין את חבילת Netlify. הקבצים המקוריים לא שונו.r=  r   N)r  v58_normalize_generic_trip_keyr3  build_netlify_deploy_zip_v58r	   r   r   r   re  r   r   r   r~  rr   trip_keyrP  r>  rg  r  s   &     r   admin_netlify_downloadr  #  s   )$/WW3QRV3WH !9  <U  Z_  `  be  e  	e8B''**84&
 -])8@459<W[[RT=U9V56  3pI	

  	s   BB: :C)C$C)$C)r,  c           	      B   T ;'       g    R P                  4       p \        P                  P                  R4      pV R&9  d   \	        RRRR7      R3# V'       d   VP
                  R 8X  d   \	        RRRR7      R	3# VP
                  ;'       g    R P                  4       P                  R
4      '       g   \	        RRRR7      R	3# \        P                  '       d:   \        P                  \        R',           8  d   \	        RR\        R R2RR7      R3#  \        W4      w  r#pRV'       d   RP                  VR,          4      MR,           pV'       d'   VRRP                  VR,          4      ,           ,          pV'       d'   VRRP                  VR,          4      ,           ,          p\	        RV  R2R\        V4       RV  R2RVR7      #   \        P                   d    \	        R R!RR7      R	3u # \         d%   p\	        R"R#R\!        T4      R7      R$3u R%p?# R%p?ii ; i)(r   r  u(   סוג חבילת טיול לא מוכרuQ   ניתן להעלות חבילה מלאה רק לטיול יפן או ארה״ב.Fr1  rM  r
  r  rD  r  rA  =   ניתן להעלות כאן רק ZIP מלא של הטיול.rC  !   ה־ZIP גדול מהמגבלה: r   r  r
  r  ru  N   N   לא יובאו קבצים.r  N   Nr  u   ZIP מלא של u	    נטעןr  u    קבצים בתיקיית r(  Tr=  r  r  "   שגיאה בהעלאת ZIP מלא9   לא ניתן היה לעבד את חבילת הטיול.r   N>   r(   r'   r  )r  r   r  r   r3  r5  r   r  r
  r  r  r   r,  rI  r)  r   r~  )rr   r  rS  r  r  r>  r  s   &      r   upload_trip_packager  #  s   JJBD==V$D## !K  Na  fk  l  nq  q  	q4==B& !9;x  ~C  D  FI  I  	IMMR&&(11&99 !9;z  @E  F  HK  K  	K'"8"8;UXc;c"c !;?`a{|}`~  F  >G  LQ  R  TW  W  	Wf)>t)J&;!(TYYx~%>PmnDtyyQ\]aQbGcccG*TYYwt}-EEEG #3D6!C{SVW_S`Raa|  ~B  }C  CD  FE  JN  X_  `  	` ` !4  7P  UZ  [  ]`  `  	` f !E  HC  HM  W[  \_  W`  a  cf  f  	ffs7   >G	 -G	  AG	 	%H0H9H:HHHr.  c                    \         P                  P                  R 4      pV'       d   VP                  R8X  d   \	        RRRR7      R3# \         P
                  '       dB   \         P
                  \        R,,           8  d"   \	        RR\        \        4       R	2RR7      R
3# \        W4      pV'       g   \	        RRRR7      R3# Vw  r4\        RW4      p. pVP                  R4      ;'       g    .  FT  p\        V\        4      '       g   K  VP                  R4      '       g   K4  VP                  VP                  R4      4       KV  	  RV'       d   RP                  V4      MR,           pVRVP                  R^ 4      R RVP                  RR4       2,          pVP                  R4      ;'       g    .  Uu. uFE  p\        V\        4      '       g   K  VP                  R4      '       g   K4  VP                  R4      NKG  	  p	pV	'       d    VRRP                  V	4      ,           ,          pVR\        VP                  R4      4      ,           ,          pVR\        V4      ,           ,          pVP                  R4      '       dd   VP                  R4      '       d   \	        RR V R!2R"VR#7      # VP                  R$4      '       d   \	        R%R&RVR#7      R3# \	        R'R(RVR#7      R)3# \	        R*R+RVR#7      ^3# u upi )-r  r   r
  r  Fr1  rD  r
  r
  r(  r
  r  uU   לא נמצא יעד שמירה מתאים לקובץ המוזיקה של ארה״ב.rM  r(   r  r   rJ  ru  u    לא זוהה יעד שמירה.u   

גודל MP3 סופי:
r  r   u    bytes

SHA256 MP3 סופי:
r  rD   u   

גיבויים קודמים:
rL  rS   rm  rn  uB   מוזיקת ארה״ב הועלתה והמצגות סונכרנוuJ   הקובץ נשמר בנתיבים הקבועים של USA ושל USA_TV: uk   . משך השיר זוהה, ומקטע המצגת הרלוונטי סונכרן בכל מצגת קיימת.Tr=  rt  u8   העלאת מוזיקת ארה״ב בוטלה בבטחהu   השיר החדש לא התאים לציר הזמן הקיים או שסנכרון המצגת נכשל. המצגות לא שונו וקובצי המוזיקה הקודמים שוחזרו אוטומטית.u-   סנכרון מוזיקת ארה״ב נכשלu   משך השיר זוהה, אך הסנכרון והשחזור לא הושלמו במלואם. בדוק את הפירוט לפני שימוש במצגת.r   uE   מוזיקת ארה״ב נשמרה — בדיקת אורך נכשלהr  r  )r   r  r   r5  r3  r
  r  r  r  r{  r   r   r  r   r@  r  )
r  r  rX  r5  r9  r  target_linesr  r>  backup_liness
   &         r   upload_usa_musicr  #  s   ==V$D4==B& !9;x  ~C  D  FI  I  	I'"8"8;QT_;_"_ !HL{  }I  J`  }a  |b  bc  Kd  in  o  qt  t  	t9+E !D  G^  ch  i  kn  n  	nH=eYWOL

9%+++dD!!dhhv&6&6 01 , !|DIIl$;QstG-fjj.CA-FFfgmgqgqrz|~g  gA  B  BG39::i3H3N3NB3N  A3N4R\]acgRh&mqmumuv~m&DHHX&3NL  A7$))L:QQQv*6::g+>???Gv5oFFFG=))/00$%i  nx  yA  xB  Bm  ln  sw  AH  I  I9::$%_  bp  uz  DK  L  NQ  Q  Q !P  Sl  qv  @G  H  JM  M  	Md  gX  ]b  ls  t  vy  y  y As   7K7K7-K7r/  c           	      (   T ;'       g    R P                  4       P                  4       p V \        9  d   \        RRRR7      R3# \	        4       w  rV'       g   \        RVRR7      R3# \
        P                  P                  R4      R	8w  d   \        R
RRR7      R3# \        V ,          p\
        P                  P                  R4      ;'       g    R P                  4       pWC8w  d   \        RRV 2RR7      R3# \        \
        P                  P                  R4      4      p \        W4      w  rgpRT RT R\        4        RT;'       g    R 2p	\        RV R2RV	R7      #   \         d%   p
\        RRR\        T
4      R7      R3u Rp
?
# Rp
?
ii ; i)r   u#   פעולת מחשב לא מוכרתu0   הפעולה המבוקשת אינה קיימת.Fr1  rM  u   פעולת מחשב נחסמהr  ackr   u   חסר אישור פעולהus   כדי למנוע לחיצה בטעות, צריך לסמן שאתה מבין את המשמעות של הפעולה.rD  confirm_textu%   מילת האישור לא נכונהuD   כדי לבצע את הפעולה צריך להקליד בדיוק: r  u   פעולה:
u   

תבוצע בעוד:
u$    שניות

כתובת מבקשת:
u   

פלט Windows:
r  u   פעולת מחשב נקבעהuq    נקבע בהצלחה. אפשר לבטל לפני סוף הטיימר דרך כפתור הביטול בפאנל.Tr=  u+   שגיאה בהפעלת פקודת מחשבuB   Windows לא קיבל את פקודת הכיבוי/ריסטארט.r   N)r   r   POWER_CONFIRM_TEXTr3  r  r   r  r   r  r  r  r   r~  )rd  rQ  rb  r  r  r  r`   r  r   r>  r  s   &          r   power_actionr  #  s;   ll!!#))+F'' !FHz  @E  F  HK  K  	K*,OG !A6eTVYYY||#% !?  Bw  |A  B  DG  G  	G!&)HLL$$^4::AACL !H  MQ  RZ  Q[  K\  af  g  il  l  	l!',,"2"27";<Ex%6v%E"F!%(B;-Ov  xE  xG  wH  H]  ^d  ^l  ^l  hl  ]m  n !AeW  M~  D  DH  RY  Z  	Z x !N  QU  Z_  im  nq  ir  s  ux  x  	xxs   "?E" "F-FFFr0  c                  ^   \        4       w  rV '       g   \        R VRR7      R3# \        4       w  r#T;'       g    RV 2pV^ 8X  d   \        RRVR7       \        RR	R
VR7      # \	        V4      '       d   \        RRVR7       \        RRR
VR7      # \        RRWBR7       \        RRRVR7      # )u'   ביטול פעולת מחשב נחסםFr1  r  zreturn code: r   uH   ריסטארט/כיבוי מתוזמן בוטל ידנית מהפאנל.)r  u$   פעולה מתוזמנת בוטלהuG   אם היה כיבוי/ריסטארט בהמתנה — הוא בוטל.Tr=  r   u   אין כרגע ריסטארט Fail Safe פעיל. כנראה שהוא כבר בוטל אוטומטית או שלא היה ריסטארט בהמתנה.u'   אין ריסטארט פעיל כרגעu   אין כרגע כיבוי/ריסטארט בהמתנה. זה תקין אם העדכון הצליח וה־Fail Safe כבר בוטל אוטומטית.r   uU   ניסיון ביטול ריסטארט החזיר שגיאה שדורשת בדיקה.)r  rv  u-   ביטול פעולה מתוזמנת נכשלuR   Windows החזיר שגיאה בביטול כיבוי/ריסטארט מתוזמן.)r  r3  r  r   r   )rQ  rb  rcr   r>  s        r   power_cancelr  #  s   *,OG !JFW\]_bbb%'JB,,-t,G	Qw#K1{  MT  	U !G  JS  X\  fm  n  	n%g..#F  -F  W^  	_ !J  Mc  hl  v}  ~  	~  2I  Za  rL  Oc  hm  w~    r   z/JAPANz/JAPAN/c                      \        R 4      # r'   r	  r  r   r   japanr"  $  s     Wr   z/USArK  c                      \        R 4      # r  r!  r  r   r   usar$  $  s     Ur   z/USA_TVz/USA_TV/c                      \        R 4      # r)   r!  r  r   r   r	  r	  $  s     Xr   z	/Moneyappz
/Moneyapp/c                      \        R 4      # r*   r!  r  r   r   r>  r>  $       Z  r   z
/MoneyHomez/MoneyHome/c                      \        R 4      # r+   r!  r  r   r   	moneyhomer,  %$  s     [!!r   z/JAPAN/<path:path>c                 0    \        \        R ,          V 4      # r   r  r  r  s   &r   japan_staticr/  +$  s    ww/66r   z/USA/<path:path>c                 0    \        \        R ,          V 4      # r  r.  r  s   &r   
usa_staticr1  0$  s    wu~t44r   z/USA_TV/<path:path>c                 0    \        \        R ,          V 4      # r&  r.  r  s   &r   usa_tv_staticr3  5$  s    wx0$77r   z/Moneyapp/<path:path>c                 0    \        \        R ,          V 4      # r(  r.  r  s   &r   money_staticr5  :$      wz2D99r   z	/TripFormz
/TripForm/c                      \        R 4      # r,   r!  r  r   r   tripformr9  ?$  r)  r   z/MoneyHome/<path:path>c                 0    \        \        R ,          V 4      # r+  r.  r  s   &r   moneyhome_staticr;  E$  s    w{3T::r   z/TripForm/<path:path>c                 0    \        \        R ,          V 4      # r8  r.  r  s   &r   tripform_staticr=  J$  r6  r   z
60.0-cleanr	  c                   aa	 V P                  R 4      ;'       g    . o	. oV3R lpS	'       g   V! RRR4       S# \        ;QJ d8    V	3R l\        \        S	4      ^,
          4       4       F  '       d   K   RM-	  RM)! V	3R l\        \        S	4      ^,
          4       4       4      pV! RVR\	        ^ \        S	4      ^,
          4       R	24       R F  w  r4V\        S	4      8:  g   K  S	V^,
          ,          S	V^,
          ,          re\        VR
,          VR,          ,
          4      R8*  ;'       d    VR,          VR,          8  pV! RV RV 2WuR
,          R RVR,          R R24       K  	  T! R\        ;QJ d#    R S	R,           4       F  '       d   K   RM	  RM! R S	R,           4       4      R4       T! R\        ;QJ d    R S	 4       F  '       d   K   RM	  RM! R S	 4       4      R4       S# )rN  c                 d   < SP                  R T R\        V4      RTRV'       d   RMRRR/4       R# )r   r  r  r	  rp  r
  
regressionNr  ru  )r   r  r  r	  s   &&&r   rN  "_qa_transition_checks.<locals>.addX$  s;    vtT48XvwXZPT`gis  vB  C  	Dr   u   ציר זמן לרגרסיהFu   אין נתוני ציר זמןc              3      <"   T Fd  pSV,          R ,          SV^,           ,          R ,          R,           8*  ;'       d)    SV^,           ,          R,          SV,          R,          8  x  Kf  	  R# 5i)r*  g&.>r)  Nr  )r   r  r  s   & r   r   (_qa_transition_checks.<locals>.<genexpr>]$  sm       U  TyzGAJu%1e)<t)CCttPQRSPSU\H]ahijaklsatHtt  Ts
   :A/1A/Tu*   מעבר רציף בין כל השקפיםu   נבדקו u    מעבריםr*  r)  r  u	   מעבר u   →r  r	  u2   ניווט ידני קדימה בזמן נגינהc              3   8   "   T F  qR ,          ^ 8  x  K  	  R# 5i)r)  Nr  r	  s   & r   r   rD  d$  s     AfZeUVG*q.Zer  r	  uK   לכל שקף אחרי הראשון קיימת נקודת seek חיוביתu4   אין מקטעים שליליים או אפסייםc              3   n   "   T F+  qR ,          ^ 8  ;'       d    VR,          VR,          8  x  K-  	  R# 5i)rl  r*  r)  Nr  r	  s   & r   r   rD  e$  s=       DAxstiLSTDTDnDnYZ[`YadefmdnYnDnxs   55u-   כל המקטעים מתקדמים קדימה))      )rH     )rI     )rJ     )*   +   )rM  ,   )r   r	  r=  r,  r>  r  )
r  rN  	monotonicr  r  ru  rv  r  r	  r  s
   &       @@r   _qa_transition_checksrP  U$  s   jj$**GFD*E3TU  U  D  EH  IP  EQ  RS  ES  T  U  U  D  EH  IP  EQ  RS  ES  T  U  UI4i;sSTVYZaVbcdVdOeNffsAtuAG!!A#,!%T%[5>12e;__gRVW^R_@_B)A3c!%r5k#->c%.QTAUU\+]^	 B
 <ccAfZabdZeAfcccAfZabdZeAf>f  iv  w>  DAx  DA  DAx  DA  AA  Cr  sMr   c                    / pV P                  R . 4       F4  pVP                  VP                  RR4      . 4      P                  V4       K6  	  R^R^R^R^R^
R^
R^/p/ pR	pVP                  4        F}  w  rgVP                  V. 4      p\	        R
 V 4       4      p	\	        R V 4       4      p
\        ^ ^dV	^#,          ,
          V
^
,          ,
          4      pWV&   W[V,          ^d,          ,          pK  	  \        V4      V3# )r	  r
  	structurerS   rN  r@  r	  codeperformancer  c              3      "   T F7  qP                  R 4      '       d   K  VP                  R4      R8w  g   K3  ^x  K9  	  R# 5ir	  r`  r  s   & r   r   _qa_score.<locals>.<genexpr>r$  ,     [%QuuT{qquuW~QZ?Zqq%   AA
Ac              3      "   T F7  qP                  R 4      '       d   K  VP                  R4      R8X  g   K3  ^x  K9  	  R# 5ir	  r`  r  s   & r   r   rV  s$  rW  rX  )r   r:  r  r  r  r>  rf  )r  groupsr  weightsscoresrj  r   weightr  failuresr  rX  s   &           r   	_qa_scorer_  i$  s    FZZ"%!%%
K8"=DDQG &r*RR	"VB{[]^klmnGFE

4$[%[[[%[[AsX]*X]:;t#%% ( <r   c                 
  a \        V 4      pVP                  R / 4      P                  R4      '       g   V# \        V 4      w  r#rE \        V4      p\	        V4      p\        \        V4      4      p/ p	VP                   F  p
VP                  \        V
4      P                  4       4      pV'       g   K5  \        V4      P                  P                  4       \        9   g   Kc  \        \        \        V4      4      4      V	\        V
4      P                  4       &   K  	  \        VP                  VP                  V	4      pVP                    Uu. uFs  pRVP"                  ^,           RVP$                  RVP&                  RVP(                  RVP*                  RVP,                  RVP.                  R	VP0                  ^,           /NKu  	  upVR
&   VP                  R. 4       FX  pVP                  RR4      pRV9   g   RV9   d   RVR&   K*  RV9   d   RVR&   K8  RV9   d   R
VR&   KF  VP3                  RR4       KZ  	  VR,          P5                  \7        V4      4       VP                  R. 4       F  pVP                  R^ 4      ^ 8H  ;'       g    VP                  R^ 4      \8        8  pVR,          P;                  RVP                  R4       R2RTRVP                  R^ 4      R R2RV'       d   RMR RR
/4       K  	  VP                  R!/ 4      P                  R"^ 4      VP                  R!/ 4      P                  R#^ 4      ,           oV3R$ lp\=        R% VP                  R&. 4       4       4      pR'SR(VR)R*V! ^d4      R+V! ^4      R,V! ^
4      //VR-&   VR,          P;                  RR.RSR/8  R\?        S4      RSR/8  d   R0MRRR-/4       \A        V4      w  ppVVR1&   VVR2&   \B        ;QJ d,    R3 VP                  R. 4       4       F  '       d   K   R4M!	  R5M! R3 VP                  R. 4       4       4      ;'       d"    V^_8  ;'       d    VP                  R64      R78H  VR8&   \D        VR9&   \B        ;QJ d,    R: VP                  R. 4       4       F  '       d   K   R4M!	  R5M! R: VP                  R. 4       4       4      VR&   V# u upi   \F         d=   pTP3                  R;. 4      P;                  R<\I        T4      ,           4        R=p?T# R=p?ii ; i)>rs   r   r  r   rx  rl  ry  r)  r*  rE  rN  r	  r   r   r5  u   מוזיקהrS   r
     אופלייןr	  u   ציר הזמןrR  r0  r	  r	  r`   &   : לפחות 5 שניות לתמונהr  r  r0  r	  r	  rp  r	  r	  r	  c                 Z   < S'       d"   \        S^,          V R,          ,          ^4      # ^ # )r  i@B )rf  )mbpstotal_bytess   &r   est8_pc_music_build_presentation_control_report.<locals>.est$  s&    P[eK!Oti7G$H!Lbabbr   c              3   D   "   T F  qP                  R ^ 4      x  K  	  R# 5i)r  Nr`  r 
  s   & r   r   >_pc_music_build_presentation_control_report.<locals>.<genexpr>$  s     M4Lq%%**4Lr9  rM  re  video_bytesestimated_secondswifi_100mbpswifi_30mbpscellular_10mbpsrT  u2   משקל כולל בתחום סביר לדפדפןi 5wr  rX  category_scoresc              3   z   "   T F1  qP                  R 4      ;'       g    VP                  R4      R8H  x  K3  	  R# 5ir	  r`  r  s   & r   r   ri  $  s1     "pWoRS55;#M#M!%%.I2M#MWo   ;;FTr	  rN  
trip_ready
qa_versionc              3   z   "   T F1  qP                  R 4      ;'       g    VP                  R4      R8H  x  K3  	  R# 5ir	  r`  r  s   & r   r   ri  $  s0     hOg!55;EE!%%.I*EEOgrq  r  zQA v47: N)%&_OLD_BUILD_PRESENTATION_CONTROL_REPORTr   r	  r  r  r  r   rr  r   r   r  r  rg  ro  r  r0  r  r  r   rx  rz  ry  r)  r*  r{  r:  r  rP  !PRESENTATION_QA_MIN_IMAGE_SECONDSr  r  r  r_  r	  PRESENTATION_QA_VERSIONr   r~  )r	  r  r	  r  r'  r  r	  r  r  r  r   r   rN  r	  r  rt
  rE  r  rf  rj  rX  ro  r  re  s   &                      @r   +_pc_music_build_presentation_control_reportrx  }$  s   3J?F::nb)--h77.>z.J+C !I"#45(.'Y8	$$D==T!23DtT
))//15EE5:;WX[\`Xa;b5cD	 12 % %T%5%5tzz?S GO  GW  GW  X  GW  BCwqwwqyvaffYWXWiWijyz{  {J  {J  KR  ST  SZ  SZ  [`  ab  af  af  gm  no  nz  nz  {|  n|  }  GW  XzHb)Afb!AQ.A"5wq}!Q&	*"a':,,z;7 * 	x 5f =>JJw+D-+q0yyDHH=PRS4TXy4yB8##Vtxx/@.AAg,himnpqy  ~B  ~F  ~F  GZ  [\  ~]  ^a  }b  bi  {j  kr  {}  sw  CJ  KU  V`  %a  b , jj2.22=!DvzzRZ\^G_GcGcdxz{G||bMFJJx4LMM!.{=Uhjxy|  ~A  zB  CP  QT  UW  QX  Yj  kn  oq  kr  js  !t}x(\]abmp}b}  G  HT  U`  Ha  bi  wB  FS  wS  js  Y]  ^h  iv  !w  	x!*6!2w$3 !"s"pW]WaWabjlnWo"psss"pW]WaWabjlnWo"pp   v   vuz  A  vA   v   v  FL  FP  FP  Qh  Fi  mv  Fv|6|shvzzZbdfOghssshvzzZbdfOghht M1 X,  I*b)00d3i1GHHMIsf   A(S 2)S  A*S 
A9R>CS 	A S *DS +S 7S +S 0!S (S >S T
1TT
c                    V P                  R 4      ;'       g    . pV'       g   R# \        R V 4       ^R7      p. pV F  p\        RVR,          V,          ^d,          4      pVR,          R8X  d   RMRpVP                  R	V R
VR RVR,           R\        VR,          4       RVR,          R RVR,           R24       K  	  RRP	                  V4      ,           R,           # )rN  u@   <div class="empty">לא ניתן לבנות ציר זמן.</div>c              3   2   "   T F  qR ,          x  K  	  R# 5ir*  Nr  r	  s   & r   r   $_qa_timeline_html.<locals>.<genexpr>$  s     +7a57r	  r  皙?rl  rx  r  r  <div class="tl-item " style="flex-basis:.4f   %" title="שקף r  rJ  r   r  r0  u    שנ׳"><span>r`	  <div class="timeline">r   uq   </div><div class="legend"><span class="lg image"></span>תמונה <span class="lg video"></span>סרטון</div>)r   r>  r  r
  r   )r  r  rj  blocksr	  rU  r,
  s   &      r   _qa_timeline_htmlr  $  s2   jj$**GQ+7+Q7EFD!I,.456g-g7,SE1EeC[Pabcdkblammopuvwx~v  qA  pB  BF  GH  IR  GS  TW  FX  Xg  hi  jq  hr  gs  s@  A  	B  $bggfo5  9l  l  lr   c            	        aa	 \         P                  P                  R R4      o	S	\        9  d   Ro	\	        S	4      p RP                  V	3R l\        P                  4        4       4      pRP                  R V P                  R. 4       4       4      pRP                  R V P                  R. 4       4       4      pRP                  R V P                  R	. 4       4       4      ;'       g    R
pV P                  R/ 4      qUP                  R/ 4      q`P                  R/ 4      oRP                  V3R lR1 4       4      pRP                  . RN\        \        S	,          R,          4       NRN\        S	4       NRN\        S	4       NRNV NRNV P                  R^ 4       NRNV P                  R^ 4       NRNV P                  R4      '       d   RMR NRN\         NRN\        V P                  R. 4      4       NRN\        V P                  R4      4       NRNV NR NT;'       g    R! NR"N\        V 4       NR#N\        VP                  R$^ 4      4       NR%N\        VP                  R&^ 4      4       NR'NVP                  R(R)4       NR*NVP                  R+R)4       NR,NVP                  R-R)4       NR.NV NR/NV NR0N4      # )2r  r	  r   c           
   3      <"   T F5  w  rR VS8X  d   RMR R\        V4       R\        VR,          4       R2x  K7  	  R# 5ir
  r
  )r   r  r  r  s   &  r   r   5render_presentation_control_center.<locals>.<genexpr>$  s       E  `D  X\  XY)a6k(r)JJnotuvownxxz  |A  BC  DK  BL  |M  {N  NR  S  `Dr
  c              3   p  "   T F  pR VP                  RR4       R\        VP                  R4      4       RVP                  R^ 4      R RVP                  R	^ 4       R
VP                  R^ 4      R RVP                  R^ 4       RVP                  R^ 4      R RVP                  R^ 4      R R2x  K  	  R# 5i)r
  r  r	  r
  r`   z</h2><div class="metric"><b>r"  r0  uA   </b><span>שניות בשיר</span></div><div class="metric"><b>rH  r
  r	  u+    שנ׳</span></div><div class="metric"><b>r	  uC   </b><span>שקפי תמונה</span></div><div class="hero-number">r	  uO    שנ׳</div><p>זמן לכל תמונה</p><small>רזרבה מעל 5 שנ׳: r	  u    שנ׳</small></article>Nr   r
  r  s   & r   r   r  $  s      	  l	~	  g	h	+AEE(5,A+B&quuU\~I^H__{|}  }B  }B  CQ  RS  }T  UX  |Y  YZ  [\  [`  [`  an  op  [q  Zr  rN  OP  OT  OT  Ud  ef  Og  hk  Nl  lW  XY  X]  X]  ^k  lm  Xn  Wo  or  st  sx  sx  yL  MN  sO  PS  rT  Tc  de  di  di  j@	  A	B	  dC	  D	G	  cH	  H	a	  b	  l	~	s   B4B6r0  c              3   H  "   T F  pR VP                  R4      '       d   RMVP                  R4      R8X  d   RMR R\        VP                  R4      4       R	\        VP                  R
R4      4       R\        VP                  R4      4      ;'       g    R R2	x  K  	  R# 5i)r  r  r
  r	  r  r&
  r
  r
  r   z</b><small>r
  r   </small></td><td>r  r  r  Nr  r	  s   & r   r   r  $  s*      U  AT  |}xtquuW~YbGb8hmoo{  }B  CD  CH  CH  IO  CP  }Q  |R  R]  ^c  de  di  di  jt  uw  dx  ^y  ]z  zK  LQ  RS  RW  RW  X`  Ra  Lb  Lk  Lk  fk  Kl  lv  w  AT   B"BB"r	  c              3      "   T Fn  pR \        VP                  R4      4       R\        VP                  R4      4       RVP                  R^ 4      R R\        VP                  R^ 4      4       R2	x  Kp  	  R	# 5ir
  r
  r   r  r 
  s   & r   r   r  $  s       O  {N  vwxaeeFm 45YuQUU6]?S>TT]^_^c^cdnop^qru]v  wG  HT  UV  UZ  UZ  [a  bc  Ud  He  Gf  fp  q  {N   A6A8rM  u4   <tr><td colspan="4">אין סרטונים.</td></tr>rT  rk  ro  c              3   Z   <"   T F   w  rR V RSP                  V^d4       R2x  K"  	  R# 5i)z<div><b>z</b><strong>z</strong></div>Nr`  )r   rT  r`   css   &  r   r   r  $  s<       N  eMW`WZhug\"&&S/1B/R  eMs   (+u  <!doctype html><html lang="he" dir="rtl"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>מרכז QA למצגות</title><style>
:root{--bg:#07111f;--panel:#101d31;--line:#304560;--text:#f8fafc;--muted:#b8c6d9}*{box-sizing:border-box}body{margin:0;background:radial-gradient(circle at 85% 0,#173563,transparent 30rem),var(--bg);color:var(--text);font-family:Arial,'Segoe UI',sans-serif}.wrap{width:min(1220px,94%);margin:auto;padding:24px 0 60px}a{color:#dbeafe}.head,.panel{background:var(--panel);border:1px solid var(--line);border-radius:24px;padding:18px;margin-bottom:15px;box-shadow:0 18px 50px #0004}.head{background:linear-gradient(135deg,#172554,#0f172a)}h1{margin:0 0 8px;font-size:clamp(29px,5vw,46px)}p,small{color:var(--muted)}.actions,.targets{display:flex;gap:8px;flex-wrap:wrap;margin-top:13px}.actions a,.target{text-decoration:none;padding:10px 14px;border-radius:999px;background:#243653;border:1px solid #466080;font-weight:900}.target.active{background:#2563eb;border-color:#93c5fd}.ready{display:grid;grid-template-columns:180px 1fr;gap:16px;align-items:center}.score{width:150px;height:150px;border-radius:50%;display:grid;place-items:center;background:conic-gradient(#22c55e calc(var(--score)*1%),#334155 0);position:relative;font-size:36px;font-weight:950}.score:before{content:'';position:absolute;inset:12px;border-radius:50%;background:#0f172a}.score span{position:relative}.category-scores{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:8px}.category-scores div{background:#0b1628;border:1px solid #334155;border-radius:14px;padding:10px}.category-scores b{display:block;color:#cbd5e1;font-size:12px}.category-scores strong{font-size:22px}.parts{display:grid;grid-template-columns:repeat(auto-fit,minmax(270px,1fr));gap:13px}.part{background:var(--panel);border:2px solid var(--line);border-radius:22px;padding:17px}.part.green{border-color:#15803d}.part.yellow{border-color:#d97706}.part.red{border-color:#dc2626}.metric{display:flex;justify-content:space-between;padding:8px 0;border-bottom:1px solid var(--line)}.hero-number{font-size:42px;color:#bfdbfe;font-weight:950;margin-top:13px}.timeline{display:flex;width:100%;min-height:76px;gap:2px;direction:ltr;overflow:auto;padding:7px;background:#07111f;border-radius:15px}.tl-item{min-width:17px;border-radius:7px;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:900;color:white}.tl-item.image{background:#2563eb}.tl-item.video{background:#f97316}.legend{margin-top:9px;color:#cbd5e1}.lg{display:inline-block;width:14px;height:14px;border-radius:4px;margin:0 8px}.lg.image{background:#2563eb}.lg.video{background:#f97316}table{width:100%;border-collapse:collapse}th,td{padding:9px;border-bottom:1px solid var(--line);text-align:right;vertical-align:top}td small{display:block;font-size:10px;text-transform:uppercase}.perf{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:9px}.perf div{background:#0b1628;border-radius:14px;padding:12px}.perf b{display:block;font-size:21px}@media(max-width:650px){.ready{grid-template-columns:1fr}.score{margin:auto}th,td{font-size:11px;padding:6px 3px}}</style></head><body><main class="wrap"><section class="head"><h1>🎛️ מרכז QA ובקרת מצגות</h1><p>Timeline, חישובי זמן, בדיקות רגרסיה, מוכנות אופליין וביצועים — מתוך הקבצים הפעילים בשרת.</p><div class="actions"><a href="/">🏠 ראשי</a><a href="/admin">📁 אדמין</a><a href="r	  r$
  uO   ">🔄 בדיקה מלאה</a><a href="/admin/presentations/report.json?target=r%
  zO</div></section><section class="panel ready"><div class="score" style="--score:rX  z"><span>z</span></div><div><h2>rr     ✅ Trip Readyu   ⚠️ נדרשת בדיקהu   </h2><p>מנוע QA vr  u    בדיקות · r	  z!</p><div class="category-scores">z-</div></div></section><section class="parts">uB   <article class="part red">לא ניתן לחשב זמן.</article>u>   </section><section class="panel"><h2>📈 Timeline מלא</h2>ua   </section><section class="panel"><h2>⚡ ביצועים ומשקל</h2><div class="perf"><div><b>re  u   </b>סה״כ</div><div><b>rj  u    </b>סרטונים</div><div><b>rl  r  u(    שנ׳</b>Wi‑Fi 100Mbps</div><div><b>rm  u'    שנ׳</b>Wi‑Fi 30Mbps</div><div><b>rn  u    שנ׳</b>10Mbps</div></div></section><section class="panel"><h2>🧪 בדיקות מלאות ורגרסיה</h2><table><thead><tr><th>מצב</th><th>בדיקה</th><th>פירוט</th></tr></thead><tbody>u   </tbody></table></section><section class="panel"><h2>🎬 סרטונים פעילים</h2><table><thead><tr><th>שקף</th><th>קובץ</th><th>משך</th><th>גודל</th></tr></thead><tbody>/</tbody></table></section></main></body></html>))rS   r5  )rN  u   ציר זמן)r@  u   רגרסיה)r	  ra  )rR  u   מבנה)rT  u   ביצועים)r   r  r   r	  r'
  r   r  r
  rw  r,  r  r  )
r   r  r0  r	  rM  perfrf  r  r  r  s
           @@r   r1
  r1
  $  s   \\h4F11)&1Agg  E  `|  `B  `B  `D  E  EGGG  	  l	m	  l	q	  l	q	  r	y	  {	}	  l	~	  	  	EWW  U  AB  AF  AF  GO  QS  AT  U  UFWW  O  {|  {@  {@  AI  KM  {N  O  O  I  I  SIF55#D884G+LSSXSXYjlnSobGG  N  eM  N  NEKR KR \6 KR ]6b6  c66  @7F7  c6G7  H7R7  c6S7  ]6T7  \6U7KR U7f8KR g8l8  m8s8  g8t8  f8u8KR u8D:KR E:J:  K:Q:  E:R:  D:S:KR S:H;KR I;P;  H;Q;KR Q;`<KR a<b<  a<f<  a<f<  g<n<  o<p<  a<q<  `<r<KR r<z<KR {<|<  {<@=  {<@=  A=H=  I=J=  {<K=  z<L=KR L=b=KR w=x=  w=|=  w=|=  }=I>  w=J>  w=J>  c=s=  P>n>  b=o>KR o>D?KR E?\?  D?]?KR ]?a?KR b?e?  f?g?  f?k?  f?k?  l?t?  u?w?  f?x?  b?y?  a?z?KR z?K@KR L@Q@  R@S@  R@W@  R@W@  X@f@  R@g@  L@h@  K@i@KR i@JAKR KAPA  JAQAKR QA~AKR ADB  ALC  ALC  HBLC  ~AMCKR MCKDKR LD]D  ^D_D  LD`D  KDaDKR aDBFKR CFOF  PFTF  PFXF  PFXF  YFfF  gFhF  PFiF  CFjF  BFkFKR kFEGKR FGRG  SGWG  SG[G  SG[G  \GiG  jGkG  SGlG  FGmG  EGnGKR nGNHKR OHRH  OHVH  OHVH  WHeH  fHkH  OHlH  NHmHKR mHUIKR VIYI  VI]I  VI]I  ^IkI  lIqI  VIrI  UIsIKR sIZJKR [J^J  [JbJ  [JbJ  cJtJ  uJzJ  [J{J  ZJ|JKR |JINKR JNPN  INQNKR QNQQKR RQXQ  QQYQKR YQHRKR KRr   z/admin/presentations/audit.jsonc                      \         P                  P                  R R4      p V \        9  d   Rp \	        \
        P                  ! \        V 4      R^R7      RR7      # r4
  r7
  r8
  s    r   !admin_presentation_audit_json_v47r  $  r:
  r   c                  `    \         P                  P                  R R4      p V \        9   d   V # R# )r  r	  )r   r  r   r	  r  s    r   _v49_target_keyr  $  s+    
,,

8[
1C553F;Fr   c                  J    \          U u/ uF  q \        V 4      bK  	  up # u up i r   )r	  r'
  r  s    r   _v49_reportsr  $  s%    C_`C_C2377C_```s    c                    V P                  R 4      '       d   R# V P                  R. 4       Uu. uF5  qP                  R4      '       d   K  VP                  R4      R8w  g   K3  VNK7  	  ppV'       d   R\        V4       R23# R# u upi )	rr  r  r	  r	  r  r
  u    כשלים)r  u   מוכן)r  u   אזהרות)r   r,  )r  r  hards   &  r   _v49_statusr  $  sx    zz,zz(B/c/!uuT{AquuW~YbGbAA/Dc15Ec$i[,-S;SS ds   BB#Bc                     . p\          FC  w  r4pW08X  d   R MRpVP                  RV RV R\        V4       RV R\        V4       R24       KE  	  RP                  V4      # )z activer   z<a class="v49-nav" href="/admin/platform/?target=r  r   r
  )TRIP_PLATFORM_MODULESr  r
  r   )r$  r  linksrT  r   r`   r,
  s   &&     r   _v49_navr  $  su    
E15I"(-EcU(SXY_S`Raacdhciijkpqvkwjxx|}~ 2 775>r   c                 b   a a R P                  VV 3R l\        P                  4        4       4      # )r   c              3      <"   T F8  w  rR VS8X  d   RMR RS R\        V4       R\        VR,          4       R2	x  K:  	  R# 5i)	z<a class="v49-target r$  r   r  r  r  r`   r
  Nr
  )r   rT  r	  moduler  s   &  r   r   _v49_targets.<locals>.<genexpr>$  su      ;GC  CKR@@XY_X``hinorishttvw|  ~A  BI  ~J  xK  wL  LP  	Q;s   A A)r   r	  r  )r  r  s   ffr   _v49_targetsr  $  s*    77 399;  r   c                     R \        V 4       R\        V 4       R\        T;'       g    R4       R\        V4       R\        W!4       R\        W4       RV R2# )	<!doctype html><html lang="he" dir="rtl"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>a  </title><style>
:root{--bg:#07111f;--panel:#101d31;--panel2:#0b1628;--line:#304560;--text:#f8fafc;--muted:#b8c6d9;--blue:#2563eb;--green:#22c55e;--yellow:#f59e0b;--red:#ef4444;--orange:#f97316}*{box-sizing:border-box}body{margin:0;background:radial-gradient(circle at 85% 0,#173563,transparent 30rem),var(--bg);color:var(--text);font-family:Arial,'Segoe UI',sans-serif}a{color:#dbeafe}.wrap{width:min(1280px,95%);margin:auto;padding:20px 0 60px}.hero,.panel{background:var(--panel);border:1px solid var(--line);border-radius:24px;padding:18px;margin-bottom:15px;box-shadow:0 18px 50px #0004}.hero{background:linear-gradient(135deg,#172554,#0f172a)}h1{margin:0 0 7px;font-size:clamp(28px,5vw,44px)}h2{margin-top:0}p,small,.muted{color:var(--muted)}.top-actions,.v49-tabs,.targets{display:flex;gap:8px;flex-wrap:wrap;margin-top:13px}.top-actions a,.v49-nav,.v49-target,.btn{text-decoration:none;padding:10px 14px;border-radius:999px;background:#243653;border:1px solid #466080;font-weight:900;color:#fff}.v49-nav.active,.v49-target.active{background:var(--blue);border-color:#93c5fd}.v49-tabs{position:sticky;top:0;z-index:20;padding:10px;background:rgba(7,17,31,.92);backdrop-filter:blur(10px);border-radius:18px}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(245px,1fr));gap:13px}.card{background:var(--panel);border:1px solid var(--line);border-radius:20px;padding:16px}.card.ok{border-color:#15803d}.card.warn{border-color:#d97706}.card.bad{border-color:#dc2626}.big{font-size:38px;font-weight:950;color:#bfdbfe}.metric{display:flex;justify-content:space-between;gap:10px;padding:8px 0;border-bottom:1px solid var(--line)}.metric:last-child{border-bottom:0}table{width:100%;border-collapse:collapse}th,td{padding:9px;border-bottom:1px solid var(--line);text-align:right;vertical-align:top}th{color:#bfdbfe}code{direction:ltr;unicode-bidi:isolate}.timeline{display:flex;width:100%;min-height:78px;gap:2px;direction:ltr;overflow:auto;padding:7px;background:#07111f;border-radius:15px}.tl-item{min-width:18px;border-radius:7px;display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:900;color:#fff}.tl-item.image{background:var(--blue)}.tl-item.video{background:var(--orange)}.badge{display:inline-flex;padding:5px 9px;border-radius:999px;font-size:12px;font-weight:900}.badge.ok{background:#14532d;color:#bbf7d0}.badge.warn{background:#78350f;color:#fde68a}.badge.bad{background:#7f1d1d;color:#fecaca}.score{font-size:60px;font-weight:950}.recommend{padding:12px 14px;background:var(--panel2);border-right:4px solid var(--blue);border-radius:12px;margin:9px 0;line-height:1.55}.recommend.warn{border-color:var(--yellow)}.recommend.bad{border-color:var(--red)}.preview-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:10px}.preview-card{background:var(--panel2);border:1px solid var(--line);border-radius:15px;padding:12px}.bar{height:10px;background:#334155;border-radius:999px;overflow:hidden}.bar span{display:block;height:100%;background:linear-gradient(90deg,var(--blue),var(--green))}@media(max-width:700px){th,td{font-size:11px;padding:6px 3px}.v49-tabs{position:static}.score{font-size:46px}}</style></head><body><main class="wrap"><section class="hero"><h1>r2  u[   מרכז בקרה, בדיקות ומוכנות לכל המצגות הפעילות בשרת.u   </p><div class="top-actions"><a href="/admin">📁 אדמין</a><a href="/">🏠 ראשי</a><a href="/admin/platform/audit?target=uE   ">✅ בדיקת מוכנות מלאה</a></div><div class="targets">z&</div></section><nav class="v49-tabs">z</nav></main></body></html>)r
  r  r  )r   r$  r  r  subtitles   &&&&&r   
_v49_shellr  $  s    _  `e  fk  `l  _m ms3 t3y3  z33  t3@4  s3A4  A4I4  J4O4  P4X4  P4y5  P4y5  \4y5  J4z5  I4{5  {57  @8E8  F8L8  @8M8  7N8  N8S9  T9`9  a9g9  T9p9  S9q9  q9W:  X:`:  a:g:  X:o:  W:p:  p:v:  w:{:  v:|:  |:Q;T; T;r   c                 N   V P                  R 4      ;'       g    . pV'       g   R# \        R V 4       ^R7      ;'       g    ^p. pV F  p\        R\        VP                  R^ 4      4      V,          ^d,          4      pVP                  R4      R8X  d   RMRpVP                  R	V R
VR RVP                  R4       R\	        VP                  R4      4       RVP                  R^ 4      R RVP                  R4       R24       K  	  RRP                  V4      ,           R,           # )rN  u7   <p class="muted">לא ניתן לבנות Timeline.</p>c              3   D   "   T F  qP                  R ^ 4      x  K  	  R# 5ir{  r`  r  s   & r   r    _v49_timeline.<locals>.<genexpr>%  s     /w!uuU1~~wr9  r}  r~  rl  rx  r  r  r  r  r  r  r  rJ  r   r  r0  u	    שנ׳">rZ	  r  r   uI   </div><p class="muted">כחול = תמונה · כתום = סרטון</p>)r   r>  rg  r  r
  r   )r  r  rj  r  r	  r   rx  s   &      r   _v49_timeliner  $  sx   JJz"((bGT
/w/
;
@
@qEF
c%i*+E1#5
6fw.WG,TF2FqgM^_`_d_del_m^nnpqvwxw|w|  ~D  xE  rF  qG  GK  LM  LQ  LQ  R[  \]  L^  _b  Kc  cl  mn  mr  mr  sz  m{  l|  |B  C  	D  $BGGFO34r   c           
      f   . pV P                  R . 4       F  p\        VP                  R^ 4      ;'       g    ^ 4      pVP                  R^ 4      ^ 8X  d   KA  V\        8  d,   VP                  RVP                  R4       RVR R234       Kw  V\        8  d,   VP                  RVP                  R4       R	VR R
234       K  VP                  RVP                  R4       RVR R234       K  	  \        V P                  R. 4      R RR7      pV'       dD   V^ ,          pVP                  RRVP                  R4       RVP                  R^ 4      R R234       V P                  R/ 4      pVP                  R^ 4      R8  d1   VP                  RR\        VP                  R^ 4      4       R234       V P                  R. 4       Uu. uF5  qwP                  R4      '       d   K  VP                  R4      R8w  g   K3  VNK7  	  ppV'       d"   VP                  ^ RR \        V4       R!234       V# u upi )"r0  r	  r	  r
  r`   u   : נותרו רק r0  uG    שניות לכל תמונה. אין להוסיף סרטון נוסף.r  u   : הקצב גבולי (u]    שניות לתמונה). מומלץ לקצר סרטונים לפני הוספה נוספת.r   u!   : קצב תמונות טוב — u    שניות לתמונה.rM  c                 &    V P                  R ^ 4      # )r*  r`  r%  s   &r   r  &_v49_recommendations.<locals>.<lambda>%  s    j8Kr   Trb  u*   הסרטון הארוך ביותר הוא r   r7  r*  ug    שניות). קיצור של 5 שניות יחזיר זמן לשקפי התמונה באותו חלק.rT  re  i,u    משקל החבילה גבוה: u;   . מומלץ לדחוס סרטונים לפני נסיעה.r	  r  r	  r  u   קיימים uX    כשלים חוסמים. אין לסמן את הגרסה כ-GOLD לפני תיקונם.)	r   rg  rv  r  "PRESENTATION_QA_GOOD_IMAGE_SECONDSr  r  r  r,  )	r  rz	  r/  secrM  r  r  r  r  s	   &        r   _v49_recommendationsr  
%  sH   
CZZ#!%%+A.33!455q!1$h22JJw 00B3s)  LS  T  U  V55JJ!%%.!11HS	  Ro   p  q  rJJaeeGn--NsSViWpqrs $ &**Xb)/KUYZF
)

BCAEE&M?RTUVUZUZ[efgUhilTm  nU  V  W  	X	M"	%Dxxa ,

F=l488TabcKd>e=f  gb  c  d  	eZZ,	^,EE$K!AEE'NT]D]!!,D	^SZZ5=T  <T  "U  V  WJ 
_s   H.#H.;H.c                     \        4       p . pV P                  4        F  w  r#\        V4      w  rE\        V,          pR P	                  R VP                  R. 4       4       4      pVP                  RV RV R\        V4       R\        VR,          4       RVP                  R	^ 4       R
V RVP                  R/ 4      P                  R^ 4       R\        VP                  R/ 4      P                  R^ 4      4       R\        V4       R\        V4       R24       K  	  RR P	                  V4      ,           R,           p\        RRRVR4      # )r   c              3      "   T F7  pR \        VP                  R4      4       RVP                  R^ 4      R R2x  K9  	  R# 5i)z<div class="metric"><span>r`   z
</span><b>r	  r0  u    שנ׳/תמונה</b></div>N)r
  r   r  s   & r   r   !_v49_dashboard.<locals>.<genexpr>%%  s\       o  ]n  XY25w3H2ITUTYTYZmnoTpqtSu  vR  S  ]ns   ?Ar0  <article class="card "><span class="badge r  </span><h2>r`   </h2><div class="big">rX  z
/100</div>u,   <div class="metric"><span>מדיה</span><b>r	  media_itemsu6   </b></div><div class="metric"><span>משקל</span><b>rT  re  z4</b></div><p><a href="/admin/platform/studio?target=u:   ">פתח Studio</a> · <a href="/admin/platform/qa?target=u    ">בדיקות</a></p></article><section class="grid">u  </section><section class="panel"><h2>כלי בקרת איכות מרכזיים</h2><p><a class="btn" href="/admin/self-test">🧪 בדיקה עצמית מלאה</a> <a class="btn" href="/admin/platform/audit">✅ Audit ומוכנות למסירה</a> <a class="btn" href="/admin/platform/release-matrix">🔄 מטריצת סנכרון</a> <a class="btn" href="/admin/platform/audit.json" target="_blank">📄 דוח JSON</a></p></section><section class="panel"><h2>פלטפורמה גנרית</h2><p>המסך קורא את Registry היעדים. הוספת טיול עתידי ל־Registry תצרף אותו לאותם מודולים ולבדיקות, ללא שכפול מנוע.</p></section>zTrip Platform Dashboard	dashboardr	  ul   תמונת מצב אחת לכל המצגות, האופליין, ציר הזמן ומוכנות המסירה.)
r  r  r  r	  r   r   r  r
  r  r  )	reportsr  rT  r   r  r`   r	  r0  r  s	            r   _v49_dashboardr  !%  sc   NG"E ^)Ec)JSgg  o  ]^  ]b  ]b  cj  km  ]n  o  o,VH4I&QSTYZ_T`Saalmrsvw~s  nA  mB  BX  YZ  Y^  Y^  _f  gh  Yi  Xj  jt  uz  t{  {g  hi  hm  hm  nv  wy  hz  h~  h~  L  MN  hO  gP  PF  GS  TU  TY  TY  Zg  hj  Tk  To  To  p}  ~  T@  GA  FB  Bv  w|  }@  wA  vB  B|  }B  CF  }G  |H  Hh  i  	j ! 
""''%.	0  2i  
iD/K  N|  }  }r   c            	      f   \        4       p \        V 4      p\        V ,          pR P                  R VP	                  R. 4       4       4      pR P                  R VP	                  R. 4       4       4      ;'       g    RpRV R\        V4       R\        VR	,          4       R
V R2	p\        RRWR4      # )r   c              3   H  "   T F  pR VP                  RR4       R\        VP                  R4      4       RVP                  R^ 4      R RVP                  R	^ 4      R R
VP                  R^ 4       RVP                  R^ 4      R RVP                  R^ 4       R2x  K  	  R# 5i)r  r  r
  r
  r`   r  r	  r0  uS   </div><p>שניות לכל תמונה</p><div class="metric"><span>שיר</span><b>r"  u<   </b></div><div class="metric"><span>סרטונים</span><b>rH  r
  r	  uA    שנ׳</b></div><div class="metric"><span>תמונות</span><b>r	  </b></div></article>Nr  r  s   & r   r   _v49_studio.<locals>.<genexpr>-%  sr      E  sD  no)!%%*?)@uQUUSZ^G\F]]stutyty  {N  OP  uQ  RU  tV  Vi  jk  jo  jo  p~  @  jA  BE  iF  FB  CD  CH  CH  IV  WX  CY  BZ  Z]  ^_  ^c  ^c  ds  tu  ^v  wz  ]{  {|  }~  }B  }B  CP  QR  }S  |T  Th  i  sDs   B B"r0  c              3      "   T Fn  pR \        VP                  R4      4       R\        VP                  R4      4       RVP                  R^ 4      R R\        VP                  R^ 4      4       R	2	x  Kp  	  R
# 5i)u)   <article class="preview-card"><h3>שקף r   z</h3><p>r  u.   </p><div class="metric"><span>משך</span><b>r*  r0  u=    שנ׳</b></div><div class="metric"><span>גודל</span><b>r  r  Nr  r 
  s   & r   r   r  .%  s       F  sE  no<U155==Q<RRZ[`abafafgman[oZp  q_  `a  `e  `e  fp  qr  `s  tw  _x  xu  vB  CD  CH  CH  IO  PQ  CR  vS  uT  Th  i  sEr  rM  u*   <p>אין סרטונים פעילים.</p>r  z2</section><section class="panel"><h2>Timeline</h2>u_   </section><section class="panel"><h2>Preview ומדיה פעילה</h2><p><a class="btn" href="r	  uU   " target="_blank">▶️ פתח מצגת פעילה</a></p><div class="preview-grid">z</div></section>Presentation Studiostudiouy   ציר זמן, קצב תמונות, סרטונים ותצוגה מקדימה — ללא שינוי בקובץ הפעיל.)r  r'
  r	  r   r   r  r
  r  )r  r   r	  r0  vidsr  s         r   _v49_studior  +%  sD   F A& IaOklrOs3
''  E  st  sx  sx  y@  AC  sD  E  EE	  F  st  sx  sx  yA  BD  sE  F  
F  
v  
v  JvD!%(Z[hij[kZl  mL  MR  SV  Wa  Sb  Mc  Ld  dy  z~  y  O  
PD+HV  B}  ~  ~r   c                  2   \        4       p \        V 4      pR P                  R VP                  R. 4       4       4      pR\	        VP                  R. 4      4       RVP                  R^ 4       R\        V 4       R\        V 4       RV R	2p\        R
RWR4      # )r   c              3   H  "   T F  pR VP                  R4      '       d   RMVP                  R4      R8X  d   RMR R\        VP                  R4      4       R	\        VP                  R
R4      4       R\        VP                  R4      4      ;'       g    R R2	x  K  	  R# 5i)r  r  r
  r	  r  r&
  r
  r
  r   </b><br><small>r
  r   r  r  r  r  Nr  r	  s   & r   r   _v49_qa.<locals>.<genexpr>5%  s"      R  Q  z{8QUU4[[E155>S\C\xbgiiuv{|}  }B  }B  CI  }J  wK  vL  L[  \a  bc  bg  bg  hr  su  bv  \w  [x  xI  JO  PQ  PU  PU  V^  P_  J`  Ji  Ji  di  Ij  jt  u  Qr  r	  u9   <section class="panel"><h2>Run Full QA</h2><p>נבדקו u    בדיקות. ציון: <b>rX  z?/100</b>.</p><p><a class="btn" href="/admin/platform/qa?target=u   ">🔄 הרץ שוב</a> <a class="btn" href="/admin/platform/repair-presentations">🛠️ סנכרן מצגות פעילות</a> <a class="btn" href="/admin/platform/report.json?target=uy   " target="_blank">JSON</a></p><table><thead><tr><th>מצב</th><th>בדיקה</th><th>פירוט</th></tr></thead><tbody>r  	QA CenterqauY   בדיקות מבנה, מדיה, Timeline, רגרסיה, אופליין וביצועים.)r  r'
  r   r   r,  r
  r  )r  r   r  r  s       r   _v49_qar  3%  s   F A& Ia	  R  @  D  D  EM  NP  Q  R  
RDDSxXZI[E\D]]yz{zz  AH  IJ  {K  zL  LK  LQ  RX  LY  KZ  ZU  V[  \b  Vc  Ud  d]  ^b  ]c  c}  
~Dk$v  4O  P  Pr   c                  r   \        4       p \        V 4      p\        V 4      w  r#rE. pR  FG  p\        V4      V,          pVP	                  4       '       g   K-  VP                  \        V4      4       KI  	  VP                  R/ 4      qP                  R/ 4      p
VP                  R. 4       Uu. uF4  pRVP                  RR4      9   g   VP                  R4      R8X  g   K2  VNK6  	  ppRP                  R	 V 4       4      ;'       g    R
pRP                  R V 4       4      ;'       g    RpR\        V4      P	                  4       '       d   RMR R\        V	P                  R^ 4      4       RV
P                  RR4       RV
P                  RR4       RV'       d   RMR RV RV R2p\        RRWR4      # u upi )!r	  rT  rk  r	  ra  r   r   r
  r	  c              3      "   T FZ  pR VP                  R4      '       d   RMR R\        VP                  R4      4       R\        VP                  R4      4       R2x  K\  	  R# 5i)	r  r  r
  r
  r  r   r  r  Nr  r	  s   & r   r   "_v49_deployment.<locals>.<genexpr>B%  sr       [  RZ  MN8QUU4[[Ee<IeAEERXMFZE[[dejklkpkpqykze{d|  }G  H  RZs   A$AA$uJ   <tr><td colspan="3">אין בדיקות אופליין בדוח.</td></tr>c              3   @   "   T F  pR \        V4       R2x  K  	  R# 5ir  r
  r  s   & r   r   r  C%  s     JEqE!H:\:Er#
  uD   <li>לא נמצאו שרידים חיצוניים ידועים.</li>ux   <section class="grid"><article class="card"><h2>קבצים פעילים</h2><div class="metric"><span>מצגת</span><b>u
   קיימתu   חסרהu?   </b></div><div class="metric"><span>משקל כולל</span><b>re  u=   </b></div><div class="metric"><span>Wi‑Fi 100Mbps</span><b>rl  r  u;    שנ׳</b></div><div class="metric"><span>10Mbps</span><b>rn  u0    שנ׳</b></div></article><article class="card r  r  u;   "><h2>שרידי ארכיטקטורות ישנות</h2><ul>u   </ul></article></section><section class="panel"><h2>Offline Registry</h2><table><thead><tr><th>מצב</th><th>בדיקה</th><th>פירוט</th></tr></thead><tbody>r  zDeployment & Offline
deploymentuf   בדיקת קבצים, משקל, זמן הורדה, Registry ושרידים מגרסאות ישנות.)r	  r	  rZ   )r  r'
  r	  r   r   r  r   r   r   r  r  )r  r   r	  r  presrS   staler   fpr  rf  r  registryr  
stale_htmlr  s                   r   _v49_deploymentr  :%  s   F A& Ia_opv_wK^3TX
ES:d?99;;SW- T 
}R	 Dhh/B2&F#x+t+A/?155PRCS/SWXW\W\]gWhjsWsaa+Ht	  [  RZ  [  
[  
k  
k  _kDwwJEJJ  U  U  OUJ F  W[  \`  Wa  Wh  Wh  Wj  Wj  GS  pz  F{  {z  {G  HL  HP  HP  Q^  _`  Ha  {b  zc  c`  ad  ah  ah  iw  x}  a~  `  z  {~  {B  {B  CT  UZ  {[  z\  \L  W\  MS  bf  Lg  gb	  c	m	  b	n	  n	R  SW  RX  Xr  
uD,\&  Go  p  p	 us   */F4F4c                     \        4       p \        V 4      p\        V4      pR P                  R V 4       4      pR P                  R VP	                  R. 4       4       4      pRT RT;'       g    R R2p\        RR	WR
4      # )r   c              3   J   "   T F  w  rR V R\        V4       R2x  K  	  R# 5i)z<div class="recommend r  rZ	  Nr
  )r   r,
  rY  s   &  r   r   !_v49_analytics.<locals>.<genexpr>J%  s(     ]Y\XS-cU"U4[MHY\s   !#c              3     "   T F  pR \        VP                  R4      4       RVP                  R^ 4      R RVP                  R^ 4      R R\        ^d\        ^ VP                  R^ 4      ^
,          ^d,          4      4      R R	2	x  K  	  R
# 5i)z<article class="card"><h2>r`   u>   </h2><div class="metric"><span>זמן סרטונים</span><b>r	  r0  uA   </b></div><div class="metric"><span>זמן לתמונה</span><b>r	  z.</b></div><div class="bar"><span style="width:r  z%"></span></div></article>N)r
  r   r  r>  r  s   & r   r   r  K%  sE      c  Qb  LM.uQUU7^/D.E  FD  EF  EJ  EJ  KZ  [\  E]  ^a  Db  bc  de  di  di  j}  ~  d@  AD  cE  Es  tw  x{  |  @A  BC  BG  BG  H[  \]  B^  _a  Ba  be  Be  |f  tg  hk  sl  lF  G  Qbs   B	Br0  r  uI   </section><section class="panel"><h2>המלצות אוטומטיות</h2>u   <p>אין המלצות.</p>u   <p class="muted">המלצות אלו מבוססות על נתוני הקבצים והספים הקבועים; הן אינן משנות קבצים אוטומטית.</p></section>	Analytics	analyticsu^   ניתוח השפעת סרטונים, קצב תמונות, משקל והמלצות פעולה.)r  r'
  r  r   r   r  )r  r   rz	  rec_htmlr0  r  s         r   _v49_analyticsr  H%  s    F A& IaOcdeOf3WW]Y\]]H
''  c  QR  QV  QV  W^  _a  Qb  c  cE!%(qrz  s\  s\  \  r]  ]N  
ODk+f  ;[  \  \r   c                  \   \        4       p \        ;QJ d*    R  V P                  4        4       F  '       d   K   RM	  RM! R  V P                  4        4       4      p\        R V P                  4        4       4      p\        R V P                  4        4       4      p. pV P	                  4        F  w  rV\        V4      w  rxVP                  RV RV R\        V4       R\        \        V,          R	,          4       R
VP                  R^ 4       R\        VP                  R. 4      4       R24       K  	  RV'       d   RMR RW#,
           RT RT RRP                  V4       RV'       d   RMR R\         R\        P                  ! 4       P                  RR7       R2p	\!        RR R!V	R"4      # )#c              3   B   "   T F  qP                  R 4      x  K  	  R# 5irr  Nr`  r.  s   & r   r   _v49_audit.<locals>.<genexpr>Q%  s     )XGW!%%*=*=GWr	  FTc              3   X   "   T F   p\        VP                  R . 4      4      x  K"  	  R# 5i)r	  N)r,  r   r.  s   & r   r   r  R%  s%     G6FSx+,,6Fs   (*c              3      "   T FO  qP                  R . 4       F7  q"P                  R4      '       d   K  VP                  R4      R8w  g   K3  ^x  K9  	  KQ  	  R# 5i)r	  r  r	  r  Nr`  )r   r   r  s   &  r   r   r  R%  s       T~_oZ[y~y~  @H  IK  zLtu  TY  TY  Z^  T_TU  de  di  di  jq  dr  t}  d}TUTU  zLTU_os   ,AAAr  r  r  r  r`   z</h2><div class="score">rX  z	</div><p>r	  u    בדיקות</p></article>z<section class="panel"><h2>r  u!   ⚠️ לא מוכן למסירהr  r&  u$   </div><p>בדיקות שעברו · u    כשלים חוסמים</p><p><a class="btn" href="/admin/platform/audit">🔄 הרץ בדיקת מוכנות מלאה</a> <a class="btn" href="/admin/platform/audit.json" target="_blank">דוח JSON</a></p></section><section class="grid">r   uB   </section><section class="panel"><h2>חותמת מסירה</h2><p>u@   כל היעדים עברו את תנאי הסף של המנוע.uS   אין להכריז על GOLD לפני תיקון כל הכשלים החוסמים.u   </p><small>מנוע vu    · נוצר rl  r  z</small></section>u    בדיקת מוכנות מלאהauditr	  uP   Audit מאוחד לכל יעדי המצגות הרשומים בפלטפורמה.)r  r	  r  r  r  r  r  r
  r	  r   r,  r   TRIP_PLATFORM_QA_VERSIONr   r  r
  r  )
r  	all_readytotal_checksrb  r  rT  r   r  r`   r  s
             r   
_v49_auditr  P%  s   NGcc)Xw~~GW)Xccc)Xw~~GW)X&XIGgnn6FGGLPS  T~_f_m_m_o  T~  Q~
E ^U\\4I&Qfgmfnnpqvw|q}p~  J  KP  Qm  nq  Qr  sz  Q{  K|  J}  }U  VW  V[  V[  \c  de  Vf  Ug  gp  qt  uv  uz  uz  {C  DF  uG  qH  pI  Id  3e  &f !(Y)9Lo(p  qG  HT  H[  G\  \]  ^j  ]k  kO  PV  OW  WG  HJ  HO  HO  PU  HV  GW  WY  `	i	  Z\	  o	D  YE  EZ  [s  Zt  tA  BJ  BN  BN  BP  BZ  BZ  dm  BZ  Bn  Ao  oA  
DD8T  Se  f  fr   z/admin/platformz/admin/platform/dashboardc                      \        4       # r   )r  r  r   r   admin_platform_dashboard_v49r  Z%  s    +9+;$;r   z/admin/platform/studioc                      \        4       # r   )r  r  r   r   admin_platform_studio_v49r  ^%  s
    (3!5r   z/admin/platform/qac                      \        4       # r   )r  r  r   r   admin_platform_qa_v49r  a%  s
    $+I-r   z/admin/platform/deploymentc                      \        4       # r   )r  r  r   r   admin_platform_deployment_v49r  d%  s    ,;,=%=r   z/admin/platform/analyticsc                      \        4       # r   )r  r  r   r   admin_platform_analytics_v49r  g%  s    +9+;$;r   z/admin/platform/auditc                      \        4       # r   )r  r  r   r   admin_platform_audit_v49r  j%  s
    '1| 3r   z/admin/platform/report.jsonc                  p    \        4       p \        \        P                  ! \	        V 4      R ^R7      RR7      # )Fr   r5
  r6
  )r  r   r   r  r'
  r8
  s    r   admin_platform_report_json_v49r   m%  s7    FDJJ@HV[cde  tU  V  Vr   z/admin/platform/audit.jsonc            
      \   \        4       p R \        R\        P                  ! 4       P	                  RR7      R\
        ;QJ d*    R V P                  4        4       F  '       d   K   RM	  RM! R V P                  4        4       4      RV /p\        \        P                  ! VR^R	7      R
R7      # )r  r	  rl  r  rr  c              3   B   "   T F  qP                  R 4      x  K  	  R# 5ir  r`  r.  s   & r   r   0admin_platform_audit_json_v49.<locals>.<genexpr>u%  sD       }l  [k  VW  ~C  ~C  DP  ~Q  ~Q  [kr	  FTr  r   r5
  r6
  )
r  r  r   r  r
  r	  r  r   r   r  )r  r   s     r   admin_platform_audit_json_v49r  r%  s    NG/x||~?W?Waj?W?klxy|y|  }l  [b  [i  [i  [k  }ly|y|y|  }l  [b  [i  [i  [k  }l  zl  mv  w~  GDJJwECQrssr   u  function allOfflineAssetUrls() {
    // מקור אמת יחיד: קובץ המצגת ורשימת המדיה המוטמעת שהאדמין מייצר.
    // אין לצרף סריקת DOM: תמונה ישנה שהוחלפה בסרטון עלולה להיספר
    // לצד הסרטון וליצור פער שקרי בין קובץ הטיול למצגת.
    const inline = eitanReadInlineManifest();
    const declared = (Array.isArray(inline.items) ? inline.items : [])
      .map(item => item && (item.url || item.file))
      .filter(src => src && !/^data:/i.test(src))
      .map(absoluteAssetUrl);
    return [...new Set([canonicalPresentationUrl(), ...declared])];
  }c                   \         P                  ! R\         P                  ! V4      ,           R,           V \         P                  4      pV'       g   R# V P	                  RVP                  4       VP                  4       4      pV^ 8  d   R# ^ pTpRpRpRpV\        V 4      8  Ed    W,          p	V^,           \        V 4      8  d   W^,           ,          MRp
VR8X  d   V	R	9   d   RpMVR
8X  d   V	R8X  d   V
R8X  d   RpV^,          pMVR8X  d   V'       d   RpMV	R8X  d   RpMW8X  d   RpMV	R8X  d   V
R8X  d   RpV^,          pMrV	R8X  d   V
R8X  d   R
pV^,          pMXV	R9   d   RpT	pRpMJV	R8X  d   V^,          pM9V	R8X  d3   V^,          pV^ 8X  d#   VP                  4       V^,           V^,           V3# V^,          pEK0  R# )a	  Return (start, end, body_start, body_end) for a named classic JS function.

The scanner balances braces while ignoring strings and comments. This avoids the
fragile non-greedy regex that previously failed when a function contained nested
blocks or arrow callbacks.
zfunction\s+z\s*\([^)]*\)\s*\{Nr  rS  r   Fline_commentz
block_commentr  r&  stringr%  Tr  )'r}  `)r  r  r   r  findr)  r*  r,  )r  function_namer
  
open_bracedepthr  r   r6  r   chnxts   &&         r   _v51_js_function_spanr  %  s    IInryy'??BVVX^`b`d`deES%++-=JA~EAEEF
c&k/Y 1us6{2fUmN"V|o%SySCZQhtSySCZ&Qsscz'Q& s
s
A: ;;=!a%aBB	Qr   c                 P    \        W4      pV'       g   R # W^,          V^,           # r   )r  )r  r  spans   && r   r	  r	  %  s%     7Dq'$q'""r   c                v   \        V 4      p \        P                  P                  V 4      '       g   RRRRRRRV /# \	        V 4      p\        VR4      pV'       g   RRRRRRRV /# W#^ ,          V^,           pVP                  4       \        P                  4       8g  pVR	V^ ,           \        ,           W#^,          R	 ,           p\        VR4      ;'       g    R
pRV9   ;'       d     RV9   ;'       d    RV9  ;'       d    RV9  pV'       g   RRRRRRRV /# V'       d   \        WRV 24       RRRVRV RRRRRR/# )a  Repair an already-patched presentation in place.

Older TV files already contained the media runtime marker, so the normal patcher
skipped them before replacing allOfflineAssetUrls(). This targeted repair is
idempotent and preserves every slide, image, video and timing value.
r  FrD  rp  r  r   r	  offline_function_missingNr   r	  canonicalPresentationUrlr	  r	  repair_verification_failedv51_offline_registry_Tsingle_sourceuses_inline_registryuses_dom_scan)
r   r   r   rg  r  r  r   V51_OFFLINE_REGISTRY_FUNCTIONr	  r  )	r'  r	  r	  r  r
  rD  r   r  r.  s	   &&       r   )_v51_force_single_source_offline_registryr  %  s{    -.77>>+,,eYw8NPVXijj01D '<=DeYw8RTZ\mnn747#Gmmo!>!D!D!FFG8DGn<<tGH~MG(2GHNNBD!T) 	, 	,&$.	, 	,d*	, 	,  t+	 
 eYw8TV\^opp/0ANcdncoLpqd7! r   c                &   \        V 4      w  rr4\        P                  P                  V4      '       g   RRRV RRRV/# \	        W4      p\        V4      ^8w  g;   \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       g   RRRV RR	R
V/# \        V4      p\        V^ ,          R,          4      \        V^,          R,          4      .p\        P                  ! RRV^ ,          R R2V^R7      w  r\        P                  ! RRV^,          R R2V^R7      w  rV	'       d	   V
'       g	   RRRV RR/# W8w  d   \        W8RV  24       V R8X  d   RMRp\        V4      p\        W04      p\        V4      p\        V4      p\        W4      w  pp\!        V4      w  pp\#        VR4      ;'       g    Rp\%        RV9   ;'       d    RV9  ;'       d    RV9  4      p\%        T;'       dU    T;'       dK    \        VP'                  R4      ;'       g    . 4      ^8  ;'       d    VP'                  R4      ;'       d    T4      pRTRT RTRTR TR!TR"\        T;'       g    / P'                  R4      ;'       g    . 4      R#VR$VR%VR&V/# )'a  Synchronize the active presentation in-place while preserving current media.

The operation is safe and repeatable:
1. Probe the two active MP3 files.
2. Write their real durations into PART_1_SECONDS / PART_2_SECONDS.
3. Run the existing media-engine patch against the files currently on disk.
4. Rebuild the inline Registry from the actual image/video siblings.
Every write uses the existing atomic backup helpers.
r  Fr  rp  r  r   c              3      "   T F;  qP                  R 4      ;'       d    VP                  R4      ;'       g    ^ ^ 8  x  K=  	  R# 5ir	  r`  r  s   & r   r   0_v50_sync_presentation_target.<locals>.<genexpr>%  s<     !d^cYZ%%
"3"T"Tz9J9O9OaST8T"T^cr	  Taudio_probe_failedrU   r*  z6\bconst\s+PART_1_SECONDS\s*=\s*[0-9]+(?:\.[0-9]+)?\s*;const PART_1_SECONDS = r  r  r  z6\bconst\s+PART_2_SECONDS\s*=\s*[0-9]+(?:\.[0-9]+)?\s*;const PART_2_SECONDS = duration_constants_missingv51_audio_truth_r	  r_   rj   r	  r   r	  r	  r	  r  rs   r	  audio_matchaudio_detailr	  r
  r8  offline_registry_repairoffline_registry_single_source)r	  r   r   rg  r	  r,  r	  r  rg  r  r!  r  r  r  r  r	  r	  r	  ru  r   )r	  r	  r  r'  
_media_dirrU   r	  r  r   n1n2variantr8  r(  
final_htmlr  match_okmatch_detailr
  r
  registry_bodyregistry_okr  s   &                      r   _v50_sync_presentation_targetr3  %  s    0@
/K,C 77>>+,,eXz7<RTZ\mnn(3E
5zQcc!d^c!dccc!d^c!dddeXz7<PRY[`aa01DE!HZ()5q*1E+FGF''SWnouvwoxy|n}}~U  BF  NO  PKG''SWnouvwoxy|n}}~U  BI  QR  SKG2eXz7<XYY/0AN^_i^jLkl#{2gG1':FGHYf$%67J*:6J6zIHl6zBFL1*>STZZXZM0MA  [  [FX`mFm  [  [  sF  N[  s[  \K	h6c&**W*=*C*C&D&INeNiNijnNot  
ABb*)vxV\\r..w7==2>&!#:(+ r   c            
      h   / p R F  p \        V4      W&   K  	   \        P                  P                  \        R4      p\        VRRR	\        P                  ! 4       P                  R
R7      RV /4       V #   \         d   pRRRTR\        T4      /Y&    Rp?K  Rp?ii ; i  \         d     T # i ; i)r	  r  Fr  rp  Nz&v51_presentation_migration_report.jsonr  z51.0r	  rl  r  r  )r	  r	  )r3  r   r~  r   r   r   r  r   r   r  r
  )r  rT  r  outs       r   run_v51_safe_migrationr6  &  s    G&	L8=GL '
ggll8%MNy&.(,,.BZBZdmBZBnpy  |C  D  	E N  	L %3cKGL	L
  Ns)   A6AB" 6BBB"B10B1z$/admin/platform/repair-presentationsc                     \         P                  R 8X  d   \        RR4      # \        4       p \        ;QJ d*    R V P                  4        4       F  '       d   K   RM	  RM! R V P                  4        4       4      p\        P                  ! V R^R7      p\        V'       d   RMRV'       d   R	MR
VVR7      V'       d   ^3# R3# )r  u1   סנכרון מצגות — אישור פעולהu  <div class="card warn"><h1>סנכרון ותיקון מצגות</h1><p>הפעולה בודקת את קובצי המצגות הפעילים ועלולה לעדכן זמני שירים, Registry ומיפויי מדיה. שום שינוי לא מבוצע בכניסה למסך זה.</p><form method="post" onsubmit="return confirm('להפעיל כעת את סנכרון המצגות על הקבצים הפעילים?')"><button type="submit">הפעל סנכרון ובדיקה</button></form></div>c              3   B   "   T F  qP                  R 4      x  K  	  R# 5ir-  r`  r  s   & r   r   :admin_platform_repair_presentations_v51.<locals>.<genexpr>4&  s     3"2QUU4[["2r	  FTr   u$   סנכרון המצגות הושלםu-   סנכרון המצגות דורש בדיקהus   זמני השירים, מנוע המדיה ו־Registry עודכנו מתוך הקבצים הפעילים בשרת.u<   לפחות יעד אחד לא הושלם. ראה פירוט.r=  r   )	r   r  	_upd_pager6  r	  r  r   r  r3  )r  r  r>  s      r   'admin_platform_repair_presentations_v51r;  ,&  s    ~~? @
 	
 %&G	3'.."233'.."23	3BjjuQ?G24.:i BD}  JH	
  
  r   zusa_music_segments_v53.jsonc                  
   R ^RRRR^R\         R,          RRR	R
RR^R^R\        P                  P                  RRRRR4      /./R^R\         R,          RRRR
RR^R^,R\        P                  P                  RRRRR4      /././# )r  r  53.0rZ  r  r  rR   segmentsidzsong-1r`   u   שיר 1
startSlideendSlider  rS   rT   rU   zpart1-song1.mp3rW   zsong-2u   שיר 2zpart2-song1.mp3)r  r   r   r   r  r   r   _v52_default_music_segmentsrB  F&  s    !6aok&BJx*lAzSU277<<0B7:VghjQ  ao6G&H*x*lB
TV277<<0B7:VghjW 	
 r   c           	          \        V 4       V R ,           p\        VRRR7      ;_uu_ 4       p\        P                  ! WR^R7       RRR4       \        P
                  ! W 4       R#   + '       g   i     L(; i)r   r   r   r   Fr   Nr  r   r   r   r   r   )r   r   r   r  s   &&  r   _v52_json_writerE  W&  sN    d
-C	c3	)	)Q		$a8 
*JJs 
*	)s   A%%A5	c                     \         P                  P                  \        4      '       d'    \        P
                  ! \        \        R R7      4      # \         P                  P                  \        R4      p \         P                  P                  V 4      '       dE    \        P
                  ! \        V R R7      4      pRVR&   \        V4       \        \        V4       V# \        4       pR F  p\        V,          pVR,           F  p\         P                  P                  W4R,          4      p\         P                  P                  W4R,          ^ ,          R	,          4      p\        V4       \         P                  P                  V4      '       g   K  \         P                  P                  V4      '       d   K  \        P                   ! WV4       K  	  K  	  \        R,          pVR,           F  p\         P                  P                  WtR,          4      p\         P                  P                  V4      '       d   \#        V4      MR
R/pVP%                  R
4      '       d%   \'        VP%                  R4      ;'       g    ^ 4      MRp	WR&   VP%                  R4      '       g   K  WR,          ^ ,          R&   RVR,          ^ ,          R&   K  	  \        \        V4       V#   \         d     ELi ; i  \         d     EL!i ; i)r   r   zusa_music_segments_v52.jsonr=  r  r(   rZ  r  r>  r  r  Frw  r  r*  offsetr  )r   r   rg  USA_MUSIC_SEGMENTS_CONFIGr   r   r   r   r   r  _v52_validate_segmentsrE  rB  r  r  rF  r  r  r   rg  )
legacy_configr   ra   r  r  r  r  
phone_rootrw  r*  s
             r   "_v52_ensure_initial_music_segmentsrL  _&  s0   	ww~~/00	99T";gNOO
 GGLL+HIM	ww~~m$$	99T-'BCD$DO"4(5t<K '(D%x (^^ET+=>IWW\\$j(9!(<X(FGFf%ww~~i((1G1GY/ $ & JhGGLL;-?@	;=77>>);T;T,Y7[_`eZf@E		$5#56;;!<UX$j99Z  /7*a ,-0E*a *   -t4KE  		  		s$   $K AK0 K-,K-0K?>K?c           	      V   V P                  R 4      ;'       g    . p\        V4      ^8w  d   \        R4      h^R^R/p. pV EF  p\        VP                  R4      ;'       g    ^ 4      pWR9  d   \        R4      h\	        VP                  R4      ;'       g    . R R7      pV'       g   \        RV R24      hW%,          ^ ,          pV EF,  p\        VP                  R	4      ;'       g    ^ 4      p	\        VP                  R
4      ;'       g    ^ 4      p
W8w  d   \        RV RV R24      hW8  g   WV,          ^,          8  d   \        RV R24      h\        VP                  R4      ;'       g    R4      P                  4       '       g   \        R4      h\        VP                  R4      ;'       g    R4      P                  4       '       g   \        R4      hV
^,           qsP                  V4       EK/  	  WrV,          ^,          ^,           8w  g   EK  \        RV R24      h	  R# )rZ  uj   במצגת ארה״ב קיימות שתי קבוצות אודיו: שקפים 1–23 ושקפים 24–44.r  u&   קבוצת אודיו לא חוקית.r>  c                 J    \        V P                  R 4      ;'       g    ^ 4      # )r@  )r   r   r%  s   &r   r  (_v52_validate_segments.<locals>.<lambda>&  s    c!%%BUBZBZYZ>[r   r  u   קבוצה u0    חייבת להכיל לפחות שיר אחד.r@  rA  uT   : החלוקה חייבת להיות רציפה. ציפיתי להתחלה בשקף r(  u$   : טווח שקפים לא תקין.r`   r   u   לכל שיר נדרש שם.r  u)   לכל שיר נדרש קובץ מקור.u5   : לא כל השקפים משויכים לשירים.T)r  rI  )rJ  rN  )r   r,  r  r   r  r   r   r  )r   rZ  r  all_rowsr  gidr  r  r  r)  r*  s   &          r   rI  rI  &  s   XXh%%2F
6{a  F  G  	G&!G$HH		'"''a(j1Y&Z ZEIIj)//R5[\:C58h&ijj}QCcggl+00q1Es377:;N;S;SRS7T3j;se  DX  Y_  X`  `a  2b  'c  !c{cSM!$44JUXTYY}G~<6swww'--2.4466jIg>h8hswwx(..B/5577zJu?v9vq5F//#.  c]1%a''zKu  MB  ;C  0D  *D  r   c                 ~   \        4       pV'       g   \        R 4      h. pVP                  R4      ;'       g    .  F  p\        P                  P                  WR,          4      p\        P                  P                  V4      '       g   \        V4      h\        V4      pVP                  R4      '       g0   \        R\        P                  P                  V4      ,           4      h\        VR,          4      VR&   VP                  V4       K  	  \        P                  P                  WR,          4      p\        V4       \        V4      ^8X  d@   VR,           p\        P                  ! V^ ,          V4       \        P                   ! W4       EM3VR	,           p	\#        V	R
RR7      ;_uu_ 4       p
V F2  pV
P%                  RVP!                  RR4      ,           R,           4       K4  	  RRR4       VR,           p\'        VRRRRRRRRRV	RRRRR R!R"R#R$V.R%R&7      p\        P(                  ! V	4       VP,                  ^ 8w  g&   \        P                  P                  V4      '       gG   \        R'\/        VP0                  ;'       g    VP2                  ;'       g    R(R-R 4      ,           4      h\        P                   ! W4       \        V4      pVP                  R4      '       g   \        R)4      h\5        R* VR,           4       4      p\        VR,          4      V,
          pVR,          '       d$   VR,          R.,          R;;,          V,          uu&   R+pVR,           F   pWR,&   V\        VR,          4      ,          pK"  	  \        VR,          4      VR&   V#   + '       g   i     EL; i  \*         d     ELi ; i)/uL   FFmpeg לא נמצא; לא ניתן לחבר מספר שירים בבטחה.r>  r  r  (   לא ניתן למדוד את השיר: rw  r*  r  z.v52.tmpz.concat.txtr   r   r   zfile 'r	  z'\''z'
Nz.v52.tmp.mp3r  r  r  rp  r0  concatz-safer   r  r  r  r   r  2r  r  r  r   r%	  rt  u"   חיבור השירים נכשל: r   uA   לא ניתן למדוד את קובץ השירים המאוחד.c              3   j   "   T F)  p\        VP                  R 4      ;'       g    ^ 4      x  K+  	  R# 5ir	  rg  r   r  s   & r   r   $_v52_concat_group.<locals>.<genexpr>&  s+     G5FeAEE*%**++5F   !33r  rG  ru  r  )rK  r  r   r   r   r   rg  r  r  r   rg  r  r  r,  rF  r  r   r   r  rb  r  r   r{  r   rz  ry  r  )r  r  rC  sourcesr  r  rw  r  r   	list_pathr  r^  r	  rj  r  rG  s   &&              r   _v52_concat_groupr\  &  s5   !#F&tuuGyy$***GGLL(m,ww~~c""*;C*@$@*3/yyl3]^`^e^e^n^nor^s3s&t te$678Js + ggll4k 23Ii 
7|Qj WQZ$bjj&?M)	)C11QS!99%?@  2 n$!6$~k'RVW_`ghklpqz  |A  BG  HO  PU  VY  Z`  am  nt  u{  |  #@  IL  MYYy!>>1BGGNN3$7$7CCIgIgWZWaWaIgIgeginioHpDqqrr


3!'	2F::d<0s#tt
GU:5FG
GE&+,-e3GZ%
+B/
;wF;FZ  Hfc*o(>>f !F#567E*' 211 $s   .9NN- N*	-N<;N<c                    \        V 4      pR ^RRR. /pVR,           Fx  pVR,          P                  RVR,          RVR,          RVP                  R4      RVR,           UUu. uF$  pR Uu/ uF  qfVP                  V4      bK  	  upNK&  	  upp/4       Kz  	  R\        P                  ! VR	RR
7      ,           R,           pRV9   d*   \
        P                  ! RWr^\
        P                  R7      pMHVP                  RVP                  R4      4      pV^ 8  d   \        R4      hVRV V,           W(R ,           pVR,           Uu. uF  p\        R VR,           4       4      NK  	  p	p\
        P                  ! RRV	^ ,          R R2V^R7      w  r*\
        P                  ! RRV	^,          R R2V^R7      w  r+V
'       d	   V'       g   \        R4      h\        WR4       R# u upi u uppi u upi )r  r  r=  rZ  r  r  r*  r>  z<<script id="usa2027-music-segments" type="application/json">Fr  r  zid="usa2027-music-segments"z5<script id="usa2027-music-segments"[^>]*>.*?</script>r   z<script>usa2027-inline-media-manifestu>   לא נמצא עוגן להטמעת מקטעי המוזיקה.Nc              3   j   "   T F)  p\        VP                  R 4      ;'       g    ^ 4      x  K+  	  R# 5ir	  rW  r.  s   & r   r   3_v52_patch_presentation_segments.<locals>.<genexpr>&  s)     H-Q5z*//a00-rY  z(const\s+PART_1_SECONDS\s*=\s*[0-9.]+\s*;r"  r  r  r  z(const\s+PART_2_SECONDS\s*=\s*[0-9.]+\s*;r#  u7   קבועי משך המוזיקה חסרים במצגת.v53_dynamic_music_segments)r?  r`   r@  rA  r*  rG  r  )r  r  r   r   r  r  r(  r  r  r  r  r!  r  )r   configr	  r   gr   r  r  anchorr  r+  r,  s   &&          r    _v52_patch_presentation_segmentsre  &  sM   	T	"Da	&"5GH  '!G*[;PZ[\[`[`ak[lmw  TU  V`  Ta  yb  Ta  OP  OI  zJ  OI  JK|}  }B  }B  CD  }E  {E  OI  zJ  Ta  yb  "c  	d 	G

SZhm  zC  ID  
D  EP  
PD$,VVLT]^egeieijyyDII.M$NO!8:&fgg'6]4W-RXYaRbcRbQsH!J-HHRbIcGG?BYZcdeZfgjYkkl@mnryz{GDGG?BYZcdeZfgjYkkl@mnryz{GD2j)bcc+D6RS zJ  yb ds   "	G%+G  G%"G+ G%c           
     Z   \        V 4       \        R,          pV P                  R4      ;'       g    .  F  pRpVP                  R4      ;'       g    .  F  p\        P                  P                  WR,          4      p\        P                  P                  V4      '       g   \        V4      h\        V4      pVP                  R4      '       g0   \        R\        P                  P                  V4      ,           4      h\        VR,          4      VR	&   W4R
&   W4R	,          ,          pK  	  W2R	&   K  	  . pR F  p\        W4       F  pVR,          '       dE   VR,          \        8  d3   TP                  VR8X  d   RMR RVR,           RVR,          R R24       VR,          \        VP                  R	4      ;'       g    ^ 4      R,           8  g   K  TP                  VR8X  d   RMR RVR,           R24       K  	  K  	  V'       d"   \        RRP                  V4      ,           4      hR# )zUMeasure every source and reject a layout before any canonical MP3 or HTML is changed.r(   rZ  r  r>  r  r  rS  rw  r*  rG  r_   
imageCountperImageSecondsrU  rY  r  r`   rJ  r0  u&    שניות בלבד לכל תמונהvideoSecondsrY  u4   : משך הסרטונים ארוך ממשך השירu,   לא ניתן לשמור את החלוקה:
ru  Tr_   rj   )rI  r  r   r   r   r   rg  r  r  r  r   rg  _v52_segment_metrics$USA_MUSIC_SEGMENTS_MIN_IMAGE_SECONDSr  r  )	rb  rK  r  rG  r  r  rw  r^  r-  s	   &        r   _v53_preflight_music_segmentsrm  &  s   6"JH%+++99Z(..B.C'',,zx=9C77>>#&&',,05E99T??"#MPRPWPWP`P`adPe#eff#E*<$=>C
O"M*o%F / #j , H"'8C<  S):%;>b%b*1W*<BTVVZ[^_f[gZhhj,-c22XZ >"U377:+>+C+C!%Dt%KK*1W*<BTVVZ[^_f[gZh iI I 9 # H499U]K^^__r   c                 d   \         P                  ! 4       P                  R 4      p. pR	 F  p\        V,          pV P	                  R4      ;'       g    .  F  p\
        P                  P                  WER,          4      p\
        P                  P                  V4      '       g   KP  VRV R2,           p\        P                  ! Wg4       VP                  Wg34       K  	  K  	  \
        P                  P                  \        R,          \        R,          4      \
        P                  P                  \        R,          \        R,          4      3 F_  p\
        P                  P                  V4      '       g   K*  VRV R2,           p\        P                  ! Wg4       VP                  Wg34       Ka  	  V# )
r  r(   r)   rZ  r  z.before_v53_rA  rN   rP   r  )r   r  r   r  r   r   r   r   rg  rF  r  r  rM  )rb  r  rC   ra   r  r  r   baks   &       r   _v53_backup_pathsrp  &  s8   LLN##O4EG%x ZZ)//R/E77<<K&89Dww~~d##|E7$77T'{+ 0 & 	WU^%;<N%OP
WX&(>?T(UV 77>>$<wd33CLL#NND;' Nr   c                     V  FC  w  r \         P                  P                  V4      '       d   \        P                  ! W!4       KC  KE  	  R #   \
         d     KW  i ; ir   )r   r   rg  rF  r  r   )rC   r   ro  s   &  r   _v53_restore_backupsrr  '  sK    		ww~~c""S' #   		s   ;AAAc                 |   \        V 4       \        V 4      p R F+  p\        V,          pV R,           F  p\        W44       K  	  K-  	  R\        P
                  P                  \        R ,          \        R,          4      3R\        P
                  P                  \        R,          \        R,          4      33 FB  w  rV\        P
                  P                  V4      '       g   K,  \        W`4       \        V4       KD  	  \        \        V 4       V #   \         d     Kf  i ; i  \         d    \        T4       h i ; i)r(   r)   rZ  r_   rN   rj   rP   r  )rm  rp  r  r\  r   r   r   rM  rg  re  rS  r   rE  rH  rr  )rb  rC   ra   r  r  r  r   s   &      r   _v52_apply_music_segmentsrt  '  s,   !&)'G(H"D))!$- * ) %RWW\\'%.AWXjAk%lmostvt{t{  uA  uA  BI  JR  BS  Tj  k@  TA  uB  oC  DKFww~~d##0=-f5 D
 	1&9 !&$&  W%s6   CD# %D# 0D;D# D D# D  D# #D;c                    \         VR 8X  d   RMR,          p\        P                  P                  VRRR4      p\	        \        V4      4      p. p\        P                  P                  T\        VR 8X  d   RMR,          4      p\        P                  P                  V4      '       g   V# \        \        V4      4      pV P                  R4      ;'       g    .  EF  pVP                  R	4      ;'       g    .  EFr  p	^ p
R
p^ p\        \        V	R,          4      \        V	R,          4      ^,           4       F  pVP                  V^,
          ,          qP                  \        V4      P                  4       4      pV'       d[   \        V4      P                   P                  4       \"        9   d/   V
^,          q\%        \'        \        V4      4      4      ,          pK  V^,          pK  	  \%        V	P                  R4      ;'       g    ^ 4      pVV,
          pV'       d
   VV,          MR
pTP)                  / V	CRVR,          RT
RTRTRTRV'       d   V^8  d   RM
V^8  d   RMR/C4       EKu  	  EK  	  V# )r_   r(   r)   rS   rT   rd   rN   rP   rZ  r>  r  r@  rA  r*  r  
videoCountri  rg  rh  r  r	  r	  r	  )r  r   r   r   r  r   rM  rg  r  r  r   r=  r   rr  r   r   r  r  rg  ro  r  )rb  r  r  r  r  r  rs   r  r  segrM  r	  rd   r  r   r   r*  r  pers   &&                 r   rk  rk  2'  sA   	&'/x	8Dggll4(:8DI!$y/2IDd#9PVX_P_:Lez#{|L77>>,''	"#6|#D	EDH%+++99Z(..B.CFCms3|#45c#j/6J16LM%%eAg.]]3t9??CT5UDJ--3359IIAIFe4PQTUYQZ4[.\\}aif	 N
 377:.33!4H@Vi$*	& CKK  b3  bwuW~l6.Yfgstz  |M  NQ  RZ  kq  ux  z{  u{  [b  OR  TU  OU  CK  [`  b  c / , Kr   /admin/usa-music-segmentsc                     \        4       p \        V R 4      p\        V R4      pV R,           UUu. uF  q3R,           F  qDNK  	  K  	  ppp. p\        V4       F  w  rtTP                  RT R\	        VR,          4      ^8:  d   ^M^ RV R\
        P                  ! \        VP                  RR	4      4      4       R
V R\	        VR,          4       RV R\	        VR,          4       RV R\
        P                  ! \        VP                  RR	4      4      4       RV R\         R24       K  	  R pR\        V4       RR	P                  V4       RV! V4       RV! V4       R\         R2# u uppi )r_   rj   rZ  r>  zM<tr class="song-row"><td><input type="hidden" data-field="group" name="group_z	" value="r@  z("><input data-field="label" name="label_r`   r   zH" required></td><td><input data-field="start" type="number" name="start_z" min="1" max="44" value="zD" required></td><td><input data-field="end" type="number" name="end_rA  zJ" required></td><td><input data-field="source" type="hidden" name="source_r  z2"><input data-field="file" type="file" name="file_z
" accept="uE  "></td><td><div class="row-actions"><button type="button" onclick="moveRow(this,-1)" title="העבר למעלה">⬆</button><button type="button" onclick="moveRow(this,1)" title="העבר למטה">⬇</button><button type="button" class="danger" onclick="removeRow(this)" title="מחק שיר">🗑</button></div></td></tr>c                 2    R P                  R V  4       4      # )r   c              3      "   T Fl  pR \         P                  ! \        VR,          4      4       RVR,           RVR,           RVR,           RVR,           RVR	,           R
VR,          R R2x  Kn  	  R# 5i)r  r`   r  r@     –rA  rv  rg  z</td><td class="r  r  rh  r0  u    שנ׳</td></tr>Nr
  r  s   & r   r   Aadmin_usa_music_segments_v52.<locals>.<lambda>.<locals>.<genexpr>N'  s        G  BF  }~(8??3qz?+K*LIVWXdVeUffijklvjwix  yB  CD  EQ  CR  BS  S\  ]^  _k  ]l  \m  m}  ~  @H  ~I  }J  JL  MN  O`  Ma  be  Lf  fw  !x  BFs   A4A6r8  )r   s   &r   r  .admin_usa_music_segments_v52.<locals>.<lambda>N'  s!       G  BF   G  Gr   u_  <!doctype html><html lang="he" dir="rtl"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>מקטעי מוזיקה</title><style>body{font-family:Arial;background:#07111f;color:#fff;margin:0;padding:18px}main{max-width:1200px;margin:auto}section{background:#101d31;border:1px solid #304560;border-radius:22px;padding:18px;margin:14px 0;overflow-x:auto}table{width:100%;border-collapse:collapse;min-width:780px}th,td{padding:9px;border-bottom:1px solid #304560}input,button{width:100%;padding:10px;border-radius:10px;border:1px solid #64748b}button{background:#2563eb;color:#fff;font-weight:900;cursor:pointer}button.danger{background:#991b1b}.row-actions{display:grid;grid-template-columns:repeat(3,1fr);gap:5px}.green{color:#86efac}.yellow{color:#fde68a}.red{color:#fca5a5}a{color:#bfdbfe}.note{color:#cbd5e1;line-height:1.6}@media(max-width:700px){body{padding:10px}table{font-size:11px}th,td{padding:5px}}</style></head><body><main><a href="/admin">⬅ חזרה לאדמין</a><h1>🎵 מקטעי מוזיקה דינמיים</h1><p class="note">ברירת המחדל נשמרת: שקפים 1–23 ושקפים 24–44. ניתן להוסיף, למחוק ולסדר שירים. כל השקפים חייבים להישאר רציפים וללא חפיפה. לפני כתיבה המערכת מודדת את השירים ב־ffprobe וחוסמת חלוקה שמשאירה פחות מ־5 שניות לתמונה.</p><form id="songsForm" action="/admin/usa-music-segments/save" method="post" enctype="multipart/form-data"><input type="hidden" id="row_count" name="row_count" value="u   "><section><table id="songs"><thead><tr><th>שם</th><th>שקף ראשון</th><th>שקף אחרון</th><th>קובץ חדש (אופציונלי)</th><th>פעולות</th></tr></thead><tbody>up  </tbody></table><button type="button" onclick="addRow()">➕ הוסף שיר</button><br><br><button type="submit">💾 אמת, חבר שירים ועדכן את כל המצגות</button></section></form><section><h2>פלאפון / מחשב</h2><table><tr><th>שיר</th><th>שקפים</th><th>סרטונים</th><th>תמונות</th><th>זמן לתמונה</th></tr>u   </table></section><section><h2>טלוויזיה</h2><table><tr><th>שיר</th><th>שקפים</th><th>סרטונים</th><th>תמונות</th><th>זמן לתמונה</th></tr>u  </table></section></main><script>
function rows(){return [...document.querySelectorAll('#songs tbody .song-row')];}
function normalizeRows(){rows().forEach((tr,i)=>{tr.querySelectorAll('[data-field]').forEach(el=>{el.name=el.dataset.field+'_'+i;});});document.getElementById('row_count').value=rows().length;}
function addRow(){let n=rows().length;let tr=document.createElement('tr');tr.className='song-row';tr.innerHTML=`<td><input type="hidden" data-field="group" value="2"><input data-field="label" value="שיר ${n+1}" required></td><td><input data-field="start" type="number" min="1" max="44" required></td><td><input data-field="end" type="number" min="1" max="44" required></td><td><input data-field="source" type="hidden" value=""><input data-field="file" type="file" accept="uT  " required></td><td><div class="row-actions"><button type="button" onclick="moveRow(this,-1)">⬆</button><button type="button" onclick="moveRow(this,1)">⬇</button><button type="button" class="danger" onclick="removeRow(this)">🗑</button></div></td>`;document.querySelector('#songs tbody').appendChild(tr);normalizeRows();}
function removeRow(btn){if(rows().length<=2){alert('נדרשים לפחות שני שירים — אחד בכל חלק.');return;}btn.closest('tr').remove();normalizeRows();}
function moveRow(btn,dir){const tr=btn.closest('tr'),body=tr.parentElement,all=rows(),i=all.indexOf(tr),j=i+dir;if(j<0||j>=all.length)return;if(dir<0)body.insertBefore(tr,all[j]);else body.insertBefore(all[j],tr);normalizeRows();}
document.getElementById('songsForm').addEventListener('submit',normalizeRows);normalizeRows();
</script></body></html>)rL  rk  r  r  r   r   r   r   r   r
  r,  r   )	r	  r_   rj   rc  r   flatr  r  metrics	            r   admin_usa_music_segments_v52r  G'  s-   *,C4HW4UeZnorswZxWY]	:]jMMq!M!]D	:	Defgehhqwz{|  ~J  |K  xL  NP  xPrs  VW  rX  X@  AB  @C  CL  MU  M\  M\  ]`  ab  af  af  gn  oq  ar  ]s  Mt  Lu  u}  ~  }@  @Z  [^  _`  am  _n  [o  Zp  pt  uv  tw  wQ  RU  VW  Xb  Vc  Rd  Qe  eo  pq  or  r{  |D	  |K	  |K	  L	O	  P	Q	  P	U	  P	U	  V	^	  _	a	  P	b	  L	c	  |d	  {e	  e	W
  X
Y
  W
Z
  Z
d
  e
w
  d
x
  x
}  @  	A  GF S  TW  X\  T]  S^  ^]  ^`  ^e  ^e  fj  ^k  ]l  l\#  ]#c#  d#i#  ]#j#  \#k#  k#Y&  Z&`&  a&c&  Z&d&  Y&e& e&_ `r  _s s  
;s   E+z/admin/usa-music-segments/savec                     \        4        \        \        P                  P	                  R 4      ;'       g    ^ 4      p ^. ^. /p\
        P                  P                  \        R,          RRRR4      p\
        P                  ! VRR7       \        V 4       EF  p\        P                  P	                  RV 24      ;'       g    R	P                  4       p\        \        P                  P	                  R
V 24      ;'       g    ^ 4      p\        \        P                  P	                  RV 24      ;'       g    ^ 4      pV^8:  d   ^M^p\        P                  P	                  RV 24      ;'       g    R	P                  4       p\        P                  P	                  RV 24      p	V	'       Ed   V	P                  '       Ed   \        V	P                  4      ;'       g    RV^,            R2p
\
        P                  P                  \        RR\         P"                  ! 4       P$                   RV
 24      p\'        V4       V	P)                  V4       \
        P                  P                  RRRRRV R\         P"                  ! 4       P$                  R,           R24      p\
        P                  P                  \        R,          V4      p\+        WV	P                  4       \
        P,                  ! V4       \
        P                  P                  \        R,          V4      p\'        V4       \0        P2                  ! W4       W,          P5                  RRV^,            2RVRVRVRV/4       EK  	  R^RRR R!^R"\6        R#,          RV^,          /R!^R"\6        R$,          RV^,          /./p \9        V4       \?        R*4      #   \.         d     Li ; i  \.         d$   p\;        R%\=        T4      R&R'7      R(3u R)p?# R)p?ii ; i)+	row_countr(   rS   rT   rU   r>  Tr   label_r   start_end_source_file_zsong-z.binr   v53_r  rE  rs  :N
   Nr8   r)   r?  r`   r@  rA  r  r  r  r=  rZ  r  r  rR   rW   u/   שמירת מקטעי המוזיקה נכשלהFr1  rD  Nry  ) rL  r   r   r  r   r   r   r   r  r   r=  r   r  r5  r
   r  r	  r
  r  r  r  r  r  r   rF  r  r  r  rt  r3  r   r   )r  rZ  
upload_dirr  r`   r)  r*  rQ  r  rq
  r  r   r  	tv_targetrb  r  s                   r   !admin_usa_music_segments_save_v52r  Y'  s   &(GLL4D4D[4Q4V4VUV0W%abcefghj`kY_ww||GEN73EgjYJ[][f[fgq{  \A5\||&-33::<CHXHX[abcadYeHfHkHkjkDleruv}  wC  wC  wG  wG  JN  OP  NQ  HR  wS  wX  wX  WX  sYnqA7<<+;+;gaSM+J+P+Pb*W*W*Y6^e^k^k^o^orwxywzp{^|[]2"+++ -BB51T1BDU]^cfjkokukukwk{k{j||}  C  ~D  eE  IFC  HY  Z]  H^  `b  `g  `g  hk  `l77<<(:7:PTUXTYYZ[_[e[e[g[k[klo[pZqquNvwF77<<v6F8TUX`b`k`k8l3 ggll78#4V<I>OPY>Z\b\h\hio\zD51wu\%PZ[^_ghnop  Qy71[YdIefpqwxyqz2{  ~E  FG  HS  Tc  du  Tv  wA  BH  IJ  BK  }L  2M  NFj!&) /00 "d"  j !RSVWZS[_defiiijs0   N?)O ?OOO>O93O>9O>c                 2   \        V 4      p \        4       q R 8X  d   RMRp\        W#4      qDVR&   V F  pVR,          ^ 8H  ;'       g    VR,          \        8  pVP	                  R. 4      P                  RVR,           R	2R
TRRVR,           RVR,           RVR,          R R2RV'       d   R
MRRR/4       K  	  \        VP                  R4      4      ;'       d5    \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      VR&   \        VP                  R
4      4      ;'       d
    VR,          VR
&   V#   \         dG   pTP	                  R. 4      P                  R\        T4      ,           4       RTR&   RTR
&    Rp?T# Rp?ii ; i)r	  r_   rj   song_segmentsrg  rh  r	  r   r`   rb  r  r  u   שקפים r@  r}  rA  r  r0  r	  r	  rp  r
  rN  rr  c              3   h   "   T F(  qR ,          ^ 8H  ;'       g    VR,          \         8  x  K*  	  R# 5i)rg  rh  N)rl  r  s   & r   r   4build_presentation_control_report.<locals>.<genexpr>{'  sW       Dd  _c  Z[lOUVDV  EU  EUZ[\mZn  qU  [U  EU  _cs   22FTr  zDynamic music segments: N)/_v52_original_build_presentation_control_reportrL  rk  rl  r:  r  ru  r   r	  r   r~  )r	  r  r	  r-  r  r  r  r  s   &       r   r'
  r'
  s'  s3   ::FF	F.0Q\E\'bf'!#.0GC< !#ccs+<'=?c'cBhr*116S\NJp:qrvwy  {C  FQ  RU  Vb  Rc  Qd  dg  hk  lv  hw  gx  x|  }@  AR  }S  TW  |X  X_  D`  ah  qs  im  y@  AK  LV  3W  X  "&**\":;  d  d  Dd  _c  Dd  Dd  _c  Dd  Ad|&**T*+DD|0Dt M  F*R(//0J4PS90TUlqW]^jWk  AFsyz~sMFs<   :E A$E -/E E )E =8E 6E F;FFzB<section\b[^>]*data-key=[\'\"]budget[\'\"][^>]*>[\s\S]*?</section>c                <   \        T ;'       g    R4      P                  RR4      p\        P                  RV^R7      p\        P                  ! RRV\        P
                  R7      p\        P                  ! R	R
V\        P
                  R7      p\        P                  ! RR
V\        P
                  R7      p\        P                  ! RRV\        P
                  R7      p\        P                  ! RRV4      p\        P                  ! RRV4      pVP                  4       # )zNNormalize only approved deployment differences before comparing presentations.r   r%  r&  __BUDGET_SLIDE_VARIANT__r  zhttps?://[^\'\"\s<>]+/USA/rK  r  zChttps?://[^\'\"\s<>]+/Moneyapp/?(?:index\.html)?(?:\?[^\'\"\s<>]*)?__BUDGET_APP_URL__rH  zA(?<![\w./-])(?:\./)?usa2027-presentation\.html(?:\?[^\'\"\s<>]*)?rC  z>\s+<z><z[ \t]+r   )r   r   USA_BUDGET_SECTION_RE_V57r(  r  r  r   )r  rY  s   & r   $_v57_normalize_presentation_for_syncr  '  s    yB''c2D$(()CTQR(SD66/$bddKD66XZnpt|~  }A  }A  BD66WYmos{}{{  AD66VXxz~  GI  GK  GK  LD66(D$'D66)S$'D::<r   c                 $   \         P                  T ;'       g    R 4      p\         P                  T;'       g    R 4      p. pV'       g   VP                  R4       V'       g   VP                  R4       V'       d   RRRV/# \        V 4      p\        V4      pWV8H  pRTRV'       d   . MR.R\        P
                  ! VP                  R4      4      P                  4       R	\        P
                  ! VP                  R4      4      P                  4       /# )
r   u>   במצגת השרת הפרטי לא נמצא שקף תקציבu2   במצגת Netlify לא נמצא שקף תקציבr  FrZ  u   מצגת Netlify אינה מסונכרנת עם מצגת השרת הפרטי מחוץ לשקף התקציב ולהחלפות נתיבי Deploy המאושרותprivate_sha256r   netlify_sha256)r  r  r  r  r  r  r  r  )private_htmlnetlify_htmlprivate_budgetnetlify_budgetrZ  ru  rv  r  s   &&      r   r  r  '  s    .55l6H6HbIN.55l6H6HbINFVWJKeXv../=D0>E	Bb"  "C  !D'..W)=>HHJ'..g)>?IIK	 r   z/admin/platform/release-matrixc                  p    R P                  R \        \        4       4       4      p RV ,           R,           pV# )r   c           
   3   Z   "   T F!  w  pw  r#pR V^,            RV RV RV R2	x  K#  	  R# 5i)r  r
  r  z</small></td><td><code>u^   </code></td><td>חובה לבדוק בכל שינוי מנוע/עיצוב משותף</td></tr>Nr  )r   r  rT  r`   r   s   &    r   r   )usa_release_matrix_v57.<locals>.<genexpr>'  sK      "CAs 1Q3%|E7/#>UVZU[  \z  	{"Cs   )+u  <!doctype html><html lang="he" dir="rtl"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>מטריצת סנכרון ארה״ב</title><style>body{font-family:Arial;background:#07111f;color:#f8fafc;margin:0;padding:24px}main{max-width:1050px;margin:auto}section{background:#101d31;border:1px solid #304560;border-radius:24px;padding:20px}table{width:100%;border-collapse:collapse}th,td{padding:12px;border-bottom:1px solid #304560;text-align:right}code{direction:ltr;unicode-bidi:isolate;color:#bfdbfe}a{color:#bfdbfe}.rule{background:#15263e;border:1px solid #3b82f6;border-radius:16px;padding:14px;margin:14px 0;line-height:1.7}</style></head><body><main><section><h1>🔄 מטריצת סנכרון ארה״ב</h1><div class="rule"><b>שער מסירה מחייב:</b> בכל בניית Netlify המערכת משווה אוטומטית את המצגת ללא הסכומים למצגת השרת הפרטי. ההבדלים המותרים היחידים הם שקף התקציב והחלפות נתיבי Deploy מאושרות. כל שינוי אחר חוסם את יצירת ה־ZIP.</div><p>אין למסור שינוי משותף לפני שנבדקו כל ששת היעדים. גרסת Netlify שומרת במכוון על שקף תקציב ללא סכומים.</p><p><a href="/admin">חזרה לאדמין</a></p><table><thead><tr><th>#</th><th>יעד</th><th>נתיב</th><th>כלל</th></tr></thead><tbody>r  )r   r  r4  )r  r	  s     r   usa_release_matrix_v57r  '  sJ    	 "+,B"C 
D F  IM  M  PA  ADKr   znetlify_profiles.jsonc                      \        V R RR7      ;_uu_ 4       p\        P                  ! V4      pRRR4       V#   + '       g   i     X# ; i  \         d    Tu # i ; ir  )r   r   r   r   )r   r  r   r   s   &&  r   v58_read_jsonr  '  sP    $g.."99R=D / /. s+   A 9	A A
	A 
A AAc           	          \        V 4       V R ,           p\        VRRRR7      ;_uu_ 4       p\        P                  ! WR^R7       RRR4       \        P
                  ! W 4       R#   + '       g   i     L(; i)r   r   r   r   r  Fr   NrD  )r   r   r   r   s   &&  r   v58_write_json_atomicr  '  sP    d
-C	c3"	5	5		$q9 
6JJs 
6	5s   A&&A6	c                     \        \        / 4      p \        V \        4      '       g   / p . p\        P
                  P                  \        4      '       g   V# \        \        P                  ! \        4      \        P                  R 7       EFZ  p\        P
                  P                  \        V4      p\        P
                  P                  V4      '       d#   V\        9   g   VP                  R4      '       d   Kq  \        P
                  P                  VR4      p\        P
                  P                  V4      '       g   K  VP!                  4       p\        V P#                  V4      \        4      '       d   V P#                  V4      M/ pTP%                  RTRTRTRVP#                  R4      ;'       g     RRR	R
/P#                  V4      ;'       g    TRVR9   d   RMR/4       EK]  	  V# )r  r(  r-   rT  rc   r  r`   r(      ארצות הברית 2027r'   u   יפן 2026r  specializedgeneric>   r(   r'   )r  NETLIFY_PROFILE_PATH_V58r   r   r   r   r  r  r  r  r   r   r   NETLIFY_V58_EXCLUDED_DIRSr*  rg  r  r   r  )profilesrJ  r   r  rO  rT  profs          r   v58_discover_netlify_tripsr  '  sc   5r:Hh%%"xE77==""5Lrzz(+;;ww||Hd+ww}}T""d.G&G4??[^K_K_T<0ww~~e$$jjl$.x||C/@$$G$Gx||C R3dDTXXg&wwE2NwWd+e+i+ijm+n+v+vrvSO%;M
 	 <  Lr   c                     T ;'       g    R P                  4       P                  4       p\        4        F2  pWR,          VR,          P                  4       09   g   K)  VR,          u # 	  R # )r   rT  rc   )r   r  r  rr   r.  r  s   &  r   r  r  '  sW    ::2



$
$
&C*,;X 4 4 677; - r   c                 t   a  S ;'       g    R P                  4       o \        V 3R l\        4        4       R4      # )r   c              3   F   <"   T F  qR ,          S8X  g   K  Vx  K  	  R# 5i)rT  Nr  )r   r  rT  s   & r   r    v58_trip_item.<locals>.<genexpr>'  s     L8qeHO8s   !
!N)r  r  r  r  s   fr   v58_trip_itemr  '  s.    99"


CL68LdSSr   c                   a \         P                  ! 4       p\        V R 4      ;_uu_ 4       o\        V3R lR4       F  pVP	                  V4       K  	  RRR4       VP                  4       #   + '       g   i     TP                  4       # ; i)r8  c                  &   < S P                  R4      # r  r  r  s   r   r  !v58_sha256_file.<locals>.<lambda>'  s    "'')"4r   r   Nr  )r   r  r{  r   s   &  @r   v58_sha256_filer  '  se    A	dD		R4c:EHHUO ; 
 ;;= 
	 ;;=r  c                    . p\         P                  ! V 4       F  w  rgp\        V\        P                  R 7       F  p	\         P
                  P                  Wi4      p
\         P
                  P                  W4      P                  RR4      pVR8X  d   KZ  VP                  RVR\         P
                  P                  V
4      R\        V
4      /4       K  	  K  	  RRR	\        P                  ! 4       P                  R
R7      RTR\         P
                  P                  \         P
                  P!                  V4      4      RRRTR\#        V4      RR\%        VP'                  R4      4      RVP'                  R4      ;'       g    . RVP'                  R4      ;'       g    . /RV/	p\)        \         P
                  P                  V R4      V4       V# )r  r%  r&  zbuild-manifest.jsonr   r  r  r  zeitan-trips-netlify-build/v1r	  rl  r  r  source_root_idbuilderzadmin-v58-live-sourcer  
file_countr  r  rZ  r  r  )r   r'  r  r   r   r   r   r  r   r  r  r  r   r  r
  r   rd  r,  ru  r   r  )rP  r  r)  r  r  r  r,  r  ru  r   rv  r  r  s   &&&&&        r   v58_write_build_manifestr  (  s   
EWWZ0E5cii0Dg+D088cBC++XLL&VBGGOOD,A(?[_K`ab	 1 1 	/x||~///C8))"''*:*:;*GH)tSZd4
t 45hz~~h?W?]?][]^hisiwiw  yC  jD  jJ  jJ  HJ  K
H "'',,z2GHROr   c           	         . p\         P                  ! V 4       EF&  w  r#pV EF  p\        V4      R9  d   K  \         P                  P	                  W%4      p\        V4      P                  RRR7      pTp\        P                  ! RRV\        P                  R7      p\        P                  ! RRV\        P                  R7      pVP                  R	R
4      pWx8w  g   K  \        V4      P                  VRRR7       VP                  \         P                  P                  W`4      P                  R	R
4      4       EK  	  EK)  	  V# )r"   r   r   r  z0https?://work-room\.tail978ec2\.ts\.net(?::\d+)?r   r  z#https?://[^\'"\s<>]+/(?:USA|JAPAN)/r  r%  r&  r  rN  )r   r'  r6  r   r   r   r  r  r(  r  r   r  r  r  )	rP  rQ  r,  r  ru  r   r   rY  rC  s	   &        r   v58_patch_generic_htmlr  (  s    G77:.%D~%55xg+Dd%%wi%HDHKRQU]_]a]abD>dRTRVRVWDd3'DT
%%dGB%Grwwt?GGSQR  / Nr   c           	         . p. p^ p\         P                  P                  \         P                  P                  V R4      4      '       g   VP	                  R4       \
        P                  ! R\
        P                  4      p\         P                  ! V 4       EF  w  rVpV EF  p\        V4      R9  d   K  \         P                  P                  WX4      p	\         P                  P                  W4      P                  RR4      p
\        V	4      P                  RRR7      pR	V9   g   R
V9   g   RV9   d   VP	                  RV
,           4       VP                  V4       FL  p\        W
V4      pV'       g   K  V^,          p\!        W4      '       d   K5  VP	                  RV
 RV 24       KN  	  EK  	  EK  	  RV'       * R\#        \%        V4      4      RVRV/# )r   r-   u/   חסר index.html בשורש חבילת Netlifyr|  r%  r&  r   r   r  zC:/TripServerr   r}  u$   נשאר נתיב פרטי בתוך r  r  r  rZ  r  r  rN  )r   r   rg  r   r  r  rN  r  r'  r6  r  r   r   r  rq  rh  rj  r  r  )rP  rZ  r  r`
  r;  r,  r  ru  r   r   relhtmlrY  r.  r  s   &             r   v58_validate_generic_buildr  ,(  ss   FxAG77>>"'',,z,?@@GHJJSTVTXTXYG77:.%D~%55xg+DRWW__T5U5]5]^bcf5gWd%%wi%HD$&*:d*BlVZFZDWLMt,-jEH
*:::MM$B7)4PSu"UV -  / VHVCK%8H^\cddr   c                    \        V 4      pVR9   da   \        V4      w  r#VR,          p\        WAVR,          VR,          R4      p\        WB4      pVP	                  R\        V4      RVRR/4       W#3# \        V 4      pV'       g   \        R	4      h\        P                  ! R
4      p\        P                  P                  \        VR,          P                  4       R,           V,           4      p\        P                  P                  V4      '       d   \         P"                  ! V4       \        P$                  ! VRR7       \        P$                  ! \&        RR7       \)        VR,          VRR7      p	\+        V4      p
\-        V4      pVR,          '       g)   \/        RRP                  VR,          4      ,           4      h\        WGR,          VR,          VR4      p\0        P2                  ! RRVR,          4      p\        P                  P                  \&        V RV R24      p\        WB4      pVRVR,          RVR,          RVRVR\        V4      R\        V	4      RV
RVRVRRR\        P                  P5                  V4      /3# )r(   rP  r)  r  zspecialized-live-sourcer  r  live_sourceT#trip_not_supported_or_missing_indexr  rT  r  r   r  r   r  r  r  ru  rZ  zgeneric-live-sourcez[^A-Za-z0-9_-]+_NETLIFY_LIVE_r  rr   rP  r+  r  r  >   r(   r'   )r  r  r  r  r   r,  r  r  r   r   r   r   r   r  r   r   rF  r  r   r  r2  r  r  r  r  r(  r  )rr   knownrP  r>  rP  r  r  r  r  r+  rQ  r  r  s   &            r   r  r  A(  s   &t,E4U;<(
)*7=;QRYZfRg  iB  C$Z9E
:h}TRS	t	Dz"GHH
--
(Eww||-d5k.?.?.A#.Ee.KLJ	ww~~j!!6==#<KK
D)2;;7ISW+X#DL2FF":.G)*5Jd9$))JxDX:YYZZ%jeT&\*UjkHff'DK8IWW\\,	{.t-TUH
 
5EVDKd6l<PZ[efnovwz  |A  xB  CK  LO  PV  LW  Xf  gn  o{  |F  GQ  RZ  [h  im  nz  {}  {B  {B  {J  {J  KS  {T  U  U  Ur   r3  c                  f    \        4       p R P                  R V  4       4      pV'       g   RpRV R2# )r   c              3     "   T Fu  pR \         P                  ! VR,          4       R\         P                  ! VR,          4       RVR,          R8X  d   RMR R	\         P                  ! VR
,          4       R2	x  Kw  	  R# 5i)z<article><h2>r`   </h2><p><code>r  u   </code></p><p>מצב: r  r  u   פרופיל מותאםu   Build גנרי אוטומטיz%</p><a href="/admin/netlify/download/rT  u4   ">צור עכשיו ZIP מסונכרן</a></article>Nr  r  s   & r   r   ,admin_netlify_builder_v58.<locals>.<genexpr>_(  s       d  ^c  YZmHOOAgJ$?#@x_`ag_hOiNj  kA  _`  ag  _h  jw  _w  B[  }\  A]  ]B  CK  CR  CR  ST  UZ  S[  C\  B]  ]Q  T  ^c   A=A?uR   <p>לא נמצאו תיקיות טיול עם index.html תחת C:\TripServer.</p>u  <!doctype html><html lang="he" dir="rtl"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Netlify Live Builder</title><style>body{font-family:Arial;background:#07111f;color:#fff;margin:0;padding:22px}main{max-width:1050px;margin:auto}.note,article{background:#101d31;border:1px solid #304560;border-radius:20px;padding:18px;margin:14px 0}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px}a{display:inline-block;background:#2563eb;color:#fff;text-decoration:none;padding:12px 16px;border-radius:999px;font-weight:800}code{direction:ltr;unicode-bidi:isolate;color:#bfdbfe;word-break:break-all}</style></head><body><main><h1>🌐 Netlify — בנייה מהמקור הפעיל</h1><div class="note"><b>בחר טיול:</b> כל ZIP נוצר מחדש מהקבצים, התמונות, הסרטונים והשירים שנמצאים בשרת באותו רגע. Netlify אינו נשמר כמקור נפרד.</div><div class="grid">uL   </div><p><a href="/admin">חזרה לאדמין</a></p></main></body></html>)r  r   )rl
  r  s     r   admin_netlify_builder_v58r  \(  s[    
$
&E
''  d  ^c  d  dEm% P  QV  PW  Wc  f  fr   c                    \        V 4      P                  R RR7      p\        P                  ! RV\        P                  4      pV'       g   \        R4      h \        P                  ! VP                  ^4      4      p\        T\        4      '       d&   \        TP                  R4      \        4      '       g   \        R4      hT#   \         d!   p\        R\        T4      ,           4      hRp?ii ; i)	r   r  r  r~  !usa_inline_media_manifest_missingz'usa_inline_media_manifest_invalid_json:Nr  'usa_inline_media_manifest_invalid_shape)r   r  r  r  r  r  r   rv  r  r   r~  r   r   r   r  )r'  rY  r
  r   r  s   &    r   "v82_read_inline_usa_media_manifestr  h(  s    !",,gh,ODII^
E
 >??R**U[[^, gt$$Jw{{77KT,R,RDEEN	  RDtCyPQQRs   %C C/C**C/c                     \         R ,          p \        P                  P                  V R4      p\        P                  P                  V \        R,          4      pW3 F^  p\        P                  P                  V4      '       d'   \        P                  P                  V4      ^ 8:  g   KN  \        RV,           4      h	  \        R4      pVP                  R4      '       g   \        R\        V4      ,           4      h\        V4      pVP                  R4      ;'       g    . pV Uu. uF6  p\        V\        4      '       g   K  VP                  R4      '       g   K4  VNK8  	  ppV Uu. uF5  p\        V\        4      '       g   K  VP                  R	4      R
8X  g   K3  VNK7  	  p	p\        V4      ^,8w  d   \        R\        V4       24      h\        P                  P                  V RRR4      p
\        P                  P!                  V
4      '       g   \        RV
,           4      h. p\        P"                  ! V
4       EF(  w  rp\%        V\&        P(                  R7       EF  p\        P                  P                  W4      p\+        V4      \,        9  d   K9  \        P                  P                  V4      '       d%   \        P                  P                  V4      ^ 8:  d   \        RV,           4      h\        P                  P/                  VV 4      P1                  RR4      pVP3                  RVR\        P                  P                  V4      R\5        V4      /4       EK  	  EK+  	  V'       g   \        R4      h\7        4       pV	 EF/  p\'        VP                  R4      ;'       g    R4      P1                  RR4      P9                  R4      p\;        V4      pV'       g   \        RV,           4      h\        P                  P                  ! V .VP=                  R4      O5!  p\        P                  P                  V4      '       d%   \        P                  P                  V4      ^ 8:  d   \        RV,           4      h\+        V4      \,        9  d   \        RV,           4      hVP?                  V4       EK2  	  V Uu0 uF  qwR,          kK  	  pp\%        VV,
          4      pV'       d   \        R\        V4      ,           4      h\7        4       \7        4       . ppp^ ;ppW,            EF  p\'        VP                  R4      ;'       g    R4      P1                  RR4      P9                  R4      p\;        V4      pV'       g   \        RV,           4      h\        P                  P                  ! V .VP=                  R4      O5!  p\        P                  P                  V4      '       d%   \        P                  P                  V4      ^ 8:  d   \        RV,           4      h\+        V4      pRVR\        P                  P                  V4      R\5        V4      R	VP                  R	4      /pVP                  R4      '       Edx   \A        VP                  R4      4      p\'        VP                  R4      ;'       g    R4      P)                  4       p VV9   g   V V9   d   \        R \        V4      ,           4      hVP?                  V4       VP?                  V 4       VP                  R	4      R!8X  dd   V\B        9  d   \        R"V,           4      h\E        V4      p!V!^ 8:  d   \        R#V,           4      h\G        \I        V!4      ^4      VR$&   V^,          pMgVP                  R	4      R%8X  d(   V\J        9  d   \        R&V,           4      hV^,          pM*\        R'\        VP                  R	4      4      ,           4      hVP3                  V4       EK  	  V\7        \M        ^^-4      4      8w  d   \        R(4      h\N        PP                  ! VR)R*R;R+7      p"RR*R,\5        V4      R-\5        V4      R.VP                  R/4      R0\        V4      R1VR2VR3\        V4      R4\        V	4      R5VR6\%        VV,
          4      R7\R        PT                  ! V"PW                  R84      4      PY                  4       R9VR:V/# u upi u upi u upi )<r(   r-   rN   zusa_live_source_missing:r_   r  z"usa_media_metadata_refresh_failed:r  r  r  r  zusa_media_slide_count_mismatch:rS   rT   rU   zusa_music_folder_missing:r  zusa_music_file_empty:r%  r&  r  r  r  usa_music_inventory_emptyr   zusa_audio_unsafe_path:zusa_declared_audio_missing:z%usa_declared_audio_extension_invalid:z*usa_declared_audio_not_in_music_inventory:zusa_media_unsafe_path:zusa_declared_media_missing:r   z"usa_media_duplicate_slide_or_base:r  z&usa_manifest_video_extension_mismatch:zusa_video_duration_invalid:rw  r  z&usa_manifest_image_extension_mismatch:z usa_manifest_unknown_media_type:"usa_media_slide_numbers_incompleteFTr   	sort_keysr  trip_sha256presentation_sha256inline_manifest_tokenr  slide_media_countr	  rH  audio_countdeclared_audio_countaudio_filesunreferenced_audio_filesmedia_contract_sha256r   r  r  r  )-r  r   r   r   rM  rg  r  r  rS  r   r  r~  r  r   r   r,  r  r'  r  r   r   r6  r  r  r   r  r  r  r  r1  r+  rN  r   r  ro  rf  rg  r0  r=  r   r  r  r  r  r  )#r)  	trip_pathr'  r  r  r   r  r  r!  r  rt  folder_audior,  r  ru  r   rv  r  declared_audio_urlsr  rf  r  folder_audio_urlsmissing_from_folderseen_slides
seen_basesr  r	  rH  r  r  r  r   r*  r  s#                                      r   v82_usa_live_source_gater  z(  s   %.K[,7I[2HI[2\]2ww~~h''277??8+D+I#$>$IJJ 3 (0H<<?$x.PQQ01BCGKK &&BEIA*Q"5a!%%.aaFIR1At!4Qv'9QQQER
6{b<S[MJKK
 k74FPJ77==$$ ;j HIILWWZ0E5cii00D77<<.D~%9977>>$''277??4+@A+E"#:T#ABB''//$4<<T3GCVRWW__T5JHVabfVg hi 1 1 677%dhhuo++,44T3?FFsK(7'ABBww||K:$**S/:ww~~d##rwwt'<'A#$AG$KLLD>!55FPQQ%  ,88<a5<8 !47H!HIG$ObJccdd$'E35"TK !!K+dhhuo++,44T3?FFsK(7'ABBww||K:$**S/:ww~~d##rwwt'<'A#$AG$KLLtndFBGGOOD$98[QUEVX^`d`h`hio`pq88G)*Etxx'--2.446D#tz'9"#G$t*#TUUOOE"JNN4$8xx7*22&'ORY'YZZ7=q=&'Dw'NOO*/h*C&'q &!W,22&'ORY'YZZq "#ETXXV\M]H^#^__C= @ c%2,''?@@

4etPZ[Id{9-{+<=W!5S[{{s<(E
|"F+<?R+R$S	0@0@0I!J!T!T!VH _ JRH 9s*   %c+c+c+'c0c0c0 c5c           	         / p\         P                  ! V R 4      ;_uu_ 4       pVP                  4       pV'       d   \        RV,           4      hVP	                  4        F  pVP                  4       '       d   K  \        VP                  4      pV'       d!   WTP                  P                  RR4      8w  d   \        RVP                  ,           4      hVP                  VP                  4      pR\        V4      R\        P                  ! V4      P                  4       /W&   K  	  RRR4       V#   + '       g   i     T# ; i)r   znetlify_zip_crc_failed:r%  r&  znetlify_zip_unsafe_member:r  r  N)rI  rJ  testzipr  rK  r  r1  r5  r   r9  r,  r  r  r  )rP  r  rU  r
  r  r  r   s   &      r   v82_zip_inventoryr  (  s    D	3	'	'2jjl83>??KKMD{{}}#DMM2D4==#8#8s#CC"#?$--#OPP774==)D #d)Xw~~d7K7U7U7WXDJ "	 
( K 
(	' Ks   DD--D>	c                    / p\         P                  ! V 4       F  w  r#pV F  p\         P                  P                  W%4      p\         P                  P	                  W`4      P                  R R4      p\        V4      pV'       g   \        RV,           4      hR\         P                  P                  V4      R\        V4      /W&   K  	  K  	  V# )r%  r&  znetlify_build_unsafe_member:r  r  )
r   r'  r   r   r  r   r1  r  r  r  )	rP  r  r,  r  ru  r   rv  r  r  s	   &        r   v82_build_inventoryr  (  s    DWWZ0ED77<<.D''//$3;;D#FC#C(D"#AC#GHH "''//$"7;tCTUDJ  1 Kr   c                   aa \        V 4      o\        V4      o\        \        S4      \        S4      ,
          4      p\        \        S4      \        S4      ,
          4      p\        VV3R  l\        S4      \        S4      ,           4       4      p. pV'       d(   VP	                  RRP                  V4      ,           4       V'       d(   VP	                  RRP                  V4      ,           4       V'       d(   VP	                  RRP                  V4      ,           4       VR8X  Ed   S Uu. uFe  qP                  4       P                  R4      '       g=   RVP                  4       9   g(   VP                  4       P                  R4      '       g   Kc  VNKg  	  p	pV	'       d1   VP	                  R	RP                  \        V	4      4      ,           4       V'       d   VP                  R
4      ;'       g    .  F  p
R\        V
P                  R4      ;'       g    R4      P                  R4      ,           pSP                  V4      pV'       g   VP	                  RV,           4       Kp  VP                  R4      V
P                  R4      8w  g   K  VP	                  RV,           4       K  	  V'       d"   \        RRP                  V4      ,           4      hRRR\        S4      R. R. R. RR/# u upi )c              3   V   <"   T F  pSV,          SV,          8w  g   K  Vx  K   	  R # 5ir   r  )r   r  archivebuilds   & r   r   'v82_verify_final_zip.<locals>.<genexpr>)  s%     W#<aaGTUJ@V#<s   )
)zzip_missing:r   z
zip_extra:zzip_hash_mismatch:r(   usa_tv/presentation-tvr.   zusa_phone_zip_contains_tv:r  USA/r  r   r&  z%declared_live_media_missing_from_zip:r  z"declared_live_media_hash_mismatch:z'netlify_final_zip_verification_failed:
ru  r  Tr  r[  r   r$  crc_ok)r  r  r  r  r  r   r   r*  r  r   r   r  r  r,  )rP  rP  r  	live_gater[  r   r$  rZ  r  r  r  r  archivedr  r  s   &&&&         @@r   v82_verify_final_zipr  	)  s7   
+E)GSZ#g,./G3w<#e*,-EW3u:G#<WWJFnsxx/@@AfmmL388E?:;6==!58L!LM5 '  W1779+?+?	+J+JN_cdcjcjclNlpqpwpwpy  qC  qC  DU  qVQQ	  WMM6&BS9TTU!g.44"4s488E?#8#8b9@@EE";;s+MM"IC"OP\\(+txx/AAMM"F"LM 5 E		RXHYYZZ$c'lIr7BP\^`bjlpqq Ws   +A K&K&c                 ~   \        V 4      pVR 8X  d   \        4       MRp\        V 4      w  r4\        VR,          Y1;'       g    \	        V 4      P                  4       V4      pWTR&   V'       dP   RRRVR,          RVR,          RVR,          R	VR	,          R
VR
,          RVR,          RVR,          RVR,          /	VR&   W43# )r(   NrP  final_zip_verificationr  Tr  r  r  r  r	  rH  r  r  usa_live_source_gate)r  r  *_v82_original_build_netlify_deploy_zip_v58r  r   r  )rr   r  r  rP  r>  verifications   &     r   r  r  ')  s    &t,E.3un(*$IB4HH'(=xIcIcRUVZR[RaRaRcenoL(4$%$9]3!9-B#C#Y/F%G+>!?9]39]39]3#Y/F%G
+
&' r   zeitan-tripserver-update/v1ztripserver-update.jsonpending_update_packagesupdate_packageszupdate_package_log.jsonUSA_TRIPu   קובץ טיול ארה״בrk  rx  	trip_htmlUSA_PRESENTATION_PHONEu-   מצגת ארה״ב — אייפון/מחשבr  USA_TRIP_TVu1   קובץ טיול ארה״ב — טלוויזיהUSA_PRESENTATION_TVu(   מצגת ארה״ב — טלוויזיה
JAPAN_TRIPu   קובץ טיול יפןJAPAN_PRESENTATIONr  JAPAN_FLIGHT_INTROr  MONEYAPPu(   אפליקציית תקציב חופשהr	  	MONEYHOMEu*   אפליקציית תקציב משפחתיTRIPFORMr  USA_MUSIC_PART1u   שיר ארה״ב — חלק 1USA_MUSIC_PART2u   שיר ארה״ב — חלק 2ADMIN_SERVERu   מנוע האדמיןr%  admin_python
apply_lastREBUILD_USA_MEDIA_METADATAuV   בנייה מחדש ואימות נפרד של manifests עבור iPhone ועבור TVSYNC_USA_MEDIA_TO_TVud   העתקה ידנית מפורשת של מדיית iPhone אל TV (פעולת תאימות בלבד)c                   a \         P                  ! 4       p\        V R 4      ;_uu_ 4       o\        V3R lR4       F  pVP	                  V4       K  	  RRR4       VP                  4       #   + '       g   i     TP                  4       # ; i)r8  c                  &   < S P                  R4      # r  r  r  s   r   r  _upd_sha256.<locals>.<lambda>e)  s    !&&"5r   r   Nr  )r   r  r{  r  s   &  @r   _upd_sha256r  b)  se    A	dD		Q5s;EHHUO < 
 ;;= 
	 ;;=r  c                 L   \        T ;'       g    R 4      pRV9   d   \        RV,           4      hVP                  RR4      pVP                  R4      '       g5   VP                  R4      '       g   \        P
                  ! RV4      '       d   \        RV,           4      hVP                  R4      pVP                  R^4      ^ ,          pV'       dC   VP                  R4      '       g,   RV9   g%   VR	8X  g   \        P                  ! R
V4      '       d   \        RV,           4      hV# )r    zunsafe_zip_member:r%  r&  r  z^[A-Za-z]:($|/)z../z/../r)  z	[A-Za-z]:)	r   r  r   r*  r  r
  r   r+  r  )r   r.  
normalizedrg  r  s   &    r   _upd_safe_memberr  j)  s    
djjb/C}-344T3'JS!!Z%:%:4%@%@BHHM_akDlDl-344S!EKKQ"EU%%e,,%5D=||L%00-344Lr   c                     \        V 4      P                  P                  4       pVR%9   d   VR&9  d   \        RV ,           4      h\        V 4      P	                  4       p\        V4      R8  d   \        RV ,           4      hVP                  RRR7      pVP                  4       pR	V9  g   R
V9  d   \        RV ,           4      hVR8X  d(   RV9   g!   RV9   g   RV9   g   \        RV ,           4      hVR8X  d!   RV9  d   RV9  d   \        RV ,           4      hR\        V4      RR/# VR8X  dw   V\        9  d   \        RV ,           4      h\        P                  P                  V 4      R8  d   \        RV ,           4      hR\        P                  P                  V 4      RR/# VR8X  d   VR8w  d   \        RV ,           4      h\        P                  ! V RR7       \        V 4      P                  RRR 7      p. R'OpV Uu. uF  qV9  g   K  VNK  	  p	pV	'       d"   \        R!R"P                  V	4      ,           4      hR\        P                  P                  V 4      RR#/# \        R$\        V4      ,           4      hu upi )(r	  r  r  zexpected_html:r   zhtml_too_small:r   r   ry  r  z<scriptzhtml_missing_structure:zclass="slidezclass='slide	startgatezpresentation_marker_missing:u   טיולrr   ztrip_marker_missing:r  syntaxzhtml-structure-okr  zexpected_audio:r  zaudio_too_small:zaudio-extension-okr  r&  zexpected_python:Tr  r  zadmin_markers_missing:r   zpython-compile-okzunknown_kind:>   r	  r  r  rN  )r   r  r  r  r  )r   r  r   r  r  r,  r|  r  r   r   r  r  rN  r  r   r   )
r   rx  r  r.  rY  r  rS  r  r  r[  s
   &&        r   _upd_validate_contentr   z)  s4   
t*


!
!
#C99''-4554j##%s8c>.566zz')z4jjl##!56=>>&&#s*n.C{VYGY !?$!FGG;%&*; !7$!>??S8-@AAw--.56677??4 4'/$677.:NOO~%</$6774.Dz##WY#GO&8h4-11h858IIJJ.:MNN
_s4y0
11	 9s   ?I;I;c                 "   \         P                  P                  \        V4      p\         P                  P	                  V4      '       d   \
        P                  ! V4       \         P                  ! VR R7       ^ p\        P                  ! V R4      ;_uu_ 4       pVP                  4        Uu. uF  qUP                  4       '       d   K  VNK  	  pp\        V4      \        8  d   \        R4      hV FT  p\        VP                   4       T\#        VP$                  ;'       g    ^ 4      ,          pV\&        8  g   KK  \        R4      h	  V Uu. uF  p\        VP                   4      NK  	  pp\        V4      \        \)        V4      4      8w  d   \        R4      h\+        \-        W4      4      p	\.        V	9  d   \        R4      h\0        P2                  ! VP5                  V	\.        ,          4      P7                  R4      4      p
V
P9                  R4      \:        8w  d   \        R	4      hV
P9                  R
4      p\=        V\>        4      '       d	   V'       g   \        R4      hV
P9                  R4      ;'       g    . p\=        V\>        4      '       d1   \        V4      \        \)        \A        \B        V4      4      4      8w  d   \        R4      hV Uu. uF$  p\C        V4      \D        9  g   K  \C        V4      NK&  	  ppV'       d"   \        RRP                  V4      ,           4      h\        V4      \        V Uu0 uF  p\C        VP9                  R4      4      kK  	  up4      8w  d   \        R4      h0 RAmpV Uu0 uF?  p\=        V\*        4      '       g   K  \C        VP9                  R4      ;'       g    R4      kKA  	  ppVV,          '       d   RV9  d   \?        V4      R.,           p. p\G        V4       EF;  w  pp\=        V\*        4      '       g   \        R4      h\C        VP9                  R4      ;'       g    R4      p\        VP9                  R4      4      p\C        VP9                  R4      ;'       g    R4      PI                  4       pV\J        9  d   \        RV,           4      hVV	9  d   \        RV,           4      h\L        PN                  ! RV4      '       g   \        RV,           4      h\         P                  P                  VRVR R\Q        V4      PR                   24      p\         P                  ! \         P                  PU                  V4      R R7       VPW                  V	V,          R4      ;_uu_ 4       p\W        VR4      ;_uu_ 4       p\
        PX                  ! VV4       RRR4       RRR4       \[        V4      pVV8w  d   \        R V,           4      h\J        V,          p\]        VVR!,          4      pVR"8X  d   \_        V4      pVP9                  R#4      '       g5   \        R$\C        VP9                  R%4      ;'       g    R&4      ,           4      h\+        V4      pRVP9                  R'4      R(VP9                  R)4      R*VP9                  R*4      R+VP9                  R,4      ;'       g    / P9                  R+4      ;'       g    R-/VR.&   VPa                  RVR/VR/,          RVR0VRVR1\?        VR2,          4      R!VR!,          R3\c        VP9                  R34      4      R4V/	4       EK>  	  RRR4       R5TR6\d        Pd                  ! 4       R7\C        X
P9                  R74      ;'       g    R84      R*\C        V
P9                  R*4      ;'       g    R4      R9\C        V
P9                  R94      ;'       g    R4      R:T
RX Uu. uF  p\C        V4      NK  	  upR;X/p\Q        \         P                  P                  VR<4      4      Pg                  \0        Ph                  ! VR=^R>7      R?R@7       V# u upi u upi u upi u upi u upi   + '       g   i     EL; i  + '       g   i     EL; i  + '       g   i     ELI; iu upi )BTr   r   too_many_filespackage_uncompressed_too_largeduplicate_zip_membermanifest_missingz	utf-8-sigr  unsupported_schemar  manifest_files_emptypost_actionsbad_post_actionsunknown_post_action:r   	target_idduplicate_target_idr   r  bad_file_entryr  r  zunknown_target_id:zsource_missing:z[0-9a-f]{64}zbad_sha256:r   03dr  rD  Nzsha256_mismatch:rx  r
  r.  zbudget_app_contract_failed:rp  r   r  r  r  r  ry  r  r*   artifact_contractr`   
stage_pathdestinationsrk  r  r  r  created_at_epoch
package_idunnamedrb   r  planinspection.jsonFr   r   r   >   r  r  r  r  r  r  )5r   r   r   UPDATE_PACKAGE_PENDING_DIRr   rF  r  r   rI  rJ  rK  r  r,  UPDATE_PACKAGE_MAX_FILESr  r  r5  r   r  %UPDATE_PACKAGE_MAX_UNCOMPRESSED_BYTESr  r   r	  UPDATE_PACKAGE_MANIFESTr   rv  r9  r|  r   UPDATE_PACKAGE_SCHEMAr   r  mapr   UPDATE_PACKAGE_POST_ACTIONSr  r   UPDATE_PACKAGE_TARGETSr  r  r   r   r   r   rO  r  r   r  r  ru  r   r  r  )rP  r  r  rj  rU  r  rV  r  normalized_namesru  r  r  r(  r  unknown_actionsmedia_sensitive_targetspackage_target_idsr5  r  r  r+  r  r  extract_pathsrcfdstfr	  r  r  budget_validationr  s   &&                             r   _upd_parse_and_stagerG  )  s   GGLL3U;E	ww~~eeKK%E	3	'	'2KKM<MqM<u:00-..DT]]+S,,1--E<< !ABB	 
 CHH%Q,QZZ8%H C,<(=$>>344S)12"%//00::bgge,C&DELL[YZ<<!%::122W%%&&e344||N399r,--\1Bc#cRUWcNdJeFf1f/00+7e<a3q6Id;d63q6<e3chh6OOPPu:uEu!c!%%"45uEFF233#
 FKbUjYZ\`Na;c!%%"4":":;Ub 777<X`l<l-1M0NNL$U+KE4dD)) !122DHH[177R8I%dhhx&89F488H-334::<H 66 !5	!ABBU" !2V!;<<<<:: !:;;77<<yU3KqfIZIZH[:\]LKK5Ev,,d<6N6NRV""4. 7O, .F! !3i!?@@+I6F.|VF^LJJ&$;L$I!(,,W55$%BSIZI^I^_fIgItItktEu%uvv!*-
/334EF-11/B044Y?!$5$9$9*$E$K$K#P#PQ^#_#m#mcm	3
./ KKY&l&VG_ 5vd6::l#;<j
 
A ,Q 
(h 	DIIKc(,,|4AA	B3x||I.44"5s8<<6<<"=H6AQ6	D 	e.	/0;;DJJtZ_hi<ju|;}K{ = I f F c$ 7O6N6N,,,m 
(	'	't 7s   a8,`7`7A)a8<a8`<+C+a8"a8:Aa8a-a<>a8:#aa8;aa5a A<a8==a8;A'a8#B"a8a$a2a$:Ba8A'a8:a8A%a8
b7a8a!	a$$a5/	a88b		c                 @   \         P                  ! R \        T ;'       g    R4      4      '       g   \        R4      h\        P
                  P                  \        V R4      p\        P
                  P                  V4      '       g   \        R4      h\        P                  ! \        V4      P                  RR7      4      p\        P                  ! 4       \        VP                  R^ 4      4      ,
          \         8  d   \        R4      hVP                  R	. 4       F  p\        P
                  P                  VR
,          4      '       g   \        RVR,          ,           4      h\#        VR
,          4      VR,          8w  g   Kh  \        RVR,          ,           4      h	  V# )z[A-Za-z0-9_-]{12,80}r   	bad_tokenr6  pending_package_not_foundr   r   r2  pending_package_expiredr5  r0  zstaged_file_missing:r+  r  zstaged_file_changed:)r  r  r   r  r   r   r   r7  rg  r   rv  r   r  r   rg  r    UPDATE_PACKAGE_TOKEN_TTL_SECONDSr  )r  r   r  r  s   &   r   _upd_load_pendingrM  *  s(   <</U[[b1ABB%%77<<2E;LMD77>>$455::d4j**G*<=Dyy{U488$6:;;>^^233$ww~~d<0113d;6GGHHtL)*d8n<3d;6GGHH	 %
 Kr   c                    \        V 4      p \        P                  ! R 4      V R&   \        R,           p\	        V4      P                  \        P                  ! V R^R7      RR7       \        P                  ! V\        4       R# )r   r   r   Fr   r   r   N)
r   r   r   UPDATE_PACKAGE_LOG_PATHr   r  r   r  r   r   )r   r   s   & r   _upd_write_logrP  *  s]    7mG MM*=>GL
!F
*CIG%JU\]JJs+,r   c                    \         P                  ! R 4      p\        P                  ! RRV P	                  RR4      4      R,          p\
        P                  P                  \        VR,           V,           4      p\
        P                  ! VRR7       . p. pRp \        V R	,          R
 R7      pV EF  pVP	                  R4      '       d   TpK  VR,           EF  p	\
        P                  ! \
        P                  P                  V	4      RR7       \
        P                  P                  V	\        4      p
\
        P                  P                  W:4      p\
        P                  P                  V	4      pV'       dL   \
        P                  ! \
        P                  P                  V4      RR7       \        P                   ! W4       TP#                  RT	RV'       d   TMRRV/4       V	R,           p\        P                   ! VR,          V4       \%        V4      VR,          8w  d   \'        RVR,          ,           4      h\
        P(                  ! W4       VP#                  RVR,          RV	RVR,          /4       EK  	  EK  	  V Ff  p\
        P                  P+                  VR,          4      '       d!   \%        VR,          4      VR,          8w  g   KO  \'        RVR,          ,           4      h	  Y4Ye3#   \,         d    \/        T4       F  p TR,          '       dd   \
        P                  ! \
        P                  P                  TR,          4      RR7       \        P                   ! TR,          TR,          4       Kv  \
        P                  P                  TR,          4      '       d    \
        P0                  ! TR,          4       K  K    \,         d     K  i ; i	  h i ; i)r  z[^A-Za-z0-9_.-]+r  r3  package:Nr  NTr   Nr5  c                 6    \        V P                  R 4      4      # )r  )ru  r   r%  s   &r   r  0_upd_apply_content_transaction.<locals>.<lambda>)*  s    T!%%:M5Nr   r  r  r1  destinationrD   existedz.update_v72_tmpr0  r  zcopy_hash_mismatch:r+  zpost_install_hash_mismatch:)r   r   r  r(  r   r   r   r   UPDATE_PACKAGE_BACKUP_DIRr   r  r   r  r  r   rF  r  r  r  r  r   rg  r   rR  r  )r  r  safe_pkgr  appliedrC   
admin_itemorderedr  rU  r  rD   rV  r   r  s   &              r   _upd_apply_content_transactionr\   *  s   MM/*Evv)3y0QRSVWH'',,8%#+:PQKKKd+GGJ"f+NODxx%%!
#N33BGGOOK84Hggook8<k7''..5KK 7$GLL5{HPWf]aclnuvw!$55T,/5s#tH~5&'<tK?P'PQQ

3,T+->{\dfjksftuv  4	 & C77>>#m"455SEW9X\_`h\i9i"#@3{CS#STT  44  
G$Cy>>KKM0B CdSLLXM0BCWW^^C$677IIc-01 8  % 	
sQ   EK1 C3K1 K1 1O A0O
;O =+O
)O
O 
OO OO c           
      \   . p\        T ;'       g    . 4       F  p VP                  R 4      '       dd   \        P                  ! \        P                  P                  VR,          4      RR7       \        P                  ! VR,          VR,          4       K~  \        P                  P                  VR,          4      '       d    \        P                  ! VR,          4       K  K  	  V#   \         d:   pTP                  RTP                  R4      R\        T4      /4        Rp?EK  Rp?ii ; i)rV  rU  Tr   rD   rp  N)rR  r   r   r   r   r   rF  r  r   r  r   r  r~  )rC   rZ  r  r  s   &   r   _upd_rollback_recordsr^  N*  s    F2&	Wwwy!!BGGOOC,>?$OS]C,>?M 233		#m,- 4 ' M  	WMM=#''-*@'4PS9UVV	Ws$   A8C'+C'C''D+2-D&&D+c                 x   V '       g   R R/# \         P                  ! \        RR7       \        P                  ! V R,          \
        4       \        \
        4      V R,          8w  d   \        R4      h\        4       w  r#V'       g   \        R\        V4      ,           4      hRR	R
R\        V4      ,           R\        P                  ! 4       R,           /p\        R,           p\        V4      P                  \        P                  ! VR^R7      RR7       \         P                   ! V\        4       R RRV R,          RV/# )queuedFTr   r0  r  pending_admin_hash_mismatchzfailsafe_not_armed:rd  rH  rb  zunified_update_package:
not_beforeg      ?r   r   r   r   failsafe)r   r   rM  rF  r  rN  r  r  r  r   r   CONTROL_REQUEST_PATHr   r  r   r  r   )rZ  r3  r   r  request_payloadr   s   &&    r   _upd_queue_admin_lastrf  \*  s    %  KKd+
LLL)+EF-.*X2FF89935KE03t9<==.+c*o=diikC'O
 
'CIO%PQR]deJJs()dHj&:JMMr   c                    . pT ;'       g    .  F  pVR 8X  d|   / pR
 F\  p\        V4      W4&   W4,          P                  R4      '       d   K/  \        RV,           R,           \        W4,          4      ,           4      h	  VP	                  RVRV/4       K  VR8X  d#   VP	                  RVR\        RRR7      /4       K  \        R	\        V4      ,           4      h	  V# )r  r  z"usa_media_metadata_rebuild_failed:re  rd  r9  r  Tr  r  r*  rj  )rS  r   r  r~  r  r  r  r   )r
  r  rd  rebuiltr  s   &    r   _upd_run_post_actionsrj  q*  s    G--R-11G"1*B>*R'.22488&'Kn'\_b'beijq  kB  fC  (C  D  D #2 NNHfh@A--NNHfh8RY]gk8lmn3c&kABB   Nr   c                 T    \         P                  ! \        T ;'       g    R 4      4      # r3  r
  r
  s   &r   _upd_escaperl  *  s    ??3u{{+,,r   c                 &    R \        V 4       RV R2# )r  u  </title><style>
body{font-family:Arial;background:#07111f;color:#eef;margin:0;padding:18px}main{max-width:1050px;margin:auto}.card{background:#111d31;border:1px solid #304560;border-radius:22px;padding:18px;margin:14px 0}h1,h2{margin-top:0}input,button{font:inherit}input[type=file]{display:block;width:100%;padding:14px;background:#091426;color:#fff;border:1px solid #47607d;border-radius:14px;margin:12px 0}button,.btn{display:inline-block;border:0;border-radius:999px;padding:13px 18px;background:#2563eb;color:#fff;text-decoration:none;font-weight:900;cursor:pointer}.danger{background:#dc2626}.good{background:#052e2b;border-color:#0f766e}.warn{background:#3a2607;border-color:#d97706}table{width:100%;border-collapse:collapse}th,td{padding:10px;border-bottom:1px solid #304560;text-align:right;vertical-align:top}code{direction:ltr;unicode-bidi:isolate;color:#bfdbfe;word-break:break-all}small{color:#cbd5e1}ul{line-height:1.8}</style></head><body><main><p><a class="btn" href="/admin">חזרה לאדמין</a></p>r  rl  )r   r  s   &&r   r:  r:  *  sL     _  `k  lq  `r  _s sL MQ  LR  Rgj jr   z/admin/usa-media-alignmentc                      \        4       p R V P                  R4      '       d   RMR: R\        \        P                  ! V R^R7      4      : R2p\        RV4      # )	<div class="card r  goodr  uy   "><h1>מדיית ארה״ב — השוואה והעתקה ידנית</h1><pre style="white-space:pre-wrap;direction:ltr">Fr   u6  </pre><form action="/admin/usa-media-alignment/sync" method="post" onsubmit="return confirm('לבצע העתקה ידנית של מדיית iPhone אל TV? פעולה זו תדרוס מדיה ייעודית ל-TV.')"><button type="submit">העתק iPhone אל TV — פעולה ידנית</button></form></div>u   השוואת מדיית USA)r&  r   rl  r   r  r:  )r  r  s     r   admin_usa_media_alignment_v77rr  *  s    02F bh  bl  bl  mq  br  br  X^  x~  X~  @K  LP  LV  LV  W]  kp  xy  Lz  @{  |D2D99r   z/admin/usa-media-alignment/syncc                      \        R R R7      p \        RR\        \        P                  ! V R^R7      4      ,           R,           4      #   \
         d9   p\        RR\        \        T4      4      ,           R	,           4      R
3u Rp?# Rp?ii ; i)Trh  u   הסנכרון הושלםuv   <div class="card good"><h1>המדיה סונכרנה ואומתה</h1><pre style="white-space:pre-wrap;direction:ltr">Fr   uX   </pre><p><a class="btn" href="/admin/presentation-qa">פתח QA מצגות</a></p></div>u   הסנכרון נכשלuG   <div class="card warn"><h1>לא בוצע סנכרון מלא</h1><code></code></div>r   N)r  r:  rl  r   r  r   r~  )r9  r  s     r   "admin_usa_media_alignment_sync_v77ru  *  s    k+$E4  7o  p{  |@  |F  |F  GM  [`  hi  |j  pk  7k  lF  7F  G  	G k24}  J  KO  PS  KT  U  5U  Ve  5e  f  hk  k  	kks   AA	 	B-BBBz/admin/update-packagec            	      P   R p \         P                  P                  \        4      '       d[    \        P
                  ! \        \        4      P                  RR7      4      pR\        \        P                  ! VR^R7      4       R2p RV  2p\        RV4      #   \         d     Li ; i)	r   r   r   u`   <div class="card"><h2>עדכון אחרון</h2><pre style="white-space:pre-wrap;direction:ltr">Fr   z</pre></div>up  <div class="card good"><h1>📦 עדכון גורף — ZIP אחד לכל המערכת</h1><p>הזיהוי נעשה לפי <b>tripserver-update.json</b> שבתוך החבילה. שמות הקבצים אינם קובעים את היעד, ולכן קובץ טיול לא יכול להישלח בטעות ליעד של מצגת.</p><ul><li>שלב 1: העלאה ובדיקה בלבד — אין שינוי בקבצים.</li><li>שלב 2: מוצגת תוכנית התקנה מלאה עם כל יעד ו־SHA256.</li><li>שלב 3: אישור ידני, גיבוי ויישום טרנזקציוני.</li><li>אם קובץ האדמין נמצא בחבילה, הוא נבדק ומוחל אחרון דרך Control Server ו־Fail Safe.</li></ul></div>
<div class="card"><h2>העלה חבילת עדכון</h2><form action="/admin/update-package/inspect" method="post" enctype="multipart/form-data"><input type="file" name="file" accept=".zip,application/zip" required><button type="submit">בדוק חבילה והצג תוכנית התקנה</button></form><p><small>העלאה בשלב זה אינה מחליפה אף קובץ.</small></p></div>u   עדכון גורף)r   r   rg  rO  r   rv  r   r  rl  r  r   r:  )lastr   r  s      r   admin_update_package_page_v72rx  *  s    D	ww~~-..	::d#:;EEwEWXDu  wB  CG  CM  CM  NR  `e  mn  Co  wp  vq  q}  ~DL MQ  LRUD*D11	  		s   AB B%$B%z/admin/update-package/inspectc                  6   \         P                  P                  R 4      p V '       d   V P                  '       g   \	        RR4      R3# \
        P                  ! \        RR7       \        P                  ! 4       P                  p\
        P                  P                  \        VR,           4      pV P                  V4        \
        P                  P                  V4      \        8  d   \!        R4      h\#        W!4      p\
        P*                  ! T4       . pTR,           F  pRP                  R TR,           4       4      pTP1                  R\-        TR,          4       R\-        TR,          4       RT R\-        TR,          R,          4       R\-        TR,          P                  R4      4       R24       K  	  RpTP                  R4      '       d.   RRP                  R TR,           4       4      ,           R ,           pR!\-        TR",          4       R#\-        TR$,          4       R%\-        TR&,          4       R'RP                  T4       R(T R)\-        T4       R*2p	\	        R+T	4      #   \$         d   p\&        P(                  ! \
        P                  P                  \        T4      RR7       \
        P*                  ! T4       M  \$         d     Mi ; i\	        R	R
\-        \/        T4      4       R24      R3u Rp?# Rp?ii ; i  \$         d     ELi ; i),r  u
   שגיאהu7   <div class="card warn"><h1>לא נבחר ZIP</h1></div>rD  Tr   r  package_too_larger  u   החבילה נדחתהuN   <div class="card warn"><h1>החבילה לא עברה בדיקה</h1><p><code>u6   </code></p><p>לא הוחלף אף קובץ.</p></div>Nr5  r2  c              3   T   "   T F  pR \        V4      ,           R,           x  K   	  R# 5i)z<code>z</code>Nrn  r  s   & r   r   3admin_update_package_inspect_v72.<locals>.<genexpr>*  s#     _J^Q8k!n4y@@J^s   &(r1  r  r+  r  r`   r  r  r  </code></td><td>r  r  r  r   r(  uN   <div class="card"><h2>פעולות סנכרון לאחר ההתקנה</h2><ul>c              3   z   "   T F1  pR \        \        P                  W4      4      ,           R,           x  K3  	  R# 5ir"
  )rl  r=  r   r  s   & r   r   r|  *  sq       rR  }Q  xyrx  zE  Fa  Fe  Fe  fg  Fj  zk  sk  ls  ss  ss  }Qs   9;r   uV   <div class="card good"><h1>החבילה עברה בדיקה</h1><p><b>חבילה:</b> r3  u    · <b>גרסה:</b> r  z</p><p>rb   u   </p></div><div class="card"><h2>תוכנית התקנה</h2><table><thead><tr><th>מזהה יעד</th><th>רכיב</th><th>נתיב/ים</th><th>SHA16</th><th>בדיקת תוכן</th></tr></thead><tbody></tbody></table></div>u  <div class="card warn"><h2>אישור סופי</h2><p>בלחיצה הבאה ייווצר גיבוי מלא וכל הקבצים יוחלפו יחד. במקרה של כשל בקובצי התוכן תתבצע חזרה אוטומטית.</p><form action="/admin/update-package/apply" method="post" onsubmit="return confirm('להתקין את כל רכיבי החבילה כעת?')"><input type="hidden" name="token" value="u\   "><button class="danger" type="submit">התקן את כל החבילה</button></form></div>u    אישור חבילת עדכון)r   r  r   r5  r:  r   r   r7  r	  r
  r  r   r   r  r  UPDATE_PACKAGE_MAX_BYTESr  rG  r   rF  r  r  rl  r~  r  )
r  r  r  r  r  r  r  rY  actions_htmlr  s
             r    admin_update_package_inspect_v72r  *  s   ==V$Dt}}}'`acfffKK*T:JJLEWW\\4efnEFIIfZ77??6"%==011#F2 
6	DV{{_$~J^__h{4+<=>iTXY`TaHbGcclmqlr  sB  CN  OS  T\  O]  ^a  Ob  Cc  Bd  dt  u@  AE  FR  AS  AW  AW  X`  Aa  ub  tc  cm  n  	o  Lxxgjljqjq  rR  }A  BP  }Q  rR  kR  R  Ub  befqrv  xD  sE  gF  fG  G\  ]h  im  nw  ix  ]y  \z  zA  BM  NR  S`  Na  Bb  Ac  cn  oq  ov  ov  w{  o|  n}  }S  T`  Sa  aC  DO  PU  DV  CW  Ws  vD7>>  Zbggll#=uEUYZYYv$2  7E  FQ  RV  WZ  R[  F\  E]  ]S  5T  U  WZ  Z  	Z	Z dsT    >I+ >L	 +L6:L0KLKLK&L;LL	LLz/admin/update-package/applyc                     \         P                  P                  R R4      ;'       g    RP                  4       p \        P
                  ! RV 4      '       g   \        RR4      R3#  \        V 4      p\        V4      w  r#rE \        VP                  R4      ;'       g    . 4      p\        WAP                  R4      4      pRRRTP                  R4      RTP                  R4      RTRTRTRT/p	\!        T	4        \&        P(                  ! \*        P,                  P/                  \0        T 4      RR7       RpTP                  R4      '       d   RpR\%        TP                  R4      4       R\%        TP                  R4      4       R\3        T4       R\%        T4       RT R2p\        R T4      #   \         d>    \        T4      pT'       d)   \        R\        P                  ! TR	R
7      ,           4      hh i ; i  \         d   p
RR	R T R\#        T
4      /p	\!        T	4       \        RR\%        \#        T
4      4       R24      R3u Rp
?
\&        P(                  ! \*        P,                  P/                  \0        T 4      RR7       # Rp
?
ii ; i  \&        P(                  ! \*        P,                  P/                  \0        T 4      RR7       i ; i)!r  r   r  u   בקשה לא תקינהu   <div class="card warn"><h1>אסימון חבילת העדכון חסר או לא תקין</h1><p>חזור למסך העדכון, העלה את ה־ZIP מחדש ואשר את תוכנית ההתקנה.</p></div>rD  r(  r3  z+admin_queue_failed_and_rollback_incomplete:Fr   r  Tr  r  rY  admin_updaterp  u   העדכון נכשלuG   <div class="card warn"><h1>החבילה לא הושלמה</h1><p><code>ui   </code></p><p>קובצי תוכן שהוחלפו לפני הכשל שוחזרו מהגיבוי.</p></div>r   Nr  r`  u   <p><b>האדמין החדש הועבר ל־Control Server ויוחל אחרון. הדף עשוי להתנתק לזמן קצר.</b></p>uI   <div class="card good"><h1>העדכון הותקן</h1><p>חבילה: <b>u   </b> · גרסה: <b>u;   </b></p><p>מספר יעדי קבצים שהוחלפו: <b>u   </b></p><p>גיבוי: <code>r;  u   <p><a class="btn" href="/admin/self-test">הרץ בדיקה עצמית מלאה</a> <a class="btn" href="/admin/status">בדוק קבצים פעילים</a></p></div>u   העדכון הושלם)r   r  r   r   r  r  r:  rM  r\  rj  rf  r   r^  r  r   r  rP  r~  rl  rF  r  r   r   r   r7  r,  )r  r  r  rY  rZ  rC   post_action_resultsadmin_resultrollback_errorsr9  r  
admin_noter  s                r   admin_update_package_apply_v72r  *  s-   \\gr*00b779E<<*E223  6J  K  MP  P  	P[ '4RSW4X1j	"78P8V8VTV"W0XXl=STL $$((<0txx	*;w/L
 	v 	bggll#=uEUYZJ!! ^
XYdeiememnze{Y|X}  ~S  T_  `d  `h  `h  ir  `s  Tt  Su  up  qt  u|  q}  p~  ~[  \g  hs  \t  [u  u@  AK  @L  Lr  uD.553  	3G<O"#PSWS]S]^m  }B  TC  $C  D  D		  DwwS	Bv04{  }H  IM  NQ  IR  }S  |T  T}  3~    AD  D  	Dbggll#=uEUYZD
 	bggll#=uEUYZsI   %G7 ?>F, =9G7 ,AG44G7 7J?JJJ	 JJ	 	<Kzeitan-tripserver-audit/v91audit_exportsr  audit_reportszUSA_QUICK_AUDIT_LATEST.jsonusa_tripusa_presentation_phoner>  c                 J    ^ RI pVP                  ! V 4      P                  4       # r  )r  r  r  )r   r  s   & r   _v91_sha256_bytesr  
+  s    >>$))++r   c                   a ^ RI pVP                  ! 4       p\        V R4      ;_uu_ 4       o\        V3R lR4       F  q2P	                  V4       K  	  RRR4       VP                  4       #   + '       g   i     TP                  4       # ; i)r   Nr8  c                  &   < S P                  R4      # r  r  r  s   r   r  "_v91_sha256_file.<locals>.<lambda>+  s    	!2r   r   r  )r   r  r  r{  r  s   &   @r   _v91_sha256_filer  +  s\    nnA	d4A237E%7 
;;= 
;;=s   (A++B
	c                     \        T ;'       g    R 4      P                  4       pVP                  \        4      ;'       g8    RV9   ;'       g+    VP	                  R4      ;'       g    VP                  R4      # )r   r  backup_~)r   r   r  AUDIT_V91_BACKUP_PATTERNSr*  )r   r  s   & r   _v91_is_backup_namer  +  s^    DJJBC<<12yyjC6Gyy3>>ZcKdyyhkhthtuxhyyr   c                     V P                  4       p V \        9   d   R # V \        9   d   R# V \        9   d   R# V \        9   d   R# R# )r  r  r  rS  r  )r   AUDIT_V91_IMAGE_EXTAUDIT_V91_VIDEO_EXTAUDIT_V91_AUDIO_EXTAUDIT_V91_CODE_EXT)r  s   &r   	_v91_kindr  +  s<    		C
!!'
!!'
!!'
  r   c           
         R R/pVR9  d   V# R R/p^ RI p^ RIpVP                  R4      pV'       g   V#  VP                  VRRRRR	R
V .RR^#\	        4       R7      pVP
                  ^ 8X  d3   \        P                  ! VP                  ;'       g    R4      pR RRV/pV# R RRVP                  ;'       g    RRR /p V#   \         d   pR RR\        T4      /p Rp?T# Rp?ii ; i)rw  znot-requiredzffprobe-unavailableNrN  rq  rp  rr  zOformat=duration,bit_rate:stream=codec_name,codec_type,width,height,r_frame_raters  r   Tr  rq  r  rb  r   >   r  r  i)rF  rS  rG  r^  rV  r{  r   rv  ry  rz  r   r~  )	r   rx  r9  _shutil_subprocessr   r  r   r  s	   &&       r   _v91_probe_mediar  %+  s'   N#F$$Vm)*F7i CvI??CW_  >O  PU  V\  ]a  b  rv  |@  IK  Zq  Zs?  t==!JJryy00D1G74	RY:Z6 M hw		R/GHfM HWXgd3i$HVM Is*   AB? B? B? 5B? ?C$
CC$c                 	   . p. pR ^ R^ R^ R^ R^ R^ /p/ p\         P                  4        UUUu/ uF  w  pw  rgVR,           V,           VbK  	  pppp\        P                  4        EFm  w  r\        P                  P                  V4      '       g   K-  ^ p
^ p\        P                  ! V4       EF  w  rpV Uu. uF8  qP                  4       \        9  g   K  VP                  R4      '       d   K6  VNK:  	  upVR&   V EF  p\        P                  P                  VV4      p\        P                  P                  VV4      P                  R	R4      p\        V4      '       d   VR;;,          ^,          uu&   K|  \        P                  P                  V4      ^,          P                  4       p\        V4      p\        P                   ! V4      pT	R,           T,           pR
TRT	RTRTRTRTRTP$                  RTP&                  R\)        T4      RTP+                  T4      RTR8g  /pTR-9   d   TP-                  \/        TT4      4       TP1                  T4       TP+                  T^ 4      ^,           TT&   T
^,          qTP$                  ,          pTR.9  g	   T '       d   TP1                  TT34       RTR&   EK  RTR&   EK  	  EK  	  R
VRV
RV/WI&   EKp  	  \        P                  P                  \2        R4      p\        P                  P5                  V4      '       g   \7        RV,           4      h\        P                   ! V4      pR
RRRRRRVRRRR RVP$                  RVP&                  R\)        V4      RRRR/pVP1                  V4       VP1                  VR34       VR ;;,          ^,          uu&   RR/ Uu/ uF  pVVV,          bK  	  up/pV Uu/ uF  pVR
,          VbK  	  pp\         P                  4        FT  w  pw  rgVR,           V,           pVP+                  V4      pV'       g   R
VRR/MR/ Uu/ uF  pVVV,          bK  	  upVV&   KV  	  R \8        R!\:        P<                  ! 4       P?                  R"R#7      R$\@        R%VR&VR'R(R)R*. R0OR+R,//pWVV3# u upppi u upi   \"         d     EK  i ; iu upi u upi u upi )1rS  r  r  r  r  backup_excludedr&  r(  r"  r%  r   r  relative_pathr  	extensionrx  r  mtime_nsr  canonical_componentincluded_payloadrS   TFr  r  r%  zactive_admin_missing:ADMINr&  r
  r   r  r  rl  r  r   rz
  
componentsnetlify_policyru   zUSA phone/computer onlyexcludedallowed_differencezrOnly deployment paths/layout profile may differ; the budget slide is text-only and logically identical everywhere.>   r  r  >   r  r  r  )r   r  r  r  )r)   r.   rG   )!AUDIT_V91_CANONICALr  AUDIT_V91_ROOTSr   r   r  r'  r   AUDIT_V91_SKIP_DIRSr*  r   r  r   r  r4  r  r  r  r  st_mtime_nsr  r   r   r  r  r  rg  r  AUDIT_V91_SCHEMAr   r  r
  r   )include_media_payloadr  payloadsr|
  rz
  rT  r  r  canonical_paths	root_name
root_count
root_bytesr,  dirsru  r/  r   rv  r  rx  r  r
  rz	  
admin_pathr
  r  r  r   by_pathsots   &                             r   _v91_collect_inventoryr  5+  s   
Erh6!GAga'RSTefg"h6prjo<O<U<U<WX<W.#jtT#Xc\#%<WOX)//1	ww}}T""H
j"$''$-G $g1	9L(LQUVUaUabeUfQQgDGWW\\'$/GGOOD.66tC@&t,,f5F.G.J.GHGG$$T*1-335IcNtRcM#%Cy]SWXcdghnos  uA  BD  BL  BL  MW  XZ  Xf  Xf  go  p@  AE  pF  G\  ]l  ]p  ]p  qt  ]u  vH  IM  OV  IV  W,,cjj9I$t9T.US!

40B10D6$<jRSmjacakakUkU_88<QS[SbSbdhilcmSn  IMps  uG  qH.3c,-  #0 !gjL% 2& ww||H%67J77>>*%%\:QR\:\-]']	wwzB6*;F7?[lmz  |F  GR  SX  Y_  `f  gs  tv  t~  t~  I  JL  JX  JX  Ya  br  s}  b~  T  U\  ]o  pt  #uE	LL*5F)GH&QW.Z[J[.-VW-V58-VWXJ"'(%QQvYq[%G(-335JTHSLgkk#.#<?&Xe4  YB  FC  YBSTaAh  YB  FC
3 6 
"<0H0HR[0H0\]l  nA  BI  JO  P\  ]g  hx  zA  B[  \f  gb  cw  xl  ym  	nC&$$? Y
 h (( X( FCs;   R6R#R#.R#7R(:R;S 9S(R8	7R8	c                 z   ^ RI Hp T ;'       g    RP                  4       pVP                  4       pV'       g   R# VP	                  R4      '       d   R# VP	                  R4      '       d   R# VP	                  R4      '       d   R# VP	                  R4      '       d   R# V! V4      pVP
                  '       d   R	# R
# )r   urlsplitr   emptyr  r  protocolr  rd  zexternal-schemelocal)r  r  )r  r  r  )r`  ra  rb  rc  )urllib.parser  r   r   r*  scheme)r.  r  ri  r  r  s   &    r   _v91_url_categoryr  Y+  s    %99"


EC
~~'((
~~122:
~~=>>zXE?F}}}.r   c                    ^ RI HpHp T! V! V4      P                  ;'       g    R4      P	                  4       P                  RR4      pV'       g   R# VP                  R4      '       d   VP                  R4      # RV 9   d   V P                  R^4      ^ ,          MRp\        P                  P                  VR,           V,           4      P                  RR4      P                  R4      # )r   r  unquoter   r%  r&  r  )r  r  r  r   r   r   r*  r  rsplitr   rd  )
source_arcr.  r  r  rg  r   s   &&    r   _v91_resolve_referencer  g+  s    -
(3-$$**
+
1
1
3
;
;D
EE||C  (+z(9		3q	!!	$rD77DHUN+33D=DDTJJr   c                     ^ RI Hp T! \        T ;'       g    R4      4      P                  ;'       g    RP	                  4       p\
        P                  P                  V4      ^,          pV\        \        ,          9   # )r   r  r   )	r  r  r   r   r   r   r4  AUDIT_V91_MEDIA_EXTr  )ri  r  r   r  s   &   r   _v91_looks_asset_stringr  q+  s\    %
3u{{#
$
)
)
/
/R	6	6	8D
q!C&'99::r   c                 t  aaa ^ RI Hp . o. p\        4       o\        P                  ! RV \        P
                  \        P                  ,          4       F  p \        P                  ! VP                  ^4      4      pVP                  R4      ;'       g    .  F\  pVP                  R4      R8X  g   K  SP                  \        VP                  R4      ;'       g    R4      P                  4       4       K^  	  K  	   ! VVV3R lR	V4      pV! 4       qP                  V 4       \        P                  ! R
V \        P
                  \        P                  ,          4       F  p	V P!                  R^ V	P#                  4       4      ^,           p
\        P                  ! RV	P                  ^4      \        P
                  4       Fa  pSP%                  RSRWP                  ^4      P!                  R^ VP#                  4       4      ,           RRRVP                  ^4      RR/4       Kc  	  K  	  \        P                  ! RV \        P
                  4       FS  p	SP%                  RSRV P!                  R^ V	P#                  4       4      ^,           RRRV	P                  ^4      RR/4       KU  	  SV3#   \         d     EKc  i ; i)r   )
HTMLParserzJ<script[^>]+id=["\']usa2027-inline-media-manifest["\'][^>]*>(.*?)</script>r  r  r  r   r   c                   X   <a a ] tR tRt oV 3R ltVVV3R ltVV3R ltR tRtVt	V ;t
# )z,_v91_extract_html_references.<locals>.Parseri+  c                `   < \         SV `  R R7       RV n        ^ V n        ^ V n        . V n        R# )T)convert_charrefsr   N)superr  tagr  
json_depth
json_parts)r  ru  s   &r   r  5_v91_extract_html_references.<locals>.Parser.__init__+  s;    EG,d,CbTX\]RVR[op_c_n  CErv  sBr   c                  < VP                  4       V n        V P                  4       ^ ,          V n        V UUu/ uF  w  r4\	        V4      P                  4       VbK!  	  ppp. pV P                  R9   d   R F5  pVP                  V4      '       g   K  VP                  WuV,          34       K7  	  R Fw  pVP                  V4      '       g   K  \	        WW,          4      P                  R4       F7  qP                  WxP                  4       P                  4       ^ ,          34       K9  	  Ky  	  MV P                  R8X  d3   VP                  R4      '       d   VP                  RVR,          34       MV P                  R8X  d3   VP                  R4      '       d   VP                  RVR,          34       MZV P                  R8X  dJ   VP                  R4      '       d3   \        VR,          4      '       d   VP                  RVR,          34       VP                  R	4      '       dV   \        P                  ! R
VR	,          \        P                  4       F$  qP                  RV	P                  ^4      34       K&  	  V F  w  r\        P                  P!                  \        P                  P#                  \	        V4      P                  R4      ^ ,          4      4      ^ ,          P                  4       pV P                  R8H  ;'       d    VS9   pSP                  RSRV P                  RV P                  R,           V
,           R\	        V4      RV/4       K  	  \	        VP                  R4      ;'       g    R4      P                  4       p\	        VP                  R4      ;'       g    R4      pV P                  R8X  d!   RV9   g   VR9   d   ^V n        . V n        R# R# R# u uppi )r   r  r  r   linkhrefobjectr   r  styleurl\(\s*["\']?([^"\')]+)z	style-urlr  rc  r  source_type@	referenceinactive_video_fallbackr  r   r?  r   N>	   r  r  embedinputtrackr  iframer  r  )r  poster)srcset>   usa2027-music-segmentsr^  )r   r  getposr  r   r   r  r+  r   r  r  r  r  r  r   r   r4  r   r  r  )r  r  attrsr  r  amappairsr  r  mmr5  r]
  r   fallbacktypidentmanifest_video_basesr  r  s   &&&             r   handle_starttag<_v91_extract_html_references.<locals>.Parser.handle_starttag+  s   YY[DHDKKM!,<$)`eCf`eY\YZCFLLNSTDT`edCfExxee)Axx{{ELL!G$= *$Axx{{$'L$6$6s$;D\\1ZZ\M_M_MabcMdJe=f$; % 6!dhhv&6&6fTRX\EZ8[8#(8(8%,,tTZ|G\:]3488F#3#38OPTU[P\8]8]_d_k_kmstxy  uA  mB  `Cxx  ++&A$w-PRPTPTUBWcWcepqsqyqyz{q|d}W~U!WW%%bgg&6&6s3x~~c7J17M&NOPQRXXZ((E/JJd6J.JVJvdiidhhWZl[_N_`klopslt  vO  PX  Y  Z " DHHV$**+113C3txx~?S?SQS;TUxx!v}A{8{  OP  C  N  bd  RV  Ra8{!% Dgs   %Oc                &  <a a S P                   '       dk   VP                  4       R 8X  dT   RP                  S P                  4      p \        P
                  ! V4      pVV VV3R loS! V4       ^ S n         . S n        R# R# R#   \         d     L!i ; i)r  r   c                 h  < \        V \        4      '       d"   V P                  4        F  pS! V4       K  	  R# \        V \        4      '       d   V  F  pS! V4       K  	  R# \        V \        4      '       d;   \        V 4      '       d(   SP                  R SRSP                  RRRV RR/4       R# R# R# )rc  r  r  zinline-jsonr  r  FN)r   r   r  r  r   r  r  r  )r  vvr  r  r  r'  s   & r   r'  H_v91_extract_html_references.<locals>.Parser.handle_endtag.<locals>.walk+  s    %a--&'hhj$r(j'$//&'ba'#..3J13M3Mt{{\bcmntuyu~u~  @M  N[  \g  hi  jC  DI  \J  PK3M.r   N)r  r   r   r  r   rv  r   )r  r  r.  r   r'  r  r  s   f&  @r   handle_endtag:_v91_extract_html_references.<locals>.Parser.handle_endtag+  su    399;#8GGDOO,	'CDK K J !24? $9 !&$&s   'B BBc                d    V P                   '       d   V P                  P                  V4       R # R # r   )r  r  r  )r  r   s   &&r   handle_data8_v91_extract_html_references.<locals>.Parser.handle_data+  s     6 6t <r   )r  r  r  r  )r\  r]  r^  r_  r  r  r  r  ra  rl  __classcell__)ru  rg  r  r  r  s   @@r   Parser,_v91_extract_html_references.<locals>.Parser+  s       	E	d(	6	= 	=r   r  z<style[^>]*>(.*?)</style>ru  r  rc  r  r  css-urlr  r  FzC\b(?:fetch|importScripts|Worker|SharedWorker)\s*\(\s*["\']([^"\']+)zjs-resource)html.parserr  r  r  r  r  r  r   rv  r  r   rN  r   r   r   feedr  r)  r  )rY  r  r  ignoredr  r   r  r  r/  r  
start_liner?  r  r  s   &f          @@r   _v91_extract_html_referencesr	  x+  s   &	DRWce-[[fgklnlplpqsququluv	AGGAJ'D)//R/88F#W,.B.F.Fs488TZK[KaKa_aGbGhGhGj.k 0 w%= %= %=L hAtkk6tBDDIF::d1RXXZ02
8!RTTJADKKY_`jkqr|  ~F  ~F  GH  ~I  ~O  ~O  PT  UV  WX  W^  W^  W`  ~a  sa  bo  py  zE  FG  FM  FM  NO  FP  Qj  kp  Yq  MrJ G kk`aefhfjfjkVJvdjja
.KA.Mm\ijuvxv~v~  @A  wB  C\  ]b  c  	d l<] $s$   <J'J'2'J'J''J76J7c                 L  aaa  V  Uu/ uF  qR ,          VbK  	  pp\        4       pV FY  pVP                  R4      p\        ^\        V4      4       F,  qcP	                  RP                  VRV 4      R,           4       K.  	  K[  	  . p. p. p	. p
\        P                  4        UUu0 uF  w  rVR,           V,           kK  	  pppV  EFB  oSP                  R4      \        9  d   K   \        SP                  R 4      ;'       g    R4      pVR8X  d   KM  W9  d/   RV9  d(   VP                  4       P                  R74      '       g   K  \        SR,          4      P                  RR	R
7      p. oSR,          R89   d   \%        TSR ,          4      w  opEMSSR,          R8X  d~   \&        P(                  ! RT\&        P*                  4       Uu. uFK  pRSR ,          RTP-                  R^ TP/                  4       4      ^,           RRRTP1                  ^4      RR/NKM  	  upoMSR,          R99   d)    \2        P4                  ! T4      pTTT 3R lo S ! T4       MSR,          R:9   d   \&        P(                  ! RT\&        P*                  4       FZ  pSP!                  RSR ,          RTP-                  R^ TP/                  4       4      ^,           RRRTP1                  ^4      RR/4       K\  	  S F  p\7        TR,          4      pTTR&   TR8w  d   TP!                  T4       K4  \9        SR ,          TR,          4      pTTR&   TP!                  T4       TT9   ;'       g    TP;                  R4      R,           T9   pT'       d   K  TP                  R4      '       d   TP!                  / TCRR/C4       K  T	P!                  / TCR R!/C4       K  	  TP                  4       pR; F*  pTT9   g   K  T
P!                  RSR ,          RR"R#T/4       K,  	  EKE  	  / pV	 F  pVR,          VP                  RR4      VP                  RR4      3pVP=                  V/ VCR$^ R%. /C4      pVR$;;,          ^,          uu&   VP                  R4      VR%,          9  g   K}  VR%,          P!                  VP                  R4      4       K  	  \?        VP                  4       R& R'7      pR(\@        R)\B        PD                  ! 4       PG                  R*R+7      R,R-\        V4      R.\        V	4      R/\        V4      R0\        V4      R1\        V
4      /R2VR3V	R4VR5VR6V
/# u upi u uppi   \         d4   pT
P!                  RSR ,          RRR\#        T4      /4        Rp?EK  Rp?ii ; iu upi   \         d     ELi ; i)<r   r&  Nr  r   r%  z/media/r  r   r   r  r  r  
read-errorr  r$   r  rc  r  ru  r  r  r  r  Fc                 b  < \        V \        4      '       d"   V P                  4        F  pS! V4       K  	  R# \        V \        4      '       d   V  F  pS! V4       K  	  R# \        V \        4      '       d8   \        V 4      '       d%   SP                  R SR,          RRRRRV RR/4       R# R# R# 	rc  r   r  Nr  z
json-assetr  r  Fr   r   r  r  r   r  r  )r  r  	extractedrz	  r'  s   & r   r'  "_v91_reference_audit.<locals>.walk+  s    !!D))"#((*Bd2h*#Ad++"#BT"X!#Ac**/Fq/I/I9K[K[]cdghndopvw{  }J  KW  Xc  de  f  @E  ]F  LG/I*r   z["\']([^"\']+\.(?:js|mjs|css|json|webmanifest|manifest|html?|jpg|jpeg|png|webp|gif|svg|avif|mp4|m4v|mov|webm|mp3|m4a|aac|wav|ogg)(?:[?#][^"\']*)?)["\']code-asset-stringr
  r  resolvedinactive-video-fallbackrb  target-not-foundprivate-or-local-tokenr  occurrencesr  c                 l    V R ,          V P                  R4      ;'       g    ^ V P                  RR4      3# )rc  r  r  r   r`  r%  s   &r   r  &_v91_reference_audit.<locals>.<lambda>+  s0    QvYquuV}?Q?QPQRSRWRWXcdfRg4hr   r  r  r  rl  r  summarylocal_reference_occurrencesmissing_occurrencesmissing_uniqueignored_occurrencessuspicious_items
referencesmissing_local_referencesmissing_unique_referencesignored_referencessuspicious_tokens)z/manifest.json.webmanifestrN     r    	.manifestr$  >   r%   r&  .mjsfile://	localhostr=  c:\tripserverzc:/tripserver)$r  r+  r=  r,  rN  r   r  r  r   r  r   r   r  r   r  r   r  r~  r	  r  r  r  r  r)  r  r   rv  r  r  rstripr:  r  r  r   r  r
  )!r  r   by_arcprefixesr   r0  r  r  r  r[  
suspiciousr  r  canonical_scan_pathspath_keyrY  r  r  r  r   r  r
  r  r   r  r  r  rT  r5  unique_listr  rz	  r'  s!   &                             @@@r   _v91_reference_auditr3  +  s   !&'AfIaKF'#%jjoqU$All388E"1I3Fs3J&K$  
DRWZ9L9S9S9UV9UXTDHSLL9UV77;'998SWWV_**+ (((/IX4MV^VdVdVfVoVo  qR  WS  WSs=)*44gY4WT	{//=YZ^_bci_j=k1v% km  kv  kv  wR  SW  XZ  X\  X\  k]  ^  k]  fgs6{6$**T!AGGI2Nq2PQ^_hituvu|u|}~u  AZ  [`  a  k]  ^I!EE	#ZZ%G T
!55[[  "|  }A  BD  BF  BF  G  IR  IY  IY  [a  be  fl  bm  nt  uy  u  u  @D  EF  GH  GN  GN  GP  uQ  RS  uS  Ta  bu  vA  BC  BI  BI  JK  BL  Mf  gl  Zm  In  GD&tK'89HH4
;K '.."6+CK[8IJH]eDQ[L\gkgrgrswgxv%MM)=c)AX)MF688566NN#Pd#P:6O#PQS[C$Cx0BCD  JJLYE|Z..s6{6Jbcjkp/qr ZK N F&\$((:b1$((;r2JK  %H%H]1WR%HI6R_K`bcKcK`88F6'?2F7O4J4J488TZK[4\  v}}+hiK%l8<<>3K3KU^3K3_`i  lI  JM  NR  JS  Ti  jm  nu  jv  wG  HK  LW  HX  Yn  or  sz  o{  |N  OR  S]  O^  k_  `l  mq  rL  MT  Up  q|  }Q  RY  Zm  nx  y  yg (
 W y!2!2F3v;vl[cdhildm3n!oqyy ^ "d"s<   U$U#UAV*&VV'VVV#"V#c           	       aaaa ^ RI Ho \        T ;'       g    R4      oSP                  4       p. o\	        4       oRVVV3R llpR FW  w  r4\
        P                  ! WA\
        P                  4       F)  pV! W5P                  4       VP                  ^ 4      4       K+  	  KY  	  . p\
        P                  ! RS4       F4  pVP                  VP                  4       VP                  ^ 4      R34       K6  	  \
        P                  ! R4      pVP                  S4       F5  pVP                  VP                  R4      VP                  R4      R34       K7  	  \
        P                  ! R4      pVP                  S4       F  pVP                  R4      p	V	P                  4       p
\        \
        P                  ! R	V
4      4      pR
V
9   ;'       g    V
P                  R4      pV'       g   V'       g   Kt  VP                  VP                  R4      V	R34       K  	  V3R lpV F"  w  rpV! VV4      pV'       g   K  V! W>V4       K$  	  S# )a  Return real private deployment references without flagging host-detection code.

A trip file may legitimately compare ``location.hostname`` with literal values such
as ``localhost`` and ``127.0.0.1`` in order to choose an offline/private-server
mode. Those literals are not outbound links and must not block a Netlify export.
Actual local URLs, private IP URLs, Tailscale hosts and local filesystem paths
remain hard failures.
r  r   c           
      2  < SP                  R ^ \        ^ \        V4      4      4      ^,           p\        V 4      V\        V4      R,          3pVS9   d   R# SP	                  V4       SP                  R\        V 4      RVR\        V4      R,          /4       R# )ru  :N   NNr  r  ri  )r  r>  r   r   rN  r  )r  r)  ri  r  rT  hitsraw_textrW  s   &&&  r   rN  0_v91_find_private_deploy_references.<locals>.add+  sy    ~~dAs1c%j'9:Q>5z4UD!12$;Wc%j&$UDAQRSr   z(?i)(?:https?:)?//[^\s"'<>`]+Tza(?is)\b(?:href|src|poster|data-href|action|formaction|data)\s*=\s*(?P<q>["'])(?P<value>.*?)(?P=q)ri  z(?is)(?P<q>["'])(?P<value>(?:localhost|127\.0\.0\.1|\[::1\]|[a-z0-9.-]*tail978ec2(?:\.ts\.net)?)(?::\d{1,5})?(?:[/\\][^"']*)?)(?P=q)(?::\d{1,5})(?:[/\\]|$)|[/\\]r}  .ts.netFc                   < \         P                  ! \        T ;'       g    R 4      4      P                  4       pV'       g   R# VP	                  R4      pVP                  4       pVP                  R4      '       d   R# \        P                  ! RV4      '       d   R# TpVP                  R4      '       d   RV,           pM\        P                  ! RV4      '       gi   \        P                  ! R	V4      pV'       g   R# V'       g'   \        P                  ! R
V4      '       g
   RV9   g   R# RVP                  RR4      ,           p S	! V4      P                  ;'       g    R P                  4       P                  4       pT'       g   R# TR9   d   R# RT9   g   TP                  R4      '       d   R# TP                  R4      '       d   R#  \        P                  ! T4      pTP                   ^8H  ;'       d    T\        P"                  ! R4      9   pTP$                  '       g-   TP&                  '       g   TP(                  '       g	   T'       d   \        T4      R8X  d   R# R#  R#   \         d     R# i ; i  \*         d     R# i ; i)r   Nz.,;)}]r)  z'(?i)^c:(?:\\+|/+)tripserver(?:\\+|/+|$)r+  r  zhttp:z(?i)^https?://zc(?i)^(localhost|127\.0\.0\.1|\[::1\]|[a-z0-9.-]*tail978ec2(?:\.ts\.net)?)(?::\d{1,5})?(?:[/\\].*)?$r:  r}  r  r%  r&  r*  r;  z.localzprivate-hostr  r=  z
private-ip>   r*  ::1)r   r  r   r   r,  r   r*  r  r
  r  r   hostnamer   r  r  r  r  r  r  r  r  r  )
r   url_contextri  	low_valueparsed_valuehostishr  r  tailscale_cgnatr  s
   &&       r   classify5_v91_find_private_deploy_references.<locals>.classify",  s   !!#ioo2"67==?X&KKM		**88>FF#%%"U?L+U33 hhvG 299-Mu#U#UYeirYr$u}}T3'??L	\*3399r@@BHHJD ''44==#;#;==""!	%%d+B jjAo]]"	8L8L_8]2]O~~~"2B2B2Bo&)"g&<{N,N GV #  		  		sN   I% I% 
+I7 6+I7 "I7 4I7 I7 I7  I7 %I43I47JJr3  ))r)  z
file\s*://)r+  z#c:(?:\\+|/+)tripserver(?:\\+|/+|\b))r  r  r   r   r  r  r  r  r)  r  r  rN  ru  r  r  )rY  r  rN  r  rV  r
  rI  r;  quoted_host_reri  r@  has_route_or_port
is_tailnetrD  r)  r   r?  r7  r8  rW  r  s   &                @@@@r   #_v91_find_private_deploy_referencesrI  +  s    &4::2H
..
CD5DT T [[rtt4E{{}ekk!n5 5	 JA8L5;;=%++a.$?@ M jjpG !!(+5;;w/W1EtLM ,
 ZZ 	TN  ((2G$KKM	 +KY!WX!Y.OO)2D2DY2O


u{{73UEBC 3.` *4%+K05i( *4 Kr   c                    ^ RI p^ RIp. p. p/ p\        P                  ! V R4      ;_uu_ 4       pVP	                  4       pV'       d   VP                  RV,           4       VP                  4        U	u. uF6  qP                  4       '       d   K  V	P                  P                  RR4      NK8  	  p
p	V
 EF  pVP                  V4      pR\        V4      R\        V4      /Wk&   VP                  4       pVP                  R4      '       g   R	V9   g   VP                  R
4      '       d   VP                  RV,           4       VP                  R54      '       g   K  VP!                  RR4      p\#        V4       FN  pVP                  RV,           R,           VR,          ,           R,           \%        VR,          4      ,           4       KP  	  EK  	  \&        ;QJ d    R V
 4       F  '       g   K   RM	  RM! R V
 4       4      '       g   VP                  R4       \&        ;QJ d    R V
 4       F  '       g   K   RM	  RM! R V
 4       4      '       g   VP                  R4       RRR4       VP(                  ! RR7      p \        P                  ! V R4      ;_uu_ 4       qwP+                  V4       RRR4       / p\,        P.                  ! V4       F  w  pppV F  p\,        P0                  P3                  VV4      p\,        P0                  P5                  VV4      P                  RR4      pR\,        P0                  P7                  V4      R\9        V4      /VV&   K  	  K  	  VV8w  d   VP                  R4       . pVP;                  4        F  w  pp\,        P0                  P2                  ! V.VP=                  R4      O5!  p\,        P0                  P?                  V4      ^,          P                  4       pTP                  RTRRV9   d   VP=                  R^4      ^ ,          MRRRV9   d   VP=                  R^4      ^,          MTR VR!VR"\A        V4      RVR,          RVR,          /4       K  	  \C        V4      pVR#,          R$,          '       d    VPE                  R% VR&,           4       4       V U	u. uF  qP                  R'4      '       g   K  V	NK  	  pp	V'       d   \G        \,        P0                  P2                  ! V.V^ ,          P=                  R4      O5!  4      PI                  RRR(7      p\J        PL                  ! R)V\J        PN                  \J        PP                  ,          4      pV'       g   VP                  R*4       M^\J        PL                  ! R+VPS                  ^4      \J        PN                  4      '       d   VP                  R,4       MVP                  R-4       VPU                  VRR.7       R/V'       * R0\W        \Y        V4      4      R1VR2\        V4      R3VR4V/# u up	i   + '       g   i     EL; i  + '       g   i     EL; iu up	i   TPU                  TRR.7       i ; i)6r   Nr   crc_failed:r%  r&  r  r  r  r  r.   ztv_file_forbidden:r   r   private_path_or_host:re  r  z:line=r  c              3   D   "   T F  qR 8H  ;'       g    VR8H  x  K  	  R# 5i)rO  r-   Nr  r   rt
  s   & r   r   ,_v91_validate_netlify_zip.<locals>.<genexpr>h,  s#     I5a&&99!\/95s     TFindex_missingc              3   B   "   T F  qP                  R 4      x  K  	  R# 5i)rO   Nr  rN  s   & r   r   rO  i,  s     JEq::9::Er	  phone_presentation_missingtripserver_netlify_verify_r  extract_inventory_mismatchr   r  ROOTr  r  r  rx  r  r  c              3      "   T F<  pR VP                  RR4      ,           R,           VP                  RR4      ,           x  K>  	  R# 5i)zmissing_internal_reference:rc  r   z->r  Nr`  r  s   & r   r   rO  y,  sI       V  nUhi7fR8HHMaeeT_`bNccc  nUs   AAr!  rO   r  z;<section[^>]+data-key=["\']budget["\'][^>]*>(.*?)</section>netlify_budget_slide_missingu+   (?:\$\s*\d|₪\s*\d|\d[\d,]*\s*(?:USD|ILS))%netlify_budget_slide_contains_amounts3netlify_phone_presentation_missing_for_budget_checkr  r  rZ  r  r  	inventorybuilder_details)r"   r#   r$   r%   r    r$  r&  )-r	  rF  rI  rJ  r  r  rK  r  r5  r   r9  r,  r  r   r*  r  r|  rI  r   r  r
  
extractallr   r'  r   r   r  r  r  r  r+  r4  r  r3  r  r   r  r  r  r  r  r  r  r  r  ) rP  r>  r	  r  rZ  r  r[  rU  r
  r  ru  r   r   r  rY  hitrF  r  dpr  nsrt
  r/  r  scan_recordsr  rv  r  
ref_reportpresentation_candidatesptextr  s    &&                              r   _v91_validate_netlify_zipre  Y,  s   &FxbI	#	&	&"JJLmC/057[[]U]((*+qzz!!$s+]UDDc$iQbcgQh0i	

C~~i((,=,DUfHgHgioiviv  xL  MQ  xQ  jR||\]][[3>tDCMM"9$">s"B3w<"OPX"XY\]`ag]hYi"ij E  sI5IsssI5III6==YhKisJEJsssJEJJJFMMZvLw 
' 
		!=	>D5__Xc**b--2E*	wwt}GBq'',,r!$"''//!D*A*I*I$s*Sceqrtryry  sB  sB  CD  sE  FN  O_  `a  Ob  ecU^_bUc  % i/K!L!)HCd3CIIcN3D9I9I#9Nq9Q9W9W9YSF#QT*399S3CA3FZ`ap  IL  PS  ISqtqzqz{~  @A  rB  CD  rE  Y\  ]j  ko  p{  |  @F  GP  QT  GU  Vb  cg  ht  cu  v~  C  DL  M  !N  O * (5
i !122MM  Vmw  yT  nU  V  V,5 aIqD_9`I a"rww||DP*A!*D*J*J3*OPQ[[elt}[~EyyWX]^`^b^bcecgcg^ghBv}}%CDI"((ST+VXVZVZ[[]c]j]j  lS  ^TmmQR^^Dt^4VHVCK%8H\Z]^gZhitu~  @Q  RY  Z  ZI V 
'	&	&" +** !b ^^Dt^4s   AX,1X' X'-A7X,%,X,A>X,X,)X,X, X,4X,X,<Y Y ,HY 4YYC+Y #Y 'X,,X=	 Y	Y Y.c           	        \         P                  P                  V RR4      p\         P                  P                  V4      '       g   . # \	        V4      pVP                  R4      ;'       g    .  Uu0 uF  p\        V\        4      '       g   K  VP                  R4      R8X  g   K3  VP                  R4      '       g   KL  R\        VP                  R4      ;'       g    R4      P                  R	R
4      P                  R
4      ,           kK  	  pp\         P                  P                  V RRRR4      p. p\         P                  P                  V4      '       g   V# \         P                  ! VRR7       F  w  rxp	V	 F  p
\        V
4      \        9  d   K  \         P                  P                  Wz4      p\         P                  P                  W4      P                  R	R
4      pW9  g   Ko  \         P                   ! V4       VP#                  V4       K  	  Wu8w  g   K   \         P$                  ! V4      '       g   \         P&                  ! V4       K  K  	  \+        V4      # u upi   \(         d     EK  i ; i)a%  Keep only runtime-declared audio in a USA Netlify deployment.

The private server may contain editable segment/source tracks. They are inventoried
and validated by the live-source audit, but they are not runtime dependencies and
therefore must not inflate or leak into the public Netlify ZIP.
r(   rO   r  r  r  r  r  r   r%  r&  rS   rT   rU   F)topdown)r   r   r   rg  r  r   r   r   r   r   r  r  r'  r6  r  r  r  r  r  rmdirr  r  )rP  r'  r   r  declaredrt  removedr,  r  ru  r   rv  r  s   &            r   %_v91_prune_netlify_unreferenced_audiork  ,  s    Z8ST77>>+,,	01BCG [[)//R//Dd4  
K%)XXf%5%@ 
KEIXXe_ 
K#dhhuo++,44T#>EEcJ	J	J/  
 j%:LgVJG77==$$WWZ?ED~%9977<<-D''//$2::4DC"		$!4   zz'**BHHW,=* @ '?-(  s6   1I!I!&I!?I!0I!I&:I&&I65I6c                    \        V 4      p\        V\        4      '       d   TMV/ 3w  r#\        V 4      ;'       g$    \	        T ;'       g    R 4      P                  4       pVR8X  Ed   VP                  R4      p\        V4      pV'       d   \        VR4      pVP                  R4      '       g;   \        RRP                  VP                  R4      ;'       g    . 4      ,           4      h\        TRVP                  R4      ;'       g    \        R,          VR4      p\        WR4      p	\        4       p
VP                  R	\!        V	4      R
\"        P$                  P'                  V4      RVRVRVR\)        WRRV
4      /4       \+        W#4      pVR,          '       g)   \        RRP                  VR,          4      ,           4      hVP-                  4        UUu/ uF  w  rVR8w  g   K  WbK  	  uppVR&   W#3# u uppi )r   r(   rP  r  z+v91_netlify_validation_after_prune_failed:
ru  rZ  r)  zspecialized-live-source-v91r  r  r  r  pruned_unreferenced_audior  z$v91_netlify_post_validation_failed:
r[  v91_post_validation)r  r   r  r  r   r  r   rk  r  r  r   r  r  r  r  r   r,  r   r   r  r  re  r  )rr   r9  rP  r>  r  rP  rj  clean_validationr  r  r  r  r  r  s   &             r   build_netlify_deploy_zip_v91rp  ,  s   '-F)&77VfR[H'-HHTZZR1F1F1HH5;;|,
5jA3JuE#''--"#QRVR[R[\l\p\pqy\z  ]A  ]A  A  SB  $B  C  C-jw{{=?Y?k?k]dej]kl|  ~[  \H(=E.0INNE
RWW__X68-+G()=jRWXa)b  ):Jd<0WX\XaXablmubvXw0w#xx3=3C3C3E#X3ECAKCAC3E#XG!" $Ys   G4$G4c                   aa . oRV3R llpVP                  R/ 4      P                  4        F&  w  rgV! RV,           VP                  RR4      V4       K(  	  T! R\        V3R lR 4       4      ^ 8  R Uu/ uF  qSP                  V^ 4      bK  	  up4       V! RVR	,          R
,          ^ 8H  VR	,          R4       V! RRRVR	,          R,          /R4       Ve   V! RRV4       S U	u. uF%  qR,          '       d   K  V	R,          R 8X  g   K#  V	NK'  	  p
p	S U	u. uF%  qR,          '       d   K  V	R,          R8X  g   K#  V	NK'  	  pp	R\        R\        P
                  ! 4       P                  RR7      RV
'       * RSRV
RVR	R\        S4      R\        R S 4       4      R\        V
4      R\        V4      //# u upi u up	i u up	i )rp  c           
      L   < SP                  R V R\        V4      RVRV/4       R# r   r  r
  r  NrA  r   r  r  r
  r	  s   &&&&r   rN  _v91_readiness.<locals>.add,  s(    fmmVDdSUhWabjkstz<{.|r   r  r  r   Tmedia_inventory_presentc              3   H   <"   T F  pSP                  V^ 4      x  K  	  R# 5ir  r`  )r   r  r|
  s   & r   r   !_v91_readiness.<locals>.<genexpr>,  s     %Y?X!fjj1oo?Xs   "no_missing_local_referencesr  r  r   private_or_local_tokens_reportedr  r  #netlify_builder_and_post_validationr  r
  r  r  rl  r  rO	  r	  rb  r  rj  rG  c              3   2   "   T F  qR ,          x  K  	  R# 5ir-  r  r	  s   & r   r   rx  ,  s6       Sl  ek  `a  VZ  T[  T[  ekr	  rp  r  r  r  )r   r  r  r  r   r  r
  r,  )r  r|
  r  r  netlifyrN  rT  r  r  r  rb  r  r	  s   &f&&&       @r   _v91_readinessr  ,  sh   F|GGL,224c)C-QYZ^H_`d6e4!#%Y?X%Y"YZ["[  yR  ]S  yRst_e_i_ijklm_n]n  yR  ]S  T%d9o6F&G&J4PY?[de*4iI[9\0]^ghC Ed7SHv!tWWA:1GAAvFH_e  TS_eZ[osmtmtTUyz  |F  zG  IR  zRTUTU_e(  TS%l8<<>3K3KU^3K3_`glrhrs{  }C  DL  MS  T^  _g  hq  sz  {~  E  {F  GO  PS  Sl  ek  Sl  Pl  mu  vy  z@  vA  BL  MP  QY  MZ  r[  \  \ ]S I  TSs*   5F4'F9<F9F9F>-F>=F>c           	         \         P                  ! \         P                  P                  V 4      R R7       V R,           p\	        V4      P                  \        P                  ! VR^\        R7      RR7       \         P                  ! W 4       R# )Tr   r   Fr   r   r  r   r   N)
r   r   r   r   r   r  r   r  r   r   )r   r   r   s   && r   _v91_write_json_atomicr  ,  s    KK%t4$v+ctCyG[G[\`\f\fgn  }B  JK  TW  ]X  biG[  Hj  ln  lv  lv  wz  l@r   c                      \        R 4      w  rr#\        V 4      p\        WW4R4      pVP                  RVRVRVR\	        R R7      /4       \        \        V4       V# )FNsource_of_truthfile_countsreference_audit	self_testr~  )r  r3  r  r   r  r  AUDIT_V91_QUICK_REPORT)r  r  r|
  r  r  r  s         r   run_quick_usa_audit_v91r  ,  s{    -e4EF;OPU;Vd_mns{~  EI  `JX^
MM$Sv>OPTU`at  OT  bU  V  W1&9&=r   c                    \         P                  ! \        R R7       \        P                  ! 4       P                  R4      q'       d   RMRp\         P                  P                  \        RV RV R24      p\        R4      w  rE\        V 4      w  rgr\        V4      p
\        WhWV4      p\        R	R
7      pV Uu. uF  qR,          R,9   g   K  VNK  	  ppRT	RR\        RVRV/RR\        RR- Uu/ uF  qVP                  V^ 4      bK  	  upRV/RV
RRV
R,          RV
R,          RV
R,          /RVRVRR\         P                  P                  V4      R\         P                  P!                  V4      RVR\#        V4      /RR \$        R!\#        \         P                  P                  \&        R"4      4      R\        //	p\(        P*                  ! TR#\(        P,                  V '       d   ^M^	R$7      ;_uu_ 4       pV F  w  ppVP/                  VVR%7       K  	  VP1                  4        F4  w  ppVP3                  V\4        P6                  ! VR	^\8        R&7      4       K6  	  R'R'R'4       \(        P*                  ! VR(4      ;_uu_ 4       pVP;                  4       p\=        VP?                  4       4      pV'       d   \A        R)V,           4      h\=        V4      PC                  V4      '       g   \A        R*4      hR"V9  d   \A        R+4      h R'R'R'4       W;3# u upi u upi   + '       g   i     L; i  + '       g   i     Y;3# ; i).Tr   r  FULLCHATGPTUSA__AUDIT_r  r(   Fr~  rx  SOURCE_OF_TRUTH.jsonFILE_INVENTORY.jsonr  r|
  r  MEDIA_METADATA.jsonrS   REFERENCE_AUDIT.jsonMISSING_REFERENCES.jsonr  r!  r   AUDIT_READINESS.jsonzSELF_TEST.jsonNETLIFY_BUILD.jsonzip_namer  r>  
zip_sha256ADMIN_ACTIVE_VERSION.jsonr  r  r%  r   r  compresslevelarcnamer  Nr   audit_zip_crc_failed:audit_reports_missingaudit_active_admin_missing>   r  r  r  r~  )"r   r   AUDIT_V91_EXPORT_DIRr   r  r   r   r   rp  r  r3  r  r  r  r   r   r  r  r   r  rI  rJ  r  r  r  writestrr   r  r   r  r  namelistr  rT  )include_mediar  r  rP  netlify_pathnetlify_detailsr  r  r|
  r  r  	readinessr  r   rS   r  r  rU  r  r
  r   r   r
  ru  s   &                       r   _v91_build_audit_bundler  ,  s   KK$d38<<>;R;RSb;cU  uBjp  HQei  \^  \c  \c  \h  \h  i}  @D  EI  DJ  JQ  RW  QX  X\  ~]  \^  S[!=e!D L4]CE6J^_dJeTq  AF  NQ  Wf  rggp  sF  `e  sf  ir
Fey,EE11eE
F#C(=xHXYabhipqv>w  yN  PX  Yi  jr  Oh  si  Oh  JK  v|  v@  v@  AB  CD  vE  tE  Oh  si  jq  rw  Ox  yO  PT  Un  py  z~  H  zI  Je  fj  kF  fG  Hb  cg  hB  cC  oD  E[  \e  fv  w@  AU  Wa  bd  bi  bi  br  br  s  b@	  A	M	  N	P	  N	U	  N	U	  N	]	  N	]	  ^	j	  N	k	  l	u	  v	E
  F
R
  S
c
  d
p
  S
q
  Vr
  s
N  PY  Zm  nv  wG  HJ  HO  HO  HT  HT  U]  ^o  Hp  wq  rz  {K  OL  MG	#'2F2FZgUVmn	o	osuGC#c!:x#MMOLDR[[djj^cklux>y-zO 
p 
#	&	&"JJLBKKM 2%l#:3#>??7|$$U++<@W3X-XE)>Z1[+[)	 
'
  G si	o	o 
'	&
 s,   :LL0L7A(LBL0L-	0M	c                    V P                  R 4      pV P                  R4      R8X  d?   \        V\        4      '       d)   RVP                  R^ 4       RVP                  R^ 4       2# \        V\        4      '       dL   RP                  R VP	                  4        4       4      ;'       g    \
        P                  ! VR	\        R
7      # \        V4      # )r  r   ry  u*   הפניות חסרות ייחודיות: r  u    · מופעים: r  r  c              3   F   "   T F  w  rVR9   g   K  V RV 2x  K  	  R# 5i)r   rJ  N>   r   r  r  r  r  r  r  r  r  )r   r  r  s   &  r   r   $_v91_human_detail.<locals>.<genexpr>,  s2       .mYcaRS  Xl  Slk2aSkYs   !!Fr   r  )r   r   r   r   r  r   r  r   )r@	  r/  s   & r   _v91_human_detailr  ,  s%   iiAyy77Jq<N<N  ZD  EF  EJ  EJ  K[  \]  E^  D_  _q  rs  rw  rw  xM  NO  rP  qQ  XR  QR!D&++  .mQWWY  .m  #m  #]  #]  qu  q{  q{  |}  KP  Y\  q]  ]q6Mr   c                 r   VP                  R 4      ;'       g    / pRP                  R VP                  R. 4       4       4      pRVP                  R4      '       d   RMR,           R,           \        V 4      ,           R	,           \        VP                  R
^ 4      4      ,           R,           \        VP                  R^ 4      4      ,           R,           \        VP                  R^ 4      4      ,           R,           \        VP                  R^ 4      4      ,           R,           V,           R,           p\	        W4      # )r  r   c              3     "   T Fu  pR \        VP                  RR4      4      ,           R,           VP                  R4      '       d   RMR,           R,           \        \        V4      4      ,           R,           x  Kw  	  R# 5i	r  r   r   r  r  r
  r&
  r  Nrl  r   r  r	  s   & r   r   #_v91_result_page.<locals>.<genexpr>,  s       0g  Of  JK
;quuVTVGW;X0XYd0dopototuyozozfk  AI  1J  KV  1V  Wb  ct  uv  cw  Wx  1x  yE  1E  1E  Ofr  r	  rp  rO	  rq  r  z"><h1>   </h1><p>עברו rG  
    מתוך rj      · כשלים rb      · אזהרות r  u   </p><table style="width:100%;border-collapse:collapse"><tr><th>בדיקה</th><th>מצב</th><th>פירוט</th></tr>u   </table><p><a class="btn" href="/admin/live-usa-audit/quick/report">⬇ הורד דוח מלא</a></p><p><a class="btn" href="/admin/live-usa-audit">חזרה ל־Audit Center</a></p></div>)r   r   rl  r   r:  )r   r  sr  r  s   &&   r   _v91_result_pager  ,  s   jj!!rA  0g  OU  OY  OY  Zb  ce  Of  0g  )g4	

7(;(;f	H	QR]^cRd	dex	xy|}~  ~C  ~C  DL  MN  ~O  zP  
P  Q]  
]  ^a  bc  bg  bg  ho  pq  br  ^s  
s  tE  
E  FI  JK  JO  JO  PX  YZ  J[  F\  
\  ]p  
p  qt  uv  uz  uz  {E  FG  uH  qI  
I  JA  
A  BF  
F  GE	  
E	DU  r   /admin/live-usa-auditc                      R p \        RV 4      # )uD  <div class="card good"><h1>Audit Center — ארצות הברית</h1><p>כל המצבים קוראים את הקבצים הפעילים בשרת. חבילת ChatGPT כוללת קוד ומטא־נתונים מלאים ללא המדיה הכבדה.</p><div style="display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(240px,1fr))"><div class="card"><h2>⚡ Quick Audit</h2><p><a class="btn" href="/admin/live-usa-audit/quick">הרץ בדיקה והפק דוח</a></p></div><div class="card"><h2>🤖 ChatGPT Audit</h2><p><a class="btn" href="/admin/live-usa-audit/chatgpt">צור חבילה קטנה</a></p></div><div class="card"><h2>📦 Full Archive</h2><p><a class="btn" href="/admin/live-usa-audit/full">צור צילום מלא</a></p></div></div><p><a class="btn" href="/admin">⬅ חזרה לאדמין</a></p></div>u&   Audit Center — ארצות הברית)r:  )r  s    r   admin_live_usa_audit_v91r  ,  s     
PD=dCCr   z/admin/live-usa-audit/quickc            
          \        R \        4       4      #   \         d9   p \        RR\	        \        T 4      4      ,           R,           4      ^3u Rp ? # Rp ? ii ; i)u   Quick Audit — USA   Quick Audit נכשל=   <div class="card warn"><h1>הבדיקה נכשלה</h1><code>L   </code><p><a class="btn" href="/admin/live-usa-audit">חזרה</a></p></div>N)r  r  r   r:  rl  r~  r  s    r   admin_live_usa_quick_v91r  -  s     !67N7PQ	Q  pI.D  FE  FQ  RV  WZ  R[  F\  F\  ]k  Fk  %l  mp  %p  p  ps    A-AAAz"/admin/live-usa-audit/quick/reportc            
      B    \         P                  P                  \        4      '       g   \	        4        \        \        R RRR ^ R7      p RV P                  R&   V #   \         d9   p\        RR\        \        T4      4      ,           R,           4      ^3u R	p?# R	p?ii ; i)
TUSA_QUICK_AUDIT_REPORT.jsonapplication/jsonr   no-store, max-age=0r`     הורדת הדוח נכשלה<div class="card warn"><code>rt  N)r   r   rg  r  r  r	   re  r   r:  rl  r~  )rg  r  s     r   admin_live_usa_quick_report_v91r  -  s    [ww~~4557N7P1Sp  {M  Z^  gh  i  Mb  ks  k{  k{  |K  kL  ks  ds  [I.NOnoz{  AD  |E  pF  PF  GV  PV  %W  X[  %[  [  [s"   (A /A B&-BBBz/admin/live-usa-audit/chatgptc            
      b    \        R 4      w  r\        V R\        P                  P	                  V 4      RR^ R7      pRVP
                  R&   V#   \         d   p^ RIp\        P                  ! \        P                  P                  \        R4      RR7       \        \        P                  P                  \        RR	4      4      P                  TP                  4       R
R7       M  \         d     Mi ; i\        RR\        \!        T4      4      ,           R,           4      ^3u Rp?# Rp?ii ; i)FTr  r   r  r`  Nr  r   zlive_usa_audit_error.txtr   r      ChatGPT Audit נכשל_   <div class="card warn"><h1>החבילה לא נוצרה</h1><code style="white-space:pre-wrap">r  )r  r	   r   r   r   re  r   	tracebackr   r   r  r   r  
format_excr:  rl  r~  )r   r  rg  r  r  s        r   admin_live_usa_chatgpt_v91r  -  s   &u-	$UYhjhohohxhxy}h~  IZ  gk  tu  9vx  Zo  x@  xH  xH  IX  xY  x@  q@ [[hv6EtBGGLLYabh  jD  ME  HF  HQ  HQ  R[  Rf  Rf  Rh  ry  HQ  Hz$1  3T  U`  ae  fi  aj  Uk  3k  lz  3z  {  |    		sC   AA D.D)BC%$D)%C30D)2C330D)#D.)D.z/admin/live-usa-audit/fullc            
      (    \        R 4      w  r\        V R \        P                  P	                  V 4      RR ^ R7      pRVP
                  R&   V#   \         d9   p\        RR\        \        T4      4      ,           R,           4      ^3u Rp?# Rp?ii ; i)	Tr  r   r  r`     Full Audit נכשלr  r  N)
r  r	   r   r   r   re  r   r:  rl  r~  )r   r  rg  r  s       r   admin_live_usa_full_v91r  -  s    O&t,yTXgigngngwgwx|g}  HY  fj  st  8uh  Yn  w  wG  wG  HW  wX  w  p  OI.CDcdoptuxpydzDz  |J  EJ  %K  LO  %O  O  Os   AA B-BBBc           	         \        V 4      ;'       g    \        V 4      pV'       g   \        R RRR7      R3#  \        V4      w  r#\	        VR\
        P                  P                  V4      RR^ R7      pRVP                  R	&   \        VP                  R
R4      4      VP                  R&   V#   \         d%   p\        RRR\        T4      R7      R3u Rp?# Rp?ii ; i)r  u1   לא נמצאה תיקיית טיול פעילה.Fr1  rM  Tr  r   r  r`  r  r   r  r  uh   החבילה לא נמסרה מפני שאחת מבדיקות הבנייה או האימות נכשלה.r=  r   N)r  r  r3  rp  r	   r   r   r   re  r   r   r   r~  r  s   &     r   admin_netlify_download_v91r  !-  ss   '-UU1OPT1UH-.FGz  D  E  FI  I  Ii5h?8$RWWEUEUV^E_iz  HM  VW  X  |l  Zb  Zj  Zj  kz  Z{  ]`  ah  al  al  mt  uw  ax  ]y  nv  n~  n~  [  n\  BJ  {J  i$56]  _I  MR  [_  `c  [d  %e  fi  %i  i  is   A3B, ,C7CCCr  zadmin_runtime_status.jsonzadmin_update_submission.jsonr  c                 N    \         P                  P                  \         P                  P                  \         P                  P	                  T ;'       g    R 4      4      4      #   \
         d5    \        T ;'       g    R 4      P                  4       P                  4       u # i ; ir3  )	r   r   normcaserealpathrl  r   r   r   r   r  s   &r   _v92_norm_pathr  A-  so    /ww 0 01L MNN /4::2$$&,,../s   AA% A% %B$>#B$#B$c                     Vf   / MTp \        V RRR7      ;_uu_ 4       p\        P                  ! V4      pR R R 4       \        X\        4      '       d   V# T#   + '       g   i     L*; i  \
         d    Tu # i ; i)Nr   r   r   )r   r   r   r   r   r   )r   r  r  r   r   s   &&   r   _v92_read_jsonr  H-  sj    _r'H$g.."99R=D /!$--t;8; /.  s-   A, AA, A, A)	$A, ,A<;A<c           
         \         P                  ! \         P                  P                  V 4      ;'       g    R RR7       V R,           p\	        VRRR7      ;_uu_ 4       p\
        P                  ! WR^\        R7       VP                  4         \         P                  ! VP                  4       4       R	R	R	4       \         P                  ! W 4       V #   \         d     L-i ; i  + '       g   i     L9; i)
r(  Tr   r   r   r   r   Fr  N)r   r   r   r   r   r   r   r   r  r  r  r   r   r   s   &&  r   _v92_write_json_atomicr  R-  s    KK%,,t<
-C	c3	)	)R		'E!SI

	HHRYY[!	 
* JJsK  		 
*	)s*   /C$$CC!C$ C!!C$$C4	c           
      r   R \         P                  P                  V 4      R\         P                  P                  V 4      RRRRRR/pVR,          '       g   V#  \	        V 4      VR&   \         P                  P                  V 4      VR&   \        P                  ! R\        P                  ! \         P                  P                  V 4      4      4      VR&   \        V 4      P                  R	R
R7      p\        P                  ! RV\        P                  4      p\        P                  ! RV\        P                  4      pV'       d#   VP                  ^4      P!                  4       VR&   V'       d#   VP                  ^4      P!                  4       VR&   V#   \"         d   p\%        T4      TR&    Rp?T# Rp?ii ; i)r   r   r  r   build_idr  r  r   modified_atr   r   r  z1^\s*ADMIN_PANEL_VERSION\s*=\s*["\']([^"\']+)["\']z,^\s*ADMIN_BUILD_ID\s*=\s*["\']([^"\']+)["\']rp  N)r   r   rl  rg  r  r  r   r   r  r   r   r  r  r  	MULTILINEr  r   r   r~  )r   r9  rY  version_matchbuild_matchr  s   &     r   _v92_source_identityr  `-  sd   bggood+Xrww~~d7KYXZ\fhjltvxyF($&t,x!wwt4| $.A4>>RTRYRYRbRbcgRhCi j}Dz##WY#G		"VX\^`^j^jkii OQUWYWcWcd - 3 3A 6 < < >F9!,!2!21!5!;!;!=F: M  $s)wM$s   DF ."F F6F11F6c                 j   \        T ;'       g    R 4      P                  4       p V '       g   R#  V P                  R4      '       d<   \        P                  ! RV 4      pV'       d   \        VP                  ^4      4      # R# \        V P                  R^4      ^,          4      #   \         d     R# i ; i)r   Nr!	  z	\]:(\d+)$re  )	r   r   r*  r  r  r   r  r  r   )r
  r  s   & r   _v92_endpoint_portr  t-  s    8>>r"((*Hs##		,1A&'3qwwqz?1T18??3*1-.. s)   B# B# %B# ?B# !B# #B21B2c                   . p\         P                  R8w  d   V# \        V 4      p \        P                  ! . RORR^
\        4       R7      pVP                  ;'       g    RP                  4        F  pVP                  4       p\        V4      ^8  d   K%  V^ ,          P                  4       R8w  g   RVR,          P                  4       9  d   K_  \        V^,          4      V8w  d   Kx   \        VR	,          4      pT^ 8  g   K  Ya9  g   K  TP                  T4       K  	  V#   \         d     K  i ; i  \         d     T# i ; i)
zHReturn only PIDs whose LOCAL TCP endpoint is exactly the requested port.r   Tr  r   TCPlisten)netstatz-anoz-ptcpr  )r   r   r   rS  r^  rV  ry  r|  r+  r,  r  r   r  r   r  )r  pidswanted_portr  r  r0  pids   &      r   _v92_pids_on_portr  -  s   D	ww$d)K^^<TX\fh  yP  yR  SYY__"002DJJLE5zA~Qx~~5(HE"IOO<M,M!%(+{:%)n Qw3?C  3  K    KsB   CD4 (D":D4 D4 D4 "D1-D4 0D11D4 4EEc                 ,  aa . o\        4       o0 Rmp RVV3R llpV! \        R4       V! \        R4       \        P                  P                  \        4      '       d   V! \        R4       \        P                  P                  \        4      '       d   ^ p\        P                  ! \        4       F  w  r4pV^,          pVR8  d    MuV Uu. uF  qfP                  4       V 9  g   K  VNK  	  upVR&   V F@  pVP                  4       R8X  g   K  V! \        P                  P                  W74      R4       KB  	  K  	  S Uu. uFY  p\        P                  P                  VR	,          4      P                  4       R8X  g   K>  VP                  R
4      '       g   KW  VNK[  	  p	pV	 Uu. uF  qP                  R4      '       d   K  VNK  	  p
pR\        P                  ! R4      RSR\!        V	4      R\!        V
4      R\#        V
4      /# u upi u upi u upi )zGFind exact admin_server.py instances without walking heavy media trees.c                   < V '       g   R # \         P                  P                  V 4      p\        V4      pVS9   d   R # SP	                  V4       RVRVR\         P                  P                  V4      RV\        \        4      8H  RV\        \        4      8H  /pVR,          '       d    VP                  R\        V4      R\         P                  P                  V4      R\        P                  ! R	\        P                  ! \         P                  P                  V4      4      4      /4       SP#                  V4       R #   \         d   p\!        T4      TR
&    R p?L1R p?ii ; i)Nr   roler   active_loaded_filecanonical_install_filer  r  r  r   rp  )r   r   rl  r  rN  rg  r  ADMIN_EXPECTED_INSTALL_PATHr   r  r  r   r   r  r   r   r~  r  )r   r  absoluterK
  r  r  rJ  rW  s   &&    r   rN  ,scan_admin_server_instances_v92.<locals>.add-  s   77??4(h'4<HDbggnnX. $.9J*K"K$dn=X.Y&Y
 >>*k(3 "''//(";!4==1DdnnUWU\U\UeUefnUoFp#q  	T  * $S	W*s   )BD? ?E"
EE"loadedr  pending_updateip  r"  r%  
discoveredr   r   r  r  r   	instancesexact_admin_server_countextra_exact_instanceshas_extra_exact_instances>   rS   exportsr
  node_modulesr  .git)r   )r  r  r  r   r   rg  rN  r  r  r'  r   r   r   r   r   r   r,  ru  )	skip_dirsrN  visitedr  r  r  r/  r   r  exact_instancesextra_instancesrJ  rW  s              @@r   scan_admin_server_instances_v92r  -  s   E5D\I 4 8$#[1	ww~~011&(89	ww}}X!#!2DqLG~"&E$Q'')9*Dqq$EDG::<#44T0,?  "3 #(x%Q277+;+;AfI+F+L+L+NRc+cqhihmhmnvhwqq%Ox"1U/Q?S9Tqq/OUdmm$78U"C$8_!5#T/%:  F yUs*   H(H;HHH'HHc                 *    \        \        4      p \        P                  P                  \        4      p\        P                  P                  \        4      p\        \        4      p/ RRbR\        bR\        bR\        P                  ! 4       bR\        P                  bR\        \        P                  4      bR	\        P                   ! 4       bR
\"        bR\        bR\$        bR\&        bR\        P                  P)                  \        4      bR\        P                  P+                  \        4      bR\,        bR\/        \        4      \/        \,        4      8H  bR\0        bRVbR\3        \0        ;'       d    T;'       d
    \0        V8H  4      R\4        RTR\6        RTRV'       d,   \8        P:                  ! R\8        P<                  ! V4      4      MR RTRV'       d   \        P                  ! 4       V9   MRR\8        P:                  ! R4      /	Cp\3        VR,          ;'       d'    VR,          ;'       d    \?        VR,          4      ^@8H  4      VR&   V '       d   \A        4       VR &   V#   \         d    R p ELji ; i  \         d	    Rp^ p EL9i ; i)!r   r  r  r  r  r  r  r+	  rs  working_directoryr  r  	loaded_atr  loaded_fileloaded_realpathexpected_install_filerunning_from_expected_fileloaded_sha256disk_sha256loaded_matches_diskloaded_size_bytesdisk_size_bytesloaded_mtime_epochdisk_mtime_epochdisk_modified_atr   port_owner_pidspid_owns_admin_portNr  runtime_verifiedadmin_file_scan)!r  r  r   r   r   r   r  r  r  r   ADMIN_BUILD_IDr  r   r   r  rs  ro
  r  ADMIN_RUNTIME_LOADED_ATrU  rl  r  r  r  ADMIN_LOADED_SHA256ru  ADMIN_LOADED_SIZEADMIN_LOADED_MTIMEr   r   r  r,  r  )include_duplicatesdisk_shacurrent_mtimecurrent_size	port_pidsr  s   &     r   get_runtime_identity_v92r$  -  s   01(():;ww'89 "*-I%& 	N 	ryy{	
 	S^^ 	SXX 	RYY[ 	
 	
 	, 	& 	rww'89 	277++,=> 	 !< 	%n5F&G>ZuKv&v  	,!" 	x#$ 	t$7$h$hH$h$hI\`hIhi.<0ManDMM*=t~~m?\]tv9Y		y 8Ddmm$785H8 $(-. 	1 	1*+	1 	1)*b0$H 
 &E&G"#OY  
  s#   I+ AI? +I<;I<?JJc                 l    \        R R7      pWR&    \        \        V4       V#   \         d     T# i ; i)Tr  rb  )r$  r  RUNTIME_STATUS_PATHr   )rb  r   s   & r   _v92_write_runtime_snapshotr(  .  sD    &$?GH2G< N  Ns   $ 33c                     \        RR7      p V P                  R4      '       g	   RRRRRV /# \        4       p\        \        / 4      p\        \
        / 4      p\        VP                  R4      ;'       gN    VP                  R4      ;'       g5    VP                  R	4      ;'       g    V P                  R
4      ;'       g    R4      P                  4       pV'       dB   T\        V P                  R
4      ;'       g    R4      P                  4       8w  d   RRRRRVRV /# RpRp\        VP                  R4      ;'       g    R4      R8X  d   \        P                  R8X  d    \        P                  ! RR.RR^
\        4       R7      pVP                  ;'       g    VP                  ;'       g    RP                  4       pVP                   ^ 8H  ;'       g    \#        V4      pV'       dD   \%        VP                   ^ 8X  d   RMRRV P                  R
4      V P                  R4      VRR7       M\%        RRVVP                   RR7        \+        V4      p	T	P-                  R V	P                  R 4      ;'       g    R!R"V	P                  R"4      R#8X  d   V	P                  R"4      MR$RR%RRR&RR'R(RT;'       g    V P                  R
4      R)V P                  R*4      R+V P                  R4      R,V P                  R-4      RRV /R.VR/VR0\.        P0                  ! R14      /4        \3        \        V	4       V	#   \&         d7   pRp\)        T4      p\%        RR\)        T4      ,           RR7        Rp?EL#Rp?ii ; i  \&         d     T	# i ; i)2aa  Close the update handshake after a verified boot.

This also covers the one-time transition from pre-v92 control code: the old
control process may be replaced while it is still waiting for /ping.json.
A verified v92 process may therefore safely cancel an armed admin Fail Safe
and record its own loaded/disk identity without relying on the old process.
Fr&  r  r  rb  runtime_not_verifiedruntimerY  rV  r  r   expected_sha_mismatchNr   r   r   r   r  Tr  r   r   u   Fail Safe בוטל לאחר שה־Runtime החדש הוכיח התאמה מלאה בין הקוד שנטען לקובץ בדיסק.r  v92_startup_handshake)r  r  r  r  r   u9   ה־Runtime אומת, אך ביטול Fail Safe נכשל.)r  rv  r  u?   שגיאה בביטול Fail Safe לאחר אימות Runtime: )r  control_versionTripServerControl/92last_actionrH  startup_runtime_verificationverifiedverification_okr   z3Runtime identity verified by v92 startup handshake.expected_versionr  expected_build_idr   r  failsafe_cancel_okfailsafe_cancel_msgr   r   )r$  r   r   r  r  ADMIN_UPDATE_SUBMISSION_PATHr   r   r   r   rS  r^  rV  ry  rz  r   r{  r   r   r   r~  r   r   r   r   r  )
r+  rc  r   
submissionr  	cancel_okcancel_outputr  r  r  s
             r   _v92_finalize_verified_startupr<  .  sj    '%@G;;)**eX'=y'RR)+H0"5G <bAJ~& 	 	;;~&	 	;;y!	 	 ;;'	 	  eg  HGKK$@$F$FB G M M OOeX'>PXZcelmmIM
8<< &&B'72rww$	hT 24d\^  oF  oH  IBYY99"))99r@@BM*[[.L].[I+(*(:$ Z")++o">$[[4#02 ,#O#0 "2 ']F
MM6::&78RR<RFJJ}4MQ_4_vzz-0  fDd4H@@GKK$@GKK	2W[[4GKK.Iw'i}dmm$78  2F; M3  	hI IM'9z  ~B  CF  ~G  :G  Pg  h  h	h.  MsI   7L+ L+ +&L+ L+ &AL+ )L+ M/ +M,6+M''M,/M>=M>c                    \        \        / 4      p\        \        / 4      p\        R R7      pT ;'       gN    VP	                  R4      ;'       g5    VP	                  R4      ;'       g    VP	                  R4      ;'       g    RP                  4       P                  4       p\        VP	                  R4      ;'       g    R4      P                  4       p\        VP	                  R4      ;'       g    R4      P                  4       pRp \        P                  P                  \        4      '       d   \        \        4      P                  4       p\        T;'       d    YT8H  ;'       d    Yd8H  ;'       d    Yt8H  4      p\        T;'       dO    \        TP	                  R4      ;'       g    TP	                  R4      ;'       g    R4      P                  4       T8H  4      p	\        T	;'       d0    TP	                  R4      RJ ;'       d    TP	                  R	4      R
8H  4      p
\        T;'       d+    TP	                  R4      ;'       d    TP	                  R4      4      p\        TP	                  R	4      ;'       g    TP	                  R	4      ;'       g    R4      p0 R!mp\        T	;'       d    Y9   4      pT'       d   R
pRpMT'       d   RpRpMT'       d   RpRpMTpRp/ RTbR
TbRTbR	TbRTbRTbRTbRTbRTbRTbRT
bRTbRTbRTbR\        4       bR\         P"                  ! R 4      b#   \         d    Rp ELi ; i)"Fr&  rY  rV  r   r  r  r3  Tr   r2  r  r  r  us   העדכון אומת: הקובץ שנטען לזיכרון, הקובץ בדיסק וה־SHA שהועלה זהים.rb  u   העדכון לא עבר אימות מלא. אין להסתמך על הודעת העלאה בלבד; יש לעיין בפרטי הבקרה.pendinguQ   העדכון נשלח וממתין להחלפה, אתחול ואימות Runtime.u/   לא נבחר SHA של עדכון לבדיקה.r  r   runtime_loaded_sharuntime_disk_shacanonical_disk_sha
hash_matchcontrol_verifiedcontrol_statusr9  r+  r  r  r   >   stop_failedbackup_failedreplace_failedrequest_failedvalidation_faileddisk_verify_failedinstalled_unverified)r  r  r8  r$  r   r   r   r   r   r   rg  r  r  r   ru  r   r   r   )rY  r   r9  r+  r  runtime_loadedruntime_diskcanonical_diskrB  same_updaterC  r2  r   failed_statesrb  public_stater   s   &                r   build_admin_update_status_v92rR  ^.  sZ   0"5G <bAJ&%@G}}N ;}}w{{9?U}}YcYgYghvYw}}{}  E  E  G  M  M  OH_5;;<BBDNw{{=177R8>>@LN77>>566()DEKKMN hyy>#=yy,BZyy_m_yzJxxxCN(C(c(cw{{S\G](c(cac$d$j$j$lpx$xyKKyyGKK8I,Jd,RyyW^WbWbcjWkoyWyzJss7;;/K#LssQXQ\Q\]rQstHG$II
w(?II6JE \M+88%"89F! H	 `	 eChH 	& 		
 	7 	 	n 	L 	n 	j 	, 	' 	j 	7 	57  	dmm$78! +  s   (L- 0L- -L>=L>c                      R p V P                  R\        \        4      4      P                  R\        \	        \
        4      4      4      P                  R\        \	        \        4      4      4      # )uaL  # -*- coding: utf-8 -*-
import os, sys, time, json, shutil, subprocess, socket, threading, traceback, hashlib, re
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from urllib.parse import urlparse
from urllib.request import urlopen
BASE_DIR = __BASE_DIR_REPR__
ADMIN_PORT = __ADMIN_PORT__
CONTROL_PORT = __CONTROL_PORT__
ADMIN_SCRIPT = os.path.join(BASE_DIR, "admin_server.py")
CONTROL_DIR = os.path.join(BASE_DIR, "control_server")
PENDING_ADMIN = os.path.join(CONTROL_DIR, "pending_admin_server.py")
REQUEST_JSON = os.path.join(CONTROL_DIR, "request.json")
STATUS_JSON = os.path.join(CONTROL_DIR, "status.json")
FAILSAFE_STATUS_JSON = os.path.join(BASE_DIR, "admin_failsafe_status.json")
LOG_PATH = os.path.join(CONTROL_DIR, "tripserver_control_server.log")
BACKUP_DIR = os.path.join(BASE_DIR, "backups", "admin_server")
PYTHON_EXE = sys.executable
if os.path.basename(PYTHON_EXE).lower() == "pythonw.exe":
    candidate = os.path.join(os.path.dirname(PYTHON_EXE), "python.exe")
    if os.path.exists(candidate): PYTHON_EXE = candidate
os.makedirs(CONTROL_DIR, exist_ok=True)
os.makedirs(BACKUP_DIR, exist_ok=True)
ACTION_LOCK = threading.RLock()
LAST_START_ATTEMPT = 0.0
START_COOLDOWN_SECONDS = 12.0

def now(): return time.strftime("%Y-%m-%d %H:%M:%S")

def hidden_flags(extra=0):
    flags = int(extra or 0)
    if os.name == "nt": flags |= getattr(subprocess, "CREATE_NO_WINDOW", 0)
    return flags

def log(msg):
    try:
        with open(LOG_PATH, "a", encoding="utf-8") as fh:
            fh.write(now() + " | control-v92 | " + str(msg) + "\n")
    except Exception: pass

def atomic_json(path, data):
    tmp = path + ".tmp"
    with open(tmp, "w", encoding="utf-8") as fh:
        json.dump(data, fh, ensure_ascii=False, indent=2, default=str)
        fh.flush()
        try: os.fsync(fh.fileno())
        except Exception: pass
    os.replace(tmp, path)

def read_json(path):
    try:
        with open(path, "r", encoding="utf-8") as fh:
            data = json.load(fh)
        return data if isinstance(data, dict) else {}
    except Exception: return {}

def write_status(**kw):
    previous = read_json(STATUS_JSON)
    data = {
        "control_version": "TripServerControl/92",
        "updated_at": now(),
        "control_port": CONTROL_PORT,
        "admin_port": ADMIN_PORT,
        "python": PYTHON_EXE,
    }
    for key in ("update_id", "expected_sha", "expected_version", "expected_build_id", "backup"):
        if key in previous: data[key] = previous[key]
    data.update(kw)
    try: atomic_json(STATUS_JSON, data)
    except Exception as exc: log("status write failed " + repr(exc))
    return data

def sha256(path):
    h = hashlib.sha256()
    with open(path, "rb") as fh:
        for chunk in iter(lambda: fh.read(1024 * 1024), b""): h.update(chunk)
    return h.hexdigest()

def source_identity(path):
    result = {"path": os.path.abspath(path), "exists": os.path.isfile(path), "sha256": "", "version": "", "build_id": ""}
    if not result["exists"]: return result
    try:
        result["sha256"] = sha256(path)
        text = open(path, "r", encoding="utf-8", errors="replace").read()
        m = re.search(r'^\s*ADMIN_PANEL_VERSION\s*=\s*["\']([^"\']+)["\']', text, re.MULTILINE)
        b = re.search(r'^\s*ADMIN_BUILD_ID\s*=\s*["\']([^"\']+)["\']', text, re.MULTILINE)
        if m: result["version"] = m.group(1).strip()
        if b: result["build_id"] = b.group(1).strip()
    except Exception as exc: result["error"] = repr(exc)
    return result

def compile_ok(path):
    try:
        src = open(path, "r", encoding="utf-8", errors="replace").read()
        compile(src, path, "exec")
        return True, "OK"
    except Exception as exc: return False, repr(exc)

def port_open(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(0.7)
    try: return sock.connect_ex(("127.0.0.1", int(port))) == 0
    finally:
        try: sock.close()
        except Exception: pass

def endpoint_port(endpoint):
    endpoint = str(endpoint or "").strip()
    if not endpoint: return None
    try:
        if endpoint.startswith("["):
            m = re.search(r"\]:(\d+)$", endpoint)
            return int(m.group(1)) if m else None
        return int(endpoint.rsplit(":", 1)[1])
    except Exception:
        return None

def pids_on_port(port):
    pids = []
    if os.name != "nt": return pids
    wanted_port = int(port)
    try:
        cp = subprocess.run(["netstat", "-ano", "-p", "tcp"], capture_output=True, text=True, timeout=10, creationflags=hidden_flags())
        for line in (cp.stdout or "").splitlines():
            parts = line.split()
            if len(parts) < 5: continue
            if parts[0].upper() != "TCP" or "listen" not in parts[-2].lower(): continue
            if endpoint_port(parts[1]) != wanted_port: continue
            try: pid = int(parts[-1])
            except Exception: continue
            if pid > 0 and pid not in pids: pids.append(pid)
    except Exception as exc: log("pids_on_port failed " + repr(exc))
    return pids

def kill_admin():
    pids = pids_on_port(ADMIN_PORT)
    log("kill_admin pids=" + repr(pids))
    for pid in pids:
        if pid == os.getpid(): continue
        try:
            cp = subprocess.run(["taskkill", "/PID", str(pid), "/F"], capture_output=True, text=True, timeout=15, creationflags=hidden_flags())
            log("taskkill pid=%s rc=%s out=%s" % (pid, cp.returncode, (cp.stdout or cp.stderr or "").strip()[:600]))
        except Exception as exc: log("taskkill failed pid=%s %r" % (pid, exc))
    deadline = time.time() + 12
    while time.time() < deadline:
        if not port_open(ADMIN_PORT): return True
        time.sleep(0.3)
    return not port_open(ADMIN_PORT)

def start_admin():
    global LAST_START_ATTEMPT
    LAST_START_ATTEMPT = time.time()
    flags = 0
    if os.name == "nt":
        flags = getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0) | getattr(subprocess, "CREATE_NO_WINDOW", 0) | getattr(subprocess, "DETACHED_PROCESS", 0)
    out = open(os.path.join(BASE_DIR, "admin_stdout.log"), "a", encoding="utf-8", errors="replace")
    try:
        proc = subprocess.Popen([PYTHON_EXE, ADMIN_SCRIPT], cwd=BASE_DIR, stdout=out, stderr=out, stdin=subprocess.DEVNULL, creationflags=hidden_flags(flags))
    finally:
        out.close()
    log("started admin pid=" + str(proc.pid))
    return proc.pid

def fetch_admin_runtime(timeout=2.5):
    try:
        with urlopen("http://127.0.0.1:%s/ping.json" % ADMIN_PORT, timeout=timeout) as resp:
            if resp.status != 200: return {}
            data = json.loads(resp.read().decode("utf-8", errors="replace"))
            return data if isinstance(data, dict) else {}
    except Exception: return {}

def wait_for_runtime(expected_sha, expected_version="", expected_build_id="", timeout=35):
    deadline = time.time() + timeout
    last = {}
    while time.time() < deadline:
        payload = fetch_admin_runtime()
        if payload:
            last = payload
            runtime = payload.get("runtime") if isinstance(payload.get("runtime"), dict) else payload
            loaded_sha = str(runtime.get("loaded_sha256") or "").lower()
            disk_sha = str(runtime.get("disk_sha256") or "").lower()
            version = str(runtime.get("version") or payload.get("version") or "")
            build_id = str(runtime.get("build_id") or payload.get("build_id") or "")
            path_ok = bool(runtime.get("running_from_expected_file"))
            loaded_disk_ok = bool(runtime.get("loaded_matches_disk"))
            ok = loaded_sha == expected_sha.lower() and disk_sha == expected_sha.lower() and path_ok and loaded_disk_ok
            if expected_version: ok = ok and version == expected_version
            if expected_build_id: ok = ok and build_id == expected_build_id
            if ok: return True, payload
        time.sleep(0.7)
    return False, last

def write_failsafe_status(state, msg, **extra):
    try:
        data = {"state": state, "message": msg, "updated_at": now(), "source": "control_server_v92"}
        data.update(extra)
        atomic_json(FAILSAFE_STATUS_JSON, data)
    except Exception as exc: log("failsafe status write failed " + repr(exc))

def no_pending_shutdown_msg(txt):
    low = (txt or "").lower()
    return "1116" in low or "no shutdown was in progress" in low

def cancel_pending_shutdown(reason="verified_update"):
    if os.name != "nt": return False, "not windows"
    try:
        cp = subprocess.run(["shutdown", "/a"], capture_output=True, text=True, timeout=10, creationflags=hidden_flags())
        msg = (cp.stdout or cp.stderr or "").strip()
        if cp.returncode == 0 or no_pending_shutdown_msg(msg):
            write_failsafe_status("auto_cancelled" if cp.returncode == 0 else "none", "Fail Safe בוטל רק לאחר אימות Runtime מלא.", windows_output=msg, reason=reason)
            return True, msg
        write_failsafe_status("cancel_failed", "אימות Runtime עבר, אך ביטול Fail Safe נכשל.", windows_output=msg, return_code=cp.returncode)
        return False, msg
    except Exception as exc:
        write_failsafe_status("cancel_failed", "שגיאה בביטול Fail Safe: " + repr(exc))
        return False, repr(exc)

def restore_backup(backup, reason):
    if not backup or not os.path.isfile(backup): return False, "backup missing"
    try:
        shutil.copy2(backup, ADMIN_SCRIPT)
        actual = sha256(ADMIN_SCRIPT)
        log("rollback restored reason=%s sha=%s backup=%s" % (reason, actual, backup))
        return True, actual
    except Exception as exc:
        log("rollback failed " + repr(exc))
        return False, repr(exc)

def apply_update(reason="manual", request_data=None):
    req = request_data if isinstance(request_data, dict) else {}
    update_id = str(req.get("update_id") or "")
    expected_sha = str(req.get("expected_sha") or "").lower()
    expected_version = str(req.get("expected_version") or "")
    expected_build_id = str(req.get("expected_build_id") or "")
    write_status(last_action="apply_update", state="validating", ok=False, verification_ok=None, reason=reason, update_id=update_id, expected_sha=expected_sha, expected_version=expected_version, expected_build_id=expected_build_id)
    if not os.path.isfile(PENDING_ADMIN):
        msg = "pending admin not found"
        write_status(last_action="apply_update", state="validation_failed", ok=False, verification_ok=False, error=msg)
        return False, msg
    ok, info = compile_ok(PENDING_ADMIN)
    if not ok:
        write_status(last_action="apply_update", state="validation_failed", ok=False, verification_ok=False, error=info)
        return False, info
    candidate = source_identity(PENDING_ADMIN)
    new_sha = candidate.get("sha256", "").lower()
    if expected_sha and new_sha != expected_sha:
        msg = "pending SHA mismatch expected=%s actual=%s" % (expected_sha, new_sha)
        write_status(last_action="apply_update", state="validation_failed", ok=False, verification_ok=False, error=msg, candidate=candidate)
        return False, msg
    expected_sha = expected_sha or new_sha
    expected_version = expected_version or str(candidate.get("version") or "")
    expected_build_id = expected_build_id or str(candidate.get("build_id") or "")
    stamp = time.strftime("%Y%m%d_%H%M%S")
    backup = os.path.join(BACKUP_DIR, "admin_server_backup_" + stamp + ".py")
    try:
        if os.path.isfile(ADMIN_SCRIPT): shutil.copy2(ADMIN_SCRIPT, backup)
    except Exception as exc:
        msg = "backup failed: " + repr(exc)
        write_status(last_action="apply_update", state="backup_failed", ok=False, verification_ok=False, error=msg, backup=backup)
        return False, msg
    if not kill_admin():
        msg = "admin port did not close"
        write_status(last_action="apply_update", state="stop_failed", ok=False, verification_ok=False, error=msg, backup=backup)
        return False, msg
    try:
        os.replace(PENDING_ADMIN, ADMIN_SCRIPT)
    except Exception as exc:
        msg = "replace failed: " + repr(exc)
        write_status(last_action="apply_update", state="replace_failed", ok=False, verification_ok=False, error=msg, backup=backup)
        return False, msg
    disk_sha = ""
    try: disk_sha = sha256(ADMIN_SCRIPT).lower()
    except Exception as exc: log("disk sha failed " + repr(exc))
    if disk_sha != expected_sha:
        rollback_ok, rollback_info = restore_backup(backup, "disk_sha_mismatch")
        if rollback_ok:
            try: start_admin()
            except Exception as exc: rollback_info += " | restart=" + repr(exc)
        msg = "disk SHA mismatch after replace expected=%s actual=%s" % (expected_sha, disk_sha)
        write_status(last_action="apply_update", state="disk_verify_failed", ok=False, verification_ok=False, error=msg, expected_sha=expected_sha, disk_sha=disk_sha, backup=backup, rollback_performed=rollback_ok, rollback_result=rollback_info)
        return False, msg
    write_status(last_action="apply_update", state="replaced", ok=False, verification_ok=None, expected_sha=expected_sha, expected_version=expected_version, expected_build_id=expected_build_id, disk_sha=disk_sha, backup=backup, candidate=candidate)
    try:
        pid = start_admin()
    except Exception as exc:
        msg = "start failed: " + repr(exc)
        write_status(last_action="apply_update", state="installed_unverified", ok=False, verification_ok=False, error=msg, expected_sha=expected_sha, disk_sha=disk_sha, backup=backup)
        return False, msg
    verified, runtime_payload = wait_for_runtime(expected_sha, expected_version, expected_build_id, timeout=35)
    cancel_ok = False
    cancel_msg = ""
    if verified:
        cancel_ok, cancel_msg = cancel_pending_shutdown("runtime_identity_verified")
    state = "verified" if verified else "installed_unverified"
    message = "verified update" if verified else "new file is on disk, but loaded runtime identity did not match"
    write_status(last_action="apply_update", state=state, ok=verified, verification_ok=verified, message=message, update_id=update_id, expected_sha=expected_sha, expected_version=expected_version, expected_build_id=expected_build_id, disk_sha=disk_sha, backup=backup, started_pid=pid, runtime=runtime_payload, failsafe_cancel_ok=cancel_ok, failsafe_cancel_msg=cancel_msg)
    return verified, message

def restart_admin(reason="manual"):
    expected_sha = sha256(ADMIN_SCRIPT) if os.path.isfile(ADMIN_SCRIPT) else ""
    if not kill_admin():
        write_status(last_action="restart_admin", state="stop_failed", ok=False, verification_ok=False, error="admin port did not close")
        return False, "admin port did not close"
    pid = start_admin()
    verified, runtime_payload = wait_for_runtime(expected_sha, timeout=30)
    write_status(last_action="restart_admin", state="verified" if verified else "installed_unverified", ok=verified, verification_ok=verified, expected_sha=expected_sha, started_pid=pid, runtime=runtime_payload)
    return verified, "restart verified" if verified else "restart was not verified"

def run_locked(func, *args, **kwargs):
    with ACTION_LOCK:
        return func(*args, **kwargs)

def process_request_file():
    if not os.path.isfile(REQUEST_JSON): return
    try: req = read_json(REQUEST_JSON)
    except Exception as exc: log("bad request " + repr(exc)); return
    try: not_before = float(req.get("not_before", 0) or 0)
    except Exception: not_before = 0
    if time.time() < not_before: return
    try: os.remove(REQUEST_JSON)
    except Exception: pass
    action = req.get("action")
    if action == "apply_update": run_locked(apply_update, req.get("reason", "request"), req)
    elif action == "restart_admin": run_locked(restart_admin, req.get("reason", "request"))
    else: write_status(last_action="unknown_request", state="request_failed", ok=False, verification_ok=False, error="unknown action " + repr(action))

def poll_loop():
    while True:
        try:
            process_request_file()
            if not port_open(ADMIN_PORT) and time.time() - LAST_START_ATTEMPT >= START_COOLDOWN_SECONDS:
                with ACTION_LOCK:
                    if not port_open(ADMIN_PORT) and time.time() - LAST_START_ATTEMPT >= START_COOLDOWN_SECONDS:
                        log("admin port closed outside update; starting canonical admin")
                        start_admin()
        except Exception as exc: log("poll error " + repr(exc) + "\n" + traceback.format_exc())
        time.sleep(2)

class Handler(BaseHTTPRequestHandler):
    server_version = "TripServerControl/92"
    def send_body(self, code, body, ctype="application/json; charset=utf-8"):
        if isinstance(body, str): body = body.encode("utf-8")
        self.send_response(code)
        self.send_header("Content-Type", ctype)
        self.send_header("Content-Length", str(len(body)))
        self.send_header("Cache-Control", "no-store")
        self.end_headers()
        self.wfile.write(body)
    def do_GET(self):
        path = urlparse(self.path).path
        if path == "/ping.json":
            payload = fetch_admin_runtime()
            self.send_body(200, json.dumps({"ok": True, "control_version": "TripServerControl/92", "admin_port_open": port_open(ADMIN_PORT), "admin_runtime": payload}, ensure_ascii=False))
            return
        if path == "/status.json":
            data = read_json(STATUS_JSON)
            data.update({"control_version": "TripServerControl/92", "admin_port_open": port_open(ADMIN_PORT), "pids": pids_on_port(ADMIN_PORT), "active_disk_identity": source_identity(ADMIN_SCRIPT), "admin_runtime": fetch_admin_runtime()})
            self.send_body(200, json.dumps(data, ensure_ascii=False, indent=2, default=str))
            return
        if path == "/log":
            try: txt = open(LOG_PATH, "r", encoding="utf-8", errors="replace").read()[-30000:]
            except Exception as exc: txt = repr(exc)
            self.send_body(200, "<pre style='white-space:pre-wrap;direction:ltr'>" + txt.replace("<", "&lt;") + "</pre>", "text/html; charset=utf-8")
            return
        html = """<html><head><meta charset='utf-8'><title>TripServer Control v92</title></head><body style='font-family:Arial;background:#0b1220;color:#eef;direction:rtl;padding:30px'><h1>TripServer Control v92</h1><p>עדכון נחשב מוצלח רק לאחר אימות Runtime מלא.</p><p><a style='color:#93c5fd' href='/status.json'>Status JSON</a> · <a style='color:#93c5fd' href='/log'>Log</a></p></body></html>"""
        self.send_body(200, html, "text/html; charset=utf-8")
    def do_POST(self):
        path = urlparse(self.path).path
        if path == "/restart": ok, msg = run_locked(restart_admin, "http")
        elif path == "/apply-update": ok, msg = run_locked(apply_update, "http", {})
        else:
            self.send_body(404, "not found", "text/plain; charset=utf-8")
            return
        self.send_body(200 if ok else 500, json.dumps({"ok": ok, "message": msg}, ensure_ascii=False))
    def log_message(self, fmt, *args): log("http " + (fmt % args))

if __name__ == "__main__":
    log("starting control server v92 python=" + sys.executable)
    write_status(last_action="control_start", state="ready", ok=True, verification_ok=None)
    threading.Thread(target=poll_loop, daemon=True).start()
    server = ThreadingHTTPServer(("0.0.0.0", CONTROL_PORT), Handler)
    log("listening on port " + str(CONTROL_PORT))
    server.serve_forever()
__BASE_DIR_REPR____ADMIN_PORT____CONTROL_PORT__)r   r~  r  r   r   r  rM  )templates    r   build_control_server_coderX  .  sT    ~H~ W($x.9W%s3z?';<W'S->)?@Br   c            
      
   \         P                  R 8w  d   . # . p \        \        4       F  pV\         P                  ! 4       8X  d   K   \
        P                  ! RR\        V4      R.RR^\        4       R7      p\        RV: RVP                  : RVP                  ;'       g    VP                  ;'       g    R	P                  4       : 24       VP                  ^ 8X  d   V P                  V4       K  K  	  \         P                   ! 4       ^,           p\         P                   ! 4       V8  d)   \#        4       '       d   \         P$                  ! R4       KB  V #   \         d    p\        R
T: RT: 24        Rp?EKT  Rp?ii ; i)r   taskkillz/PIDr  Tr  zcontrol v92 taskkill pid=z rc=z out=r   zcontrol v92 kill failed pid=r   N      ?)r   r   r  rM  r  rS  r^  r   rV  rE  r{  ry  rz  r   r  r   r   rO  rr  )killedr  r  r  r	  s        r   "_v92_kill_control_server_processesr]  0  sQ   	ww$	F ."))+	TVSXt DUY`dnp  AX  AZ  [B!PSUWUbUbegenen  fB  fBrtr{r{  fB  fB  @B  eI  eI  eK  #L  M}}!c" " / yy{QH
))+
 %<%>%>

4M  	T!c"RSS	Ts   	A.E8:EF#E==Fc                    \         P                  ! \        RR7       \        4       p\	        V\
        R4       Rp\         P                  P                  \
        4      '       d!   \        \
        4      P                  RRR7      pW!8g  pV'       dt   \
        R,           p\        V4      P                  VRR	7       \        P                  ! VRR
7       \         P                  ! V\
        4       \        RV : R\
        : 24       \        4       p. p\         P                  R8X  Ed   \         P"                  ! RRR\$        RRRRV R\
         R2R.	RR^\'        4       R7      pVP)                  RVP*                  ,          4       \-        4       pV'       d-   V'       d%   \/        4       p	VP)                  RV	,          4       RpV'       g	   V'       gO   \         P"                  ! RRR\$        .RR^\'        4       R7      p
VP)                  RV
P*                  ,          4       MVP)                  R4       V'       g   \-        4       '       g_   \0        P0                  ! 4       ^,           p\0        P0                  ! 4       V8  d)   \-        4       '       g   \0        P2                  ! R4       KB  \-        4       '       Eg   ^ p\         P                  R8X  d>   \5        \         R^ 4      \5        \         R ^ 4      ,          \5        \         R!^ 4      ,          p\         P6                  ! V\
        .\8        \         P:                  \         P:                  \         P:                  V\         P                  R8g  R"7       \0        P0                  ! 4       ^,           p\0        P0                  ! 4       V8  d)   \-        4       '       g   \0        P2                  ! R4       KB  \-        4       pR#V: R$V: R%R%P=                  V4      : 2p\        R&V,           4       W3#   \>         d3   p\        R'\A        T4      ,           4       R\A        T4      3u R(p?# R(p?ii ; i))zJInstall and, when changed, actually reload the independent control server.Tr   r\  r   r   r   r  r   r   r  z#control v92 script replaced reason=z path=r   r  r  r  r  ONLOGONr  r}  r~  r  r  zcreate_rc=%sz	killed=%sFr  z	run_rc=%szrun_skipped=already_aliveg333333?rQ  rj  rk  rn  ro  ry  rz  r]  rq  zchanged=z alive=r   zcontrol v92 bootstrap zcontrol v92 bootstrap failed N)!r   r   rM  rX  rN  CONTROL_SCRIPT_PATHr   rg  r   r  r  r  r   rE  rH  r   rS  r^  CONTROL_TASK_NAMErV  r  r{  rO  r]  r   rr  rR  rt  r  ru  r   r   r~  )rb  rS  r  rD  r   pywtask_detailsr  alive_before_runr\  r^  r	  rU  rY  r  r  s   &               r   rK  rK  /0  s   / 
K$/(*)6277>>-../0::GT]:^H"%.CI   8sD1JJs/0!U[]p"qr "77d?Y?PRWYbdimnornssv  xK  wL  LM  lN  PT  !U  fj  qu  A  Qh  Qj  kB >?68+;=##K&$89#( . nnj&%AR%Sdhos}  Pg  Pi  j##K#..$@A##$?@133yy{QH))+(1H1J1J

3&((Eww$
,>BWZYsuvEww  {B  CM  Oa  cd  {e  ec#67XZM_M_hrhzhz  DN  DV  DV  fk  @B  @G  @G  KO  @O  Qyy{QH))+(1H1J1J

3')+2E388L;QR6=>{  =S	IJd3i s8   FP +P P A&P 7GP Q'P>8Q>Qr
  c                 (   \         P                  ! \        R R7       RT RTR\        P                  ! R4      R\        P                  ! 4       R,           R\         P
                  ! 4       R	T;'       g    \        R
VRVRVRV/
p\        \        V4       V# )Tr   rd  rb  requested_atr   rb  g      @	admin_pidpending_admin_pathrY  r4  r5  	update_id)	r   r   rM  r   r   r  rN  r  rd  )rd  rb  r  rY  r4  r5  rj  rX  s   &&&&&&& r   rO  rO  c0  s    KKd+&&&9:diikC'RYY[lHH.H,.YC /5Jr   c                    \         P                  ! V P                  R R4      RR7      p\         P                  ! V P                  RR4      ;'       g    RRR7      p\         P                  ! V P                  RR4      ;'       g    RRR7      p\         P                  ! \        P                  ! RVR	VR
VRV/R^R7      RR7      pRV RV RV RV R\        P                  ! V P                  R R4      4       R2# )r  r   Tr3  r  u   לא זוהתהr  u   לא זוההr   source_validationr   rc  Fr   u  <!DOCTYPE html><html lang="he" dir="rtl"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>אימות עדכון אדמין</title><style>
body{margin:0;background:#07111f;color:#fff;font-family:Arial;padding:18px}.wrap{max-width:900px;margin:auto}.card{background:#111c31;border:1px solid #334155;border-radius:24px;padding:20px;margin:14px 0}h1{margin-top:0}.badge{display:inline-block;border-radius:999px;padding:8px 13px;font-weight:900;background:#78350f;color:#fde68a}.ok{background:#14532d;color:#bbf7d0}.bad{background:#7f1d1d;color:#fecaca}code,pre{direction:ltr;text-align:left;overflow-wrap:anywhere}pre{white-space:pre-wrap;background:#020617;border:1px solid #334155;border-radius:16px;padding:14px;max-height:320px;overflow:auto}a{display:inline-flex;background:#2563eb;color:#fff;text-decoration:none;border-radius:12px;padding:11px 14px;margin:5px;font-weight:900}.line{padding:9px 0;border-bottom:1px solid #334155} </style></head><body><div class="wrap"><div class="card"><h1>עדכון האדמין נשלח — ממתינים לאימות</h1><p>הודעה זו אינה נחשבת הצלחת התקנה. הצלחה תוצג רק לאחר שהשרת החדש יעלה ויוכיח שה־SHA שנטען לזיכרון זהה לקובץ שהועלה.</p><div id="badge" class="badge">ממתין להחלפה ולאתחול…</div><div class="line"><b>גרסה צפויה:</b> u/   </div><div class="line"><b>Build צפוי:</b> u2   </div><div class="line"><b>SHA צפוי:</b><code>ue   </code></div><p id="message">הדף בודק מחדש כל שתי שניות.</p><pre id="technical">u   </pre><div><a href="/admin/runtime">מצב Runtime</a><a href="/admin">חזרה לאדמין</a></div></div></div><script>
const expectedSha=u  ;
async function poll(){
 try{
  const response=await fetch('/admin/update-status.json?expected_sha='+encodeURIComponent(expectedSha)+'&_='+Date.now(),{cache:'no-store'});
  const data=await response.json();
  document.getElementById('technical').textContent=JSON.stringify(data,null,2);
  document.getElementById('message').textContent=data.message||'ממתין…';
  const badge=document.getElementById('badge');
  if(data.verified){badge.className='badge ok';badge.textContent='✅ העדכון הותקן ואומת';return;}
  if(data.failed){badge.className='badge bad';badge.textContent='❌ העדכון לא אומת';return;}
  badge.className='badge';badge.textContent='⏳ ממתין לאימות Runtime…';
 }catch(error){document.getElementById('message').textContent='השרת מתאתחל כעת; ממשיכים לנסות…';}
 setTimeout(poll,2000);
}
poll();
</script></body></html>)r   r   r   r   r  )	r  re  rU  rX  r  rY  r4  expected_buildr>  s	   &&&&&    r   _v92_update_tracking_pagern  u0  s'   ??8<<"#=TJLx||Ir'B'W'WFW_cd__X\\*b%A%T%T_\`aNoodjj?[^M	*
 !%
 -23G @P  Q  Q@  AO  @P  PB  CO  BP  Pu  v}  u~ ~::hll8R89: ; r   c                  (   \         P                  P                  R 4      p V '       d   V P                  R8X  d   \	        RRRR7      R3# V P                  ;'       g    RpVP                  4       pVP                  R4      pVP                  R4      pV'       g   V'       g   \	        R	R
RR7      R3# V'       d   \        M\        p\         P                  '       d2   \         P                  VR,           8  d   \	        RRVR R2RR7      R3# \        P                  ! \        RR7       \        P                  ! \        RR7       \        P                  ! R4      p\        P                   P#                  \        RT R\        P$                  ! 4        V'       d   RMR 24      pRpRp	 V P'                  V4       V'       Ed   \        P                   P#                  \        RV R\        P$                  ! 4        24      p	\)        Wy4      w  rpV
'       g   \	        RRRVR7      R3V3 FK  p V'       d@   \        P                   P+                  V4      '       d   \        P,                  ! V4       KI  KK  KM  	   V	'       d@   \        P                   P1                  V	4      '       d   \2        P4                  ! V	RR7       # # # TpM\7        V4      w  rV
'       g   \	        RRRVR7      R3V3 FK  p V'       d@   \        P                   P+                  V4      '       d   \        P,                  ! V4       KI  KK  KM  	   V	'       d@   \        P                   P1                  V	4      '       d   \2        P4                  ! V	RR7       # # # Tp\9        V4      pVP                  R4      '       d   \;        VR,          4      ^@8w  d   \	        RRR\<        P>                  ! VR^R 7      R7      R3V3 FK  p V'       d@   \        P                   P+                  V4      '       d   \        P,                  ! V4       KI  KK  KM  	   V	'       d@   \        P                   P1                  V	4      '       d   \2        P4                  ! V	RR7       # # # \@        R!,           p\2        PB                  ! W4       \E        V4      pVVR,          8w  d   \        P,                  ! V4       \	        R"R#RR$VR,           R%V 2R7      R&3V3 FK  p V'       d@   \        P                   P+                  V4      '       d   \        P,                  ! V4       KI  KK  KM  	   V	'       d@   \        P                   P1                  V	4      '       d   \2        P4                  ! V	RR7       # # # \        PF                  ! V\@        4       \H        PJ                  ! 4       PL                  pR'R(R)VR*\        P                  ! R+4      R,VR-VR,          R.VP                  R/R4      R0VP                  R1R4      R2\@        R3\O        R4      /	p\Q        \R        V4       \U        4       w  ppV'       g   VPW                  R'R4R5R6R7V/4       \Q        \R        V4       \	        R8R9RVR7      R&3V3 FK  p V'       d@   \        P                   P+                  V4      '       d   \        P,                  ! V4       KI  KK  KM  	   V	'       d@   \        P                   P1                  V	4      '       d   \2        P4                  ! V	RR7       # # # \Y        R:4      w  ppV'       g   VPW                  R'R4R5R;R<V/4       \Q        \R        V4       \	        R=R>RVR7      R&3V3 FK  p V'       d@   \        P                   P+                  V4      '       d   \        P,                  ! V4       KI  KK  KM  	   V	'       d@   \        P                   P1                  V	4      '       d   \2        P4                  ! V	RR7       # # # \[        R?R@\@        VR,          VP                  R/R4      VP                  R1R4      VRA7      pVPW                  R'RBRCVRDVR7V/4       \Q        \R        V4       \]        VVVVV4      V3 FK  p V'       d@   \        P                   P+                  V4      '       d   \        P,                  ! V4       KI  KK  KM  	   V	'       d@   \        P                   P1                  V	4      '       d   \2        P4                  ! V	RR7       # # #   \.         d     EK  i ; i  \.         d     # i ; i  \.         d     EKV  i ; i  \.         d     # i ; i  \.         d     EK}  i ; i  \.         d     # i ; i  \.         d     ELi ; i  \.         d     EK  i ; i  \.         d     # i ; i  \.         d     EK@  i ; i  \.         d     # i ; i  \.         d     EK|  i ; i  \.         d     # i ; i  \.         d     EK  i ; i  \.         d     # i ; i  \.         Ed(   p \Q        \R        R'R4R5\_        T4      RE\        P                  ! R+4      /4       M  \.         d     Mi ; i\	        RFRGR\_        T4      R7      R&3u Rp?T3 F]  p T'       d@   \        P                   P+                  T4      '       d   \        P,                  ! T4       KI  KK  KM    \.         d     K[  i ; i	   T	'       d@   \        P                   P1                  T	4      '       d   \2        P4                  ! T	RR7       # # #   \.         d     # i ; iRp?ii ; i  T3 F]  p T'       d@   \        P                   P+                  T4      '       d   \        P,                  ! T4       KI  KK  KM    \.         d     K[  i ; i	   T	'       d@   \        P                   P1                  T	4      '       d   \2        P4                  ! T	RR7       i i i   \.         d     i i ; i; i)Hr  r   r
  r@  Fr1  rD  r&  r  rA  uP   ניתן להעלות קובץ Python או ZIP עדכון אדמין מבוקר.rB  rC  u   המגבלה היא בערך r   r  r
  Tr   r  rD  r  NrE  rF  rL  r=  r  rG  r  u   בדיקת SHA נכשלהuR   לא ניתן היה לחשב זהות חד־משמעית לקובץ שהועלה.r   r   u"   העתקת העדכון נכשלהu?   ה־SHA השתנה בזמן העתקת הקובץ הממתין.z	expected=z
actual=r   r   r`  rj  submitted_atr   r  rY  r4  r  r5  r  r  current_runtimerH  rp  failsafe_not_armedrc  u   Fail Safe לא הופעלu(   העדכון לא נשלח ליישום.zadmin-upload-v92control_server_not_aliver   u   שרת הבקרה לא זמיןuL   הקובץ נשמר כממתין אך לא נשלחה פקודת החלפה.rH  !admin_upload_v92_verified_runtime)rb  r  rY  r4  r5  rj  	requestedr   r   r   rK  u8   העדכון לא אומת ולא דווח כהצלחה.)0r   r  r   r5  r3  r   r  r(  r  r
  r   r   rM  r  r   r   r   r   r  r  r/  rg  r  r   r  rF  r  r#  r  r,  r   r  rN  r  r  r   r	  r
  r  r$  r  r8  r  r   rK  rO  rn  r~  )r  r  rP  rQ  rR  r	  r  r  rS  r3  r.  rU  r   r   r  pending_tmppending_sharj  r9  rW  r  rW  rX  rX  r  s                            r   upload_admin_server_v92rx  0  s
   ==V$D4==B& !9  <J  OT  U  WZ  Z  	ZMM''RM$$&J&E  (FV !9  <N  SX  Y  [^  ^  	^.4*:PE'"8"856>"I !;?\]bcd\eel=mrwxz}}}KKd+KK$t4MM/*Eww||04HqQSQZQZQ\P]hn^dty]z2{|HHJ		(6ww||$8<NugUVWYW`W`WbVc:deH7[\d7o4E 4()OQy  D  NY  Z  \_  _x KDBGGNN400"))D/04  
	BGGMM(33V]]8[_5`3xC -I!=h!GE()PRz  @E  OZ  [  ]`  `n KDBGGNN400"))D/04  
	BGGMM(33V]]8[_5`3xy !I'	2||H%%Xh-?)@B)F$%@  CW  \a  ko  ku  ku  v~  MR  [\  k]  ^  `c  cf KDBGGNN400"))D/04  
	BGGMM(33V]]8[_5`3xq 169Y,!+.(8,,;'$%I  LM  RW  cl  mu  v~  m  l@  @I  JU  IV  aW  X  Z]  ]X KDBGGNN400"))D/04  
	BGGMM(33V]]8[_5`3xc 	

; :;JJL$$	XDMM*=>}HX.Y ;j"!=67>


 	;ZH%F%H"]w(8'CWYcerst"#?L$%@Blqv  AN  O  QT  T2 KDBGGNN400"))D/04  
	BGGMM(33V]]8[_5`3x= (@@R'S$nw(8'C]_hjxyz"#?L$%F  IW  \a  ky  z  |  ( KDBGGNN400"))D/04  
	BGGMM(33V]]8[_5`3x3 $63!(+%\\)R8&ll:r:
 	7KCATVdfpr  A  	B;ZH(3^Ubc KDBGGNN400"))D/04  
	BGGMM(33V]]8[_5`3x    			    			    		i "d"`    			    			    			    		  e	"#?'K[]dfjknfoq}  @D  @M  @M  Na  @b  Bc  d 		 !E  HB  GL  VZ  [^  V_  `  be  e  	eKDBGGNN400"))D/04   
	BGGMM(33V]]8[_5`3x 		e KDBGGNN400"))D/04   
	BGGMM(33V]]8[_5`3x 		s  (A=h ,,dd8d! $d!%d! (h /,d2d2;e$e(eA"h ,,ee8e) $e)%e) <h <e: h 6,f#ff
$f/f
C2h ,f00f0g$g<gAh +,gg7g'?$g'$g'?A4h :,g8'g8h$h3hdd!d/.d/2eeeee&%e&)e76e7:f	h f		h fff-,f-0g ?g ggg$#g$'g54g58hhhhm)3im
i+(m
*i++m
mm ,k kk+*k+1l99$l9l99mm
mm p,n#n#p#n2	.p1n2	2p8p  $p %p =p ppppc                     \        4       p V '       g   \        R RRR7      R3#  \        V 4      w  rV'       g   \        RRRVR7      R3# \        R	4      p\	        V 4      p\
        P                  ! V \        4       \        \        4      pWTP                  R
4      8H  pRRRV'       d   RMRRRRRRRRT RTRVP                  R
4      RTRTR\        P                  ! R4      RV'       d   RMR/p\        \        V4       \        V'       d   RMRVR,          V\        P                  ! VR^R 7      R7      #   \          d%   p\        R!R"R\#        T4      R7      R#3u R$p?# R$p?ii ; i)%r^  r_  Fr1  rM  r`  u   הגיבוי לא שוחזר.r=  rD  ra  r  r0  manual_restorer   restore_stagedrJ  r  r3  rollback_performedTrestored_fromrd  rY  r   copy_verifiedr   r   r   u   הגיבוי הועתק ואומת בדיסק; הוא עדיין לא נחשב Runtime פעיל עד לאתחול ואימות.u5   העתקת הגיבוי לא עברה אימות SHA.u   שחזור גיבוי הוכןu   שחזור גיבוי נכשלr   rb  rc  r   N)rA  r3  r#  r>  r  rF  r  r  r  r   r   r   r  r  r   r  r   r~  )	r  r.  r>  rd  r  
actual_shaverified_copyr  r  s	            r   restore_admin_server_backup_v92r  0  s   %'K !A  DH  MR  S  UX  X  	XJ5kB$%NPoty  DK  L  NQ  Q  Q34QR'4["34 !23
"ll8&<<+%<P%u $[]HLL2
]$--(;<  ]j  Y  pg
 	2F; ]!AXx  {A  BK  {L  Q^  hl  hr  hr  sy  HM  VW  hX  Y  	Y J !EGfkpz~  @C  {D  E  GJ  J  	JJs+   %D5 
BD5 )AD5 5E$ EE$E$z/admin/runtimec                  <   \        R R7      p \        4       pV P                  R/ 4      pV P                  R4      pV'       d   RMRpV'       d   RMRp. pVP                  R. 4       F  pVP                  R	4      '       d   R
M*VP                  R4      '       d   RMVP                  RR4      pTP                  R\        P
                  ! V4       R\        P
                  ! VP                  RR4      4       R\        P
                  ! VP                  R4      ;'       g    RR,          4       R\        P
                  ! \        VP                  RR4      4      4       R2	4       EK  	  VP                  R/ 4      P                  RR4      p	RP                  . RNV NRNV NRN\        P
                  ! V R,          4       NRN\        P
                  ! V R ,          4       NR!NV R",           NR#N\        P
                  ! V R$,          4       NR%N\        P
                  ! V R&,          4       NR'N\        P
                  ! V R(,          4       NR)N\        P
                  ! V R*,          4       NR+N\        P
                  ! V R,,          4       NR-NV R.,          '       d   R/MR0 NR1N\        P
                  ! \        V R2,          4      4       NR3N\        P
                  ! \        V	4      4       NR4NVP                  R5^ 4       NR6NRP                  V4       NR7N4      # )8Tr&  r  r  u   ✅ Runtime מאומתu   ❌ Runtime אינו מאומתr  r
  r  r  ACTIVEr  	CANONICALr  r   r  r  r   z</code></td><td><code>r  r  r}  r  r  rD  r   r  u\  <!DOCTYPE html><html lang="he" dir="rtl"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Runtime Identity</title><style>
body{margin:0;background:#07111f;color:#fff;font-family:Arial;padding:18px}.wrap{max-width:1100px;margin:auto}.hero,.card{background:#111c31;border:1px solid #334155;border-radius:24px;padding:20px;margin:14px 0}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:12px}.mini{background:#0b1220;border:1px solid #334155;border-radius:18px;padding:14px}.label{color:#94a3b8;font-size:13px}.value{font-weight:900;overflow-wrap:anywhere;margin-top:6px}.badge{display:inline-block;padding:8px 13px;border-radius:999px;font-weight:900}.ok{background:#14532d;color:#bbf7d0}.bad{background:#7f1d1d;color:#fecaca}code{direction:ltr;overflow-wrap:anywhere}table{width:100%;border-collapse:collapse}th,td{padding:10px;border-bottom:1px solid #334155;text-align:right;vertical-align:top}a{display:inline-flex;background:#2563eb;color:white;text-decoration:none;padding:11px 14px;border-radius:12px;margin:4px;font-weight:900}@media(max-width:700px){table,tbody,tr,td,th{display:block}thead{display:none}tr{border:1px solid #334155;border-radius:14px;margin:10px 0}}</style></head><body><div class="wrap"><div class="hero"><h1>Runtime Identity — אדמין</h1><span class="badge r  u  </span><p>המסך מפריד בין הקוד שנטען לזיכרון בזמן עליית התהליך לבין הקובץ שנמצא כרגע בדיסק.</p><a href="/admin">חזרה לאדמין</a><a href="/admin/runtime.json" target="_blank">JSON</a><a href="/admin/self-test">בדיקה עצמית</a></div><div class="grid">
<div class="mini"><div class="label">Running Version</div><div class="value">r  z[</div></div>
<div class="mini"><div class="label">Running Build ID</div><div class="value">r  zU</div></div>
<div class="mini"><div class="label">Process ID</div><div class="value">r  zT</div></div>
<div class="mini"><div class="label">Loaded At</div><div class="value">r	  z]</div></div>
<div class="mini"><div class="label">Running File</div><div class="value"><code>r
  ze</code></div></div>
<div class="mini"><div class="label">Expected File</div><div class="value"><code>r  zf</code></div></div>
<div class="mini"><div class="label">Loaded SHA-256</div><div class="value"><code>r  zd</code></div></div>
<div class="mini"><div class="label">Disk SHA-256</div><div class="value"><code>r  z_</code></div></div>
<div class="mini"><div class="label">Loaded = Disk</div><div class="value">r     כן   לאzZ</div></div>
<div class="mini"><div class="label">Port Owner PIDs</div><div class="value">r  z\</div></div>
<div class="mini"><div class="label">Post Update State</div><div class="value">z`</div></div>
<div class="mini"><div class="label">Extra admin_server.py</div><div class="value">r  u   </div></div>
</div><div class="card"><h2>מופעי admin_server.py</h2><table><thead><tr><th>תפקיד</th><th>נתיב</th><th>SHA</th><th>עודכן</th></tr></thead><tbody>z*</tbody></table></div></div></body></html>)r$  rR  r   r  r   r   r   r   )
r+  r   scanr2  r  r  r  r  r   control_states
             r   admin_runtime_v92r  1  s   &$?G*,F;;("-D{{-.H(0$6WE eIDb) HH%9::PTPXPXYqPrPrx|  yA  yA  BH  JL  yMhxu56ohooVZV^V^_efhViFjEk  lB  CK  CR  CR  TX  T\  T\  ]e  Tf  Tl  Tl  jl  nq  Sr  Cs  Bt  tD  EM  ET  ET  UX  Y]  Ya  Ya  bo  pr  Ys  Ut  Eu  Dv  v@  A  	B * JJ/488B\]Ma a R a S\  R]a ]_a `e  _fafNaNVoo^efo^pNqMrasOa PX_fgq_rOsNtauIa JQQVHX	aYH	a
 IQX_`kXlHmGna
oQa RZQ`Q`ahivawQxPyazRa S[RaRabi  kB  cC  SD  REaESa T\SbSbcjkzc{S|R}a~Qa RZQ`Q`ahivawQxPyazLa W^^sVtVtF  {A  LBaBNa OWoo^abij{b|^}N~Ma@Pa QYP_P_`cdq`rPsOtauTa UYT\T\]tuvTwSxayea fh  fm  fm  nr  fs  eta t^a ar   z/admin/runtime.jsonc            	          \        \        P                  ! \        R R7      R^\        R7      4      p RV P
                  R&   RV P
                  R&   V # )Tr&  Fr  r5
  r  r  r`  )r   r   r  r$  r   re  rf  s    r   admin_runtime_json_v92r  21  sT    TZZ(@TX(Yhmvw  BE  F  GH'HH^$(2H_%Or   z/admin/update-status.jsonc            	          \        \        P                  P                  R R4      4      p \	        \
        P                  ! V R^\        R7      4      pRVP                  R&   RVP                  R&   V# )rY  r   Fr  r5
  r  r  r`  )	rR  r   r  r   r   r   r  r   re  )r   rg  s     r   admin_update_status_json_v92r  :1  s\    +GLL,<,<^R,PQGTZZeAWZ[\H'HH^$(2H_%Or   c                      \        R R7      p R\        V P                  R4      4      RRR\        R\        R\
        R	\        R
V /# )Fr&  r  r  r  r  r  r  r  r  r+  )r$  ru  r   r   r  rU  r  r+  s    r   ping_json_v92r  C1  sK    &%@Gd7;;123%&N&
7 r   c                      \        4       p \        R R7      V R&   \        4       V R&   \        V R&   \	        V P                  R4      ;'       d    V R,          P                  R4      4      V R&   V # )Fr&  r+  update_statusr  r  r  )_v91_health_payloadr$  rR  r  ru  r   )r   s    r   r  r  Q1  se    !#G1UKGI<>GO(GJT*YYwy/A/E/EFX/YZGDMNr   c                 Z  a \        V R 7      p\        RR7      pVP                  R/ 4      p\        4       p\	        VP                  R4      ;'       g    . 4      p\        VRR\        VP                  R4      4      RVP                  R	4       R
VP                  R4       24       \        VRR\        VP                  R4      4      RVP                  R4       RVP                  R4       24       \        TRR\        VP                  R4      ;'       d(    \        VP                  R	4      ;'       g    R4      ^@8H  4      RVP                  R4       RVP                  R	4       24       VP                  R4      R<9   p\        VRRVRVP                  R4       RVP                  R4       2RR7       \        VRRVP                  R 4      '       * \        P                  ! VR!\        R"7      R#,          RR7        \        4       o\        SR$R%4       \        ;QJ d    V3R& lR= 4       F  '       d   K   R!M	  RM! V3R& lR= 4       4      p\        VR'R(VR)4       \        VP                  R*/ 4      P                  R+4      ;'       g    R4      p	V	R,8X  dg   VP                  R*/ 4      P                  R-4      R>9   p
\        VR'R.V
\        P                  ! VP                  R*/ 4      R!\        R"7      R#,          4       M\        VR'R/RR04       \!        R1 V 4       4      p\!        R2 V 4       4      p\!        R3 V 4       4      pVP#                  R4V^ 8H  R5VR6VR7VR8\        V4      R9\$        R\&        R:VR;VRV/
4       V#   \         d$   p\        TR'R(R!\        T4      4        Rp?ELJRp?ii ; i)?r~  Tr&  r  r  u   זהות RuntimeuC   הקובץ שנטען לזיכרון תואם לקובץ בדיסקr  zloaded=r  z | disk=r  uI   האדמין רץ מהנתיב הקנוני C:\TripServer\admin_server.pyr  r
  z | expected=r  u   Build ID ו־SHA זמיניםr  r   zbuild=z | sha=r  NuA   התהליך הפעיל מזוהה כבעל פורט האדמיןzpid=r  z | port_pids=r  r  r  u7   לא נמצאו עותקי admin_server.py נוספיםr  Fr  Ni  Nz<tripserver_control_v92>r\  c              3   ,   <"   T F	  qS9   x  K  	  R # 5ir   r  r   r  control_codes   & r   r   r	  j1  s       g  =f5,.  =fr\  r  uB   Control Server v92 כולל אימות Runtime לאחר החלפהz!generated control source compiledrD  r0  rH  r   uL   תוצאת העדכון האחרון כוללת מצב אימות מפורשu+   מנגנון סטטוס עדכון מוכןu/   טרם נרשם apply_update ב־Control Serverc              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5ir@  r`  r	  s   & r   r   r	  t1        Gwt((8*<*Fw   (
(c              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5irD  r`  r	  s   & r   r   r	  u1  r  r  c              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5irF  r`  r	  s   & r   r   r	  v1  r  r  r  rG  r  rb  rj  r  r+  r  )TN)r  r3  rK  r5  r/  >   r2  rE  rF  rG  rI  rJ  rK  )_v91_run_self_test_suiter$  r   rR  r  r
  ru  r,  r   r  r   rX  rN  r	  r   r~  r  r   r   r  )rV  r   r+  r  r   r  owner_ok
markers_okr  r0  	update_okrG  r{  rb  r  s   &             @r   r  r  [1  s   &@XYG&$?G;;("-D*,F7;;y)//R0G"46{  ~B  CJ  CN  CN  Od  Ce  ~f  jq  ry  r}  r}  ~M  rN  qO  OW  X_  Xc  Xc  dq  Xr  Ws  ht  u"4  7D  FJ  KR  KV  KV  Ws  Kt  Fu  y@  AH  AL  AL  MZ  A[  @\  \h  ip  it  it  uL  iM  hN  wO  P"46UW[\c\g\ghr\s  ]f  ]fx{  }D  }H  }H  IX  }Y  }_  }_  ]_  y`  df  yf  Xg  kq  ry  r}  r}  ~H  rI  qJ  JQ  RY  R]  R]  ^m  Rn  Qo  ip  q{{01\AH"46y  |D  HL  MT  MX  MX  Y^  M_  L`  `m  nu  ny  ny  zK  nL  mM  FN  Yb  c"46ouyu}u}  Z  v[  r[  ]a  ]g  ]g  hl  {@  JM  ]N  OT  ]U  `i  jW028&AS  g  =f  gSSS  g  =f  g  g
W&=  @D  FP  Ru  	v fjj!126::=IOORPKn$JJ/488A  FG  G	W&=  @N  PY  [_  [e  [e  fl  fp  fp  qA  CE  fF  UZ  dg  [h  in  [o  	pW&=?lnr  uf  	gGwGGFGwGGFGwGGFNNfk&F&W&N77  N/  WW&=  @D  FK  MQ  RU  MV  	W  	WWs   ;6M< 4'M< <N*N%%N*c                  B   \        4       p \        R R7      pVP                  R/ 4      pVP                  R4      '       d   RMRpRT R\        P                  ! VR,          4       R	\        P                  ! VR
,          4       R\        P                  ! VR,          4       R\        P                  ! VR,          4       R\        P                  ! VR,          4       RVR,          '       d   RMR RVP                  R^ 4       R2pV P                  RVR,           ^4      # )Tr&  r  r  z#14532dz#7f1d1dz<div style="background:u   ;border:1px solid #475569;border-radius:18px;padding:16px;margin:14px 0"><h2 style="margin-top:0">Runtime Identity</h2><p><b>גרסה:</b> r  z<br><b>Build:</b> r  u$   <br><b>קובץ פעיל:</b> <code>r
  z$</code><br><b>Loaded SHA:</b> <code>r  z"</code><br><b>Disk SHA:</b> <code>r  z!</code><br><b>Loaded = Disk:</b> r  r  r  u&    · <b>עותקים נוספים:</b> r  u   </p><a href="/admin/runtime" style="display:inline-block;background:#2563eb;color:white;text-decoration:none;border-radius:12px;padding:10px 14px;font-weight:900">פתח אימות Runtime מלא</a></div>u   <p>כאן רואים בפועל)_v91_render_admin_statusr$  r   r   r   r   )r   r+  r  r,
  runtime_htmls        r   r  r  1  s   #%D&$?G;;("-D{{#566)IC.se  4  @H  @O  @O  PW  Xa  Pb  @c  d  dv  w  wF  wF  GN  OY  GZ  w[  v\  \@  AI  AP  AP  QX  Yf  Qg  Ah  @i  iM  NV  N]  N]  ^e  fu  ^v  Nw  Mx  xZ  [c  [j  [j  kr  s@  kA  [B  ZC  Cd  ov  wL	  oM	  oM	  ek  S	Y	  dZ	  Z	@
  A
E
  A
I
  A
I
  J
a
  b
c
  A
d
  @
e
  e
r  uL<<9<Jk;kmnoor   c            	      B   \        4       p \        R 4      pR\        P                  ! VR,          4       R\        P                  ! VR,          4       R\        P                  ! VR,          4       RVR,          '       d   R	MR
 R2	pV P	                  RVR,           ^4      # )Fz4<div class="note"><b>Runtime Identity</b><br>Build: r  z"<br>Loaded SHA: <span class="ltr">r  z'</span><br>Disk SHA: <span class="ltr">r  z</span><br>Loaded = Disk: r  r  r  uE   <br><a href="/admin/runtime">פתח מסך Runtime המלא</a></div>uI   <div class="note"><b>ארכיטקטורת התאוששות פעילה</b>)_v91_render_admin_healthr$  r   r   r   )r   r+  runtime_notes      r   rS  rS  1  s   #%D&u-GKHOO\cdn\oLpKq  rT  U]  Ud  Ud  el  m|  e}  U~  T  f  go  gv  gv  w~  L  wM  gN  fO  Oi  t{  |Q  tR  tR  jp  X^  i_  _d  gL<<ceq  u@  f@  BC  D  Dr   c                  v   \        4       p \        R 4      pRpV P                  RRV,           ^4      p R\        P                  ! VR,          4       R\        P                  ! VR,          R,          4       R	VR
,          '       d   RMR R2pV P                  RRV,           ^4      p V P                  RR^4      p V # )F:   <a class="btn-link" href="/admin/runtime">🧬 Runtime</a>uG   <a class="btn-link" href="/admin/status">📊 סטטוס קבצים</a>uH   <a class="btn-link" href="/admin/status">📊 סטטוס קבצים</a>
u)   <div class="status-card"><b>🧬 Runtime r  z</b><span>Loaded SHA: r  r  u   … · Loaded=Disk: r  r  r  r`	  <div class="status-strip"><div class="status-strip">
uT   נתמך קובץ Python ישיר, ומגרסה זו גם ZIP עדכון מבוקר.u   נתמך קובץ Python ישיר או ZIP מבוקר. הצלחת עדכון נקבעת רק אחרי אימות Loaded SHA מול Disk SHA.)_v91_admin_viewr$  r   r   r   )r   r+  runtime_linkruntime_cards       r   	admin_v92r  1  s/   D&u-GOL<<a  do  r~  d~  @A  BD@QXYcQdAe@ff|  ~F  ~M  ~M  NU  Ve  Nf  gj  Nk  ~l  }m  mA  LS  Ti  Lj  Lj  BH  pv  Aw  wD  GL<<46TWc6cefgD<<n  q  AB  CDKr   c                  r    \        4       p \        R R7      V R&   \        4       V R&   \        \        V 4       V # )Tr&  runtime_statusadmin_update_status)!_v91_run_quick_usa_audit_originalr$  rR  r  r  )r  s    r   r  r  1  s8    .0F74PF$A$CF !16:Mr   c                    \        V 4      w  rR \        RR7      R\        4       R\        4       /p\        P
                  ! VR\        P                  ^	R7      ;_uu_ 4       pVP                  4        F3  w  rVVP                  V\        P                  ! VR^\        R7      4       K5  	  R	R	R	4       \        P
                  ! VR
4      ;_uu_ 4       pVP                  4       pV'       d   \        RV,           4      hV Uu. uF  qUVP                  4       9  g   K  VNK  	  ppV'       d"   \        RRP                  V4      ,           4      h R	R	R	4       W3#   + '       g   i     L; iu upi   + '       g   i     Y3# ; i)zRUNTIME_STATUS.jsonTr&  zADMIN_UPDATE_STATUS.jsonzADMIN_FILE_SCAN.jsonr  r  Fr  Nr   zv92 audit append CRC failed: zv92 audit evidence missing: ro  ) _v91_build_audit_bundle_originalr$  rR  r  rI  rJ  r  r  r  r   r  r   r  r  r  r   )	r  rP  r  	additionsrU  r   r   r
  r[  s	   &        r   r  r  1  s5   :=IH74P"$A$C ? AI
 
3G4H4HXY	Z	Z^`&__.MDKKdjjuQX[\] / 
[ 
3	'	'2jjl>DEE$-KIDR[[]1J44IK=		'@RRSS  
(  
[	Z L	 
(	' s1    AE/E.>E)E)+E.E&	)E..F 	r  rf  r  zEITAN-USA-GOLD-v93-20260717-01zUSA_GOLD_REFERENCE_v93.jsonzUSA_GOLD_AUDIT_v93.json	TEXT_ONLYc                 :    \        V 4      P                  R RR7      # )r   r   r  )r   r  r  s   &r   	_v93_readr  1  s    :CCr   c                     \         P                  ! R V \         P                  4      pV'       g   / #  \        P                  ! VP                  ^4      4      #   \         d    / u # i ; i)zN<script\b[^>]*\bid=["\']usa2027-release-contract["\'][^>]*>([\s\S]*?)</script>r  r  r  r   rv  r  r   rY  r  s   & r   _v93_contractr  1  sU    
		ceikmkokopA	zz!''!*%% 	   $A A'&A'c                     \         P                  ! R V \         P                  4      pV'       d   VP                  ^ 4      # R# )zB<section\b[^>]*\bdata-key=["\']budget["\'][^>]*>[\s\S]*?</section>r   )r  r  r  r  r  s   & r   _v93_budget_slider  1  s2    
		WY]_a_c_cdA1771:""r   c                 N    \         P                  ! R V \         P                  4      # )z[<section\b[^>]*\bclass=["\'][^"\']*\bslide\b[^"\']*["\'][^>]*\bdata-key=["\']([^"\']+)["\'])r  rq  r  )rY  s   &r   _v93_slide_keysr  1  s,    ::tvz|~  }A  }A  B  Br   c                     \         P                  ! R V \         P                  4      pV'       g   / #  \        P                  ! VP                  ^4      4      #   \         d    / u # i ; i)r~  r  r  s   & r   _v93_inline_manifestr  1  sU    
		hjnprptptuA	zz!''!*%% 	r  c                 h    \        V 4      p\        P                  ! R RV4      P                  4       pV# )\s+r   )r  r  r(  r   )rY  r  s   & r   _v93_normalized_budget_textr  1  s,    d#EFF63&,,.ELr   c                 l   V P                  R R4      pV P                  RR4      pV P                  RR4      pV P                  RR4      p\        V4      p\        V4      pR\        R\        \	        \        \        \        P                  ! RV4      4      4      4      R\        \	        \        \        \        P                  ! RV4      4      4      4      R	\        V4      R
\        V4      RVP                  R4      ;'       g    .  Uu. uFn  p\        VP                  R4      ;'       g    R4      \        VP                  R4      ;'       g    R4      \        VP                  R4      ;'       g    R4      3NKp  	  upRVP                  R4      ;'       g    .  Uu. uFn  p\        VP                  R4      ;'       g    R4      \        VP                  R4      ;'       g    R4      \        VP                  R4      ;'       g    R4      3NKp  	  upR\        P                  ! \        V4      P                  R4      4      P                  4       R\         R\"        /
p\$        P&                  ! VRRRR7      p	R\        P                  ! V	P                  R4      4      P                  4       RV/# u upi u upi )r  r   r  r  r  
release_idtrip_days_phonedata-day=["\'](\d+)["\']trip_days_tvslide_keys_phoneslide_keys_tvmanifest_phoner  r   r  r  manifest_tvbudget_sha256r   offline_schemabudget_modeFTr  r  r   r  )r   r  USA_GOLD_RELEASE_IDr  r  r<  r   r  rq  r  r   r  r  r  r  r  USA_GOLD_OFFLINE_SCHEMAUSA_GOLD_BUDGET_MODEr   r  )
r  
phone_triptv_trip
phone_prestv_presphone_manifesttv_manifestr  objr  s
   &         r   _v93_gold_fingerprintr  2  s   j"-Jll="-G6;Jll0"5G)*5N&w/K)6#c#rzz:UWa/b&c"des3sBJJ7RT[,\#]^_OJ71  sA  sE  sE  FM  sN  sT  sT  RT  sT  U  sTmnCf 3 34c!%%-:M:M26NPSTUTYTYZ_T`TfTfdfPgh  sT  Uozo~o~  @G  pH  pN  pN  LN  pN  O  pNjkQUU6]00b13quuV}7J7J3KSQRQVQVW\Q]QcQcacMde  pN  O(CJ(O(V(VW^(_`jjl1+C 

3UdzZIgnnY%5%5g%>?IIKVUXYY U Os0   !J,)"J,"J,/J,!J1="J1 "J1J1c                 Z  a . o/ pRoV3R llp\         P                  4        FK  w  r4\        P                  P	                  V4      pV! VR,           WT4       V'       g   K>  \        V4      W&   KM  	  \        V4      \        \         4      8X  Ed   VP                  4        UUu/ uF  w  rgV\        V4      bK  	  pppT! R\        ;QJ d*    R VP                  4        4       F  '       d   K   RM	  RM! R VP                  4        4       4      \        P                  ! VRR7      R,          4       T! R	\        ;QJ d*    R
 VP                  4        4       F  '       d   K   RM	  RM! R
 VP                  4        4       4      \        P                  ! VRR7      R,          4       T! R\        ;QJ d*    R VP                  4        4       F  '       d   K   RM	  RM! R VP                  4        4       4      \        P                  ! VRR7      R,          4       VR,          p	VR,          p
VR,          pVR,          pRV	3RV
33 EFT  w  r\        \        \        \        \         P"                  ! RV4      4      4      4      pV! RV 2V\%        \'        ^^%4      4      8H  V4       V! RV 2\        \         P"                  ! RV4      4      ^$8  \        \         P"                  ! RV4      4      4       V! RV 2RV9  4       V! RV 2RV9   4       T! RV 2RV9   ;'       d    RV9   4       T! RV 2RV9   ;'       d"    R V9   ;'       g    VP)                  R!4      ^$8  4       T! R"V 2R#V9   ;'       d     R$V9   ;'       d    R%V9  ;'       d    R&V9  4       EKW  	  \+        V4      p\+        V4      pV! R'\        V4      ^,8H  \        V4      4       V! R(\        V4      ^,8H  \        V4      4       V! R)VV8H  R*VR+V/4       RV3RV33 EFo  w  pp\-        V4      pR,pT! R-V 2\/        V4      ;'       d,    \         P0                  ! VV\         P2                  4      '       * VR.,          4       T! R/V 2R0V9   ;'       d    R1V9   4       T! R2V 2R3V9   ;'       d    R4V9   ;'       d    R5V9   4       T! R6V 2R7V9  ;'       d    R8V9   4       T! R9V 2R:V9   ;'       d    R#V9   4       T! R;V 2R<V9   ;'       d    R$V9   ;'       d    R=V9  4       \5        V4      pVP7                  R>4      ;'       g    . pT! R?V 2\        V4      ^.8H  ;'       d    \9        R@ V 4       4      ^8H  \        V4      4       EKr  	  V! RA\;        V4      \;        V4      8H  4       T! RB\5        V4      P7                  R>4      ;'       g    .  Uu. uF5  pVP7                  RC4      VP7                  RD4      VP7                  RE4      3NK7  	  up\5        V4      P7                  R>4      ;'       g    .  Uu. uF5  pVP7                  RC4      VP7                  RD4      VP7                  RE4      3NK7  	  up8H  4       T! RFRGV	9   ;'       d    RHV
9   4       \=        V4      pRIp\        P                  P	                  \>        4      '       d4   \        P@                  ! \C        \>        4      PE                  RJRK7      4      pV'       d?   V! RLVP7                  RM4      VRN,          8H  ROVP7                  RM4      RPVRN,          /4       MV! RQRRRRSRT7       MRNR RU/ /pS Uu. uF  pVRV,          RW8X  g   K  VNK  	  ppS Uu. uF  pVRV,          RX8X  g   K  VNK  	  ppRYRZR[\H        R\\J        PL                  ! 4       PO                  R]R^7      R_V'       * R`\9        Ra S 4       4      Rb\        V4      Rc\        V4      RdSReVRfRg\P        Rh\R        RiRjRkRl//
pV '       dd    \T        Rm,           p\C        V4      PW                  \        P                  ! VR^\X        Rn7      RJRK7       \        PZ                  ! V\T        4       V# V# u uppi u upi u upi   \F         d    RIp ELi ; iu upi u upi   \F         d     T# i ; i)pr   c                    < SP                  R T R\        V4      RV'       d   RM
VR8X  d   RMRR\        T;'       g    R4      R	V/4       R
# )r   r  r  r
  r  r  r
  r  r   r
  Nr	  rt  s   &&&&r   rN  #run_usa_gold_audit_v93.<locals>.add2  su    vdDb8bFYaenYnvtz  ~F  GJ  KQ  KW  KW  UW  GX  Zd  em  n  	or   u	    קייםu'   Build ID אחיד בכל רכיבי USAc              3   P   "   T F  qP                  R 4      \        8H  x  K  	  R# 5i)	releaseIdN)r   r  r	  s   & r   r   )run_usa_gold_audit_v93.<locals>.<genexpr>$2  s+       ;B  oAij55;MQd;d  oA   $&FTr  r  u/   Offline Registry schema 3 בכל רכיבי USAc              3   x   "   T F0  p\        VP                  R 4      ;'       g    ^ 4      \        8H  x  K2  	  R# 5i)offlineRegistrySchemaN)r   r   r  r	  s   & r   r   r  %2  sI       Cd  Qc  LM3quuMdGeGjGjijCk  pG  DG  Qcs   !::u9   מדיניות תקציב TEXT_ONLY בכל רכיבי USAc              3   P   "   T F  qP                  R 4      \        8H  x  K  	  R# 5i)budgetSlideModeN)r   r  r	  s   & r   r   r  &2  s1       M[  HZ  CDUUSdMei}M}  HZr  r  r  r  r  iPhoneTVr  u$   36 ימי טיול רציפים — u1   כותרת פירוט עלות בכל יום — u   פירוט עלות יוםu7   אין שגיאת ההגהה קובצי המצגת —    קובצי המצגתu   חיפוש חכם קיים — zusa2027-smart-searchu$   מצב הצג/הסתר קיים — zglobal-info-hiddenztoggle-global-infou,   מנוע תקציב דינמי קיים — USA2027Moneyzdata-budget-enginezclass="cost-tableu7   Offline registry יציב ולא תלוי בסדר — usa2027-offline-registry-v93	signaturezcurrentUrls.every(function(u,i)zsavedUrls[i]u   44 שקפים במצגת iPhoneu   44 שקפים במצגת TVu6   סדר ותוכן שקפים לוגי זהה iPhone/TVr_   rj   P   (?:[$₪¥€£]\s*\d|\d[\d,]*(?:\.\d+)?\s*(?:USD|ILS|ש["״]?ח|דולר|ין))u*   שקף תקציב ללא סכומים — :Ni  Nu2   כפתור ראשי מתחיל מההתחלה — zid="startWithMusic"   ▶ התחל מההתחלהu.   כפתור המשך משני ומותנה — id="resumeFromLast"hiddenz startPresentationWithMusic(true)uF   אין שחזור אוטומטי לפני בחירת המשתמש — z1if (pendingRestoreState) applyPresentationRestorepresentationSessionStartedu   Offline Registry schema 3 — OFFLINE_REGISTRY_SCHEMA = 3uL   השוואת אופליין מבוססת חתימה וסט מפתחות — offlineEntryMatcheszsharedUrls.every((url, i)r  u:   Manifest כולל 44 מדיות שקף + 2 אודיו — c              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5i)r  r  Nr`  r  s   & r   r   r  F2  sE       o]zuv  DI  DI  JP  DQ  U\  D\opopzr  u$   שקף התקציב זהה iPhone/TVu"   Manifest לוגי זהה iPhone/TVr   r  r  u:   קישורי מצגת נכונים בקובצי הטיולrC  r	  Nr   r   u$   Regression מול USA GOLD Referencefingerprint_sha256r  r  r
  u"   USA GOLD Reference טרם נוצרuR   ייווצר אוטומטית רק לאחר שכל בדיקות ה-GOLD יעברוr  r  r   r  r
  r  r  zeitan-usa-gold-audit/v93r  r  rl  r  r  rG  c              3   D   "   T F  qR ,          R8X  g   K  ^x  K  	  R# 5ir@  r  r	  s   & r   r   r  ^2  s     @1H+*?QQrB  r  rb  r	  fingerprintpolicyr  offline_registry_schemadefault_startSTART_FROM_BEGINNINGresumeSECONDARY_WHEN_AVAILABLEr   r  )r   rp  ).USA_GOLD_REQUIRED_TARGETSr  r   r   rg  r  r,  r  r	  r  r   r  r  r  r<  r   r  rq  r  r=  r  r  r  ru  r  r  r  r   r  r  r  USA_GOLD_REFERENCE_PATHrv  r   r  r   r  r   r  r
  r  r  USA_GOLD_AUDIT_PATHr  r   r   ) write_reportr  rN  r  r   r   r  r  	contractsr  r  r  r  r`   rr   dayspkeystkeysr  budgetamount_patternr  r  r  r  r  r  rb  r  r  r   r	  s    &                              @r   run_usa_gold_audit_v93r  2  s   FHo1779%F[ &/6(H	 :
 8}5663;>>3CD3CCAQ}Q''3C	D5ss  ;Bnwn~n~  oA  ;Bsss  ;Bnwn~n~  oA  ;B  8B  DH  DN  DN  OX  gl  Dm  ns  Dt  	u=ss  Cd  QZ  Qa  Qa  Qc  Cdsss  Cd  QZ  Qa  Qa  Qc  Cd  @d  fj  fp  fp  qz  IN  fO  PU  fV  	WG  M[  HQ  HX  HX  HZ  M[  M[  HQ  HX  HX  HZ  M[  J[  ]a  ]g  ]g  hq  @E  ]F  GL  ]M  	Nj)
=)67
01%z2T7ODKE#c#rzz2Mt'TUVWD6ug>USTUW[HY@Y[_`CE7KSQSQ[Q[\y{  RA  NB  FH  NH  JM  NP  NX  NX  Yv  x|  N}  J~  I%QSjrvSvw1%9;QUY;YZ6ug>@TX\@\@}@}auy}a}~>ugFZ^H^  Im  Imey  ~B  fB  el  el  GK  GQ  GQ  Re  Gf  jl  Gl  nI%QSquySy  Tc  Tc  J  NR  R  Tc  Tc  Wx  @D  WD  Tc  Tc  IW  _c  Ic  d E  
+(-s5zR/?UL)3u:+;SZHDeunW^_deijoVpq%z2T7ODKE4&t,FpN<UGDd6l  GC  GC[][d[desu{}  ~B  ~B  \C  XC  EK  LQ  ER  SDUGLNcgkNk  OV  OV  qN  RV  qV  W@HJ_cgJg  Kl  Klltx|l|  Kl  Kl  Bd  hl  Bl  mXY^X_`  cV  ^b  cb  cK  cK  gC  GK  gK  L08:W[_:_  ;K  ;K  eC  GK  eK  L^_d^efh}  BF  iF  iJ  iJ  KV  Z^  K^  iJ  iJ  c~  FJ  cJ  K+D1HLL)//RELUGTVYZ_V`dfVf  Wb  Wbkn  o]z  o]  l]  ab  lb  dg  hm  dn  o E 	24OPZ4[_z  |C  `D  5D  	E0h|  ~H  iI  iM  iM  NU  iV  i\  i\  Z\  i\  3^  i\bcAEE&M!%%-PQPUPUV[P\3]  i\  3^  Xl  mt  Xu  Xy  Xy  zA  XB  XH  XH  FH  XH  bJ  XH  RS  de  di  di  jp  dq  rs  rw  rw  x~  r  @A  @E  @E  FK  @L  cM  XH  bJ  3J  	KHJjnxJx  Ko  Ko  ~d  ho  ~o  	p+H5	77>>122!ZZ-D(E(O(OY`(O(ab6	FZ8[_jks_t8t  xC  DM  DQ  DQ  Rf  Dg  hq  r}  ~F  rG  wH  I4d  =Q  \e  fF2.9A1X;&#8aaF9!;6aQx[F%:6H;+(X\\^--y-AZ@@@3x=Vk- 45NOfgv  xN  OW  Xr  sF 	%.CI  FqZ]!^ip qJJs/0 M6MS EL 3^  bJ .$i. :;$  	M	sO   "a-;a3
+;a8>3a= b#b/bb	A b =bbb*)b*c                      \        R R7      p V P                  R4      '       g   RRRR/# V P                  R4      ;'       g    / pVP                  R4      '       g   RRRR	/# R
p\        P                  P	                  \
        4      '       d4   \        P                  ! \        \
        4      P                  RR7      4      pV'       d'   VP                  R4      \        8X  d   RRRRR\
        /# RRR\        R\        P                  ! 4       P                  RR7      RVR,          RVP                  R4      ;'       g    / /p\
        R,           p\        V4      P                  \        P                   ! VR^R7      RR7       \        P"                  ! V\
        4       RR R\
        RVR,          /#   \         d    R
p Li ; i  \         d   pRRR\%        T4      /u R
p?# R
p?ii ; i)Tr  r  createdFrb  audit_failedr  r  fingerprint_missingNr   r   r  already_existsr   r  zeitan-usa-gold-reference/v93approved_atrl  r  r  r   r   r   )r  r   r   r   rg  r  r   rv  r   r  r   r  r   r  r
  r  r  r   r~  )r  r  rG  r   r   r  s         r   _v93_bootstrap_gold_referencer  o2  s   4'T:zz$eH^<<ZZ&,,"vvheH-BCC77>>122 JJt,C'D'N'NX_'N'`a\26IIeH-=fE\]]:<H[\ijrjvjvjx  kC  kC  MV  kC  kW  Xl  mo  px  my  zG  HJ  HN  HN  OU  HV  H\  H\  Z\  ]%.S	TZZeANY`a


3/0$v&=mBxLYY -h-  4%c334sl   (G G G G #*G 3F0 G 	%G /AG >A1G 0G =G ?G  G G'G"G'"G'c                 l   \        W4      pVR9  d   V# \        V 4      pRV9  d   RV9  d
   RV9  d   V# \        V4      pVP                  R4      \        8w  d   \        R4      h\        VP                  R4      ;'       g    ^ 4      \        8w  d   \        R4      hVP                  R	4      \        8w  d   \        R
4      hVR8X  d   \        V4      pV'       g   \        R4      h\        P                  ! RV\        P                  4      '       d   \        R4      h. ROpV Uu. uF  qwV9  g   K  VNK  	  ppV'       d"   \        RRP                  V4      ,           4      hVR 8X  d,   RV9   d   \        R4      hRV9  g   RV9  d   \        R4      hR\        R\        R\        /VR&   V# u upi )r  r  USA2027r  u   ארה״ב 2027r  $usa_gold_release_id_missing_or_wrongr  usa_gold_offline_schema_wrongr  usa_gold_budget_mode_wrongusa_gold_budget_slide_missingr  &usa_gold_budget_slide_contains_amountsr  z'usa_gold_presentation_contract_missing:r   r  usa_gold_typo_kovtzeizOFFLINE_REGISTRY_SCHEMA=3&usa_gold_trip_offline_contract_missingr  r  r  usa_gold>   r  r  )r  r  r  r  )_v92_upd_validate_contentr  r  r   r  r  r   r  r  r  r  r  r  r   )	r   rx  r9  rY  contractr	  r  r  r[  s	   &&       r   r   r   2  s   &t2F55T?D!=T!IN_gkNkT"H||K $77?@@
8<</055A6:QQ899||%&*>>566"""4(<==99hjprtrvrvwwEFF I&8h4-11h8FRYIZZ[[{"d*455)59T\`9`EFF&':=I]^n  pG  HF:M 9s   (F15F1c                    \        V 4      w  r\        V 4      ;'       g    \        V 4      P                  4       R 8X  Ed   \        P
                  ! VR4      ;_uu_ 4       pVP                  4        Uu. uF  qDP                  R4      '       g   K  VNK  	  ppV'       g   \        R4      hVP                  V^ ,          4      P                  RRR7      p\        V4      pV'       d-   \        P                  ! RV\        P                  4      '       d   \        R4      h\        V4      \        P                   ! R	R
\"        4      P%                  4       8w  d   \        R4      hRVP'                  4       9   g   RVP'                  4       9   d   \        R4      h RRR4       \)        T;'       g    / 4      p\*        VR&   \,        VR&   W3# u upi   + '       g   i     L?; i)r(   r   rO    v93_netlify_presentation_missingr   r   ry  u7   (?:[$₪¥€£]\s*\d|\d[\d,]*(?:\.\d+)?\s*(?:USD|ILS)) v93_netlify_budget_not_text_onlyr  r    v93_netlify_budget_not_canonicalr}  r+  v93_netlify_private_referenceNusa_gold_release_idr  )!_v92_build_netlify_deploy_zip_v91r  r   r  rI  rJ  r  r  r  r9  r|  r  r  r  r  r  r(  r  r   r   r   r  r  )rr   rP  r>  rU  rt
  rI  rY  r	  s   &       r   rp  rp  2  so   9$?H"4(==CIOO,=%G__Xs++r%'[[]^]jjA\6]!!]J^"#EFF77:a=)000KD&t,FRYY'acikmkokopp"#EFF*40BFF63He4f4l4l4nn"#EFFtzz|+/?4::</O"#BCC 0P , w}}"%)<%&!5 _ ,+s,   G2GGA<GBGGG	z/admin/usa-gold-audit.jsonc            	          \        R R7      p \        \        P                  ! V R^\        R7      4      pRVP
                  R&   RVP
                  R&   V# )Tr  Fr  r5
  r  r  r`  )r  r   r   r  r   re  )r  rg  s     r   admin_usa_gold_audit_json_v93r(  2  sK    #6FTZZU1VYZ[H'HH^$(2H_%Or   /admin/usa-gold-auditc                     \        R R7      p . pV P                  R4      ;'       g    .  F  pVP                  R4      R8X  d   RMVP                  R4      R8X  d   RMRpTP                  R	T R
\        P                  ! \        VP                  R4      ;'       g    R4      4       R\        P                  ! \        VP                  R4      ;'       g    R4      4       R24       K  	  V P                  R4      '       d   RMRpV P                  R4      '       d   RMRpRV RV R\         RV P                  R4       RV P                  R4       RV P                  R4       RRP                  V4       R2p\        RV4      # ) Tr  r	  r  r
  r
  r  r&
  r
  r  r  r   r   r  r  r  r  PASSFAILrq  rp  u    "><h1>🇺🇸 USA GOLD v93 — z</h1><p>Release: <code>   </code></p><p>עברו: rG      · אזהרות: r      · נכשלו: rb     </p><p><a class="btn" href="/admin/usa-gold-audit.json" target="_blank">JSON מלא</a></p></div><div class="card"><table><thead><tr><th>מצב</th><th>בדיקה</th><th>פרטים</th></tr></thead><tbody>r  zUSA GOLD Audit)	r  r   r  r   r   r   r  r   r:  )r  r  r  r   r  r,
  r  s          r   admin_usa_gold_audit_html_v93r1  2  s"   #6FD

8$****f4utxxPXGY]cGc8inhtfIhooc$((6BRBXBXVX>Y.Z-[[jkskzkz{~  @D  @H  @H  IQ  @R  @X  @X  VX  |Y  lZ  k[  [l  m  	n + jj&&FFEJJt$$&&Cse#CE7Jabuav  wO  PV  PZ  PZ  [c  Pd  Oe  ew  x~  xB  xB  CM  xN  wO  O_  `f  `j  `j  ks  `t  _u  uC  DF  DK  DK  LP  DQ  CR  Rh  iD%t,,r   c                 Z   \        V R 7      p\        RR7      p\        VP                  R4      ;'       g    . 4      pVP                  R4      ;'       g    .  Fb  p\	        TRVP                  R4      \        VP                  R4      4      VP                  R4      VP                  R	4      R
8X  d   R
MRR7       Kd  	   R\        R\        R\        RRR\        \        4      /p\        V\        \        \        R7      p\	        TRRV'       * RP                  V4      ;'       g    \        4        RpR2p	\        V4      p
V	 Uu. uF  p\        V4      NK  	  ppV
'       * ;'       d    \!        V4      p\	        TRRT\"        P$                  ! RT
RV Uu. uF  p\'        V4      NK  	  up/RR7      4        R!pR"p\)        VR#R$7      '       * ;'       d    \)        VR#R$7      p\	        VRR%V\"        P$                  ! R&\)        VR#R$7      R'\)        VR#R$7      /RR7      4       \+        R) V 4       4      p\+        R* V 4       4      p\+        R+ V 4       4      pVP-                  RV^ 8H  R,VR-VR.VR/\'        V4      R\.        R0\0        R1VRV/	4       V#   \         d$   p\	        TRRR\        T4      4        Rp?ELRp?ii ; iu upi u upi   \         d$   p\	        TRR R\        T4      4        Rp?EL>Rp?ii ; i  \         d$   p\	        TRR(R\        T4      4        Rp?ELRp?ii ; i)3r~  Tr  r  r	  zUSA GOLD v93r   r  r  r
  r  rp  r  r  ry  rz  r  z2099.01.01-FUTURE-v999r{  r  u   תאימות קבציםuB   חוזה זהות קבוע מקבל גרסת Moneyapp עתידיתro  u'   בדיקת חוזה זהות עתידיFNzfunction isPrivateHost(){var h=String(location.hostname||'').toLowerCase();return h==='localhost'||h==='127.0.0.1'||h==='::1';}Netlifyu~   וולידציית נתיבים פרטיים מבדילה בין זיהוי hostname לבין קישור מקומי אמיתיharmless_hitsdangerous_hit_countsr  u5   בדיקת רגרסיה לוולידציית hostnamez8media/usa-presentation/images/media-timeline-report.jsonz1media/usa-presentation/images/media-manifest.jsonr  r#  uY   דוח ציר זמן פנימי נשאר בשרת ואינו נכנס ל-ZIP של Netlifytimeline_report_copiedruntime_manifest_copiedu5   בדיקת החרגת דוח ציר זמן פנימיc              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5ir@  r`  r	  s   & r   r   r	  3  r  r  c              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5irD  r`  r	  s   & r   r   r	  3  r  r  c              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5irF  r`  r	  s   & r   r   r	  3  r  r  rG  r  rb  rj  r  usa_gold_audit)z*<a href="http://localhost:8000/USA/">x</a>z"fetch('http://127.0.0.1:8000/api')z@<script src="//work-room.tail978ec2.ts.net/private.js"></script>z'<a href="http://192.168.1.20/app">x</a>z2const localPath="C:\\TripServer\\USA\\index.html";)!_v92_run_self_test_suite_v93_baser  r  r   r
  ru  r  r  r  r  r  r  r   r   r~  rI  r	  r   r  r,  r   r  r   r   r  )rV  r   r  r  r  sample_identitycontract_errorsr  harmless_host_detectiondangerous_private_refsr4  sampledangerous_hitsgate_okr  timeline_relruntime_manifest_relexclusion_okrG  r{  rb  s   &                    r   r  r  2  s   /IabG"5E7;;y)//R0G		(#))r)Wndhhv6FTXXVZ^H\^b^f^fgo^p  IM  IQ  IQ  R\  I]  aj  Ij  |E  pw  	x *~4:>/;<
 ;7;:	
 	W&?  BF  L[  H[  ]a  ]f  ]f  gv  ]w  ]Y  ]Y  {Y  	Z| #d"
 <<STTjkTj&=fETjk##;;N(; MJJ6L^lMm^lYZcRSf^lMmn  ~C  D	
|QR+LBUVV _ _+,@J]^ 	 	gJJ(*El\o*p)+FG[ex+y "#		
 GwGGFGwGGFGwGGFNND1XfZxPVW^_bcj_klu  wJ  KU  Vd  eu  v{  |E  FM  N  ON]  ~W&?Ajlqswx{s|}}~ l Nn |Wi1hjoquvyqz{{|&  |Wi1hjoquvyqz{{|st   ?A1J 1K KK (,K K(K 7K< AK< J>J99J>
K K9K44K9<L*L%%L*c                      \        4       p R pV P                  RRV,           ^4      p RpV P                  RRV,           ^4      # )uF   <a class="btn-link" href="/admin/usa-gold-audit">🇺🇸 USA GOLD</a>r  u;   <a class="btn-link" href="/admin/runtime">🧬 Runtime</a>
u   <div class="status-card"><b>🇺🇸 USA GOLD v93</b><span>Offline Registry יציב · התחלה מההתחלה כברירת מחדל · שקף תקציב ללא סכומים בכל הגרסאות</span></div>r  r  )_v92_admin_view_v93_baser   )r   r  cards      r   	admin_v93rJ  3  sa    #%DSD<<T  WU  X\  W\  ^_  `D aD<<46TW[6[]^__r   zeitan-tripserver-trip-audit/v99trip_audit_exportstrip_audit_reportsztrip_audit_profiles.jsonc                     \        T ;'       g    R 4      P                  4       P                  4       p\        P                  ! RRV4      P                  R4      # )r   z[^A-Z0-9_-]+r  )r   r   r  r  r(  )ri  r.  s   & r   _v99_safe_keyrN  83  sB    
ekkr

 
 
"
(
(
*C66/3,22377r   c            
     V   \        \        / 4      p \        V \        4      '       g   / p . p\	        4        EF  p\        V4      p\        V P                  VP                  R4      4      \        4      '       d!   V P                  VP                  R4      4      M/ pVP                  R4      '       d   \        VP                  R4      4      VR&   . pVP                  R4      ;'       g    .  EF  p\        P                  P                  \        P                  P                  \        T;'       g    R4      4      4      pV'       d   VP                  R4      '       d   Kt  \        P                  P                  \        V4      p\        P                  P                  V4      '       g   K  \        P                  P                  V4      \        P                  P                  VR,          4      8w  g   EK
  VP!                  RVRV/4       EK"  	  WSR&   VP!                  V4       EK  	  V# )a`  Return the current live trip registry.

Discovery deliberately reuses the existing v58 Netlify trip scanner because
it already excludes non-trip applications (Moneyapp, TripForm, USA_TV, etc.)
and requires a live index.html. Optional trip_audit_profiles.json metadata can
add a label or companion roots without making discovery dependent on that file.
rT  r`   companion_rootsr   r(  r  r   )r  TRIP_AUDIT_V99_PROFILE_PATHr   r   r  r   r   r   r   r   rd  r*  r   r  r  rl  r  )	r  r  r  r  r  
companionsri  r   rv  s	            r   _v99_discover_tripsrS  =3  s    8"=Hh%%E*,4j/9(,,swwu~:VX\/]/]x||CGGEN+ce88Gtxx01CL
XX/066B6E77##BGG$4$4S"5E$FGD4??3//77<<$/Dww}}T""rwwt'<PSTZP[@\'\!!64">? 7 ",S - Lr   c                 d   \        T ;'       g    R 4      P                  4       P                  4       p\        4        Fp  pT\        VP	                  R4      ;'       g    R 4      P                  4       \        VP	                  R4      ;'       g    R 4      P                  4       09   g   Kn  Vu # 	  R# )r   rT  rc   N)r   r   r  rS  r   r  s   &  r   _v99_trip_itemrU  [3  s    
djjb/


!
'
'
)C#%3txx,,"-335s488H;M;S;SQS7T7Z7Z7\]]K & r   c                     V R ,          V R,          3.pV P                  R4      ;'       g    .  F$  pVP                  VR,          VR,          34       K&  	  V# )rc   r  rP  r   )r   r  )r  rz
  	companions   &  r   _v99_trip_rootsrX  c3  sV    8nd6l+,EXX/066B6	i'6):;< 7Lr   c                    ^ p^ p^ p\        V 4       EF   w  rE\        P                  P                  V4      '       g   K-  \        P                  ! V4       F  w  rgpV U	u. uF8  qP                  4       \        9  g   K  V	P                  R4      '       d   K6  V	NK:  	  up	VR&   V F  p
\        V
4      '       d   K  \        P                  P                  Wj4      p \        P                  P                  V4      pT^,          pY,,          p\        T
4      \        9   g   K|  T^,          pK  	  K  	  EK#  	  RVRVRV/# u up	i   \         d     K  i ; i)r   r(  r"  r  r  rS   )rX  r   r   r  r'  r   r  r*  r  r   r  r  r6  TRIP_AUDIT_V99_MEDIA_EXT)r  r  bytes_totalrS   r  r  r,  r  ru  r/  r   rv  r  s   &            r   _v99_trip_statsr\  j3  s   EKE"4(ww}}T""$&GGDM G5"&i$Q'');N*NqWXWcWcdgWhqq$iDG&t,,ww||G277??40D 
#D>%==QJE  %2 )" UG['5AA j  s$   D?>D?D?EE	E	c                    . p. pR ^ R^ R^ R^ R^ R^ /p/ p\        V 4       EFe  w  rg\        P                  P                  V4      '       g   K-  ^ p^ p	\        P                  ! V4       EF  w  rpV Uu. uF8  qP                  4       \        9  g   K  VP                  R4      '       d   K6  VNK:  	  upVR&   V EF  p\        P                  P                  W4      p\        V4      '       d   VR;;,          ^,          uu&   KK  \        P                  P                  W4      P                  RR	4      p\        P                  P                  V4      ^,          P                  4       p\        V4      p \        P                  ! V4      pTR	,           T,           pR
TRTRTRTRTRTRTP                   RTP"                  R\%        T4      R\'        T;'       g    TR+9  4      /
pTR,9   d   TP)                  \+        TT4      4       TP-                  T4       TP/                  T^ 4      ^,           TT&   T^,          pT	TP                   ,          p	TR,          '       g   EK  TP-                  TT34       EK  	  EK  	  R
VRVRV	/WV&   EKh  	  \        P                  P                  \0        R4      p\        P                  P3                  V4      '       d   \        P                  ! V4      pR
RRRRRRVRRRR RVP                   RVP"                  R\%        V4      RR/
pVP-                  V4       VP-                  VR34       VR ;;,          ^,          uu&   R\4        R\6        P8                  ! 4       P;                  RR7      RV R,          R V R!,          R"V R#,          R$\<        R%\>        R&VR'V R#,          R(,           R)R*/
pW#VV3# u upi   \         d     EK  i ; i)-rS  r  r  r  r  r  r(  r"  r%  r&  r   r  r  r  r  rx  r  r  r  r  r  r  r%  r  r&  Tr  r  rl  r  r  rT  
trip_labelr`   trip_folderrc   r   admin_build_idrz
  rO  /index.html	discoveryzdynamic-live-folder-registry>   r  r  r  >   r  r  ) rX  r   r   r  r'  r   r  r*  r   r  r  r   r4  r  r  r  r  r  r  ru  r   r  r  r   r  rg  TRIP_AUDIT_V99_SCHEMAr   r  r
  r   r  )r  r  r  r  r|
  
roots_metar  r  r  r  r,  r  ru  r/  r   rv  r  r  rx  r  r
  rz	  r  r
  r  s   &&                       r   _v99_collect_inventoryre  3  s   EHa!Wa!WaIZ\]^FJ*40	ww}}T""

$&GGDM G5"&i$Q'');N*NqWXWcWcdgWhqq$iDGww||G2&t,,,-2-ggood199$Dgg&&t,Q/557 ~B  #o+CI#S!4D "**.t4&-B-m-mdRmFm(n --JJ/d;<S!%zz$2Q6ta
bjj(
)**OOT3K0A  %2F "(w
GZ X
Q 1R h(9:J	ww~~j!!WWZ %G.:F"**&z2
 	U%678v!'hlln..	.BDKd7mtH~,.h-/3F FF**C j  s$   2OO*O2OO	O	c                  a$a%a&a'a(a) ^ RI Ho(Ho' V  Uu/ uF?  qP                  R4      R8w  g   K  \	        VP                  R4      ;'       g    R4      VbKA  	  pp\        4       pV FZ  pVP                  R4      p\        ^\        V4      4       F-  pVP                  RP                  VRV 4      R,           4       K/  	  K\  	  . p. p. p	. p
\        4       pV'V(3R lpV  EF  o&S&P                  R4      R8X  g   S&P                  R4      \        9  d   K6   \        S&R	,          4      P                  R
RR7      p. o$S&P                  R4      pTRB9   d   \#        TS&R,          4      w  o$pRp\$        P&                  ! TT\$        P(                  4       FZ  pS$P                  RS&R,          RTP+                  R^ TP-                  4       4      ^,           RRRTP/                  ^4      RR/4       K\  	  EM@TR8X  d~   \$        P&                  ! RT\$        P(                  4       Uu. uFK  pRS&R,          RTP+                  R^ TP-                  4       4      ^,           RRRTP/                  ^4      RR/NKM  	  upo$MTRC9   d)    \0        P2                  ! T4      pT$T&T)3R lo)S)! T4       MTRD9   d   Rp\$        P&                  ! TT\$        P(                  4       FZ  pS$P                  RS&R,          RTP+                  R^ TP-                  4       4      ^,           RRRTP/                  ^4      RR/4       K\  	  S$ EF  p\	        TP                  R4      ;'       g    R4      o%\4        ;QJ d    T%3R  lRE 4       F  '       g   K   R!M	  RM! T%3R  lRE 4       4      '       d   T	P                  / TCR"R#/C4       K  \7        S%4      pTR$8w  d   T	P                  / TCR"T/C4       K  T! S&R,          S%4      p/ TCR"R$R%T/CpTP                  T4       TT9   ;'       g    TP9                  R4      R,           T9   pT'       gy   S%P;                  R4      '       db   \<        P>                  P                  ! \@        .TP                  R4      O5!  p\<        P>                  PC                  T4      pT'       d   R!TR&&   T'       dD   TP                  T4      pT'       d(   TP                  R'4      RF9   d   TP                  T4       EK  TP                  R4      '       d   T	P                  / TCR"R(/C4       EK  TP                  / TCR)R*/C4       EK  	  TPE                  4       pRG F*  pTT9   g   K  T
P                  RS&R,          RR+R,T/4       K,  	  EK  	  / pV F  pVP                  R4      VP                  R%4      VP                  R4      3pVPG                  V/ VCR-^ R.. /C4      pVR-;;,          ^,          uu&   VP                  R4      VR.,          9  g   K  VR.,          P                  VP                  R4      4       K  	  \I        VPK                  4       R/ R07      p VPM                  4        U!Uu0 uF  w  p!qP                  R'4      RF9   g   K  V!kK!  	  p"p!p\I        V"V,
          4      p#R1\N        R2\P        PR                  ! 4       PU                  R3R47      R5R6\        V4      R7\        V4      R8\        V 4      R9\        V	4      R:\        V
4      R;\        V4      R<\        V#4      /R=VR>VR?V R@V	RAV
R;\I        V4      R<V#/
# u upi   \         d<   pT
P                  RS&P                  R4      RRR\!        T4      /4        Rp?EK  Rp?ii ; iu upi   \         d3   pT
P                  RS&R,          RRR\!        T4      /4        Rp?ELRp?ii ; iu upp!i )HzIAudit local references across every code file in the selected trip roots.r  r   r%  r   r&  Nc                   < S! S! \        T;'       g    R 4      4      P                  ;'       g    R 4      P                  4       P                  RR4      pV'       g   R # VP	                  R4      '       d   VP                  R4      # RV 9   d   V P                  R^4      ^ ,          MR p\        P                  P                  VR,           V,           4      P                  RR4      P                  R4      # )r   r%  r&  r  )	r   r   r   r   r*  r  r  r   rd  )r  r.  rg  r   r  r  s   &&  r   resolve%_v99_reference_audit.<locals>.resolve3  s    SYYB055;;<BBDLLTSVWC  <<$$/2j/@z  a(+bwws
U 23;;D#FMMdSSr   r  r  r   r   r  r  r  r  r  z[\"']([^\"']+\.(?:js|mjs|css|json|webmanifest|manifest|html?|jpg|jpeg|png|webp|gif|svg|avif|mp4|m4v|mov|webm|mp3|m4a|aac|wav|ogg)(?:[?#][^\"']*)?)[\"']rc  r  ru  r  zinline-code-asset-stringr  r  Fr$   zurl\(\s*[\"']?([^\"')]+)r  c                 b  < \        V \        4      '       d"   V P                  4        F  pS! V4       K  	  R# \        V \        4      '       d   V  F  pS! V4       K  	  R# \        V \        4      '       d8   \        V 4      '       d%   SP                  R SR,          RRRRRV RR/4       R# R# R# r  r  )ri  r  r  rz	  r'  s   & r   r'  "_v99_reference_audit.<locals>.walk4  s    !%.."',,.B$r(.#E400"'Bb%#E3//4KE4R4R!((&#f+vt]\hjuw|  X  Z_  *`  a 5S/r   z
json-parser  c              3   ,   <"   T F	  qS9   x  K  	  R # 5ir   r  )r   r  r.  s   & r   r   '_v99_reference_audit.<locals>.<genexpr>4  s     F-EEC<-Er\  Tr
  zdynamic-templater  r  cross_app_dependencyrx  r  rb  r  r  r  r  r  c                     V P                  R 4      ;'       g    RV P                  R4      ;'       g    ^ V P                  R4      ;'       g    R3# )rc  r   r  r  r`  r%  s   &r   r  &_v99_reference_audit.<locals>.<lambda>74  sG    AEE&M<O<ORQRQVQVW]Q^QcQcbcefejejkvewe}e}{};~r   r  r  r  rl  r  r  r  r  r  r  r  referenced_mediaorphan_mediar  r   r!  r"  r#  rN  r%  >   r%   r'  )z${z{{z}}z<%>   r  r  r  r(  )+r  r  r  r   r   r  r+  r=  r,  rN  r   TRIP_AUDIT_V99_CODE_EXTr   r  r   r  r~  r	  r  r  r  r  r)  r  r   rv  r  r  r,  r*  r   r   r  r   r   r:  r  r  r  rc  r   r  r
  )*r  r   r-  r.  r   r0  r  r  r[  r  r/  rq  rh  rY  r  r  r  asset_rxr  r   rO  r
  r  r   physical
target_recr  r  r  r  rT  r5  r  r/  	all_mediarr  r  r.  rz	  r  r  r'  s*   &                                   @@@@@@r   _v99_reference_auditrx  3  s   .38_5aEE&MM^<^)c!%%-%%2&)5F_uH

3q#e*%ALL%),s23 &  JGGJuT 776?//377;3GOf3f	M*+55wy5YD 	ggk"##7c&kJLIq
 rH[[46  &#f+vtzz$PQSTSZSZS\?]`a?acp  sM  OZ  \]  \c  \c  de  \f  hA  CH  "I  J 7F] z|  zE  zE  Fa  cg  ik  im  im  zn  o  zn  uv&#f+vtzz$17797UXY7Y[hjs  vA  CD  CJ  CJ  KL  CM  Oh  jo  p  zn  oI::dzz$'a T
 O# rH[[46  &#f+vtzz$PQSTSZSZS\?]`a?acp  sF  HS  UV  U\  U\  ]^  U_  az  |A  "B  C 7Eeii,223CsF-EFsssF-EFFFH%H5GHI(-H7">%>X>?S[#.FFuFj':vFEe$v%MMs);c)AX)MFcnnS1177<<E6<<3DE148E01#ZZ/
*.."8<W"W$((0yy233O%O5NOPNNBeBX/ABC7 8 jjl]E|!!63v;@XZach"ij ^G N Fwwv
 3SWW[5IJ""3(N3(Nq'2(NO}"776?&/17O""3776?3  FMMO1~N%||~^~tq!vB]1]~I^)&667L'hlln..	.B)3z?!3w<c.1!3w<J$4 5C-
 	j"G#^gZF#34% M `4  	vswwvhX\]`Xabc	 o  d!!63v;hX\]`Xa"bccd^ _sS   \=\=\=#] A^=&^0__^/^^_'__c                   a . oR%V3R llp\         P                  P                  V R,          R4      pV! R\         P                  P                  V R,          4      V R,          4       V! R\         P                  P	                  V4      V4       T! R\        V4      ^ 8  R\        V4      /R& Uu/ uF  qVP                  V^ 4      bK  	  upC4       V! RVR	,          R
,          ^ 8H  VR	,          R4       V! RRRVR	,          R,          RVR	,          R,          /R4       V! RRRVR	,          R,          /R4       Ve$   V! R\        VP                  RR4      4      V4       S U	u. uF%  qR,          '       d   K  V	R,          R 8X  g   K#  V	NK'  	  p
p	S U	u. uF%  qR,          '       d   K  V	R,          R8X  g   K#  V	NK'  	  pp	R\        R\        P                  ! 4       P                  RR7      RV R,          RV R,          RV
'       * RSR V
R!VR	R"\        S4      R#\        R$ S 4       4      R \        V
4      R!\        V4      //	# u upi u up	i u up	i )'rp  c           
      L   < SP                  R V R\        V4      RVRV/4       R# rs  rA  rt  s   &&&&r   rN  _v99_readiness.<locals>.addR4  s%    vtT48Z8U[\]r   r  r-   trip_root_existstrip_entry_index_existslive_inventory_presentr  ry  r  r  r  orphan_media_reportedTrr  rq  rz  r  r  netlify_build_completedr  r
  r  r  rl  r  r  rT  r^  r`   rO	  r	  rb  r  rj  rG  c              3   F   "   T F  qR ,          '       g   K  ^x  K  	  R# 5ir-  r  r	  s   & r   r   !_v99_readiness.<locals>.<genexpr>h4  s     7U6atWW6s   !
!r}  )rS  r  r  r  )r   r   r   r  rg  r,  r   ru  rc  r   r  r
  r  )r  r  r|
  r  r  r  rN  rO  r  r  rb  r  r	  s   &&&&&&      @r   _v99_readinessr  P4  s`   F^GGLLf|4EBGGMM$v,7fF!277>>%#8%@ #e*q.7CJ  3N  iL  KM  iLcdfjjYZ\]N^K^  iL  KM  3N  O%tI7G'HA'MtT]`ijY8WYkmqr{m|  ~P  nQ  (R  T]  ^*D7DOL^<_2`bkl%tGKKd,C'DgNLAwwa1Z=G3KaaFL!P6a4Qz]i5O6HP'hlln..	.BDKd7mV&&HGS[(C7U67U4UW_adekalnxz}  G  {H  I
 
 KM MPs*   /I&I
;I
I
I,I<Ic                 x    \         P                  P                  \        \	        V R ,          4      R,           4      # )rT  z_QUICK_AUDIT_LATEST.json)r   r   r   TRIP_AUDIT_V99_REPORT_DIRrN  r  s   &r   _v99_quick_report_pathr  l4  s'    77<<1=e3MPj3jkkr   c                    \        V 4      pV'       g   \        R 4      hVR,          R8X  d   \        4       # \        VR4      w  r#rE\	        V4      p\        WWEVR4      pVP                  RVRVRV/4       \        \        V4      V4       V# )trip_not_foundrT  r(   FNr  r  r  )	rU  r  r  re  rx  r  r   r  r  )rr   r  r  r  r|
  r  r  r  s   &       r   run_quick_trip_audit_v99r  p4  s    $D)**E{e&((5dEBEf&DDtDF
MM$fmVEVX\]^1$7@Mr   c                 
   . p. p. p\         P                  ! V R 4      ;_uu_ 4       pVP                  4       pV'       d   VP                  RV,           4       VP	                  4        EF8  pVP                  4       '       d   K  VP                  P                  RR4      pVP                  V4       VP                  R4       U	u. uF  qR9  g   K  V	NK  	  p
p	VP                  R4      '       g   RV
9   d   VP                  RV,           4       \        V4      \        9   g   K  VP                  V4      P                  RR4      p\        V4       FK  pTP                  R	V,           R
,           \        VP!                  R4      ;'       g    R4      ,           4       KM  	  EK;  	  \"        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      '       g   VP                  R4       RRR4       \%        V\&        4      '       d   VP!                  R4      MRp\%        V\&        4      '       d{   VP!                  RR4      '       gc   TP)                  R VP!                  R4      ;'       g    .  4       4       TP)                  R VP!                  R4      ;'       g    .  4       4       RV'       * R\+        \-        V4      4      R\+        \-        V4      4      R\/        V4      /# u up	i   + '       g   i     EL; i)r   rK  r%  r&  r   r)  zunsafe_archive_path:r   r   rL  re  r  c              3   \   "   T F"  qR 8H  ;'       g    VP                  R4      x  K$  	  R# 5i)r-   ra  NrR  rN  s   & r   r   4_v99_validate_netlify_zip_generic.<locals>.<genexpr>4  s'     Q5a$AA

=(AA5s   ,,TFrP  Nr  r  c              3   F   "   T F  pR \        V4      ,           x  K  	  R# 5i)zbuilder:Nr  r  s   & r   r   r  4  s     R3Qaj3q6))3Qr	  rZ  c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r  r  s   & r   r   r  4  s     I(H1A(Hr  r  r  >   r   r(  )rI  rJ  r  r  rK  r  r5  r   r+  r*  r6  rs  r9  r|  rI  r   r   r  r   r   r  r  r  r,  )rP  r>  rZ  r  ru  rU  r
  r  r   r/  r0  rY  r^  r  s   &&            r   !_v99_validate_netlify_zip_genericr  ~4  s;   FHE	3	'	'2jjlMM-#-.KKMD{{}}==((s3DLL $

3F1I3EQQEFs##tu}4t;<~!88wwt}++GY?>tDCMM"9D"@3"FSWWU\M]McMcacId"de E " sQ5QsssQ5QQQMM/*# 
($ /9$.G.G\*TJ*d##JNN4,F,FR:>>(3K3Q3Qr3QRRI
z(B(H(Hb(HIIf*hs6{(;ZPST\P]I^`lnqrwnxyy G 
(	'	'sD   BK1K,
K,
A	K1$A%K1
$K1/K1K1K1,K11L	c                 :   \        V 4      pV'       g   \        R 4      hVR,          R8X  d   \        V4      # \        P                  ! \
        RR7       \        P                  ! 4       P                  R4      pV'       d   RMRp\        VR,          4      p\        P                  P                  \
        V RV R	V R
24      p\        VR,          4      w  rx\        Yx;'       g    / 4      p	V	R,          '       g)   \        RRP                  V	R,          4      ,           4      h\        W!4      w  rr\!        V
4      p\#        W*WW4      pV
 Uu. uF  pVP%                  R4      R49   g   K  VNK  	  ppRTRR\&        RVRV
/RR\&        RR5 Uu/ uF  pVVP%                  V^ 4      bK  	  upRV/RVRRVR,          R,          RVR,          /RRVR,          RVR,          RVR,          /RVR R!\        P                  P)                  V4      R"\        P                  P+                  V4      R#VR$V	R%\-        V4      /R&R'\.        R(\0        R\&        //	p\2        P4                  ! TR)\2        P6                  V'       d   ^M^	R*7      ;_uu_ 4       pV F  w  ppVP9                  VVR+7       K  	  VP;                  4        F4  w  ppVP=                  V\>        P@                  ! VR,^\B        R-7      4       K6  	  R.R.R.4       \2        P4                  ! VR/4      ;_uu_ 4       pVPE                  4       pV'       d   \        R0V,           4      h\G        VPI                  4       4      p\G        V4      PK                  V4      '       g   \        R14      hR2V9  dS   \        P                  PM                  \        P                  P                  \N        R24      4      '       d   \        R34      hR.R.R.4       Wo3# u upi u upi   + '       g   i     EL; i  + '       g   i     Yo3# ; i)6r  rT  r(   Tr   r  r  r  r  r  r  r  z trip_netlify_validation_failed:
ru  rZ  rx  r  r  r  r|
  r  r  rS   r  zORPHAN_MEDIA.jsonr  r  rr  r  r!  r   r  r  r  r  r>  r  r  r  r  r  r   r  r  Fr  Nr   r  r  r%  r  >   r  r  r  r~  )(rU  r  r  r   r   TRIP_AUDIT_V99_EXPORT_DIRr   r  r   rN  r   r   r  r  r  re  rx  r  r   rc  r   r  r  r   r  rI  rJ  r  r  r  r  r   r  r   r  r  r  rT  rg  r  )rr   r  r  r  r  r  rP  r  r  netlify_checkr  r  r|
  r  r  r  r   rS   r  r  rU  r  r
  r   r   r
  ru  s   &&                         r   _v99_build_trip_audit_bundler  4  s   $D)**E{e&}55KK)D9LLN##O4E"6	De%Dww||5$qgeWTX7YZH %Ae$M!L5lDYDYWYZM>=YaKbAccdd&<T&Q#EV&DtFDPIN1v2M!MQQEN*?6SZ\ab*?  jE  LF  jEdeAvzzZ[]^O_L_  jE  LF  HO  QV   WgtI~'FQUVdQef!ItI@[]ab}]~  A[  ]a  b|  ]}  $~	z277+;+;L+I<Y[Y`Y`YhYhiuYv  yB  DS  Ua  cp  r~  @P  Q]  @^  _#i1DjR`bj  mB  &C
G 
3G4H4H]jXYpq	r	rvx HCHHS#H& !$]]_MD'KKdjjuQX[\] - 
s
 
3	'	'2jjl6<==BKKM"7|$$U++677E)bggnnRWW\\(Te=f.g.g;<< 
( 5 O LF 
s	r	r
 
(	' s2   O**O*O/A(O4B<PP4P	P	c                 B   VP                  R 4      ;'       g    / pRP                  R VP                  R. 4       4       4      pR\        P                  P	                  V R,          4      ,           pVR,           pRVP                  R4      '       d   R	MR
,           R,           \        V R,          4      ,           R,           \        VP                  R^ 4      4      ,           R,           \        VP                  R^ 4      4      ,           R,           \        VP                  R^ 4      4      ,           R,           \        VP                  R^ 4      4      ,           R,           V,           R,           V,           R,           V,           R,           p\        RV R,          ,           V4      # )r  r   c              3     "   T Fu  pR \        VP                  RR4      4      ,           R,           VP                  R4      '       d   RMR,           R,           \        \        V4      4      ,           R,           x  Kw  	  R# 5ir  r  r	  s   & r   r   #_v99_result_page.<locals>.<genexpr>4  s      )A 	[vr!233kAaeeTXkkU_ghkvv  zE  FW  XY  FZ  z[  	[  ^j  	j  	j)r  r	  /admin/trip-audit/rT  z/quick/reportrp  rO	  rq  r  u   "><h1>Quick Audit — r`   r  rG  r  rj  r  rb  r  r  r  z </table><p><a class="btn" href="u<   ">⬇ הורד דוח מלא</a></p><p><a class="btn" href="u)   ">חזרה ל־Audit Center</a></p></div>u   Quick Audit — )r   r   rK  r
  r6  rl  r   r:  )r  r  r  r  back
report_urlr  s   &&     r   _v99_result_pager  4  sF   

9##A77 Hb) D  &,,"4"4T%["AAD'JFJJw,?,?&VLOggjuvz  |C  wD  kE  E  H[  [  ^a  bc  bg  bg  hp  rs  bt  ^u  u  xD  D  GJ  KL  KP  KP  QX  Z[  K\  G]  ]  `q  q  tw  xy  x}  x}  ~F  HI  xJ  tK  K  Na  a  dg  hi  hm  hm  nx  z{  h|  d}  }  @w  w  z~  ~  Ac  c  fp  p  sq  q  tx  x  {f	  f	D'$w-7>>r   z/admin/trip-auditc                     . p \        4        EF  p\        V4      pVR ,          R8X  d   RMVR ,          R8X  d   RMRpR\        P                  P	                  VR ,          4      ,           pV P                  RV,           R,           \        VR	,          4      ,           R
,           \        VR,          4      ,           R,           \        VR,          4      ,           R,           \        VR,          4      ,           R,           V,           R,           4       EK  	  V '       g   V P                  R4       RRP                  V 4      ,           R,           p\        RV4      # )rT  r(   u   🇺🇸r'   u   🇯🇵u   🧳r  z<div class="card"><h2>r   r`   r  r  u   </code></p><p>קבצים: <b>r  u   </b> · מדיה: <b>rS   z </b></p><p><a class="btn" href="u,   ">פתח מרכז ביקורת</a></p></div>u   <div class="card warn"><h2>לא נמצאו טיולים פעילים</h2><p>טיול יופיע כאן אוטומטית כאשר קיימת תחת C:\TripServer תיקיית טיול עם index.html.</p></div>uG  <div class="card good"><h1>🔍 מרכז ביקורת טיולים</h1><p>בחר טיול פעיל. הרשימה נוצרת מחדש בכל כניסה לפי תיקיות הטיולים שמותקנות כרגע במערכת.</p></div><div style="display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(240px,1fr))">r   uG   </div><p><a class="btn" href="/admin">⬅ חזרה לאדמין</a></p>"   מרכז ביקורת טיולים)
rS  r\  rK  r
  r6  r  rl  r   r   r:  )r  r  statsr   r  r  s         r   admin_trip_audit_registry_v99r  4  s   E#%%!%[E1zd5kU\F\
bh#fll&8&8e&EE-4s:[g=WWZjjmxy}  E  zF  nG  G  Ji  i  lo  pu  v}  p~  l    BY  Y  \_  `e  fm  `n  \o  o  rT  T  W[  [  ^L  L  	M	 &
   j  	k U  XZ  X_  X_  `e  Xf  f  ir  rD94@@r   z/admin/trip-audit/<trip>c                    \        V 4      pV'       g   \        R R4      R3# R\        P                  P	                  VR,          4      ,           pR\        VR,          4      ,           R,           \        VR,          4      ,           R	,           V,           R
,           V,           R,           V,           R,           p\        RVR,          ,           V4      # )   טיול לא נמצא   <div class="card warn"><h1>הטיול אינו זמין</h1><p><a class="btn" href="/admin/trip-audit">חזרה לרשימת הטיולים</a></p></div>rM  r  rT  u,   <div class="card good"><h1>Audit Center — r`   u   </h1><p>כל הפעולות קוראות את קובצי הטיול הפעילים בשרת בזמן אמת. הטיול שנבחר: <code>r  u   </code>.</p><div style="display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(240px,1fr))"><div class="card"><h2>⚡ Quick Audit</h2><p><a class="btn" href="u|   /quick">הרץ בדיקה והפק דוח</a></p></div><div class="card"><h2>🤖 ChatGPT Audit</h2><p><a class="btn" href="uv   /chatgpt">צור חבילה קטנה</a></p></div><div class="card"><h2>📦 Full Archive</h2><p><a class="btn" href="u   /full">צור צילום מלא</a></p></div></div><p><a class="btn" href="/admin/trip-audit">⬅ חזרה לרשימת הטיולים</a></p></div>u   Audit Center — )rU  r:  rK  r
  r6  rl  )rr   r  r   r  s   &   r   admin_trip_audit_center_v99r  4  s   $D1  4O  P  RU  U  	U&,,"4"4T%["AAD9KW<VV  Zf  f  it  uy  z@  uA  iB  B  Eq  q  tx  x  {y  y  |@	  @	  C	{
  {
  ~
B  B  E[  [D(4=8$??r   z/admin/trip-audit/<trip>/quickc           
      n   \        V 4      pV'       g   \        R R4      R3#  \        V\        VR,          4      4      #   \         dk   p\        RR\        \        T4      4      ,           R,           \        P                  P                  TR,          4      ,           R,           4      ^3u Rp?# Rp?ii ; i)	r  :   <div class="card warn">הטיול אינו זמין.</div>rM  rT  r  r  1</code><p><a class="btn" href="/admin/trip-audit/   ">חזרה</a></p></div>N)
rU  r:  r  r  r   rl  r~  rK  r
  r6  )rr   r  r  s   &  r   admin_trip_audit_quick_v99r  4  s    $D13opruuuE&>tE{&KLL E/1ps~  @D  EH  @I  tJ  2J  M@  2@  CI  CO  CO  CU  CU  VZ  [`  Va  Cb  2b  e  2  @  BE  E  	EEs   ? B4
AB/)B4/B4z%/admin/trip-audit/<trip>/quick/reportc           
      `   \        V 4      pV'       g   \        R R4      R3#  VR,          R8X  d=   \        P                  P	                  \
        4      '       g   \        4        \
        pRpM[\        V4      p\        P                  P	                  V4      '       g   \        VR,          4       \        VR,          4      R,           p\        VRVRR^ R	7      pR
VP                  R&   V#   \         d9   p\        RR\        \        T4      4      ,           R,           4      ^3u Rp?# Rp?ii ; i)r  r  rM  rT  r(   r  z_QUICK_AUDIT_REPORT.jsonTr  r   r  r`  r  r  rt  N)rU  r:  r   r   rg  r  r  r  r  rN  r	   re  r   rl  r~  )rr   r  r   r   rg  r  s   &     r   !admin_trip_audit_quick_report_v99r  4  s   $D13opruuuL;%77>>"899'))D0D)$/D77>>$''(e5 e-0JJDTTTftx  CD  E,A) L9;Z]himnqir]s;s  wF  <F  G  IL  L  	LLs$   6C* BC* *D-5-D("D-(D-z /admin/trip-audit/<trip>/chatgptc           
         \        V 4      pV'       g   \        R R4      R3#  \        VR,          R4      w  r#\        VR\        P
                  P                  V4      RR^ R7      pRVP                  R	&   V#   \         dk   p\        R
R\        \        T4      4      ,           R,           \        P                  P                  TR,          4      ,           R,           4      ^3u Rp?# Rp?ii ; i)r  r  rM  rT  FTr  r   r  r`  r  r  r  r  NrU  r:  r  r	   r   r   r   re  r   rl  r~  rK  r
  r6  rr   r  r   r  rg  r  s   &     r   admin_trip_audit_chatgpt_v99r  5  sB   $D13opruuui.tE{EBTRWWEUEUVZE[fw  FJ  TU  V,A) i1  4U  Xc  dh  il  dm  Xn  4n  qd  4d  gm  gs  gs  gy  gy  z~  D  zE  gF  4F  Ic  4c  d  fi  i  	ii   AA7 7C,AC'!C,'C,z/admin/trip-audit/<trip>/fullc           
         \        V 4      pV'       g   \        R R4      R3#  \        VR,          R4      w  r#\        VR\        P
                  P                  V4      RR^ R7      pRVP                  R&   V#   \         dk   p\        R	R
\        \        T4      4      ,           R,           \        P                  P                  TR,          4      ,           R,           4      ^3u Rp?# Rp?ii ; i)r  r  rM  rT  Tr  r   r  r`  r  r  r  r  Nr  r  s   &     r   admin_trip_audit_full_v99r   5  s(   $D13opruuud.tE{DATRWWEUEUVZE[fw  FJ  TU  V,A) d.0OR]^bcf^gRh0h  l_  1_  bh  bn  bn  bt  bt  uy  z  u@  bA  1A  D^  1^  _  ad  d  	ddr  c                      \        4       p V P                  R R^4      p V P                  RR^4      p V P                  RR^4      p V # )zhref="/admin/live-usa-audit"href="/admin/trip-audit"u$   <h2>ביקורת מערכת USA</h2>u+   <h2>מרכז ביקורת טיולים</h2>u   יצירת חבילת מקור אמת חיה: טיולים, מצגות, מדיה, אדמין פעיל ו־Netlify שנבנה דרך המנגנון עצמו.u   בחירת טיול פעיל וביצוע Quick Audit, חבילת ChatGPT או צילום מלא. הרשימה מתעדכנת אוטומטית עם כל טיול חדש.)_v99_admin_view_baser   r   s    r   	admin_v99r  15  s\    !D<<68RTUVD<<>@mopqD<<  w  yd  fg  hDKr   z eitan-tripserver-trip-audit/v100JAPAN_orphan_imagesz japan_orphan_cleanup_latest.jsonc                    \        R4      p V '       g	   RRRRR. /# \        4       pVP                  R4      '       g   RRRRR. R	V/# \        VP                  R
4      ;'       g    ^ 4      ^ 8  d   RRRRR. R	V/# \        VP                  R4      ;'       g    ^ 4      ^ 8:  d   RRRRR. R	V/# \	        V R4      w  p  p\        V4      pV R,          R,           pVP                  R4      ;'       g    .  Uu0 uF@  pVP                  V4      '       g   K  \        V4      \        9   g   K2  V\        V4      R kKB  	  pp\        P                  P                  \        R,          RR4      p\        V\        4      p	 \        \        P                  P                  \        R,          R4      4      P!                  RRR7      p
\%        4       pRp\&        P(                  ! W\&        P*                  4       Fo  p\-        VP/                  ^4      4      pVP1                  4       P                  R4      '       g   KD  VP3                  V\        R4      R P1                  4       4       Kq  	  V	 Uu0 uF  qP1                  4       V9  g   K  VkK  	  pp\5        VP7                  V4      \8        P0                  R7      pRRRRRTR\        V4      R\        V4      R	TR VP                  R!4      ;'       g    / /# u upi   \"         d    Rp
 ELEi ; iu upi )"zyReturn only image files proven unused by both the trip-wide reference audit
and the active Japan presentation inventory.
r'   r  Frb  japan_trip_not_foundrI  r  japan_presentation_missingr  r  %japan_presentation_has_missing_imagesr  (japan_no_active_external_images_detectedrc   r  rr  NrS   rd   rM   r   r   r  r   zG[\"']([^\"']+\.(?:jpg|jpeg|png|webp|bmp|tif|tiff)(?:[?#][^\"']*)?)[\"']r  r  TrO	  trip_orphan_countpresentation_unused_countreference_summaryr  )rU  r  r   r   re  rx  r*  r6  r  r,  r   r   r   r  r  r   r  r   r  r  r  r  r  r  r   rN  r  intersectionr   )r  r  r  r  r  r  r   trip_orphansr  r  r  r$  rt  r
  rg  r  presentation_unusedrI  s                     r   _v100_japan_orphan_candidatesr  A5  s    '"DeX'=|RPP-/E99*++eX'C\SUW^`eff
599./44159eX'NP\^`bikpqq
599-.33!49eX'QS_acelnstt+D%8NE1a&D(^..F HH^,2222D??6" 	'/~9O'O 	S[\2   gg.BJ&z3IJLgg&68OPQ[[elu~[	 UFYHX"$$7"5;;q>2;;=##O44JJuS12399;< 8 +7T,3))+V:S33,T112EFCIIVJd'jS.#S)<%=TXXi066B +  	 Us1   6K0K0*K0;AK5 (L	L	5LLc                    \        4       pR RR\        P                  ! 4       P                  RR7      R\	        T ;'       g    R4      R\        V4      R\        VP                  R4      4      R	VR
. R. R. /	pVP                  R4      '       g   V# \        P                  P                  \        P                  P                  \        R,          RR4      4      p\        P                  ! R4      p\        P                  P                  \        V4      pVP                  R4      ;'       g    .  EFu  p\        P                  P                  \        P                  P                  ! V.VP                  RR4      P!                  R4      O5!  4      p \        P                  P#                  WH.4      V8w  d   \%        RV,           4      h\        P                  P'                  V4      '       g   K  V'       d   VR
,          P)                  V4       K  \        P                  P                  ! V.VP                  RR4      P!                  R4      O5!  p	\+        V	4       \,        P.                  ! W4       VR
,          P)                  V4       VR,          P)                  V	4       EKx  	  \        VP                  R4      4      ;'       d    VR,          '       * VR&   \5        VR
,          4      VR&   VR,          '       d   TMRVR&    \+        \6        4       \9        \6        V4       V#   \0         d2   p
TR,          P)                  RTR\3        T
4      /4        Rp
?
EK1  Rp
?
ii ; i  \0         d     T# i ; i)r  zeitan-japan-orphan-cleanup/v100r  rl  r  rb  r  dry_runr  r4  rj  rC   rZ  r'   rS   rd   r  rI  r%  r&  zunsafe_orphan_path:r  rp  Nremoved_countr   r  )r  r   r  r
  r   ru  r   r   r   rl  r   r  r   r   JAPAN_ORPHAN_BACKUP_ROOT_V100r   r+  r
  r  rg  r  r  rF  r
  r   r~  r,  JAPAN_ORPHAN_RECEIPT_V100r  )rb  r  r4  r9  r  r  r  r  r  rD   r  s   &&         r    cleanup_japan_orphan_images_v100r  s5  s   ,.H3hlln..	.B#f(()4=d8<<%&H22"
F <<gg.>!RSJMM/*E'',,<eDK||L)//R/j!]3;;tS;Q;W;WX[;\!]^	Gww!!:"67:E !6!<==77>>&))y!((-WW\\+RD#0F0L0LS0QRFf%KK'9$$S)9$$V, 0$ T*+DDF84D0DF4L!&"34F?+1)+<+<K"F=348&A M  	G8##VS'49$EFF	G  Ms>   AL'.L'6L'BL'M& 'M#2%MM#&M54M5r  c           
         V R 8w  d   \        V 4      # \        P                  P                  R4      pV'       d   VP                  R8X  d   \        RRRR7      R3# \        VP                  4      R!9  d   \        RR	RR7      R3# \        W4      pV'       g   \        R
RRR7      R3# Vw  r4\        R4      pRVR,           RVR,          R RVR,           2pVP                  R4      '       d   VRVR,           2,          pVR\        P                  ! VR^\        R7      ,           ,          p\        VP                  R4      4      p\        RRV RVP                  R^ 4       R2WvR7      V'       d   ^3# R 3# )"rL   r  r   r
  r  Fr1  rD  rA  r  r  r  rM  japan_experience_uploadr  r   r  r  r   r  r  rD   r  -   

ניקוי תמונות לא בשימוש:
r  r  r  r  u4   . הוסרו מתיקיית המדיה הפעילה r  uC    תמונות שאינן בשימוש ונשמר להן גיבוי.r=  r   rN  )_v100_upload_presentation_baser   r  r   r5  r3  r6  r  r  r   r  r   ru  )rg   r  rX  r5  r9  cleanupr>  r  s   &       r   upload_presentation_v100r  5  s   ---.>??==V$D4==B& !9;x  ~C  D  FI  I  	I&77 !9  <C  HM  N  PS  S  	S#$4;E !@  CO  TY  Z  \_  _  	_H./HIG&.)8JJ]^dem^n]opGzz(/x0@/ABBADJJwejst  B  EC  C  CG	gkk$	 B;?fgofp  qe  fm  fq  fq  rA  CD  fE  eF  FI  >J  OQ  c  mo  fi  y  y  ux  y  yr   r  c           
         T ;'       g    R P                  4       pVR8w  d   \        V 4      # \        P                  P	                  R4      pV'       d   VP
                  R 8X  d   \        RRRR7      R3# VP
                  ;'       g    R P                  4       P                  R4      '       g   \        R	R
RR7      R3# \        P                  '       d:   \        P                  \        R',           8  d   \        RR\        R R2RR7      R3#  \        RV4      w  r4p\        R4      pRV'       d   RP                  VR,          4      MR,           pV'       d'   VRRP                  VR,          4      ,           ,          pV'       d'   VRRP                  VR,          4      ,           ,          pVR\        P                  ! VR^\         R7      ,           ,          p\#        VP	                  R4      4      p\        RR\%        V4       RVP	                  R^ 4       R2WR 7      V'       d   ^3# R!3#   \&        P(                   d    \        R"R#RR7      R3u # \*         d%   p	\        R$R%R\-        T	4      R 7      R!3u R&p	?	# R&p	?	ii ; i)(r   r'   r  r
  r  Fr1  rD  r  rA  r	  rC  r
  r   r  r
  japan_package_uploadr  ru  r  r  r  r  r  r  r  r  u   ZIP של JAPAN נטעןr  u.    קבצים בתיקיית JAPAN והוסרו r  D    תמונות שאינן בשימוש מהתיקייה הפעילה.r=  r   r  r  r  r  Nr  )r  _v100_upload_trip_package_baser   r  r   r5  r3  r   r  r
  r  r  r  r   r   r  r   ru  r,  rI  r)  r   r~  )
rr   r  r  rS  r  r  r  r>  r  r  s
   &         r   upload_trip_package_v100r  5  s   

!!#H7-d33==V$D4==B& !9;x  ~C  D  FI  I  	IMMR&&(11&99 !9;z  @E  F  HK  K  	K'"8"8;UXc;c"c !;?`a{|}`~  F  >G  LQ  R  TW  W  	Wf)>w)M&;23IJ!(TYYx~%>PmnDtyyQ\]aQbGcccG*TYYwt}-EEEGE

SZinwx  CF  IG  G  	G'++d#$ !:k#h-  YG  HO  HS  HS  Tc  ef  Hg  Gh  hl  =m  rt  F  PR  IL  \  	\  X[  \  	\ ` !4  7P  UZ  [  ]`  `  	` f !E  HC  HM  W[  \_  W`  a  cf  f  	ffs>   A
H. -H. B#H. +H. .%JJJI>8J>Jr  c            
         \         P                  P                  R 4      p V '       d   V P                  R8X  d   \	        RRRR7      R3# V P                  ;'       g    RP                  4       P                  R4      '       g   \	        RR	RR7      R3# \         P                  '       d:   \         P                  \        R&,           8  d   \	        R
R\        R R2RR7      R3#  \        V 4      w  rp\        R4      pRV'       d   RP                  VR,          4      MR,           pV'       d'   VRRP                  VR,          4      ,           ,          pV'       d'   VRRP                  VR,          4      ,           ,          pVR\        P                  ! VR^\        R7      ,           ,          p\        VP                  R4      4      p\	        RR\!        V4       RVP                  R^ 4       R2WeR7      V'       d   ^3# R 3#   \"        P$                   d    \	        R!R"RR7      R3u # \&         d%   p\	        R#R$R\)        T4      R7      R 3u R%p?# R%p?ii ; i)'r  r   r
  r  Fr1  rD  r  rA  r  rC  r  r   r  r
  japan_images_zip_uploadr  ru  r  r  r  r  r  r  r  r  r  r  u+    תמונות ולאחר מכן הוסרו r  r  r=  r   r  r  r  r  Nr  )r   r  r   r5  r3  r   r  r
  r  r  r  r   r   r  r   ru  r,  rI  r)  r   r~  )r  rS  r  r  r  r>  r  r  s           r   upload_japan_images_zip_v100r  5  s   ==V$D4==B& !9;x  ~C  D  FI  I  	IMMR&&(11&99 !9;w  }B  C  EH  H  	H'"8"8;UXc;c"c !;?l  nH  IJ  mK  KR  >S  X]  ^  `c  c  	ch)>t)D&;23LM!(TYYx~%>PopDtyyQ\]aQbGcccG*TYYwt}-EEEGE

SZinwx  CF  IG  G  	G'++d#$ !C{SVW_S`Ra  bM  NU  NY  NY  Zi  kl  Nm  Mn  nr  Fs  xz  L  VX  OR  b  	b  ^a  b  	b ` !4  7P  UZ  [  ]`  `  	` h !E  HE  JO  Y]  ^a  Yb  c  eh  h  	hhs>   "A	H ,-H B#H >H %I(I1I2IIIz&/admin/trip-audit/JAPAN/cleanup-imagesc            	         \        R 4      p \        P                  ! V R^\        R7      p\	        RRV P                  R^ 4       R2\        V P                  R4      4      VR7      V P                  R4      '       d   ^3# R	3# )
manual_audit_centerFr  u   ניקוי תמונות יפןu   הוסרו r  ut    תמונות שאינן בשימוש מהתיקייה הפעילה. כל קובץ שהוסר נשמר בגיבוי.r  r=  r   )r  r   r  r   r3  r   ru  )r9  r>  s     r   admin_japan_cleanup_images_v100r  5  s    -.CDFjjeAsKG=VZZXgijMkLl  ma  @b  gk  lr  lv  lv  w{  l|  g}  GN  O  Y_  Yc  Yc  dh  Yi  Yi  RU  s  s  or  s  sr   /admin/trip-audit/USA/advancedc                     \        R 4      p V '       g   \        RR4      R3# \        RR7      p. pVP                  R4      ;'       g    .  F  pVP                  R4      R8X  d   R	MVP                  R4      R
8X  d   RMRpTP	                  RV,           R,           \        \        VP                  R4      ;'       g    R4      4      ,           R,           \        \        VP                  R4      ;'       g    R4      4      ,           R,           4       K  	  VP                  R4      '       d   RMR
pRV,           R,           \        V R,          4      ,           R,           \        \        VP                  R4      ;'       g    \        4      4      ,           R,           \        VP                  R^ 4      4      ,           R,           \        VP                  R^ 4      4      ,           R,           \        VP                  R ^ 4      4      ,           R!,           RP                  V4      ,           R",           p\        R#V R,          ,           V4      # )$r(   r  uR   <div class="card warn">ארצות הברית אינה מותקנת כרגע.</div>rM  Tr  r	  r  r
  r
  r  r&
  r
  r  r  r   r   r  r  r  r  rq  rp  u(   "><h1>בדיקות ייחודיות — r`   u   </h1><p>בדיקות עומק של פרופיל USA משולבות כעת בתוך מרכז ביקורת הטיולים הכללי.</p><p>Release פעיל: <code>r  r-  rG  r.  r  r/  rb  r0  u   </tbody></table><p><a class="btn" href="/admin/trip-audit/USA">חזרה למרכז הביקורת של ארצות הברית</a></p></div>u"   בדיקות ייחודיות — )	rU  r:  r  r   r  rl  r   r  r   )r  r  r  r@	  r   r,
  r  s          r   "admin_trip_audit_usa_advanced_v100r  5  s   % D1  4H  I  KN  N  	N#6FDH%+++		(+v5u		RZH[_eHeHkpJ%3k#eiiPVFWF]F][]B^6__bss  wB  CF  GL  GP  GP  QY  GZ  G`  G`  ^`  Ca  wb  b  ex  x  	y , JJt$$&&C$'QQT_`del`mTnn  rV  V  Yd  eh  io  is  is  t@  iA  iX  iX  EX  eY  YZ  Z  ]w  w  z}  ~D  ~H  ~H  IQ  ST  ~U  zV  V  Ym  m  ps  tz  t~  t~  I  KL  tM  pN  N  Qc  c  fi  jp  jt  jt  u}  @  jA  fB  B  EU  U  XZ  X_  X_  `d  Xe  e  ht  tD9DMI4PPr   c           	         \        V 4      pV'       g   \        R R4      R3# R\        P                  P	                  VR,          4      ,           pRV,           R,           RV,           R,           R	V,           R
,           .pVR,          R8X  d   VP                  R4       VR,          R8X  dj   \        4       pVP                  R\        VP                  R^ 4      4      ,           R,           \        VP                  R^ 4      4      ,           R,           4       R\        VR,          4      ,           R,           \        VR,          4      ,           R,           RP                  V4      ,           R,           p\        RVR,          ,           V4      # )r  r  rM  r  rT  uB   <div class="card"><h2>⚡ Quick Audit</h2><p><a class="btn" href="u7   /quick">הרץ בדיקה והפק דוח</a></p></div>uE   <div class="card"><h2>🤖 ChatGPT Audit</h2><p><a class="btn" href="u2   /chatgpt">צור חבילה קטנה</a></p></div>uD   <div class="card"><h2>📦 Full Archive</h2><p><a class="btn" href="u-   /full">צור צילום מלא</a></p></div>r(   u   <div class="card"><h2>🧪 בדיקות ייחודיות ל-USA</h2><p>בדיקות Release, Offline Registry, מצגות Phone/TV ותקציב.</p><p><a class="btn" href="/admin/trip-audit/USA/advanced">פתח בדיקות מתקדמות</a></p></div>r'   uh   <div class="card"><h2>🧹 ניקוי מדיה לא בשימוש</h2><p>תמונות בתיקייה: <b>r  u)   </b> · לא בשימוש במצגת: <b>r  u  </b>. הניקוי מתבצע אוטומטית אחרי עדכון המצגת/חבילת יפן, וניתן להריץ גם ידנית.</p><form method="post" action="/admin/trip-audit/JAPAN/cleanup-images" onsubmit="return confirm('לנקות תמונות שאינן בשימוש? הקבצים יועברו לגיבוי מחוץ לתיקיית המדיה הפעילה.')"><button>נקה תמונות לא בשימוש</button></form></div>u5   <div class="card good"><h1>מרכז ביקורת — r`   u   </h1><p>כל כלי הביקורת של הטיול מרוכזים כאן וקוראים את קובצי המקור הפעילים בזמן אמת. נתיב: <code>r  zh</code>.</p><div style="display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(240px,1fr))">r   ug   </div><p><a class="btn" href="/admin/trip-audit">⬅ חזרה לרשימת הטיולים</a></p></div>u   מרכז ביקורת — )rU  r:  rK  r
  r6  r  r  r   r   rl  r   )rr   r  r   r  r  r  s   &     r   admin_trip_audit_center_v100r  6  s   $D1  4O  P  RU  U  	U&,,"4"4T%["AADLtS  WP  	PORVV  ZN  	NNQUU  YH  	HE
 E{e  T  	UE{g13  CF  GL  GP  GP  Q`  bc  Gd  Ce  e  hS  S  VY  Z_  Zc  Zc  dz  |}  Z~  V    B~
  ~
  	
B[QUV]Q^E__  cH  H  KV  W[  \b  Wc  Kd  d  gQ  Q  TV  T[  T[  \a  Tb  b  eN  ND1DMA4HHr   r  c                      \        R RR7      # )/admin/trip-audit/USA.  rS  r   r  r   r   _v100_redirect_usa_centerr  "6  s    +#66r   c                      \        R RR7      # )z/admin/trip-audit/USA/quickr  r  r  r  r   r   _v100_redirect_usa_quickr  $6  s    1<<r   c                      \        R RR7      # )z"/admin/trip-audit/USA/quick/reportr  r  r  r  r   r   _v100_redirect_usa_reportr  &6  s    8sCCr   c                      \        R RR7      # )z/admin/trip-audit/USA/chatgptr  r  r  r  r   r   _v100_redirect_usa_chatgptr  (6  s    3#>>r   c                      \        R RR7      # )z/admin/trip-audit/USA/fullr  r  r  r  r   r   _v100_redirect_usa_fullr  *6  s    0s;;r   c                      \        R RR7      # )r  r  r  r  r  r   r   _v100_redirect_usa_advancedr  ,6  s    43??r   r  r  r  r  r  r1  c                      \        4       p \        P                  ! R RV ^R7      p \        P                  ! RRV ^\        P                  R7      p V P	                  RR4      p V # )uN   <a class="btn-link" href="/admin/usa-gold-audit">\s*🇺🇸\s*USA GOLD\s*</a>r   r  uK   <div class="status-card"><b>🇺🇸 USA GOLD v93</b><span>.*?</span></div>r   u   ביקורת מערכת USAr  )_v100_admin_home_baser  r(  r  r   r  s    r   
admin_v100r  86  s]     "D66cegimuvwD66`bdfjrs{}{{  AD<<57[\DKr   c                 |   \        V R 7      p\        VP                  R4      ;'       g    . 4      p \        P	                  R4      ;_uu_ 4        \        \        P                  R,          ! 4       4      pRRR4       \        TRRRX9  ;'       d    RV9  4       \        TRR	R
V9   ;'       d    RV9   4        \        P                  4       ;_uu_ 4       pVP                  RRR7      pVP                  RRR7      pRRR4       XP                  R.9   ;'       dv    VP                  P                  RR4      P                  R4      ;'       dC    XP                  R.9   ;'       d,    VP                  P                  RR4      P                  R4      p\        VRRV4        \        VRRR\        \        4      P!                  RRR7      9   4       R\#        4       9   ;'       d%    \%        R4      R8H  ;'       d    \%        R 4      R!8H  p	\        VRR"V	4       \'        R$ V 4       4      p
\'        R% V 4       4      p\'        R& V 4       4      pVP)                  R'V^ 8H  R(V
R)VR*VR+\+        V4      R,\,        R-\.        RV/4       V#   + '       g   i     EL; i  \         d$   p\        TRRR\        T4      4        Rp?ELRp?ii ; i  + '       g   i     EL; i  \         d$   p\        TRRR\        T4      4        Rp?ELfRp?ii ; i  \         d$   p\        TRR#R\        T4      4        Rp?EL Rp?ii ; i)/r~  r  r0  r
  NzAudit Centeru7   אין כפתור USA GOLD נפרד במסך הראשיzhref="/admin/usa-gold-audit"u   >🇺🇸 USA GOLD<uj   מרכז ביקורת טיולים הוא נקודת הכניסה היחידה לביקורת טיוליםr  r  u-   בדיקת ניווט ביקורת מאוחדFr  )follow_redirectsr)  Locationr   r  r  u@   קישורי USA הישנים מפנים למרכז המאוחדu3   בדיקת תאימות לאחור לנתיבי USAr  u7   מצב validating אינו מסומן ככשל סופיz5failed = bool(same_update and state in failed_states)r   r   r  r  z[fe80::8000]:443i  z0.0.0.0:8000r   u?   זיהוי פורט משתמש בפענוח endpoint מדויקu5   בדיקות רגרסיה למנגנון האימותc              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5ir@  r`  r	  s   & r   r   r	  `6  r  r  c              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5irD  r`  r	  s   & r   r   r	  a6  r  r  c              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5irF  r`  r	  s   & r   r   r	  b6  r  r  r  rG  r  rb  rj  r  r  >   -  r  3  4  )_v100_run_self_test_baser  r   rL  test_request_contextr   view_functionsr
  r   r~  test_clientstatus_codere  r  r   rn
  r  rP  r  r  r   r,  r   r  )rV  r   r  r<
  r  clientr1r2redirects_okport_okrG  r{  rb  s   &            r   r  r  C6  s   &@XYG7;;y)//R0Gy%%h//s))'245D 0Wn6o  rP  X\  r\  rB  rB  av  ~B  aB  	CWn  7c  eI  MQ  eQ  ex  ex  Vp  tx  Vx  	y__&3eLB3eLB  NN22 Z Z

z2.778OPZ Z"66Z Z 

z2.778XY	 	 	Wn6x  {G  	HJW&=?x  {r  vz  {C  vD  vN  vN  X_  hq  vN  vr  {r  	s&')3  U  U8JK]8^be8e  U  Uj|  ~L  kM  QU  kUW&=  @A  CJ  	K GwGGFGwGGFGwGGFNND&A+xVXW]_fhklshtv  BU  Wa  cq  s|  ~E  F  GN; 0//  yWn6eglnrsvnwxxy   Wn6kmrtxy|t}~~  JW&=?vx}  @D  EH  @I  	J  	JJs   J &J5J J /
J :K 'K=AK AK  AL 9L J		J K"K  KK		K L
'LL
L;L66L;c                 D    \         P                  ! R4       \        4         \        R4        \        4        \        4        R#   \         d<   p  \	        R\        T 4      ,           4        Rp ? LO  \         d      Rp ? L`i ; iRp ? ii ; i  \         d<   p  \	        R\        T 4      ,           4        Rp ? L  \         d      Rp ? Li ; iRp ? ii ; i  \         d>   p  \	        R\        T 4      ,           4        Rp ? R#   \         d	      Rp ? R# i ; iRp ? ii ; i)a  Run non-critical maintenance after the HTTP runtime is allowed to start.

Admin updates are verified by the external Control Server through /ping.json.
Historically, GOLD-reference checks and presentation migrations ran before
Flask began listening, so a slow media scan could exhaust the 35-second
verification window even when the candidate itself was valid.  Keep the
same maintenance work, but perform it in a daemon thread after startup so
Runtime identity can be verified deterministically first.
r  z'post-start GOLD reference task failed: Nzadmin-post-startzpost-start camera task failed: z"post-start migration task failed: )	r   rr  r  r   rT  r~  rW	  r6  rL  r  s    r   $_v99_run_post_start_background_tasksr  h6  s    	 	

3%''(:; *,  	G$s)STT 		  	?$s)KLL 		  	BT#YNOO 		s    A B C BA11B<BBBBCB::CCCCCD#DDDDDDzv93_stage_status.jsonzv101_control_start.lockuh  # -*- coding: utf-8 -*-
# compatibility marker: TripServerControl/92
import os, sys, time, json, shutil, subprocess, socket, threading, traceback, hashlib, re
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from urllib.parse import urlparse
from urllib.request import urlopen
BASE_DIR = 'C:\\TripServer'
ADMIN_PORT = 8000
CONTROL_PORT = 8010
ADMIN_SCRIPT = os.path.join(BASE_DIR, "admin_server.py")
CONTROL_DIR = os.path.join(BASE_DIR, "control_server")
PENDING_ADMIN = os.path.join(CONTROL_DIR, "pending_admin_server.py")
REQUEST_JSON = os.path.join(CONTROL_DIR, "request.json")
STATUS_JSON = os.path.join(CONTROL_DIR, "status.json")
FAILSAFE_STATUS_JSON = os.path.join(BASE_DIR, "admin_failsafe_status.json")
LOG_PATH = os.path.join(CONTROL_DIR, "tripserver_control_server.log")
BACKUP_DIR = os.path.join(BASE_DIR, "backups", "admin_server")
PYTHON_EXE = sys.executable
if os.path.basename(PYTHON_EXE).lower() == "pythonw.exe":
    candidate = os.path.join(os.path.dirname(PYTHON_EXE), "python.exe")
    if os.path.exists(candidate): PYTHON_EXE = candidate
os.makedirs(CONTROL_DIR, exist_ok=True)
os.makedirs(BACKUP_DIR, exist_ok=True)
ACTION_LOCK = threading.RLock()
LAST_START_ATTEMPT = 0.0
LAST_ADMIN_PID = 0
START_COOLDOWN_SECONDS = 12.0
ADMIN_START_GRACE_SECONDS = 90.0

INSTANCE_MUTEX_HANDLE = None

def acquire_single_instance():
    """Ensure only one Control Server process can run on Windows."""
    global INSTANCE_MUTEX_HANDLE
    if os.name != "nt":
        return True
    try:
        import ctypes
        kernel32 = ctypes.windll.kernel32
        handle = kernel32.CreateMutexW(None, False, "Global\\TripServerControlServer")
        if not handle:
            log("CreateMutexW returned null; continuing with port bind as final guard")
            return True
        INSTANCE_MUTEX_HANDLE = handle
        if kernel32.GetLastError() == 183:
            log("another control server instance already owns the v93 mutex; exiting")
            return False
        return True
    except Exception as exc:
        log("single-instance mutex check failed " + repr(exc))
        return True


def now(): return time.strftime("%Y-%m-%d %H:%M:%S")

def hidden_flags(extra=0):
    flags = int(extra or 0)
    if os.name == "nt": flags |= getattr(subprocess, "CREATE_NO_WINDOW", 0)
    return flags

def log(msg):
    try:
        with open(LOG_PATH, "a", encoding="utf-8") as fh:
            fh.write(now() + " | control-v93 | " + str(msg) + "\n")
    except Exception: pass

def atomic_json(path, data):
    tmp = path + ".tmp"
    with open(tmp, "w", encoding="utf-8") as fh:
        json.dump(data, fh, ensure_ascii=False, indent=2, default=str)
        fh.flush()
        try: os.fsync(fh.fileno())
        except Exception: pass
    os.replace(tmp, path)

def read_json(path):
    try:
        with open(path, "r", encoding="utf-8") as fh:
            data = json.load(fh)
        return data if isinstance(data, dict) else {}
    except Exception: return {}

def write_status(**kw):
    previous = read_json(STATUS_JSON)
    data = {
        "control_version": "TripServerControl/93",
        "updated_at": now(),
        "control_port": CONTROL_PORT,
        "admin_port": ADMIN_PORT,
        "python": PYTHON_EXE,
    }
    for key in ("update_id", "expected_sha", "expected_version", "expected_build_id", "backup"):
        if key in previous: data[key] = previous[key]
    data.update(kw)
    try: atomic_json(STATUS_JSON, data)
    except Exception as exc: log("status write failed " + repr(exc))
    return data

def sha256(path):
    h = hashlib.sha256()
    with open(path, "rb") as fh:
        for chunk in iter(lambda: fh.read(1024 * 1024), b""): h.update(chunk)
    return h.hexdigest()

def source_identity(path):
    result = {"path": os.path.abspath(path), "exists": os.path.isfile(path), "sha256": "", "version": "", "build_id": ""}
    if not result["exists"]: return result
    try:
        result["sha256"] = sha256(path)
        text = open(path, "r", encoding="utf-8", errors="replace").read()
        m = re.search(r'^\s*ADMIN_PANEL_VERSION\s*=\s*["\']([^"\']+)["\']', text, re.MULTILINE)
        b = re.search(r'^\s*ADMIN_BUILD_ID\s*=\s*["\']([^"\']+)["\']', text, re.MULTILINE)
        if m: result["version"] = m.group(1).strip()
        if b: result["build_id"] = b.group(1).strip()
    except Exception as exc: result["error"] = repr(exc)
    return result

def compile_ok(path):
    try:
        src = open(path, "r", encoding="utf-8", errors="replace").read()
        compile(src, path, "exec")
        return True, "OK"
    except Exception as exc: return False, repr(exc)

def port_open(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(0.7)
    try: return sock.connect_ex(("127.0.0.1", int(port))) == 0
    finally:
        try: sock.close()
        except Exception: pass

def endpoint_port(endpoint):
    endpoint = str(endpoint or "").strip()
    if not endpoint: return None
    try:
        if endpoint.startswith("["):
            m = re.search(r"\]:(\d+)$", endpoint)
            return int(m.group(1)) if m else None
        return int(endpoint.rsplit(":", 1)[1])
    except Exception:
        return None

def pids_on_port(port):
    pids = []
    if os.name != "nt": return pids
    wanted_port = int(port)
    try:
        cp = subprocess.run(["netstat", "-ano", "-p", "tcp"], capture_output=True, text=True, timeout=10, creationflags=hidden_flags())
        for line in (cp.stdout or "").splitlines():
            parts = line.split()
            if len(parts) < 5: continue
            if parts[0].upper() != "TCP" or "listen" not in parts[-2].lower(): continue
            if endpoint_port(parts[1]) != wanted_port: continue
            try: pid = int(parts[-1])
            except Exception: continue
            if pid > 0 and pid not in pids: pids.append(pid)
    except Exception as exc: log("pids_on_port failed " + repr(exc))
    return pids

def _terminate_pid(pid):
    if not pid or int(pid) <= 0 or int(pid) == os.getpid():
        return False
    pid = int(pid)
    try:
        if os.name == "nt":
            cp = subprocess.run(["taskkill", "/PID", str(pid), "/F"], capture_output=True, text=True, timeout=15, creationflags=hidden_flags())
            log("taskkill pid=%s rc=%s out=%s" % (pid, cp.returncode, (cp.stdout or cp.stderr or "").strip()[:600]))
            return cp.returncode == 0
        import signal
        os.kill(pid, signal.SIGTERM)
        return True
    except Exception as exc:
        log("terminate failed pid=%s %r" % (pid, exc))
        return False

def pid_alive(pid):
    """Check a PID without spawning tasklist/netstat."""
    try:
        pid = int(pid or 0)
    except Exception:
        return False
    if pid <= 0:
        return False
    if os.name == "nt":
        try:
            import ctypes
            kernel32 = ctypes.windll.kernel32
            PROCESS_QUERY_LIMITED_INFORMATION = 0x1000
            handle = kernel32.OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, False, pid)
            if not handle:
                return False
            kernel32.CloseHandle(handle)
            return True
        except Exception:
            return False
    try:
        os.kill(pid, 0)
        return True
    except Exception:
        return False


def kill_admin():
    """Stop the canonical Admin with runtime PID first; netstat is fallback only."""
    global LAST_ADMIN_PID
    runtime_pid = 0
    try:
        payload = fetch_admin_runtime(timeout=1.2)
        runtime = payload.get("runtime") if isinstance(payload.get("runtime"), dict) else payload
        runtime_pid = int(runtime.get("pid") or 0)
    except Exception:
        runtime_pid = 0

    if runtime_pid > 0 and runtime_pid != os.getpid():
        log("kill_admin runtime_pid=" + str(runtime_pid))
        _terminate_pid(runtime_pid)
        deadline = time.time() + 12
        while time.time() < deadline:
            if not port_open(ADMIN_PORT):
                if LAST_ADMIN_PID == runtime_pid:
                    LAST_ADMIN_PID = 0
                return True
            time.sleep(0.3)

    # Fallback only when Runtime PID could not close the port.
    pids = pids_on_port(ADMIN_PORT)
    log("kill_admin fallback_port_pids=" + repr(pids))
    for pid in pids:
        if pid != os.getpid():
            _terminate_pid(pid)
    deadline = time.time() + 12
    while time.time() < deadline:
        if not port_open(ADMIN_PORT):
            LAST_ADMIN_PID = 0
            return True
        time.sleep(0.3)
    return not port_open(ADMIN_PORT)

def start_admin():
    global LAST_START_ATTEMPT, LAST_ADMIN_PID
    LAST_START_ATTEMPT = time.time()
    flags = 0
    if os.name == "nt":
        flags = getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0) | getattr(subprocess, "CREATE_NO_WINDOW", 0) | getattr(subprocess, "DETACHED_PROCESS", 0)
    out = open(os.path.join(BASE_DIR, "admin_stdout.log"), "a", encoding="utf-8", errors="replace")
    try:
        proc = subprocess.Popen([PYTHON_EXE, ADMIN_SCRIPT], cwd=BASE_DIR, stdout=out, stderr=out, stdin=subprocess.DEVNULL, creationflags=hidden_flags(flags))
    finally:
        out.close()
    LAST_ADMIN_PID = int(proc.pid)
    log("started admin pid=" + str(proc.pid))
    return proc.pid

def fetch_admin_runtime(timeout=2.5):
    try:
        with urlopen("http://127.0.0.1:%s/ping.json" % ADMIN_PORT, timeout=timeout) as resp:
            if resp.status != 200: return {}
            data = json.loads(resp.read().decode("utf-8", errors="replace"))
            return data if isinstance(data, dict) else {}
    except Exception: return {}

def wait_for_runtime(expected_sha, expected_version="", expected_build_id="", timeout=35):
    deadline = time.time() + timeout
    last = {}
    while time.time() < deadline:
        payload = fetch_admin_runtime()
        if payload:
            last = payload
            runtime = payload.get("runtime") if isinstance(payload.get("runtime"), dict) else payload
            loaded_sha = str(runtime.get("loaded_sha256") or "").lower()
            disk_sha = str(runtime.get("disk_sha256") or "").lower()
            version = str(runtime.get("version") or payload.get("version") or "")
            build_id = str(runtime.get("build_id") or payload.get("build_id") or "")
            path_ok = bool(runtime.get("running_from_expected_file"))
            loaded_disk_ok = bool(runtime.get("loaded_matches_disk"))
            ok = loaded_sha == expected_sha.lower() and disk_sha == expected_sha.lower() and path_ok and loaded_disk_ok
            if expected_version: ok = ok and version == expected_version
            if expected_build_id: ok = ok and build_id == expected_build_id
            if ok: return True, payload
        time.sleep(0.7)
    return False, last

def write_failsafe_status(state, msg, **extra):
    try:
        data = {"state": state, "message": msg, "updated_at": now(), "source": "control_server_v93"}
        data.update(extra)
        atomic_json(FAILSAFE_STATUS_JSON, data)
    except Exception as exc: log("failsafe status write failed " + repr(exc))

def no_pending_shutdown_msg(txt):
    low = (txt or "").lower()
    return "1116" in low or "no shutdown was in progress" in low

def cancel_pending_shutdown(reason="verified_update"):
    if os.name != "nt": return False, "not windows"
    # Never cancel a user-initiated Windows shutdown. Only abort a reboot that
    # the legacy Admin update Fail Safe explicitly marked as armed.
    failsafe = read_json(FAILSAFE_STATUS_JSON)
    if str(failsafe.get("state") or "") != "armed":
        return True, "no admin update failsafe is armed"
    try:
        cp = subprocess.run(["shutdown", "/a"], capture_output=True, text=True, timeout=10, creationflags=hidden_flags())
        msg = (cp.stdout or cp.stderr or "").strip()
        if cp.returncode == 0 or no_pending_shutdown_msg(msg):
            write_failsafe_status("auto_cancelled" if cp.returncode == 0 else "none", "Fail Safe בוטל רק לאחר אימות Runtime מלא.", windows_output=msg, reason=reason)
            return True, msg
        write_failsafe_status("cancel_failed", "אימות Runtime עבר, אך ביטול Fail Safe נכשל.", windows_output=msg, return_code=cp.returncode)
        return False, msg
    except Exception as exc:
        write_failsafe_status("cancel_failed", "שגיאה בביטול Fail Safe: " + repr(exc))
        return False, repr(exc)

def restore_backup(backup, reason):
    if not backup or not os.path.isfile(backup): return False, "backup missing"
    try:
        shutil.copy2(backup, ADMIN_SCRIPT)
        actual = sha256(ADMIN_SCRIPT)
        log("rollback restored reason=%s sha=%s backup=%s" % (reason, actual, backup))
        return True, actual
    except Exception as exc:
        log("rollback failed " + repr(exc))
        return False, repr(exc)

def rollback_after_failed_update(backup, previous_identity, failure_reason):
    """Restore the previous admin and verify the rollback runtime identity."""
    rollback = {"attempted": False, "restored": False, "started_pid": None, "verified": False, "runtime": {}, "error": ""}
    if not backup or not os.path.isfile(backup):
        rollback["error"] = "backup missing"
        return rollback
    rollback["attempted"] = True
    try:
        kill_admin()
    except Exception as exc:
        log("rollback pre-kill failed " + repr(exc))
    restored, info = restore_backup(backup, failure_reason)
    rollback["restored"] = bool(restored)
    if not restored:
        rollback["error"] = str(info)
        return rollback
    try:
        rollback["started_pid"] = start_admin()
    except Exception as exc:
        rollback["error"] = "rollback start failed: " + repr(exc)
        return rollback
    previous_identity = previous_identity or {}
    old_sha = str(previous_identity.get("sha256") or "").lower()
    old_version = str(previous_identity.get("version") or "")
    old_build = str(previous_identity.get("build_id") or "")
    verified, runtime_payload = wait_for_runtime(old_sha, old_version, old_build, timeout=45)
    rollback["verified"] = bool(verified)
    rollback["runtime"] = runtime_payload
    if not verified:
        rollback["error"] = "rollback runtime identity did not verify"
    return rollback

def apply_update(reason="manual", request_data=None):
    req = request_data if isinstance(request_data, dict) else {}
    update_id = str(req.get("update_id") or "")
    expected_sha = str(req.get("expected_sha") or "").lower()
    expected_version = str(req.get("expected_version") or "")
    expected_build_id = str(req.get("expected_build_id") or "")
    write_status(last_action="apply_update", state="validating", ok=False, verification_ok=None, reason=reason, update_id=update_id, expected_sha=expected_sha, expected_version=expected_version, expected_build_id=expected_build_id)
    if not os.path.isfile(PENDING_ADMIN):
        msg = "pending admin not found"
        write_status(last_action="apply_update", state="validation_failed", ok=False, verification_ok=False, error=msg)
        return False, msg
    ok, info = compile_ok(PENDING_ADMIN)
    if not ok:
        write_status(last_action="apply_update", state="validation_failed", ok=False, verification_ok=False, error=info)
        return False, info
    candidate = source_identity(PENDING_ADMIN)
    new_sha = candidate.get("sha256", "").lower()
    if expected_sha and new_sha != expected_sha:
        msg = "pending SHA mismatch expected=%s actual=%s" % (expected_sha, new_sha)
        write_status(last_action="apply_update", state="validation_failed", ok=False, verification_ok=False, error=msg, candidate=candidate)
        return False, msg
    expected_sha = expected_sha or new_sha
    expected_version = expected_version or str(candidate.get("version") or "")
    expected_build_id = expected_build_id or str(candidate.get("build_id") or "")
    previous_identity = source_identity(ADMIN_SCRIPT)
    stamp = time.strftime("%Y%m%d_%H%M%S")
    backup = os.path.join(BACKUP_DIR, "admin_server_backup_" + stamp + ".py")
    try:
        if os.path.isfile(ADMIN_SCRIPT): shutil.copy2(ADMIN_SCRIPT, backup)
    except Exception as exc:
        msg = "backup failed: " + repr(exc)
        write_status(last_action="apply_update", state="backup_failed", ok=False, verification_ok=False, error=msg, backup=backup)
        return False, msg
    if not kill_admin():
        msg = "admin port did not close"
        write_status(last_action="apply_update", state="stop_failed", ok=False, verification_ok=False, error=msg, backup=backup)
        return False, msg
    try:
        os.replace(PENDING_ADMIN, ADMIN_SCRIPT)
    except Exception as exc:
        msg = "replace failed: " + repr(exc)
        write_status(last_action="apply_update", state="replace_failed", ok=False, verification_ok=False, error=msg, backup=backup)
        return False, msg
    disk_sha = ""
    try: disk_sha = sha256(ADMIN_SCRIPT).lower()
    except Exception as exc: log("disk sha failed " + repr(exc))
    if disk_sha != expected_sha:
        msg = "disk SHA mismatch after replace expected=%s actual=%s" % (expected_sha, disk_sha)
        rollback = rollback_after_failed_update(backup, previous_identity, "disk_sha_mismatch")
        state = "rolled_back" if rollback.get("verified") else "rollback_failed"
        write_status(last_action="apply_update", state=state, ok=False, verification_ok=False, error=msg, expected_sha=expected_sha, disk_sha=disk_sha, backup=backup, rollback=rollback)
        return False, msg
    write_status(last_action="apply_update", state="replaced", ok=False, verification_ok=None, expected_sha=expected_sha, expected_version=expected_version, expected_build_id=expected_build_id, disk_sha=disk_sha, backup=backup, candidate=candidate)
    try:
        pid = start_admin()
    except Exception as exc:
        msg = "start failed: " + repr(exc)
        rollback = rollback_after_failed_update(backup, previous_identity, "new_admin_start_failed")
        state = "rolled_back" if rollback.get("verified") else "rollback_failed"
        write_status(last_action="apply_update", state=state, ok=False, verification_ok=False, error=msg, expected_sha=expected_sha, disk_sha=disk_sha, backup=backup, rollback=rollback)
        return False, msg
    verified, runtime_payload = wait_for_runtime(expected_sha, expected_version, expected_build_id, timeout=45)
    if verified:
        cancel_ok, cancel_msg = cancel_pending_shutdown("runtime_identity_verified")
        write_status(last_action="apply_update", state="verified", ok=True, verification_ok=True, message="verified update", update_id=update_id, expected_sha=expected_sha, expected_version=expected_version, expected_build_id=expected_build_id, disk_sha=disk_sha, backup=backup, started_pid=pid, runtime=runtime_payload, failsafe_cancel_ok=cancel_ok, failsafe_cancel_msg=cancel_msg)
        return True, "verified update"

    rollback = rollback_after_failed_update(backup, previous_identity, "runtime_verification_failed")
    state = "rolled_back" if rollback.get("verified") else "rollback_failed"
    message = "new runtime did not verify; previous admin restored" if rollback.get("verified") else "new runtime did not verify and rollback verification failed"
    write_status(last_action="apply_update", state=state, ok=False, verification_ok=False, message=message, update_id=update_id, expected_sha=expected_sha, expected_version=expected_version, expected_build_id=expected_build_id, disk_sha=disk_sha, backup=backup, started_pid=pid, runtime=runtime_payload, rollback=rollback)
    return False, message

def restart_admin(reason="manual"):
    expected_sha = sha256(ADMIN_SCRIPT) if os.path.isfile(ADMIN_SCRIPT) else ""
    if not kill_admin():
        write_status(last_action="restart_admin", state="stop_failed", ok=False, verification_ok=False, error="admin port did not close")
        return False, "admin port did not close"
    pid = start_admin()
    verified, runtime_payload = wait_for_runtime(expected_sha, timeout=30)
    write_status(last_action="restart_admin", state="verified" if verified else "installed_unverified", ok=verified, verification_ok=verified, expected_sha=expected_sha, started_pid=pid, runtime=runtime_payload)
    return verified, "restart verified" if verified else "restart was not verified"

def run_locked(func, *args, **kwargs):
    with ACTION_LOCK:
        return func(*args, **kwargs)

def process_request_file():
    if not os.path.isfile(REQUEST_JSON): return
    try: req = read_json(REQUEST_JSON)
    except Exception as exc: log("bad request " + repr(exc)); return
    try: not_before = float(req.get("not_before", 0) or 0)
    except Exception: not_before = 0
    if time.time() < not_before: return
    try: os.remove(REQUEST_JSON)
    except Exception: pass
    action = req.get("action")
    if action == "apply_update": run_locked(apply_update, req.get("reason", "request"), req)
    elif action == "restart_admin": run_locked(restart_admin, req.get("reason", "request"))
    else: write_status(last_action="unknown_request", state="request_failed", ok=False, verification_ok=False, error="unknown action " + repr(action))

def poll_loop():
    global LAST_ADMIN_PID
    while True:
        try:
            process_request_file()
            if port_open(ADMIN_PORT):
                time.sleep(2)
                continue

            elapsed = time.time() - LAST_START_ATTEMPT
            tracked_alive = bool(LAST_ADMIN_PID and pid_alive(LAST_ADMIN_PID))
            if tracked_alive and elapsed < ADMIN_START_GRACE_SECONDS:
                # The process exists and may still be starting. Never fan out
                # duplicate Admin processes merely because the port is not open yet.
                time.sleep(2)
                continue

            with ACTION_LOCK:
                if port_open(ADMIN_PORT):
                    pass
                else:
                    elapsed = time.time() - LAST_START_ATTEMPT
                    tracked_alive = bool(LAST_ADMIN_PID and pid_alive(LAST_ADMIN_PID))
                    if tracked_alive and elapsed >= ADMIN_START_GRACE_SECONDS:
                        log("tracked admin exceeded startup grace; terminating pid=" + str(LAST_ADMIN_PID))
                        _terminate_pid(LAST_ADMIN_PID)
                        LAST_ADMIN_PID = 0
                    if (not tracked_alive or elapsed >= ADMIN_START_GRACE_SECONDS) and elapsed >= START_COOLDOWN_SECONDS:
                        log("admin port closed and no healthy startup is in progress; starting canonical admin")
                        start_admin()
        except Exception as exc:
            log("poll error " + repr(exc) + "\n" + traceback.format_exc())
        time.sleep(2)

class Handler(BaseHTTPRequestHandler):
    server_version = "TripServerControl/93"
    def send_body(self, code, body, ctype="application/json; charset=utf-8"):
        if isinstance(body, str): body = body.encode("utf-8")
        self.send_response(code)
        self.send_header("Content-Type", ctype)
        self.send_header("Content-Length", str(len(body)))
        self.send_header("Cache-Control", "no-store")
        self.end_headers()
        self.wfile.write(body)
    def do_GET(self):
        path = urlparse(self.path).path
        if path == "/ping.json":
            # Lightweight and non-recursive: liveness must never call back into
            # the Admin process that may itself be waiting for this response.
            self.send_body(200, json.dumps({
                "ok": True,
                "control_version": "TripServerControl/93",
                "control_pid": os.getpid(),
                "admin_port_open": port_open(ADMIN_PORT),
            }, ensure_ascii=False))
            return
        if path == "/status.json":
            data = read_json(STATUS_JSON)
            admin_runtime = fetch_admin_runtime()
            runtime = admin_runtime.get("runtime") if isinstance(admin_runtime.get("runtime"), dict) else admin_runtime
            try:
                runtime_pid = int(runtime.get("pid") or 0)
            except Exception:
                runtime_pid = 0
            pids = [runtime_pid] if runtime_pid > 0 else (pids_on_port(ADMIN_PORT) if port_open(ADMIN_PORT) else [])
            data.update({"control_version": "TripServerControl/93", "admin_port_open": port_open(ADMIN_PORT), "pids": pids, "active_disk_identity": source_identity(ADMIN_SCRIPT), "admin_runtime": admin_runtime})
            self.send_body(200, json.dumps(data, ensure_ascii=False, indent=2, default=str))
            return
        if path == "/log":
            try: txt = open(LOG_PATH, "r", encoding="utf-8", errors="replace").read()[-30000:]
            except Exception as exc: txt = repr(exc)
            self.send_body(200, "<pre style='white-space:pre-wrap;direction:ltr'>" + txt.replace("<", "&lt;") + "</pre>", "text/html; charset=utf-8")
            return
        html = """<html><head><meta charset='utf-8'><title>TripServer Control v93</title></head><body style='font-family:Arial;background:#0b1220;color:#eef;direction:rtl;padding:30px'><h1>TripServer Control v93</h1><p>עדכון נחשב מוצלח רק לאחר אימות Runtime מלא.</p><p><a style='color:#93c5fd' href='/status.json'>Status JSON</a> · <a style='color:#93c5fd' href='/log'>Log</a></p></body></html>"""
        self.send_body(200, html, "text/html; charset=utf-8")
    def do_POST(self):
        path = urlparse(self.path).path
        if path == "/restart": ok, msg = run_locked(restart_admin, "http")
        elif path == "/apply-update": ok, msg = run_locked(apply_update, "http", {})
        else:
            self.send_body(404, "not found", "text/plain; charset=utf-8")
            return
        self.send_body(200 if ok else 500, json.dumps({"ok": ok, "message": msg}, ensure_ascii=False))
    def log_message(self, fmt, *args): log("http " + (fmt % args))

if __name__ == "__main__":
    if not acquire_single_instance():
        sys.exit(0)
    log("starting control server v93 python=" + sys.executable)
    write_status(last_action="control_start", state="ready", ok=True, verification_ok=None, control_pid=os.getpid())
    threading.Thread(target=poll_loop, daemon=True, name="tripserver-control-poll").start()
    try:
        server = ThreadingHTTPServer(("0.0.0.0", CONTROL_PORT), Handler)
        server.daemon_threads = True
        server.allow_reuse_address = True
    except OSError as exc:
        log("control bind failed; another instance may already own port %s: %r" % (CONTROL_PORT, exc))
        sys.exit(0)
    log("listening on port " + str(CONTROL_PORT))
    server.serve_forever()
c                      \         # r   )_V101_CONTROL_V93_SOURCEr  r   r   rX  rX  6  s    ##r   c                    \         P                   ! \         P                  \         P                  4      pVP                  V4        VP	                  R \        V 4      34      ^ 8H   VP                  4        #   \         d     # i ; i  \         d(      TP                  4        R#   \         d     R# i ; ii ; i   TP                  4        i   \         d     i i ; i; i)r=  F)socketAF_INETSOCK_STREAM
settimeout
connect_exr   r  r   )r  r[  socks   && r   _v101_tcp_port_openr  6  s    ==););<DOOGSY78A=	JJL 		  	JJL 			JJL 		sl   B %A66BBB9B< B& &B54B58B99B< <C >CC CC CC c                       \        \        4      # r   )r  rM  r  r   r   rO  rO  6  s     |,,r   c           	      <   \         P                  ! \        R R7       \        ^4       F  p \         P                  ! \
        \         P                  \         P                  ,          \         P                  ,          4      p\         P                  ! V\        \         P                  ! 4       4      R,           \        \        P                  ! 4       4      ,           P                  RRR7      4       \         P                  ! V4        R # 	  R#   \         dy     \        P                  ! 4       \         P                   P#                  \
        4      ,
          T 8  d   \         P$                  ! \
        4        EKN  M  \&         d     Mi ; i  R# \&         d      R# i ; i)Tr   ru  asciir  ry  F)r   r   rM  r=  r   _V101_CONTROL_START_LOCKO_CREATO_EXCLO_WRONLYr  r   r  r   r  r  FileExistsErrorr   r   r  r   )stale_secondsr  r  s   &  r   _v101_acquire_start_lockr  6  s   KKd+1X	12::		3IBKK3WXBHHR#biik*T1C		4DDLLW]eLfgHHRL     	99;!1!12J!KKm[II67 \   		sC   CD

FAE76F7FFFFFFFc                       \         P                  P                  \        4      '       d   \         P                  ! \        4       R # R #   \
         d     R # i ; ir   )r   r   r   r  r  r   r  r   r   _v101_release_start_lockr  6  s?    77>>233II./ 4 s   (A	 A	 	AAc           
     T   \        4       '       d   Rp\        RV : RV: 24       RV3# \        4       '       gc   \        P                  ! 4       ^,           p\        P                  ! 4       V8  d+   \        4       '       d   R# \        P                  ! R4       KD  R#  \        4       '       d   R\        4        # \        P                  P                  \        4      '       g   \        4       p\        V\        R4       \        R,           p\        V4      P                  VR	R
7       \        P                  ! VRR7       \        P                  ! V\        4       \        R4       \!        4       p^ p\        P"                  R8X  dG   \%        \'        \(        R^ 4      \'        \(        R^ 4      ,          \'        \(        R^ 4      ,          4      p\(        P*                  ! V\        .\,        \(        P.                  \(        P.                  \(        P.                  V\        P"                  R8g  R7       \        P                  ! 4       ^,           p\        P                  ! 4       V8  dL   \        4       '       d$   Rp\        RV : RV: 24       RV3\        4        # \        P                  ! R4       Ke  Rp\        RV : RV: 24       RV3\        4        #   \0         d=   p\        R\3        T4      ,           4       R\3        T4      3u Rp?\        4        # Rp?ii ; i  \        4        i ; i)z;Passive Control bootstrap: never restart a live supervisor.zpassive alive=True action=nonez!control passive bootstrap reason=r   Tr[  Fr\  r   r   r   r  z4control v93 script restored because file was missingr   rQ  rj  rk  r`  z&passive alive=True action=single-popenz/passive alive=False action=single-popen-timeoutz!control passive bootstrap failed N)Tz&passive alive=True action=peer-started)Fz8passive start lock busy and control did not become ready)Tz)passive alive=True action=none-after-lock)rO  rE  r  r   rr  r  r   r   rg  ra  rX  rN  r   r  r  r   rH  r   rV  rR  rS  rt  r  ru  r   r~  )rb  r  r	  rS  r   rc  rU  r  s   &       r   rK  rK  6  sT     /&RVWXTz#%%99;?iikH$&((EEJJtPP.#"$$DX 	!"Q ww~~122,.DD-v6%.CI   8sD1JJs/0!"XY "77d?+
$6:*&@!DE*&8!<=E
 	%&$$%%%%!ww$	
 99;?iikH$&((?%RXZ^&_`Tz 	!" JJt@&RVWXd{
 	!"	   ADIMNd3i "	  	!"sC   K 9(K "F)K 0K L'LLL LL L'c                 4    Rp \        RV R\        R7       RV 3# )zJv101: routine Admin updates use verified rollback, never a full-PC reboot.u   Fail Safe של ריסטארט Windows אינו מופעל בעדכון אדמין רגיל. ההגנה היא גיבוי + אימות Runtime + Rollback מבוקר דרך Control Server.not_requiredverified_runtime_and_rollback)
protectionr   T)r   r   )r  s    r   r  r  7  s/    	i   2)	 9r   c                 X   \        V 4      p\        VP                  R 4      \        4      '       d   VP                  R 4      M/ p\	        VP                  R4      ;'       g    R4      pVR8X  d   RVR&   RVR&   RVR&   RVR&   R	VR
&   V# VR8X  d   RVR&   RVR&   RVR&   RVR&   RVR
&   V# )rD  r   r   rolled_backFr  r2  Trb  uq   העדכון החדש לא אומת; המערכת חזרה אוטומטית לגרסה הקודמת שאומתה.r   rollback_failedu]   העדכון החדש נכשל וגם אימות השחזור דורש בדיקה ידנית.)_v101_build_update_status_baser   r   r   r   )rY  r   r   r   s   &   r   rR  rR  7  s    ,\:G/9'++FV:WY]/^/^gkk*+dfGG$**+E#
 ( Q	 N 
#	##
 ,|	Nr   c                    \         P                   ! 4       ^x,           p Rp\         P                   ! 4       V 8  Edc    \         P                  ! ^4       \        RR7      p\        VP	                  R4      ;'       g    R4      P                  4       pVP	                  R4      '       d	   V'       g   RpK  \        \        / 4      p\        \        / 4      p\        VP	                  R4      ;'       g5    VP	                  R4      ;'       g    VP	                  R	4      ;'       g    T4      P                  4       p\        VP	                  R
4      ;'       g    R4      pWc8w  d   RpEKF  VR-9   d   RpEKR  VR.9  d   RV,           pEKe  \        4       p\        V\        R4       Rp	\        P                  P                  \        4      '       d!   \        \        4      P!                  RRR7      p	W8X  d@   \#        \$        RRR
RRRR\'        \        4      RRR\         P(                  ! R4      /4       R# \        P                  P+                  \,        RR4      p
\        P.                  ! V
RR7       Rp\        P                  P                  \        4      '       d^   \        P                  P+                  V
R\         P(                  ! R 4      ,           R!,           4      p\0        P2                  ! \        V4       \        R",           p\        V4      P5                  VRR#7       \6        P                  ! VRR$7       \        P8                  ! V\        4       \#        \$        RRR
R%RRR\'        \        4      R&VRRR\         P(                  ! R4      /4       \;        R'4       R#  \#        \$        RRR
R*R+VRRR\         P(                  ! R4      /4       \;        R,\        V4      ,           4       R#   \<         dR   pR(\?        T4      ,           p \;        R)\?        T4      ,           4        Rp?EK	    \<         d
      Rp?EK  i ; iRp?ii ; i  \<         d     Li ; i)/aw  Safely stage Control v93 after the new Admin Runtime is fully settled.

The currently running Control v92 process is deliberately left alive because
it is the external updater responsible for verifying this Admin transition.
We only replace the on-disk Control source after Runtime identity and update
state are stable.  A bounded retry window avoids a one-shot timing race.
waitingFr&  r  r   r  r*  rY  rV  r   r,  update_handshake_in_progresscontrol_state_r\  r   r   r  r  Talready_stagedr.  TripServerControl/93r   active_control_was_not_restartedr   r   NrC   r   r   !tripserver_control_server_backup_r  r&  z.v93.tmpr   r  staged_for_next_control_restartrD   zNcontrol v93 staged safely; active control process intentionally left untouchedzstage_error:z control v93 staging retry after stage_timeoutrb  z%control v93 staging timed out reason=>   replaced
validating>   r   rO	  r2  r#  ) r   rr  r$  r   r   r   r  r  r8  rX  rN  ra  r   r   rg  r   r  r  _V101_CONTROL_STAGE_STATUSr  r   r   r  r   rF  r  r  r  r   rE  r   r~  )r	  last_reasonr+  current_sharD  r9  rY  r  rS  r  rE  r  r   r  s                 r   ,_v101_stage_control_v93_after_verified_startr5  )7  s    yy{S HK
))+
 L	JJqM.%HGgkk/:@@bAGGIK;;122+4+,?DN'(DbIJ~.  !%%n5 !%%i0  	
 eg    2 27 ; A ArBM*5 ::<$LL.>,.DD-v6Hww~~122 34>>Xa>b&'A$-%'=k*=>6 $--0C"DD  h	;KLJKK
T2Kww~~122 ggll7$--:XX[`` 0+>%
2CI   8sD1JJs/0"#=d:!#9+&9:+2Ddmm,?@@  "` 	9%_k.$--(;<<
 	 ACDTTU#  	(494K%&H4PS9&TUU 		  s   >O( :+O( &O( .O( 2AO( O( !1O( O( %	O( 1O( B)O( /A'O( DO( .Q (Q3P?P((P<3P?;P<<P??QQQc                   a	 \        V R 7      p\        VP                  R4      ;'       g    . 4      p RP                  R \        P
                  P                   4       4      p\        VRRRV9   R4       \        VRRR	\        P
                  P                  9   4       \        4       o	\        S	R
R4       \        TRR\        ;QJ d    V	3R lR  4       F  '       d   K   RM	  RM! V	3R lR  4       4      4       RP                  R \        P
                  P                   4       4      p\        TRRRV9  ;'       d    RV9  4       \!        R V 4       4      p\!        R V 4       4      p\!        R V 4       4      pVP#                  RV^ 8H  RVRVRVR\%        V4      R\&        R\(        RV/4       V#   \         d#   p\        TRRR\        T4      4        Rp?LRp?ii ; i)!r~  r  r   c              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r  r  s   & r   r   r	  7  s     #i4hqCFF4hr  u   עדכון אדמין v101uH   עדכון רגיל אינו מתזמן ריסטארט מלא למחשבr   z(protection=verified_runtime_and_rollbackuZ   בדיקת חיות Control משתמשת ב־TCP ישיר ולא ב־HTTP רקורסיביr  z<tripserver_control_v93>r\  uC   Control Server v93 כולל Single Instance, Ping קל ו־Rollbackc              3   ,   <"   T F	  qS9   x  K  	  R # 5ir   r  r  s   & r   r   r	  7  s       4%% 4r\  FTc              3   8   "   T F  p\        V4      x  K  	  R # 5ir   r  r  s   & r   r   r	  7  s     #`4_qCFF4_r  uR   Bootstrap חדש אינו מפעיל schtasks ואינו הורג Control פעילr  rZ  u%   בדיקות Safe Update ArchitectureNc              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5ir@  r`  r	  s   & r   r   r	  7  r  r  c              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5irD  r`  r	  s   & r   r   r	  7  r  r  c              3   T   "   T F  qP                  R 4      R8X  g   K  ^x  K   	  R# 5irF  r`  r	  s   & r   r   r	  7  r  r  r  rG  r  rb  rj  r  r  )r+  acquire_single_instancerollback_after_failed_updatez3new runtime did not verify; previous admin restoredzLightweight and non-recursive)_v101_run_self_test_baser  r   r   r  rQ  	co_constsr
  rO  rR  rX  rN  r	  rK  r   r~  r  r   r,  r   r  )
rV  r   r  fail_safe_constsbootstrap_constsr  rG  r{  rb  r  s
   &        @r   r  r  7  s   &@XYG7;;y)//R0G!88#i4U4^4^4h4h#ii1V+/??6		
 	1h!%<%E%E%N%NN	

 128&A1QC  4 CCC  4  
	
 88#`4L4U4U4_4_#``1`..UU:EU3U	
 GwGGFGwGGFGwGGFNNfk&F&W&N7	 	 N!  W&BDkmrtxy|t}~~s%   B)F6 AF6 ?
F6 6G#GG#__main__zadmin-startup-v101zadmin-startup-v101-passivez!tripserver-post-start-maintenancerV	  ztripserver-control-v93-stage)r  r  threadeduse_reloader)build_watchdog_codewatchdog_status>   r%   r!   r&  .batr$   .csvr#   .log.ps1r   r&   r"   r    r  i  >   r(   r'   r)   r*   r,   r+   >	   r   rF  rD   rC   r
  r   .hgr  .svn>   	.ds_store	thumbs.dbdesktop.ini>   r.   rH   rG   >   intror	  r  extra-dinerroadtrip-mapextra-big-surextra-mono-lakeextra-death-valley>   r7   r2   r4   .tifr3   .tiffr5   >	   r;   r:   r8   r=   r9   r?   r<   r>   r@   i  i  .i  ]i   >
   r;   r:   r8   rA   r=   r9   r?   r<   r>   r@   i   i   i  @i  @i  0>   r%   r$   r#   r2   rB   r8   rA   r4   r1   r   r"   r3   r    r5   r  i   i   i  i   r   i 0 >   r   r"  offfalseip  r  )r  )r5  NNr3  )r  )Nr   Nr   >   r2   r4   r3   r5   r  r	  )r_   )r  )r  )r   r   )Tr   r0  )admin_server_backup)NNNr   )NNr   )NNmanual_restart)NNsafe_external_restart)   )i  )r  )r  )r  )startup)r[  )r	  )rQ  uB   🇺🇸 ארה״ב 2027 — אמריקה על פול ווליוםu7  Road Trip • Orlando • Miami • Cruise / 36 ימים של נופים, פארקים, קניות, קרוז ורגעים שגורמים להגיד: “רגע… לשם אנחנו באמת הולכים?” / מערב ארה״ב: סן פרנסיסקו , כביש 1, LA , קניונים, וגאס ויוסמיטי)rS  uN   🗺️ מסלול הרוד טריפ — הסיפור הגדול, מלמעלהu  סן פרנסיסקו • כביש 1 • LA • וגאס • יוסמיטי / מפה אחת שמסבירה את כל הרעיון: מתחילים באוקיינוס, מטפסים לקניונים, נוגעים במדבר וחוזרים לטבע. / המסלול נותן את כל המנה: חופים, כבישים יפים, פארקים לאומיים, וגאס ויוסמיטי — בלי לנסות לדחוס כאן את כל הלו״ז.)zday-01uB   יום 1 — ✈️ נחיתה ישירה ב סן פרנסיסקוu   סן פרנסיסקו / נוחתים בעיר שיודעת לפתוח טיול עם סטייל. / נחיתה, התארגנות וטעימה ראשונה מהעיר)zday-02u2   יום 2 — 🌉 סן פרנסיסקו + Alcatrazu   סן פרנסיסקו / Alcatraz / יום של אייקונים: מפרץ, גשרים, אלקטרז ואווירה של סרט. / אלקטרז, תצפיות והעיר הכי פוטוגנית בצפון קליפורניה)zday-03u:   יום 3 — 🌊 סן פרנסיסקו → מונטרייu   מונטריי / 17-Mile Drive / עוברים למוד רוד־טריפ אמיתי: ים, כביש ונופים שמתחילים לעבוד עלינו חזק. / נסיעה דרומה, מונטריי וקטע חוף מהמם)zday-04u4   יום 4 — 🐋 Monterey Bay Whale Watch + Big Suru   מונטריי / Big Sur / היום שבו האוקיינוס נותן הופעה, ואם לוויתן קופץ — זה כבר בונוס קולנועי. / שייט לווייתנים ואז נופי Big Sur וכביש 1)rT  u?   Road Trip Bonus — 🌉 Big Sur – Bixby Bridge + McWay Fallsu   כביש 1 / קליפורניה / כאן קליפורניה כבר לא רק יפה — היא מתחילה ממש להשוויץ. / גשר Bixby והחופים הדרמטיים של Big Sur הם מהשיאים המצולמים של כביש 1)zday-05u?   יום 5 — 🎡 סנטה מוניקה → לוס אנג׳לסu   Santa Monica / Los Angeles / נכנסים ל־ LA דרך סנטה מוניקה : חוף, טיילת, גלגל ענק ואווירת קליפורניה קלאסית. / Santa Monica Pier, חוף, טיילת וכניסה לאווירת לוס אנג׳לס)zday-06u8   יום 6 — 🎥 Warner Bros + Beverly Hills + Griffithu   לוס אנג׳לס / LA במצב קלאסי: אולפנים, בוורלי הילס ותצפית של סוף סרט. / Warner Bros , Beverly Hills ו־ Griffith)zday-07u1   יום 7 — 🏜️ לוס אנג׳לס → Zionu   מעבר למדבר / Utah / עוזבים עיר ונכנסים למרחבים. זה יום מעבר, אבל עם סוף ששווה את זה. / נסיעה ארוכה אל אזור Zion)rR  u3   Road Trip Bonus — 🍔 Peggy Sue’s 50’s Dinerue  עצירת דרך אמריקאית / מדבר / באמצע כל הנופים הגדולים, מגיע רגע קטן ומושלם של אמריקה קלאסית: ניאון, מילקשייק ואווירת רוד־טריפ אמיתית. / עצירת דיינר שנותנת לטיול את הטעם של אמריקה הישנה והכיפית של הכביש)zday-08u,   יום 8 — 🏞️ Zion → Bryce → Pageu   Zion / Bryce / Page / יום טבע חזק במיוחד: צוקים, צבעים ומעברים שנראים לא אמיתיים. / Zion , Bryce והגעה ל־ Page)zday-09u2   יום 9 — 🧡 Antelope Canyon + Horseshoe Bendu   Page Arizona / זה היום של “וואו, לאן אתם הולכים?” — בדיוק זה. / Antelope Canyon ו־ Horseshoe Bend)zday-10u5   יום 10 — 🏜️ Page → Grand Canyon South Rimu   Grand Canyon / היום שבו המילה “גדול” מקבלת קנה מידה חדש. / נסיעה אל South Rim ומפגש עם הגרנד קניון)zday-11u-   יום 11 — 🎰 Grand Canyon → Las Vegasu   לאס וגאס / מהטבע הכי גדול — לעיר הכי מוגזמת. מעבר חד, אבל כיפי. / נסיעה לווגאס וכניסה לאורות של הסטריפ)zday-12u,   יום 12 — 🛍️ Vegas Outlets + Sphereu   לאס וגאס / וגאס יודעת לשלב שופינג, שואו ואורות ברמה לא סבירה. / אאוטלטים, Sphere והסטריפ)zday-13u)   יום 13 — ✨ Vegas Extra Day + Stripu   לאס וגאס / עוד יום בווגאס, כי כנראה יום אחד לא מספיק כדי להגזים כמו שצריך. / קניות, Strip , מלונות ותצוגות ערב)zday-14u1   יום 14 — 🏔️ Las Vegas → Mammoth Lakesu   Mammoth Lakes / נפרדים מהניאון וחוזרים לאוויר הרים כמו אנשים אחראיים. בערך. / נסיעה צפונה אל Mammoth Lakes)rV  u%   Road Trip Bonus — 🔥 Death Valleyu$  בין וגאס ל־Mammoth / זה המעבר הכי חד במסלול: מווגאס המנצנצת אל מדבר עצום, שקט ובלתי נתפס. / עמק המוות מוסיף למסלול מרחבים אינסופיים, תצפיות דרמטיות ותחושת קצה של המערב)rU  u6   Road Trip Bonus — 🏜️ Mono Lake / Eastern Sierrau  בדרך אל יוסמיטי / פה הרוד־טריפ משנה טון שוב: מדבר, הרים, אגם דרמטי ושמיים ענקיים — הכל בפריים אחד. / אזור Eastern Sierra מוסיף תחושת מרחב אדירה לפני הכניסה ליוסמיטי)zday-15u.   יום 15 — 🚗 Mammoth → Yosemite Valleyu   יוסמיטי / אחד מימי ה־וואו של הטיול. יוסמיטי נכנסת לפריים. / דרך נופית אל Yosemite Valley)zday-16u7   יום 16 — 🌲 Yosemite Highlights + Mariposa Groveu   יוסמיטי / Mariposa / יום של מפלים, גרניט ועצי סקויה שגורמים לך להרגיש בגודל של סיכה. / יוסמיטי קלאסי + Mariposa Grove)zday-17u1   יום 17 — ✈️ Yosemite → SFO → Orlandou   מעבר לאורלנדו / סוגרים פרק מערב ופותחים פרק פארקים. המזוודות עוד לא יודעות מה מחכה להן. / נסיעה לשדה וטיסה לאורלנדו)zday-18u7   יום 18 — 🛍️ התאוששות + Disney Springsu   אורלנדו / יום רך לפני שמתחילים לצרוח בפארקים. / התאוששות, Disney Springs ואווירה קלילה)zday-19u'   יום 19 — 🎢 Islands of Adventureu   Universal Orlando / כאן מתחיל פרק האדרנלין הרשמי. אקספרס ביד, חיוך בפנים. / צ׳ק־אין Premier ו־ Islands of Adventure)zday-20u7   יום 20 — 🎬 Universal Studios Florida + CityWalku   Universal Studios / יום Universal קלאסי: מתקנים, אווירה ו־ CityWalk לסיום. / Universal Studios Florida וערב CityWalk)zday-21u;   יום 21 — ⛳ מנוחה + Hollywood Drive-In Mini Golfu   אורלנדו / יום רגוע יותר, כי גם למשפחה עם אנרגיה צריך טעינה. / מנוחה, בריכה/קניות קלות ומיני גולף)zday-22u*   יום 22 — 🌌 Epic Universe + Expressu   Epic Universe / אחד הימים הכי מסקרנים בטיול — פארק חדש, גדול ומלא הייפ. / Epic Universe עם Express)zday-23u?   יום 23 — 🧗 פארק חבלים + בריכה / I‑Driveu   אורלנדו / קצת אקשן, קצת בריכה, קצת אורלנדו בלי לחץ. / פארק חבלים, בריכה או International Drive)zday-24u(   יום 24 — 🌊 Volcano Bay + Expressu~   Volcano Bay / מים, מגלשות ויום רענון שנראה כמו פרסומת לחופשה. / Volcano Bay עם Express)zday-25u5   יום 25 — 🎃 רגוע + Halloween Horror Nightsuu   Universal HHN / היום מתחיל רגוע ונגמר בפנים לבנות. / מנוחה ביום ו־HHN בערב)zday-26u7   יום 26 — 🚗 Orlando → Sawgrass Mills → Miamiu   Sawgrass / Miami / מחליפים פארקים בשופינג, ואז ממשיכים ל מיאמי . / Sawgrass Mills והמשך ל מיאמי)zday-27u,   יום 27 — 🌴 Miami Chill Before Cruiseu   מיאמי / מיאמי מורידה הילוך בסטייל לפני הקרוז. / חוף, אווירה, התארגנות ונשימה עמוקה)zday-28u<   יום 28 — 🚢 החזרת רכב ועלייה לקרוזu   נמל מיאמי / הרכב חוזר, האונייה מתחילה. החופשה עוברת למצב צף. / עלייה לקרוז ותחילת פרק הים)zday-29u-   יום 29 — 🌊 קרוז – יום ים 1u   בלב הים / יום ים ראשון: בריכה, אוכל, סיפון ונוף בלי סוף. / יום חופשי על האונייה)zday-30u-   יום 30 — 🌊 קרוז – יום ים 2u   בלב הים / עוד יום ים, כי למה לעצור משהו שעובד? / מתקני האונייה, אוכל ומנוחה)zday-31u!   יום 31 — 🏝️ St. Maartenu   St. Maarten / הקריביים נכנסים לתמונה בצבעים שלא נראים חוקיים. / יום עגינה ב־ St. Maarten)zday-32u.   יום 32 — 🐬 St. Thomas + Dolphin Splashu   St. Thomas / יום שיכול להפוך לזיכרון משפחתי חזק במיוחד. / St. Thomas ואטרקציית דולפינים)zday-33u-   יום 33 — 🌅 קרוז – יום ים 3uw   בלב הים / עוד קצת ים כדי לא להיגמל מהר מדי. / יום ים, סיפון, אוכל ונוף)zday-34u,   יום 34 — 🏖️ Perfect Day at CocoCayu   CocoCay / שם מחייב — ובמקרה הזה הוא לגמרי מתכוון לזה. / CocoCay , חוף, מים טורקיז ופארק מים)zday-35uE   יום 35 — 🏨 ירידה מהקרוז + לילה ליד השדהu   מיאמי / החופשה מתחילה להתקפל, אבל לא שוברים בבת אחת. / ירידה מהקרוז, התארגנות ולילה ליד השדה)zday-36u1   יום 36 — 🛫 טיסה חזרה לישראלu   הביתה / היום הפחות אהוב, אבל עם אלבום מטורף בזיכרון. / עלייה לטיסה חזרה לישראל)r	  u3   💰 תקציב — המספרים, בלי דרמהu   תמונת מצב פיננסית / זה לא טיול קטן. זה פרויקט משפחתי עם נוף, פארקים, ים, שופינג וקרוז. / עלות כללית מוערכת: $81,297 ≈ ₪243,890)r  u;   🥂 סיום — אז לאן אתם באמת הולכים?u   טיול חלום משפחתי / אם מי שרואה את זה אומר “וואו” — הוא פשוט צודק. / מערב ארה״ב, אורלנדו, מיאמי וקרוז — בטיול אחדr  r  )r
  NN)r   r   )r   critical>   rh  rj  rk  rg  ri  )NNr  ))r  u   🏠	Dashboard)r  u   🎬r  )r  u   🔍r  )r  u   🚀
Deployment)r  u   📈r  )r  r
  u   בדיקת מוכנות)r   ))
trip_phoneu+   קובץ טיול — פלאפון/מחשבrK  )trip_tvu&   קובץ טיול — טלוויזיהr2  )presentation_phoneu4   מצגת — פלאפון/מחשב עם סכומיםrC  )presentation_tvu   מצגת — טלוויזיהr	  )netlify_tripu   Netlify — קובץ טיולznetlify-package:USA/index.html)netlify_presentationu(   Netlify — מצגת ללא סכומיםz-netlify-package:USA/usa2027-presentation.html>   r   r)   rC   r*   r,   r+   r
  r   i  i  @8)r(   r-   )r(   rO   )r)   r.   )r)   rG   )r*   r-   >   r;   r6   r2   r:   rB   .movr8   rA   r=   r4   r1   r9   .avifr3   r@   r5   >   r%   r!   r&  r$   r#   r'  r   r&   r"   r    r&  r$  >   r6   r2   r4   r1   rj  r3   r5   >   rB   ri  rA   r@   >   r;   r:   r8   r=   r9   >   r   rF  rD   rC   r
  r   rL  r  rM  .admin-backupsr?  )rA  z.backupz.oldr   z.origr  )r
  Nr   r   r   r   )r  F)g?(^  flaskr   r   r   r   r   r   r	   werkzeug.utilsr
   r   r   r   r
  r  rF  r  r  r	  r   r@  rI  rS  r  r   urllib.requestrK  r  r	  r  rK  r  r  r	  pathlibr   dataclassesr   r   r   typingr   r   r   r   r   r   r\  rL  r   r  &LEGACY_INSTALLER_COMPATIBILITY_MARKERSr   rU  r  r  r  rM  r   r   rM  ra  rN  rd  r  r  rC  rb  r   r  r  rw
  rx
  LOCAL_FILE_ALLOWED_ROOT_NAMESr
  r
  r  r
  r  r  r  rE  r  r  r  r  r(  r  r  r  r  r  rM  r  r  r  r  r=  r/  r0  r  r  r  USA_MEDIA_MANIFEST_NAMEr  r  r   rE  r   r   r  rH  rM  rN  rL  rZ  rO  r  r(  r)  rP  r  r  r  r  r  r  r  r  r  r  r  r  rl  rn
  r  r=  r  r  r(  USA_IMAGES_ZIP_MAX_BYTESUSA_IMAGES_ZIP_MAX_FILES%USA_IMAGES_ZIP_MAX_UNCOMPRESSED_BYTESr1  ADMIN_RESTART_CMD_PATHrS  r`  r  r  r   r  r  r  r  r  r  r+  r  r  r  r  r
  MEDIA_IMAGE_ACCEPTr   r   r  r  r  r  r  POWER_LABELSr  r  r   r   r   r   r   r  r  r  r  r>  r  r	  r  rs	  rg  rt	  r  r  ri  rh  r  r  r  r  r"	  r  r  r  r  r5	  rG	  r7	  r8	  r6	  r4	  r  r3	  r1  r6  r:  r@  rK  rO  rV  rb  rn  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r3  r:  r_  rh  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r.  r9  rB  rA  r@  IMAGE_EXTENSIONSr  r  r  r  MIN_IMAGE_SECONDSr  r  r[  rd  rp  rv  r~  r  r  r  r  rN  
IGNORECASEDOTALLr  r  r  r  r  r  r  r  r  r  r  r,  r,  r'  r-  r"  r<  rG  rP  r\  r  r`  ri  rk  rm  ro  rx  r  r  rO  r  r  r  rS  r  rP  r  r  r  r  r  r  r  r&  r9  r<  r\  r^  r  r  r   rh  after_requestrj  ro  rw  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r2  r<  r@  rI  rR  rT  rV  r[  r^  rh  rj  rz  r  r  r  r  r  r  r  r  r  r  r#  r/  r3  r>  rA  rE  rH  rO  rT  rZ  r^  ra  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r*  rD  rU  rl  rn  rr  rw  r~  r  r  r  rp	  r	  ro	  r	  r#	  r&	  r(	  r9	  rB	  rD	  rH	  rL	  rW	  rg	  rq	  rv	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r

  r
  r/
  r^  r2
  r9
  r<
  r
  r>
  r@
  rD
  rL
  rc
  re
  ru
  r~
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r  r  r  r  rS  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r  r  r  r  r$  r&  r(  r1  r3  r5  r7  r<  r>  r  r\  rf  r  rt  r  r  r  r  r  r  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r$  r	  r>  r,  r/  r1  r3  r5  r9  r;  r=  rw  rv  r  rP  r_  ru  rx  r  r1
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r	  r  r3  r6  r;  rH  rl  rB  rE  rL  rI  r\  re  rm  rp  rr  rt  rk  r  r  r  r'
  r4  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r;  r:  r7  rW  rO  r  r8  r9  rL  r>  r=  r  r  r   rG  rM  rP  r\  r^  rf  rj  rl  r:  rr  ru  rx  r  r  r  r  AUDIT_V91_REPORT_DIRr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r3  rI  re  rk  rp  r  r  r  r  r  r  r  r  r  r  r  r  r  r'  r8  r  r  r  r   r   r  r  r  r  r  r  r  r  r  r  r$  r(  r<  rR  rX  r]  rK  rO  rn  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r&  r(  r1  r<  rH  rJ  rc  r  r  rQ  r  rZ  rs  rN  rS  rU  rX  r\  re  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  TRIP_AUDIT_V100_SCHEMAr  r  r  r  r  r  r  r  "_v100_upload_japan_images_zip_baser  r  r  r  r  r  r  r  r  r  r  r  r  r  r2  r  r  r  r  r  r%  r5  r?  rK	  r)  r^  )r  s   0r   <module>r     s;   d c c * 	  
  	                   )  A AHo R 4 *T &==!45 

ggll8%56ggll;0NO WW\\+7PQ ww||K@ ggll;> 77<<-LM WW\\(4VW - WW\\(4PQ (*X?f(g %77<<%9PQ    !,l ;  E * ,   RWW\\(G,	277<<%(bggll8X.Xz2h4Xz2 N
 l^	L> ,/, I WW\\(E3DE  !D GGLL5/B "$+-35:<BDJLR
$&,.46<    # %, .4 6= ?E GN PV X^ 	 	 	  o > %z2 
  (! 
 -/  39  $ 
 8  8  g'97D\]rww||G-?J_`
 J  fk  lm  oq  fr  Ms  fr  ab  PT  UV  WZ  T[  N\  fr  Ms  sR ' +.BB b / != A "%bjjnn5UWZ[lWm&n"o bjjnn-QSVWhSijk '*2::>>:kmp  rD  nE  ,F  (G $&)"**..9ikn  pA  lB  +C  'D #  &EU"'',,w(:HE5.( 	*FH"'',,w(:HE51o . 
W0';LM
Wg'89
 
Wng7IJ
 " B/,-EF0  nt F1,-AB/  Qu FR"'',,uok.JKRWW\\Zbdst  eA  NB  C-  Nt FR"'',,uo>O.PQSUSZSZS_S_`hjy  {L  kM  TN  O.  Nt9%! V *- &)- &*- ' ' m T .   *; ')9 &.   *; ')9 & N  GGOOH- 77<<)^D ww||He5KL ( !0 +  (9 %'7 $h0JK h0CD GGLL3ST GGLL96FG  JJNN#<>Z[ 2 5v?UW]  `y  z16;KV  Vp  q'#FPjlr  ua  b 
    !$BJJNN3SU[$\ ] "2::>>2QSVWbSc#de !E  "M"**..A]_r2s2y2yz}2~  "MEE  "M"**..A]_r2s2y2yz}2~  "M  M RZZ^^,H#N^J_`a JJNN#A6J 

'I7S ] D  

'H#NTTV\\^  gB  B     # 
 %) ),BJJNN;mot,u(v % "

/QSV W ] ] _ e e g  pK  !K 		c	r
E.  :C@FFHNNPXss2::>>";SAB2::>>";VDEBJJNN#=uEFCC

/F LMNO
"c"c"**..9Y[_*`&abc 

/UW] ^_  #eJ&7 7  zz~~&FLRRTZZ\d ::>>*NPSTZZ\bbd  mH  H jjnn%ErJPPR jjnn%ErJPPR 

'I277<<X`buKvw 3r3rzz~~6TVZ'[#\]^ C#bjjnnEkms6t2u$vw zz~~&GP  X/AB X/HI h(9:ggll8-DE & 

'BOTZZ\oo`o (+BJJNN;fhm,n(o %ZZ^^,SUXY__aggi  rM  M $'

7egj(k$l !77<<2NO b-TSXZhjlntv|  O  QV  W OO% %,.WY_avx~  AC  %D . !%,.LfVkms  vP  %Q . !#*,Y[acvx~  Al  #m , 7"")	ED	1
1
F
8;

4^-`d>B ENF8CL(V8	
VNr>JB$:(V*
M$>85pm(={@B 6 F# #&66 '' 
> > $   $! ! ! $   $  ( (( ( $)Z )Z\ JJXMMBII  jj!I2==Y jj@"--RTR[R[B[\$ $f f>M Mcd
  1cd cdP  0  	 
EG 
{v FHw z. FH/ 4 q qh$  * &=
U
t0UO,Y68v^""0%P2yj,$1A" &-I !    q	N0b
9N4bQ
s4lJ
 >>#KKKd++ $ BGGLL2DgNY] ^ BGGLL2DhOZ^ _ BGGLL*G5GQ\` a BGGLL*G5GR]a b BGGLL)7H= M BGGLL)74FP[_ ` BGGLL)7NGLW[ \ BGGLL)7G<t L t ,  4 0 ' '
%*	# N+
4(
$28A(1Bh,3Bn)73>.84@ &*;|xv$@F

2M`;z8:Iz+\.Un 	%(VeD&:R	 )? , "8  4%
MN&V4	x xv Qh@>*!X Xvx xve eP +, .0 (**C*(2\jIK>("$pd; IE3RWW\\'+=xHGGLL"4g?WXGGLL"4g?TU
 	4 BH6RWW\\'+=xHGGLL"4g?WXGGLL"4g?TU
 	:  8d
S9( "zzDb@ !"0 #0 -.Y /Y 3F FV _q  a  _q  cB  _q  D{  _q  }^  _q  `K  _q  Mp   _q  r }%  _q  %L+  _q  N+x.  _q  z.v2  _q  x2g9  _q  i9K=  _q  M=Y@  _q  [@C  _q  ADtG  _q  vGJK  _q  LKBO  _q  DOnR  _q  pRWX  _q  YXC^  _q  E^Ta  _q  VaYe  _q  [eli  _q  niEm  _q  Gmfp  _q  hpDt  _q  Ft|w  _q  ~wJ{  _q  L{q~  _q  s~kA  _q  mAiD  _q  kDBH  _q  DHTK  _q  VKAO  _q  COJR  _q  LRMU  _q  OULX  _q  NXY[  _q  [[Q^  _q  S^ca  _q  ea_e  _q  aenh  _q  phFm  _q  Hm^q  _q %fv:z	BJ4	>Fa
	K,,$cN'R 89i  iZ0 &'- (- 1F8D% E%P $`"{|&P!H0l  _ !_ ()U *U '(h )h: $ufo>!t ?!tH &9T :T8 %x8c 9c$ $vh7]N 8]N@ #fX6$ 7$
 $ $ "#L $L 74 4 <K K 9  >  ?! ! ?! !
   =  Q Q 1[ 2[ x0> 1> $%a &a () *" ?& & &' ( !F84
e 5
e ?! !  ! " !"4 #4  "VH5M 6M ?VH-N .N$ M M >F8,e -e !"x #x $%~ &~, &2D 3D !F84
{ 5
{  6(3z 4z  `
 !`
 /0Q 1Q !F84XS 5XSv "VH5p 6p )F8<J =J0 "@ %> "!#,S!T %H "", $9 !   1.6M4 ,63j WW\\'*"57MN gj&9;QR K %&H 'H*&2h &9B :B
 x0} 1}( 4vhGM HM  86(KR LR& 11% 2 2%P #fX6"VH5"G 6 7"GJ /&BX CX  ;fXN@ O@
 ,vh?u @u0 %x8h 9h. +, -4 (6(;f <f2 *VH=y >y@ vh/x 0x4 ?VH- . 89   67   9:   ;<!  ! <="  "  7 !7 5 5  !8 "8 "#: $: ;<!  ! #$; %; "#: $:
 ' $' !%( "( " *T &'T
lKR ,-Y .Y (  G
aTT;
	@.}~Pp\f &' ; (  ;#$ 5 % 5  - ! -'( = ) =&' ; ( ;"# 3 $ 3()V *V '(t )t
! 5p##N.b 1E&>J K* GGLL3PQ '* $"&R.%PT&!H,** &8 9" +fX>1 ?10 3^ /   JJIDD * +, - 77<<2IJ ~ 0T
."e*U6 #$f %f$nb"
r8 .J *0 5 2 WW\\(E;TU GGLL9>OP '',,x1JK ,  (9 %#*  
 8'BGGLLQXY^Q_amDnCoqw  zE  Fw(WY`cecjcjcocopwx}p~  A\  d]  c^  `f  h{  |GPRY\^\c\c\h\hipqyiz  }N  ]O  \P  RX  Ze  fG%OQX[][b[b[g[ghopxhy  |Z  \[  [\  ^d  fy  z76"'',,wW^O_amBnAoqw  zE  F7$5wgV]N^`wAx@y  |B  DW  X7$>"'',,W^_fWg  jC  KD  JE  GM  Ob  cDgPRPWPWP\P\]deo]pr~P  PA  CI  KQ  R'GSUSZSZS_S_`ghs`t  wC  TD  SE  GM  OU  V8'BGGLLQXYcQdfrDsCtv|  E  F!A7RWW\\ZabgZhjy  {F  kG  NH  JL  JQ  JQ  JV  JV  W^  _g  Wh  jy  zE  jF  JG  MH  JP  RY  Z!A7RWW\\ZabgZhjy  {L  kM  NN  PR  PW  PW  P\  P\  ]d  em  ]n  p  @Q  pR  PS  MT  V\  ^e  fW5whXiAj@kms  vD  FR  TX  Y " !"z  C  #2LdN"-+5\N*$-j
 '(: ): ,vh?k @k "#
2 $
2 *VH=? >?< (6(;#6 <#6V 0 ww||He_E ww||HfoF &:<YZ "'',,x6"'',,xX`Bacmoqovovo{o{  }E  FP  pQ  R%B0E*  L v K 4 :  K D ,
z
 !%HK;7t4ynm`*ZZ!H8	\@I$! "#D $D
 ()p *p
 /0[ 1[ *+ , '(O )Oi .H  + , ggll8-HI !ww||H6TU  ggoobggll8EV.WX --(;< %&78))*;<(9:/(
67t/dHV1nCBL(1 h$<]@JB a a:  ! " &' (
 %  / (V / p / D $$((1 %< ! $;  * (  7 ,C  ( )4S  0 1"/  ;  7 '',,x1NO ggll8-FG "  WU^\:bggll75>;VW277<< 13DE277<<(9;YZ	 D#
BZ.Tn40 2 D %A !* '( ) "#	- $	- %8 !CL --11': ` (  7  : GGLL5:NO GGLL6;OP  ggll85OP 23 01 8
<B0L+^|~8lz:.b	? 
A  
A %&@ '@ +,E -E 23L 4L, -.
i /
i *+
d ,
d ))--g6  (  7  <  "XyBW X GGLL6;]^ /d-f "%!3!3!7!78M!N y& -E  ( ) "%!3!3!7!78M!N f4 -E  ( ) &)%7%7%;%;<U%V "h. 1M  , - 3fXFs Gs +,Q -QI" 5Q  0 1
7=D?<@1J  - .1I  - .8Q  4 53M  / 00G  , -6Q  2 3 **..w7  )  7  / !J"\  WW\\+7NO 77<<5NO  Sl $-
(=#~ "? $cVJ / 3n z 45 9:"$30 eg;+ egGG*t%GP! Iy Msjd  
  s7   -CRr
CR r:CR+ RCR(R'CR(R+CR>R=CR>