{
  "version": 3,
  "sources": ["/cdn/shop/t/9/assets/cp-pierre-angle.js?cb=140727448"],
  "sourcesContent": ["/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   CR\u00C9APANEL \u2014 assets/cp-pierre-angle.js (charg\u00E9 par sections/custom-configV2 quand la r\u00E8gle du produit coche \u00AB pi\u00E8ce\n   d'angle \u00BB ou \u00AB \u00EElot \u00BB ; les \u00AB bouts libres \u00BB n'agissent qu'avec l'une des deux)\n   PLAN EN L ET EN U AVEC LA PI\u00C8CE D'ANGLE 105 \u00D7 105 DU TARIF\n   - Le tarif vend, en plus du plan droit au ml, une pi\u00E8ce d'angle 105 \u00D7 105 \u00E0 la pi\u00E8ce (prix par groupe de d\u00E9cor :\n     m\u00E9tachamp de variante custom.prix_piece_angle, expos\u00E9 par la section dans window.CP_PIECE_ANGLE, cl\u00E9 = titre\n     de la variante). Ni coupe \u00E0 45\u00B0, ni jonction droite, ni p\u00E9ninsule : pas de G.\n   - Composition : une pi\u00E8ce d'angle par coin ; pi\u00E8ces droites = c\u00F4t\u00E9 hors tout \u2212 1 050 mm \u00E0 chaque bout qui touche\n     une pi\u00E8ce d'angle, au prix de la variante (facturation minimale 0,3 ml du tarif).\n   - Prix : le moteur facture la somme de ses pi\u00E8ces (L et U : carr\u00E9 du coin compt\u00E9 une fois). Suppl\u00E9ment =\n     composition \u2212 prix de base du moteur, au centime : total = composition.\n   - Bornes : profondeur 600 \u00E0 700 mm, la m\u00EAme sur toutes les branches ; pi\u00E8ce droite absente ou d'au moins 300 mm,\n     soit un c\u00F4t\u00E9 de 1 050 mm tout juste ou de 1 350 \u00E0 3 160 mm, un fond de U de 2 100 mm tout juste ou de 2 400 \u00E0\n     3 160 mm ; angles \u00E0 90\u00B0. Hors bornes : ajout au panier bloqu\u00E9, avec le motif.\n   - G : \u00AB Forme en G : sur devis \u00BB, sans prix, ajout bloqu\u00E9, lien vers le contact ; \u00AB sur devis \u00BB d\u00E8s le menu Forme.\n   - Sans prix de pi\u00E8ce d'angle pour la variante : L et U d\u00E9sactiv\u00E9s (sur devis), aucun prix affich\u00E9 pour eux.\n   - Commande : propri\u00E9t\u00E9 cach\u00E9e \u00AB _composition \u00BB (pi\u00E8ces \u00E0 d\u00E9couper, num\u00E9rot\u00E9es dans l'ordre de la d\u00E9coupe) pour\n     l'atelier ; sous le dessin, \u00AB D\u00E9coupe : \u00BB les m\u00EAmes pi\u00E8ces, sans num\u00E9ro, et \u00AB Composition \u00BB (visible) ce m\u00EAme texte.\n   - Dessin : les pi\u00E8ces livr\u00E9es (pi\u00E8ce d'angle 1 050 \u00D7 1 050 depuis le coin, avec son d\u00E9cor), sans trait de joint ni\n     num\u00E9ro ; ni ligne ni choix de jonction (la pi\u00E8ce d'angle n'en a pas).\n   - Fen\u00EAtres de cote : les vraies plages dans le titre (c\u00F4t\u00E9, fond, profondeur).\n   - \u00CELOT (droit, L ou U de 701 \u00E0 1 400 mm) : dalle finie sur ses 4 chants, au m\u00B2 ; chants compris et verrouill\u00E9s. En L et\n     en U : pi\u00E8ces taill\u00E9es chacune dans la dalle, assembl\u00E9es bord \u00E0 bord (jonction droite), surface compt\u00E9e une fois au\n     coin ; pas de pi\u00E8ce d'angle ; d\u00E9coupe et jonctions en texte sous le dessin et dans la \u00AB Composition \u00BB.\n   - BOUTS LIBRES (droit, L, U, G en option, hors \u00EElot) : la case du bout = son chant (fini droit / sans finition) ; coin\n     arrondi et hors \u00E9querre au carr\u00E9 vert de ses coins, la finition du hors \u00E9querre sur la case ; prix et bornes des\n     r\u00E9glages de la r\u00E8gle ; propri\u00E9t\u00E9 \u00AB Bouts \u00BB pour les bouts finis ou usin\u00E9s (d\u00E9tail plus bas, \u00AB Bouts libres \u00BB).\n   - CHANT ARRI\u00C8RE DU PLAN DROIT (r\u00E9glage de la r\u00E8gle, \u00AB d\u00E8s \u2026 mm \u00BB) : de cette profondeur au seuil de l'\u00EElot, le plan avec\n     son arri\u00E8re est fini sur 4 c\u00F4t\u00E9s, au prix de l'\u00EElot au m\u00B2 (surface, longueur factur\u00E9e au minimum du plan), 4 chants\n     compris, sans le mot \u00AB \u00EElot \u00BB pour le client. Sous la plus petite tranche, arri\u00E8re impos\u00E9 ; dans les tranches, case du\n     chant arri\u00E8re au choix. L, U et G : jamais sous la plus petite tranche.\n   - PI\u00C8CE D'ANGLE EN OPTION (case de la r\u00E8gle) : en L et en U, des plans droits joints par d\u00E9faut, chacun au prix de la\n     tranche de sa profondeur, factur\u00E9 \u00E0 la longueur minimale de la r\u00E8gle au moins ; jonction droite comprise, angle hors\n     d'\u00E9querre possible (suppl\u00E9ment de la r\u00E8gle) ; la pi\u00E8ce d'angle se choisit coin par coin dans la carte de jonction\n     (90\u00B0 seulement), avec son prix ; \u00AB Composition \u00BB donne les plans et la jonction de chaque coin.\n   - R\u00C9GLAGES : c\u00F4t\u00E9s, bornes, seuils, formes et prix se r\u00E8glent dans le bloc \u00AB R\u00E8gle par collection \u00BB de l'\u00E9diteur (pi\u00E8ce\n     d'angle, \u00EElot, bouts libres, bornes) ; prix par variante : pi\u00E8ce d'angle et \u00EElot au m\u00B2 (m\u00E9tachamps). Les valeurs\n     cit\u00E9es ci-dessus sont celles de la r\u00E8gle Pierre.\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\n(function () {\n  'use strict';\n\n  /* \u2500\u2500 R\u00E9glages de la r\u00E8gle du produit (bloc \u00AB R\u00E8gle par collection \u00BB de l'\u00E9diteur ; custom-configV2 les \u00E9crit dans\n     CONFIGURATOR_CONFIG.collectionRules : pieceAngle, ilot, bouts, pieceMaxMm), relus \u00E0 chaque rendu. Le module n'est charg\u00E9\n     que si la r\u00E8gle coche l'une de ses cases ; sans r\u00E8gle lue, il reste neutre. Prix par variante : CP_PIECE_ANGLE, CP_ILOT_M2. \u2500\u2500 */\n  var PA_ON = true, PIECE = 1050, MIN_DROIT = 300, P_MIN = 600, P_MAX = 700, BR_MAX = 3160;   /* pi\u00E8ce d'angle ; au-del\u00E0 de P_MAX, l'\u00EElot */\n  var PA_PMAX = 700;   /* profondeur maximale AVEC pi\u00E8ce d'angle (r\u00E9glage de la r\u00E8gle) ; P_MAX : celle des formes en plans joints */\n  var BR_DECOR = null;  /* { l, nom } quand la longueur du d\u00E9cor choisi borne les pi\u00E8ces (plus court que BR_MAX de la r\u00E8gle) */\n  function borneDecor() { return BR_DECOR ? ' ; le d\u00E9cor \u00AB ' + BR_DECOR.nom + ' \u00BB se fabrique jusqu\\'\u00E0 ' + fmtMm(BR_DECOR.l) + ' mm de long' : ''; }   /* R2 (COMMERCIAL, AUDIT Tour 639), comme L2 */\n  var PA_OPT = false, MIN_PLAN = 300, MIN_M2 = 0;   /* pi\u00E8ce d'angle en option (plans joints par d\u00E9faut) ; longueur minimale factur\u00E9e d'un plan joint ; surface minimale factur\u00E9e (m\u00B2) */\n  var PA_PROP = true;                   /* pi\u00E8ce d'angle propos\u00E9e au client (r\u00E9glage) ; non : plans joints partout, sans pi\u00E8ce d'angle */\n  var ILOT_ON = false, ILOT_MIN = 701, ILOT_MAX = 1400, ILOT_MIN_ML = 300, ILOT_FORMES = { linear: true, angle: true, 'u-shape': true }, ILOT_CHANTS = true;   /* ILOT_ON faux tant que la r\u00E8gle n'est pas lue (AUDIT 20:48) */\n  var ARR_MM = 0, FINI4 = 'Plan fini sur 4 c\u00F4t\u00E9s (chant arri\u00E8re)';   /* plan droit : chant arri\u00E8re d\u00E8s ARR_MM, au prix de l'\u00EElot (0 : sans) */\n  var ARR_GAMME = '';                                                   /* R182-a : c\u00F4t\u00E9s finis d'office avec le chant arri\u00E8re, pour cette gamme */\n  var ARR_DES = 0;                                                      /* R182-b : chant arri\u00E8re propos\u00E9 d\u00E8s ARR_DES, au prix au m\u00E8tre de ARR_MM (0 : sans) */\n  var ARR_COMPRIS = '4 chants compris';   /* A-296 : \u00AB chant arri\u00E8re compris \u00BB quand la r\u00E8gle ne comprend pas tous les chants */\n  var PROF_ML = 0;   /* \u00AB Profondeur minimale vendue au m\u00E8tre \u00BB de la r\u00E8gle : remplace la plus petite tranche quand les variantes n'en ont pas */\n  var BOUTS_ON = true, PRIX_BOUT = { fini: 59, oblique: 99, arrondi: 49, hors: 69 };\n  var FINI_CHANT = false;\n  var FINI_COMPRIS = false;   /* \u00AB Bout fini droit compris \u00BB : d\u00E9part \u00AB Fini droit \u00BB \u00E0 0 \u20AC, sans \u00AB Sans finition \u00BB */\n  var FACON_FINI = false;     /* D11 (\u00AB Bout fa\u00E7onn\u00E9 : finition lat\u00E9rale due \u00BB) */\n  var MASQUE = 'aucun';       /* \u00AB Cases de chant masqu\u00E9es \u00BB de la r\u00E8gle ; \u00AB hors_avant_cotes \u00BB en L, U, G : avants et bouts seuls */\n  var CONTACT = '/pages/contact';\n\n  function getApp() { try { return (typeof App !== 'undefined') ? App : window.App; } catch (e) { return window.App; } }\n  function num(v) { var n = Number(v); return isFinite(n) ? n : 0; }\n  function fmt(c) { return (c / 100).toFixed(2).replace('.', ',').replace(/\\B(?=(\\d{3})+(?!\\d))/g, '\u00A0'); }\n  function fmtMm(v) { return String(Math.round(num(v))).replace(/\\B(?=(\\d{3})+(?!\\d))/g, '\u00A0'); }\n  /* prix au m\u00B2 : entier comme avant (\u00AB 1 089 \u00BB) ; d\u00E9cimales gard\u00E9es, 4 au plus (A-296 : \u00AB 854,4444 \u00BB, le prix au m\u00E8tre \u00F7 0,9) */\n  function fmtM2(v) { var p = num(v).toFixed(4).replace(/0+$/, '').replace(/\\.$/, '').split('.'); return fmtMm(p[0]) + (p[1] ? ',' + p[1] : ''); }\n  function regle(A) {\n    var id = Number(A && A._eff && A._eff.matchedCollectionId) || 0, rs = (window.CONFIGURATOR_CONFIG && window.CONFIGURATOR_CONFIG.collectionRules) || [];\n    for (var i = 0; i < rs.length; i++) if (Number(rs[i].collectionId) === id) return rs[i];\n    return null;\n  }\n  function lireRegle(A) {\n    var r = regle(A);\n    if (!r || !r.pieceAngle) { PA_ON = false; ILOT_ON = false; BOUTS_ON = false; FINI_CHANT = false; FACON_FINI = false; MASQUE = 'aucun'; return; }   /* pas de r\u00E8gle lue : neutre */\n    var pa = r.pieceAngle, il = r.ilot || {}, bo = r.bouts || {}, e = A._eff || {};\n    MASQUE = r.chantsMasques || 'aucun';\n    PA_ON = pa.on === true; PIECE = num(pa.coteMm) || 1050; MIN_DROIT = num(pa.droitMinMm); PA_PMAX = num(pa.profMaxMm) || 700; P_MAX = PA_PMAX;\n    PA_PROP = pa.proposee !== false;\n    PA_OPT = PA_ON && (pa.option === true || !PA_PROP); MIN_PLAN = num(r.factureMinMm) || 300;   /* pi\u00E8ce d'angle non propos\u00E9e : plans joints */\n    MIN_M2 = num(r.factureMinM2);                                      /* D9b : surface minimale factur\u00E9e (m\u00B2), 0 : aucune */\n    PROF_ML = num(il.profMlMinMm);\n    P_MIN = Math.max(num(e.depthLimits && e.depthLimits.min) || 600, trancheMin(A));   /* L et U : jamais sous la plus petite tranche */\n    BR_MAX = num(r.pieceMaxMm) > 0 ? num(r.pieceMaxMm) : (num(e.lengthLimits && e.lengthLimits.max) || 3160);   /* 0 : \u00AB Longueur max \u00BB de la r\u00E8gle */\n    /* A-275 : chaque pi\u00E8ce aussi born\u00E9e par la longueur du d\u00E9cor choisi (custom.dimensions_max_mm, CP_DMAX : cl\u00E9 = titre\n       de la variante, comme dmaxCheck de cp-modele pour le plan droit) */\n    BR_DECOR = null;\n    try {\n      var vd = A.getSelectedShopifyVariant ? A.getSelectedShopifyVariant() : null, dm = vd && window.CP_DMAX && window.CP_DMAX[vd.title];\n      if (dm && num(dm.l) > 0 && num(dm.l) < BR_MAX) { BR_MAX = num(dm.l); BR_DECOR = { l: BR_MAX, nom: vd.option1 || vd.title }; }\n    } catch (x) {}\n    ILOT_ON = il.on === true; ILOT_MIN = num(il.deMm) || 701; ILOT_MAX = num(il.aMm) || 1400; ILOT_MIN_ML = num(il.minMm);\n    ILOT_FORMES = { linear: il.droit === true, angle: il.l === true, 'u-shape': il.u === true }; ILOT_CHANTS = il.chants === true;\n    ARR_MM = num(il.arriereMm);\n    ARR_GAMME = nomDecor(il.arrCotesGamme);\n    ARR_DES = num(il.arriereDesMm);\n    /* A-296 : r\u00E8gle sans \u00AB chants compris \u00BB (rule_ilot_chants) : seul l'arri\u00E8re est compris, les c\u00F4t\u00E9s restent au choix ;\n       R182-b (COMMERCIAL, \u00AB R\u00E8gle finale \u00BB) : au prix au m\u00E8tre de la profondeur du tarif, \u00AB Plan fini devant et derri\u00E8re \u00BB */\n    FINI4 = ILOT_CHANTS ? 'Plan fini sur 4 c\u00F4t\u00E9s (chant arri\u00E8re)' : arrTarif() ? 'Plan fini devant et derri\u00E8re' : 'Plan avec chant arri\u00E8re';\n    ARR_COMPRIS = ILOT_CHANTS ? '4 chants compris' : 'chant arri\u00E8re compris';\n    /* formes en plans joints : avec l'\u00EElot, au-del\u00E0 de la pi\u00E8ce d'angle commence l'\u00EElot (pierre : P_MAX = PA_PMAX, comme\n       avant) ; sans \u00EElot, jusqu'\u00E0 la profondeur maximale de la r\u00E8gle (A-273 : HPL en 90 cm, pi\u00E8ce d'angle seulement \u00E0 630) */\n    /* A-296 : \u00EElot sans L ni U (HPL : le plan droit avec son arri\u00E8re seulement) : les formes, comme sans \u00EElot */\n    if (!ILOT_ON || !(ILOT_FORMES.angle || ILOT_FORMES['u-shape'])) P_MAX = Math.max(PA_PMAX, num(e.depthLimits && e.depthLimits.max) || PA_PMAX);\n    /* chants compris : impos\u00E9s par le moteur d\u00E8s le seuil de l'\u00EElot, ou d\u00E8s la profondeur du plan quand son arri\u00E8re est choisi */\n    if (ILOT_ON && ILOT_CHANTS && A._eff) A._eff.forceBandingFromDepth = arriere(A) ? Math.min(ILOT_MIN, num(A.S.P)) : ILOT_MIN;\n    /* AUDIT Tour 1223, ADMIN Tour 1043 : en plans joints, la profondeur se r\u00E8gle pi\u00E8ce par pi\u00E8ce ; le seuil du moteur reste \u00E0 0\n       \u00E0 chaque lecture de la r\u00E8gle, le compte des options compris (updateTdOptionsList : son isChantForcedByDepth rangeait une\n       case libre, backLeftTopG \u00E0 P1 900, avec la pi\u00E8ce profonde, et ne la facturait pas) */\n    if (parPiece(A) && A._eff) A._eff.forceBandingFromDepth = 0;\n    verrouArr(A);\n    BOUTS_ON = bo.on === true;   /* bouts : avec la pi\u00E8ce d'angle ou l'\u00EElot (pierre : chants remis \u00E0 z\u00E9ro), ou seuls (case du bout remplac\u00E9e) */\n    FINI_CHANT = bo.finiSource === 'chant';   /* fini droit = la case de chant du bout, au prix du chant de la r\u00E8gle (selon la profondeur) */\n    PRIX_BOUT = { fini: num(bo.finiEur), oblique: num(bo.obliqueEur), arrondi: num(bo.arrondiEur), hors: num(bo.biaisEur) };\n    FINI_COMPRIS = bo.finiCompris === true;\n    FACON_FINI = bo.faconFini === true;   /* D11 : bout fa\u00E7onn\u00E9 (arrondi, en biais, demi-rond) : finition lat\u00E9rale due */\n    /* prix selon l'\u00E9paisseur choisie (\u00AB 20=69,40=139 \u00BB) ; \u00E9paisseur absente : prix ci-dessus. Bout fini droit : 0 = compris ;\n       gr\u00E8s (R15, AUDIT Tour 822) : bout oblique \u00AB 26=139 \u00BB et bout arrondi \u00AB 26=0 \u00BB, 0 = non propos\u00E9 (un type sans prix) */\n    var te = num(A.S && A.S.thk), parEp = function (s) {\n      var o = {}; String(s || '').split(',').forEach(function (x) { var p = x.split('='); if (p.length === 2 && num(p[0]) > 0 && p[1].trim() !== '') o[num(p[0])] = num(p[1]); });\n      return o;\n    };\n    var fpe = parEp(bo.finiParEp), ope = parEp(bo.obliqueParEp), ape = parEp(bo.arrondiParEp);\n    if (te && fpe[te] !== undefined) { PRIX_BOUT.fini = fpe[te]; if (fpe[te] === 0) FINI_COMPRIS = true; }\n    if (te && ope[te] !== undefined) PRIX_BOUT.oblique = ope[te];\n    if (te && ape[te] !== undefined) PRIX_BOUT.arrondi = ape[te];\n    COTE.oblique.min = num(bo.obliqueMinMm) || 50; COTE.oblique.max = num(bo.obliqueMaxMm) || 600;\n    COTE.arrondi.min = num(bo.arrondiMinMm) || 30; COTE.arrondi.max = num(bo.arrondiMaxMm) || 300;\n    COTE.hors.min = num(bo.biaisMinDeg) || 85; COTE.hors.max = num(bo.biaisMaxDeg) || 95;\n    /* R180 : r\u00E9glage \u00AB Selon l'\u00E9paisseur \u00BB de la r\u00E8gle (cp-modele, CP_parEp) : en 180, ni pi\u00E8ce d'angle, ni \u00EElot, ni bouts fa\u00E7onn\u00E9s */\n    var qe = typeof window.CP_parEp === 'function' ? window.CP_parEp(A) : null;\n    if (qe) { if (qe.piece_angle === 'non') { PA_ON = false; PA_OPT = false; } if (qe.ilot === 'non') ILOT_ON = false; if (qe.bouts_libres === 'non') BOUTS_ON = false; }\n  }\n  function paTxt() { var c = fmtMm(PIECE / 10); return c + ' \u00D7 ' + c; }   /* \u00AB 105 \u00D7 105 \u00BB (cm), le c\u00F4t\u00E9 de la pi\u00E8ce d'angle */\n  /* L, U et G en pierre : seulement si la r\u00E8gle fait les angles avec une pi\u00E8ce d'angle */\n  function forme(A) { var l = A && A.S && A.S.layout; return PA_ON && (l === 'angle' || l === 'u-shape' || l === 'g-shape') ? l : null; }\n\n  /* \u2500\u2500 Pi\u00E8ce d'angle EN OPTION (r\u00E9glage \u00AB Pi\u00E8ce d'angle en option \u00BB de la r\u00E8gle) : en L et en U, des plans droits joints\n     par d\u00E9faut, bord \u00E0 bord, selon la jonction du moteur (\u00AB retour filant \u00BB ou \u00AB plan filant \u00BB ; \u00AB jambe filante \u00BB ou\n     \u00AB fond filant \u00BB) ; chaque plan au prix de la tranche de SA profondeur (variante du m\u00EAme d\u00E9cor et de la m\u00EAme \u00E9paisseur),\n     factur\u00E9 MIN_PLAN au moins (\u00AB Longueur minimale factur\u00E9e \u00BB de la r\u00E8gle). La pi\u00E8ce d'angle se choisit coin par coin,\n     dans la carte de jonction : 90\u00B0 et PA_PMAX au plus ; un plan qui touche une pi\u00E8ce d'angle garde le minimum MIN_DROIT.\n     Sans ce r\u00E9glage : la pi\u00E8ce d'angle \u00E0 chaque coin, comme avant. \u2500\u2500 */\n  var COINS = { angle: ['L'], 'u-shape': ['g', 'd'], 'g-shape': ['top', 'mid', 'ret'] };\n  function enOption(A) { var l = A && A.S && A.S.layout; return PA_OPT && (l === 'angle' || l === 'u-shape' || l === 'g-shape'); }\n  function paCoin(A, c) {\n    var l = A.S.layout; if (!(l === 'angle' || l === 'u-shape' || l === 'g-shape')) return false;\n    if (!PA_OPT) return l !== 'g-shape';\n    if (!PA_PROP) return false;                                           /* pi\u00E8ce d'angle non propos\u00E9e (r\u00E9glage de la r\u00E8gle) */\n    if (profForme(A) > PA_PMAX) return false;                             /* au-del\u00E0 : pi\u00E8ces bord \u00E0 bord, pas de pi\u00E8ce d'angle */\n    var m = A.S.cpPA && A.S.cpPA[l]; return !!(m && m[c]);\n  }\n  /* angle de chaque coin (85 \u00E0 95\u00B0) : L S.innerAngle ; U et G : S.cpAng[forme][coin] */\n  function angleCoin(A, c) {\n    var S = A.S; if (S.layout === 'angle') return num(S.innerAngle) || 90;\n    return num(((S.cpAng && S.cpAng[S.layout]) || {})[c]) || 90;\n  }\n  /* G : les 4 pi\u00E8ces de cp-modele (CP_geomG, selon la jonction et l'angle de chaque coin), longueur le long de leur axe ;\n     une pi\u00E8ce d'angle \u00E0 un coin (90\u00B0) prend PIECE \u00D7 PIECE depuis le coin ext\u00E9rieur : la pi\u00E8ce qui tenait le coin perd\n     PIECE, l'autre perd PIECE moins la profondeur de la premi\u00E8re */\n  function plansG(A) {\n    var S = A.S, K = PIECE; if (typeof window.CP_geomG !== 'function' || typeof window.CP_gParams !== 'function') return null;\n    var gp = window.CP_gParams(S), g = window.CP_geomG(gp), R = gp.dir !== 'left'; if (!g || !g.pieces) return null;\n    var lon = function (p) { var ds = p.pts.map(function (q) { return q[0] * p.axis[0] + q[1] * p.axis[1]; }); return Math.round(Math.max.apply(null, ds) - Math.min.apply(null, ds)); };\n    var mm = {}; g.pieces.forEach(function (p) { mm[p.id] = lon(p); });\n    var P = { gauche: R ? num(S.Pgleft) : num(S.Pgright), haut: num(S.Pgtop), droite: R ? num(S.Pgright) : num(S.Pgleft), retour: num(S.Pgreturn) };\n    var porteur = R ? 'droite' : 'gauche', jn = typeof window.CP_jnG === 'function' ? window.CP_jnG(S) : {};\n    /* coin -> [pi\u00E8ce qui le tient, autre pi\u00E8ce] selon la jonction ('barre' : le plan du haut au coin haut gauche, le montant\n       au coin haut droite, le retour au coin du retour) */\n    var tient = {\n      top: jn.top === 'barre' ? ['haut', 'gauche'] : ['gauche', 'haut'],\n      mid: jn.mid === 'barre' ? ['droite', 'haut'] : ['haut', 'droite'],\n      ret: jn.ret === 'barre' ? ['retour', porteur] : [porteur, 'retour']\n    };\n    var pa = {}, n = 0;\n    COINS['g-shape'].forEach(function (c) {\n      if (!paCoin(A, c)) return; pa[c] = true; n++;\n      var t = tient[c]; mm[t[0]] -= K; mm[t[1]] -= (K - P[t[0]]);\n    });\n    var touche = function (id) { return COINS['g-shape'].some(function (c) { return pa[c] && tient[c].indexOf(id) >= 0; }); };\n    /* lot \u00AB messages 2 \u00BB, N28 : \u00AB plan du haut \u00BB ; la jonction nomme la tuile choisie (\u00AB Montant filant \u00BB, \u00AB Plan filant \u00BB,\n       \u00AB Retour filant \u00BB, cp-jonction) */\n    var NOMS = { gauche: 'montant gauche', haut: 'plan du haut', droite: 'montant droit', retour: 'retour' };\n    var FILANT = { gauche: 'montant', haut: 'plan', droite: 'montant', retour: 'retour' };\n    var COIN = { top: 'en haut \u00E0 gauche', mid: 'en haut \u00E0 droite', ret: 'au retour' };\n    return { pa: n, ouvert: g.opening > 0, pieces: ['gauche', 'haut', 'droite', 'retour'].map(function (id) { return { nom: NOMS[id], id: id, mm: Math.max(0, mm[id]), P: P[id], pa: touche(id), arr: fini4(A, id), ilot: partieIlot(A, id) }; }),   /* ilot : A-313 */\n      jonctions: COINS['g-shape'].map(function (c) { return pa[c] ? '' : COIN[c] + ' : ' + ((S.cpJ45G && S.cpJ45G[c]) ? 'coupe \u00E0 45\u00B0' : 'jonction droite, ' + FILANT[tient[c][0]] + ' filant'); }) };   /* A-274 : la coupe \u00E0 45\u00B0 du coin, comme en L et en U ; A-345 : la pi\u00E8ce d'angle est dite dans la liste des pi\u00E8ces */\n  }\n  function nbPA(A) { return (COINS[A.S.layout] || []).filter(function (c) { return paCoin(A, c); }).length; }\n  function toutPA(A) { var cs = COINS[A.S.layout] || []; return cs.length > 0 && nbPA(A) === cs.length; }\n  /* plans joints (et pi\u00E8ces d'angle choisies) : longueur de chaque plan selon la jonction de chaque coin, sa profondeur.\n     Coupe \u00E0 45\u00B0 (cp-jonction : S.cpJ45 en L, S.cpJ45U[g|d] en U) : les deux pi\u00E8ces vont jusqu'\u00E0 l'angle ext\u00E9rieur, chacune\n     factur\u00E9e sur son grand c\u00F4t\u00E9 ; une pi\u00E8ce d'angle choisie au m\u00EAme coin l'emporte */\n  function plans(A) {\n    var S = A.S, K = PIECE;\n    if (S.layout === 'angle') {\n      var L1 = num(S.L1), P1 = num(S.P1), P2 = num(S.P2), R = num(S.L2) + P1, pa = paCoin(A, 'L'), ov = S.junctionType === 'overlap', o45 = !pa && !!S.cpJ45;\n      return { pa: pa ? 1 : 0, pieces: [\n        { nom: 'plan principal', id: 'plan', mm: pa ? L1 - K : (o45 || ov ? L1 : L1 - P2), P: P1, pa: pa, arr: fini4(A, 'plan'), ilot: partieIlot(A, 'plan') },   /* arr : A-299 cas 2 et 3 ; A-416 : \u00AB Plan principal \u00BB ; ilot : A-429 */\n        { nom: 'retour', id: 'retour', mm: pa ? R - K : (o45 ? R : (ov ? R - P1 : R)), P: P2, pa: pa, arr: fini4(A, 'retour'), ilot: partieIlot(A, 'retour') }],\n        jonctions: [pa ? '' : o45 ? 'coupe \u00E0 45\u00B0' : 'jonction droite, ' + (ov ? 'plan filant' : 'retour filant')] };   /* pi\u00E8ce d'angle : dite dans la liste des pi\u00E8ces */\n    }\n    if (S.layout === 'u-shape') {\n      var Pc = num(S.Pc), Pl = num(S.Pl), Pr = num(S.Pr), W = Pl + num(S.Lc) + Pr, G = Pc + num(S.Lg), D = Pc + num(S.Ld);\n      var pg = paCoin(A, 'g'), pd = paCoin(A, 'd'), og = S.junctionLeftU === 'overlap', od = S.junctionRightU === 'overlap';\n      var u45 = S.cpJ45U || {}, g45 = !pg && !!u45.g, d45 = !pd && !!u45.d;\n      var j = function (p, o, c45) { return c45 ? 'coupe \u00E0 45\u00B0' : 'jonction droite, ' + (o ? 'fond filant' : 'jambe filante'); };\n      return { pa: (pg ? 1 : 0) + (pd ? 1 : 0), pieces: [\n        { nom: 'jambe gauche', id: 'gauche', mm: pg ? G - K : (og && !g45 ? G - Pc : G), P: Pl, pa: pg, arr: fini4(A, 'gauche'), ilot: partieIlot(A, 'gauche') },   /* ilot : A-429 */\n        { nom: 'fond', id: 'fond', mm: W - (pg ? K : (og || g45 ? 0 : Pl)) - (pd ? K : (od || d45 ? 0 : Pr)), P: Pc, pa: pg || pd, arr: fini4(A, 'fond'), ilot: partieIlot(A, 'fond') },\n        { nom: 'jambe droite', id: 'droite', mm: pd ? D - K : (od && !d45 ? D - Pc : D), P: Pr, pa: pd, arr: fini4(A, 'droite'), ilot: partieIlot(A, 'droite') }],\n        jonctions: [pg ? '' : '\u00E0 gauche : ' + j(pg, og, g45), pd ? '' : '\u00E0 droite : ' + j(pd, od, d45)] };   /* A-345 : la pi\u00E8ce d'angle est dite dans la liste des pi\u00E8ces */\n    }\n    if (S.layout === 'g-shape') return plansG(A);\n    return null;\n  }\n  /* variante du m\u00EAme d\u00E9cor et de la m\u00EAme \u00E9paisseur pour la profondeur P (option \u00AB a/b cm \u00BB des variantes) */\n  function rangeCm(val) {\n    var m = String(val == null ? '' : val).replace(/,/g, '.').match(/^\\s*(\\d+(?:\\.\\d+)?)\\s*(?:\\/\\s*(\\d+(?:\\.\\d+)?))?\\s*cm\\s*$/i);\n    if (!m) return null;\n    var a = parseFloat(m[1]) * 10, b = m[2] ? parseFloat(m[2]) * 10 : a; return [Math.min(a, b), Math.max(a, b)];\n  }\n  function cleProf(all) {\n    return ['option1', 'option2', 'option3'].filter(function (k) {\n      return all.length > 1 && all.every(function (v) { return rangeCm(v[k]); }) && all.some(function (v) { return v[k] !== all[0][k]; });\n    })[0] || null;\n  }\n  function variantePour(A, P) {\n    var all = A.shopifyVariants || [], cur = A.getSelectedShopifyVariant ? A.getSelectedShopifyVariant() : null, k = cleProf(all);\n    if (!cur || !k) return cur;\n    var best = cur, bd = Infinity;\n    all.forEach(function (v) {\n      if (!['option1', 'option2', 'option3'].every(function (o) { return o === k || v[o] === cur[o]; })) return;\n      var r = rangeCm(v[k]); if (!r) return;\n      var d = P < r[0] ? r[0] - P : (P > r[1] ? P - r[1] : 0);\n      if (d < bd - 0.01) { bd = d; best = v; }\n    });\n    return best;\n  }\n  /* prix de chaque plan (centimes), pi\u00E8ces d'angle, \u00E9cart avec le prix de base du moteur (m\u00EAme total, comme l'\u00EElot) */\n  /* A-418 (AUDIT 22:49, avec R130 de Romain) : la liste du Prix de base garde sa hauteur fixe (4 lignes, cp-style.css) ; au-del\u00E0,\n     cp-pb-defile (barre dessin\u00E9e en fond, curseur \u00E0 sa place) et cp-pb-plus (fondu en bas) tant qu'il reste des lignes dessous */\n  function defilePb(l) {\n    var h = l.clientHeight, sh = l.scrollHeight, plus = h > 0 && sh > h + 1;\n    l.classList.toggle('cp-pb-defile', plus); l.classList.toggle('cp-pb-plus', plus && l.scrollTop + h < sh - 1);\n    if (plus) { var th = Math.max(16, h * h / sh), y = (h - th) * l.scrollTop / (sh - h); l.style.setProperty('--cp-pb-h', th.toFixed(1) + 'px'); l.style.setProperty('--cp-pb-y', y.toFixed(1) + 'px'); }\n  }\n  function compoOption(A) {\n    var pl = plans(A); if (!pl) return null;\n    var pp = prixPiece(A); if (pl.pa && pp == null) return null;\n    var k = cleProf(A.shopifyVariants || []), tot = 0;\n    var m2 = num(ilotM2(A));\n    var lignes = pl.pieces.map(function (x) {\n      var v = variantePour(A, x.P), u = num(v && v.price), fact = x.mm > 0 ? Math.max(x.mm, x.pa ? MIN_DROIT : x.ilot ? (ILOT_MIN_ML || MIN_PLAN) : MIN_PLAN) : 0;   /* A-313 : partie au m\u00B2, minimum de l'\u00EElot */\n      /* retour du G fini sur 4 c\u00F4t\u00E9s (chant arri\u00E8re) : au m\u00B2 de sa surface (prix d'\u00EElot), les autres au ml de leur tranche */\n      var cMl = Math.round(Math.round(fact / 10) * u), c = x.arr ? Math.round(m2 * fact * x.P / 1e4) : cMl, cM2 = x.arr ? c : null;\n      /* D9b (AUDIT Tour 496) : retour fini sur 4 c\u00F4t\u00E9s jamais moins cher que le m\u00EAme retour au ml de sa tranche (le panier\n         facture sa ligne au ml, puis l'\u00E9cart en ajustements positifs : un m\u00B2 plus bas faisait payer plus que l'affich\u00E9, A-292) */\n      var d9 = !!(x.arr && cMl > c); if (d9) c = cMl;\n      tot += c;\n      return { nom: x.nom, id: x.id || null, mm: x.mm, P: x.P, facture_mm: fact, prix_cm: x.arr && !d9 ? m2 * x.P / 1000 : u, cents: c, arr: !!x.arr, m2: x.arr ? m2 : null,\n        d9b: d9, m2_cents: cM2, ml_cents: x.arr ? cMl : null, tranche: x.arr ? 'fini 4 c\u00F4t\u00E9s' : (v && k ? v[k] : '') };\n    });\n    var base = Math.round(num(A.getBilledQtyCm ? A.getBilledQtyCm(A.getSelectedShopifyVariant && A.getSelectedShopifyVariant()) : 0) * num(A.getUnitPriceCents ? A.getUnitPriceCents() : 0));\n    return { plans: lignes, plans_cents: tot, pa: pl.pa, pa_cents: pl.pa ? Math.round(pl.pa * pp * 100) : 0, jonctions: pl.jonctions,\n      base_cents: base, ecart_cents: tot - base };\n  }\n  /* \u00AB plan 2 400 \u00D7 650 mm, retour 1 150 \u00D7 650 mm ; jonction droite, retour filant \u00BB ; atelier : plans num\u00E9rot\u00E9s,\n     facturation minimale dite, puis la jonction de chaque coin */\n  /* A-345 : chaque pi\u00E8ce d'angle dans l'ordre de pose, entre ses deux plans (texte de COMMERCIAL) : pi\u00E8ce pos\u00E9e juste avant\n     le plan donn\u00E9 ici */\n  var PA_AVANT = { angle: { L: 'retour' }, 'u-shape': { g: 'fond', d: 'droite' }, 'g-shape': { top: 'haut', mid: 'droite', ret: 'retour' } };\n  function textePA() { return 'pi\u00E8ce d\\'angle ' + fmtMm(PIECE) + ' \u00D7 ' + fmtMm(PIECE) + ' mm contre les murs, avant en biais'; }\n  function texteOption(A, atelier) {\n    var c = compoOption(A); if (!c) return '';\n    var av = PA_AVANT[A.S.layout] || {}, pas = (COINS[A.S.layout] || []).filter(function (k) { return paCoin(A, k); });\n    var items = [];\n    c.plans.filter(function (p) { return p.mm > 0; }).forEach(function (p) {\n      pas.forEach(function (k) { if (av[k] === p.id) items.push(textePA()); });\n      /* R1 de messages 2 (AUDIT Tour 719, COMMERCIAL Tour 113) : partie finie d'office par sa profondeur (A-313), \u00AB fini sur 4\n         c\u00F4t\u00E9s \u00BB sans \u00AB (chant arri\u00E8re) \u00BB, comme N43 ; case d'arri\u00E8re coch\u00E9e ou coin arrondi : \u00AB (chant arri\u00E8re) \u00BB reste */\n      var office = !!p.id && partieIlot(A, p.id);                       /* A-429 : en L et en U aussi (COMMERCIAL, docs\\commercial-pierres-textes.md \u00A7 1) */\n      items.push(p.nom + ' ' + fmtMm(p.mm) + ' \u00D7 ' + fmtMm(p.P) + ' mm' + (p.arr ? ' ' + finiF4(p.nom) + ' sur 4 c\u00F4t\u00E9s' + (office ? '' : ' (chant arri\u00E8re)') : '') +\n        (atelier && p.facture_mm > p.mm ? ' (factur\u00E9 ' + fmtMm(p.facture_mm) + ' mm)' : ''));\n    });\n    var mis = items.filter(function (x) { return x === textePA(); }).length;\n    for (; mis < c.pa; mis++) items.push(textePA());                    /* plan apr\u00E8s la pi\u00E8ce r\u00E9duit \u00E0 0 : la pi\u00E8ce en fin de liste */\n    var t = items.map(function (x, i) { return (atelier ? NUM[i] + ' ' : '') + x; });\n    var j = c.jonctions.filter(Boolean);\n    return t.join(atelier ? ' ; ' : ', ') + (j.length ? ' ; ' + j.join(' ; ') : '');\n  }\n  /* Panier, plans joints : une ligne par tranche de profondeur. Le moteur envoie une seule ligne (la variante choisie, sur\n     toute la longueur) et n'ajoute que l'\u00E9cart positif : un plan d'une autre tranche serait mal pay\u00E9. \u00C0 l'envoi, la ligne\n     principale prend la variante du 1er plan et la longueur factur\u00E9e de ses plans ; chaque autre tranche, une ligne\n     rattach\u00E9e \u00E0 la pi\u00E8ce (_addon, _parent_uid : refondue dans sa carte du panier et compt\u00E9e par le contr\u00F4le d'int\u00E9grit\u00E9) ;\n     puis les lignes d'ajustement, recalcul\u00E9es : la somme des lignes = le total affich\u00E9, au centime. */\n  function lignesTranches(A) {\n    var co = compoOption(A); if (!co) return null;\n    var map = {}, ordre = [];\n    co.plans.forEach(function (p) {\n      if (!(p.facture_mm > 0)) return;\n      var v = variantePour(A, p.P); if (!v) return;\n      var k = String(v.id); if (!map[k]) { map[k] = { v: v, cm: 0, plans: [] }; ordre.push(k); }\n      map[k].cm += Math.round(p.facture_mm / 10); map[k].plans.push(p);\n    });\n    return ordre.map(function (k) { return map[k]; });\n  }\n  /* lignes d'ajustement rattach\u00E9es \u00E0 la pi\u00E8ce, 1 \u20AC puis 0,01 \u20AC, comme le moteur */\n  function ajustements(out, reste, lab, uid) {\n    var cfg = window.CONFIGURATOR_CONFIG || {}, idC = Number(cfg.addonVariantId || 0), idE = Number(cfg.addonVariantIdEuro || 0);\n    var ajout = function (id, n) { if (id && n > 0) out.push({ id: id, quantity: n, properties: { 'Se rapporte \u00E0': lab, _addon: '1', _parent_uid: uid } }); };\n    reste = Math.max(0, reste);\n    if (idE > 0 && idC <= 0) reste = Math.ceil(reste / 100) * 100;\n    if (idE > 0) { var e1 = Math.floor(reste / 100); ajout(idE, e1); reste -= e1 * 100; }\n    if (idC > 0) ajout(idC, reste);\n  }\n  function principale(items) { return items.filter(function (it) { return it.properties && it.properties._UID && String(it.properties._addon) !== '1'; })[0]; }\n  function etiquetteLigne(pr) { return [pr['Forme'], pr['Longueur totale'], pr['Finition']].filter(Boolean).join(' \u00B7 ') || 'Plan de travail sur mesure'; }\n  try {\n    var fetch0 = window.fetch;\n    if (typeof fetch0 === 'function') window.fetch = function (u, o) {\n      var args = Array.prototype.slice.call(arguments);\n      try {\n        var A = getApp(), envoi = /\\/cart\\/add/.test(String(u && u.url ? u.url : u)) && o && typeof o.body === 'string' && A && A.S && A.__cpPierreWrapped && !etat(A);\n        var body = envoi ? JSON.parse(o.body) : null, items = body ? body.items || [] : [], main = body ? principale(items) : null;\n        var q = Math.max(1, parseInt(A && A.S && A.S.orderQty, 10) || 1), v0 = main ? A.getSelectedShopifyVariant() : null;\n        var total = main ? Math.round((num(v0 && v0.price) * num(A.getBilledQtyCm(v0)) + num(A.S.optionsTotalCents)) * q) : 0;\n        var tr = main && enOption(A) && !ilotOk(A) ? lignesTranches(A) : null;\n        if (tr && tr.length) {\n          var uid = String(main.properties._UID), pr = main.properties, lab = etiquetteLigne(pr);\n          var out = tr.map(function (t, i) {\n            return i === 0 ? { id: t.v.id, quantity: t.cm * q, properties: pr }\n              : { id: t.v.id, quantity: t.cm * q, properties: { 'Se rapporte \u00E0': lab, 'Plans': t.plans.map(function (p) { return p.nom + ' ' + fmtMm(p.mm) + ' \u00D7 ' + fmtMm(p.P) + ' mm'; }).join(', '), _addon: '1', _parent_uid: uid } };\n          });\n          ajustements(out, total - tr.reduce(function (s, t) { return s + num(t.v.price) * t.cm * q; }, 0), lab, uid);\n          body.items = out.slice().reverse();                              /* m\u00EAme ordre que le moteur : la pi\u00E8ce en t\u00EAte du panier */\n          args[1] = Object.assign({}, o, { body: JSON.stringify(body) });\n        } else if (main && v0 && String(main.id) === String(v0.id) && num(v0.price) > 0 && total > 0 && main.quantity * num(v0.price) > total) {\n          /* ligne du d\u00E9cor plus ch\u00E8re que le total affich\u00E9 (plan fini sur 4 c\u00F4t\u00E9s peu profond : son m\u00B2 co\u00FBte moins que le m\u00E8tre\n             de la tranche) : le moteur n'ajoute que des \u00E9carts positifs. La ligne du d\u00E9cor est ramen\u00E9e au plus grand nombre de\n             cm qui tient dans le total, par pi\u00E8ce ; le reste en lignes d'ajustement : somme des lignes = total affich\u00E9.\n             La longueur r\u00E9elle reste dans les propri\u00E9t\u00E9s de la pi\u00E8ce. */\n          var pc = num(v0.price), n = Math.floor(total / (pc * q)) * q, uid2 = String(main.properties._UID);\n          var out2 = [{ id: main.id, quantity: n, properties: main.properties }];\n          ajustements(out2, total - n * pc, etiquetteLigne(main.properties), uid2);\n          body.items = out2.slice().reverse();\n          args[1] = Object.assign({}, o, { body: JSON.stringify(body) });\n        }\n      } catch (e) { console.warn('[cp-pierre]', e); }\n      return fetch0.apply(this, args);\n    };\n  } catch (e) {}\n  /* L69 : \u00E9cart r\u00E9el du total avec et sans la pi\u00E8ce d'angle \u00E0 ce coin, en centimes ; la carte de jonction se refait \u00E0 chaque\n     rendu : la simulation (cp-annonces) vient apr\u00E8s, une fois par \u00E9tat, quand la ligne du coin est affich\u00E9e ; le rendu qui la\n     suit lit le r\u00E9sultat. null tant qu'il n'est pas connu (rien d'invent\u00E9). */\n  var ecartsPA = {}, nEcartsPA = 0, simPA = {};\n  function ecartPA(A, k) {\n    if (typeof window.CP_simule !== 'function' || (window.CP_enSimulation && window.CP_enSimulation())) return null;\n    var sig = JSON.stringify(A.S) + '|' + k.c;\n    if (sig in ecartsPA) return ecartsPA[sig];\n    var row = document.querySelector('.cp-jct__row[data-c=\"' + k.c + '\"]'); if (!row || !row.getClientRects().length) return null;\n    if (Date.now() - (simPA[k.c] || 0) < 1500) return null;           /* une simulation par coin et par 1,5 s au plus (un rendu qui changerait l'\u00E9tat ne boucle pas) */\n    simPA[k.c] = Date.now();\n    if (++nEcartsPA > 60) { ecartsPA = {}; nEcartsPA = 1; }\n    ecartsPA[sig] = null;\n    setTimeout(function () {\n      var B = getApp(); if (!B || !B.S || JSON.stringify(B.S) + '|' + k.c !== sig) { delete ecartsPA[sig]; return; }\n      var actif = paCoin(B, k.c), r = window.CP_simule(B, [function (C) { var l = C.S.layout; C.S.cpPA = C.S.cpPA || {}; C.S.cpPA[l] = C.S.cpPA[l] || {}; C.S.cpPA[l][k.c] = !actif; if (!actif) window.CP_jonctionPlus.choisir(C, k, 'pa'); }]);\n      var a = r && r.avant, b = r && r.apres[0];\n      ecartsPA[sig] = a && b ? (actif ? a.total - b.total : b.total - a.total) : null;\n      try { B.render(); } catch (e) {}                                    /* la carte, refaite, lit l'\u00E9cart */\n    }, 200);\n    return null;\n  }\n  /* carte de jonction (cp-jonction) : la pi\u00E8ce d'angle comme choix de plus \u00E0 chaque coin ; pas de coupe \u00E0 45\u00B0 sans son prix */\n  function icoPA(orient) {\n    var tf = ({ tr: '', tl: 'matrix(-1 0 0 1 32 0)' })[orient] || '';\n    return '<svg class=\"cp-jct__ico\" viewBox=\"0 0 32 32\" width=\"32\" height=\"32\" aria-hidden=\"true\" focusable=\"false\"><g' + (tf ? ' transform=\"' + tf + '\"' : '') +\n      ' stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"><path d=\"M3 5H14V14H3Z\" fill=\"currentColor\" fill-opacity=\".18\"/>' +\n      '<path d=\"M14 5H29V29H20V14H14Z\" fill=\"currentColor\" fill-opacity=\".85\"/><path d=\"M20 22H29V29H20Z\" fill=\"currentColor\" fill-opacity=\".55\"/></g></svg>';\n  }\n  window.CP_jonctionPlus = {\n    modes: function (A, k) {\n      if (!enOption(A) || !PA_PROP || profForme(A) > PA_PMAX) return [];\n      var pp = prixPiece(A); if (pp == null) return [];\n      var ang = angleCoin(A, k.c), sq = Math.abs(ang - 90) < 0.01;\n      var orient = A.S.layout === 'angle' ? (A.S.angleDir === 'left' ? 'tl' : 'tr')\n        : A.S.layout === 'g-shape' ? (k.c === 'top' || (k.c === 'ret' && A.S.gDir === 'left') ? 'tl' : 'tr') : (k.c === 'g' ? 'tl' : 'tr');\n      var lab = 'Pi\u00E8ce d\\'angle', ec = sq ? ecartPA(A, k) : null;\n      /* le prix de la pi\u00E8ce, sans \u00AB + \u00BB : elle remplace une part des plans, le total monte de moins ; L69 (lot \u00AB messages 1 \u00BB) :\n         l'infobulle dit l'effet r\u00E9el sur le total (r\u00E8gle A-304), connu apr\u00E8s une simulation (ecartPA). A-345 (COMMERCIAL) : la\n         pi\u00E8ce du tarif, avant en biais ; le nom du choix sans \u00AB 105 \u00D7 105 \u00BB */\n      return [{ m: 'pa', ico: icoPA(orient), sub: sq ? fmt(Math.round(pp * 100)) + ' \u20AC' : '90\u00B0 seulement', disabled: !sq, label: lab,\n        title: sq ? 'Le coin est une pi\u00E8ce d\\'angle : ' + fmtMm(PIECE) + ' mm contre chaque mur, avant coup\u00E9 en biais, fini sur le devant. Les plans droits se joignent \u00E0 ses deux extr\u00E9mit\u00E9s.' +\n          (ec != null ? ' Effet sur le total : ' + (ec < 0 ? '\u2212' : '+') + fmt(Math.abs(ec)) + ' \u20AC.' : '') : lab + ' : possible seulement \u00E0 90\u00B0.' }];\n    },\n    actif: function (A, k) { return enOption(A) && paCoin(A, k.c) ? 'pa' : null; },\n    choisir: function (A, k, m) {\n      var l = A.S.layout; A.S.cpPA = A.S.cpPA || {}; A.S.cpPA[l] = A.S.cpPA[l] || {}; A.S.cpPA[l][k.c] = m === 'pa';\n      if (m === 'pa') {                                                   /* pi\u00E8ce d'angle \u00E0 ce coin : plus de coupe \u00E0 45\u00B0 */\n        if (l === 'angle') A.S.cpJ45 = false;\n        else { var st = l === 'u-shape' ? 'cpJ45U' : 'cpJ45G'; if (A.S[st]) A.S[st][k.c] = false; }\n      }\n    },\n    /* plans joints : pas de tuile 45\u00B0 sans prix (r\u00E8gle, sinon produit) */\n    masquer45: function (A) {\n      var p = window.CP_j45 && typeof window.CP_j45.prix === 'function' ? window.CP_j45.prix()\n        : (window.CP_PRODUCT && window.CP_PRODUCT.j45 != null && window.CP_PRODUCT.j45 !== '' ? 0 : null);\n      return enOption(A) && p === null;\n    }\n  };\n\n  /* prix de la pi\u00E8ce d'angle (\u20AC) pour la variante choisie ; null = pas de donn\u00E9e (L et U sur devis) */\n  function prixPiece(A) {\n    var v = A && A.getSelectedShopifyVariant ? A.getSelectedShopifyVariant() : null, t = window.CP_PIECE_ANGLE || {};\n    var p = v && num(t[v.title]);\n    return p > 0 ? p : null;\n  }\n\n  /* \u2500\u2500 \u00CElot : plan de ILOT_MIN \u00E0 ILOT_MAX mm (droit ; L et U : voir piecesIlot), tir\u00E9 de la dalle finie sur ses 4 chants et\n     vendu au m\u00B2. Prix = longueur factur\u00E9e \u00D7 profondeur \u00D7 prix de l'\u00EElot au m\u00B2 de la variante (m\u00E9tachamp, CP_ILOT_M2 ;\n     sans lui, \u00AB sur devis \u00BB) ; longueur factur\u00E9e d'au moins ILOT_MIN_ML. Les chants sont compris (impos\u00E9s d\u00E8s le seuil,\n     sans suppl\u00E9ment), affich\u00E9s coch\u00E9s et verrouill\u00E9s. Le moteur facture la variante de plan la plus profonde ; l'\u00E9cart\n     jusqu'au prix de l'\u00EElot s'ajoute au m\u00EAme total (prix affich\u00E9, panier). En dessous du seuil, le plan au m\u00E8tre. \u2500\u2500 */\n  function ilotM2(A) {\n    if (!ILOT_ON) return null;\n    var v = A && A.getSelectedShopifyVariant ? A.getSelectedShopifyVariant() : null, t = window.CP_ILOT_M2 || {}, p = v && num(t[v.title]);\n    return p > 0 ? p : null;\n  }\n  /* prix de l'\u00EElot au m\u00B2 pour la forme en cours : null si la r\u00E8gle ne vend pas cette forme en \u00EElot, ou sans prix pour la variante */\n  function ilotForme(A) { var lay = A && A.S && A.S.layout; return ILOT_FORMES[lay] ? ilotM2(A) : null; }\n  /* profondeur du plan : droit S.P ; en L, U et G, la plus profonde des pi\u00E8ces (A-429 : chacune garde la sienne en plans\n     joints ; une seule pour tout le plan avec la pi\u00E8ce d'angle impos\u00E9e, syncProf) */\n  function profForme(A) {\n    var S = A && A.S; if (!S) return 0;\n    if (S.layout === 'g-shape') return Math.max(num(S.Pgtop), num(S.Pgleft), num(S.Pgright), num(S.Pgreturn));   /* G : la plus profonde de ses parties */\n    return S.layout === 'angle' ? Math.max(num(S.P1), num(S.P2)) : S.layout === 'u-shape' ? Math.max(num(S.Pc), num(S.Pl), num(S.Pr)) : num(S.P);\n  }\n  /* plus petite profondeur des tranches (variantes \u00AB a/b cm \u00BB) : 600 pour \u00AB 60/65 cm \u00BB ; sans tranches, la \u00AB Profondeur\n     minimale vendue au m\u00E8tre \u00BB de la r\u00E8gle (0 sans elle) */\n  function trancheMin(A) {\n    var all = (A && A.shopifyVariants) || [], k = cleProf(all); if (!k) return PROF_ML;\n    return all.reduce(function (m, v) { var r = rangeCm(v[k]); return r ? Math.min(m, r[0]) : m; }, Infinity) || 0;\n  }\n  /* \u2500\u2500 Chant arri\u00E8re du plan droit (r\u00E9glage \u00AB Chant arri\u00E8re du plan droit, au prix de l'\u00EElot, d\u00E8s \u2026 mm \u00BB, ARR_MM ; 0 : sans),\n     de ARR_MM au seuil de l'\u00EElot : le plan avec son arri\u00E8re est tir\u00E9 de la dalle finie sur ses 4 c\u00F4t\u00E9s et vendu comme l'\u00EElot,\n     au m\u00B2 de sa surface (longueur factur\u00E9e au minimum du plan, MIN_PLAN, \u00D7 profondeur), 4 chants compris. Sous la plus\n     petite tranche (aucun plan au m\u00E8tre si peu profond) : arri\u00E8re impos\u00E9. Dans les tranches : la case du chant arri\u00E8re est\n     propos\u00E9e, vide (0 \u20AC) ; coch\u00E9e (S.cpArriere), le plan au m\u00B2 ; d\u00E9coch\u00E9e, le plan au m\u00E8tre. D\u00E9cor sans prix d'\u00EElot : rien.\n     Le mot \u00AB \u00EElot \u00BB n'est pas montr\u00E9 au client pour ce plan. \u2500\u2500 */\n  /* R182-b (Romain 01/11 ; AUDIT Tours 1016, 1150 et 1159) : r\u00E9glage \u00AB Chant arri\u00E8re propos\u00E9 d\u00E8s \u2026 mm \u00BB (ARR_DES ; HPL : 600).\n     La case est propos\u00E9e d\u00E8s ARR_DES ; coch\u00E9e, le plan garde sa profondeur r\u00E9elle et se paie au prix au m\u00E8tre de la profondeur\n     du tarif qui porte le chant arri\u00E8re (ARR_MM ; HPL : \u00AB \u00CElot fini 4 c\u00F4t\u00E9s P90 \u00BB, 639 \u20AC/ml en 12 mm c\u0153ur noir), soit le prix\n     d'\u00EElot au m\u00B2 de la variante de cette profondeur \u00D7 ARR_MM. Sans le r\u00E9glage, rien ne change. */\n  function arrTarif() { return ARR_DES > 0 && ARR_MM > 0; }\n  function arrDebut() { return arrTarif() ? Math.min(ARR_DES, ARR_MM) : ARR_MM; }\n  function arrM2(A) {\n    var m = ilotM2(A); if (m != null || !arrTarif() || !ILOT_ON) return m;\n    var v = variantePour(A, ARR_MM), p = v && num((window.CP_ILOT_M2 || {})[v.title]);\n    return p > 0 ? p : null;\n  }\n  function arriereOffert(A, P) {\n    var S = A && A.S; if (!S || S.layout !== 'linear' || !(ARR_MM > 0)) return false;\n    P = P == null ? num(S.P) : num(P);\n    return P >= arrDebut() && P < ILOT_MIN && arrM2(A) != null;\n  }\n  function arriere(A, P) {\n    if (!arriereOffert(A, P)) return false;\n    return (P == null ? num(A.S.P) : num(P)) < trancheMin(A) || A.S.cpArriere === true;\n  }\n  function arriereChoix(A) { return arriereOffert(A) && num(A.S.P) >= trancheMin(A); }   /* dans les tranches : arri\u00E8re au choix */\n  window.CP_arriereCoche = function (A) { A = A || getApp(); return !!(A && A.S && A.__cpPierreWrapped && arriere(A)); };   /* R182-b : refus du 18 cm (cp-modele) */\n  /* A-370 (AUDIT Tour 831, COMMERCIAL Tour 147) : plan droit fini sur 4 c\u00F4t\u00E9s d'office par sa profondeur (sous la plus\n     petite tranche, ou \u00EElot) : sa raison, \u00AB (profondeur \u2026 mm) \u00BB, et pas \u00AB (chant arri\u00E8re) \u00BB, que le client n'a pas coch\u00E9.\n     Case d'arri\u00E8re coch\u00E9e (ou coin arrondi) : \u00AB (chant arri\u00E8re) \u00BB reste. R\u00E8gle \u00AB chants compris \u00BB seulement */\n  function fini4Office(A, il) { return !!(ILOT_CHANTS && il && !il.forme && !(il.arriere && arriereChoix(A))); }\n  /* A-296 : r\u00E8gle sans \u00AB chants compris \u00BB : le chant arri\u00E8re du plan fini par son arri\u00E8re est compris par le verrou du moteur\n     (\u00AB Arri\u00E8re - Verrouill\u00E9 \u00BB : coch\u00E9, dessin\u00E9, hors \u00AB Chants supp. \u00BB) ; les c\u00F4t\u00E9s restent des chants au choix. Sans\n     arri\u00E8re : le verrou de la r\u00E8gle. Avec \u00AB chants compris \u00BB : forceBandingFromDepth, comme avant */\n  function verrouArr(A) {\n    if (!ILOT_ON || ILOT_CHANTS || !A || !A._eff || !A.S) return;\n    var r = regle(A), bl = A._eff.bandingLocked = A._eff.bandingLocked || {};\n    bl.linear_back = arriere(A) || !!(r && r.rule_linear_back_locked === true);\n  }\n  /* A-296 : quand le plan quitte son chant arri\u00E8re (case d\u00E9coch\u00E9e, coin arrondi retir\u00E9, profondeur sous ARR_MM), les c\u00F4t\u00E9s\n     coch\u00E9s comme chants restent coch\u00E9s : ils redeviennent des bouts finis (avant les bouts du rendu). R\u00E8gle sans \u00AB chants\n     compris \u00BB seulement (avec elle, les c\u00F4t\u00E9s \u00E9taient compris, pas choisis) */\n  function garderCotes(A) {\n    var S = A.S, avant = A.__cpArrAvant, maint = S.layout === 'linear' && arriere(A); A.__cpArrAvant = maint;\n    if (ILOT_CHANTS || !avant || maint || S.layout !== 'linear') return;\n    var m0 = ((S.cpBouts = S.cpBouts || {}).linear = S.cpBouts.linear || {}), ac = S.cpArrCotes;\n    BOUTS.linear.forEach(function (b) {                                /* choisi = coch\u00E9 au rendu d'avant, sans verrou (pas impos\u00E9 par un coin) */\n      var cb = A.dims && A.dims.querySelector('.edge-checkbox-visual[data-edge=\"' + b.k + '\"]'), choisi = !!(cb && cb.classList.contains('checked') && !cb.classList.contains('disabled'));\n      if (ac) choisi = ac[b.k] === true;                               /* R182-a : c\u00F4t\u00E9s finis d'office avec l'arri\u00E8re : ce qu'ils \u00E9taient avant */\n      /* A-428-b : un c\u00F4t\u00E9 impos\u00E9 qui \u00E9tait vide avant (sans m\u00E9moire) le redevient ; il restait coch\u00E9 et pay\u00E9 comme chant choisi */\n      var m = m0[b.k] = m0[b.k] || {}; if (choisi) m.c = 'fini'; else if (m.c === 'fini' || ac) m.c = 'sans';\n    });\n  }\n  /* R182-a (A-421 ; AUDIT Tours 1151 et 1152, puis la gamme lue dans custom.gamme ; COMMERCIAL Tour 225) : plan droit avec son chant arri\u00E8re, sur un d\u00E9cor de la gamme\n     de la r\u00E8gle (\u00AB Chant arri\u00E8re coch\u00E9 : les 2 c\u00F4t\u00E9s finis d'office pour la gamme \u00BB ; HPL : \u00AB C\u0153ur noir \u00BB, tarif \u00AB Obligatoire\n     2 usinages lat\u00E9raux \u00BB) : les 2 c\u00F4t\u00E9s sont finis d'office, verrouill\u00E9s et pay\u00E9s au prix d'un chant de la profondeur, par le\n     verrou de R180 (cp-modele : appliqueParEp, bordures). Gamme du d\u00E9cor : m\u00E9tachamp de variante custom.gamme (CP_GAMME,\n     cp-decor-data) ; d\u00E9cor sans gamme : rien d'impos\u00E9, avec une trace. Quand la cause tombe (autre d\u00E9cor, arri\u00E8re d\u00E9coch\u00E9,\n     autre profondeur), les c\u00F4t\u00E9s redeviennent ce qu'ils \u00E9taient juste avant. */\n  function nomDecor(s) { return String(s == null ? '' : s).normalize('NFC').replace(/\\s+/g, ' ').trim().toLowerCase(); }\n  var sansGamme = {};\n  function gammeDecor(nom) {\n    var G = window.CP_GAMME || {}, n = nomDecor(nom); if (!n) return '';\n    if (G[nom] != null) return nomDecor(G[nom]);\n    var k = Object.keys(G).filter(function (x) { return nomDecor(x) === n; })[0];\n    return k ? nomDecor(G[k]) : '';\n  }\n  function arrCotes(A) {\n    if (!ARR_GAMME || !A || !A.S || A.S.layout !== 'linear' || !arriere(A)) return false;\n    var m = A.variantsMeta && A.variantsMeta[A.S.variant], nom = m && m.name, g = gammeDecor(nom);\n    if (!g) { if (nom && !sansGamme[nom]) { sansGamme[nom] = 1; console.warn('[cp-pierre] R182-a : d\u00E9cor \u00AB ' + nom + ' \u00BB sans gamme (custom.gamme) : c\u00F4t\u00E9s au choix avec le chant arri\u00E8re'); } return false; }\n    return g === ARR_GAMME;\n  }\n  /* A-428-b : ce qu'\u00E9taient les c\u00F4t\u00E9s est gard\u00E9 dans l'\u00E9tat (S.cpArrCotes), que les simulations des prix annonc\u00E9s (CP_simule,\n     fen\u00EAtre du coin) remettent tel quel ; gard\u00E9 sur A, il \u00E9tait repris, apr\u00E8s la simulation, sur les c\u00F4t\u00E9s d\u00E9j\u00E0 impos\u00E9s (coch\u00E9s) */\n  function syncArrCotes(A) {\n    var S = A.S, imp = arrCotes(A), was = S.cpArrCotes, eb = S.edgeBanding = S.edgeBanding || {};\n    if (imp && !was) S.cpArrCotes = { sides: eb.sides === true, right: eb.right === true };\n    else if (!imp && was) { if (S.layout === 'linear' && arriere(A)) { eb.sides = was.sides; eb.right = was.right; } delete S.cpArrCotes; }\n  }\n  window.CP_arrCotes = function (A) { A = A || getApp(); return !!(A && A.__cpPierreWrapped && arrCotes(A)); };\n  /* A-296 : plan droit vendu au m\u00E8tre (dans les tranches) mais moins profond que le chant arri\u00E8re (ARR_MM), d\u00E9cor qui le vend\n     \u00E0 cette profondeur (prix d'\u00EElot de la variante de m\u00EAme d\u00E9cor et m\u00EAme \u00E9paisseur) : la case du chant arri\u00E8re est montr\u00E9e,\n     ferm\u00E9e, avec sa raison. Sous les tranches (pierre, laqu\u00E9 : ARR_MM = 300, tranches d\u00E8s 600), rien ne change */\n  function arrTard(A) {\n    var S = A && A.S, P = num(S && S.P); if (!ILOT_ON || !S || S.layout !== 'linear' || !(ARR_MM > 0) || etat(A) || !(P < arrDebut()) || !(P >= trancheMin(A))) return false;\n    var v = variantePour(A, ARR_MM), p = v && num((window.CP_ILOT_M2 || {})[v.title]);\n    return p > 0;\n  }\n  function texteTard() { return 'Chant arri\u00E8re : possible \u00E0 partir de ' + fmtMm(arrDebut() / 10) +'\u00A0cm de profondeur'; }\n  /* \u2500\u2500 G (plans joints) : chant arri\u00E8re du retour (p\u00E9ninsule, visible c\u00F4t\u00E9 pi\u00E8ce), case au choix. Coch\u00E9e (S.cpArrG), le\n     retour seul est fini sur ses 4 c\u00F4t\u00E9s et factur\u00E9 au m\u00B2 de sa surface (prix d'\u00EElot de la variante ; longueur factur\u00E9e au\n     minimum du plan), son bout compris ; d\u00E9coch\u00E9e, contre un meuble (0 \u20AC). Cl\u00E9s du moteur : bord arri\u00E8re du retour et bas\n     du montant qui le porte, selon le sens et les jonctions. D\u00E9cor sans prix d'\u00EElot : le chant du moteur, comme avant. \u2500\u2500 */\n  function clesArrG(A) {\n    var S = A.S, R = S.gDir !== 'left', ro = S.junctionReturnG === 'overlap', to = S.junctionTopG === 'overlap';\n    if (R) return ro ? ['frontReturnRightComboG_O'] : ['frontReturnBottomG_F'];\n    return ro ? [to ? 'frontRightComboGL_OO' : 'frontRightBottomGL_FO'] : ['frontReturnBottomGL_F'];\n  }\n  /* montant qui porte le retour, quand il tient le coin (jonction \u00AB montant filant \u00BB) : son bas est un bout libre */\n  function boutPorteur(A) {\n    var S = A.S, R = S.gDir !== 'left'; if (S.junctionReturnG === 'overlap') return null;\n    return R ? { k: S.junctionMidG === 'overlap' ? 'frontRightBottomG_OF' : 'frontRightBottomG_FF', nom: 'c\u00F4t\u00E9 libre du montant droit', ax: 'v' }\n      : { k: S.junctionTopG === 'overlap' ? 'frontRightBottomGL_OF' : 'frontRightBottomGL_FF', nom: 'c\u00F4t\u00E9 libre du montant gauche', ax: 'v' };\n  }\n  function boutRetour(A) { var S = A.S; return S.gDir !== 'left' ? 'backReturnG' : (S.junctionReturnG === 'overlap' ? 'backReturnRightGL_O' : 'frontReturnRightGL_F'); }\n  /* \u2500\u2500 A-299 cas 2 et 3 (AUDIT Tours 541, 625) : comme le retour du G, chaque pi\u00E8ce d'un L, d'un U et du G a sa case\n     d'arri\u00E8re, au choix. Coch\u00E9e, la pi\u00E8ce est finie sur ses 4 c\u00F4t\u00E9s et factur\u00E9e au m\u00B2 de sa surface (prix d'\u00EElot de la\n     variante ; D9b : jamais sous son prix au m\u00E8tre), son bout compris. Un coin arrondi au coin arri\u00E8re de son bout (cas 2)\n     coche et verrouille sa case ; au coin ext\u00E9rieur d'une jonction (cas 3), celles des deux pi\u00E8ces qui s'y rejoignent\n     (A-291). Offert comme le retour du G : r\u00E8gle \u00AB chants compris \u00BB, d\u00E9cor avec son prix d'\u00EElot (HPL : rien, Tour 541 c).\n     \u00C9tat : le retour du G garde S.cpArrG (et S.cpArrGParCoin) ; les autres pi\u00E8ces, S.cpFini4[forme][pi\u00E8ce]. Cl\u00E9s des\n     cases relev\u00E9es sur le dessin (L, U, G dans les deux sens, toutes les jonctions, 25/10). \u2500\u2500 */\n  var PIECES_F4 = { angle: ['plan', 'retour'], 'u-shape': ['gauche', 'fond', 'droite'], 'g-shape': ['gauche', 'haut', 'droite', 'retour'] };\n  var NOMS_F4 = { angle: { plan: 'plan principal', retour: 'retour' },   /* A-416 (COMMERCIAL Tour 216) : un nom par pi\u00E8ce sur toute la page */\n    'u-shape': { gauche: 'jambe gauche', fond: 'fond', droite: 'jambe droite' },\n    'g-shape': { gauche: 'montant gauche', haut: 'plan du haut', droite: 'montant droit', retour: 'retour' } };\n  function nomF4(A, p) { return (NOMS_F4[A.S.layout] || {})[p] || p; }\n  function femF4(n) { return /^jambe/.test(n); }\n  function duF4(n) { return (femF4(n) ? 'de la ' : 'du ') + n; }\n  function finiF4(n) { return femF4(n) ? 'finie' : 'fini'; }\n  /* case d'arri\u00E8re de la pi\u00E8ce p (c\u00F4t\u00E9 mur ; retour du G : c\u00F4t\u00E9 pi\u00E8ce), selon le sens et les jonctions */\n  function clesArrP(A, p) {\n    var S = A.S, l = S.layout, F = function (j) { return j === 'overlap' ? 'O' : 'F'; };\n    if (l === 'angle') return { plan: 'back', retour: 'angleReturn' }[p] || null;\n    if (l === 'u-shape') {\n      var g = S.junctionLeftU === 'overlap', d = S.junctionRightU === 'overlap';\n      return { gauche: g ? 'sideLeftUBot' : 'sideLeftU', droite: d ? 'sideRightUBot' : 'sideRightU', fond: g === d ? 'backMidU' : (g ? 'backolfl_left' : 'backflol_right') }[p] || null;\n    }\n    if (l !== 'g-shape') return null;\n    if (p === 'retour') return clesArrG(A)[0];\n    var t = F(S.junctionTopG), m = F(S.junctionMidG), r = F(S.junctionReturnG);\n    if (S.gDir !== 'left') return { gauche: t === 'F' ? 'sidesLeftG_F' : 'leftSideBottomG_O', haut: { FF: 'backRightG_FF', FO: 'backMidG_FO', OF: 'backMidG_OF', OO: 'backLeftG_OO' }[t + m],\n      droite: { FF: 'rightSideBottomG_FF', FO: 'rightSideMidG_FO', OF: 'sidesRightG_OF', OO: 'rightSideTopG_OO' }[m + r] }[p] || null;\n    return { gauche: { FF: 'sidesRightRightGL_FF', FO: 'rightSideTopGL_FO', OF: 'rightSideBottomGL_OF', OO: 'rightSideMidGL_OO' }[t + r],\n      haut: { FF: 'backRightGL_FF', FO: 'backMidGL_FO', OF: 'backMidGL_OF', OO: 'backLeftGL_OO' }[t + m], droite: m === 'F' ? 'leftSideBottomGL_F' : 'sidesLeftRightGL_O' }[p] || null;\n  }\n  var CLES_ARR_P = ['back', 'angleReturn', 'sideLeftUBot', 'sideLeftU', 'sideRightUBot', 'sideRightU', 'backMidU', 'backolfl_left', 'backflol_right', 'sidesLeftG_F', 'leftSideBottomG_O',\n    'backRightG_FF', 'backMidG_FO', 'backMidG_OF', 'backLeftG_OO', 'rightSideBottomG_FF', 'rightSideMidG_FO', 'sidesRightG_OF', 'rightSideTopG_OO', 'sidesRightRightGL_FF', 'rightSideTopGL_FO',\n    'rightSideBottomGL_OF', 'rightSideMidGL_OO', 'backRightGL_FF', 'backMidGL_FO', 'backMidGL_OF', 'backLeftGL_OO', 'leftSideBottomGL_F', 'sidesLeftRightGL_O'];   /* montr\u00E9es quand l'offre est ouverte */\n  /* bout libre de la pi\u00E8ce p ({ k, nom, ax }), null si elle n'en a pas (fond du U, haut du G) */\n  function boutPiece(A, p) {\n    var S = A.S, l = S.layout;\n    if (l === 'angle' || l === 'u-shape') { var i = { plan: 0, retour: 1, gauche: 0, droite: 1 }[p]; return i == null || (l === 'angle') !== (p === 'plan' || p === 'retour') ? null : BOUTS[l][i]; }\n    if (l !== 'g-shape') return null;\n    var R = S.gDir !== 'left';\n    if (p === 'retour') return { k: boutRetour(A), nom: 'c\u00F4t\u00E9 libre du retour', ax: 'h' };\n    if (p === (R ? 'gauche' : 'droite')) return { k: R ? 'frontLeftBottomG' : 'frontLeftBottomGL', nom: R ? 'c\u00F4t\u00E9 libre du montant gauche' : 'c\u00F4t\u00E9 libre du montant droit', ax: 'v' };\n    return p === (R ? 'droite' : 'gauche') && PA_ON ? boutPorteur(A) : null;   /* montant qui porte le retour ; le haut n'a pas de bout */\n  }\n  function pieceDuBout(A, k) { var r = null; (PIECES_F4[A.S.layout] || []).forEach(function (p) { var b = boutPiece(A, p); if (!r && b && b.k === k) r = p; }); return r; }\n  /* \u2500\u2500 A-313 (AUDIT Tours 573, 591) : un G dont une partie d\u00E9passe la profondeur maximale au m\u00E8tre (P_MAX de la r\u00E8gle)\n     reste commandable en plans joints, pour un d\u00E9cor qui a son prix d'\u00EElot. Chaque partie se facture comme un plan droit\n     de sa profondeur : au m\u00E8tre jusqu'\u00E0 P_MAX ; au-del\u00E0, finie sur 4 c\u00F4t\u00E9s au m\u00B2 de sa surface (D9b), d'office. Les\n     longueurs suivent la jonction choisie \u00E0 chaque coin (CP_geomG). \u2500\u2500 */\n  /* A-429 (AUDIT Tours 1213 et 1215) : la m\u00EAme r\u00E8gle en L et en U, plans joints : chaque pi\u00E8ce au m\u00E8tre de sa tranche jusqu'\u00E0\n     P_MAX ; au-del\u00E0, cette pi\u00E8ce seule finie sur 4 c\u00F4t\u00E9s, au m\u00B2 de sa surface (prix d'\u00EElot de la variante, D9b), d'office.\n     Plus d'\u00EElot de forme (tout le L ou le U au m\u00B2, une seule profondeur) en plans joints */\n  function gProfond(A) { var l = A && A.S && A.S.layout; return !!((l === 'g-shape' || l === 'angle' || l === 'u-shape') && enOption(A) && profForme(A) > P_MAX && ilotM2(A) != null); }\n  function joints(A) { return enOption(A) && (!(profForme(A) > P_MAX) || gProfond(A)); }   /* plans joints : pi\u00E8ces au m\u00E8tre, pi\u00E8ces d'angle, pi\u00E8ces au m\u00B2 */\n  function profPartieG(A, p) { var S = A.S, R = S.gDir !== 'left'; return num({ gauche: R ? S.Pgleft : S.Pgright, haut: S.Pgtop, droite: R ? S.Pgright : S.Pgleft, retour: S.Pgreturn }[p]); }\n  function profPartie(A, p) {\n    var S = A.S, l = S.layout;\n    if (l === 'angle') return num({ plan: S.P1, retour: S.P2 }[p]);\n    if (l === 'u-shape') return num({ gauche: S.Pl, fond: S.Pc, droite: S.Pr }[p]);\n    return l === 'g-shape' ? profPartieG(A, p) : 0;\n  }\n  function partieIlot(A, p) { var l = A.S.layout; return (l === 'g-shape' || ((l === 'angle' || l === 'u-shape') && enOption(A))) && ilotM2(A) != null && profPartie(A, p) > P_MAX; }   /* A-313, A-429 : finie sur 4 c\u00F4t\u00E9s d'office */\n  /* AUDIT Tour 1223 (\u00E9cart 1 d'ADMIN, Tour 1040) : une case de chant appartient \u00E0 la pi\u00E8ce sur laquelle elle est dans la\n     d\u00E9coupe, plus aux groupes fixes de profondeur du moteur (configurator-main l. 754-781 ; dessin : render-angle l. 275,\n     render-u l. 296, render-g l. 276), qui rangeaient avec l'autre pi\u00E8ce les bouts contre le mur de la pi\u00E8ce qui tient le coin\n     (angleReturnTop en L, haut des jambes et bouts du fond en U, 17 cl\u00E9s en G). Table relev\u00E9e sur la d\u00E9coupe dessin\u00E9e\n     (code-outils\\cases-pieces.ps1 : 5 pierres, L, U et G, les deux sens, chaque jonction) : chaque cl\u00E9 tombe sur une seule\n     pi\u00E8ce, quelle que soit la jonction. En U, angleReturn est l'avant des deux jambes (une cl\u00E9, deux cases) */\n  var CASE_PIECE = {\n    angle: { front: 'plan', back: 'plan', sidesBarreH: 'plan', angleReturnH: 'plan', angleReturnTop: 'retour', angleReturn: 'retour', sidesJambeVInner: 'retour', sidesJambeVBottom: 'retour' },\n    'u-shape': { front: 'gauche', sideLeftU: 'gauche', sideLeftUBot: 'gauche', backLeftU: 'gauche', backflol_left: 'gauche',\n      sides: 'droite', sideRightU: 'droite', sideRightUBot: 'droite', backRightU: 'droite', backolfl_right: 'droite',\n      innerFront: 'fond', backMidU: 'fond', backflol_right: 'fond', backolfl_left: 'fond', sideLeftUTop: 'fond', sideRightUTop: 'fond', angleReturn: 'gauche droite' },\n    'g-shape': {\n      angleReturnG: 'gauche', backLeftG_FF: 'gauche', backLeftG_FO: 'gauche', backLeftTopG: 'gauche', frontLeftBottomG: 'gauche', leftSideBottomG_O: 'gauche', sidesLeftG_F: 'gauche',\n      backLeftG_OO: 'haut', backMidG_FO: 'haut', backMidG_OF: 'haut', backRightG_FF: 'haut', innerFrontTopG: 'haut', leftSideTopG_O: 'haut', sidesTopRightG_FF: 'haut', sidesTopRightG_OF: 'haut',\n      backRightG_FO: 'droite', backRightG_OO: 'droite', frontRightBottomG_FF: 'droite', frontRightBottomG_OF: 'droite', rightSideBottomG_FF: 'droite', rightSideMidG_FO: 'droite',\n      rightSideTopG_OO: 'droite', sidesInnerRightG: 'droite', sidesRightG_OF: 'droite',\n      backReturnG: 'retour', frontReturnBottomG_F: 'retour', frontReturnRightComboG_O: 'retour', innerFrontReturnG: 'retour', rightSideBottomG_FO: 'retour', rightSideBottomG_OO: 'retour',\n      angleReturnGL: 'gauche', backLeftGL_FF: 'gauche', backLeftGL_FO: 'gauche', backRightTopGL: 'gauche', frontRightBottomGL_FF: 'gauche', frontRightBottomGL_OF: 'gauche', rightSideBottomGL_OF: 'gauche',\n      rightSideMidGL_OO: 'gauche', rightSideTopGL_FO: 'gauche', sidesRightLeftGL_FF: 'gauche', sidesRightRightGL_FF: 'gauche',\n      backLeftGL_OO: 'haut', backMidGL_FO: 'haut', backMidGL_OF: 'haut', backRightGL_FF: 'haut', innerFrontGL: 'haut', rightSideTopGL_OF: 'haut', rightSideTopGL_OO: 'haut', sidesTopRightGL_FF: 'haut', sidesTopRightGL_OF: 'haut',\n      backRightGL_FO: 'droite', backRightGL_OO: 'droite', frontLeftBottomGL: 'droite', leftSideBottomGL_F: 'droite', sidesInnerLeftGL: 'droite', sidesLeftLeftGL: 'droite', sidesLeftRightGL_O: 'droite',\n      backReturnRightGL_O: 'retour', frontReturnBottomGL_F: 'retour', frontReturnRightGL_F: 'retour', frontRightBottomGL_FO: 'retour', frontRightComboGL_OO: 'retour', innerFrontReturnGL: 'retour',\n      rightSideBottomGL_FO: 'retour', rightSideBottomGL_OO: 'retour' }\n  };\n  function piecesDeCle(A, k) { var t = (CASE_PIECE[A.S.layout] || {})[k]; return t ? t.split(' ') : []; }\n  window.CP_casePiece = function (A, k) { A = A || getApp(); return A && A.S ? piecesDeCle(A, k).join(' ') : ''; };   /* relev\u00E9 et outils (contre-\u00E9preuve) */\n  /* profondeur de la pi\u00E8ce d'une case de chant (la plus profonde des deux jambes pour angleReturn en U) ; 0 si la cl\u00E9 est inconnue */\n  function profDeCle(A, k) { return piecesDeCle(A, k).reduce(function (m, p) { return Math.max(m, profPartie(A, p)); }, 0); }\n  /* formes en plans joints d'un d\u00E9cor qui a son prix d'\u00EElot : la r\u00E8gle de profondeur suit la pi\u00E8ce (ci-dessous), le moteur\n     n'impose plus rien par profondeur (seuil \u00E0 0 pour ces formes ; le droit et l'\u00EElot gardent le sien) */\n  function parPiece(A) {\n    var l = A && A.S && A.S.layout;\n    return !!(ILOT_ON && ILOT_CHANTS && ilotM2(A) != null && (l === 'g-shape' || ((l === 'angle' || l === 'u-shape') && enOption(A))));\n  }\n  /* cl\u00E9s de la forme dont une pi\u00E8ce est au-del\u00E0 de P_MAX (en G, celles du sens dessin\u00E9) */\n  function clesProfondes(A) {\n    var S = A.S, T = CASE_PIECE[S.layout] || {}, gl = S.gDir === 'left';\n    return Object.keys(T).filter(function (k) { return (S.layout !== 'g-shape' || /GL(?:_|$)/.test(k) === gl) && piecesDeCle(A, k).some(function (p) { return partieIlot(A, p); }); });\n  }\n  /* avant le rendu : chaque case d'une pi\u00E8ce au-del\u00E0 de P_MAX coch\u00E9e ; l'\u00E9tat d'avant est gard\u00E9 (S.cpForceP, dans S comme\n     S.cpArrCotes : CP_simule le restaure) et rendu quand la pi\u00E8ce repasse sous le seuil. La case d'arri\u00E8re et le bout de\n     chaque pi\u00E8ce restent \u00E0 syncFini4 (la pi\u00E8ce finie sur 4 c\u00F4t\u00E9s) */\n  function syncProfPieces(A) {\n    var S = A.S, eb = S.edgeBanding = S.edgeBanding || {}, mem = S.cpForceP = S.cpForceP || {};\n    var ks = parPiece(A) ? clesProfondes(A) : [], f4 = {};\n    (PIECES_F4[S.layout] || []).forEach(function (p) { var b = boutPiece(A, p), a = clesArrP(A, p); if (a) f4[a] = 1; if (b) f4[b.k] = 1; });\n    Object.keys(mem).forEach(function (k) { if (ks.indexOf(k) < 0) { eb[k] = mem[k] === true; delete mem[k]; } });\n    ks.forEach(function (k) { if (f4[k]) return; if (!(k in mem)) mem[k] = eb[k] === true; eb[k] = true; });\n  }\n  /* pendant le rendu : ces cases coch\u00E9es, verrouill\u00E9es, comprises (raison \u00AB depthThreshold \u00BB, comme la r\u00E8gle du moteur :\n     jamais en \u00AB Chants supp. \u00BB, nomm\u00E9es par nommerFini4) ; les cases des autres pi\u00E8ces, telles que le moteur les pose. La cl\u00E9\n     des deux jambes du U (angleReturn), une seule jambe au-del\u00E0 : verrouill\u00E9e par la r\u00E8gle, elle reste telle quelle */\n  function poseProfPieces(A) {\n    if (!parPiece(A)) return null;\n    var ks = clesProfondes(A); if (!ks.length) return null;\n    var mixte = function (k) { return !piecesDeCle(A, k).every(function (p) { return partieIlot(A, p); }); };\n    var oCb = A.addEdgeCheckbox;\n    A.addEdgeCheckbox = function (x, y, edge, checked, disabled, reason) {\n      var a = [].slice.call(arguments);\n      if (ks.indexOf(edge) >= 0 && reason !== 'forceAll' && !(reason === 'locked' && mixte(edge))) { a[3] = true; a[4] = true; a[5] = 'depthThreshold'; a[6] = null; }\n      return oCb.apply(this, a);\n    };\n    return function () { A.addEdgeCheckbox = oCb; };\n  }\n  /* A-429 (COMMERCIAL, docs\\commercial-pierres-textes.md \u00A7 4) : bulle d'une case de la pi\u00E8ce plus profonde que P_MAX */\n  function texteProfond(P) { return '\u00C0 ' + fmtMm(P) + ' mm de profondeur, cette pi\u00E8ce est finie sur ses 4 c\u00F4t\u00E9s : ce chant est compris. R\u00E9duisez sa profondeur \u00E0 ' + fmtMm(P_MAX) + ' mm ou moins pour le retirer.'; }\n  function fini4Offert(A) { var l = A && A.S && A.S.layout; return !!(ILOT_CHANTS && PIECES_F4[l] && enOption(A) && (!(profForme(A) > P_MAX) || gProfond(A)) && ilotM2(A) != null); }\n  function fini4(A, p) {\n    if (!fini4Offert(A)) return false;\n    var S = A.S; if (partieIlot(A, p)) return true;\n    if (S.layout === 'g-shape' && p === 'retour') return S.cpArrG === true;\n    var m = S.cpFini4 && S.cpFini4[S.layout]; return !!(m && m[p] === true);\n  }\n  function poseFini4(A, p, on) {\n    var S = A.S; if (S.layout === 'g-shape' && p === 'retour') { S.cpArrG = on; return; }\n    var m = S.cpFini4 = S.cpFini4 || {}; (m[S.layout] = m[S.layout] || {})[p] = on;\n  }\n  /* pi\u00E8ce finie par un coin arrondi : { avant (la case d'avant le coin, rendue quand il est retir\u00E9), coin } */\n  function parCoin(A, p) {\n    var S = A.S; if (S.layout === 'g-shape' && p === 'retour') return S.cpArrGParCoin || null;\n    var m = S.cpFini4Coin && S.cpFini4Coin[S.layout]; return (m && m[p]) || null;\n  }\n  function poseParCoin(A, p, v) {\n    var S = A.S; if (S.layout === 'g-shape' && p === 'retour') { if (v) S.cpArrGParCoin = v; else delete S.cpArrGParCoin; return; }\n    var m = S.cpFini4Coin = S.cpFini4Coin || {}, n = m[S.layout] = m[S.layout] || {}; if (v) n[p] = v; else delete n[p];\n  }\n  function finies4(A) { return (PIECES_F4[A.S.layout] || []).filter(function (p) { return fini4(A, p); }); }\n  function boutsF4(A) { return finies4(A).map(function (p) { return boutPiece(A, p); }).filter(Boolean); }\n  /* cas 3 : coin ext\u00E9rieur de chaque jonction \u2192 [pi\u00E8ces qui s'y rejoignent, coin de la pi\u00E8ce d'angle et de la coupe \u00E0 45\u00B0] */\n  var COINS_JN = { 'angle-right': { endHTR: [['plan', 'retour'], 'L'] }, 'angle-left': { endHTL: [['plan', 'retour'], 'L'] },\n    'u-shape': { footLTL: [['gauche', 'fond'], 'g'], footRTR: [['fond', 'droite'], 'd'] },\n    'g-right': { gLeftTL: [['gauche', 'haut'], 'top'], gTopTR: [['haut', 'droite'], 'mid'], gRightBR: [['droite', 'retour'], 'ret'] },\n    'g-left': { gRightTL: [['gauche', 'haut'], 'top'], gTopTR: [['haut', 'droite'], 'mid'], gRightBL: [['gauche', 'retour'], 'ret'] } };\n  function coinsJn(A) { var S = A.S, l = S.layout; return COINS_JN[l === 'angle' ? (S.angleDir === 'left' ? 'angle-left' : 'angle-right') : l === 'g-shape' ? (S.gDir === 'left' ? 'g-left' : 'g-right') : l] || {}; }\n  /* coin c de jonction, l'offre ouverte : { pieces, pa (tenu par une pi\u00E8ce d'angle), c45 (coup\u00E9 \u00E0 45\u00B0) } ; sinon null */\n  function jnDe(A, c) {\n    var j = c && fini4Offert(A) ? coinsJn(A)[c] : null; if (!j) return null;\n    var S = A.S, l = S.layout, k = j[1];\n    return { pieces: j[0], pa: paCoin(A, k), c45: l === 'angle' ? !!S.cpJ45 : !!((l === 'u-shape' ? S.cpJ45U : S.cpJ45G) || {})[k] };\n  }\n  function jnRond(A, c) { var j = jnDe(A, c); return !!(j && !j.pa && !j.c45 && modeU(A) && PRIX_BOUT.arrondi > 0); }   /* Tour 625 (2) */\n  function nomJn(A, c) { var j = coinsJn(A)[c]; return 'coin ext\u00E9rieur ' + duF4(nomF4(A, j[0][0])) + ' et ' + duF4(nomF4(A, j[0][1])); }\n  /* Tour 625 (2) : pas de coin arrondi \u00E0 un coin de jonction tenu par une pi\u00E8ce d'angle ou coup\u00E9 \u00E0 45\u00B0 ; la bulle dit\n     pourquoi (textes de COMMERCIAL, docs\\commercial-formes-textes.md \u00A7 6, F9 et F10). La 2e phrase de F9 ne vaut que si\n     la jonction droite est possible : le menu des jonctions la propose toujours (cp-jonction, jamais gris\u00E9e) */\n  function TXT_JN_MENU(j) {\n    return 'Pas de coin arrondi ici : ' + (j.pa ? 'ce coin est fait par la pi\u00E8ce d\\'angle.' : 'les deux plans s\\'y rejoignent par une coupe \u00E0 45\u00B0.') +\n      ' Pour l\\'arrondir, choisissez une jonction droite \u00E0 ce coin.';\n  }\n  function TXT_JN_RETIRE(j) {\n    return j.pa ? 'Coin arrondi retir\u00E9 : ce coin est maintenant fait par la pi\u00E8ce d\\'angle.' : 'Coin arrondi retir\u00E9 : les deux plans s\\'y rejoignent maintenant par une coupe \u00E0 45\u00B0.';\n  }\n  function arrGOffert(A) { return fini4Offert(A) && A.S.layout === 'g-shape'; }   /* A-296 : retour fini 4 c\u00F4t\u00E9s, chants compris : r\u00E8gle \u00AB chants compris \u00BB seulement */\n  function arrG(A) { return arrGOffert(A) && A.S.cpArrG === true; }\n  /* avant le rendu : arri\u00E8re de chaque pi\u00E8ce finie sur 4 c\u00F4t\u00E9s (et son bout, compris) coch\u00E9s, les autres arri\u00E8res d\u00E9coch\u00E9s */\n  function syncFini4(A) {\n    if (!fini4Offert(A)) return;\n    var S = A.S; S.edgeBanding = S.edgeBanding || {}; S.cpClientBanding = S.cpClientBanding || {};\n    PIECES_F4[S.layout].forEach(function (p) {\n      var on = fini4(A, p), b = boutPiece(A, p);\n      [clesArrP(A, p)].concat(on && b ? [b.k] : []).forEach(function (k) { if (k) { S.edgeBanding[k] = on; S.cpClientBanding[k] = on; } });\n    });\n  }\n  /* apr\u00E8s le rendu : la case d'arri\u00E8re de chaque pi\u00E8ce dit son \u00E9tat ; celle de son bout, compris, est verrouill\u00E9e */\n  function nommerFini4() {\n    var A = getApp(); if (!A || !A.S || !A.dims) return;\n    var h = document.documentElement, of = fini4Offert(A) && !etat(A);\n    h.classList.toggle('cp-f4-offert', of);\n    if (!of) return;\n    /* A-355 (AUDIT Tour 728, COMMERCIAL Tour 115) : sous le plancher D9b de la pi\u00E8ce (q.d9b, la condition de sa ligne\n       d'Options), l'info-bulle dit le m\u00E8tre lin\u00E9aire, avec les mots de la ligne ; au m\u00B2, F4 et F5 inchang\u00E9s */\n    var co = compoOption(A), d9b = function (p) { var q = co && co.plans.filter(function (x) { return x.id === p; })[0]; return !!(q && q.arr && q.d9b); };\n    var nommees = bouts(A).map(function (b) { return b.k; });           /* A-429 : cases d\u00E9j\u00E0 nomm\u00E9es ici, ou bouts (nommerCasesBouts) */\n    PIECES_F4[A.S.layout].forEach(function (p) {\n      var n = nomF4(A, p), N = cap(n), on = fini4(A, p), pc = parCoin(A, p), jc = pc && pc.coin && coinsJn(A)[pc.coin], pi = partieIlot(A, p);\n      var ml = d9b(p), prix = ml ? ', ses chants compris : au m\u00E8tre lin\u00E9aire, son prix minimum' : ', au m\u00B2, ses chants compris';\n      var ou = jc ? 'au ' + nomJn(A, pc.coin) : 'au coin arri\u00E8re ' + duF4(n), le = (femF4(n) ? 'la ' : 'le ') + n;\n      /* \u00E9tats (a) et (b) d'AUDIT (Tour 625), textes de COMMERCIAL (F4, F5) : la pi\u00E8ce est contre le mur ; le retour du G\n         garde ses textes (A-296), contre un meuble. A-313 : partie du G au m\u00B2 (COMMERCIAL \u00A7 2) */\n      var gRet = A.S.layout === 'g-shape' && p === 'retour';\n      /* R148-b3 : \u00AB Chant du bord arri\u00E8re du retour : \u2026 \u00BB. R148-b4 (UX ; COMMERCIAL Tour 220 ; AUDIT 00:4x) : la pi\u00E8ce n'est\n         plus r\u00E9p\u00E9t\u00E9e, \u00AB Cocher pour finir la pi\u00E8ce sur ses 4 c\u00F4t\u00E9s. \u00BB */\n      var t = pi ? 'Chant du bord arri\u00E8re ' + duF4(n) + ' : fini, compris \u00E0 cette profondeur.'   /* A-429 (COMMERCIAL \u00A7 4) */\n        : pc ? 'Chant du bord arri\u00E8re ' + duF4(n) + ' : fini d\\'office, impos\u00E9 par le coin arrondi ' + ou + '. La pi\u00E8ce finie sur ses 4 c\u00F4t\u00E9s' + prix\n        : gRet ? (on ? 'Chant du bord arri\u00E8re ' + duF4(n) + ' : fini, la pi\u00E8ce finie sur ses 4 c\u00F4t\u00E9s' + prix + '. D\u00E9cocher : contre un meuble'\n          : 'Chant du bord arri\u00E8re ' + duF4(n) + ' : brut, contre un meuble. Cocher pour finir la pi\u00E8ce sur ses 4 c\u00F4t\u00E9s, au m\u00B2')\n        : on ? 'Chant du bord arri\u00E8re ' + duF4(n) + ' : fini, la pi\u00E8ce finie sur ses 4 c\u00F4t\u00E9s' + prix + '.'\n        : 'Chant du bord arri\u00E8re ' + duF4(n) + ' : brut, contre le mur. Cocher pour finir la pi\u00E8ce sur ses 4 c\u00F4t\u00E9s.';\n      var poser = function (cb, txt, verrou, coche) {\n        if (cb.getAttribute('role') !== 'checkbox') cb.setAttribute('role', 'checkbox');\n        if (cb.getAttribute('aria-checked') !== String(coche)) cb.setAttribute('aria-checked', String(coche));\n        if (verrou) { if (cb.getAttribute('aria-disabled') !== 'true') cb.setAttribute('aria-disabled', 'true'); if (!cb.classList.contains('disabled')) cb.classList.add('disabled'); }   /* A-291 : verrouill\u00E9e */\n        if (cb.getAttribute('aria-label') !== txt) cb.setAttribute('aria-label', txt);\n        if (cb.title !== txt) cb.title = txt;\n      };\n      var k = clesArrP(A, p), cb = k && A.dims.querySelector('.edge-checkbox-visual[data-edge=\"' + k + '\"]');\n      if (cb) { poser(cb, t, !!pc || pi, on); nommees.push(k); }\n      var b = on && boutPiece(A, p), cbb = b && A.dims.querySelector('.edge-checkbox-visual[data-edge=\"' + b.k + '\"]');\n      if (cbb) { poser(cbb, 'Chant du ' + nomCote(b.nom) + ' : fini, compris dans le prix, la pi\u00E8ce finie sur ses 4 c\u00F4t\u00E9s.', true, true); nommees.push(b.k); }   /* R148-b4 : style de R148-b3, pi\u00E8ce non r\u00E9p\u00E9t\u00E9e */\n    });\n    /* A-429 (COMMERCIAL, docs\\commercial-pierres-textes.md \u00A7 4) : les autres cases de la pi\u00E8ce plus profonde que P_MAX,\n       coch\u00E9es et verrouill\u00E9es par la r\u00E8gle de profondeur du moteur, \u00AB Chant du \u2026 : fini, compris \u00E0 cette profondeur. \u00BB.\n       Pas les cases nomm\u00E9es juste au-dessus ni les bouts (nomm\u00E9s ici ou par nommerCasesBouts, dans le m\u00EAme observateur) :\n       deux noms pour une case se relan\u00E7aient sans fin (page fig\u00E9e) */\n    if (gProfond(A)) Array.prototype.forEach.call(A.dims.querySelectorAll('.edge-checkbox-visual[data-force-reason=\"depthThreshold\"]:not([data-cp-nom])'), function (c) {\n      if (nommees.indexOf(c.dataset.edge) >= 0) return;\n      var bord = ((c.getAttribute('aria-label') || '').match(/^Chant du (.+?) : /) || [])[1], t = bord && 'Chant du ' + bord + ' : fini, compris \u00E0 cette profondeur.'; if (!t) return;\n      if (c.getAttribute('aria-label') !== t) c.setAttribute('aria-label', t);\n      if (c.title !== t) c.title = t;\n    });\n  }\n  function nommerArrG() { nommerFini4(); }\n  /* clic (souris, toucher, clavier via cp-a11y) sur la case d'arri\u00E8re d'une pi\u00E8ce : oui / non, au lieu du chant du moteur ;\n     sur le bout d'une pi\u00E8ce finie sur 4 c\u00F4t\u00E9s : compris, rien */\n  window.addEventListener('click', function (e) {\n    var A = getApp(), cb = e.target && e.target.closest && e.target.closest('.edge-checkbox-visual[data-edge]');\n    if (!cb || !A || !A.S || !A.dims || !A.dims.contains(cb) || !A.__cpPierreWrapped || !fini4Offert(A) || etat(A)) return;\n    var k = cb.dataset.edge, p = null, bout = null;\n    PIECES_F4[A.S.layout].forEach(function (x) { if (clesArrP(A, x) === k) p = x; var b = boutPiece(A, x); if (b && b.k === k && fini4(A, x)) bout = x; });\n    var redessine = function () { if (e.detail) setTimeout(function () { A.render(); }, 0); };   /* clic bloqu\u00E9 : pas de survol coll\u00E9 */\n    if (!p && !bout) {                                                 /* A-429 (COMMERCIAL \u00A7 4) : case de la pi\u00E8ce plus profonde que P_MAX */\n      var pk = gProfond(A) && cb.dataset.forceReason === 'depthThreshold' ? profDeCle(A, k) : 0;\n      if (pk > P_MAX) { e.preventDefault(); e.stopPropagation(); if (e.stopImmediatePropagation) e.stopImmediatePropagation(); toastBout(texteProfond(pk)); redessine(); }\n      return;\n    }\n    e.preventDefault(); e.stopPropagation(); if (e.stopImmediatePropagation) e.stopImmediatePropagation();\n    /* UX 18:13 (remarque 4) : le bout d'une pi\u00E8ce plus profonde que P_MAX dit pourquoi il est compris, comme ses autres cases */\n    if (!p) { if (bout && partieIlot(A, bout)) toastBout(texteProfond(profPartie(A, bout))); redessine(); return; }\n    var n = nomF4(A, p), pc = parCoin(A, p);\n    if (partieIlot(A, p)) { toastBout(texteProfond(profPartie(A, p))); redessine(); return; }   /* A-313 ; A-429 : texte de COMMERCIAL \u00A7 4 */\n    if (pc) { toastBout('Chant arri\u00E8re ' + duF4(n) + ' impos\u00E9 par le coin arrondi ' + (pc.coin && coinsJn(A)[pc.coin] ? 'au ' + nomJn(A, pc.coin) : 'au coin arri\u00E8re ' + duF4(n)) + ' : retirez l\\'arrondi pour le d\u00E9cocher.'); redessine(); return; }   /* A-291 */\n    if (!fini4(A, p)) { var b0 = boutPiece(A, p), cpg = b0 ? coupesDe(A, [b0.k]) : []; if (cpg.length) { toastBout(refusFini4(n, cpg)); redessine(); return; } }   /* A-294 */\n    poseFini4(A, p, !fini4(A, p)); A.render();\n    var nb = A.dims.querySelector('.edge-checkbox-visual[data-edge=\"' + k + '\"]'); if (nb) nb.focus();\n  }, true);\n  /* \u00EElot : droit, L ou U (formes coch\u00E9es dans la r\u00E8gle) ; le G reste sur devis ; plan droit avec son chant arri\u00E8re */\n  function ilotOk(A, P) {\n    var lay = A && A.S && A.S.layout; if (!(lay === 'linear' || lay === 'angle' || lay === 'u-shape')) return false;\n    if (arriere(A, P)) return true;\n    if (lay !== 'linear' && enOption(A)) return false;                 /* A-429 : plans joints, les pi\u00E8ces profondes seules au m\u00B2 (partieIlot) */\n    if (!ILOT_FORMES[lay]) return false;\n    P = P == null ? profForme(A) : num(P);\n    return P >= ILOT_MIN && P <= ILOT_MAX && ilotM2(A) != null;\n  }\n  /* pi\u00E8ces d'un L ou d'un U en \u00EElot : taill\u00E9es chacune dans la dalle (3 160 \u00D7 1 400 au plus), assembl\u00E9es bord \u00E0 bord aux\n     coins (jonction droite, comprise), selon la jonction du moteur (celle des pi\u00E8ces du dessin et de la commande) :\n     L \u00AB retour filant \u00BB (d\u00E9faut) : retour hors tout, plan jusqu'au retour ; \u00AB plan filant \u00BB : plan hors tout, retour depuis\n     le bord avant du plan. U, par coin : \u00AB jambe filante \u00BB (d\u00E9faut) : jambe hors tout ; \u00AB fond filant \u00BB : fond jusqu'au bout.\n     Ordre : d'un bout \u00E0 l'autre du plan. La somme des pi\u00E8ces = L1 + L2 (L), largeur + Lg + Ld (U) : coin compt\u00E9 une fois. */\n  function piecesIlot(A) {\n    var S = A.S, P = profForme(A);\n    if (S.layout === 'angle') {\n      var bL = S.junctionType === 'overlap' && !S.cpJ45;\n      return { P: P, jonctions: 1, pieces: [{ nom: 'plan principal', mm: num(S.L1) - (bL ? 0 : P) }, { nom: 'retour', mm: num(S.L2) + (bL ? 0 : P) }],   /* A-416 */\n        jonction: bL ? 'retour contre le bord avant du plan (plan filant)' : 'plan contre le c\u00F4t\u00E9 du retour (retour filant)' };\n    }\n    if (S.layout === 'u-shape') {\n      var o = S.cpJ45U || {}, gB = S.junctionLeftU === 'overlap' && !o.g, dB = S.junctionRightU === 'overlap' && !o.d;\n      var cote = function (b, n) { return b ? 'jambe ' + n + ' contre le bord avant du fond (fond filant)' : 'fond contre le c\u00F4t\u00E9 de la jambe ' + n + ' (jambe filante)'; };\n      return { P: P, jonctions: 2, pieces: [{ nom: 'jambe gauche', mm: num(S.Lg) + (gB ? 0 : P) },\n        { nom: 'fond', mm: num(S.Lc) + (gB ? num(S.Pl) : 0) + (dB ? num(S.Pr) : 0) }, { nom: 'jambe droite', mm: num(S.Ld) + (dB ? 0 : P) }],\n        jonction: cote(gB, 'gauche') + ' ; ' + cote(dB, 'droite') };\n    }\n    return null;\n  }\n  /* sous le dessin : \u00AB plan 1 600 \u00D7 800 mm et retour 1 800 \u00D7 800 mm, assembl\u00E9s bord \u00E0 bord au coin (jonction droite) \u00BB ;\n     commande (atelier) : pi\u00E8ces num\u00E9rot\u00E9es, puis les jonctions */\n  function texteIlot(A, atelier) {\n    var pi = piecesIlot(A); if (!pi) return '';\n    var t = pi.pieces.map(function (p, i) { return (atelier ? NUM[i] + ' ' : '') + p.nom + ' ' + fmtMm(p.mm) + ' \u00D7 ' + fmtMm(pi.P) + ' mm'; });\n    if (atelier) return t.join(' ; ') + ' ; jonction' + (pi.jonctions > 1 ? 's' : '') + ' droite' + (pi.jonctions > 1 ? 's' : '') + ', bord \u00E0 bord : ' + pi.jonction;\n    return t.slice(0, -1).join(', ') + ' et ' + t[t.length - 1] + ', assembl\u00E9s bord \u00E0 bord ' + (pi.jonctions > 1 ? 'aux 2 coins (jonctions droites)' : 'au coin (jonction droite)');\n  }\n  function mTxt(mm) { return (mm / 1000).toFixed(mm % 10 ? 3 : 2).replace('.', ','); }   /* 2,40 ; 0,701 */\n  window.CP_ilotOk = function (A) { return ilotOk(A || getApp()); };\n  window.CP_ilotMinMl = function (A) { A = A || getApp(); return ilotOk(A) ? (arriere(A) ? MIN_PLAN : ILOT_MIN_ML) : 0; };   /* chant arri\u00E8re : minimum du plan */\n  /* fen\u00EAtre de profondeur (cp-modele) : en L, en U et en G, pas de plage sous la plus petite tranche */\n  window.CP_depthPlancher = function (A) { A = A || getApp(); var f = forme(A); return f ? P_MIN : 0; };\n  /* d\u00E9coupes (cp-decoupes) : coins tenus par une pi\u00E8ce d'angle, et son c\u00F4t\u00E9 ; null hors pi\u00E8ce d'angle (\u00EElot, plan droit) */\n  window.CP_paCoins = function (A) {\n    A = A || getApp(); var l = A && A.S && A.S.layout; if (!PA_ON || !(l === 'angle' || l === 'u-shape') || ilotOk(A)) return null;\n    return { piece: PIECE, coins: { L: l === 'angle' && paCoin(A, 'L'), g: l === 'u-shape' && paCoin(A, 'g'), d: l === 'u-shape' && paCoin(A, 'd') } };\n  };\n  /* fen\u00EAtre de profondeur (cp-modele), plan droit avec chant arri\u00E8re au m\u00B2 : ce que deviennent les profondeurs basses */\n  window.CP_noteProf = function (A) {\n    A = A || getApp(); var S = A && A.S; if (!S || S.layout !== 'linear' || !(ARR_MM > 0) || ilotM2(A) == null) return '';\n    var t = trancheMin(A); if (!(t > ARR_MM)) return '';\n    var cm = function (mm) { return String(Math.round(mm / 10)); }, nb = ' ';\n    return 'Sous ' + cm(t) + nb + 'cm de profondeur, le plan est fini sur ses 4 c\u00F4t\u00E9s (chant arri\u00E8re compris), et le prix est calcul\u00E9 \u00E0 la surface (au m\u00B2), longueur factur\u00E9e d\\'au moins ' +\n      mTxt(MIN_PLAN) + nb + 'm. ' + (cm(t) === cm(ILOT_MIN - 1) ? '\u00C0 ' + cm(t) : 'De ' + cm(t) + ' \u00E0 ' + cm(ILOT_MIN - 1)) + nb + 'cm, le chant arri\u00E8re est en option, au m\u00EAme prix au m\u00B2, jamais moins que le plan au m\u00E8tre.';   /* D9b */\n  };\n  window.CP_ilotDim = function (A, P) { return ilotOk(A || getApp(), P) ? ILOT_MAX : 0; };\n  function ilot(A) {\n    if (!ilotOk(A)) return null;\n    var m2 = ilotM2(A), P = profForme(A), u = num(A.getUnitPriceCents());\n    var q = num(A.getBilledQtyCm ? A.getBilledQtyCm(A.getSelectedShopifyVariant && A.getSelectedShopifyVariant()) : 0);\n    if (!(q > 0 && u > 0)) return null;\n    var base = Math.round(q * u), pm = mTxt(P);                                                   /* 0,80 m ; 0,701 m */\n    if (A.S.layout === 'linear') {\n      var ar = arriere(A), sMin = ar && MIN_M2 > 0 ? MIN_M2 * 1e5 : 0;                            /* surface minimale (mm \u00D7 cm) */\n      var tarif = ar && arrTarif(), Pf = tarif ? Math.max(P, ARR_MM) : P;                         /* R182-b : profondeur factur\u00E9e, celle du tarif */\n      if (tarif) m2 = arrM2(A);\n      var total = Math.round(m2 * Math.max(Pf * q, sMin) / 1000);                                 /* \u20AC/m\u00B2 \u00D7 mm \u00D7 cm \u2192 centimes */\n      var tM2 = fmt(q) + ' m \u00D7 ' + mTxt(Pf) + ' m \u00D7 ' + fmtM2(m2) + ' \u20AC/m\u00B2 = ' + fmt(total) + ' \u20AC' + (sMin > Pf * q ? ' (minimum ' + String(MIN_M2).replace('.', ',') + ' m\u00B2)' : '');\n      var o = { m2: m2, P: P, qCm: q, arriere: ar, min_m: (ar ? MIN_PLAN : ILOT_MIN_ML) / 1000, total_cents: total, supplement_cents: total - base, texte: tM2, base: 'm2' };\n      if (tarif) {                                                     /* \u00AB 2,40 ml \u00D7 639 \u20AC/ml = 1 533,60 \u20AC \u00BB (COMMERCIAL, \u00AB R\u00E8gle finale \u00BB ; AUDIT Tour 1150, Q2 : \u00E0 toutes les profondeurs) */\n        var ml = Math.round(m2 * ARR_MM / 10) / 100;                  /* \u20AC/m\u00B2 \u00D7 m \u2192 \u20AC par m\u00E8tre, au centime */\n        o.P_facture = Pf; o.prix_ml = ml; o.base = 'mlTarif'; o.texte_m2 = tM2;\n        o.texte = fmt(q) + ' ml \u00D7 ' + (ml % 1 ? ml.toFixed(2).replace('.', ',') : fmtMm(ml)) + ' \u20AC/ml = ' + fmt(total) + ' \u20AC';\n      }\n      if (!ILOT_CHANTS) {                                              /* A-296 (ADMIN 23:26) : compris = l'arri\u00E8re et les chants verrouill\u00E9s par la r\u00E8gle ; les bouts suivent les chants coch\u00E9s */\n        var blk = (A._eff && A._eff.bandingLocked) || {}, NOMK = { front: 'avant', back: 'arri\u00E8re', sides: 'c\u00F4t\u00E9 gauche', right: 'c\u00F4t\u00E9 droit' }, ac = arrCotes(A);\n        o.chants_compris = ['front', 'back', 'sides', 'right'].filter(function (k) { return k === 'back' ? ar : blk['linear_' + k] === true && !(ac && (k === 'sides' || k === 'right')); }).map(function (k) { return NOMK[k]; });\n        /* A-298 : les c\u00F4t\u00E9s finis seulement s'ils sont coch\u00E9s (pay\u00E9s, \u00AB Chants supp. \u00BB) ou impos\u00E9s par un coin (pay\u00E9s aussi, Tour 527) ;\n           R182-a : ou finis d'office avec le chant arri\u00E8re (verrouill\u00E9s, pay\u00E9s sur leur ligne) */\n        o.cotes = ac ? ['c\u00F4t\u00E9 gauche (fini d\\'office avec le chant arri\u00E8re, pay\u00E9)', 'c\u00F4t\u00E9 droit (fini d\\'office avec le chant arri\u00E8re, pay\u00E9)']\n          : ['sides', 'right'].filter(function (k) { return blk['linear_' + k] !== true && A.S.edgeBanding && A.S.edgeBanding[k]; }).map(function (k) {\n          var cb = A.dims && A.dims.querySelector('.edge-checkbox-visual[data-edge=\"' + k + '\"]');\n          return NOMK[k] + (cb && cb.classList.contains('disabled') ? ' (impos\u00E9 par un coin, pay\u00E9)' : ' (pay\u00E9)');\n        });\n      }\n      /* D9b (Romain 06/10 15:4x, AUDIT Tours 493-494) : le plan fini sur 4 c\u00F4t\u00E9s par son chant arri\u00E8re est factur\u00E9 au plus\n         \u00E9lev\u00E9 du m\u00B2 et du prix du m\u00EAme plan au m\u00E8tre sans chant arri\u00E8re (son minimum au m\u00E8tre), l\u00E0 o\u00F9 ce plan est vendu \u00E0\n         cette profondeur (dans les tranches : P \u2265 la plus petite). Sous la plus petite tranche (arri\u00E8re impos\u00E9) : le m\u00B2 */\n      if (ar && arriereChoix(A) && base > total) {\n        var pu = u % 1 ? u.toFixed(2).replace('.', ',') : fmtMm(u);                               /* u : centimes par cm = \u20AC par m */\n        o.d9b = { m2_cents: total, ml_cents: base, texte_m2: tM2 };\n        o.total_cents = base; o.supplement_cents = 0; o.base = 'ml';\n        o.texte = fmt(q) + ' ml \u00D7 ' + pu + ' \u20AC = ' + fmt(base) + ' \u20AC';   /* client : la seule base retenue (AUDIT 17:39) ; la comparaison reste dans _d9b et le mod\u00E8le */\n      }\n      return o;\n    }\n    /* L et U : la surface du plan, le carr\u00E9 du coin compt\u00E9 une fois (somme des pi\u00E8ces taill\u00E9es) \u00D7 le prix de l'\u00EElot au m\u00B2 */\n    var pi = piecesIlot(A), long = pi.pieces.reduce(function (s, p) { return s + p.mm; }, 0), tot = Math.round(m2 * long * P / 1e4);\n    return { m2: m2, P: P, qCm: null, forme: A.S.layout === 'angle' ? 'L' : 'U', surface_m2: Math.round(long * P / 1e4) / 100, jonctions: pi.jonctions,\n      pieces: pi.pieces.map(function (p) { return { nom: p.nom, longueur_mm: p.mm, profondeur_mm: P }; }), jonction: pi.jonction,\n      total_cents: tot, supplement_cents: tot - base,\n      texte: '(' + pi.pieces.map(function (p) { return p.nom + ' ' + mTxt(p.mm); }).join(' + ') + ') m \u00D7 ' + pm + ' m \u00D7 ' + fmtM2(m2) + ' \u20AC/m\u00B2 = ' + fmt(tot) + ' \u20AC' };   /* \u00AB (plan 1,60 + retour 1,80) m \u00BB */\n  }\n  window.CP_ilot = function () { var A = getApp(); return A && !etat(A) ? ilot(A) : null; };   /* hors bornes : pas de calcul (il n'est ni affich\u00E9 ni envoy\u00E9) */\n  /* fen\u00EAtre de profondeur (cp-modele) : en L et en U, les plages s'arr\u00EAtent \u00E0 700 mm (pi\u00E8ce d'angle), sauf pour un d\u00E9cor\n     qui a son prix d'\u00EElot (jusqu'\u00E0 1 400 mm, au m\u00B2) */\n  window.CP_depthPlafond = function (A) { A = A || getApp(); var f = forme(A); return (f === 'angle' || f === 'u-shape') && (ilotForme(A) == null || !ILOT_FORMES[f]) ? P_MAX : 0; };\n  /* pas de ligne \u00AB Jonction \u00BB (r\u00E9capitulatif, fen\u00EAtre \u00AB Ajout\u00E9 \u00BB, commande) en L et en U : pi\u00E8ce d'angle sans jonction ; en\n     \u00EElot, les jonctions sont dites dans la d\u00E9coupe et la composition (cp-jonction) */\n  window.CP_sansJonction = function (A) { A = A || getApp(); var f = forme(A); return (f === 'angle' || f === 'u-shape' || f === 'g-shape') && toutPA(A); };\n\n  /* branches hors tout, profondeurs et nombre de coins touch\u00E9s par branche. En L, le moteur garde L1 hors tout (plan)\n     et L2 depuis le bord avant du plan (retour) : retour hors tout = L2 + P1 (cote \u00AB L2 \u00BB du dessin). Il facture\n     L1 + L2, soit la somme des pi\u00E8ces r\u00E9elles : le carr\u00E9 du coin compt\u00E9 une fois, comme en U. */\n  function branches(A) {\n    var S = A.S;\n    if (S.layout === 'angle') return { coins: 1, br: [\n      { nom: 'plan principal', L: num(S.L1), P: num(S.P1), coins: 1 },   /* A-416 */\n      { nom: 'retour', L: num(S.L2) + num(S.P1), P: num(S.P2), coins: 1 }] };\n    if (S.layout === 'u-shape') {\n      var Pc = num(S.Pc), Pl = num(S.Pl), Pr = num(S.Pr);\n      return { coins: 2, br: [\n        { nom: 'jambe gauche', L: Pc + num(S.Lg), P: Pl, coins: 1 },\n        { nom: 'fond', L: Pl + num(S.Lc) + Pr, P: Pc, coins: 2 },\n        { nom: 'jambe droite', L: Pc + num(S.Ld), P: Pr, coins: 1 }] };\n    }\n    return null;\n  }\n\n  function composition(A) {\n    var b = branches(A); if (!b) return null;\n    var pp = prixPiece(A), unit = num(A.getUnitPriceCents ? A.getUnitPriceCents() : 0);\n    var droits = [], factMm = 0;\n    b.br.forEach(function (x) {\n      var mm = x.L - x.coins * PIECE;\n      if (mm > 0) { droits.push({ nom: x.nom, mm: mm, facture_mm: Math.max(mm, MIN_DROIT) }); factMm += Math.max(mm, MIN_DROIT); }\n    });\n    var cm = Math.round(factMm / 10);\n    var base = num(A.getBilledQtyCm ? A.getBilledQtyCm() : 0) * unit;\n    var comp = pp == null ? null : Math.round(b.coins * pp * 100 + cm * unit);\n    return { coins: b.coins, prix_piece_cents: pp == null ? null : Math.round(pp * 100), droits: droits, droits_cm: cm,\n      composition_cents: comp, base_cents: Math.round(base), supplement_cents: comp == null ? null : comp - Math.round(base) };\n  }\n\n  /* pi\u00E8ces livr\u00E9es, dans l'ordre du plan (d'un bout \u00E0 l'autre), num\u00E9rot\u00E9es comme sur le dessin. Rep\u00E8re du trac\u00E9 : coin\n     haut gauche de l'ensemble ; en L, plan en haut et retour \u00E0 droite (ou \u00E0 gauche) ; en U, fond en haut, jambes vers le\n     bas. joints = ar\u00EAtes communes du droit avec les pi\u00E8ces d'angle ; c = o\u00F9 poser le num\u00E9ro. */\n  var NUM = ['\u2460', '\u2461', '\u2462', '\u2463', '\u2464'];\n  function piecesReelles(A) {\n    var S = A.S, K = PIECE, out = [];\n    var droit = function (nom, mm, pts, axis, joints) { if (mm > 0) out.push({ nom: nom, mm: mm, pts: pts, axis: axis, joints: joints, c: centre(pts) }); };\n    var angle = function (pts, c, coin) { out.push({ angle: true, coin: coin, pts: pts, axis: [1, 0], joints: [], c: c }); };\n    if (S.layout === 'angle') {\n      var L1 = num(S.L1), P1 = num(S.P1), P2 = num(S.P2), R = num(S.L2) + P1;\n      if (S.angleDir !== 'left') {\n        droit('plan', L1 - K, [[0, 0], [L1 - K, 0], [L1 - K, P1], [0, P1]], [1, 0], [[[L1 - K, 0], [L1 - K, P1]]]);\n        angle([[L1 - K, 0], [L1, 0], [L1, K], [L1 - P2, K], [L1 - P2, P1], [L1 - K, P1]], [L1 - P2 / 2, P1 / 2], 'L');\n        droit('retour', R - K, [[L1 - P2, K], [L1, K], [L1, R], [L1 - P2, R]], [0, 1], [[[L1 - P2, K], [L1, K]]]);\n      } else {\n        droit('plan', L1 - K, [[K, 0], [L1, 0], [L1, P1], [K, P1]], [1, 0], [[[K, 0], [K, P1]]]);\n        angle([[0, 0], [K, 0], [K, P1], [P2, P1], [P2, K], [0, K]], [P2 / 2, P1 / 2], 'L');\n        droit('retour', R - K, [[0, K], [P2, K], [P2, R], [0, R]], [0, 1], [[[0, K], [P2, K]]]);\n      }\n      return out;\n    }\n    if (S.layout === 'u-shape') {\n      var Pc = num(S.Pc), Pl = num(S.Pl), Pr = num(S.Pr), W = Pl + num(S.Lc) + Pr, G = Pc + num(S.Lg), D = Pc + num(S.Ld);\n      droit('jambe gauche', G - K, [[0, K], [Pl, K], [Pl, G], [0, G]], [0, 1], [[[0, K], [Pl, K]]]);\n      angle([[0, 0], [K, 0], [K, Pc], [Pl, Pc], [Pl, K], [0, K]], [Pl / 2, Pc / 2], 'g');\n      droit('fond', W - 2 * K, [[K, 0], [W - K, 0], [W - K, Pc], [K, Pc]], [1, 0], [[[K, 0], [K, Pc]], [[W - K, 0], [W - K, Pc]]]);\n      angle([[W - K, 0], [W, 0], [W, K], [W - Pr, K], [W - Pr, Pc], [W - K, Pc]], [W - Pr / 2, Pc / 2], 'd');\n      droit('jambe droite', D - K, [[W - Pr, K], [W, K], [W, D], [W - Pr, D]], [0, 1], [[[W - Pr, K], [W, K]]]);\n      return out;\n    }\n    if (S.layout === 'g-shape') {                                        /* G (plans joints) : la pi\u00E8ce d'angle de chaque coin, pour le dessin */\n      var Rg = S.gDir !== 'left', pt = num(S.Pgtop), pgr = num(S.Pgreturn), wl = Rg ? num(S.Pgleft) : num(S.Pgright), wr = Rg ? num(S.Pgright) : num(S.Pgleft);\n      var Wg = wl + num(S.Gtop), ll = pt + (Rg ? num(S.Gleft) : num(S.Gright)), lr = pt + (Rg ? num(S.Gright) : num(S.Gleft));\n      angle([[0, 0], [K, 0], [K, pt], [wl, pt], [wl, K], [0, K]], [wl / 2, pt / 2], 'top');\n      angle([[Wg - K, 0], [Wg, 0], [Wg, K], [Wg - wr, K], [Wg - wr, pt], [Wg - K, pt]], [Wg - wr / 2, pt / 2], 'mid');\n      if (Rg) angle([[Wg, lr - K], [Wg, lr], [Wg - K, lr], [Wg - K, lr - pgr], [Wg - wr, lr - pgr], [Wg - wr, lr - K]], [Wg - wr / 2, lr - pgr / 2], 'ret');\n      else angle([[0, ll - K], [0, ll], [K, ll], [K, ll - pgr], [wl, ll - pgr], [wl, ll - K]], [wl / 2, ll - pgr / 2], 'ret');\n      return out;\n    }\n    return null;\n  }\n  function centre(pts) {\n    var xs = pts.map(function (q) { return q[0]; }), ys = pts.map(function (q) { return q[1]; });\n    return [(Math.min.apply(null, xs) + Math.max.apply(null, xs)) / 2, (Math.min.apply(null, ys) + Math.max.apply(null, ys)) / 2];\n  }\n  /* propri\u00E9t\u00E9 cach\u00E9e \u00AB _composition \u00BB de la commande (atelier) : pi\u00E8ces num\u00E9rot\u00E9es dans l'ordre de la d\u00E9coupe, texte\n     inchang\u00E9 ; sous le dessin et dans \u00AB Composition \u00BB (sansNum, lot \u00AB messages 2 \u00BB, N27) : les m\u00EAmes pi\u00E8ces, sans num\u00E9ro,\n     sans \u00AB droit \u00BB, la pi\u00E8ce d'angle en cm (\u00AB plan 1 350 mm, pi\u00E8ce d'angle 105 \u00D7 105 cm, retour 750 mm \u00BB) */\n  function texteDecoupe(A, sansNum) {\n    return (piecesReelles(A) || []).map(function (p, i) {\n      if (sansNum) return p.angle ? 'pi\u00E8ce d\\'angle ' + paTxt() + ' cm' : p.nom + ' ' + fmtMm(p.mm) + ' mm';\n      return NUM[i] + ' ' + (p.angle ? 'pi\u00E8ce d\\'angle ' + paTxt() : 'droit ' + p.nom + ' ' + fmtMm(p.mm) + ' mm');\n    }).join(sansNum ? ', ' : ' ; ');\n  }\n  /* droit court (moins de 600 mm) : deux joints rapproch\u00E9s ; le c\u00F4t\u00E9 \u00E0 la longueur des pi\u00E8ces d'angle n'en a pas */\n  var ARTICLE = { plan: 'un plan', 'plan principal': 'un plan principal', retour: 'un retour', fond: 'un fond', 'jambe gauche': 'une jambe gauche', 'jambe droite': 'une jambe droite' };\n  function astuce(A) {\n    var b = branches(A); if (!b) return '';\n    return b.br.filter(function (x) { var mm = x.L - x.coins * PIECE; return mm > 0 && mm < 600; }).map(function (x) {\n      return 'Astuce : ' + ARTICLE[x.nom] + ' de ' + fmtMm(x.coins * PIECE) + ' mm \u00E9vite ce raccord de ' + fmtMm(x.L - x.coins * PIECE) + ' mm.';\n    }).join(' ');\n  }\n\n  /* contr\u00F4les bloquants propres \u00E0 la pierre en L, en U et en G */\n  /* plan droit au-del\u00E0 du seuil de l'\u00EElot, sans \u00EElot possible (forme d\u00E9coch\u00E9e, ou pas de prix d'\u00EElot pour la variante) :\n     sur devis, jamais au m\u00E8tre */\n  function droitSansIlot(A) { return ILOT_ON && A && A.S && A.S.layout === 'linear' && num(A.S.P) >= ILOT_MIN && ilotForme(A) == null; }\n  /* L23 (lot \u00AB messages 1 \u00BB) : sans \u00AB sur devis \u00BB (r\u00E8gle de Romain), ce qu'il faut changer ; sert aussi \u00E0 la note de l'\u00E9tat\n     \u00AB devis \u00BB */\n  function texteDroitSansIlot() {\n    return 'Plan de plus de ' + fmtMm(ILOT_MIN - 1) + ' mm de profondeur : non propos\u00E9 en ligne' + (ILOT_FORMES.linear ? ' pour ce d\u00E9cor' : '') +\n      '. R\u00E9duisez la profondeur \u00E0 ' + fmtMm(ILOT_MIN - 1) + ' mm au plus, ou \u00E9crivez-nous';\n  }\n  /* L24, L31, L32 (lot \u00AB messages 1 \u00BB) : les m\u00EAmes textes dans la note de l'\u00E9tat, qui les devan\u00E7ait avec \u00AB sur devis \u00BB (UX,\n     AUDIT 04:58) ; textes identiques \u00E0 ceux de controles() */\n  function texteGNon() { return 'Forme en G : non propos\u00E9e en ligne pour ce produit. Choisissez une autre forme, ou \u00E9crivez-nous'; }\n  function texteGProfond() { return 'Forme en G de plus de ' + fmtMm(P_MAX) + ' mm de profondeur : non propos\u00E9e en ligne. R\u00E9duisez la profondeur \u00E0 ' + fmtMm(P_MAX) + ' mm au plus, ou \u00E9crivez-nous'; }\n  function texteFormeDecor(f) { return 'Forme en ' + (f === 'angle' ? 'L' : 'U') + ' : non propos\u00E9e en ligne pour ce d\u00E9cor. Choisissez une autre forme ou un autre d\u00E9cor, ou \u00E9crivez-nous'; }\n  function texteFormeProfonde(f) { return 'Forme en ' + (f === 'angle' ? 'L' : 'U') + ' de plus de ' + fmtMm(P_MAX) + ' mm de profondeur : non propos\u00E9e en ligne' + (ILOT_FORMES[f] ? ' pour ce d\u00E9cor' : '') + '. R\u00E9duisez la profondeur \u00E0 ' + fmtMm(P_MAX) + ' mm au plus, ou \u00E9crivez-nous'; }\n  /* textes d'\u00E9chec du lot \u00AB messages 1 \u00BB (COMMERCIAL, AUDIT Tour 597) : ce qu'il faut changer, sans \u00AB sur devis \u00BB ni point\n     final (la garde joint par \u00AB ; \u00BB et met \u00AB . \u00BB) ; textes de r\u00E9ussite inchang\u00E9s (mod\u00E8le de la commande) */\n  function controles(A) {\n    var f = forme(A), out = [];\n    var add = function (id, ok, msg, msgOk) { out.push({ id: id, ok: !!ok, bloquant: true, message: ok && msgOk ? msgOk : msg }); };\n    if (!f) { if (droitSansIlot(A)) add('pierre_prix_ilot', false, texteDroitSansIlot()); return out; }\n    if (f === 'g-shape' && !joints(A)) {                                /* G : en plans joints ; au-del\u00E0 de P_MAX, avec le prix d'\u00EElot du d\u00E9cor (A-313) ; sinon non propos\u00E9 en ligne */\n      add('pierre_g', false, profForme(A) > P_MAX && enOption(A)\n        ? 'Forme en G de plus de ' + fmtMm(P_MAX) + ' mm de profondeur : non propos\u00E9e en ligne. R\u00E9duisez la profondeur \u00E0 ' + fmtMm(P_MAX) + ' mm au plus, ou \u00E9crivez-nous'   /* L24 */\n        : 'Forme en G : non propos\u00E9e en ligne pour ce produit. Choisissez une autre forme, ou \u00E9crivez-nous');\n      return out;\n    }\n    if (joints(A)) {                                                    /* plans joints, pi\u00E8ces d'angle choisies */\n      var pl = plans(A), S1 = A.S, pHaut = ilotM2(A) != null ? ILOT_MAX : P_MAX;   /* A-313 : partie du G jusqu'au maximum de l'\u00EElot ; A-429 : pi\u00E8ce du L et du U aussi */\n      if (!pl) {                                                        /* L67 : panne de calcul, contr\u00F4le interne (message unique, seul) */\n        out.push({ id: 'pierre_plans', ok: false, bloquant: true, interne: true, detail: 'Forme non calcul\u00E9e', message: window.CP_MSG_INTERNE || 'Ce plan ne peut pas \u00EAtre command\u00E9 en ligne pour l\\'instant. \u00C9crivez-nous.' });\n        return out;\n      }\n      if (f === 'g-shape') add('pierre_g_passage', pl.ouvert, 'Forme en G : le retour touche le montant d\\'en face. Raccourcissez le retour ou allongez le plan du haut',   /* L25 */\n        'Forme en G : le retour touche le montant d\\'en face ; laissez un passage');\n      if (pl.pa) add('pierre_prix_angle', prixPiece(A) != null, 'Pi\u00E8ce d\\'angle : non propos\u00E9e en ligne pour ce d\u00E9cor. Retirez la pi\u00E8ce d\\'angle, ou \u00E9crivez-nous',   /* L26 */\n        'Pi\u00E8ce d\\'angle : propos\u00E9e pour ce d\u00E9cor');                        /* lot \u00AB messages 2 \u00BB, M2 : r\u00E9ussite sans \u00AB sur devis \u00BB */\n      /* M3 : \u00AB , ou choisissez une autre jonction \u00BB seulement s'il y a une jonction \u00E0 changer (comme M1 et L17) */\n      var autreJn = (pl.jonctions || []).some(Boolean);\n      pl.pieces.forEach(function (x) {\n        /* A-347 (R3) : la pi\u00E8ce du haut du G se lit \u00AB plan du haut \u00BB (NOMS de plansG, N28) ; l'identifiant du contr\u00F4le garde\n           \u00AB haut \u00BB (pierre_plan_haut), comme avant le lot \u00AB messages 2 \u00BB. M4 (COMMERCIAL \u00A7 M, AUDIT Tour 667) : le style\n           d'A-345, article et nom sans guillemets (\u00AB Profondeur du plan du haut \u00BB, \u00AB Le retour mesure \u00BB) */\n        var nm = x.nom, id = 'pierre_plan_' + (nm === 'plan du haut' ? 'haut' : nm).replace(/\\s+/g, '_');\n        var nf = nomF4(A, x.id), du = duF4(nf), le = (femF4(nf) ? 'la ' : 'le ') + nf, Le = le.charAt(0).toUpperCase() + le.slice(1);\n        add(id + '_profondeur', x.P >= P_MIN && x.P <= pHaut, 'Profondeur ' + du + ' : ' + fmtMm(x.P) + ' mm. Choisissez de ' + fmtMm(P_MIN) + ' \u00E0 ' + fmtMm(pHaut) + ' mm',   /* L27 */\n          'Profondeur ' + du + ' : de ' + fmtMm(P_MIN) + ' \u00E0 ' + fmtMm(pHaut) + ' mm (ici ' + fmtMm(x.P) + ' mm)');\n        /* L28 : le c\u00F4t\u00E9 nomm\u00E9 et ce qu'il faut changer, d'apr\u00E8s la longueur apr\u00E8s la pi\u00E8ce d'angle (x.mm) ; L29 : sans pi\u00E8ce\n           d'angle \u00E0 ce coin, d'un seul tenant ; \u00E0 0 ou moins, le texte de sa famille (AUDIT, point 4) */\n        var trop = 'C\u00F4t\u00E9 ' + du + ' trop court pour la pi\u00E8ce d\\'angle. Allongez-le' + (x.mm < 0 ? ' de ' + fmtMm(-x.mm) + ' mm au moins' : '');\n        /* A-307 : plan trop long, la cote qui l'allonge et sa borne (cp-forme), \u00AB R\u00E9duisez la cote L1 \u00E0 3 590 mm au plus \u00BB */\n        var cote = x.mm > BR_MAX && typeof window.CP_coteDe === 'function' ? window.CP_coteDe(A, 'plan:' + x.nom) : null;\n        var reduire = cote ? 'R\u00E9duisez la cote ' + cote.k + ' \u00E0 ' + fmtMm(cote.max) + ' mm au plus' : null;\n        if (x.pa) add(id, x.mm === 0 || (x.mm >= MIN_DROIT && x.mm <= BR_MAX),\n          (x.mm < 0 ? trop\n            : x.mm < MIN_DROIT ? 'C\u00F4t\u00E9 ' + du + ' : allongez-le de ' + fmtMm(MIN_DROIT - x.mm) + ' mm, ou raccourcissez-le de ' + fmtMm(x.mm) + ' mm'\n            : 'C\u00F4t\u00E9 ' + du + ' trop long pour la pi\u00E8ce d\\'angle. ' + (reduire || 'Raccourcissez-le de ' + fmtMm(x.mm - BR_MAX) + ' mm au moins')) + borneDecor(),\n          'Avec la pi\u00E8ce d\\'angle, ' + le + ' mesure ' + fmtMm(x.mm) + ' mm apr\u00E8s elle : 0, ou de ' + fmtMm(MIN_DROIT) + ' \u00E0 ' + fmtMm(BR_MAX) + ' mm' + borneDecor());\n        else add(id, x.mm > 0 && x.mm <= BR_MAX,\n          (x.mm > 0 ? Le + ' : ' + fmtMm(x.mm) + ' mm, ' + fmtMm(BR_MAX) + ' mm au plus d\\'un seul tenant. ' + (reduire || 'Raccourcissez ce c\u00F4t\u00E9') + (autreJn ? ', ou choisissez une autre jonction' : '') : trop) + borneDecor(),   /* L29, M3, M4 */\n          Le + ' mesure ' + fmtMm(x.mm) + ' mm : ' + fmtMm(BR_MAX) + ' mm au plus par plan' + borneDecor());\n      });\n      /* A-345 : la pi\u00E8ce d'angle du tarif est sym\u00E9trique et vendue par \u00E9paisseur seulement (PDF 34 et 44, ADMIN \u00A7 7) : les deux\n         plans qui s'y joignent ont la m\u00EAme profondeur (texte de COMMERCIAL, docs\\commercial-a345-piece-angle-hpl.md \u00A7 3) */\n      var PAIRES = { angle: { L: ['plan', 'retour'] }, 'u-shape': { g: ['gauche', 'fond'], d: ['fond', 'droite'] },\n        'g-shape': { top: ['gauche', 'haut'], mid: ['haut', 'droite'], ret: [S1.gDir === 'left' ? 'gauche' : 'droite', 'retour'] } };\n      var NOM_COIN = { g: '\u00E0 gauche', d: '\u00E0 droite', top: 'en haut \u00E0 gauche', mid: 'en haut \u00E0 droite', ret: 'au retour' }, plu = (COINS[S1.layout] || []).length > 1;\n      var leNom = function (x) { var n = nomF4(A, x.id); return (femF4(n) ? 'la ' : 'le ') + n; };\n      (COINS[S1.layout] || []).forEach(function (c) {\n        if (!paCoin(A, c)) return;\n        add('pierre_angle_90_' + c, Math.abs(angleCoin(A, c) - 90) < 0.01, 'Pi\u00E8ce d\\'angle : possible seulement \u00E0 90\u00B0. Remettez ce coin \u00E0 90\u00B0, ou retirez la pi\u00E8ce d\\'angle',   /* L30 */\n          'Pi\u00E8ce d\\'angle : 90\u00B0 seulement');\n        var pr = (PAIRES[S1.layout] || {})[c] || [], a = pl.pieces.filter(function (x) { return x.id === pr[0]; })[0], b = pl.pieces.filter(function (x) { return x.id === pr[1]; })[0];\n        if (a && b) add('pierre_angle_profondeur_' + c, a.P === b.P,\n          'Pi\u00E8ce d\\'angle' + (plu ? ' ' + NOM_COIN[c] : '') + ' : ' + leNom(a) + ' (' + fmtMm(a.P) + ' mm) et ' + leNom(b) + ' (' + fmtMm(b.P) + ' mm) n\\'ont pas la m\u00EAme profondeur. ' +\n          'Mettez-les \u00E0 la m\u00EAme profondeur, ou choisissez une autre jonction' + (plu ? ' \u00E0 ce coin' : ''),\n          'Pi\u00E8ce d\\'angle' + (plu ? ' ' + NOM_COIN[c] : '') + ' : ' + leNom(a) + ' et ' + leNom(b) + ' \u00E0 la m\u00EAme profondeur (' + fmtMm(a.P) + ' mm)');\n      });\n      return out;\n    }\n    var b = branches(A), S = A.S, en = f === 'angle' ? 'L' : 'U';\n    var ps = b.br.map(function (x) { return x.P; }), P = ps[0], ilo = P > P_MAX, hi = ilotForme(A) != null ? ILOT_MAX : P_MAX;\n    /* jusqu'\u00E0 700 mm, la pi\u00E8ce d'angle ; au-del\u00E0, l'\u00EElot au m\u00B2 (d\u00E9cor qui a son prix d'\u00EElot) */\n    if (!ilo) add('pierre_prix_angle', prixPiece(A) != null, 'Forme en ' + en + ' : non propos\u00E9e en ligne pour ce d\u00E9cor. Choisissez une autre forme ou un autre d\u00E9cor, ou \u00E9crivez-nous',   /* L31 */\n      'Forme en ' + en + ' : propos\u00E9e pour ce d\u00E9cor');                     /* M2 */\n    else add('pierre_prix_ilot', ilotForme(A) != null, 'Forme en ' + en + ' de plus de ' + fmtMm(P_MAX) + ' mm de profondeur : non propos\u00E9e en ligne' + (ILOT_FORMES[f] ? ' pour ce d\u00E9cor' : '') +\n      '. R\u00E9duisez la profondeur \u00E0 ' + fmtMm(P_MAX) + ' mm au plus, ou \u00E9crivez-nous',   /* L32 */\n      'Forme en ' + en + ' de plus de ' + fmtMm(P_MAX) + ' mm de profondeur : tous les c\u00F4t\u00E9s finis, au m\u00B2');   /* M2 : le mot d'A-316, sans \u00AB \u00EElot \u00BB */\n    var pOk = ps.every(function (p) { return p >= P_MIN && p <= hi; }) && ps.every(function (p) { return p === P; });\n    add('pierre_profondeur', pOk, 'En ' + en + ', la profondeur doit \u00EAtre de ' + fmtMm(P_MIN) + ' \u00E0 ' + fmtMm(hi) + ' mm, la m\u00EAme pour tout le plan. Modifiez la profondeur',   /* L33 */\n      'En ' + en + ', profondeur de ' + fmtMm(P_MIN) + ' \u00E0 ' + fmtMm(hi) + ' mm (la m\u00EAme pour tout le plan)');   /* M2 : P_MIN en fmtMm (T7) */\n    b.br.forEach(function (x) {\n      var id = 'pierre_branche_' + x.nom.replace(/\\s+/g, '_');\n      if (ilo) {                                   /* \u00EElot : chaque pi\u00E8ce d'au moins 300 mm, c\u00F4t\u00E9 de 3 160 mm au plus hors tout */\n        var mi = x.coins * P + MIN_DROIT;\n        /* L34 : sans le mot \u00AB \u00EElot \u00BB, que le client n'a pas choisi (A-316, lot \u00AB annonces \u00BB) */\n        add(id, x.L >= mi && x.L <= BR_MAX, 'Plan en ' + en + ' tous c\u00F4t\u00E9s finis : le c\u00F4t\u00E9 \u00AB ' + x.nom + ' \u00BB mesure ' + fmtMm(x.L) + ' mm sur toute sa longueur, il faut de ' + fmtMm(mi) + ' \u00E0 ' + fmtMm(BR_MAX) + ' mm. Modifiez ce c\u00F4t\u00E9',\n          'En \u00EElot, le c\u00F4t\u00E9 \u00AB ' + x.nom + ' \u00BB doit mesurer de ' + fmtMm(mi) + ' \u00E0 ' + fmtMm(BR_MAX) + ' mm hors tout (ici ' + fmtMm(x.L) + ' mm)');\n        return;\n      }\n      /* pi\u00E8ce droite absente ou d'au moins 300 mm : c\u00F4t\u00E9 = longueur des pi\u00E8ces d'angle tout juste, ou au moins 300 mm de plus */\n      var juste = x.coins * PIECE, mini = juste + MIN_DROIT;\n      var ok = x.L === juste || (x.L >= mini && x.L <= BR_MAX);\n      add(id, ok, 'Avec la pi\u00E8ce d\\'angle, le c\u00F4t\u00E9 \u00AB ' + x.nom + ' \u00BB mesure ' + fmtMm(x.L) + ' mm sur toute sa longueur : il faut ' + fmtMm(juste) + ' mm tout juste, ou de ' + fmtMm(mini) + ' \u00E0 ' + fmtMm(BR_MAX) + ' mm. Modifiez ce c\u00F4t\u00E9',   /* L35 */\n        'Avec la pi\u00E8ce d\\'angle, le c\u00F4t\u00E9 \u00AB ' + x.nom + ' \u00BB doit mesurer ' + fmtMm(juste) + ' mm, ou de ' + fmtMm(mini) + ' \u00E0 ' + fmtMm(BR_MAX) + ' mm hors tout (ici ' + fmtMm(x.L) + ' mm)');\n    });\n    var angs = f === 'angle' ? [num(S.innerAngle) || 90] : (function () { var c = S.cpAng && S.cpAng['u-shape']; return c ? [num(c.g) || 90, num(c.d) || 90] : [90]; })();\n    add('pierre_angle_90', angs.every(function (a) { return Math.abs(a - 90) < 0.01; }), (ilo ? 'Plan en ' + en + ' tous c\u00F4t\u00E9s finis' : 'Pi\u00E8ce d\\'angle') + ' : angles \u00E0 90\u00B0 seulement. Remettez l\\'angle \u00E0 90\u00B0',   /* L36, A-316 : pas le mot \u00AB \u00EElot \u00BB pour le client */\n      (ilo ? 'Plan en ' + en + ' tous c\u00F4t\u00E9s finis' : 'Pi\u00E8ce d\\'angle') + ' : angles \u00E0 90\u00B0 seulement');\n    return out;\n  }\n  /* A-307 : longueurs que BR_MAX borne dans controles() (plans joints ; c\u00F4t\u00E9s d'un L ou d'un U en \u00EElot ou \u00E0 pi\u00E8ce d'angle\n     impos\u00E9e), d'apr\u00E8s l'\u00E9tat seul : la borne des cotes (cp-forme) y lit ce qu'une cote allonge ; la garde de cp-modele n'y\n     ajoute pas son propre message */\n  window.CP_longueursMax = function (A) {\n    A = A || getApp(); var f = A && A.S ? forme(A) : null, out = [];\n    if (!f) return out;\n    if (joints(A)) {\n      var pl = plans(A); if (pl) pl.pieces.forEach(function (x) { out.push({ cle: 'plan:' + x.nom, nom: x.nom, mm: x.mm, max: BR_MAX }); });\n      return out;\n    }\n    if (f === 'g-shape') return out;                                    /* G non propos\u00E9 : contr\u00F4le pierre_g */\n    var b = branches(A); if (b) b.br.forEach(function (x) { out.push({ cle: 'branche:' + x.nom, nom: x.nom, mm: x.L, max: BR_MAX }); });\n    return out;\n  };\n  /* A-345 : coins tenus par une pi\u00E8ce d'angle, pour la g\u00E9om\u00E9trie de commande (cp-modele, CP_piecesPA) : la pi\u00E8ce du tarif,\n     PIECE le long de chaque mur, avant en biais d'un bout \u00E0 l'autre ; seulement l\u00E0 o\u00F9 la pi\u00E8ce est vendue (plans joints en\n     option, ou pi\u00E8ce impos\u00E9e hors \u00EElot) et \u00E0 90\u00B0 */\n  function paCoins(A) {\n    var f = A && A.S ? forme(A) : null; if (!f) return null;\n    if (enOption(A) ? !joints(A) : (f === 'g-shape' || ilotOk(A))) return null;\n    var cs = (COINS[f] || []).filter(function (c) { return paCoin(A, c) && Math.abs(angleCoin(A, c) - 90) < 0.01; });\n    return cs.length ? { K: PIECE, coins: cs } : null;\n  }\n  window.CP_paGeometrie = function (A) { A = A || getApp(); return A ? paCoins(A) : null; };\n  window.CP_pierreAngle = function () {\n    var A = getApp(); if (!A || !A.S) return null;\n    var lu = forme(A) && (forme(A) !== 'g-shape' || enOption(A)), il = lu && ilotOk(A), op = lu && !il && enOption(A);\n    return { forme: forme(A), prix_piece: prixPiece(A), composition: lu && !il ? (op ? compoOption(A) : composition(A)) : null,\n      decoupe: lu ? (il ? texteIlot(A, true) : op ? texteOption(A, true) : texteDecoupe(A)) : null,\n      pieces: lu && !il && !op ? piecesReelles(A) : null, ilot: il ? ilot(A) : null, controles: controles(A) };\n  };\n\n  /* \u2500\u2500 \u00C9tat de la forme : null = commandable ; \u00AB devis \u00BB = G, ou L / U sans prix de pi\u00E8ce ; \u00AB hors \u00BB = hors bornes.\n     Dans les deux derniers cas : motif permanent au-dessus du bouton (role=status), ni montant, ni suppl\u00E9ment, ni\n     d\u00E9coupe, ni bouton d'ajout (la garde du panier reste). \u2500\u2500 */\n  function etat(A) {\n    var f = forme(A); if (!f) return droitSansIlot(A) ? { mode: 'devis', texte: texteDroitSansIlot() + '. ' } : null;\n    if (f === 'g-shape' && !enOption(A)) return { mode: 'devis', texte: texteGNon() + '. ' };\n    if (f === 'g-shape' && profForme(A) > P_MAX && !gProfond(A)) return { mode: 'devis', texte: texteGProfond() + '. ' };   /* A-313 : seulement sans prix d'\u00EElot */\n    var en = f === 'angle' ? 'L' : 'U';\n    if (f !== 'g-shape' && profForme(A) > P_MAX) { if (enOption(A) ? !gProfond(A) : ilotForme(A) == null) return { mode: 'devis', texte: texteFormeProfonde(f) + '. ' }; }   /* A-429 : plans joints, comme le G */\n    else if (!enOption(A) && prixPiece(A) == null) return { mode: 'devis', texte: texteFormeDecor(f) + '. ' };\n    var ko = controles(A).filter(function (c) { return !c.ok; });\n    /* lot \u00AB messages 1 \u00BB : un contr\u00F4le interne en \u00E9chec, son message seul (A2) ; sinon le pr\u00E9fixe commun aux 4 gardes (point 7) */\n    var ki = ko.filter(function (c) { return c.interne; })[0];\n    if (ki) return { mode: 'hors', interne: true, texte: ki.message + ' ' };\n    /* A-385 (AUDIT) : un seul point final ; les messages R36 (COMMERCIAL) finissent d\u00E9j\u00E0 par \u00AB . \u00BB, les autres non */\n    var tko = ko.map(function (c) { return String(c.message).replace(/\\.\\s*$/, ''); }).join(' ; ');\n    if (ko.length) return { mode: 'hors', texte: 'Commande impossible en l\\'\u00E9tat : ' + tko + (/[.!?]$/.test(tko) ? ' ' : '. ') };\n    return null;\n  }\n  function noteEtat(A) {\n    var e = etat(A), h = document.documentElement, add = document.getElementById('btn-add-cart'), n = document.getElementById('cp-pierre-note');\n    h.classList.toggle('cp-pierre-bloque', !!e);\n    h.setAttribute('data-cp-pierre', e ? e.mode : '');\n    if (!e) { if (n && n.parentNode) n.parentNode.removeChild(n); return; }\n    if (!add || !add.parentNode) return;\n    if (!n) {\n      n = document.createElement('p'); n.id = 'cp-pierre-note'; n.setAttribute('role', 'status');\n      n.style.cssText = 'margin:0 0 8px;padding:10px 12px;border-radius:8px;background:#f4f1eb;color:#1f2937;font-size:14px;line-height:1.45';\n      add.parentNode.insertBefore(n, add);\n    }\n    /* lot \u00AB messages 2 \u00BB, N47 (AUDIT Tour 648) : un seul lien au plus, vers le contact, pos\u00E9 sur \u00AB \u00E9crivez-nous \u00BB du texte ;\n       \u00E9tat \u00AB hors \u00BB qui dit quoi changer : aucun lien (le client corrige seul) ; plus de \u00AB Demander un devis \u00BB */\n    var t = e.texte.replace(/\\s+$/, ''), lien = e.mode === 'devis' || e.interne, i = lien ? t.search(/\u00E9crivez-nous(?=\\W*$)/i) : -1;\n    if (n.getAttribute('data-cp-texte') === t) return;\n    n.setAttribute('data-cp-texte', t);\n    n.textContent = i < 0 ? t : t.slice(0, i);\n    if (i < 0) return;\n    var m = t.slice(i).match(/^\u00E9crivez-nous/i)[0];\n    var a = document.createElement('a'); a.href = CONTACT; a.textContent = m; a.style.cssText = 'font-weight:600;text-decoration:underline';\n    n.appendChild(a); n.appendChild(document.createTextNode(t.slice(i + m.length)));\n  }\n  function injectCss() {\n    if (document.getElementById('cp-pierre-css')) return;\n    var st = document.createElement('style'); st.id = 'cp-pierre-css';\n    /* non commandable : ni barre de prix ni bouton d'ajout ; la jonction du moteur (filant, 45\u00B0) n'a pas de sens avec la pi\u00E8ce d'angle */\n    /* A-317 : retir\u00E9 (display), et non seulement cach\u00E9 : un bouton cach\u00E9 restait un bouton \u00AB Ajouter au panier \u00BB actif, de 820 px \u00E0 1 440 */\n    st.textContent = 'html.cp-pierre-bloque .cp-pricebar{visibility:hidden!important}html.cp-pierre-bloque #btn-add-cart,html.cp-pierre-bloque .cp-pricebar__add{display:none!important}' +\n      /* pi\u00E8ce d'angle d'\u00E9querre : ni choix de jonction ni angle hors d'\u00E9querre en L, U et G */\n      'html.cp-pierre-forme #cp-jct,html.cp-pierre-forme #cp-ang,html.cp-pierre-forme #cp-angles{display:none!important}' +\n      /* ni ligne de jonction sur le dessin ni ligne \u00AB Jonction \u00BB au r\u00E9capitulatif */\n      'html.cp-pierre-forme #cp-recap-jonction,html.cp-pierre-forme .junction-group{display:none!important}' +\n      '.layout-btn .cp-pierre-devis{display:block;margin-top:2px;font-size:12px;font-weight:400;line-height:1.2;color:#6b7280}' +\n      '#cp-pierre-compo{margin:6px 0 0;font-size:13px;line-height:1.45;color:#374151}' +\n      /* \u00EElot : droit, L ou U (pas le G, sur devis), et pour un d\u00E9cor qui a son prix d'\u00EElot */\n      'html.cp-pierre-g #edge-popup-content .depth-btn[data-cp-depth=\"depth_custom_pierre_701_1400\"],html.cp-pierre-g #edge-popup-content .cp-ilot-note,' +\n      'html.cp-ilot-non #edge-popup-content .depth-btn[data-cp-depth=\"depth_custom_pierre_701_1400\"],html.cp-ilot-non #edge-popup-content .cp-ilot-note{display:none!important}' + cssMurs() + cssBouts() + cssArriere() + cssFini4() + cssChantsVus();   /* R202 */\n    (document.head || document.documentElement).appendChild(st);\n  }\n  /* non commandable : aucun montant dans le r\u00E9capitulatif (le moteur r\u00E9\u00E9crit ces cases \u00E0 chaque calcul) */\n  function masquePrix() {\n    var h = document.documentElement; if (!h.classList.contains('cp-pierre-bloque')) return;\n    var t = '\u2014';                                                        /* lot \u00AB messages 2 \u00BB, N35 : plus de \u00AB Sur devis \u00BB ; la note dit pourquoi */\n    ['td-prix-base', 'td-prix-total', 'total-multi-price', 'td-options'].forEach(function (id) {\n      var e = document.getElementById(id); if (e && e.textContent !== t) e.textContent = t;\n    });\n  }\n  function ligneCompo(A) {\n    var f = forme(A), el = document.getElementById('cp-pierre-compo');\n    document.documentElement.classList.toggle('cp-pierre-forme', !!f && !enOption(A));   /* en option : carte de jonction et angles gard\u00E9s */\n    /* A-430 (AUDIT Tours 1213 et 1215) : en plans joints avec un prix d'\u00EElot, chaque partie du G se commande au-del\u00E0 de P_MAX\n       (A-313) : la tranche profonde n'est plus cach\u00E9e dans la fen\u00EAtre (qui l'annon\u00E7ait dans son titre) */\n    document.documentElement.classList.toggle('cp-pierre-g', f === 'g-shape' && !(enOption(A) && ilotM2(A) != null));\n    var lu = (f === 'angle' || f === 'u-shape' || (f === 'g-shape' && enOption(A))) && !etat(A), il = lu && ilotOk(A), op = lu && !il && enOption(A), c = lu && !il && !op ? composition(A) : null;\n    if (!c && !il && !op) { if (el && el.parentNode) el.parentNode.removeChild(el); return; }\n    var host = document.getElementById('cp-stage-extras') || (document.getElementById('stage') && document.getElementById('stage').parentNode);\n    if (!host) return;\n    if (!el) { el = document.createElement('p'); el.id = 'cp-pierre-compo'; host.appendChild(el); }\n    var as = il || op ? '' : astuce(A), t = 'D\u00E9coupe : ' + (il ? texteIlot(A) : op ? texteOption(A, false) : texteDecoupe(A, true)) + '.' + (as ? ' ' + as : '');   /* \u00EElot : pi\u00E8ces et jonctions en texte seulement */\n    if (el.textContent !== t) el.textContent = t;\n  }\n  /* prix de base : le plan au m\u00E8tre, \u00AB 4,20 ml \u00D7 519 \u20AC = 2 179,80 \u20AC \u00BB (la pi\u00E8ce d'angle s'y ajoute, ligne \u00E0 part) */\n  /* A-276 : longueur factur\u00E9e des plans joints = somme des pi\u00E8ces arrondies chacune au cm, comme les lignes du panier\n     (null hors plans joints commandables) ; reprise par _cfg_model (facturation.qte_cm, cp-modele) */\n  function plansFactureCm(A, co) {\n    var f = forme(A); if (!(f === 'angle' || f === 'u-shape' || f === 'g-shape') || etat(A) || ilot(A) || !enOption(A)) return null;\n    co = co || compoOption(A); if (!co) return null;\n    var s = co.plans.reduce(function (t, p) { return t + (p.facture_mm > 0 ? Math.round(p.facture_mm / 10) : 0); }, 0);\n    return s > 0 ? s : null;\n  }\n  window.CP_plansFactureCm = function () { var A = getApp(); return A && A.S ? plansFactureCm(A) : null; };\n  /* \u00AB Longueur totale \u00BB garde les cotes ; si les plans factur\u00E9s diff\u00E8rent, une mention (textes de COMMERCIAL valid\u00E9s par\n     AUDIT), une seule raison dans l'ordre : pi\u00E8ce d'angle, coupe \u00E0 45\u00B0, profondeurs diff\u00E9rentes, minimum. La propri\u00E9t\u00E9 du\n     panier lit ce texte (m\u00EAme texte au r\u00E9capitulatif, au panier, dans la commande) */\n  var RE_MENTION = /\\s*\\((?:factur\u00E9|plans factur\u00E9s)[^)]*\\)\\s*$/;\n  function mentionFacture(A, co) {\n    var qd = document.getElementById('quantite_dimensions'); if (!qd) return;\n    var brut = qd.textContent.replace(RE_MENTION, ''), x = plansFactureCm(A, co), qc = Math.round(num(A.S.qtyCm)), t = brut;\n    if (x && x !== qc) {\n      var meta = window.__PRODUCT_META__ || {}, coeff = num(meta.coeff) || 1, unite = String(meta.unite_de_vente || 'cm').trim();\n      var X = (x / coeff).toLocaleString('fr-FR', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + ' ' + unite, S = A.S, l = S.layout;\n      var p45 = l === 'angle' ? !!S.cpJ45 : Object.keys((l === 'u-shape' ? S.cpJ45U : S.cpJ45G) || {}).some(function (k) { return (l === 'u-shape' ? S.cpJ45U : S.cpJ45G)[k]; });\n      var pl = co.plans.filter(function (p) { return p.facture_mm > 0; }), prof = pl.some(function (p) { return p.P !== pl[0].P; }), mini = pl.some(function (p) { return p.facture_mm > p.mm; });\n      t = brut + (co.pa ? ' (plans factur\u00E9s ' + X + ' + pi\u00E8ce d\\'angle)' : p45 ? ' (factur\u00E9 ' + X + ', coupe \u00E0 45\u00B0)'\n        : prof ? ' (factur\u00E9 ' + X + ', profondeurs diff\u00E9rentes)' : mini ? ' (factur\u00E9 ' + X + ', minimum)' : ' (factur\u00E9 ' + X + ', arrondi par pi\u00E8ce)');\n    }\n    if (qd.textContent !== t) qd.textContent = t;\n  }\n  function prixBase(A) {\n    var f = forme(A), td = document.getElementById('td-prix-base');\n    var il = td && !etat(A) ? ilot(A) : null;                            /* \u00EElot : \u00AB 2,40 m \u00D7 0,80 m \u00D7 1 089 \u20AC/m\u00B2 = 2 090,88 \u20AC \u00BB */\n    if (il) {                                                            /* en L : \u00AB Plan en L, tous les c\u00F4t\u00E9s finis, au m\u00B2 : (1,60 + 1,80) m \u00D7 0,80 m \u00D7 \u2026 \u00BB (A-316, COMMERCIAL Tour 71) */\n      var ti = il.forme ? 'Plan en ' + il.forme + ', tous les c\u00F4t\u00E9s finis, au m\u00B2 : ' + il.texte\n        : il.arriere ? FINI4.replace(/ \\(chant arri\u00E8re\\)$/, '') + (il.base === 'mlTarif' ? ', ' : il.base === 'ml' ? ' : ' : ', au m\u00B2 : ') + il.texte : 'Plan fini sur 4 c\u00F4t\u00E9s, au m\u00B2 : ' + il.texte;   /* R182-b : \u00AB Plan fini devant et derri\u00E8re, 2,40 ml \u00D7 639 \u20AC/ml = \u2026 \u00BB ; lot \u00AB messages 2 \u00BB, N43 (AUDIT Tour 616, point 5) : le prix de base seul ; la ligne lue par \u00AB Options \u00BB garde \u00AB (chant arri\u00E8re) \u00BB */\n      if (td.textContent !== ti) td.textContent = ti; return;\n    }\n    if (!td || !(f === 'angle' || f === 'u-shape' || f === 'g-shape') || etat(A)) return;\n    if (enOption(A)) {                                                   /* \u00AB plan 2,40 ml \u00D7 519 \u20AC + retour 1,15 ml \u00D7 559 \u20AC = 1 888,45 \u20AC \u00BB */\n      var co = compoOption(A); if (!co) return;\n      var pu = function (u) { return u % 1 ? u.toFixed(2).replace('.', ',') : fmtMm(u); };\n      /* R130 (Romain, 27/10 : \u00AB pour cette zone fait une liste plus claire et agr\u00E9able \u00E0 lire, avec un scroll barre vertical\n         dans la liste et une hauteur fixe pour cette zone \u00BB ; AUDIT Tour 860) : une ligne par pi\u00E8ce (\u00AB Montant gauche \u00BB,\n         \u00AB 2,40 ml \u00D7 359 \u20AC \u00BB, son montant), puis le total ; mise en forme dans cp-style.css (R130, int\u00E9rim STYLE). Sans elle,\n         la m\u00EAme suite de mots. Le texte lu par cp-annonces garde le total en dernier montant, et \u00AB fini sur 4 c\u00F4t\u00E9s \u00BB */\n      var lg = co.plans.filter(function (p) { return p.facture_mm > 0; }).map(function (p) {\n        /* COMMERCIAL (Tour 157, valid\u00E9 par AUDIT) : l'unit\u00E9 du prix au m\u00E8tre, comme les lignes d'options (lot 2) : \u00AB 2,40 ml \u00D7\n           359 \u20AC/ml \u00BB (la ligne au m\u00B2 est d\u00E9j\u00E0 juste) ; la derni\u00E8re ligne \u00AB Total des pi\u00E8ces \u00BB (\u00AB Total \u00BB reste au seul montant\n           \u00E0 payer) */\n        var nom = p.arr ? p.nom + ' ' + finiF4(p.nom) + ' sur 4 c\u00F4t\u00E9s' : p.nom, calc;   /* \u00AB jambe gauche finie \u00BB */\n        if (p.arr && p.d9b) calc = fmt(Math.round(p.facture_mm / 10)) + ' ml \u00D7 ' + pu(p.prix_cm) + ' \u20AC/ml';   /* D9b : la seule base retenue (comparaison dans _d9b) */\n        else if (p.arr) calc = mTxt(p.facture_mm) + ' m \u00D7 ' + mTxt(p.P) + ' m \u00D7 ' + fmtM2(p.m2) + ' \u20AC/m\u00B2';\n        else calc = fmt(Math.round(p.facture_mm / 10)) + ' ml \u00D7 ' + pu(p.prix_cm) + ' \u20AC/ml';\n        return [nom.charAt(0).toUpperCase() + nom.slice(1), calc, fmt(p.cents) + ' \u20AC'];\n      });\n      lg.push(['Total des pi\u00E8ces', '', fmt(co.plans_cents) + ' \u20AC']);\n      var cle = JSON.stringify(lg);\n      if (!td.querySelector('.cp-pb') || td.getAttribute('data-cp-pb') !== cle) {\n        td.setAttribute('data-cp-pb', cle); td.textContent = '';\n        var liste = document.createElement('span'); liste.className = 'cp-pb'; liste.setAttribute('role', 'list'); liste.setAttribute('aria-label', 'Prix de base, pi\u00E8ce par pi\u00E8ce');\n        liste.tabIndex = 0;                                              /* zone qui d\u00E9file : atteinte au clavier */\n        liste.addEventListener('scroll', function () { defilePb(liste); }, { passive: true });   /* A-418 */\n        lg.forEach(function (r, i) {\n          var tot = i === lg.length - 1, ln = document.createElement('span'); ln.className = tot ? 'cp-pb-t' : 'cp-pb-l'; if (!tot) ln.setAttribute('role', 'listitem');\n          r.forEach(function (t, k) {\n            if (!t) return;\n            if (ln.firstChild) ln.appendChild(document.createTextNode(' '));\n            var s = document.createElement('span'); s.className = ['cp-pb-n', 'cp-pb-c', 'cp-pb-m'][k]; s.textContent = t; ln.appendChild(s);\n          });\n          if (tot) { td.appendChild(document.createTextNode(' ')); td.appendChild(ln); }\n          else { if (liste.firstChild) liste.appendChild(document.createTextNode(' ')); liste.appendChild(ln); }\n        });\n        td.insertBefore(liste, td.firstChild);\n      }\n      var lpb = td.querySelector('.cp-pb'); if (lpb) { defilePb(lpb); setTimeout(function () { defilePb(lpb); }, 0); }   /* A-418 : apr\u00E8s la mise en page */\n      mentionFacture(A, co);\n      return;\n    }\n    var q = num(A.getBilledQtyCm ? A.getBilledQtyCm(A.getSelectedShopifyVariant && A.getSelectedShopifyVariant()) : 0), u = num(A.getUnitPriceCents ? A.getUnitPriceCents() : 0);\n    if (!(q > 0 && u > 0)) return;\n    /* q en cm, u en centimes par cm, soit des euros par m\u00E8tre */\n    var t = fmt(q) + '\u00A0ml \u00D7 ' + (u % 1 ? u.toFixed(2).replace('.', ',') : fmtMm(u)) + '\u00A0\u20AC = ' + fmt(Math.round(q * u)) + '\u00A0\u20AC';\n    if (td.textContent !== t) td.textContent = t;\n  }\n\n  /* fen\u00EAtres de cote : les vraies plages de la pi\u00E8ce d'angle dans le titre (le moteur annonce 300 \u00E0 3 160 mm pour\n     tout c\u00F4t\u00E9, et la r\u00E8gle de profondeur du plan droit). La cote ouverte est relev\u00E9e au clic. */\n  var coteOuverte = '';\n  function titreCote(A, t) {\n    var f = forme(A); if (!(f === 'angle' || f === 'u-shape')) return null;\n    if (enOption(A)) return null;                                        /* plans joints : les bornes du moteur et les contr\u00F4les ; A-429 : aussi au-del\u00E0 de P_MAX (chaque pi\u00E8ce sa profondeur) */\n    var k = coteOuverte, en = f === 'angle' ? 'L' : 'U', ilo = profForme(A) > P_MAX;\n    if (ilo ? ilotForme(A) == null : prixPiece(A) == null) return null;\n    if (/^[P]\\d$/.test(k) && /^(Choisir (une|la) profondeur|Profondeur)/.test(t))\n      return 'Profondeur en ' + en + ' : de ' + fmtMm(P_MIN) + ' \u00E0 ' + fmtMm(ilotForme(A) != null ? ILOT_MAX : P_MAX) + ' mm';\n    if (!/^L\\d$/.test(k) || !/^(Dimension|Longueur L\\d)( \\(| : )/.test(t)) return null;   /* \u00AB : de \u2026 \u00BB depuis T2 (lot \u00AB messages 2 \u00BB) */\n    var fond = f === 'u-shape' && k === 'L1', juste = (fond ? 2 : 1) * PIECE;\n    var nom = f === 'angle' ? (k === 'L1' ? 'Plan' : 'Retour') : (fond ? 'Fond' : 'Jambe');\n    if (ilo) return nom + ' (' + k + ') : de ' + fmtMm((fond ? 2 : 1) * profForme(A) + MIN_DROIT) + ' \u00E0 ' + fmtMm(BR_MAX) + ' mm';   /* \u00EElot : pi\u00E8ces d'au moins 300 mm */\n    return nom + ' (' + k + ') : ' + fmtMm(juste) + ' mm, ou de ' + fmtMm(juste + MIN_DROIT) + ' \u00E0 ' + fmtMm(BR_MAX) + ' mm';\n  }\n  function suisTitres() {\n    document.addEventListener('click', function (e) {\n      var sp = e.target && e.target.closest && e.target.closest('#dims .dim .label span');\n      if (sp) { var m = sp.textContent.trim().match(/^([LP]\\d)\\s*:/i); coteOuverte = m ? m[1].toUpperCase() : ''; }\n    }, true);\n    var el = document.getElementById('edge-popup-title'), pop = document.getElementById('edge-dims-popup');\n    if (!el || typeof MutationObserver !== 'function') return;\n    /* titre, puis noms accessibles de la fen\u00EAtre et du champ (pos\u00E9s d'apr\u00E8s le titre et les bornes du moteur) */\n    var dernier = null;                                  /* titre d\u00E9j\u00E0 r\u00E9\u00E9crit : ses noms accessibles suivent encore */\n    new MutationObserver(function () {\n      var A = getApp(); if (!A || !A.S) return;\n      var t = el.textContent.trim(), n = titreCote(A, t) || (t === dernier ? dernier : null); if (!n) return;\n      dernier = n;\n      if (n !== t) el.textContent = n;\n      if (pop && pop.getAttribute('aria-label') && pop.getAttribute('aria-label') !== n) pop.setAttribute('aria-label', n);\n      Array.prototype.forEach.call(pop ? pop.querySelectorAll('input') : [], function (i) {\n        var l = i.getAttribute('aria-label') || ''; if (/, de \\d+ \u00E0 \\d+ mm$/.test(l) && l !== n) i.setAttribute('aria-label', n);\n      });\n      var h = document.querySelector('#edge-popup-content .cp-depth-help'), f = forme(A);\n      if (h && /^Profondeur en/.test(n)) {\n        var ht = 'La m\u00EAme profondeur pour tout le plan en ' + (f === 'angle' ? 'L' : 'U') + '.';\n        if (h.textContent !== ht) h.textContent = ht;\n      }\n    }).observe(pop || el, { childList: true, characterData: true, subtree: true, attributes: true, attributeFilter: ['aria-label'] });\n  }\n  /* menu Forme : le G est sur devis, dit avant de le choisir */\n  function menuDevis() {\n    /* le G sur devis va avec la pi\u00E8ce d'angle impos\u00E9e ; en plans joints (pi\u00E8ce d'angle en option), il se commande */\n    Array.prototype.forEach.call(document.querySelectorAll('.layout-btn[data-layout=\"g-shape\"]'), function (b) {\n      var s = b.querySelector('.cp-pierre-devis');\n      if (!PA_ON || PA_OPT) { if (s) s.parentNode.removeChild(s); return; }\n      if (s) return;\n      s = document.createElement('small'); s.className = 'cp-pierre-devis'; s.textContent = 'non propos\u00E9e en ligne'; b.appendChild(s);   /* lot \u00AB messages 2 \u00BB, N36 */\n    });\n  }\n\n  /* dessin : les pi\u00E8ces livr\u00E9es. Le trac\u00E9 garde les pi\u00E8ces du moteur (plan, retour, jambes) ; par-dessus, chaque pi\u00E8ce\n     d'angle avec son propre d\u00E9cor (fil le long du plan ou du fond, d\u00E9coup\u00E9e comme le trac\u00E9 : coins usin\u00E9s). Lignes de\n     jonction du moteur masqu\u00E9es (attribut : aussi dans l'image de la commande). */\n  var NS = 'http://www.w3.org/2000/svg';\n  function mk(t, a) { var e = document.createElementNS(NS, t); for (var k in a) e.setAttribute(k, a[k]); return e; }\n  function dessin(A) {\n    var svg = A.svg; if (!svg) return;\n    Array.prototype.forEach.call(svg.querySelectorAll('.cp-pierre-dessin, .cp-pierre-fond, [id^=\"cp-pierre-pat-\"]'), function (n) { n.remove(); });\n    var f = forme(A); if (!f) return;\n    /* ligne de jonction du moteur : masqu\u00E9e o\u00F9 une pi\u00E8ce d'angle couvre le coin (en option, \u00E0 ce coin seulement) */\n    var JID = { 'default': 'L', leftU: 'g', rightU: 'd', topG: 'top', midG: 'mid', returnG: 'ret' }, op = enOption(A);\n    Array.prototype.forEach.call(svg.querySelectorAll('.junction-group'), function (g) {\n      var c = JID[g.getAttribute('data-cp-jn') || 'default'];\n      if (!op || (c && paCoin(A, c))) g.setAttribute('display', 'none');\n    });\n    if ((f === 'angle' || f === 'u-shape') && !etat(A) && ilotOk(A)) { fondIlot(A, svg); return; }   /* \u00EElot : pas de pi\u00E8ce d'angle */\n    if (!(f === 'angle' || f === 'u-shape' || (f === 'g-shape' && op)) || etat(A)) return;\n    /* A-345 : la pi\u00E8ce d'angle du tarif, telle que la commande la d\u00E9crit (cp-modele, CP_piecesCommande) : 5 c\u00F4t\u00E9s, avant en\n       biais devant l'angle int\u00E9rieur */\n    var gc = typeof window.CP_piecesCommande === 'function' ? window.CP_piecesCommande(A) : null;\n    var pcs = gc ? gc.pieces.filter(function (p) { return p.coin; }) : [], bs = (A._cpPieces || []).filter(function (b) { return isFinite(b.x) && isFinite(b.y); });\n    if (!pcs.length || !bs.length) return;\n    var O = [Math.min.apply(null, bs.map(function (b) { return num(b.x); })), Math.min.apply(null, bs.map(function (b) { return num(b.y); }))];\n    var add = function (q) { return [q[0] + O[0], q[1] + O[1]]; }, pts = function (l) { return l.map(function (q) { return add(q).join(','); }).join(' '); };\n    var host = svg.querySelector('g.cp-trace'), pg = host && host.querySelector('[data-piece]');\n    var fill0 = pg ? (pg.querySelector('rect, image') || { getAttribute: function () { return null; } }).getAttribute('fill') : null;\n    var d = typeof window.CP_decorFull === 'function' ? window.CP_decorFull() : null, url = A.getWorkImageUrl && A.getWorkImageUrl();\n    if (host) {\n      var gA = mk('g', { class: 'cp-pierre-dessin', 'pointer-events': 'none' }), cotes = [];\n      pcs.forEach(function (p, i) {\n        /* sans les d\u00E9coupes du trac\u00E9 du moteur : son contour s'arr\u00EAte \u00E0 l'angle int\u00E9rieur, la pi\u00E8ce va jusqu'\u00E0 son biais ;\n           aucun usinage n'est permis sur elle. Motif parall\u00E8le au plan, repris \u00E0 z\u00E9ro \u00E0 ses deux bouts (STYLE, Tour 34) */\n        var poly = p.pts.map(add), g = gA;\n        var fill = (d && d.hex) || fill0 || '#e5e7eb';\n        if (d && d.tex && url && window.CP_texture) {\n          var at = poly.reduce(function (b, q) { return (q[0] < b[0] - 1e-6 || (Math.abs(q[0] - b[0]) < 1e-6 && q[1] < b[1])) ? q : b; }, poly[0]);\n          fill = 'url(#' + window.CP_texture.makePattern(svg, 'cp-pierre-pat-' + i, url, d.tex, at[0], at[1], window.CP_texture.grainAngle(d.tex.fil, 0), poly) + ')';\n        }\n        g.appendChild(mk('polygon', { points: pts(p.pts), fill: fill }));\n        /* cote grise du biais (sommets 3 et 4) : hors de la pi\u00E8ce, parall\u00E8le au biais, dans le vide de l'angle (AUDIT Tour 676) ;\n           placeBiais lui donne la police, la taille, la couleur et la place des autres cotes grises ; sans case (STYLE) */\n        var a = poly[2], b = poly[3], c0 = poly[0], m = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2], dn = Math.hypot(m[0] - c0[0], m[1] - c0[1]) || 1, fs = 90;\n        var tx = m[0] + (m[0] - c0[0]) / dn * fs * 0.9, ty = m[1] + (m[1] - c0[1]) / dn * fs * 0.9;\n        var tc = mk('text', { class: 'cp-pierre-biais', x: tx, y: ty, 'font-size': fs, 'font-weight': 700, 'text-anchor': 'middle', 'dominant-baseline': 'central', fill: '#686868', 'font-family': 'Arial, sans-serif',\n          transform: 'rotate(' + degBiais(a, b) + ' ' + tx + ' ' + ty + ')', 'data-pts': [a, b, c0].map(function (q) { return q.join(','); }).join(' ') });\n        tc.textContent = fmtMm(Math.hypot(b[0] - a[0], b[1] - a[1])); cotes.push(tc);\n      });\n      cotes.forEach(function (t) { gA.appendChild(t); });               /* les cotes au-dessus de toutes les pi\u00E8ces */\n      /* au-dessus des trac\u00E9s du moteur (sans capter un clic) : ses traits de chant et l'angle int\u00E9rieur, trac\u00E9s jusqu'\u00E0 l'angle\n         int\u00E9rieur du L, passeraient sur la pi\u00E8ce, o\u00F9 il n'y a plus d'ar\u00EAte */\n      svg.appendChild(gA);\n      eloigneCotes(A);\n      placeBiais(A);\n    }\n    /* ni traits de joint ni num\u00E9ros sur le dessin (ni dans l'image jointe) : la d\u00E9coupe se lit sous le dessin, en toutes\n       lettres, et la propri\u00E9t\u00E9 \u00AB Composition \u00BB de la commande la donne \u00E0 l'atelier */\n  }\n  /* A-345 (AUDIT Tour 644) : les cotes calcul\u00E9es du moteur, trac\u00E9es jusqu'\u00E0 l'angle int\u00E9rieur du L, passeraient sur la pi\u00E8ce\n     d'angle. Chacune glisse perpendiculairement \u00E0 elle, vers la pi\u00E8ce vide, juste assez pour ne plus la toucher ; sa valeur ne\n     change pas, aucune cote n'est retir\u00E9e */\n  function eloigneCotes(A) {\n    var polys = Array.prototype.map.call(A.svg.querySelectorAll('.cp-pierre-dessin polygon'), function (e) {\n      var M = e.getScreenCTM && e.getScreenCTM(), pts = []; if (!M || !e.points) return pts;\n      for (var i = 0; i < e.points.numberOfItems; i++) { var q = e.points.getItem(i); pts.push([M.a * q.x + M.c * q.y + M.e, M.b * q.x + M.d * q.y + M.f]); }\n      return pts;\n    }).filter(function (p) { return p.length > 2; });\n    if (!polys.length || !A.dims) return;\n    /* la cote = sa bo\u00EEte et chacun de ses \u00E9l\u00E9ments visibles (trait, \u00E9tiquette) : le trait peut d\u00E9border de la bo\u00EEte */\n    var boites = function (d) {\n      return [d].concat(Array.prototype.slice.call(d.querySelectorAll('*'))).map(function (e) { return e.getBoundingClientRect(); })\n        .filter(function (q) { return q.width > 0 || q.height > 0; });\n    };\n    var touchee = function (qs, dx, dy) {                               /* la pi\u00E8ce d'angle touch\u00E9e par une bo\u00EEte d\u00E9cal\u00E9e (un point tous les 4 px) */\n      for (var b = 0; b < qs.length; b++) {\n        var q = qs[b], nx = Math.max(1, Math.ceil(q.width / 4)), ny = Math.max(1, Math.ceil(q.height / 4));\n        for (var i = 0; i <= nx; i++) for (var j = 0; j <= ny; j++) {\n          var x = q.left + 0.5 + Math.max(0, q.width - 1) * i / nx + dx, y = q.top + 0.5 + Math.max(0, q.height - 1) * j / ny + dy;\n          for (var k = 0; k < polys.length; k++) if (dansPoly(polys[k], x, y)) return polys[k];\n        }\n      }\n      return null;\n    };\n    /* \u00E9tiquettes (textes) des cotes : aucune ne se pose sur celle d'une autre (consigne 4, AUDIT Tour 647) */\n    var etiquettes = function (d) {\n      return Array.prototype.filter.call(d.querySelectorAll('*'), function (e) { return !e.children.length && /\\S/.test(e.textContent || ''); })\n        .map(function (e) { return e.getBoundingClientRect(); }).filter(function (q) { return q.width > 0 && q.height > 0; });\n    };\n    var dims = Array.prototype.slice.call(A.dims.querySelectorAll('.dim'));\n    var surEtiquette = function (d, qs, dx, dy) {\n      var autres = [].concat.apply([], dims.filter(function (o) { return o !== d; }).map(etiquettes));\n      return qs.some(function (q) { return autres.some(function (o) { return q.left + dx < o.right + 1 && q.right + dx > o.left - 1 && q.top + dy < o.bottom + 1 && q.bottom + dy > o.top - 1; }); });\n    };\n    dims.forEach(function (d) {\n      var qs = boites(d), q = d.getBoundingClientRect(), p = qs.length && touchee(qs, 0, 0); if (!p) return;\n      var es = etiquettes(d);\n      /* d'abord vers la pi\u00E8ce vide (\u00E0 l'oppos\u00E9 du centre de la pi\u00E8ce d'angle touch\u00E9e), puis de l'autre c\u00F4t\u00E9 : le plus petit\n         d\u00E9calage qui la lib\u00E8re */\n      var cx = p.reduce(function (s, v) { return s + v[0]; }, 0) / p.length, cy = p.reduce(function (s, v) { return s + v[1]; }, 0) / p.length;\n      var h = d.classList.contains('h'), sg = h ? ((q.top + q.bottom) / 2 > cy ? 1 : -1) : ((q.left + q.right) / 2 > cx ? 1 : -1);\n      for (var k = 2; k <= 240; k += 2) for (var s = 0; s < 2; s++) {\n        var sk = (s ? -sg : sg) * k, dx = h ? 0 : sk, dy = h ? sk : 0;\n        if (!touchee(qs, dx, dy) && !surEtiquette(d, es, dx, dy)) { d.style.translate = dx + 'px ' + dy + 'px'; return; }\n      }\n    });\n  }\n  /* sens de lecture du biais de a \u00E0 b : jamais la t\u00EAte en bas */\n  function degBiais(a, b) { var deg = Math.atan2(b[1] - a[1], b[0] - a[0]) * 180 / Math.PI; return deg > 90 ? deg - 180 : deg < -90 ? deg + 180 : deg; }\n  /* A-345 (AUDIT Tour 676) : la cote du biais, hors de la pi\u00E8ce, parall\u00E8le au biais, dans le vide de l'angle, comme les autres\n     cotes grises (police, taille et couleur d'une cote calcul\u00E9e du moteur, 10 px au moins). Sa place : la plus proche du biais\n     (3 px d'\u00E9cart, puis 2 px de plus \u00E0 la fois, jusqu'\u00E0 61), au milieu ou gliss\u00E9e le long de lui, qui ne touche ni une pi\u00E8ce,\n     ni un obstacle des badges (cote, case, badge, carr\u00E9 vert ; trait de cote compris) ; sinon celle qui en touche le moins.\n     Reprise \u00E0 chaque passe des badges, avant eux : le dessin finit de se cadrer apr\u00E8s le rendu, et les cotes avec lui */\n  function placeBiais(A) {\n    var ts = A.svg ? Array.prototype.slice.call(A.svg.querySelectorAll('.cp-pierre-dessin text.cp-pierre-biais')) : [];\n    var G = ts.length && ts[0].parentNode, M = G && G.getScreenCTM && G.getScreenCTM(), k = M ? Math.sqrt(M.a * M.a + M.b * M.b) : 0;\n    if (!(k > 0)) return;\n    var ref = A.dims && A.dims.querySelector('.dim.calculated .label'), cs = ref && getComputedStyle(ref), px = Math.max((cs && parseFloat(cs.fontSize)) || 12, 10);\n    var Mi = M.inverse(), ecran = function (q) { return [M.a * q[0] + M.c * q[1] + M.e, M.b * q[0] + M.d * q[1] + M.f]; };\n    var obs = obstaclesDessin(A, true), pcs = piecesPlan(A), cadre = A.svg.getBoundingClientRect();\n    ts.forEach(function (t) {\n      t.setAttribute('font-size', px / k); t.setAttribute('font-weight', (cs && cs.fontWeight) || 700);\n      t.setAttribute('fill', (cs && cs.color) || '#686868'); t.setAttribute('font-family', (cs && cs.fontFamily) || 'Arial, sans-serif');\n      var q = (t.getAttribute('data-pts') || '').split(' ').map(function (s) { return s.split(',').map(Number); }); if (q.length < 3) return;\n      var a = ecran(q[0]), b = ecran(q[1]), c0 = ecran(q[2]), lb = Math.hypot(b[0] - a[0], b[1] - a[1]) || 1;\n      var u = [(b[0] - a[0]) / lb, (b[1] - a[1]) / lb], n = [-u[1], u[0]], m = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n      if ((c0[0] - m[0]) * n[0] + (c0[1] - m[1]) * n[1] > 0) n = [-n[0], -n[1]];   /* vers le vide de l'angle, loin du coin contre les murs */\n      var dl = t.getComputedTextLength() * k / 2 + 2, dh = px * 0.6;   /* demi-longueur et demi-hauteur \u00E0 l'\u00E9cran, 2 px de marge au bout */\n      var coins = function (C) { return [[1, 1], [1, -1], [-1, -1], [-1, 1]].map(function (s) { return [C[0] + u[0] * dl * s[0] + n[0] * dh * s[1], C[1] + u[1] * dl * s[0] + n[1] * dh * s[1]]; }); };\n      /* deux formes convexes se touchent si aucun axe (normale d'un c\u00F4t\u00E9 de l'une ou de l'autre) ne les s\u00E9pare */\n      var axes = [u, n, [1, 0], [0, 1]], proj = function (P, ax) { var v = P.map(function (p) { return p[0] * ax[0] + p[1] * ax[1]; }); return [Math.min.apply(null, v), Math.max.apply(null, v)]; };\n      var touche = function (P, o) {\n        var R = [[o.left, o.top], [o.right, o.top], [o.right, o.bottom], [o.left, o.bottom]];\n        return axes.every(function (ax) { var p = proj(P, ax), r = proj(R, ax); return p[1] > r[0] && r[1] > p[0]; });\n      };\n      var surPiece = function (C) {                                       /* points de la cote (tous les 2 px environ) sur une pi\u00E8ce */\n        var nu = Math.max(2, Math.ceil(dl)), nv = Math.max(2, Math.ceil(dh)), c = 0;\n        for (var i = 0; i <= nu; i++) for (var j = 0; j <= nv; j++) {\n          var su = (2 * i / nu - 1) * dl, sv = (2 * j / nv - 1) * dh;\n          if (dansPiece(A, pcs, C[0] + u[0] * su + n[0] * sv, C[1] + u[1] * su + n[1] * sv)) c++;\n        }\n        return c;\n      };\n      var meilleur = null, glisse = [0];\n      for (var s = 4; s <= lb / 2; s += 4) glisse.push(s, -s);\n      for (var e = 3; e <= 61 && !(meilleur && !meilleur.v[0] && !meilleur.v[1] && !meilleur.v[2]); e += 2) {\n        for (var g = 0; g < glisse.length; g++) {\n          var C = [m[0] + n[0] * (e + dh) + u[0] * glisse[g], m[1] + n[1] * (e + dh) + u[1] * glisse[g]], P = coins(C);\n          if (P.some(function (p) { return p[0] < cadre.left || p[0] > cadre.right || p[1] < cadre.top || p[1] > cadre.bottom; })) continue;\n          var nd = 0, nt = 0;\n          obs.forEach(function (o) { if (touche(P, o)) { if (o.poids === 1) nt++; else nd++; } });\n          if (meilleur && (nd > meilleur.v[0] || (nd === meilleur.v[0] && meilleur.v[1] === 0 && nt >= meilleur.v[2]))) continue;\n          var v = [nd, surPiece(C), nt];\n          if (!meilleur || v[0] < meilleur.v[0] || (v[0] === meilleur.v[0] && (v[1] < meilleur.v[1] || (v[1] === meilleur.v[1] && v[2] < meilleur.v[2])))) meilleur = { C: C, P: P, v: v };\n          if (!v[0] && !v[1] && !v[2]) break;\n        }\n      }\n      if (!meilleur) return;\n      var x = Mi.a * meilleur.C[0] + Mi.c * meilleur.C[1] + Mi.e, y = Mi.b * meilleur.C[0] + Mi.d * meilleur.C[1] + Mi.f;\n      t.setAttribute('x', x); t.setAttribute('y', y); t.setAttribute('transform', 'rotate(' + degBiais(q[0], q[1]) + ' ' + x + ' ' + y + ')');\n      var X = meilleur.P.map(function (p) { return p[0]; }), Y = meilleur.P.map(function (p) { return p[1]; });   /* obstacle de la cote suivante (U) */\n      obs.push({ left: Math.min.apply(null, X), right: Math.max.apply(null, X), top: Math.min.apply(null, Y), bottom: Math.max.apply(null, Y), poids: 30, dur: true });\n    });\n  }\n  /* \u00EElot en L et en U : les pi\u00E8ces du moteur, pos\u00E9es bord \u00E0 bord, laissaient voir un trait clair de 1 px entre elles (le fond\n     de la page, par l'anticr\u00E9nelage des deux bords). Dessous, un fond de la couleur du d\u00E9cor, de la forme de chaque pi\u00E8ce :\n     la surface para\u00EEt continue, le fil du d\u00E9cor reste celui de chaque pi\u00E8ce ; la jonction se lit dans la d\u00E9coupe. */\n  function fondIlot(A, svg) {\n    var host = svg.querySelector('g.cp-trace'); if (!host) return;\n    var d = typeof window.CP_decorFull === 'function' ? window.CP_decorFull() : null, pg = host.querySelector('[data-piece]');\n    var fill0 = pg ? (pg.querySelector('rect, image') || { getAttribute: function () { return null; } }).getAttribute('fill') : null;\n    var fill = (d && d.hex) || fill0 || '#e5e7eb', g = mk('g', { class: 'cp-pierre-fond', 'pointer-events': 'none' });\n    Array.prototype.forEach.call(host.querySelectorAll('[data-piece]'), function (p) {\n      var id = (p.getAttribute('clip-path') || '').replace(/^url\\([\"']?|[\"']?\\)$/g, ''), poly = id && svg.querySelector(id + ' polygon');\n      if (poly) g.appendChild(mk('polygon', { points: poly.getAttribute('points'), fill: fill, stroke: fill, 'stroke-width': '1.5', 'vector-effect': 'non-scaling-stroke' }));\n    });\n    if (g.firstChild) host.parentNode.insertBefore(g, host);\n  }\n\n  /* faces contre le mur (fond et c\u00F4t\u00E9s ext\u00E9rieurs), par forme : ni finies ni propos\u00E9es. En L, \u00AB angleReturn \u00BB est le\n     c\u00F4t\u00E9 ext\u00E9rieur du retour (mur) ; en U, c'est l'avant des jambes (fini, verrouill\u00E9 par la r\u00E8gle). */\n  var MURS = {\n    linear: ['back'],\n    angle: ['back', 'angleReturn', 'angleReturnTop', 'angleReturnH'],\n    'u-shape': ['backLeftU', 'backMidU', 'backRightU', 'backBothOverlap', 'backflol_left', 'backflol_right', 'backolfl_left', 'backolfl_right',\n      'sideLeftU', 'sideRightU', 'sideLeftUTop', 'sideLeftUBot', 'sideRightUTop', 'sideRightUBot'],\n    /* G \u00E0 droite (\u2026G) et \u00E0 gauche (\u2026GL) : fond, bout du haut contre le mur, c\u00F4t\u00E9s ext\u00E9rieurs des montants (selon les jonctions) */\n    'g-shape': ['backLeftG_FO', 'backMidG_FO', 'backRightG_FO', 'backLeftG_FF', 'backRightG_FF', 'backMidG_OF', 'backLeftG_OO', 'backRightG_OO', 'backLeftTopG',\n      'sidesTopRightG_FF', 'sidesTopRightG_OF', 'sidesLeftG_F', 'leftSideTopG_O', 'leftSideBottomG_O', 'rightSideMidG_FO', 'rightSideBottomG_FO',\n      'rightSideTopG_OO', 'rightSideBottomG_OO', 'rightSideBottomG_FF', 'sidesRightG_OF',\n      'backLeftGL_FO', 'backMidGL_FO', 'backRightGL_FO', 'backLeftGL_FF', 'backRightGL_FF', 'backMidGL_OF', 'backLeftGL_OO', 'backRightGL_OO', 'backRightTopGL',\n      'sidesTopRightGL_FF', 'sidesTopRightGL_OF', 'rightSideTopGL_OO', 'rightSideMidGL_OO', 'rightSideBottomGL_OO', 'rightSideTopGL_OF', 'rightSideBottomGL_OF',\n      'rightSideTopGL_FO', 'rightSideBottomGL_FO', 'sidesRightRightGL_FF', 'leftSideBottomGL_F', 'sidesLeftRightGL_O']\n  };\n  /* A-430 (AUDIT Tours 1213 et 1215 : \u00AB chaque case de chant visible, cochable et nomm\u00E9e juste, comme sur le stratifi\u00E9 \u00BB) :\n     seules les faces qui sont l'arri\u00E8re d'une pi\u00E8ce restent dans MURS (montr\u00E9es par cssFini4 ou cssArriere quand l'offre\n     est ouverte) ; les autres (angleReturnTop en L, backLeftU et backRightU en U, backLeftTopG et sidesTopRightG_FF en G\u2026)\n     \u00E9taient cach\u00E9es et d\u00E9coch\u00E9es : elles se montrent et se cochent \u00E0 leur prix, comme sur le stratifi\u00E9 */\n  function murs(lay) { return (MURS[lay] || []).filter(function (k) { return CLES_ARR_P.indexOf(k) >= 0; }); }\n  /* les cases sont recr\u00E9\u00E9es par le moteur apr\u00E8s chaque rendu : masqu\u00E9es par une feuille de style li\u00E9e \u00E0 la forme\n     (classe cp-pierre-lay-<forme> sur html), pas une \u00E0 une */\n  function cssMurs() {\n    return Object.keys(MURS).map(function (lay) {\n      return murs(lay).map(function (k) {\n        return 'html.cp-pierre-lay-' + lay + ' #dims .edge-checkbox-container:has(> .edge-checkbox-visual[data-edge=\"' + k + '\"])';\n      }).join(',') + '{display:none!important}';\n    }).join('');\n  }\n  /* \u00AB Toutes sauf l'avant et les c\u00F4t\u00E9s \u00BB en L, U et G : restent les AVANTS de chaque pi\u00E8ce (cl\u00E9s du moteur, relev\u00E9es dans\n     toutes les jonctions et les deux sens) et les bouts libres (bouts) ; les autres cases sont cach\u00E9es ET d\u00E9coch\u00E9es avant\n     le rendu (aucun chant cach\u00E9 factur\u00E9). Droit et \u00EElot : rien ne change (custom-configV2 garde l'avant et les c\u00F4t\u00E9s) */\n  var AVANTS = { angle: ['front', 'sidesJambeVInner'], 'u-shape': ['innerFront', 'angleReturn'],\n    'g-right': ['innerFrontTopG', 'angleReturnG', 'sidesInnerRightG', 'innerFrontReturnG'],\n    'g-left': ['innerFrontGL', 'angleReturnGL', 'sidesLeftLeftGL', 'innerFrontReturnGL'] };\n  function gardeChants(A) {\n    var l = A.S.layout; if (MASQUE !== 'hors_avant_cotes' || l === 'linear' || ilotOk(A)) return null;\n    var av = AVANTS[l === 'g-shape' ? (A.S.gDir === 'left' ? 'g-left' : 'g-right') : l]; if (!av) return null;\n    return av.concat(bouts(A).map(function (b) { return b.k; }));\n  }\n  /* les rep\u00E8res de jonction du moteur (rightConfigG, returnConfigGL\u2026) restent : effac\u00E9s, le moteur croit la jonction chang\u00E9e\n     et efface \u00E0 chaque rendu les chants qui en d\u00E9pendent (bout du montant porteur et bout du retour en G : fini jamais gard\u00E9) */\n  function decocheMasques(A) {\n    var g = gardeChants(A), S = A.S; if (!g) return;\n    ['edgeBanding', 'edgeBandingByEdge'].forEach(function (n) { var o = S[n]; if (o) Object.keys(o).forEach(function (k) { if (g.indexOf(k) < 0 && !/Config/.test(k)) delete o[k]; }); });\n  }\n  function cssMasques(A) {\n    var g = gardeChants(A), h = document.documentElement, st = document.getElementById('cp-masque-forme-css');\n    h.classList.toggle('cp-masque-forme', !!g);\n    var css = g ? 'html.cp-masque-forme #dims .edge-checkbox-container:has(> .edge-checkbox-visual' + g.map(function (k) { return ':not([data-edge=\"' + k + '\"])'; }).join('') + '){display:none!important}' : '';\n    if (!st && css) { st = document.createElement('style'); st.id = 'cp-masque-forme-css'; document.head.appendChild(st); }\n    if (st && st.textContent !== css) st.textContent = css;\n  }\n  function cacheMurs(lay, ilotOn) {\n    var h = document.documentElement;\n    Object.keys(MURS).forEach(function (l) { h.classList.toggle('cp-pierre-lay-' + l, l === lay && !ilotOn); });   /* \u00EElot : tous les bords sont finis */\n  }\n  /* \u00EElot : classe cp-ilot (chant arri\u00E8re affich\u00E9, cp-decor-data), cp-ilot-non quand le d\u00E9cor n'a pas de prix d'\u00EElot (choix\n     masqu\u00E9 dans la fen\u00EAtre de profondeur) ; chants compris : la raison sur chaque case verrouill\u00E9e */\n  /* noms des 4 chants de l'\u00EElot, en infobulle et en nom accessible ; repos\u00E9s quand l'accessibilit\u00E9 (cp-a11y) renomme les\n     cases apr\u00E8s chaque rendu (\u00AB \u2026, contre le mur (impos\u00E9) \u00BB) */\n  var NOMS_CHANT = { front: 'bord avant', back: 'bord arri\u00E8re', sides: 'c\u00F4t\u00E9 gauche', right: 'c\u00F4t\u00E9 droit' }, obsChants = null;\n  function nommerChants() {\n    if (!document.documentElement.classList.contains('cp-ilot')) return;\n    var A0 = getApp() || { S: {} }, droit = A0.S.layout === 'linear', ar = droit && A0.S && arriere(A0), choix = ar && arriereChoix(A0);\n    Array.prototype.forEach.call(document.querySelectorAll('#dims .edge-checkbox-visual[data-edge]'), function (c) {\n      if (choix && c.dataset.edge === 'back') return;                  /* chant arri\u00E8re choisi : sa case reste un choix (nommerArriere) */\n      if (!ILOT_CHANTS && (!ar || c.dataset.edge !== 'back')) return;  /* A-296 : avant et c\u00F4t\u00E9s gardent le nom du moteur (compris par la r\u00E8gle, ou au choix) */\n      /* L et U : le nom pos\u00E9 par cp-a11y, sans \u00AB contre le mur \u00BB ni \u00AB (impos\u00E9) \u00BB */\n      var a = ((c.getAttribute('aria-label') || '').match(/^Chant du (.+?) : /) || [])[1] || '';   /* R148-b3 : le bord du nom pos\u00E9 par cp-a11y */\n      var n = droit ? NOMS_CHANT[c.dataset.edge] : a; if (!n) return;\n      var t = 'Chant du ' + n + ' : fini, compris dans le prix' + (ar ? (ILOT_CHANTS ? ', plan fini sur 4 c\u00F4t\u00E9s' : '') : ', tous les c\u00F4t\u00E9s finis') + '.';   /* A-316 ; R148-b3 */\n      if (c.getAttribute('aria-label') !== t) c.setAttribute('aria-label', t);\n      if (c.title !== t) c.title = t;\n    });\n  }\n  function ilotUi(A) {\n    var h = document.documentElement, on = ilotOk(A);\n    h.classList.toggle('cp-ilot', on);\n    /* A-430 : en plans joints (L, U, G), la tranche au-del\u00E0 de P_MAX se montre d\u00E8s que le d\u00E9cor a son prix d'\u00EElot (chaque pi\u00E8ce\n       seule au m\u00B2, A-313 et A-429) ; le G n'a pas d'\u00EElot de forme, sa tranche restait cach\u00E9e */\n    h.classList.toggle('cp-ilot-non', (enOption(A) ? ilotM2(A) : ilotForme(A)) == null);\n    if (!obsChants && A.dims && typeof MutationObserver === 'function') {\n      obsChants = new MutationObserver(function () { nommerChants(); nommerArriere(); nommerTard(); nommerArrG(); nommerCasesBouts(); nommerCotesVus(); });   /* R202 */\n      obsChants.observe(A.dims, { subtree: true, childList: true, attributes: true, attributeFilter: ['aria-label'] });\n    }\n    if (on) { nommerChants(); setTimeout(nommerChants, 0); }\n    var ao = arriereChoix(A) && !etat(A);\n    h.classList.toggle('cp-arr-offert', ao);\n    if (ao) { nommerArriere(); setTimeout(nommerArriere, 0); }\n    var at = arrTard(A);                                               /* A-296 : sous ARR_MM, case montr\u00E9e et ferm\u00E9e */\n    h.classList.toggle('cp-arr-tard', at);\n    if (at) { nommerTard(); setTimeout(nommerTard, 0); }\n  }\n  /* case du chant arri\u00E8re propos\u00E9e (plan droit, ARR_MM au seuil de l'\u00EElot) : affich\u00E9e, cliquable m\u00EAme impos\u00E9e par le moteur\n     (chant arri\u00E8re choisi : tous les chants impos\u00E9s), un choix oui / non nomm\u00E9 pour le clavier et les lecteurs d'\u00E9cran */\n  /* A-299 cas 2 et 3 : cases d'arri\u00E8re des pi\u00E8ces de L, U et G montr\u00E9es (c\u00F4t\u00E9 mur, cach\u00E9es par cssMurs et le masque\n     \u00AB arri\u00E8re \u00BB de la r\u00E8gle) quand l'offre est ouverte */\n  function cssFini4() {\n    return CLES_ARR_P.map(function (k) { return 'html.cp-f4-offert:root #stage #dims .edge-checkbox-container:has(> .edge-checkbox-visual[data-edge=\"' + k + '\"])'; }).join(',') +\n      '{display:block!important;pointer-events:auto!important;opacity:1!important}';\n  }\n  function cssArriere() {\n    var c = 'html.cp-arr-offert:root #stage #dims .edge-checkbox-container:has(> .edge-checkbox-visual[data-edge=\"back\"])';\n    return c + '{display:block!important;pointer-events:auto!important;opacity:1!important}' +\n      'html.cp-arr-offert:root #stage #dims .edge-checkbox-visual.edge-checkbox-visual[data-edge=\"back\"]{pointer-events:auto!important;cursor:pointer}' + cssTard();\n  }\n  /* A-296 : sous ARR_MM, la case du chant arri\u00E8re montr\u00E9e, vide et gris\u00E9e (sans la coche des cases impos\u00E9es), sa raison en\n     bulle au clic ou au toucher, et en nom pour le clavier et les lecteurs d'\u00E9cran */\n  function cssTard() {\n    var c = 'html.cp-arr-tard:root #stage #dims .edge-checkbox-container:has(> .edge-checkbox-visual[data-edge=\"back\"])';\n    return c + '{display:block!important;pointer-events:auto!important;opacity:.45!important}' +\n      'html.cp-arr-tard:root #stage #dims .edge-checkbox-visual.edge-checkbox-visual[data-edge=\"back\"]{pointer-events:auto!important;cursor:not-allowed}';\n  }\n  function nommerTard() {\n    var A = getApp(); if (!A || !A.S || !A.dims || !document.documentElement.classList.contains('cp-arr-tard')) return;\n    var cb = A.dims.querySelector('.edge-checkbox-visual[data-edge=\"back\"]'), t = 'Chant du bord arri\u00E8re : brut, ' + texteTard().replace(/^Chant arri\u00E8re : /, '') + '.'; if (!cb) return;   /* R148-b3 ; la bulle garde texteTard */\n    if (cb.getAttribute('role') !== 'checkbox') cb.setAttribute('role', 'checkbox');\n    if (cb.getAttribute('aria-checked') !== 'false') cb.setAttribute('aria-checked', 'false');\n    /* R148-b4 (UX 23:14 ; AUDIT Tour 1126) : le Tab ne s'arr\u00EAte plus sur cette case, qui ne peut rien faire ; comme les cases\n       impos\u00E9es, elle garde son nom lu (la raison) et sa bulle au toucher */\n    if (cb.getAttribute('aria-disabled') !== 'true') cb.setAttribute('aria-disabled', 'true');\n    if (cb.getAttribute('tabindex') !== '-1') cb.setAttribute('tabindex', '-1');\n    if (cb.getAttribute('aria-label') !== t) cb.setAttribute('aria-label', t);\n    if (cb.title !== t) cb.title = t;\n  }\n  window.addEventListener('click', function (e) {\n    var A = getApp(), cb = e.target && e.target.closest && e.target.closest('.edge-checkbox-visual[data-edge=\"back\"]');\n    if (!cb || !A || !A.S || !A.dims || !A.dims.contains(cb) || !A.__cpPierreWrapped || !arrTard(A)) return;\n    e.preventDefault(); e.stopPropagation(); if (e.stopImmediatePropagation) e.stopImmediatePropagation();\n    toastBout(texteTard() + '.');\n    if (e.detail) setTimeout(function () { A.render(); }, 0);          /* clic bloqu\u00E9 : pas de survol coll\u00E9 */\n  }, true);\n  function nommerArriere() {\n    var A = getApp(); if (!A || !A.S || !A.dims || !document.documentElement.classList.contains('cp-arr-offert')) return;\n    var cb = A.dims.querySelector('.edge-checkbox-visual[data-edge=\"back\"]'); if (!cb) return;\n    var c4 = ILOT_CHANTS ? 'plan fini sur 4 c\u00F4t\u00E9s, au m\u00B2, 4 chants compris' : arrTarif() ? 'plan fini devant et derri\u00E8re' : 'plan au m\u00B2, chant arri\u00E8re compris';   /* A-296 : c\u00F4t\u00E9s au choix ; R182-b : au m\u00E8tre */\n    /* R148-b3 : \u00AB Chant du bord arri\u00E8re : \u2026 \u00BB */\n    var on = arriere(A), imp = !!A.S.cpArrParCoin, t = imp ? 'Chant du bord arri\u00E8re : fini d\\'office, impos\u00E9 par le coin arrondi au coin arri\u00E8re. ' + c4.charAt(0).toUpperCase() + c4.slice(1) + '.'\n      : pierreVraie(A) ? (on ? 'Chant du bord arri\u00E8re : fini, plan fini sur ses 4 c\u00F4t\u00E9s, au prix au m\u00B2.' : 'Chant du bord arri\u00E8re : brut. Cocher pour un plan fini sur ses 4 c\u00F4t\u00E9s, au prix au m\u00B2.')   /* R202, COMMERCIAL \u00A7 9.3 ; R148-b3 \u00A7 1 */\n      : arrTarif() ? (on ? 'Chant du bord arri\u00E8re : fini, ' + c4 + '.' : 'Chant du bord arri\u00E8re : brut. Cocher pour un ' + c4 + '.')   /* R182-b (COMMERCIAL Tour 226, raccourci par AUDIT : le prix est dans la bulle) */\n      : on ? 'Chant du bord arri\u00E8re : fini, ' + c4 + '. D\u00E9cocher pour le plan au m\u00E8tre.'\n      : 'Chant du bord arri\u00E8re : brut. Cocher pour un ' + c4 + '.';\n    if (cb.getAttribute('role') !== 'checkbox') cb.setAttribute('role', 'checkbox');\n    if (cb.getAttribute('aria-checked') !== String(on)) cb.setAttribute('aria-checked', String(on));\n    if (imp) { if (cb.getAttribute('aria-disabled') !== 'true') cb.setAttribute('aria-disabled', 'true'); if (!cb.classList.contains('disabled')) cb.classList.add('disabled'); }   /* A-291 : verrouill\u00E9e */\n    else {\n      if (cb.hasAttribute('aria-disabled')) cb.removeAttribute('aria-disabled');\n      /* A-423 (AUDIT Tour 1163) : coch\u00E9e, la case arri\u00E8re est verrouill\u00E9e au moteur (le chant compris, verrouArr) et il la\n         dessinait gris\u00E9e (.disabled : opacit\u00E9 .4, curseur interdit) alors qu'elle se d\u00E9coche ; elle a l'aspect d'une case\n         coch\u00E9e au choix. Le clic reste le n\u00F4tre (capture, plus bas) */\n      if (cb.classList.contains('disabled')) cb.classList.remove('disabled');\n    }\n    if (cb.getAttribute('tabindex') !== '0') cb.setAttribute('tabindex', '0');\n    if (cb.getAttribute('aria-label') !== t) cb.setAttribute('aria-label', t);\n    if (cb.title !== t) cb.title = t;\n  }\n  /* clic (souris, toucher, Entr\u00E9e / Espace via cp-a11y) sur la case du chant arri\u00E8re propos\u00E9e : oui / non, au lieu du chant du\n     moteur. En capture sur window : avant le moteur et cp-forme */\n  window.addEventListener('click', function (e) {\n    var A = getApp(), cb = e.target && e.target.closest && e.target.closest('.edge-checkbox-visual[data-edge=\"back\"]');\n    if (!cb || !A || !A.S || !A.dims || !A.dims.contains(cb) || !A.__cpPierreWrapped || !arriereChoix(A) || etat(A)) return;\n    e.preventDefault(); e.stopPropagation(); if (e.stopImmediatePropagation) e.stopImmediatePropagation();\n    var redessine = function () { if (e.detail) setTimeout(function () { A.render(); }, 0); };   /* clic bloqu\u00E9 : pas de survol coll\u00E9 */\n    if (A.S.cpArrParCoin) { toastBout('Chant arri\u00E8re impos\u00E9 par le coin arrondi au coin arri\u00E8re : retirez l\\'arrondi pour le d\u00E9cocher.'); redessine(); return; }   /* A-291 */\n    if (!arriere(A)) { var cp = coupesDe(A); if (cp.length) { toastBout(refusFini4(false, cp)); redessine(); return; } }   /* A-294 */\n    var ajout = arriere(A) || !arrTarif() ? '' : texteArrAjout(A);   /* A-423 (relev\u00E9 de CODE) : la bulle de R182-b, HPL seulement ; la pierre n'en avait pas */\n    A.S.cpArriere = !arriere(A);\n    A.render();\n    var n = A.dims.querySelector('.edge-checkbox-visual[data-edge=\"back\"]'); if (n) n.focus();\n    if (ajout && window.CFG_UI && window.CFG_UI.toast) setTimeout(function () { window.CFG_UI.toast(ajout, 'info', 9000); }, 0);\n  }, true);\n  /* R182-b (UX 04:43 ; AUDIT Tours 1158 et 1159, puis ses 2 corrections) : \u00E0 la coche du chant arri\u00E8re, la bulle d'A-304 dans sa\n     forme compl\u00E8te (cp-annonces, CP_simule et texteAjout), sur l'\u00E9tat r\u00E9el, dans les deux gammes : le prix de base qui change,\n     puis ce qui est ajout\u00E9 d'office (c\u0153ur noir : les 2 c\u00F4t\u00E9s, R182-a), puis l'\u00E9cart sur le total. \u00AB Ce choix change le prix de\n     base : +960,00 \u20AC. Il ajoute aussi : chant du c\u00F4t\u00E9 gauche : +39,00 \u20AC ; chant du c\u00F4t\u00E9 droit : +39,00 \u20AC. \u00C9cart sur le total :\n     +1 038,00 \u20AC. \u00BB Le texte de base n'est pas pass\u00E9 : \u00AB Plan fini devant et derri\u00E8re \u00BB ferait dire \u00AB fini 4 c\u00F4t\u00E9s \u00BB. La ligne\n     cach\u00E9e \u00AB Plan fini devant et derri\u00E8re : chant arri\u00E8re compris \u00BB (0 \u20AC) n'est pas dite. */\n  function texteArrAjout(A) {\n    if (typeof window.CP_simule !== 'function' || typeof window.CP_ecart !== 'function' || typeof window.CP_texteAjout !== 'function') return '';\n    try {\n      var r = window.CP_simule(A, [function (B) { B.S.cpArriere = true; B.render(); }]); if (!r || !r.avant || !r.apres[0]) return '';\n      var d = window.CP_ecart(r.avant, r.apres[0]), plus = (d.plus || []).filter(function (p) { return p.c && !/^Plan /.test(p.nom); });\n      return window.CP_texteAjout(Object.assign({}, d, { baseTexte: '', plus: plus }), null, null) || '';\n    } catch (x) { console.warn('[cp-pierre]', x); return ''; }\n  }\n\n  /* \u2500\u2500 Bouts libres (hors \u00EElot) : un choix par bout (droit : ses 2 bouts ; L : bout du plan et bout du retour ; U : bouts\n     des jambes ; G en option). La case du bout ne g\u00E8re que son chant : coch\u00E9e = fini droit (le chant du moteur, ou son\n     prix propre sur sa ligne), d\u00E9coch\u00E9e = sans finition, comprise = verrouill\u00E9e. Coupe du bout (Romain, 06/10 14:28 : \u00AB on\n     va garder le bord en biais + le hors d'\u00E9querre \u00BB) : deux types au carr\u00E9 vert des coins du bout, un seul par bout, la\n     m\u00EAme coupe dessin\u00E9e (le bout coup\u00E9 d'un point en retrait jusqu'\u00E0 l'autre coin ; retrait positif au coin avant, n\u00E9gatif\n     au coin arri\u00E8re) : \u00AB Bout en biais \u00BB (retrait 50 \u00E0 600 mm, livr\u00E9 fini, bout_oblique ; case coch\u00E9e et verrouill\u00E9e) et\n     \u00AB Hors \u00E9querre \u00BB (angle 85 \u00E0 95\u00B0, brut contre le mur, bout_hors ; case d\u00E9coch\u00E9e et verrouill\u00E9e, avec sa bulle).\n     Interne : choix \u00AB hors \u00BB (la coupe), f = bout en biais. Coin arrondi du bout (coins avant et arri\u00E8re) : livr\u00E9 fini.\n     Prix et bornes : r\u00E9glages \u00AB Bouts libres \u00BB de la r\u00E8gle ; un choix sans prix n'est pas propos\u00E9. En \u00EElot : rien (bouts\n     finis, compris, cases impos\u00E9es par le moteur). Le choix est \u00E9crit au r\u00E9capitulatif et dans \u00AB Bouts \u00BB. \u2500\u2500 */\n  var BOUTS = {                                                       /* ax : bord du bout, vertical (h : l'\u00E9tiquette entre en largeur) ou horizontal (v) */\n    linear: [{ k: 'sides', nom: 'c\u00F4t\u00E9 gauche', ax: 'h' }, { k: 'right', nom: 'c\u00F4t\u00E9 droit', ax: 'h' }],\n    angle: [{ k: 'sidesBarreH', nom: 'c\u00F4t\u00E9 libre du plan', ax: 'h' }, { k: 'sidesJambeVBottom', nom: 'c\u00F4t\u00E9 libre du retour', ax: 'v' }],\n    'u-shape': [{ k: 'front', nom: 'c\u00F4t\u00E9 libre de la jambe gauche', ax: 'v' }, { k: 'sides', nom: 'c\u00F4t\u00E9 libre de la jambe droite', ax: 'v' }]\n  };\n  var MOT = { sans: 'Sans finition', fini: 'Fini droit', arrondi: 'Arrondi', hors: 'Hors \u00E9querre' };\n  var COTE = {                                                        /* bornes : r\u00E9glages de la r\u00E8gle (lireRegle) */\n    oblique: { min: 50, max: 600, def: 100 },                         /* retrait sur l'avant de l'ancien bout en biais (mm) */\n    arrondi: { nom: 'Rayon du coin avant', u: 'mm', min: 30, max: 300, def: 30 },\n    hors: { min: 85, max: 95, def: 88, sauf: 90 }                     /* angle de l'ancien hors \u00E9querre (\u00B0), dans les deux sens */\n  };\n  function cap(s) { return s.charAt(0).toUpperCase() + s.slice(1); }\n  function fmtDeg(v) { var r = Math.round(num(v) * 10) / 10; return String(r).replace('.', ','); }   /* \u00AB 88 \u00BB, \u00AB 87,5 \u00BB */\n  /* coupe du bout : f = \u00AB Bout en biais \u00BB (bout_oblique), sinon \u00AB Hors \u00E9querre \u00BB (bout_hors) ; un type sans prix n'est pas\n     propos\u00E9 (stratifi\u00E9 : hors \u00E9querre seul) */\n  function horsPrix(f) { return f ? PRIX_BOUT.oblique : PRIX_BOUT.hors; }\n  function horsOffert() { return PRIX_BOUT.oblique > 0 || PRIX_BOUT.hors > 0; }\n  function horsF(f) { return !(PRIX_BOUT.hors > 0) ? true : !(PRIX_BOUT.oblique > 0) ? false : !!f; }\n  /* angle du bout (\u00B0) : 90 moins l'angle du retrait sur la profondeur ; retrait positif (coin avant) < 90, n\u00E9gatif > 90 */\n  function angleHors(P, x) { return 90 - Math.atan(num(x) / (P || 600)) * 180 / Math.PI; }\n  function retraitHors(P, a) { return Math.round((P || 600) * Math.tan((90 - num(a)) * Math.PI / 180)); }\n  /* bornes du retrait (mm, valeur absolue) : bout en biais, celles de la r\u00E8gle (50 \u00E0 600) ; hors \u00E9querre, de 89\u00B0 (91\u00B0) \u00E0\n     l'angle extr\u00EAme de la r\u00E8gle (85\u00B0, 95\u00B0) */\n  function limCoupe(P, f) {\n    if (f) return { min: COTE.oblique.min, max: COTE.oblique.max, def: COTE.oblique.def };\n    var mn = Math.max(1, Math.abs(retraitHors(P, 89))), mx = Math.max(mn, Math.abs(retraitHors(P, COTE.hors.min)), Math.abs(retraitHors(P, COTE.hors.max)));\n    return { min: mn, max: mx, def: Math.abs(retraitHors(P, COTE.hors.def)) };\n  }\n  function prixBout(A, c) {                                           /* en euros, r\u00E9glages \u00AB Bouts libres \u00BB de la r\u00E8gle */\n    if (c === 'fini' && FINI_CHANT) return num(A && A._eff && A._eff.edgeBandingUnitEuro);   /* prix du chant (selon la profondeur) */\n    return PRIX_BOUT[c] || 0;\n  }\n  function offert(A, c) {\n    if (FINI_COMPRIS) { if (c === 'sans') return false; if (c === 'fini') return true; }   /* fini droit compris : toujours propos\u00E9, jamais \u00AB sans \u00BB */\n    if (c === 'hors') return horsOffert();\n    return c === 'sans' || prixBout(A, c) > 0;\n  }\n  function choixDepart() { return FINI_COMPRIS ? 'fini' : 'sans'; }\n  /* G (plans joints) : bas du montant libre et bout du retour (cl\u00E9s selon le sens et la jonction du retour) ; le bout du\n     retour fini sur 4 c\u00F4t\u00E9s (chant arri\u00E8re) est compris, sans choix */\n  function boutsDe(A) {\n    var S = A.S, f4 = function (b) { return !fini4(A, pieceDuBout(A, b.k)); };   /* A-299 cas 2 et 3 : bout d'une pi\u00E8ce finie sur 4 c\u00F4t\u00E9s compris, hors des bouts libres */\n    if (S.layout !== 'g-shape') return BOUTS[S.layout] && (PIECES_F4[S.layout] ? BOUTS[S.layout].filter(f4) : BOUTS[S.layout]);\n    if (PA_ON && !enOption(A)) return null;                           /* A-299 cas 1 : sans pi\u00E8ce d'angle (stratifi\u00E9), les bouts du G aussi */\n    var R = S.gDir !== 'left', l = [{ k: R ? 'frontLeftBottomG' : 'frontLeftBottomGL', nom: R ? 'c\u00F4t\u00E9 libre du montant gauche' : 'c\u00F4t\u00E9 libre du montant droit', ax: 'v' }];\n    /* sans pi\u00E8ce d'angle, le bas du montant porteur est le coin ext\u00E9rieur de sa jonction avec le retour : pas un bout (AUDIT\n       Tour 617, gRightBR) */\n    var bp = PA_ON ? boutPorteur(A) : null; if (bp) l.push(bp);\n    l.push({ k: boutRetour(A), nom: 'c\u00F4t\u00E9 libre du retour', ax: 'h' });\n    return l.filter(f4);\n  }\n  /* choix de chaque bout de la forme : celui du client s'il est propos\u00E9, sinon sans finition ; en \u00EElot, aucun */\n  function bouts(A) {\n    var lay = A.S.layout, liste = BOUTS_ON ? boutsDe(A) : null; if (!liste || ilotOk(A)) return [];\n    var mem = (A.S.cpBouts = A.S.cpBouts || {}), m0 = (mem[lay] = mem[lay] || {});\n    return liste.map(function (b) {\n      var m = m0[b.k] || {}, c = m.c || choixDepart();\n      if (!offert(A, c) || (c === 'hors' && !num(m.x))) c = choixDepart();\n      var o = { k: b.k, nom: b.nom, ax: b.ax, c: c, v: null, prix: 0 };\n      if (c === 'hors') {                                             /* x : retrait sign\u00E9 (mm) ; coin : celui de la coupe ; f : bout en biais */\n        o.x = num(m.x); o.coin = m.coin || null; o.f = horsF(m.f); o.a = Math.round(angleHors(profBout(A, b), o.x) * 10) / 10;\n        o.v = o.f ? Math.abs(o.x) : o.a; o.prix = horsPrix(o.f);\n      } else if (c === 'arrondi') {                                   /* A-287 : coin avant et / ou arri\u00E8re, factur\u00E9 par coin, rayon commun du plan */\n        o.coins = (m.coins && m.coins.length) ? m.coins.slice() : []; o.n = Math.max(1, o.coins.length);\n        o.v = m.v != null ? m.v : COTE.arrondi.def; o.prix = PRIX_BOUT.arrondi * o.n;\n      } else { var co = COTE[c]; o.v = co ? (m.c === c && m.v != null ? m.v : co.def) : null; o.prix = prixBout(A, c); }\n      return o;\n    });\n  }\n  /* nom du bout avec le coin usin\u00E9, en clair pour l'atelier (AUDIT Tour 490) : \u00AB Bout gauche, coin arri\u00E8re \u00BB ; deux coins\n     arrondis : \u00AB Bout gauche, coins avant et arri\u00E8re \u00BB ; fini droit, sans finition : \u00AB Bout gauche \u00BB */\n  function nomBout(A, b) {\n    if (b.jonction) return cap(b.nom);                                  /* A-299 cas 3 : \u00AB Coin ext\u00E9rieur du plan et du retour \u00BB */\n    var c = '';\n    if (b.c === 'hors') c = b.x < 0 ? 'coin arri\u00E8re' : 'coin avant';\n    else if (b.c === 'arrondi') {\n      var fc = coinDe(A, b.k), av = (b.coins || []).some(function (k) { return k === fc; }), ar = (b.coins || []).some(function (k) { return k !== fc; });\n      c = av && ar ? 'coins avant et arri\u00E8re' : ar ? 'coin arri\u00E8re' : 'coin avant';\n    }\n    return cap(b.nom) + (c ? ', ' + c : '');\n  }\n  /* \u00AB bout en biais, retrait 100 mm \u00BB (\u00AB \u2026 sur l'arri\u00E8re \u00BB) ; \u00AB hors \u00E9querre 88\u00B0 \u00BB ; \u00AB coin arrondi, rayon 30 mm \u00BB ; \u00AB fini droit \u00BB */\n  function texteBout(b) {\n    if (b.c === 'arrondi') return (b.n > 1 ? b.n + ' coins arrondis' : 'coin arrondi') + ', rayon ' + fmtMm(b.v) + ' mm';\n    if (b.c === 'hors') return b.f ? 'bord en biais, retrait ' + fmtMm(Math.abs(b.x)) + ' mm' : 'hors \u00E9querre ' + fmtDeg(b.a) + '\u00B0';   /* le coin est dans le nom (nomBout) */\n    return MOT[b.c].toLowerCase() + (b.c === 'fini' && FINI_COMPRIS ? ' (compris)' : '');\n  }\n  /* R148-a (Romain : \u00AB ce ne sont pas des bouts mais des chants \u00BB ; AUDIT Tours 1043, 1061 et 16:01 ; COMMERCIAL,\n     docs\\commercial-r148-textes.md) : ce que lit le panier (propri\u00E9t\u00E9s et lignes d'Options, lues aussi par l'outil d'ADMIN) ne dit\n     plus \u00AB bout \u00BB : \u00AB C\u00F4t\u00E9 gauche \u00BB, \u00AB C\u00F4t\u00E9 libre du plan principal \u00BB ; \u00AB fini \u00BB (plus \u00AB fini droit \u00BB) ; \u00AB bord en biais \u00BB. Les\n     noms montr\u00E9s sur la fiche (pastilles, fen\u00EAtres) changent avec R148-b */\n  function nomCote(nom) {\n    var n = String(nom || '');\n    if (n === 'c\u00F4t\u00E9 libre du plan') return 'c\u00F4t\u00E9 libre du plan principal';\n    return n.replace(/^bout (gauche|droit)$/, 'c\u00F4t\u00E9 $1').replace(/^bout (du|de la) /, 'c\u00F4t\u00E9 libre $1 ');\n  }\n  function nomPanier(A, b) {                                         /* le coin, comme nomBout ; R148-b2 : un usinage, par le nom du coin au dessin */\n    if (b.jonction) return cap(b.nom);\n    if (b.c !== 'fini') { var nc = nomsCoins(A, b); if (nc) return cap(nc); }\n    return cap(nomCote(b.nom)) + nomBout(A, b).slice(cap(b.nom).length);\n  }\n  /* R148-b2 (COMMERCIAL Tour 212) : un seul nom par coin, celui du dessin et du menu (\u00AB plan principal, en haut \u00E0 gauche \u00BB) ; les\n     lignes Options d'un usinage : \u00AB Bord en biais (plan principal, en haut \u00E0 gauche), retrait 100 mm \u00BB, \u00AB Coin arrondi (retour, en\n     bas \u00E0 gauche), rayon 30 mm \u00BB ; un c\u00F4t\u00E9 fini \u00E0 part : \u00AB Chant du c\u00F4t\u00E9 gauche \u00BB ; son fa\u00E7onn\u00E9 : \u00AB \u2026 (avec le bord en biais) \u00BB */\n  function nomCoin(A, k) { var t = k && typeof window.CP_titreCoin === 'function' ? window.CP_titreCoin(A, k) : null; return t ? t.replace(/^Coin : /, '') : null; }\n  function nomsCoins(A, b) {\n    var ks = b.c === 'hors' ? [b.coin] : b.c === 'arrondi' ? (b.coins || []) : [], n = ks.map(function (k) { return nomCoin(A, k); });\n    return n.length && n.every(Boolean) ? n.join(' et ') : null;\n  }\n  function ligneBout(A, b) {\n    if (b.c === 'fini') return 'Chant du ' + nomCote(b.nom);\n    var nc = nomsCoins(A, b); if (!nc) return nomPanier(A, b) + ', ' + textePanier(b);\n    if (b.c === 'hors') return b.f ? 'Bord en biais (' + nc + '), retrait ' + fmtMm(Math.abs(b.x)) + ' mm' : 'Hors \u00E9querre (' + nc + '), ' + fmtDeg(b.a) + '\u00B0';\n    return (b.n > 1 ? 'Coins arrondis (' : 'Coin arrondi (') + nc + '), rayon ' + fmtMm(b.v) + ' mm';\n  }\n  function faconDe(b) { return b.c === 'arrondi' ? 'le coin arrondi' : b.c === 'hors' && b.f ? 'le bord en biais' : 'le demi-rond'; }\n  function textePanier(b) { return b.c === 'fini' ? 'fini' + (FINI_COMPRIS ? ' (compris)' : '') : texteBout(b).replace(/^bout en biais/, 'bord en biais'); }\n  /* D11 (AUDIT Tours 542, 544, 557 ; docs\\d11-cas.md) : un bout libre fa\u00E7onn\u00E9 (coin arrondi, bout en biais livr\u00E9 fini,\n     demi-rond \u00E0 l'un de ses coins) doit sa finition lat\u00E9rale, au prix du bout fini droit (chant de la profondeur, selon\n     l'\u00E9paisseur, sinon le prix de la r\u00E8gle). Pas un hors \u00E9querre (brut, contre le mur) ; rien si le fini droit est compris\n     ou d\u00E9j\u00E0 choisi \u2192 en euros */\n  function finitionFacon(A, b) {\n    if (!FACON_FINI || FINI_COMPRIS || b.c === 'fini') return 0;\n    var e = A.S.edges || {}, semi = e[coinDe(A, b.k)] === 'semi' || e[coinArr(A, b.k)] === 'semi';\n    return (b.c === 'arrondi' || (b.c === 'hors' && b.f) || semi) ? prixBout(A, 'fini') : 0;\n  }\n  /* fini droit \u00E0 un autre prix que le chant du moteur : sorti de \u00AB Chants supp. \u00BB, sur sa propre ligne */\n  function finiAPart(A) { return !FINI_CHANT && Math.round(PRIX_BOUT.fini * 100) !== Math.round(num(A._eff && A._eff.edgeBandingUnitEuro) * 100); }\n  /* R148-b2 : nom d'un c\u00F4t\u00E9 libre (bout) par sa cl\u00E9, tel que dans \u00AB Chants \u00BB (\u00AB c\u00F4t\u00E9 libre du plan principal \u00BB) ; null sinon */\n  window.CP_nomChantBout = function (A, k) { var b = (A && A.S && !etat(A) ? bouts(A) : []).filter(function (x) { return x.k === k && !x.jonction; })[0]; return b ? nomCote(b.nom) : null; };\n  window.CP_bouts = function () {                                     /* G compris (plans joints) : bas des montants libres et bout du retour */\n    var A = getApp(); if (!A || !A.S) return null;\n    return bouts(A).filter(function (b) { return b.c !== 'sans'; }).concat(rondsFini4(A)).map(function (b) {   /* A-291 : coins arrondis du plan fini sur 4 c\u00F4t\u00E9s */\n      var cx = b.c === 'hors' ? (b.f ? 'oblique' : 'hors') : b.c;     /* bout en biais : \u00AB oblique \u00BB, comme en ligne (outil A-175) */\n      /* R148-b1 (ADMIN Tour 957 ; AUDIT 20:48) : l'atelier lit les m\u00EAmes mots que \u00AB Chants \u00BB et \u00AB Usinage des coins \u00BB du panier\n         (\u00AB c\u00F4t\u00E9 libre du plan principal \u00BB, \u00AB fini \u00BB, \u00AB bord en biais \u00BB) ; la cl\u00E9 \u00AB bouts \u00BB du mod\u00E8le reste, cach\u00E9e */\n      var o = { cle: b.k, bout: b.jonction ? b.nom : nomCote(b.nom), choix: cx, cote: b.v, unite: cx === 'hors' ? '\u00B0' : (cx === 'oblique' || cx === 'arrondi') ? 'mm' : null, texte: textePanier(b),\n        prix_centimes: Math.round(b.prix * 100), facture_par: b.c === 'fini' ? (FINI_COMPRIS ? 'compris' : 'chant') : (b.prix > 0 ? 'suppl\u00E9ment' : null) };\n      if (b.c === 'hors') { o.retrait_mm = b.x; o.angle = b.a; o.coin = b.coin; o.finition = b.f ? 'fini' : 'brut'; }   /* retrait > 0 : sur l'avant ; < 0 : sur l'arri\u00E8re */\n      if (b.c === 'arrondi') { o.coins = b.coins; o.nombre = b.n; }                                       /* coins arrondis du bout (avant, arri\u00E8re) */\n      o.libelle = nomPanier(A, b) + ' : ' + textePanier(b);                                                /* tel que dans \u00AB Chants \u00BB ou \u00AB Usinage des coins \u00BB */\n      /* R148-b2 (ADMIN Tours 965 et 966 ; AUDIT 21:46 et 21:48) : donn\u00E9es internes, jamais affich\u00E9es, pour l'outil d'ADMIN, aux\n         mots de R148-a : coin_nom = \u00AB coin avant \u00BB, \u00AB coin arri\u00E8re \u00BB, \u00AB coins avant et arri\u00E8re \u00BB (coin de jonction : son nom,\n         \u00AB Coin ext\u00E9rieur du plan et du retour \u00BB) ; libelle_r148a = le libell\u00E9 d'avant R148-b2 (\u00AB C\u00F4t\u00E9 libre du plan principal,\n         coin avant : bord en biais, retrait 100 mm \u00BB) */\n      var nb = nomBout(A, b), cn = b.jonction ? nb : nb.slice(cap(b.nom).length).replace(/^, /, '');\n      if (cn) o.coin_nom = cn;\n      o.libelle_r148a = (b.jonction ? cap(b.nom) : cap(nomCote(b.nom)) + nb.slice(cap(b.nom).length)) + ' : ' + textePanier(b);\n      return o;\n    });\n  };\n  /* avant le rendu : le chant de chaque bout suit son choix (fini = chant du moteur ; en \u00EElot, le moteur les impose tous).\n     Un fini choisi compte comme un chant coch\u00E9 par le client (cp-forme) : le moteur ne le d\u00E9coche pas au retour de l'\u00EElot. */\n  function syncBouts(A) {\n    var S = A.S, lay = S.layout; S.edgeBanding = S.edgeBanding || {}; S.cpClientBanding = S.cpClientBanding || {};\n    /* la case d'un bout ne g\u00E8re que son chant (Romain, 06/10 11:0x ; AUDIT Tour 476) : coch\u00E9e = fini droit, d\u00E9coch\u00E9e = sans\n       finition. Elle ne change jamais un type : coin arrondi, demi-rond (livr\u00E9s finis) et hors \u00E9querre se choisissent et se\n       retirent au carr\u00E9 vert. Hors \u00E9querre : la case dit sa finition (coch\u00E9e = fini, d\u00E9coch\u00E9e = brut contre le mur) */\n    var clic = S.cpBoutClic; S.cpBoutClic = null;\n    var mem = (S.cpBouts = S.cpBouts || {}), m0 = (mem[lay] = mem[lay] || {});\n    if (clic) {\n      var b0 = bouts(A).filter(function (b) { return b.k === clic.k; })[0];\n      if (b0 && (b0.c === 'fini' || b0.c === 'sans')) {\n        if (clic.coche && offert(A, 'fini')) m0[b0.k] = { c: 'fini', v: null };\n        else if (!clic.coche && offert(A, 'sans')) m0[b0.k] = { c: 'sans', v: null };\n      }\n    }\n    /* bout livr\u00E9 fini par un demi-rond (A-283) : pas de fini droit factur\u00E9 en plus (sa case est verrouill\u00E9e) */\n    var lf = livresFinis(A);\n    bouts(A).forEach(function (b) { if (lf[b.k] && b.c === 'fini' && !FINI_COMPRIS) delete m0[b.k]; });\n    bouts(A).forEach(function (b) { S.edgeBanding[b.k] = b.c === 'fini'; S.cpClientBanding[b.k] = b.c === 'fini'; });\n  }\n  function livreTxt(A, b) { return b.c === 'arrondi' ? 'coin arrondi' : 'demi-rond'; }\n  function toastBout(t) { if (window.CFG_UI && window.CFG_UI.toast) window.CFG_UI.toast(t, 'info', 7000); }\n  function texteHors(b) { return cap(b.nom) + ' hors \u00E9querre (' + fmtDeg(b.a) + '\u00B0), contre un mur de biais : sans finition. Pour un chant fini, choisissez \u00AB Bord en biais \u00BB ou \u00AB Droit \u00BB dans le carr\u00E9 vert.'; }\n  /* geste du client sur la case d'un bout (souris, toucher, Entr\u00E9e / Espace via cp-a11y) : relev\u00E9 avant le moteur, qui la\n     bascule puis redessine. Case verrouill\u00E9e (type livr\u00E9 fini, bout en biais, fini compris) : rien ; hors \u00E9querre : sa bulle */\n  window.addEventListener('click', function (e) {\n    var A = getApp(), cb = e.target && e.target.closest && e.target.closest('.edge-checkbox-visual[data-edge]');\n    if (!cb || !A || !A.S || !A.dims || !A.dims.contains(cb) || !A.__cpPierreWrapped) return;\n    var k = cb.dataset.edge, b = bouts(A).filter(function (x) { return x.k === k; })[0]; if (!b) return;\n    var bloque = function () { e.preventDefault(); e.stopPropagation(); if (e.stopImmediatePropagation) e.stopImmediatePropagation(); };\n    if (b.c === 'arrondi' || livresFinis(A)[k]) { bloque(); return; }\n    /* coupe : bout en biais, rien ; hors \u00E9querre, sa bulle, puis (doigt, souris) redessin\u00E9 : survol\u00E9e et grossie (:hover,\n       \u00D7 1,12), sa zone couvrait le coin voisin \u00E0 375 */\n    if (b.c === 'hors') {\n      bloque(); if (b.f) return;\n      toastBout(texteHors(b)); if (e.detail) setTimeout(function () { A.render(); }, 0);\n      return;\n    }\n    if (FINI_COMPRIS) { bloque(); return; }\n    if (cb.classList.contains('disabled')) return;\n    A.S.cpBoutClic = { k: k, coche: !cb.classList.contains('checked') };\n  }, true);\n  /* apr\u00E8s le rendu, la case de chaque bout dit son \u00E9tat. Livr\u00E9 fini (coin arrondi, demi-rond) : coch\u00E9e et verrouill\u00E9e ; fini\n     droit compris : verrouill\u00E9e ; hors \u00E9querre : sa finition, sans la classe \u00AB checked \u00BB (que le moteur et le mod\u00E8le comptent\n     comme un chant : la coupe a son propre prix), verrouill\u00E9e s'il n'y en a qu'une au tarif. Nom, \u00E9tat et verrou pos\u00E9s\n     aussi apr\u00E8s cp-a11y (nommerCasesBouts) */\n  function pastilles(A) {\n    if (!A.dims) return;\n    var e = etat(A); if (e && e.mode === 'devis') return;\n    var lf = livresFinis(A);\n    bouts(A).forEach(function (b) {\n      var cb = A.dims.querySelector('.edge-checkbox-visual[data-edge=\"' + b.k + '\"]');\n      if (!cb && b.c === 'hors') cb = caseDeCoupe(A, b);              /* montant du G : la coupe prend tout le bout, le moteur n'y pose plus de case */\n      if (!cb) return;\n      var nom = null, coche = 'true', tab = '-1', ver = '1';\n      /* D11 : la finition lat\u00E9rale due est dite sur la case du bout ; R148-b2 (AUDIT Tour 1116) : avec les mots de sa ligne Options,\n         \u00AB Chant du c\u00F4t\u00E9 libre du plan principal (avec le bord en biais) : +69,00 \u20AC, impos\u00E9 \u00BB ; sans finition due : \u00AB \u2026, livr\u00E9 fini\n         (sans chant) \u00BB */\n      var ffc = Math.round(finitionFacon(A, b) * 100), livre = ', livr\u00E9 fini (sans chant)';\n      /* R148-b3 (COMMERCIAL \u00A7 1) : \u00AB Chant du c\u00F4t\u00E9 libre du plan principal : fini avec le bord en biais, +69,00 \u20AC. \u00BB */\n      var facon = function () { return 'Chant du ' + nomCote(b.nom) + ' : fini avec ' + faconDe(b) + (ffc > 0 ? ', +' + fmt(ffc) + ' \u20AC.' : ', compris dans le prix.'); };\n      if (b.c === 'arrondi' || lf[b.k]) {\n        cb.classList.add('disabled', 'cp-bout-livre'); nom = facon();\n      } else if (b.c === 'hors') {                                    /* coupe : sans la classe \u00AB checked \u00BB (le moteur la compterait comme un chant) */\n        cb.classList.remove('checked'); if (A.S.edgeBanding) A.S.edgeBanding[b.k] = false;\n        cb.classList.add('disabled', b.f ? 'cp-bout-fini' : 'cp-bout-brut');\n        centreBiais(A, b);\n        nom = b.f ? facon() : 'Chant du ' + nomCote(b.nom) + ' : brut, la coupe hors \u00E9querre se pose contre un mur.';   /* R148-b3 ; la bulle garde texteHors */\n        coche = b.f ? 'true' : 'false'; tab = b.f ? '-1' : '0';\n      } else if (FINI_COMPRIS && b.c === 'fini') {\n        cb.classList.add('disabled', 'cp-bout-compris'); nom = 'Chant du ' + nomCote(b.nom) + ' : fini, compris dans le prix.';   /* R148-b3 */   /* R148-b (AUDIT 18:21) : \u00AB C\u00F4t\u00E9 gauche : fini (compris) \u00BB, comme \u00AB Chants \u00BB du panier */\n      }\n      if (!nom) return;\n      cb.setAttribute('data-cp-nom', nom); cb.setAttribute('data-cp-coche', coche); cb.setAttribute('data-cp-tab', tab); cb.setAttribute('data-cp-verrou', ver);\n    });\n    nommerCasesBouts();\n  }\n  /* case d'un bout coup\u00E9 hors d'\u00E9querre que le moteur ne dessine plus (la coupe prend tout le c\u00F4t\u00E9 : bas d'un montant du G) :\n     pos\u00E9e ici, avec la m\u00EAme forme que celles du moteur ; la finition s'y lit et s'y change (clic, toucher, Entr\u00E9e, Espace) */\n  function caseDeCoupe(A, b) {\n    if (!A.dims) return null;\n    var box = document.createElement('div'); box.className = 'edge-checkbox-container cp-case-coupe';\n    box.style.position = 'absolute'; box.style.transform = 'translate(-50%, -50%)'; box.style.zIndex = '100';\n    var cb = document.createElement('div'); cb.className = 'edge-checkbox-visual'; cb.dataset.edge = b.k; cb.dataset.forceReason = 'none';\n    cb.addEventListener('keydown', function (e) { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); cb.click(); } });\n    cb.addEventListener('click', function () {});                     /* cible du toucher (sinon Chrome l'ajuste vers le coin voisin) ; le geste est lu en capture */\n    box.appendChild(cb); A.dims.appendChild(box);\n    return cb;\n  }\n  /* case d'un bout coup\u00E9 hors d'\u00E9querre : au milieu de l'ancien c\u00F4t\u00E9, entre ses deux coins (comme un bout droit). Le moteur\n     la posait au bout du segment restant, parfois sur un coin (G droite : sur le bouton gLeftBL, qui ne s'ouvrait plus au\n     doigt, 06/10 12:48) */\n  function centreBiais(A, b) {                                        /* apr\u00E8s le rendu (zones des coins pos\u00E9es et mesurables) ; deux essais */\n    var pose = function () {\n      var c = coinDe(A, b.k) || coinMenuDe(A, b.k), p = (PAIRES[A.S.layout] || []).filter(function (x) { return x.indexOf(c) >= 0; })[0];\n      var zone = function (k) { return [].slice.call(document.querySelectorAll('#stage rect.hit[data-cp-id=\"' + k + '\"]')).filter(function (h) { return h.getBoundingClientRect().width > 0; })[0]; };\n      var cb = A.dims && A.dims.querySelector('.edge-checkbox-visual[data-edge=\"' + b.k + '\"]'), box = cb && cb.closest('.edge-checkbox-container');\n      var h1 = c && zone(c), h2 = p && zone(p[0] === c ? p[1] : p[0]);\n      if (!h1 || !h2 || !box || !box.parentNode) return;\n      var r1 = h1.getBoundingClientRect(), r2 = h2.getBoundingClientRect(), d = box.parentNode.getBoundingClientRect();\n      box.style.left = ((r1.left + r1.width / 2 + r2.left + r2.width / 2) / 2 - d.left) + 'px';\n      box.style.top = ((r1.top + r1.height / 2 + r2.top + r2.height / 2) / 2 - d.top) + 'px';\n      if (typeof window.CP_eloigneCases === 'function') window.CP_eloigneCases(A);   /* c\u00F4t\u00E9 court \u00E0 375 : hors des boutons de coin (cp-a11y) */\n    };\n    setTimeout(pose, 0); setTimeout(pose, 250);\n  }\n  function nommerCasesBouts() {\n    var A = getApp(); if (!A || !A.dims) return;\n    Array.prototype.forEach.call(A.dims.querySelectorAll('.edge-checkbox-visual[data-cp-nom]'), function (cb) {\n      var t = cb.getAttribute('data-cp-nom'), on = cb.getAttribute('data-cp-coche'), tab = cb.getAttribute('data-cp-tab'), ver = cb.getAttribute('data-cp-verrou') !== '0';\n      if (cb.getAttribute('aria-label') !== t) cb.setAttribute('aria-label', t);\n      if (cb.title !== t) cb.title = t;\n      if (cb.getAttribute('role') !== 'checkbox') cb.setAttribute('role', 'checkbox');\n      if (cb.getAttribute('aria-checked') !== on) cb.setAttribute('aria-checked', on);\n      if (ver && cb.getAttribute('aria-disabled') !== 'true') cb.setAttribute('aria-disabled', 'true');\n      if (!ver && cb.hasAttribute('aria-disabled')) cb.removeAttribute('aria-disabled');\n      if (cb.getAttribute('tabindex') !== tab) cb.setAttribute('tabindex', tab);\n    });\n  }\n  /* \u2500\u2500 R202 (Romain, 01/11 : \u00AB pourquoi on a pas de chant pour neolith? vous me faite courrir un gros risque commercial \u00BB ;\n     AUDIT Tours 1076 et 1077) : le plan droit en pierre vendait ses chants (avant compris, c\u00F4t\u00E9s au prix de la r\u00E8gle, arri\u00E8re\n     en option) sans que rien ne le montre : 4 carr\u00E9s blancs de 15 px, sans texte. Ce qui est fini d'office et ce qui se coche\n     se lit pr\u00E8s du dessin, d'apr\u00E8s l'\u00E9tat des cases apr\u00E8s chaque rendu :\n       - un texte d'aide sous le dessin (#cp-stage-extras, comme celui des cr\u00E9dences, R35) ;\n       - \u00E0 768 px et plus, une \u00E9tiquette \u00E0 c\u00F4t\u00E9 de chaque case, dans le plan (\u00AB C\u00F4t\u00E9 gauche \u00B7 +59,00 \u20AC \u00BB) ; une \u00E9tiquette qui\n         toucherait une cote, un coin, une autre case ou sortirait du plan n'est pas pos\u00E9e ; au t\u00E9l\u00E9phone, aucune (\u00E0 375, le\n         plan n'a que 57 px de haut) ;\n       - des cases plus grandes, au bord vert fonc\u00E9, \u00AB + \u00BB dans une case libre (cssChantsVus) ; le prix dans leur nom.\n     Les bouts libres (nomm\u00E9s par pastilles) et les plans en L, U et G ne changent pas. Aucun prix ne change \u2500\u2500 */\n  var NOM_BORD = { front: 'Avant', back: 'Arri\u00E8re', sides: 'C\u00F4t\u00E9 gauche', right: 'C\u00F4t\u00E9 droit' };\n  /* les 5 plans en pierre (Neolith, Dekton, quartz, Silestone, gr\u00E8s) : pi\u00E8ce d'angle, \u00EElot aux chants compris, un suppl\u00E9ment\n     par chant. Le HPL (\u00EElot sans chants compris), le stratifi\u00E9 (sans pi\u00E8ce d'angle) et le laqu\u00E9 (sans suppl\u00E9ment par chant),\n     qui chargent aussi ce module, ne changent pas */\n  function pierreVraie(A) { var r = regle(A || getApp()); return PA_ON && ILOT_ON && ILOT_CHANTS && !!r && num(r.extraPriceEdgeBanding) > 0; }\n  function prixCote(A) {                                           /* centimes : selon la profondeur (cp-modele), sinon le suppl\u00E9ment par chant de la r\u00E8gle */\n    var p = typeof window.CP_prixChant === 'function' ? window.CP_prixChant(A) : null;\n    return Math.round(num(p != null ? p : A && A._eff && A._eff.edgeBandingUnitEuro) * 100);\n  }\n  function bordsVus(A) {\n    var out = [], h = document.documentElement; if (!A || !A.dims || !A.S || A.S.layout !== 'linear' || !pierreVraie(A)) return out;\n    var e = etat(A); if (e && e.mode === 'devis') return out;\n    var pc = prixCote(A), ar = arriere(A);                         /* COMMERCIAL \u00A7 9.2 : arri\u00E8re coch\u00E9, les 4 chants compris */\n    ['back', 'sides', 'right', 'front'].forEach(function (k) {\n      var cb = A.dims.querySelector('.edge-checkbox-visual[data-edge=\"' + k + '\"]'), box = cb && cb.closest('.edge-checkbox-container');\n      if (!cb || !box || !cb.getClientRects().length || getComputedStyle(box).display === 'none') return;\n      var on = cb.classList.contains('checked'), ver = cb.classList.contains('disabled'), t = null, x = { k: k, on: on, ver: ver };\n      if (cb.hasAttribute('data-cp-nom')) {                         /* bout libre : seul le fini droit compris (Silestone 30) se dit ici ; il garde son nom */\n        if (cb.classList.contains('cp-bout-compris')) out.push({ k: k, on: true, ver: true, bout: true, txt: NOM_BORD[k] + ' \u00B7 fini, compris' });\n        return;\n      }\n      if (k === 'back') {\n        if (h.classList.contains('cp-arr-offert')) { x.offert = true; t = on ? 'fini, plan fini sur 4 c\u00F4t\u00E9s' : 'en option : plan fini sur 4 c\u00F4t\u00E9s'; }\n        else if (on) t = 'fini, compris';\n      } else if ((on && ver) || (on && ar)) t = 'fini, compris';\n      else if (pc > 0) { x.prix = pc; t = (on ? 'fini, +' : '+') + fmt(pc) + ' \u20AC'; }\n      else if (on) t = 'fini';\n      if (!t) return;\n      x.txt = NOM_BORD[k] + ' \u00B7 ' + t; out.push(x);\n    });\n    return out;\n  }\n  function chantsVus(A) {\n    var L = bordsVus(A), h = document.documentElement;\n    h.classList.toggle('cp-chants-vus', L.length > 0);\n    aideChants(A, L); nommerCotesVus();                                /* R221 (Romain ; AUDIT Tour 1213) : plus d'\u00E9tiquette de chant dans le dessin, comme les autres mati\u00E8res */\n  }\n  /* texte d'aide sous le dessin (COMMERCIAL, docs\\commercial-r202-textes.md \u00A7 9.1) : au m\u00E8tre, l'avant compris et les c\u00F4t\u00E9s \u00E0\n     cocher \u00E0 leur prix ; c\u00F4t\u00E9s compris (Silestone 30) ; plan d\u00E9j\u00E0 fini sur 4 c\u00F4t\u00E9s par sa profondeur. La phrase de l'arri\u00E8re\n     seulement s'il est propos\u00E9 */\n  function aideChants(A, L) {\n    var p = document.getElementById('cp-chants-aide'), by = {}, t = '';\n    L.forEach(function (x) { by[x.k] = x; });\n    var cotes = ['sides', 'right'].map(function (k) { return by[k]; }).filter(Boolean), prix = cotes.filter(function (x) { return x.prix; })[0];\n    var arr = by.back && by.back.offert ? ' Avec le chant arri\u00E8re, le plan est fini sur ses 4 c\u00F4t\u00E9s et passe au prix au m\u00B2, tous les chants compris.' : '';\n    /* fini sur 4 c\u00F4t\u00E9s par la profondeur seule : toutes les cases impos\u00E9es, sans chant arri\u00E8re au choix (coch\u00E9 par le client,\n       le moteur les impose aussi : le texte au m\u00E8tre reste) */\n    if (L.length && L.every(function (x) { return x.on && x.ver; }) && by.back && !by.back.offert) t = 'Chants : \u00E0 cette profondeur, votre plan est fini sur ses 4 c\u00F4t\u00E9s, tous les chants compris.';\n    else if (prix) t = 'Chants : l\\'avant est fini, compris dans le prix. Cochez les c\u00F4t\u00E9s qui restent visibles : chacun est fini pour ' + fmt(prix.prix) + ' \u20AC.' + arr;\n    else if (cotes.length && cotes.every(function (x) { return x.on && x.ver; })) t = 'Chants : l\\'avant et les c\u00F4t\u00E9s sont finis, compris dans le prix.' + arr;\n    if (!t) { if (p && p.parentNode) p.parentNode.removeChild(p); return; }\n    var host = document.getElementById('cp-stage-extras') || (document.getElementById('stage') && document.getElementById('stage').parentNode); if (!host) return;\n    if (!p) { p = document.createElement('p'); p.id = 'cp-chants-aide'; p.setAttribute('role', 'note'); host.appendChild(p); }\n    if (p.textContent !== t) p.textContent = t;\n    if (host.hidden) host.hidden = false;\n  }\n  /* noms lus de l'avant et des c\u00F4t\u00E9s (COMMERCIAL \u00A7 9.3), repos\u00E9s apr\u00E8s cp-a11y (observateur des chants). Plan fini sur 4 c\u00F4t\u00E9s\n     (cp-ilot) : les noms de l'\u00EElot (nommerChants) ; l'arri\u00E8re propos\u00E9 : nommerArriere */\n  function nommerCotesVus() {\n    var A = getApp(), h = document.documentElement; if (!A || !h.classList.contains('cp-chants-vus') || h.classList.contains('cp-ilot')) return;\n    bordsVus(A).forEach(function (x) {\n      if (x.k === 'back' || x.bout || (x.k !== 'front' && !x.prix)) return;\n      var cb = A.dims.querySelector('.edge-checkbox-visual[data-edge=\"' + x.k + '\"]'); if (!cb) return;\n      var t = x.k === 'front' ? 'Chant du bord avant : fini, compris dans le prix.' : 'Chant du ' + NOM_BORD[x.k].toLowerCase() + ' : ' + (x.on ? 'fini, +' + fmt(x.prix) + ' \u20AC.' : 'brut. Cocher pour le finir, +' + fmt(x.prix) + ' \u20AC.');   /* R148-b3 */\n      if (cb.getAttribute('aria-label') !== t) cb.setAttribute('aria-label', t);\n      if (cb.title !== t) cb.title = t;\n    });\n  }\n  /* R221 (AUDIT Tours 1213 et 1217 ; Romain : \u00AB on uniformise la mise en forme \u00BB) : plus de style propre des cases (22 et\n     24 px, \u00AB + \u00BB) ; elles prennent l'aspect du HPL et du stratifi\u00E9. L'aide sous le dessin reste */\n  function cssChantsVus() {\n    return '#cp-chants-aide{margin:0;font-size:13px;line-height:1.45;color:#374151}';\n  }\n  /* hors \u00E9querre : fini = l'aspect d'une case coch\u00E9e (sans la classe \u00AB checked \u00BB que le moteur compte) ; brut verrouill\u00E9 =\n     grise, sans coche ; fini verrouill\u00E9 = l'aspect d'une case comprise (th\u00E8me : .disabled) */\n  function cssBouts() {\n    var v = '#dims .edge-checkbox-visual';\n    return v + '.cp-bout-fini{background:linear-gradient(135deg,var(--primary),var(--primary-light));border-color:var(--primary);box-shadow:0 4px 12px rgba(26,92,58,.25)}' +\n      v + '.cp-bout-fini::after{content:\"\\\\2713\";color:#fff;font-weight:900;font-size:11px}' +\n      v + '.cp-bout-fini.disabled{background:#c9c9c9;border:1px solid #9f9f9f;box-shadow:none}' + v + '.cp-bout-fini.disabled::after{color:#186a08}' +\n      v + '.cp-bout-brut.disabled{opacity:.55;background:#ececec;border:1px solid #9f9f9f;box-shadow:none}' + v + '.cp-bout-brut.disabled::after{content:none}' +\n      /* A-288 : titre de la fen\u00EAtre de cote entier (\u00AB Bout en biais (jambe droite, en bas \u00E0 gauche) \u00B7 +169 \u20AC \u00BB d\u00E9passait les\n         336 px et passait sous la croix, en U et en G) : la pastille passe \u00E0 la ligne, \u00E0 gauche de la croix */\n      '#edge-dims-popup .ep-tag{white-space:normal!important;max-width:100%;box-sizing:border-box;text-align:center;line-height:1.35}' +\n      '#edge-menu .em-opt.cp-sans-rond{display:none!important}';      /* A-291 : coin arri\u00E8re sans chant arri\u00E8re au tarif */\n  }\n\n  /* \u2500\u2500 Un seul syst\u00E8me : les carr\u00E9s verts des coins de chaque bout libre. En plus des coins du moteur : \u00AB Coin arrondi \u00BB au\n     coin avant (le coin arrondi du moteur, rayon born\u00E9 par la r\u00E8gle, un seul rayon par plan) et \u00AB Hors \u00E9querre \u00BB aux coins\n     avant et arri\u00E8re (type propre \u00AB biais \u00BB : tout le bout coup\u00E9, d'un point en retrait sur l'avant ou sur l'arri\u00E8re\n     jusqu'\u00E0 l'autre coin). Prix et bornes : r\u00E9glages \u00AB Bouts libres \u00BB de la r\u00E8gle ; compt\u00E9s avec les bouts, une ligne\n     chacun : le moteur ne fait que dessiner. Le hors \u00E9querre est dessin\u00E9 par le moteur comme un chanfrein sur toute la\n     profondeur du bout, le temps du rendu (contour r\u00E9el, cote du retrait ; trait de chant seulement s'il est fini) ; le\n     mod\u00E8le (cp-modele) et la 3D (cp-3d) le lisent comme \u00AB biais \u00BB \u00E0 son coin. Fini droit et sans finition : la case du\n     bout (Romain, 06/10 11:0x : \u00AB sur les checkbox on g\u00E8re juste les chants \u00BB). \u2500\u2500 */\n  var COIN_AVANT = {\n    linear: { sides: 'bottomLeft', right: 'bottomRight' },\n    'angle-right': { sidesBarreH: 'endHBL', sidesJambeVBottom: 'endVBL' },\n    'angle-left': { sidesBarreH: 'endHBR', sidesJambeVBottom: 'endVBR' },\n    'u-shape': { front: 'footLBR', sides: 'footRBL' },\n    'g-right': { frontLeftBottomG: 'gLeftBR', backReturnG: 'gReturnTL' },\n    'g-left': { frontLeftBottomGL: 'gLeftBL', frontReturnRightGL_F: 'gReturnTR', backReturnRightGL_O: 'gReturnTR' }\n  };\n  var PROF_BOUT = { linear: { sides: 'P', right: 'P' }, angle: { sidesBarreH: 'P1', sidesJambeVBottom: 'P2' }, 'u-shape': { front: 'Pl', sides: 'Pr' },\n    'g-shape': { frontLeftBottomG: 'Pgleft', backReturnG: 'Pgreturn', frontLeftBottomGL: 'Pgleft', frontReturnRightGL_F: 'Pgreturn', backReturnRightGL_O: 'Pgreturn' } };\n  var CLES_COINS = { linear: ['topLeft', 'topRight', 'bottomLeft', 'bottomRight'], angle: ['endHTL', 'endHTR', 'endHBL', 'endHBR', 'endVTL', 'endVTR', 'endVBL', 'endVBR'],\n    'u-shape': ['footLTL', 'footLBL', 'footLBR', 'footRTL', 'footRTR', 'footRBL', 'footRBR'],\n    'g-shape': ['gLeftTL', 'gLeftBL', 'gLeftBR', 'gTopTL', 'gTopTR', 'gTopBR', 'gRightTL', 'gRightTR', 'gRightBL', 'gRightBR', 'gReturnTL', 'gReturnTR', 'gReturnBL', 'gReturnBR'] };\n  var ICONE = function (d, bord) { return '<svg viewBox=\"0 0 40 40\" width=\"40\" height=\"40\" aria-hidden=\"true\"><path d=\"' + d + '\" fill=\"#e8e8e8\" stroke=\"#1a5c3a\" stroke-width=\"2\"/>' + (bord || '') + '</svg>'; };\n  var ICONE_BOUT = { hors: ICONE('M11,5 H35 V35 H5 Z') };\n  function coinsU() { return BOUTS_ON && (PRIX_BOUT.oblique > 0 || PRIX_BOUT.arrondi > 0); }\n  function r1Moteur(A) { return !!(A && A._eff && A._eff.__cpR1 && A._eff.__cpR1.on); }   /* coin arrondi propre \u00E0 la r\u00E8gle (stratifi\u00E9) */\n  function modeU(A) { return coinsU() && !r1Moteur(A); }\n  function coinDe(A, k) {\n    var S = A.S, l = S.layout, t = l === 'angle' ? COIN_AVANT[S.angleDir === 'left' ? 'angle-left' : 'angle-right'] : l === 'g-shape' ? COIN_AVANT[S.gDir === 'left' ? 'g-left' : 'g-right'] : COIN_AVANT[l];\n    return (t && t[k]) || null;\n  }\n  function boutDuCoin(A, c) { return c ? bouts(A).filter(function (b) { return coinDe(A, b.k) === c; })[0] || null : null; }\n  /* bout sans coin avant libre (G : bas du montant porteur, son coin int\u00E9rieur fondu dans le retour) : son hors \u00E9querre est\n     au carr\u00E9 vert de son coin ext\u00E9rieur (pas de biais ni d'arrondi) */\n  var COIN_MENU = { 'g-right': { frontRightBottomG_FF: 'gRightBR', frontRightBottomG_OF: 'gRightBR' }, 'g-left': { frontRightBottomGL_FF: 'gRightBL', frontRightBottomGL_OF: 'gRightBL' } };\n  function coinMenuDe(A, k) {\n    var c = coinDe(A, k); if (c || A.S.layout !== 'g-shape') return c;\n    var t = COIN_MENU[A.S.gDir === 'left' ? 'g-left' : 'g-right']; return (t && t[k]) || null;\n  }\n  function boutDuMenu(A, c) { return c ? bouts(A).filter(function (b) { return coinMenuDe(A, b.k) === c; })[0] || null : null; }\n  /* coin arri\u00E8re d'un bout : l'autre coin de son bord (PAIRES) ; bout porteur du G (sans coin avant libre) : son coin ext\u00E9rieur */\n  function coinArr(A, k) {\n    var c = coinDe(A, k); if (!c) return coinMenuDe(A, k);\n    var p = (PAIRES[A.S.layout] || []).filter(function (x) { return x.indexOf(c) >= 0; })[0]; return p ? (p[0] === c ? p[1] : p[0]) : null;\n  }\n  /* bout dont c est un coin de coupe hors d'\u00E9querre : sens +1 au coin avant (retrait sur l'avant), -1 au coin arri\u00E8re */\n  function boutDeCoin(A, c) {\n    if (!c) return null;\n    var r = null; bouts(A).forEach(function (b) { if (!r && coinDe(A, b.k) === c) r = { b: b, sens: 1 }; else if (!r && coinArr(A, b.k) === c) r = { b: b, sens: -1 }; });\n    return r;\n  }\n  /* \u2500\u2500 A-291 (Romain 06/10 15:3x) : un coin rond (coin arrondi, demi-rond) au coin arri\u00E8re d'un bout coche et verrouille le\n     chant arri\u00E8re, factur\u00E9 comme si le client l'avait coch\u00E9 : plan droit fini sur 4 c\u00F4t\u00E9s, au m\u00B2 ; G : retour fini sur 4\n     c\u00F4t\u00E9s. Sans chant arri\u00E8re au tarif (HPL ; L, U et montants du G ; d\u00E9cor sans prix d'\u00EElot) : pas de coin rond au coin\n     arri\u00E8re. Les coins arrondis du plan (ou du retour) ainsi fini restent, un prix par coin \u2500\u2500 */\n  function rondArr(A, b) {\n    var l = A.S.layout;\n    if (l === 'linear') return arriereOffert(A);\n    return fini4Offert(A) && !!pieceDuBout(A, b.k);                   /* A-299 cas 2 : toute pi\u00E8ce de L, U ou G (retour du G compris) */\n  }\n  /* bouts finis sur 4 c\u00F4t\u00E9s par leur chant arri\u00E8re (plan droit ; pi\u00E8ces de L, U et G) : hors de bouts(), coins arrondis \u00E0 part */\n  function finis4(A) {\n    if (!BOUTS_ON || !modeU(A) || !(PRIX_BOUT.arrondi > 0)) return [];\n    var l = A.S.layout;\n    if (l === 'linear' && arriere(A)) return BOUTS.linear;\n    return boutsF4(A);\n  }\n  function coinFini4(A, c) {\n    var r = null; if (!c || coinsJn(A)[c]) return r;                   /* coin ext\u00E9rieur de jonction : jnRond */\n    finis4(A).forEach(function (b) { if (!r && coinDe(A, b.k) === c) r = { b: b, sens: 1 }; else if (!r && coinArr(A, b.k) === c) r = { b: b, sens: -1 }; });\n    return r;\n  }\n  /* pi\u00E8ces qu'un coin rond au coin c finit sur 4 c\u00F4t\u00E9s : coin arri\u00E8re d'un bout (cas 2), coin ext\u00E9rieur d'une jonction (cas 3) */\n  function piecesDuCoin(A, c) {\n    if (!c || !fini4Offert(A)) return [];\n    if (coinsJn(A)[c]) return jnRond(A, c) ? jnDe(A, c).pieces : [];\n    return PIECES_F4[A.S.layout].filter(function (p) { var b = boutPiece(A, p), bc = b && coinArr(A, b.k); return !!bc && bc === c && coinDe(A, b.k) !== bc; });\n  }\n  /* A-294 (AUDIT Tour 501) : un plan fini sur 4 c\u00F4t\u00E9s n'a pas de coupe de bout. L'action qui l'y ferait passer (case du\n     chant arri\u00E8re, coin rond au coin arri\u00E8re) est refus\u00E9e tant qu'une coupe est pos\u00E9e, la coupe nomm\u00E9e dans la bulle */\n  /* R148-b2 (COMMERCIAL Tour 213) : une coupe pos\u00E9e = { f : bord en biais (sinon hors \u00E9querre), coin : son nom au dessin, nom : le c\u00F4t\u00E9 } ;\n     dite \u00AB le bord en biais (plan principal, en haut \u00E0 gauche) \u00BB, \u00AB les bords en biais (\u2026 ; \u2026) \u00BB */\n  function coupesDe(A, ks) {\n    return bouts(A).filter(function (b) { return b.c === 'hors' && (!ks || ks.indexOf(b.k) >= 0); })\n      .map(function (b) { return { f: !!b.f, coin: nomCoin(A, b.coin), nom: b.nom }; });\n  }\n  function dirCoupes(l, sansLieu) {\n    return [true, false].map(function (f) {\n      var x = l.filter(function (o) { return o.f === f; }); if (!x.length) return null;\n      var w = f ? (x.length > 1 ? 'les bords en biais' : 'le bord en biais') : (x.length > 1 ? 'les hors \u00E9querre' : 'le hors \u00E9querre'); if (sansLieu) return w;\n      return x.every(function (o) { return o.coin; }) ? w + ' (' + x.map(function (o) { return o.coin; }).join(' ; ') + ')' : w + ' ' + x.map(function (o) { return 'du ' + o.nom; }).join(' et ');\n    }).filter(Boolean).join(' et ');\n  }\n  function refusRondTxt(g, l, t) {                                     /* COMMERCIAL Tour 213 : la bulle du coin arrondi (ou du demi-rond) refus\u00E9 */\n    var n = typeof g === 'string' ? g : (g ? 'retour' : 'plan'), fem = femF4(n), b = l.some(function (o) { return o.f; }), h = l.some(function (o) { return !o.f; });\n    return (t === 'semi' ? 'Un demi-rond' : 'Un coin arrondi') + ' ici rend ' + (fem ? 'la ' : 'le ') + n + ' ' + finiF4(n) + ' sur tous ses c\u00F4t\u00E9s, et ' + (fem ? 'une telle ' : 'un tel ') + n +\n      ' ne peut pas avoir de ' + (b && h ? 'bord en biais ni de hors \u00E9querre' : b ? 'bord en biais' : 'hors \u00E9querre') + '. Retirez d\\'abord ' + dirCoupes(l) + '.';\n  }\n  function enClair(l) { return l.length > 1 ? l.slice(0, -1).join(', ') + ' et ' + l[l.length - 1] : l[0]; }\n  function refusFini4(g, l) {                                          /* L70 (lot \u00AB messages 1 \u00BB) ; g : nom de la pi\u00E8ce (A-299 cas 2 et 3), ou vrai pour le retour */\n    var n = typeof g === 'string' ? g : (g ? 'retour' : 'plan');\n    return 'Retirez d\\'abord ' + dirCoupes(l) + ' : ' + (femF4(n) ? 'une ' : 'un ') + n + ' ' + finiF4(n) + ' sur tous ses c\u00F4t\u00E9s n\\'en a pas.';\n  }\n  /* refus d'un coin rond au coin c, s'il ferait passer le plan (ou le retour du G) en fini sur 4 c\u00F4t\u00E9s avec une coupe pos\u00E9e */\n  function refusRondListe(A, c) {                                    /* R148-b2 : { g : la pi\u00E8ce, l : ses coupes } ou null */\n    var S = A.S;\n    if (S.layout === 'linear') {\n      if (arriere(A) || !arriereChoix(A) || !BOUTS.linear.some(function (b) { var bc = coinArr(A, b.k); return bc === c && coinDe(A, b.k) !== bc; })) return null;\n      var l = coupesDe(A); return l.length ? { g: false, l: l } : null;\n    }\n    var r = null;                                                      /* A-299 cas 2 et 3 : pi\u00E8ces de L, U et G */\n    piecesDuCoin(A, c).forEach(function (p) {\n      if (r || fini4(A, p)) return;\n      var b = boutPiece(A, p), lp = b ? coupesDe(A, [b.k]) : []; if (lp.length) r = { g: nomF4(A, p), l: lp };\n    });\n    return r;\n  }\n  function refusRond(A, c, t) { var r = refusRondListe(A, c); return r ? refusRondTxt(r.g, r.l, t) : null; }\n  function rondsFini4(A) {\n    var E = A.S.edges || {}, v = num(A.S.roundRadius) || COTE.arrondi.def, jn = coinsJn(A);\n    var r = finis4(A).map(function (b) {\n      var coins = [coinDe(A, b.k), coinArr(A, b.k)].filter(function (k) { return k && !jn[k] && E[k] === 'round1'; });\n      return coins.length ? { k: b.k, nom: b.nom, ax: b.ax, c: 'arrondi', coins: coins, n: coins.length, v: v, prix: PRIX_BOUT.arrondi * coins.length, fini4: true } : null;\n    }).filter(Boolean);\n    /* A-299 cas 3 : coin ext\u00E9rieur de jonction arrondi, compt\u00E9 une fois (Tour 541 b) */\n    Object.keys(jn).forEach(function (c) { if (E[c] === 'round1' && jnRond(A, c)) r.push({ k: c, nom: nomJn(A, c), ax: null, c: 'arrondi', coins: [c], n: 1, v: v, prix: PRIX_BOUT.arrondi, fini4: true, jonction: true }); });\n    return r;\n  }\n  function profBout(A, b) { var t = PROF_BOUT[A.S.layout], k = t && t[b.k]; return num(k && A.S[k]) || 600; }\n  function eurs(v) { return Math.round(v) === v ? String(v) : fmt(Math.round(v * 100)); }\n  window.CP_coinDuBout = function (c) {                                /* hors \u00E9querre ou coin arrondi d'un bout : pas de chant du moteur (cp-modele) */\n    var A = getApp(); if (!A || !A.S) return false;\n    var t = (A.S.edges || {})[c]; return (t === 'biais' && !!boutDeCoin(A, c)) || (t === 'round1' && modeU(A) && !!(boutDeCoin(A, c) || coinFini4(A, c) || jnRond(A, c)));   /* A-299 cas 3 */\n  };\n  window.CP_usinageBout = function (c) {                              /* liste \u00AB Usinage des coins \u00BB (cp-a11y) : la coupe de ce coin */\n    var A = getApp(), r = A && A.S && (A.S.edges || {})[c] === 'biais' ? boutDeCoin(A, c) : null;\n    return r && r.b.c === 'hors' ? (r.b.f ? 'Bord en biais ' + fmtMm(Math.abs(r.b.x)) + ' mm' : MOT.hors + ' ' + fmtDeg(r.b.a) + '\u00B0') : null;\n  };\n  window.CP_biaisMur = function (c) { var A = getApp(), r = A && A.S ? boutDeCoin(A, c) : null; return r && r.b.ax === 'v' ? 'vertical' : 'horizontal'; };   /* bord du retrait (avant ou arri\u00E8re), cp-modele et cp-3d */\n  window.CP_arrondiEur = function () { var A = getApp(); return A && A.S && modeU(A) ? PRIX_BOUT.arrondi : 0; };   /* demi-rond seul (cp-modele) */\n  /* types du moteur, une fois les r\u00E9glages lus : \u00AB biais \u00BB d\u00E9clar\u00E9 (sinon le moteur le remet droit), coin arrondi du bout\n     sans prix du moteur (il est compt\u00E9 avec les bouts) ; le coin arrondi propre \u00E0 la r\u00E8gle est gard\u00E9 tel quel */\n  function typesU(A) {\n    var e = A._eff; if (!e || !e.edgeTypes) return;\n    var ep = e.edgePricesEuro = e.edgePricesEuro || {};\n    if (!e.__cpR1) e.__cpR1 = { on: e.edgeTypes.round1 === true, eur: num(ep.round1) };\n    var u = modeU(A);\n    e.edgeTypes.biais = BOUTS_ON && horsOffert();\n    e.edgeTypes.round1 = e.__cpR1.on || (u && PRIX_BOUT.arrondi > 0);\n    ep.round1 = e.__cpR1.on ? e.__cpR1.eur : 0;\n  }\n  /* avant le rendu : le choix de chaque bout suit ses coins. \u00AB biais \u00BB (type du moteur) au coin avant ou arri\u00E8re = la coupe\n     du bout, de son type (cpCoupeMode : \u00AB biais \u00BB = bout en biais, \u00AB hors \u00BB = hors \u00E9querre, pos\u00E9 au carr\u00E9 vert ou par sa\n     fen\u00EAtre), son retrait born\u00E9 par le type ; un seul par bout, le dernier choisi (cpHorsDernier) ; coin arrondi au coin\n     avant ou arri\u00E8re = arrondi. Un biais ou un arrondi du bout hors d'un coin de bout libre (\u00EElot, autre coin) est retir\u00E9 */\n  function syncCoins(A) {\n    var S = A.S, lay = S.layout, E = S.edges = S.edges || {}, mem = (S.cpBouts = S.cpBouts || {}), m0 = (mem[lay] = mem[lay] || {}), vus = {};\n    var B = S.cpBiais = S.cpBiais || {}, u = modeU(A), ho = horsOffert(), der = S.cpHorsDernier = S.cpHorsDernier || {};\n    /* A-291 : coin rond au coin arri\u00E8re, chant arri\u00E8re coch\u00E9 ; la case d'avant est gard\u00E9e, rendue quand il est retir\u00E9 */\n    if (u) {\n      var rondAu = function (k) { var bc = coinArr(A, k); return !!bc && coinDe(A, k) !== bc && (E[bc] === 'round1' || E[bc] === 'semi'); };\n      if (lay === 'linear') {\n        var fl = arriereChoix(A) && BOUTS.linear.some(function (b) { return rondAu(b.k); }), cpz = fl && !S.cpArrParCoin && !arriere(A) ? coupesDe(A) : [];\n        if (cpz.length) {                                              /* A-294 : coupe pos\u00E9e, l'arrondi n'est pas pos\u00E9 */\n          BOUTS.linear.forEach(function (b) { if (rondAu(b.k)) E[coinArr(A, b.k)] = 'straight'; });\n          A.__cpBulle = refusRondTxt(false, cpz, 'round1'); fl = false;   /* R148-b2 : la bulle du coin arrondi (Tour 213) */\n        }\n        if (fl && !S.cpArrParCoin) { S.cpArrParCoin = { avant: S.cpArriere === true }; S.cpArriere = true; }\n        else if (!fl && S.cpArrParCoin) { S.cpArriere = S.cpArrParCoin.avant; delete S.cpArrParCoin; }\n      } else if (fini4Offert(A)) {                                     /* A-299 cas 2 et 3 : pi\u00E8ces de L, U et G (retour du G compris) */\n        var jn = coinsJn(A), imp = {};\n        /* A-294 : une coupe pos\u00E9e sur le bout d'une pi\u00E8ce \u00E0 finir : l'arrondi n'est pas pos\u00E9, la coupe nomm\u00E9e */\n        var pose = function (c, ps) {\n          var refus = null;\n          ps.forEach(function (p) { if (refus || fini4(A, p)) return; var b = boutPiece(A, p), lp = b ? coupesDe(A, [b.k]) : []; if (lp.length) refus = refusRondTxt(nomF4(A, p), lp, 'round1'); });\n          if (refus) { E[c] = 'straight'; A.__cpBulle = refus; return; }\n          ps.forEach(function (p) { if (!imp[p]) imp[p] = c; });\n        };\n        PIECES_F4[lay].forEach(function (p) {                          /* cas 2 : coin arri\u00E8re du bout de la pi\u00E8ce */\n          var b = boutPiece(A, p), bc = b && coinArr(A, b.k);\n          if (bc && !jn[bc] && rondAu(b.k)) pose(bc, [p]);\n        });\n        Object.keys(jn).forEach(function (c) {                         /* cas 3 : coin ext\u00E9rieur de jonction arrondi, les deux pi\u00E8ces */\n          if (E[c] !== 'round1') return;\n          var j = jnDe(A, c);\n          if (!jnRond(A, c)) { E[c] = 'straight'; if (j && (j.pa || j.c45)) A.__cpBulle = TXT_JN_RETIRE(j); return; }   /* Tour 625 (2) */\n          pose(c, j.pieces);\n        });\n        PIECES_F4[lay].forEach(function (p) {\n          var pc = parCoin(A, p);\n          if (partieIlot(A, p)) { if (pc) poseParCoin(A, p, null); return; }   /* A-313 : finie d'office par sa profondeur */\n          if (imp[p] && !pc) { poseParCoin(A, p, { avant: fini4(A, p), coin: imp[p] }); poseFini4(A, p, true); }\n          else if (imp[p] && pc.coin !== imp[p]) pc.coin = imp[p];\n          else if (!imp[p] && pc) { poseFini4(A, p, pc.avant === true); poseParCoin(A, p, null); }\n        });\n      }\n    }\n    bouts(A).forEach(function (b) {\n      var fc = coinDe(A, b.k), bc = coinArr(A, b.k), m = m0[b.k]; if (fc) vus[fc] = 1; if (bc) vus[bc] = 1;\n      if (u && bc && bc !== fc && !rondArr(A, b) && (E[bc] === 'round1' || E[bc] === 'semi')) E[bc] = 'straight';   /* A-291 : pas de chant arri\u00E8re au tarif, pas de coin rond au coin arri\u00E8re */\n      var fB = !!(ho && fc && E[fc] === 'biais'), bB = !!(ho && bc && E[bc] === 'biais');\n      if (fB && bB) { var garde = der[b.k] === bc ? bc : fc, autre = garde === fc ? bc : fc; E[autre] = 'straight'; delete B[autre]; fB = garde === fc; bB = !fB; }\n      var ar = u && PRIX_BOUT.arrondi > 0, fR = ar && fc && E[fc] === 'round1', bR = ar && bc && E[bc] === 'round1';\n      if (fB || bB) {\n        [fc, bc].forEach(function (k) { if (k && E[k] === 'round1' && u) E[k] = 'straight'; });   /* la coupe prend tout le bout : pas de coin arrondi avec elle */\n        var md = (S.cpCoupeMode || {})[b.k], f = horsF(md ? md === 'biais' : (m && m.c === 'hors' ? m.f : PRIX_BOUT.oblique > 0));\n        var c = fB ? fc : bc, lim = limCoupe(profBout(A, b), f);\n        B[c] = Math.max(lim.min, Math.min(lim.max, Math.round(num(B[c]) || lim.def)));\n        m0[b.k] = { c: 'hors', x: fB ? B[c] : -B[c], coin: c, f: f };\n      } else if (fR || bR) {                                          /* A-287 : coin arrondi au coin avant et / ou arri\u00E8re, un prix par coin */\n        S.roundRadius = Math.max(COTE.arrondi.min, Math.min(COTE.arrondi.max, Math.floor(profBout(A, b) / 2), Math.round(num(S.roundRadius) || COTE.arrondi.def)));\n        m0[b.k] = { c: 'arrondi', v: S.roundRadius, coins: [fR ? fc : null, bR ? bc : null].filter(Boolean) };\n      } else if (m && (m.c === 'hors' || m.c === 'oblique' || m.c === 'arrondi')) delete m0[b.k];\n    });\n    /* A-294 : coupe de bout qui tombe quand la profondeur fait passer le plan en fini sur 4 c\u00F4t\u00E9s (\u00EElot, arri\u00E8re impos\u00E9) : dite */\n    if (!bouts(A).length && (boutsDe(A) || []).length) {\n      var perdues = [];\n      boutsDe(A).forEach(function (b) { var m = m0[b.k]; if (m && m.c === 'hors' && m.coin && E[m.coin] === 'biais' && !vus[m.coin]) perdues.push((m.f ? 'le bord en biais' : 'le hors \u00E9querre') + ' du ' + b.nom); });\n      if (perdues.length) A.__cpBulle = '\u00C0 cette profondeur, le plan est fini sur tous ses c\u00F4t\u00E9s : ' + enClair(perdues) + (perdues.length > 1 ? ' sont retir\u00E9s' : ' est retir\u00E9') + ', car un plan fini sur tous ses c\u00F4t\u00E9s n\\'en a pas.';   /* L71 */\n    }\n    var vusR = {};                                                     /* A-291 : coins arrondis du plan ou des pi\u00E8ces finies sur 4 c\u00F4t\u00E9s, gard\u00E9s */\n    finis4(A).forEach(function (b) {\n      var cs = [coinDe(A, b.k), coinArr(A, b.k)].filter(Boolean); cs.forEach(function (c) { vusR[c] = 1; });\n      if (cs.some(function (c) { return E[c] === 'round1'; })) S.roundRadius = Math.max(COTE.arrondi.min, Math.min(COTE.arrondi.max, Math.floor(profBout(A, b) / 2), Math.round(num(S.roundRadius) || COTE.arrondi.def)));\n    });\n    Object.keys(coinsJn(A)).forEach(function (c) {                     /* A-299 cas 3 : rayon born\u00E9 par la moins profonde des deux pi\u00E8ces */\n      if (!jnRond(A, c)) return; vusR[c] = 1; if (E[c] !== 'round1') return;\n      var pl = plans(A), P = Math.min.apply(null, jnDe(A, c).pieces.map(function (p) { var x = pl && pl.pieces.filter(function (q) { return q.id === p; })[0]; return x ? num(x.P) : 600; }));\n      S.roundRadius = Math.max(COTE.arrondi.min, Math.min(COTE.arrondi.max, Math.floor(P / 2), Math.round(num(S.roundRadius) || COTE.arrondi.def)));\n    });\n    (CLES_COINS[lay] || []).forEach(function (c) { if (!vus[c] && (E[c] === 'biais' || (u && E[c] === 'round1' && !vusR[c]))) { E[c] = 'straight'; delete B[c]; } });\n  }\n  /* le temps du rendu : chaque hors \u00E9querre dessin\u00E9 par le moteur comme un chanfrein sur toute la profondeur du bout (le\n     retrait le long de l'avant ou de l'arri\u00E8re ; le moteur le borne \u00E0 la pi\u00E8ce), sans prix du moteur ; trait de chant de\n     la coupe seulement si elle est finie ; rendu au retour */\n  function masqueBiais(A) {\n    var S = A.S, E = S.edges || {}, e = A._eff || {}, ks = (CLES_COINS[S.layout] || []).filter(function (c) { return E[c] === 'biais'; });\n    if (!ks.length || !e.edgeTypes) return function () {};\n    var et = e.edgeTypes, ep = e.edgePricesEuro = e.edgePricesEuro || {}, sav = { t: et.bevel, p: ep.bevel, b: {} }, brut = {};\n    var reels = (CLES_COINS[S.layout] || []).filter(function (c) { return E[c] === 'bevel'; }).length;   /* vrais chanfreins du plan */\n    S.bevel = S.bevel || {};\n    ks.forEach(function (c) {\n      var r = boutDeCoin(A, c), b = r && r.b, x = num(S.cpBiais && S.cpBiais[c]) || COTE.oblique.def, p = b ? profBout(A, b) : 600;\n      if (b && b.c === 'hors' && !b.f) brut[c] = 1;\n      sav.b[c] = S.bevel[c]; E[c] = 'bevel';\n      S.bevel[c] = b && b.ax === 'v' ? { dx: p, dy: x } : { dx: x, dy: p };   /* chanfrein du moteur : dx \u00E0 l'horizontale ; avant vertical (retour, jambes) : le retrait en dy */\n    });\n    /* U-185 (AUDIT Tour 574) : le prix du chanfrein n'est mis \u00E0 0 que sans vrai chanfrein ; sinon il reste, et les faux\n       (les hors \u00E9querre) sortent de la ligne \u00AB Chanfreins \u00BB apr\u00E8s le calcul du moteur : un vrai chanfrein restait dessin\u00E9\n       mais n'\u00E9tait plus factur\u00E9 d\u00E8s qu'un hors \u00E9querre \u00E9tait pos\u00E9 ailleurs */\n    et.bevel = true; if (reels) A.__cpFauxChanfreins = ks.length; else ep.bevel = 0;\n    var oDCB = A.drawCornerBanding;\n    if (typeof oDCB === 'function') A.drawCornerBanding = function (rect, corner, key) { if (brut[key]) return; return oDCB.apply(this, arguments); };\n    return function () {\n      ks.forEach(function (c) { if (E[c] === 'bevel') E[c] = 'biais'; if (sav.b[c]) S.bevel[c] = sav.b[c]; else delete S.bevel[c]; });\n      et.bevel = sav.t; ep.bevel = sav.p; A.__cpFauxChanfreins = 0;\n      if (typeof oDCB === 'function') A.drawCornerBanding = oDCB;\n    };\n  }\n  /* le moteur coche d'office (\u00AB forc\u00E9 par un coin \u00BB) des chants autour d'un coin arrondi ou chanfrein\u00E9 ; en droit, le bout\n     gauche l'est m\u00EAme pour un coin du bout droit. Un biais ou un coin arrondi de bout est livr\u00E9 fini, au seul prix du bout :\n     quand tous les coins usin\u00E9s du plan sont de ceux-l\u00E0, aucun chant n'en est forc\u00E9 (case d\u00E9coch\u00E9e, sans trait) ; un chant\n     verrouill\u00E9 par la r\u00E8gle reste coch\u00E9, un bout fini droit aussi. Avec un autre coin usin\u00E9 (demi-rond\u2026), le moteur d\u00E9cide. */\n  /* les deux coins d'un bout (avant, arri\u00E8re), comme les paires du demi-rond (cp-modele) */\n  var PAIRES = { linear: [['topLeft', 'bottomLeft'], ['topRight', 'bottomRight']], angle: [['endHTL', 'endHBL'], ['endHTR', 'endHBR'], ['endVTL', 'endVTR'], ['endVBL', 'endVBR']],\n    'u-shape': [['footLBL', 'footLBR'], ['footRBL', 'footRBR']], 'g-shape': [['gLeftBL', 'gLeftBR'], ['gRightTL', 'gRightTR'], ['gRightBL', 'gRightBR'], ['gTopTR', 'gTopBR'], ['gReturnTL', 'gReturnBL'], ['gReturnTR', 'gReturnBR']] };\n  /* bouts livr\u00E9s finis par leur coin : coin arrondi du bout, demi-rond \u00E0 l'un de ses deux coins (A-283). Leur case est\n     coch\u00E9e et verrouill\u00E9e (bout fini), sans chant factur\u00E9 (retir\u00E9 de \u00AB Chants supp. \u00BB) ; le hors \u00E9querre a sa propre case */\n  function livresFinis(A) {\n    var S = A.S, E = S.edges || {}, out = {}; if (!modeU(A)) return out;\n    bouts(A).forEach(function (b) {\n      if (b.c === 'arrondi') out[b.k] = 1;                            /* coin avant ou arri\u00E8re (A-287) */\n      var c = coinDe(A, b.k); if (!c || b.c === 'hors') return;\n      (PAIRES[S.layout] || []).forEach(function (p) { if (p.indexOf(c) >= 0 && p.some(function (k) { return E[k] === 'semi'; })) out[b.k] = 1; });\n    });\n    return out;\n  }\n  function sansForcage(A) {\n    var u = modeU(A), bl = bouts(A);\n    if (!u && !bl.some(function (b) { return b.c === 'hors'; })) return null;   /* stratifi\u00E9 : seulement pour son hors \u00E9querre */\n    var S = A.S, E = S.edges || {}, ours = {}, fini = {};\n    bl.forEach(function (b) {\n      var c = coinDe(A, b.k), bc = coinArr(A, b.k); if (b.c === 'fini') fini[b.k] = 1;\n      /* hors \u00E9querre ou coin arrondi au coin arri\u00E8re : le moteur y imposerait le chant arri\u00E8re (stratifi\u00E9 : +288 \u20AC au\n         palier 800 ; pierre : au prix de l'\u00EElot), alors que la coupe ou l'arrondi a son propre prix */\n      if (bc && (E[bc] === 'biais' || (u && E[bc] === 'round1'))) ours[bc] = 1;\n      if (!u) { if (c && E[c] === 'biais') ours[c] = 1; return; }\n      if (!c) return;\n      if (E[c] === 'biais' || E[c] === 'round1') ours[c] = 1;\n      /* A-283 : demi-rond d'un bout (p\u00E9ninsule en arc) livr\u00E9 fini ; le chant arri\u00E8re n'est jamais propos\u00E9 */\n      (PAIRES[S.layout] || []).forEach(function (p) { if (p.indexOf(c) >= 0) p.forEach(function (k) { if (E[k] === 'semi') ours[k] = 1; }); });\n    });\n    /* A-299 cas 2 et 3 : coins arrondis des pi\u00E8ces finies sur 4 c\u00F4t\u00E9s et des jonctions ; leurs chants sont ceux de ces pi\u00E8ces\n       (case d'arri\u00E8re et bout, coch\u00E9s par syncFini4), les autres chants que le moteur forcerait pr\u00E8s de ces coins tombent */\n    if (u && PIECES_F4[S.layout] && fini4Offert(A)) {\n      rondsFini4(A).forEach(function (b) { b.coins.forEach(function (c) { ours[c] = 1; }); });\n      finies4(A).forEach(function (p) { var b = boutPiece(A, p); [clesArrP(A, p), b && b.k].forEach(function (k) { if (k) fini[k] = 1; }); });\n    }\n    if (!Object.keys(ours).length) return null;\n    if ((CLES_COINS[S.layout] || []).some(function (c) { var t = E[c]; return (t === 'round1' || t === 'semi' || t === 'bevel') && !ours[c]; })) return null;\n    var lay = S.layout, pre = lay === 'linear' ? 'linear_' : lay === 'angle' ? 'angle_' : lay === 'u-shape' ? 'u_' : null, lk = (A._eff && A._eff.bandingLocked) || {};\n    var livre = livresFinis(A);                                        /* hors \u00E9querre : d\u00E9coch\u00E9, sans trait (sa case dit sa finition apr\u00E8s le rendu) */\n    return { fini: fini, livre: livre, verrou: function (k) { return lk[(pre || (/GL(?:_|$)/.test(k) ? 'gl_' : 'g_')) + k] === true; } };\n  }\n  /* A-313 (ADMIN Tour 515, AUDIT) : dans un G dont une partie d\u00E9passe P_MAX, la r\u00E8gle de profondeur du moteur\n     (depthThreshold) coche toutes les ar\u00EAtes, faces contre le mur comprises. Une face contre le mur (MURS) d'une pi\u00E8ce qui\n     n'est pas finie sur 4 c\u00F4t\u00E9s ne se chante pas : case d\u00E9coch\u00E9e, trait retir\u00E9 (le bout de 600 du montant gauche contre le\n     mur du fond, backLeftG_FF, que la commande demandait sans le facturer). Pi\u00E8ce de chaque face : celle dont un bord est\n     le plus pr\u00E8s de sa case, relev\u00E9e apr\u00E8s le rendu ; le nom d'une cl\u00E9 porte les jonctions et le sens, sa pi\u00E8ce ne change\n     pas. Au rendu qui la d\u00E9couvre, un second rendu l'applique */\n  function cleMur(A, k) { return (A.S.gDir === 'left' ? 'GL:' : 'G:') + k; }\n  function murLibre(A, k) { var p = (A.__cpMurPiece || {})[cleMur(A, k)]; return !!p && !fini4(A, p); }\n  function poseMursG(A) {\n    if (A.S.layout !== 'g-shape' || !gProfond(A)) return null;\n    var oCb = A.addEdgeCheckbox, oInd = A.addEdgeBandingIndicator, dern = null, murs = MURS['g-shape'];\n    A.__cpMurPos = {}; A.__cpMursOtes = {};\n    A.addEdgeBandingIndicator = function () { var el = oInd.apply(this, arguments); dern = el; return el; };\n    A.addEdgeCheckbox = function (x, y, edge, checked, disabled, reason) {\n      var a = [].slice.call(arguments);\n      if (murs.indexOf(edge) >= 0) {\n        A.__cpMurPos[edge] = [num(x), num(y)];\n        if (reason === 'depthThreshold' && murLibre(A, edge)) {\n          if (checked && dern && dern.parentNode) dern.parentNode.removeChild(dern);   /* trait de ce chant, pos\u00E9 juste avant sa case */\n          a[3] = false; a[4] = true; a[5] = 'none';\n          if (A.S.edgeBanding) A.S.edgeBanding[edge] = false;\n          A.__cpMursOtes[edge] = 1;\n        }\n      }\n      dern = null;\n      return oCb.apply(this, a);\n    };\n    return function () { A.addEdgeCheckbox = oCb; A.addEdgeBandingIndicator = oInd; };\n  }\n  /* apr\u00E8s le rendu : pi\u00E8ce de chaque face contre le mur pos\u00E9e ; vrai si une face nouvellement rattach\u00E9e \u00E0 une pi\u00E8ce non\n     finie est rest\u00E9e chant\u00E9e (second rendu) */\n  function releveMursG(A) {\n    var pos = A.__cpMurPos, S = A.S; if (!pos || S.layout !== 'g-shape' || typeof window.CP_geomG !== 'function' || typeof window.CP_gParams !== 'function') return false;\n    Object.keys(A.__cpMursOtes || {}).forEach(function (k) { if (S.edgeBanding) S.edgeBanding[k] = false; });   /* recoch\u00E9e par le moteur apr\u00E8s sa case */\n    var bs = (A._cpPieces || []).filter(function (b) { return isFinite(b.x) && isFinite(b.y); }), g = window.CP_geomG(window.CP_gParams(S)); if (!bs.length || !g || !g.pieces) return false;\n    var O = [Math.min.apply(null, bs.map(function (b) { return num(b.x); })), Math.min.apply(null, bs.map(function (b) { return num(b.y); }))];\n    var dist = function (q, a, b) {\n      var dx = b[0] - a[0], dy = b[1] - a[1], l2 = dx * dx + dy * dy, t = l2 ? Math.max(0, Math.min(1, ((q[0] - a[0]) * dx + (q[1] - a[1]) * dy) / l2)) : 0;\n      return Math.hypot(q[0] - a[0] - t * dx, q[1] - a[1] - t * dy);\n    };\n    var m = A.__cpMurPiece = A.__cpMurPiece || {}, refaire = false;\n    Object.keys(pos).forEach(function (k) {\n      var c = cleMur(A, k); if (m[c]) return;\n      var q = [pos[k][0] - O[0], pos[k][1] - O[1]], best = null;\n      g.pieces.forEach(function (p) { p.pts.forEach(function (a, i) { var d = dist(q, a, p.pts[(i + 1) % p.pts.length]); if (!best || d < best.d) best = { d: d, id: p.id }; }); });\n      if (!best) return;\n      m[c] = best.id;\n      if (S.edgeBanding && S.edgeBanding[k] && murLibre(A, k)) refaire = true;\n    });\n    return refaire;\n  }\n  function poseSansForcage(A, sf) {\n    var oCb = A.addEdgeCheckbox, oInd = A.addEdgeBandingIndicator, dern = null;\n    A.addEdgeBandingIndicator = function () { var el = oInd.apply(this, arguments); dern = el; return el; };\n    A.addEdgeCheckbox = function (x, y, edge, checked, disabled, reason) {\n      var a = [].slice.call(arguments);\n      if (reason === 'edge' && !sf.fini[edge]) {\n        if (sf.verrou(edge) || sf.livre[edge]) { a[3] = true; a[4] = true; a[5] = 'locked'; a[6] = null; }   /* compris, ou bout livr\u00E9 fini par son coin */\n        else {\n          if (checked && dern && dern.parentNode) dern.parentNode.removeChild(dern);   /* trait de ce chant, pos\u00E9 juste avant sa case */\n          a[3] = false; a[4] = false; a[5] = 'none'; a[6] = null;\n          if (A.S.edgeBanding) A.S.edgeBanding[edge] = false;\n          (sf.otes = sf.otes || {})[edge] = 1;                       /* le moteur le recoche parfois apr\u00E8s la case (U, coupe au coin arri\u00E8re) */\n        }\n      }\n      dern = null;\n      return oCb.apply(this, a);\n    };\n    return function () { A.addEdgeCheckbox = oCb; A.addEdgeBandingIndicator = oInd; };\n  }\n  /* carr\u00E9 vert : \u00E0 un coin avant de bout libre, \u00AB Coin arrondi \u00BB ; aux coins avant et arri\u00E8re d'un bout libre (et au coin\n     ext\u00E9rieur du bout porteur du G), \u00AB Hors \u00E9querre \u00BB (type \u00AB biais \u00BB du moteur), au prix de la finition que dit la case\n     (fini : bout_oblique ; brut : bout_hors) ; ailleurs, cach\u00E9s. Apr\u00E8s la mise \u00E0 jour du moteur (qui n'en conna\u00EEt pas les\n     prix). Un ancien bouton \u00AB Hors \u00E9querre \u00BB \u00E0 part (versions pr\u00E9c\u00E9dentes) est retir\u00E9 */\n  var R1_TXT = null;\n  function menuCoin(A) {\n    var menu = document.getElementById('edge-menu'); if (!menu) return;\n    var k = A.menuTarget, u = modeU(A), bm = k ? boutDuMenu(A, k) : null, b = bm && coinDe(A, bm.k) === k ? bm : null, E = A.S.edges || {};   /* b : coin AVANT du bout */\n    var r1 = menu.querySelector('.em-opt[data-type=\"round1\"]'), s1 = r1 && r1.querySelector('span');\n    if (s1 && R1_TXT == null) R1_TXT = s1.textContent;\n    if (s1) s1.textContent = u ? 'Coin arrondi' : R1_TXT;\n    var prix = function (el, v) { var p = el && el.querySelector('.em-price'); if (p) p.textContent = '+' + eurs(v) + '\u20AC'; };\n    var vieux = menu.querySelector('.cp-em-hors, .em-opt[data-type=\"biais\"]:not([data-cp-mode])'); if (vieux && vieux.parentNode) vieux.parentNode.removeChild(vieux);\n    var hb = k ? boutDeCoin(A, k) : null, f4 = k && !hb && u ? coinFini4(A, k) : null;\n    var sansRond = !!(u && hb && hb.sens < 0 && !rondArr(A, hb.b));   /* A-291 : coin arri\u00E8re sans chant arri\u00E8re au tarif */\n    /* A-300 (AUDIT Tour 574) : pas de demi-rond hors d'un bout libre (coin ext\u00E9rieur de jonction d'un L, d'un U ou d'un G) ;\n       il y ajoutait des chants non annonc\u00E9s. Le demi-rond reste aux bouts, et au plan fini sur 4 c\u00F4t\u00E9s */\n    var horsBout = !!(u && BOUTS_ON && k && !hb && !f4);\n    var se = menu.querySelector('.em-opt[data-type=\"semi\"]'); if (se) se.classList.toggle('cp-sans-rond', sansRond || horsBout);   /* l'affichage du moteur n'est pas touch\u00E9 */\n    /* deux boutons (type \u00AB biais \u00BB du moteur pour les deux, le mode dit lequel) : \u00AB Bout en biais \u00BB (bout_oblique), \u00AB Hors\n       \u00E9querre \u00BB (bout_hors) ; actif : celui de la coupe de ce coin */\n    [['biais', 'Bord en biais', ICONE('M5,35 L17,5 H35 V35 Z'), PRIX_BOUT.oblique], ['hors', MOT.hors, ICONE_BOUT.hors, PRIX_BOUT.hors]].forEach(function (d) {\n      var bt = menu.querySelector('.em-opt[data-cp-mode=\"' + d[0] + '\"]');\n      if (!bt && d[3] > 0) {\n        bt = document.createElement('button'); bt.type = 'button'; bt.className = 'em-opt'; bt.setAttribute('data-type', 'biais'); bt.setAttribute('data-cp-mode', d[0]);\n        bt.innerHTML = d[2] + '<span></span><small class=\"em-price\"></small>';\n        menu.insertBefore(bt, menu.querySelector('.em-opt[data-type=\"notch\"]'));\n      }\n      if (!bt) return;\n      if (hb && d[3] > 0) {\n        var ici = E[k] === 'biais' && hb.b.c === 'hors' && (hb.b.f === (d[0] === 'biais'));\n        bt.style.removeProperty('display');\n        bt.querySelector('span').textContent = d[1] + (ici ? ' ' + (d[0] === 'biais' ? fmtMm(Math.abs(hb.b.x)) + ' mm' : fmtDeg(hb.b.a) + '\u00B0') : '');\n        prix(bt, d[3]); bt.classList.toggle('active', ici);\n      } else bt.style.setProperty('display', 'none', 'important');\n    });\n    /* A-299 cas 3 : au coin ext\u00E9rieur d'une jonction, \u00AB Coin arrondi \u00BB seulement en jonction droite (Tour 625, 2) ; sinon la\n       bulle dit pourquoi, une fois par ouverture */\n    var jk = !!(u && k && fini4Offert(A) && coinsJn(A)[k]);\n    if (r1 && u) {                                                    /* A-287 : aux coins avant et arri\u00E8re d'un bout, un prix par coin */\n      if ((jk ? jnRond(A, k) : ((hb && !sansRond) || f4)) && PRIX_BOUT.arrondi > 0) { r1.style.removeProperty('display'); prix(r1, PRIX_BOUT.arrondi); }\n      else r1.style.setProperty('display', 'none', 'important');\n    }\n    var jd = jk && !jnRond(A, k) ? jnDe(A, k) : null;\n    if (jd && (jd.pa || jd.c45)) { if (!A.__cpJnMenu || A.__cpJnMenu.k !== k || Date.now() - A.__cpJnMenu.t > 4000) toastBout(TXT_JN_MENU(jd)); A.__cpJnMenu = { k: k, t: Date.now() }; }\n  }\n  /* la mise \u00E0 jour du menu est pos\u00E9e par le moteur \u00E0 son d\u00E9marrage, apr\u00E8s ce module : envelopp\u00E9e au premier rendu suivant */\n  function selMenu(A) {\n    var o = A.updateMenuSelection; if (typeof o !== 'function' || o.__cpU) return;\n    A.updateMenuSelection = function () { var r = o.apply(this, arguments); try { menuCoin(this); } catch (e) { console.warn('[cp-pierre]', e); } return r; };\n    A.updateMenuSelection.__cpU = true;\n  }\n  /* A-297 (AUDIT Tours 523-524) : bandeau de consentement de Shopify, fix\u00E9 en bas \u00E0 la 1re visite (z 2 000 000). On ne le\n     ferme pas, on ne consent \u00E0 rien \u00E0 la place du client. Bas utile de l'\u00E9cran : le haut du bandeau quand il est affich\u00E9 */\n  function bandeauVu() {\n    var b = document.getElementById('shopify-pc__banner'); if (!b) return null;\n    var cs = getComputedStyle(b); if (cs.display === 'none' || cs.visibility === 'hidden') return null;\n    var r = b.getBoundingClientRect(), vh = document.documentElement.clientHeight;\n    return r.height > 0 && r.top > 0 && r.top < vh && r.bottom >= vh - 2 ? { top: r.top, z: num(cs.zIndex) } : null;\n  }\n  /* A-344 : une fen\u00EAtre qui ne tient pas au-dessus du bandeau passe devant lui, par le gardien commun de cp-annonces (toutes\n     les fen\u00EAtres, toutes les fiches) ; ce module ne fait que la placer */\n  function gardien() { if (typeof window.CP_devantBandeau === 'function') window.CP_devantBandeau(); }\n  /* fen\u00EAtre de cote, dans la fen\u00EAtre des coins du moteur (m\u00EAme place, m\u00EAmes classes) : une cote, Supprimer, Appliquer */\n  function placerFenetre(popup, cx, cy) {\n    popup.style.transform = 'none'; popup.classList.remove('hidden');\n    var place = function () {\n      if (popup.classList.contains('hidden')) return;\n      var M = 10, vw = document.documentElement.clientWidth, pw = popup.offsetWidth || 300, ph = popup.offsetHeight || 240;\n      var b0 = bandeauVu(), devant = !!b0 && ph > b0.top - 2 * M, vh = b0 && !devant ? b0.top : document.documentElement.clientHeight;   /* A-297 */\n      var px = cx + M, py = cy + M;\n      if (px + pw > vw - M) px = cx - pw - M;\n      if (py + ph > vh - M) py = cy - ph - M;\n      px = Math.max(M, Math.min(px, vw - pw - M)); py = Math.max(M, Math.min(py, vh - ph - M));\n      var host = popup.offsetParent, hr = host ? host.getBoundingClientRect() : null;\n      popup.style.left = (px - (hr ? hr.left : 0)) + 'px'; popup.style.top = (py - (hr ? hr.top : 0)) + 'px';\n      gardien();\n    };\n    place(); requestAnimationFrame(place); setTimeout(place, 160);\n  }\n  /* D10 v2 : fen\u00EAtre ouverte par le badge d'angle d'un coin, enti\u00E8re \u00E0 l'\u00E9cran et sans cacher le badge : dessous, dessus,\n     \u00E0 droite ou \u00E0 gauche (la premi\u00E8re qui tient) ; sinon la page d\u00E9file une fois pour monter le badge, puis dessous */\n  function placerPres(popup, el) {\n    popup.style.transform = 'none'; popup.classList.remove('hidden');\n    var defile = false;\n    /* le badge est recr\u00E9\u00E9 \u00E0 chaque rendu (le moteur vide #dims) et replac\u00E9 jusqu'\u00E0 700 ms apr\u00E8s : la fen\u00EAtre suit le badge\n       de m\u00EAme cl\u00E9, et se recale apr\u00E8s ses placements (lot \u00AB annonces \u00BB : la simulation rend avant d'ouvrir) */\n    var badge = function () {\n      if (el.isConnected) return el;\n      var A0 = getApp(), d = A0 && A0.dims, c = el.getAttribute('data-coin'), k = el.getAttribute('data-int');\n      var n = d && (c ? d.querySelector('.cp-angle-coin[data-coin=\"' + c + '\"]') : k ? d.querySelector('.cp-angle-int[data-int=\"' + k + '\"]') : null);\n      if (n) el = n;\n      return el;\n    };\n    var place = function () {\n      if (popup.classList.contains('hidden') || !badge().isConnected) return;\n      var M = 10, vw = document.documentElement.clientWidth, pw = popup.offsetWidth || 300, ph = popup.offsetHeight || 240;\n      var b0 = bandeauVu(), devant = !!b0 && ph > b0.top - 2 * M, vh = b0 && !devant ? b0.top : document.documentElement.clientHeight;   /* A-297 : au-dessus du bandeau, ou devant lui */\n      var r = el.getBoundingClientRect(), cx = function () { return Math.max(M, Math.min(r.left + r.width / 2 - pw / 2, vw - pw - M)); }, cy = function () { return Math.max(M, Math.min(r.top + r.height / 2 - ph / 2, vh - ph - M)); };\n      var bas = r.bottom + M + ph <= vh - M, haut = r.top - M - ph >= M, dr = r.right + M + pw <= vw - M && ph <= vh - 2 * M, ga = r.left - M - pw >= M && ph <= vh - 2 * M;\n      if (!bas && !haut && !dr && !ga) {                              /* ne tient nulle part : badge mont\u00E9 en haut (une fois), fen\u00EAtre dessous */\n        if (!defile) { defile = true; window.scrollBy(0, r.top - M - 8); r = el.getBoundingClientRect(); }\n        bas = true;\n      }\n      var px = bas || haut ? cx() : dr ? r.right + M : r.left - M - pw;\n      var py = bas ? r.bottom + M : haut ? r.top - M - ph : cy();\n      py = Math.max(M, Math.min(py, vh - ph - M));\n      var host = popup.offsetParent, hr = host ? host.getBoundingClientRect() : null;\n      popup.style.left = (px - (hr ? hr.left : 0)) + 'px'; popup.style.top = (py - (hr ? hr.top : 0)) + 'px';\n      gardien();\n    };\n    place(); requestAnimationFrame(place); setTimeout(place, 160); setTimeout(place, 280); setTimeout(place, 760);\n  }\n  /* A-288 (AUDIT 13:00) : la fen\u00EAtre est b\u00E2tie comme celle du moteur (configurator-main, coins) : figure .edge-schema\n     (dont d\u00E9pendent, au th\u00E8me, la largeur de 336 px, le titre en colonne sous la croix et les boutons c\u00F4te \u00E0 c\u00F4te), rappel\n     sous la figure, champs \u00E0 pas \u00AB \u2212 / + \u00BB, Supprimer et Appliquer. o.champs : [{ id, label, unite, min, max, val, pas }] ;\n     o.lier(i, vals) : recalcule les autres champs quand le i-\u00E8me change ; o.schema(vals) : la figure ; o.verifier(vals) :\n     message d'erreur ou rien ; o.ok(vals), o.suppr() */\n  function fenetreCote(A, o) {\n    var popup = A.edgePopup || document.getElementById('edge-dims-popup'), title = document.getElementById('edge-popup-title'), content = document.getElementById('edge-popup-content');\n    if (!popup || !title || !content) return;\n    title.textContent = o.titre;\n    var tg = document.createElement('span'); tg.className = 'ep-tag'; tg.textContent = o.tag; title.appendChild(tg);\n    var C = o.champs, un = C.length === 1, h = '';\n    C.forEach(function (c) { h += '<label for=\"' + c.id + '\"></label>'; });\n    C.forEach(function (c) {\n      h += '<div class=\"ni-field\"><button type=\"button\" class=\"ni-step\" data-for=\"' + c.id + '\" data-step=\"-1\" aria-label=\"Diminuer\">\u2212</button>' +\n        '<input type=\"number\" id=\"' + c.id + '\" step=\"' + (c.pas || 1) + '\" inputmode=\"decimal\"><span></span>' +\n        '<button type=\"button\" class=\"ni-step\" data-for=\"' + c.id + '\" data-step=\"1\" aria-label=\"Augmenter\">+</button></div>';\n    });\n    C.forEach(function (c, i) { h += '<small class=\"ni-hint\" id=\"cp-coin-hint-' + i + '\"></small>'; });\n    content.innerHTML = '<div class=\"edge-fig\"><div id=\"edge-schema-host\"></div><div class=\"edge-piece\"></div></div>' +\n      '<div class=\"edge-inputs' + (un ? ' is-single' : '') + '\">' + h + '</div>' +\n      '<div class=\"edge-actions\"><button type=\"button\" id=\"edge-delete\">Supprimer</button><button type=\"button\" id=\"edge-apply\">Appliquer</button></div>';\n    var host = content.querySelector('#edge-schema-host'), labs = content.querySelectorAll('.edge-inputs > label');\n    content.querySelector('.edge-piece').textContent = o.piece || '';\n    var inps = C.map(function (c, i) {\n      var inp = content.querySelector('#' + c.id), hint = content.querySelector('#cp-coin-hint-' + i);\n      labs[i].textContent = c.label;\n      inp.parentNode.querySelector('span').textContent = c.unite;\n      inp.min = c.min; inp.max = c.max; inp.value = c.val;\n      hint.textContent = c.aide || ('de ' + fmtDeg(c.min) + ' \u00E0 ' + fmtDeg(c.max) + (c.unite === '\u00B0' ? '' : ' ') + c.unite);\n      return inp;\n    });\n    var lire = function (inp) { var v = Number(String(inp.value).replace(',', '.')); return isFinite(v) && String(inp.value).trim() !== '' ? v : NaN; };\n    var vals = function () { return inps.map(lire); };\n    var dessin = function () { var v = vals(); if (o.schema && v.every(isFinite)) host.innerHTML = o.schema(v); };\n    var erreur = function (t) {\n      C.forEach(function (c, i) { var hi = content.querySelector('#cp-coin-hint-' + i); hi.textContent = (i === 0 && t) ? t : (c.aide || ('de ' + fmtDeg(c.min) + ' \u00E0 ' + fmtDeg(c.max) + (c.unite === '\u00B0' ? '' : ' ') + c.unite)); hi.classList.toggle('is-error', i === 0 && !!t); });\n      inps.forEach(function (inp) { inp.parentNode.classList.toggle('is-error', !!t); });\n    };\n    var change = function (i) { if (o.lier) { var v = o.lier(i, vals()); if (v) v.forEach(function (x, j) { if (j !== i && isFinite(x)) inps[j].value = x; }); } erreur(''); dessin(); };\n    var valider = function () {\n      var v = vals(), msg = null;\n      C.forEach(function (c, i) { if (!msg && !(v[i] >= c.min && v[i] <= c.max)) msg = c.label + ' : de ' + fmtDeg(c.min) + ' \u00E0 ' + fmtDeg(c.max) + (c.unite === '\u00B0' ? '' : ' ') + c.unite; });\n      if (!msg && o.verifier) msg = o.verifier(v);\n      if (msg) { erreur(msg); inps[0].focus(); return; }\n      A.closeEdgePopup(); o.ok(v); if (o.retour) o.retour();          /* D10 v2 : focus rendu au badge qui a ouvert la fen\u00EAtre */\n    };\n    Array.prototype.forEach.call(content.querySelectorAll('.ni-step'), function (s) {\n      s.addEventListener('click', function () {\n        var i = C.map(function (c) { return c.id; }).indexOf(s.getAttribute('data-for')), c = C[i], v = lire(inps[i]);\n        inps[i].value = Math.round(Math.max(c.min, Math.min(c.max, (isFinite(v) ? v : c.val) + Number(s.getAttribute('data-step')) * (c.pas || 1))) * 10) / 10;\n        change(i);\n      });\n    });\n    inps.forEach(function (inp, i) {\n      inp.addEventListener('input', function () { change(i); });\n      inp.addEventListener('keydown', function (e) { if (e.key === 'Enter') { e.preventDefault(); valider(); } });\n    });\n    content.querySelector('#edge-apply').addEventListener('click', valider);\n    content.querySelector('#edge-delete').addEventListener('click', function () { A.closeEdgePopup(); o.suppr(); if (o.retour) o.retour(); });\n    dessin();\n    if (o.xy) placerFenetre(popup, o.xy[0], o.xy[1]);\n    else if (o.pres) placerPres(popup, o.pres);\n    setTimeout(function () { try { inps[0].focus({ preventScroll: !!o.pres }); inps[0].select(); } catch (e) {} }, 0);\n  }\n  /* figures (viewBox du moteur 300 \u00D7 196, m\u00EAmes classes) : le bout vu de dessus, l'avant en bas, le bout \u00E0 gauche */\n  var FIG_DEFS = '<defs><marker id=\"cp-ns-a\" markerWidth=\"6\" markerHeight=\"6\" refX=\"5.2\" refY=\"3\" orient=\"auto\"><path d=\"M0,0.4 L6,3 L0,5.6 z\" fill=\"#b07c35\"/></marker>' +\n    '<marker id=\"cp-ns-b\" markerWidth=\"6\" markerHeight=\"6\" refX=\"0.8\" refY=\"3\" orient=\"auto\"><path d=\"M6,0.4 L0,3 L6,5.6 z\" fill=\"#b07c35\"/></marker></defs>';\n  /* position du coin \u00E0 l'\u00E9cran : { r: \u00E0 droite, b: en bas } (\u00AB bottomLeft \u00BB, ou suffixe BL / BR / TL / TR des autres formes) */\n  function posCoin(k) {\n    var m = /^(top|bottom)(Left|Right)$/.exec(k || ''); if (m) return { r: m[2] === 'Right', b: m[1] === 'bottom' };\n    var s = String(k || '').slice(-2); return { r: s.charAt(1) === 'R', b: s.charAt(0) === 'B' };\n  }\n  /* figure de la coupe (AUDIT 15:00) : la pi\u00E8ce vue comme sur le dessin, le coin choisi \u00E0 sa place (gauche / droite, haut /\n     bas). Bout \u00AB h \u00BB (bord du bout vertical : plan droit, plan du L) : la coupe descend tout le bord, le retrait se lit \u00E0\n     l'horizontale ; bout \u00AB v \u00BB (bord horizontal : retour du L, jambes du U, montants du G) : elle traverse le bord, le\n     retrait se lit \u00E0 la verticale. Au mur : le bord oppos\u00E9 au coin avant */\n  function figCoupe(P, x, angle, k, ax, sens) {\n    var dX = (ax === 'v' && posCoin(k).r) ? -16 : 0;                     /* A-318 : la cote d'un bout vertical \u00E0 droite tient dans les 300 du sch\u00E9ma */\n    var X0 = 70 + dX, X1 = 250 + dX, Y0 = 34, Y1 = 152, p = posCoin(k), v = ax === 'v';\n    var L = v ? (X1 - X0) : (Y1 - Y0), s = L / (P || 600), xs = Math.min((v ? Y1 - Y0 : X1 - X0) - 20, Math.max(4, Math.abs(x) * s));\n    var cx = p.r ? X1 : X0, cy = p.b ? Y1 : Y0, ix = p.r ? -1 : 1, iy = p.b ? -1 : 1;   /* coin, vers l'int\u00E9rieur */\n    var P1 = v ? [cx, cy + iy * xs] : [cx + ix * xs, cy];                                  /* point en retrait */\n    var O = v ? [p.r ? X0 : X1, cy] : [cx, p.b ? Y0 : Y1];                                   /* autre bout du bord coup\u00E9 */\n    var Cs = [[X0, Y0], [X1, Y0], [X1, Y1], [X0, Y1]], ic = Cs.findIndex(function (q) { return q[0] === cx && q[1] === cy; });\n    var pts = [], i; for (i = 0; i < 4; i++) { var q = Cs[(ic + i) % 4]; pts.push(i === 0 ? P1 : q); }\n    /* le coin est remplac\u00E9 par le point en retrait ; le bord coup\u00E9 relie ce point \u00E0 O (le polygone passe par O) */\n    var d = 'M ' + pts.map(function (q) { return q[0] + ',' + q[1]; }).join(' L ') + ' Z';\n    var dl = v ? (p.r ? X1 + 16 : X0 - 16) : (p.b ? Y1 + 16 : Y0 - 14), mid = v ? (cy + P1[1]) / 2 : (cx + P1[0]) / 2;\n    var cote = v ? '<line class=\"ns-rap\" x1=\"' + cx + '\" y1=\"' + cy + '\" x2=\"' + dl + '\" y2=\"' + cy + '\"/><line class=\"ns-rap\" x1=\"' + cx + '\" y1=\"' + P1[1] + '\" x2=\"' + dl + '\" y2=\"' + P1[1] + '\"/>' +\n        '<line class=\"ns-dim\" x1=\"' + dl + '\" y1=\"' + cy + '\" x2=\"' + dl + '\" y2=\"' + P1[1] + '\" marker-start=\"url(#cp-ns-b)\" marker-end=\"url(#cp-ns-a)\"/>' +\n        '<text class=\"ns-txt\" x=\"' + (p.r ? dl + 6 : dl - 6) + '\" y=\"' + (mid + 4) + '\" text-anchor=\"' + (p.r ? 'start' : 'end') + '\">' + fmtMm(Math.abs(x)) + ' mm</text>'\n      : '<line class=\"ns-rap\" x1=\"' + cx + '\" y1=\"' + cy + '\" x2=\"' + cx + '\" y2=\"' + dl + '\"/><line class=\"ns-rap\" x1=\"' + P1[0] + '\" y1=\"' + cy + '\" x2=\"' + P1[0] + '\" y2=\"' + dl + '\"/>' +\n        '<line class=\"ns-dim\" x1=\"' + cx + '\" y1=\"' + dl + '\" x2=\"' + P1[0] + '\" y2=\"' + dl + '\" marker-start=\"url(#cp-ns-b)\" marker-end=\"url(#cp-ns-a)\"/>' +\n        '<text class=\"ns-txt\" x=\"' + Math.max(X0 + 24, Math.min(X1 - 24, mid)) + '\" y=\"' + (p.b ? dl + 15 : dl - 7) + '\" text-anchor=\"middle\">' + fmtMm(Math.abs(x)) + ' mm</text>';\n    var am = [(P1[0] + O[0]) / 2 + (v ? 0 : ix * 12), (P1[1] + O[1]) / 2 + (v ? iy * 14 : 4)];\n    var mur = v ? (sens > 0 ? (p.r ? 'L' : 'R') : (p.r ? 'R' : 'L')) : (sens > 0 ? (p.b ? 'T' : 'B') : (p.b ? 'B' : 'T'));   /* bord du mur : oppos\u00E9 au bord avant */\n    var murTxt = mur === 'T' ? '<text class=\"ns-txt\" x=\"' + ((X0 + X1) / 2) + '\" y=\"' + (Y0 - (p.b ? 10 : 26)) + '\" text-anchor=\"middle\">mur</text>'\n      : mur === 'B' ? '<text class=\"ns-txt\" x=\"' + ((X0 + X1) / 2) + '\" y=\"' + (Y1 + (p.b ? 30 : 16)) + '\" text-anchor=\"middle\">mur</text>'\n      : '<text class=\"ns-txt\" x=\"' + (mur === 'L' ? X0 - 8 : X1 + 8) + '\" y=\"' + ((Y0 + Y1) / 2 + (v ? 0 : 4)) + '\" text-anchor=\"' + (mur === 'L' ? 'end' : 'start') + '\">mur</text>';\n    return '<svg class=\"edge-schema\" viewBox=\"0 0 300 196\" role=\"img\" aria-label=\"Coupe du c\u00F4t\u00E9, ' + fmtDeg(angle) + ' degr\u00E9s, retrait de ' + fmtMm(Math.abs(x)) + ' mm, ' + (nomCoin(getApp(), k) || 'coin ' + (p.b ? 'bas' : 'haut') + ' ' + (p.r ? 'droit' : 'gauche')) + '\">' + FIG_DEFS +\n      '<rect class=\"ns-ghost\" x=\"' + X0 + '\" y=\"' + Y0 + '\" width=\"' + (X1 - X0) + '\" height=\"' + (Y1 - Y0) + '\" rx=\"2\"/>' +\n      '<path class=\"ns-piece\" d=\"' + d + '\"/>' + cote +\n      '<text class=\"ns-txt\" x=\"' + am[0] + '\" y=\"' + am[1] + '\" text-anchor=\"' + (v ? 'middle' : (p.r ? 'end' : 'start')) + '\">' + fmtDeg(angle) + '\u00B0</text>' + murTxt + '</svg>';\n  }\n  function figArrondi(P, r, k) {                                      /* l'arc au coin choisi, \u00E0 sa place */\n    var X0 = 70, X1 = 250, Y0 = 34, Y1 = 152, p = posCoin(k), s = (Y1 - Y0) / (P || 600), rs = Math.min((Y1 - Y0) / 2, Math.max(6, r * s));\n    var cx = p.r ? X1 : X0, cy = p.b ? Y1 : Y0, ix = p.r ? -1 : 1, iy = p.b ? -1 : 1, A1 = [cx + ix * rs, cy], A2 = [cx, cy + iy * rs];\n    var Cs = [[X0, Y0], [X1, Y0], [X1, Y1], [X0, Y1]], ic = Cs.findIndex(function (q) { return q[0] === cx && q[1] === cy; });\n    var nxt = Cs[(ic + 1) % 4], first = (nxt[1] === cy) ? A1 : A2, last = first === A1 ? A2 : A1;   /* sens horaire : on quitte le coin vers le suivant */\n    var d = 'M ' + first[0] + ',' + first[1];\n    for (var i = 1; i < 4; i++) d += ' L ' + Cs[(ic + i) % 4][0] + ',' + Cs[(ic + i) % 4][1];\n    d += ' L ' + last[0] + ',' + last[1] + ' A ' + rs + ',' + rs + ' 0 0 1 ' + first[0] + ',' + first[1] + ' Z';\n    var arc = 'M ' + last[0] + ',' + last[1] + ' A ' + rs + ',' + rs + ' 0 0 1 ' + first[0] + ',' + first[1];\n    var tx = cx + ix * (rs + 34), ty = cy + iy * (rs / 2) + 4;\n    return '<svg class=\"edge-schema\" viewBox=\"0 0 300 196\" role=\"img\" aria-label=\"Coin arrondi, rayon ' + fmtMm(r) + ' mm, ' + (nomCoin(getApp(), k) || 'coin ' + (p.b ? 'bas' : 'haut') + ' ' + (p.r ? 'droit' : 'gauche')) + '\">' + FIG_DEFS +\n      '<rect class=\"ns-ghost\" x=\"' + X0 + '\" y=\"' + Y0 + '\" width=\"' + (X1 - X0) + '\" height=\"' + (Y1 - Y0) + '\" rx=\"2\"/>' +\n      '<path class=\"ns-piece\" d=\"' + d + '\"/>' + '<path class=\"ns-arc\" d=\"' + arc + '\"/>' +\n      '<text class=\"ns-txt\" x=\"' + tx + '\" y=\"' + ty + '\" text-anchor=\"middle\">R ' + fmtMm(r) + ' mm</text></svg>';\n  }\n  /* hors \u00E9querre d'un coin de bout (angle et retrait li\u00E9s) ou coin arrondi d'un coin avant : la fen\u00EAtre du moteur (plac\u00E9e\n     par lui), avec les bornes de la r\u00E8gle */\n  function fenetreCoin(A, key, t, b, rect, sens, opt) {\n    var w = num(rect && rect.w), h = num(rect && rect.h), P = profBout(A, b);\n    if (t === 'biais') {                                              /* coupe de ce coin : le type choisi au carr\u00E9 vert (ou d\u00E9j\u00E0 pos\u00E9) */\n      var neuf = !!(opt && opt.neuf), pres = opt && opt.pres;        /* D10 v2 : badge d'un coin droit, rien de pos\u00E9 avant \u00AB Appliquer \u00BB */\n      var md = neuf ? 'hors' : (A.S.cpCoupeMode || {})[b.k] || (b.c === 'hors' ? (b.f ? 'biais' : 'hors') : 'biais'), f = horsF(md === 'biais');\n      var a = function (x) { return Math.round(angleHors(P, sens * x) * 10) / 10; }, cur = neuf ? 0 : num(A.S.cpBiais && A.S.cpBiais[key]);\n      var suppr = neuf ? function () {} : function () { if (A.clearEdgeType) A.clearEdgeType(key); else A.S.edges[key] = 'straight'; if (A.S.cpBiais) delete A.S.cpBiais[key]; A.render(); };\n      var fini = function (x) { A.S.cpBiais = A.S.cpBiais || {}; A.S.cpBiais[key] = Math.max(1, Math.round(x)); (A.S.cpHorsDernier = A.S.cpHorsDernier || {})[b.k] = key; (A.S.cpCoupeMode = A.S.cpCoupeMode || {})[b.k] = f ? 'biais' : 'hors'; A.render(); };\n      if (f) {                                                        /* bout en biais : retrait sur l'avant (coin avant) ou sur l'arri\u00E8re (coin arri\u00E8re) */\n        var mn = COTE.oblique.min, mx = COTE.oblique.max, bord = b.ax === 'v' ? h : w;\n        if (bord > 0) mx = Math.max(mn, Math.min(mx, Math.floor(bord - 30)));   /* bord de la pi\u00E8ce */\n        fenetreCote(A, { titre: cap(b.nom), tag: 'Bord en biais \u00B7 +' + eurs(PRIX_BOUT.oblique) + '\u20AC',\n          piece: 'Retrait ' + (sens > 0 ? 'sur l\\'avant' : 'sur l\\'arri\u00E8re') + ' \u00B7 livr\u00E9 fini \u00B7 profondeur ' + fmtMm(P) + ' mm',\n          champs: [{ id: 'cp-coin-v', label: 'Retrait', unite: 'mm', min: mn, max: mx, val: Math.max(mn, Math.min(mx, Math.round(cur || COTE.oblique.def))), pas: 1 }],\n          schema: function (v) { return figCoupe(P, Math.round(v[0]), a(Math.round(v[0])), key, b.ax, sens); },\n          ok: function (v) { fini(v[0]); }, suppr: suppr, pres: pres, retour: opt && opt.retour });\n        return;\n      }\n      /* hors \u00E9querre : l'angle de la plage de ce coin (avant 85 \u00E0 89\u00B0, arri\u00E8re 91 \u00E0 95\u00B0), la coupe reste \u00E0 ce coin */\n      var aMin = sens > 0 ? COTE.hors.min : 91, aMax = sens > 0 ? 89 : COTE.hors.max;\n      var a0 = cur ? a(cur) : (sens > 0 ? COTE.hors.def : 180 - COTE.hors.def);\n      fenetreCote(A, { titre: cap(b.nom), tag: 'Hors \u00E9querre \u00B7 +' + eurs(PRIX_BOUT.hors) + '\u20AC',\n        piece: 'Brut, contre le mur \u00B7 coupe ' + (sens > 0 ? 'depuis l\\'avant' : 'depuis l\\'arri\u00E8re') + ' \u00B7 profondeur ' + fmtMm(P) + ' mm',\n        champs: [{ id: 'cp-coin-v', label: 'Angle', unite: '\u00B0', min: aMin, max: aMax, val: Math.max(aMin, Math.min(aMax, a0)), pas: 0.5 }],\n        schema: function (v) { return figCoupe(P, retraitHors(P, v[0]), v[0], key, b.ax, sens); },\n        ok: function (v) {\n          if (!neuf) { fini(Math.abs(retraitHors(P, v[0]))); return; }\n          var err = poseAngle(A, key, v[0]); if (err) toastBout(err);   /* D10 v2 : pos\u00E9 ici, comme le carr\u00E9 vert */\n        }, suppr: suppr, pres: pres, retour: opt && opt.retour });\n      return;\n    }\n    var co = COTE.arrondi, lim2 = Math.floor(Math.min(w || Infinity, h || Infinity, P) / 2);   /* moiti\u00E9 de la plus petite cote */\n    var max = Math.max(co.min, Math.min(co.max, isFinite(lim2) && lim2 > 0 ? lim2 : co.max)), v0 = Math.max(co.min, Math.min(max, num(A.S.roundRadius) || co.def));\n    fenetreCote(A, { titre: cap(b.nom), tag: 'Coin arrondi \u00B7 +' + eurs(PRIX_BOUT.arrondi) + '\u20AC', piece: (sens === -1 ? 'Coin arri\u00E8re' : 'Coin avant') + ' \u00B7 profondeur ' + fmtMm(P) + ' mm',\n      champs: [{ id: 'cp-coin-v', label: 'Rayon', unite: 'mm', min: co.min, max: max, val: v0, pas: 1 }],\n      schema: function (v) { return figArrondi(P, Math.round(v[0]), key); },\n      ok: function (v) { A.S.roundRadius = Math.round(v[0]); A.render(); },\n      suppr: function () { if (A.clearEdgeType) A.clearEdgeType(key); else A.S.edges[key] = 'straight'; A.render(); } });\n  }\n  /* A-294 : \u00AB Coin arrondi \u00BB ou \u00AB Demi-rond \u00BB au coin arri\u00E8re, qui ferait passer le plan (ou le retour du G) en fini sur 4\n     c\u00F4t\u00E9s avec une coupe de bout pos\u00E9e : refus\u00E9 avant le moteur (capture sur window), menu ferm\u00E9, la coupe nomm\u00E9e */\n  /* le refus et le m\u00E9nage d'un choix de coin, en fonctions : le clic dans le menu les appelle, et la simulation du lot\n     \u00AB annonces \u00BB (cp-annonces.js) aussi, pour annoncer l'\u00E9cart r\u00E9el de chaque option (A-304) */\n  /* A-316 (AUDIT Tour 576) : profondeurs vendues au m\u00E8tre lin\u00E9aire, de la r\u00E8gle (la plus petite tranche, jusqu'au seuil de\n     l'\u00EElot) ; toute autre profondeur est finie sur ses c\u00F4t\u00E9s, au m\u00B2. null : pas d'\u00EElot pour cette forme (pas de note) */\n  window.CP_plageMl = function (A) {\n    if (!A || !A.S) return null;\n    lireRegle(A);\n    /* A-430 (AUDIT Tour 1221) : le G aussi, en plans joints avec un prix d'\u00EElot (chaque partie au-del\u00E0 seule au m\u00B2, A-313) :\n       m\u00EAme note et m\u00EAmes libell\u00E9s qu'en L et en U */\n    var g = A.S.layout === 'g-shape' && enOption(A) && ilotM2(A) != null;\n    return ILOT_ON && (ILOT_FORMES[A.S.layout] || g) ? { lo: P_MIN, hi: ILOT_MIN - 1 } : null;\n  };\n  window.CP_coinRefus = function (A, c, t) {\n    if ((t !== 'round1' && t !== 'semi') || !A || !A.S || !A.__cpPierreWrapped || !modeU(A)) return null;\n    return refusRond(A, c, t) || null;\n  };\n  /* R148-b2 (COMMERCIAL Tour 213) : le menu du coin dit pourquoi, sans prix : \u00AB Coin arrondi : retirez d'abord le bord en biais \u00BB */\n  window.CP_coinRefusMenu = function (A, c, t) {\n    if (!window.CP_coinRefus(A, c, t)) return null;\n    var r = refusRondListe(A, c); return r ? 'retirez d\\'abord ' + dirCoupes(r.l, true) : null;\n  };\n  window.addEventListener('click', function (e) {\n    var x = e.target && e.target.closest && e.target.closest('#edge-menu .em-opt[data-type=\"round1\"], #edge-menu .em-opt[data-type=\"semi\"]'); if (!x) return;\n    var A = getApp(), msg = A && window.CP_coinRefus(A, A.menuTarget, x.getAttribute('data-type')); if (!msg) return;\n    e.preventDefault(); e.stopPropagation(); if (e.stopImmediatePropagation) e.stopImmediatePropagation();\n    if (A.closeMenu) A.closeMenu();\n    toastBout(msg);\n  }, true);\n  /* \u2500\u2500 D10 (Romain 06/10 20:10, \u00AB pour le hors d'\u00E9querre mettez un input au niveau des axes sur les angles dans l'espace\n     libre \u00BB) : \u00E0 chaque coin de bout, hors du plan, pr\u00E8s des axes de cote, une saisie d'angle comme les cotes orange, 90 par\n     d\u00E9faut. Elle pose le hors \u00E9querre de ce coin exactement comme le carr\u00E9 vert (type \u00AB biais \u00BB du moteur, mode \u00AB hors \u00BB,\n     retrait tir\u00E9 de l'angle) : m\u00EAme prix, m\u00EAme ligne, m\u00EAme dessin ; bornes 85 \u00E0 89\u00B0 au coin avant, 91 \u00E0 95\u00B0 au coin arri\u00E8re ;\n     90 remet le coin droit. Le carr\u00E9 vert et la saisie se suivent (la saisie relit l'\u00E9tat \u00E0 chaque rendu). Plan fini sur 4\n     c\u00F4t\u00E9s (A-294) : refus avec une bulle.\n     D10 v2 (Romain 06/10 20:57, \u00AB on r\u00E8gle la pop up hors d'\u00E9querre en cliquant sur \u00E7a \u00BB) : le badge est un bouton, sans\n     saisie. Clic, toucher, Entr\u00E9e ou Espace : la fen\u00EAtre du hors \u00E9querre de ce coin (celle du carr\u00E9 vert : figure, \u2212 / +,\n     Supprimer, Appliquer), rien de pos\u00E9 avant \u00AB Appliquer \u00BB ; \u2715 ou \u00C9chap : rien ne change. Coin d\u00E9j\u00E0 coup\u00E9 : la fen\u00EAtre du\n     type en place, \u00AB Supprimer \u00BB remet 90\u00B0. Plan fini sur 4 c\u00F4t\u00E9s : la bulle de refus au lieu de la fen\u00EAtre. \u2500\u2500 */\n  function coinBrut(A, c) {                                            /* bout (liste du tarif) et sens du coin c, m\u00EAme hors des bouts libres */\n    var r = null; if (!c || !BOUTS_ON) return r;\n    (boutsDe(A) || []).concat(boutsF4(A)).forEach(function (b) {      /* A-299 cas 2 et 3 : bouts des pi\u00E8ces finies sur 4 c\u00F4t\u00E9s compris */\n      if (!r && coinDe(A, b.k) === c) r = { b: b, sens: 1 }; else if (!r && coinArr(A, b.k) === c) r = { b: b, sens: -1 };\n    });\n    return r;\n  }\n  function refusAngle(A, rb) {                                          /* pourquoi pas de coupe \u00E0 ce bout (plan, ou pi\u00E8ce de L, U ou G finie sur 4 c\u00F4t\u00E9s) */\n    var S = A.S, p = PIECES_F4[S.layout] && rb && rb.b ? pieceDuBout(A, rb.b.k) : null;\n    if (p && fini4(A, p)) {                                                         /* le retour du G : m\u00EAmes textes qu'avant (L, lot \u00AB messages 1 \u00BB) */\n      var n = nomF4(A, p), pc = parCoin(A, p), jc = pc && pc.coin && coinsJn(A)[pc.coin];\n      return (femF4(n) ? 'Une ' : 'Un ') + n + ' ' + finiF4(n) + ' sur 4 c\u00F4t\u00E9s ne se coupe ni en biais ni hors \u00E9querre : ' + (pc ? 'retirez d\\'abord le coin arrondi ' + (jc ? 'au ' + nomJn(A, pc.coin) : 'au coin arri\u00E8re ' + duF4(n)) + '.'\n        : 'd\u00E9cochez d\\'abord le chant arri\u00E8re ' + duF4(n) + '.');\n    }\n    if (S.cpArrParCoin) return 'Un plan fini sur 4 c\u00F4t\u00E9s ne se coupe ni en biais ni hors \u00E9querre : retirez d\\'abord le coin arrondi au coin arri\u00E8re.';\n    if (S.layout === 'linear' && arriereChoix(A) && S.cpArriere === true) return 'Un plan fini sur 4 c\u00F4t\u00E9s ne se coupe ni en biais ni hors \u00E9querre : d\u00E9cochez d\\'abord le chant arri\u00E8re.';\n    return '\u00C0 cette profondeur, le plan est fini sur 4 c\u00F4t\u00E9s : il ne se coupe ni en biais ni hors \u00E9querre.';\n  }\n  function poseAngle(A, c, brut) {\n    var S = A.S, rb = coinBrut(A, c); if (!rb) return 'Pas de hors \u00E9querre \u00E0 ce coin.';\n    var a = Number(String(brut).replace(',', '.').replace('\u00B0', '').trim()); if (!isFinite(a)) return 'Angle : un nombre, en degr\u00E9s (90 = d\\'\u00E9querre).';\n    a = Math.round(a * 10) / 10;\n    var hb = boutDeCoin(A, c), E = S.edges = S.edges || {}, B = S.cpBiais = S.cpBiais || {};\n    if (a === 90) {                                                      /* droit : retire la coupe de ce coin (comme \u00AB Droit \u00BB au carr\u00E9 vert) */\n      if (E[c] === 'biais') { E[c] = 'straight'; delete B[c]; A.render(); }\n      return null;\n    }\n    if (!hb) return refusAngle(A, rb);\n    var mn = hb.sens > 0 ? COTE.hors.min : 91, mx = hb.sens > 0 ? 89 : COTE.hors.max;\n    if (!(PRIX_BOUT.hors > 0)) return 'Hors \u00E9querre non propos\u00E9 pour cette mati\u00E8re.';\n    if (a < mn || a > mx) return 'Angle du ' + (hb.sens > 0 ? 'coin avant' : 'coin arri\u00E8re') + ' : de ' + fmtDeg(mn) + ' \u00E0 ' + fmtDeg(mx) + '\u00B0 (90 = d\\'\u00E9querre).';\n    var b = hb.b, P = profBout(A, b), u = modeU(A);\n    [coinDe(A, b.k), coinArr(A, b.k)].forEach(function (k) {           /* un seul par bout ; la coupe prend tout le bout (comme le carr\u00E9 vert) */\n      if (!k || k === c) return;\n      if (E[k] === 'biais') { E[k] = 'straight'; delete B[k]; }\n      if (E[k] === 'round1' && u) E[k] = 'straight';\n    });\n    E[c] = 'biais'; (S.cpCoupeMode = S.cpCoupeMode || {})[b.k] = 'hors'; (S.cpHorsDernier = S.cpHorsDernier || {})[b.k] = c;\n    B[c] = Math.max(1, Math.abs(retraitHors(P, a)));\n    A.render();\n    return null;\n  }\n  var ANGLES_CSS = '#dims .cp-angle-coin{position:absolute;z-index:1002;pointer-events:auto!important;cursor:pointer;transform:translate(-50%,-50%);display:flex;align-items:center;justify-content:center;' +   /* #dims laisse passer les clics : le badge les reprend */\n    'box-sizing:border-box;min-width:42px;min-height:24px;margin:0;background:#fff7ec;border:1.5px solid #e8a33d;border-radius:5px;padding:2px 6px;font:700 12px/16px system-ui,sans-serif;color:#7a4a0c;white-space:nowrap;-webkit-appearance:none;appearance:none}' +\n    '#dims .cp-angle-coin:hover{background:#fde7c7}' +\n    '#dims .cp-angle-coin:focus-visible{outline:none;box-shadow:0 0 0 2px #1a5c3a}' +\n    '#dims .cp-angle-coin.is-coupe{background:#e8a33d;color:#fff}#dims .cp-angle-coin.is-coupe:hover{background:#d48f2a}';\n  /* ce qu'un badge ne doit pas couvrir, par poids : cote \u00E0 saisir (orange) et case de chant, qu'on touche, 30 comme un autre\n     badge, cote calcul\u00E9e (grise) et tout chiffre du dessin, qu'on doit pouvoir lire (AUDIT Tour 586), 30 aussi, et carr\u00E9\n     vert ; autre texte du dessin hors angles int\u00E9rieurs, 10 ; trait de cote (piste orange ou bordure qui fait le trait d'une\n     cote calcul\u00E9e), 1 au plus. Quand la place manque (G en 375), un badge croise un trait plut\u00F4t que de couvrir une cote, une\n     case ou un autre badge. sansBiais : sans la cote du biais (placeBiais lui cherche sa place) */\n  /* C1 (lot t\u00E9l\u00E9phone) : ce qu'on lit (cote grise, chiffre, texte, trait, pi\u00E8ce : vu) n'est cach\u00E9 que par la pastille visible\n     du badge ; ce qu'on touche (case, cote \u00E0 saisir, carr\u00E9 vert, autre badge) ne doit pas \u00EAtre couvert par sa bo\u00EEte propre */\n  /* C1, choix A d'AUDIT (Tour 684) : la BO\u00CETE d'une cible (case, cote \u00E0 saisir, bouton d'un carr\u00E9 vert : cible) ne doit pas \u00EAtre\n     touch\u00E9e par la bo\u00EEte d'un badge tant qu'une place le permet (nb, compt\u00E9 apr\u00E8s la pierre) ; sa partie VISIBLE (pastille de la\n     cote, carr\u00E9 de la case, carr\u00E9 vert : vu) jamais, comme un texte ou la pastille d'un autre badge (nd) */\n  function obstaclesDessin(A, sansBiais) {\n    var r = [], vu = false, boite = function (q, p, dur, m, cible) { m = m || 0; r.push({ left: q.left - m, right: q.right + m, top: q.top - m, bottom: q.bottom + m, poids: p, dur: !!dur, vu: vu, cible: !!cible }); };\n    var prend = function (el, p, dur, m, cible) { var q = el.getBoundingClientRect(); if (q.width > 0 && q.height > 0 && q.width < 220 && q.height < 220) boite(q, p || 10, dur, m, cible); };\n    var vus = [];\n    /* cibles du doigt : leur bo\u00EEte ; une \u00E9tiquette de cote garde 1 px de plus autour d'elle (elle monte de 1 px au survol) */\n    Array.prototype.forEach.call(A.dims.querySelectorAll('.edge-checkbox-container, [data-cp-a11y=\"dim\"], .dim span, .dim button, .dim-label, .dim .label'), function (el) { vus.push(el); if (getComputedStyle(el).display !== 'none') prend(el, 30, true, el.matches('.edge-checkbox-container') ? 0 : 1, true); });\n    vu = true;                                                          /* la suite se lit : la pastille seule compte */\n    /* parties visibles des cibles : la pastille d'une cote (le .label, autour de la bo\u00EEte agrandie de son span) et le carr\u00E9 d'une\n       case (::before de .edge-checkbox-visual, en retrait dans sa bo\u00EEte de 44 px au doigt) */\n    Array.prototype.forEach.call(A.dims.querySelectorAll('.dim-label, .dim .label'), function (el) { if (getComputedStyle(el).display !== 'none') prend(el, 30, true, 1); });\n    var doigt = !!(window.matchMedia && window.matchMedia('(pointer: coarse)').matches);   /* \u00E0 la souris, la case visible est toute sa bo\u00EEte */\n    Array.prototype.forEach.call(A.dims.querySelectorAll('.edge-checkbox-visual:not(.disabled)'), function (el) { var q = doigt ? partVue(el.getBoundingClientRect(), retraitVu(el)) : el.getBoundingClientRect(); if (q.right > q.left && q.bottom > q.top && getComputedStyle(el).display !== 'none') boite(q, 30, true); });\n    Array.prototype.forEach.call(A.dims.querySelectorAll('.dim .subdivision-label'), function (el) {   /* cotes calcul\u00E9es (grises) : interdites aussi (AUDIT Tour 586 : \u00AB 2400 \u00BB illisible en G 375) */\n      vus.push(el); var q = el.getBoundingClientRect(); if (q.width > 0 && q.height > 0 && getComputedStyle(el).display !== 'none') boite(q, 30, true);\n    });\n    Array.prototype.forEach.call(A.dims.querySelectorAll('*'), function (el) {   /* toute autre feuille chiffr\u00E9e du calque des cotes est une cote : interdite (recette d'AUDIT) */\n      if (el.children.length || vus.indexOf(el) >= 0 || !/\\d/.test(el.textContent || '') || el.closest('.cp-angle-coin, .cp-angle-int, .edge-checkbox-visual') || vus.some(function (v) { return v.contains(el); })) return;\n      var q = el.getBoundingClientRect(), cs = getComputedStyle(el); if (q.width > 0 && q.height > 0 && cs.display !== 'none' && cs.visibility !== 'hidden') boite(q, 30, true);\n    });\n    Array.prototype.forEach.call(A.dims.querySelectorAll('.dim .track-std, .dim .dim-subdivisions, .dim .subdivision-marker'), function (el) {\n      var q = el.getBoundingClientRect(), cs = getComputedStyle(el), bt = parseFloat(cs.borderTopWidth) || 0, bl = parseFloat(cs.borderLeftWidth) || 0;\n      if (cs.display === 'none' || (!q.width && !q.height)) return;\n      if (bt) boite({ left: q.left, right: q.right, top: q.top, bottom: q.top + bt }, 1);\n      if (bl) boite({ left: q.left, right: q.left + bl, top: q.top, bottom: q.bottom }, 1);\n      if (!bt && !bl) boite(q, 1);\n    });\n    Array.prototype.forEach.call(A.svg.querySelectorAll('text'), function (t) { var x = (t.textContent || '').trim(); if (!t.closest('.inner-angle-overlay') && x && !(sansBiais && t.classList.contains('cp-pierre-biais'))) prend(t, /\\d/.test(x) ? 30 : 10, /\\d/.test(x)); });   /* texte chiffr\u00E9 du dessin : une cote, interdite */\n    Array.prototype.forEach.call(A.svg.querySelectorAll('rect.hit'), function (h) { var q = h.getBoundingClientRect(); if (q.width > 0 && q.height > 0) boite(q, 30, true); });   /* carr\u00E9s verts des coins : partie visible de leur bouton (STYLE C1) */\n    vu = false;\n    /* au doigt, la bo\u00EEte propre du bouton de chaque carr\u00E9 vert (cp-a11y, 44 px avec P6) : une cible ; \u00E0 la souris, le badge passe\n       devant ce bouton transparent et le pointeur est exact : rien de plus (page de 1440 inchang\u00E9e) */\n    if (window.matchMedia && window.matchMedia('(pointer: coarse)').matches) Array.prototype.forEach.call(A.dims.querySelectorAll('.cp-a11y-btn[data-cp-kind=\"hit\"]'), function (b) { prend(b, 30, true, 0, true); });\n    return r;\n  }\n  /* C1 : retraits de la pastille visible d'un badge dans sa bo\u00EEte (P5 : bo\u00EEte de 44 px, pastille en ::before) ; nuls sans P5,\n     la pastille est alors la bo\u00EEte. partVue : la pastille d'une bo\u00EEte pos\u00E9e */\n  var SANS_RETRAIT = { t: 0, r: 0, b: 0, l: 0 };\n  function retraitVu(w) {\n    var cs = getComputedStyle(w, '::before'); if (cs.content === 'none' || cs.position !== 'absolute') return SANS_RETRAIT;\n    var t = parseFloat(cs.top) || 0, r = parseFloat(cs.right) || 0, b = parseFloat(cs.bottom) || 0, l = parseFloat(cs.left) || 0;\n    return t >= 0 && r >= 0 && b >= 0 && l >= 0 && l + r < w.offsetWidth && t + b < w.offsetHeight ? { t: t, r: r, b: b, l: l } : SANS_RETRAIT;\n  }\n  function partVue(a, iv) { return iv && (iv.t || iv.r || iv.b || iv.l) ? { left: a.left + iv.l, right: a.right - iv.r, top: a.top + iv.t, bottom: a.bottom - iv.b } : a; }\n  function couvre(a, q) { return !(a.right <= q.left || a.left >= q.right || a.bottom <= q.top || a.top >= q.bottom); }\n  function cout(a0, obs, kTrait, av) {                                  /* un trait (poids 1) compte selon la part du badge qu'il traverse, \u00D7 kTrait ; av : sa pastille (C1) */\n    return obs.reduce(function (s, q) {\n      var a = q.vu && av ? av : a0;\n      if (!couvre(a, q)) return s;\n      if (q.poids !== 1) return s + (q.poids || 10);\n      var fx = (Math.min(a.right, q.right) - Math.max(a.left, q.left)) / (a.right - a.left), fy = (Math.min(a.bottom, q.bottom) - Math.max(a.top, q.top)) / (a.bottom - a.top);\n      return s + Math.max(fx, fy) * (kTrait == null ? 1 : kTrait);\n    }, 0);\n  }\n  function rectDe(el, poids) { var q = el.getBoundingClientRect(); return { left: q.left, right: q.right, top: q.top, bottom: q.bottom, poids: poids }; }\n  /* C1, retouche (STYLE Tour 48, AUDIT Tour 680) : un badge est l'obstacle d'un autre badge par sa pastille visible, compar\u00E9e \u00E0 la\n     pastille de l'autre (vu) : au doigt, les bo\u00EEtes de 44 px de deux badges peuvent se toucher, leurs pastilles jamais ; la bo\u00EEte\n     reste interdite sur les cibles (cases, cotes \u00E0 saisir, carr\u00E9s verts). Sans P5, la pastille est la bo\u00EEte, comme avant */\n  function pastilleDe(w) { var q = partVue(rectDe(w, 30), retraitVu(w)); q.poids = 30; q.vu = true; return q; }\n  /* badges int\u00E9rieurs pos\u00E9s : obstacles durs des badges de coin */\n  function intsPoses(A) {\n    return Array.prototype.filter.call(A.dims.querySelectorAll('.cp-angle-int'), function (w) { return w.style.display !== 'none' && w.getBoundingClientRect().width > 0; })\n      .map(function (w) { var q = pastilleDe(w); q.dur = true; return q; });\n  }\n  /* pi\u00E8ces du plan (texture de cp-trace) ; surPlan : combien des 9 points d'une bo\u00EEte (coins, milieux, centre) sont sur une pi\u00E8ce,\n     mesur\u00E9 sur la forme r\u00E9elle (pi\u00E8ces tourn\u00E9es comprises), pas sur sa bo\u00EEte englobante */\n  /* une pi\u00E8ce = sa forme et, si cp-trace la d\u00E9coupe (G et U aux angles \u2260 90\u00B0 : <g clip-path>), les formes de la d\u00E9coupe : un\n     point n'est sur la pi\u00E8ce que s'il est dans les deux (la partie d\u00E9coup\u00E9e est invisible) ; matrices calcul\u00E9es une fois */\n  /* le contour de la pi\u00E8ce (polygone de cp-trace-clip-N) est mis en coordonn\u00E9es d'\u00E9cran une fois : un point y est test\u00E9 par le\n     calcul, sans le navigateur (placeAnglesInt en teste des milliers par passe) ; les d\u00E9coupes des usinages (arrondi, encoche)\n     restent test\u00E9es par le navigateur, pour les seuls points du contour. Un point est sur la pi\u00E8ce s'il est dans chaque\n     d\u00E9coupe embo\u00EEt\u00E9e (dans l'une des formes de chacune). Toute pi\u00E8ce de cp-trace compte, quel que soit son remplissage\n     (motif du d\u00E9cor, aplat, image). */\n  function piecesPlan(A) {\n    var r = [];\n    Array.prototype.forEach.call(A.svg.querySelectorAll('.cp-trace g[data-piece]'), function (g) {\n      var e = Array.prototype.filter.call(g.querySelectorAll('rect, image, path, polygon'), function (x) { return !x.closest('pattern, clipPath, defs, mask'); }).pop();\n      var M = e && e.getScreenCTM && e.getScreenCTM(); if (!M) return;\n      var p = { e: e, Mi: M.inverse(), groupes: [], poly: null, bb: null };\n      for (var n = e.parentNode; n && n !== A.svg; n = n.parentNode) {\n        var m = /url\\(\\s*[\"']?#([^\"')]+)[\"']?\\s*\\)/.exec((n.getAttribute && n.getAttribute('clip-path')) || ''), cp = m && document.getElementById(m[1]), N = cp && n.getScreenCTM && n.getScreenCTM();\n        if (!cp || !N) continue;\n        var formes = Array.prototype.filter.call(cp.querySelectorAll('rect, path, polygon, circle, ellipse'), function (c) { return typeof c.isPointInFill === 'function'; });\n        var tcs = formes.map(function (c) { var tc = c.transform && c.transform.baseVal && c.transform.baseVal.consolidate(); return tc ? N.multiply(tc.matrix) : N; });   /* la d\u00E9coupe est dans le rep\u00E8re du groupe d\u00E9coup\u00E9 */\n        if (!p.poly && /^cp-trace-clip-/.test(m[1]) && formes.length === 1 && formes[0].tagName.toLowerCase() === 'polygon' && formes[0].points && formes[0].points.numberOfItems > 2) {\n          var T = tcs[0], pts = [];\n          for (var i = 0; i < formes[0].points.numberOfItems; i++) { var q = formes[0].points.getItem(i); pts.push([T.a * q.x + T.c * q.y + T.e, T.b * q.x + T.d * q.y + T.f]); }\n          p.poly = pts;\n          p.bb = [Math.min.apply(null, pts.map(function (q) { return q[0]; })), Math.min.apply(null, pts.map(function (q) { return q[1]; })),\n            Math.max.apply(null, pts.map(function (q) { return q[0]; })), Math.max.apply(null, pts.map(function (q) { return q[1]; }))];\n          continue;\n        }\n        p.groupes.push(formes.map(function (c, i) { return { c: c, Mi: tcs[i].inverse() }; }));\n      }\n      if (p.poly || typeof e.isPointInFill === 'function') r.push(p);\n    });\n    /* A-345 : la pi\u00E8ce d'angle, peinte par ce module (dessin) hors de cp-trace, est une pi\u00E8ce comme les autres : aucun badge\n       dessus (r\u00E8gle de D12) */\n    Array.prototype.forEach.call(A.svg.querySelectorAll('.cp-pierre-dessin polygon'), function (e) {\n      var M = e.getScreenCTM && e.getScreenCTM(); if (!M || !e.points || e.points.numberOfItems < 3) return;\n      var pts = [];\n      for (var i = 0; i < e.points.numberOfItems; i++) { var q = e.points.getItem(i); pts.push([M.a * q.x + M.c * q.y + M.e, M.b * q.x + M.d * q.y + M.f]); }\n      r.push({ e: e, Mi: M.inverse(), groupes: [], poly: pts, bb: [Math.min.apply(null, pts.map(function (q) { return q[0]; })), Math.min.apply(null, pts.map(function (q) { return q[1]; })),\n        Math.max.apply(null, pts.map(function (q) { return q[0]; })), Math.max.apply(null, pts.map(function (q) { return q[1]; }))] });\n    });\n    return r;\n  }\n  /* A-345 : milieu du biais de la pi\u00E8ce d'angle du coin k, \u00E0 l'\u00E9cran ; null sans pi\u00E8ce d'angle \u00E0 ce coin. L'angle int\u00E9rieur du\n     L n'existe plus : son badge part de l\u00E0, vers la pi\u00E8ce vide, hors de la pi\u00E8ce */\n  function biaisEcran(A, k) {\n    var gc = typeof window.CP_piecesCommande === 'function' ? window.CP_piecesCommande(A) : null, p = gc && gc.pieces.filter(function (x) { return x.coin === k; })[0];\n    var bs = (A._cpPieces || []).filter(function (b) { return isFinite(b.x) && isFinite(b.y); }), M = A.svg && A.svg.getScreenCTM && A.svg.getScreenCTM();\n    if (!p || !bs.length || !M) return null;\n    var s = A.svg.createSVGPoint();\n    s.x = (p.pts[2][0] + p.pts[3][0]) / 2 + Math.min.apply(null, bs.map(function (b) { return num(b.x); }));\n    s.y = (p.pts[2][1] + p.pts[3][1]) / 2 + Math.min.apply(null, bs.map(function (b) { return num(b.y); }));\n    return s.matrixTransform(M);\n  }\n  function dansPoly(pts, x, y) {\n    var dedans = false;\n    for (var i = 0, j = pts.length - 1; i < pts.length; j = i++) {\n      var a = pts[i], b = pts[j];\n      if ((a[1] > y) !== (b[1] > y) && x < (b[0] - a[0]) * (y - a[1]) / (b[1] - a[1]) + a[0]) dedans = !dedans;\n    }\n    return dedans;\n  }\n  function dansPiece(A, pcs, x, y) {\n    var s = null, pt = function (Mi) { if (!s) { s = A.svg.createSVGPoint(); s.x = x; s.y = y; } return s.matrixTransform(Mi); };\n    return pcs.some(function (p) {\n      if (p.poly) { if (x < p.bb[0] || x > p.bb[2] || y < p.bb[1] || y > p.bb[3] || !dansPoly(p.poly, x, y)) return false; }   /* le rectangle rempli est la bo\u00EEte du contour */\n      else if (!p.e.isPointInFill(pt(p.Mi))) return false;\n      return p.groupes.every(function (gr) { return !gr.length || gr.some(function (c) { return c.c.isPointInFill(pt(c.Mi)); }); });\n    });\n  }\n  function surPlan(A, pcs, a) {\n    var n = 0, xs = [a.left + 1, (a.left + a.right) / 2, a.right - 1], ys = [a.top + 1, (a.top + a.bottom) / 2, a.bottom - 1];\n    xs.forEach(function (x) { ys.forEach(function (y) { if (dansPiece(A, pcs, x, y)) n++; }); });\n    return n;\n  }\n  /* le chemin droit de \u00AB de \u00BB (sommet ou coin) \u00E0 la place p ne traverse aucune pi\u00E8ce : le badge reste du c\u00F4t\u00E9 de son angle\n     (en G \u00E0 375, le badge d'un angle int\u00E9rieur ne passe plus au-dessus du plan) */\n  function atteint(A, pcs, de, p) {\n    for (var t = 0.2; t <= 1.0001; t += 0.2) if (dansPiece(A, pcs, de[0] + (p[0] - de[0]) * t, de[1] + (p[1] - de[1]) * t)) return false;\n    return true;\n  }\n  /* place d'un badge quand la sienne est encombr\u00E9e (375 serr\u00E9) : grille de places autour de o.x, o.y (pas de 12 px, rayon\n     110, puis 170), dans le dessin, accept\u00E9es par o.garde, atteintes depuis o.de sans traverser de pi\u00E8ce. Ordre strict\n     (AUDIT Tours 586 et 592) : d'abord le moins d'obstacles \u00AB durs \u00BB couverts (autre badge, case, cote \u00E0 saisir ou calcul\u00E9e,\n     carr\u00E9 vert : nd), puis le moins de points sur une pi\u00E8ce du plan (sp, 9 points de la bo\u00EEte), puis le co\u00FBt (traits\n     crois\u00E9s, \u00E9loignement de o.ref, o.biais) ; o.pref d'abord \u00E0 \u00E9galit\u00E9. Sans place libre (G en 375, A-320), le badge mord\n     donc sur la pierre, contre son angle, plut\u00F4t que de cacher une cote. Un obstacle \u00AB mobile \u00BB (badge de coin, qui se\n     replace ensuite hors du plan : voir placeAnglesInt) ne compte qu'apr\u00E8s la pierre (nm). \u2192 { p, v, nd, sp, nm, dur } */\n  /* C1, choix A d'AUDIT (Tour 684) : nb, les bo\u00EEtes de cibles touch\u00E9es par la bo\u00EEte du badge, compte apr\u00E8s la pierre ; nd n'a plus\n     que ce qui se voit (pastille sur une pastille, un texte, une partie visible de cible) */\n  function mieux(a, b) {\n    if (!b) return true;\n    var ka = [a.nd, a.sp, a.nb || 0, a.nm || 0], kb = [b.nd, b.sp, b.nb || 0, b.nm || 0];\n    for (var i = 0; i < 4; i++) if (ka[i] !== kb[i]) return ka[i] < kb[i];\n    return a.v < b.v - 1e-9;\n  }\n  /* ce qu'une place couvre des obstacles o.obs (durs, mobiles) et son co\u00FBt ; gard\u00E9 dans memo (m\u00EAmes obstacles \u00E0 chaque ordre\n     de pose de placeAnglesInt, qui passe les badges d\u00E9j\u00E0 pos\u00E9s \u00E0 part, dans o.plus) */\n  function basePlace(o, memo, p, a) {\n    var cle = 'b' + Math.round(p[0] * 4) + ',' + Math.round(p[1] * 4);\n    if (!(cle in memo)) {\n      var nd = 0, nb = 0, nm = 0, av = partVue(a, o.iv);                /* o.iv : retraits de la pastille du badge (C1) */\n      o.obs.forEach(function (q) { if (q.cible) { if (couvre(a, q)) nb++; return; } if (couvre(q.vu ? av : a, q)) { if (q.dur) nd++; if (q.mob) nm++; } });\n      memo[cle] = { nd: nd, nb: nb, nm: nm, c: cout(a, o.obs, o.kTrait, av) + Math.sqrt(Math.pow(p[0] - o.ref[0], 2) + Math.pow(p[1] - o.ref[1], 2)) / 150 + (o.biais ? o.biais(p) : 0) };\n    }\n    return memo[cle];\n  }\n  function meilleurePlace(A, w, o) {\n    if (!o.iv) o.iv = retraitVu(w);\n    var bw = w.offsetWidth / 2 + 2, bh = w.offsetHeight / 2 + 2, hb = o.host, cands = [], memo = o.memo || {};\n    var ajoute = function (p) {\n      var a = { left: p[0] - bw, right: p[0] + bw, top: p[1] - bh, bottom: p[1] + bh };\n      if (a.left < hb.left || a.right > hb.right || a.top < hb.top || a.bottom > hb.bottom || (o.garde && !o.garde(p))) return;\n      var b = basePlace(o, memo, p, a), k = { p: p, a: a, nd: b.nd, nb: b.nb, nm: b.nm, c: b.c };\n      (o.plus || []).forEach(function (q) { var av = q.vu ? partVue(a, o.iv) : a; if (couvre(av, q)) { k.nd++; k.c += cout(av, [q], o.kTrait); } });   /* badges int\u00E9rieurs d\u00E9j\u00E0 pos\u00E9s : durs (pastille contre pastille) */\n      cands.push(k);\n    };\n    (o.pref || []).forEach(ajoute);\n    var grille = function (r0, r1) { for (var dx = -r1; dx <= r1; dx += 12) for (var dy = -r1; dy <= r1; dy += 12) { var d = dx * dx + dy * dy; if (d > r0 * r0 && d <= r1 * r1) ajoute([o.x + dx, o.y + dy]); } };\n    var range = function () { cands.sort(function (a, b) { return (a.nd - b.nd) || (a.nb - b.nb) || (a.c - b.c); }); };\n    /* les places dans l'ordre (nd, nb, co\u00FBt) ; le test des pi\u00E8ces (le plus cher) seulement tant qu'une place peut encore gagner :\n       une place vue plus tard co\u00FBte autant ou plus ; tests des pi\u00E8ces gard\u00E9s dans memo (m\u00EAmes places \u00E0 chaque ordre de pose) */\n    var at = function (p) { var c = 'a' + Math.round(p[0] * 4) + ',' + Math.round(p[1] * 4); if (!(c in memo)) memo[c] = atteint(A, o.pcs, o.de, p); return memo[c]; };\n    var spl = function (k) { var c = 's' + Math.round(k.p[0] * 4) + ',' + Math.round(k.p[1] * 4); if (!(c in memo)) memo[c] = surPlan(A, o.pcs, partVue(k.a, o.iv)); return memo[c]; };\n    var cherche = function () {\n      var bon = null;\n      for (var i = 0; i < cands.length; i++) {\n        var k = cands[i];\n        if (bon && (k.nd > bon.nd || (bon.sp === 0 && !bon.nb && !bon.nm))) break;\n        if (bon && bon.sp === 0 && (k.nb > bon.nb || (k.nb === bon.nb && k.nm >= bon.nm))) continue;   /* ne peut plus gagner (la pierre ne descend pas sous 0) */\n        if (o.de && !at(k.p)) continue;\n        var r = { p: k.p, v: k.c, nd: k.nd, nb: k.nb, nm: k.nm, sp: spl(k) };\n        if (mieux(r, bon)) bon = r;\n      }\n      if (bon) bon.dur = bon.nd > 0 || bon.sp > 0 || bon.nm > 0 || bon.nb > 0;\n      return bon;\n    };\n    grille(-1, 110); range();\n    var bon = cherche(); if (bon && !bon.dur) return bon;\n    grille(110, 170); range();                                          /* rien de libre \u00E0 110 px (G aux pi\u00E8ces tourn\u00E9es en 375) : plus loin */\n    bon = cherche(); if (!bon || !bon.dur) return bon;\n    /* affinage : la grille avance de 12 px ; \u00E0 petits pas autour de la meilleure place, celle qui ne couvre rien (4 px plus bas,\n       hors du plan du haut) */\n    for (var fx = -15; fx <= 15; fx += 3) for (var fy = -15; fy <= 15; fy += 3) if (fx || fy) ajoute([bon.p[0] + fx, bon.p[1] + fy]);\n    range();\n    return cherche();\n  }\n  function placeAngles(A, gene) {                                      /* gene : badges int\u00E9rieurs \u00E0 ne pas couvrir (voir placeAnglesInt) */\n    if (!A || !A.dims || !A.svg) return;\n    var host = A.dims.getBoundingClientRect();\n    Array.prototype.forEach.call(A.dims.querySelectorAll('.cp-angle-coin'), function (w) {\n      var h = A.svg.querySelector('rect.hit[data-cp-id=\"' + w.getAttribute('data-coin') + '\"]'); if (!h) { w.style.display = 'none'; return; }\n      var r = h.getBoundingClientRect(), p = posCoin(w.getAttribute('data-coin')), dx = p.r ? 1 : -1, dy = p.b ? 1 : -1;\n      w.style.display = '';                                              /* hors du plan, en diagonale du coin, \u00E9cart pris sur la taille r\u00E9elle du badge (STYLE C1) */\n      var x0 = p.r ? r.right : r.left, y0 = p.b ? r.bottom : r.top, cx = x0 + dx * (w.offsetWidth / 2 + 9), cy = y0 + dy * (w.offsetHeight / 2 + 6);\n      w.__cpCoin = { x: x0, y: y0, dx: dx, dy: dy };\n      w.style.left = (cx - host.left) + 'px'; w.style.top = (cy - host.top) + 'px';\n    });\n    var ws = Array.prototype.filter.call(A.dims.querySelectorAll('.cp-angle-coin'), function (w) { return w.style.display !== 'none'; });\n    for (var n = 0; n < 4; n++) ws.forEach(function (a, i) {             /* deux coins voisins (G en 375) : on \u00E9carte les badges, chacun reste du c\u00F4t\u00E9 de son coin */\n      ws.slice(i + 1).forEach(function (b) {\n        var ax = parseFloat(a.style.left), bx = parseFloat(b.style.left), ay = parseFloat(a.style.top), by = parseFloat(b.style.top);\n        var gx = (a.offsetWidth + b.offsetWidth) / 2 + 4 - Math.abs(ax - bx), gy = (a.offsetHeight + b.offsetHeight) / 2 - Math.abs(ay - by);\n        if (gx <= 0 || gy <= 0) return;\n        var s = ax <= bx ? 1 : -1; a.style.left = (ax - s * gx / 2) + 'px'; b.style.left = (bx + s * gx / 2) + 'px';\n      });\n    });\n    /* A-301 : un badge pos\u00E9 sur une \u00E9tiquette de cote (L2 en 375), une case ou un autre badge va \u00E0 la place la moins encombr\u00E9e\n       pr\u00E8s de son coin, jamais sur le plan ni hors du dessin ; un trait de cote crois\u00E9 ne compte que pour 0,3 (le badge ne\n       quitte pas son coin pour un trait) */\n    var obs = obstaclesDessin(A).concat(gene || []), pcs = piecesPlan(A);\n    ws.forEach(function (w) {\n      if (!w.__cpCoin) return;\n      var x = parseFloat(w.style.left) + host.left, y = parseFloat(w.style.top) + host.top, q = rectDe(w), iv = retraitVu(w), qv = partVue(q, iv);\n      var o = obs.concat(ws.filter(function (v) { return v !== w; }).map(function (v) { var r = pastilleDe(v); r.dur = true; return r; }));\n      if (!cout(q, o, 0.3, qv) && !surPlan(A, pcs, qv)) return;\n      var bon = meilleurePlace(A, w, { x: x, y: y, ref: [x, y], obs: o, pcs: pcs, host: host, kTrait: 0.3, pref: [[x, y]], de: [w.__cpCoin.x, w.__cpCoin.y], iv: iv });\n      if (bon) { w.style.left = (bon.p[0] - host.left) + 'px'; w.style.top = (bon.p[1] - host.top) + 'px'; }\n    });\n  }\n  function anglesCoins(A) {\n    if (!A || !A.dims || !A.svg) return;\n    Array.prototype.forEach.call(A.dims.querySelectorAll('.cp-angle-coin'), function (w) { w.remove(); });\n    if (window.CP_enSimulation && window.CP_enSimulation()) return;    /* rendu de simulation (cp-annonces) : le vrai rendu qui suit les pose */\n    var et = etat(A);                                                   /* \u00AB sur devis \u00BB : pas de badge ; \u00AB non commandable \u00BB (G de 3 010 mm apr\u00E8s un usinage) : les\n                                                                            badges restent, pour d\u00E9faire ce qui a \u00E9t\u00E9 pos\u00E9 (UX, AUDIT Tour 574) */\n    if (!BOUTS_ON || !(PRIX_BOUT.hors > 0) || (et && et.mode === 'devis')) return;\n    if (!document.getElementById('cp-angles-css')) { var st = document.createElement('style'); st.id = 'cp-angles-css'; st.textContent = ANGLES_CSS; document.head.appendChild(st); }\n    var E = A.S.edges || {}, vus = {};\n    (boutsDe(A) || []).concat(boutsF4(A)).forEach(function (b) {      /* A-299 cas 2 et 3 : bouts des pi\u00E8ces finies sur 4 c\u00F4t\u00E9s compris */\n      [[coinDe(A, b.k), 1], [coinArr(A, b.k), -1]].forEach(function (x) {\n        var c = x[0]; if (!c || vus[c] || !A.svg.querySelector('rect.hit[data-cp-id=\"' + c + '\"]')) return; vus[c] = 1;\n        var hb = boutDeCoin(A, c), coupe = E[c] === 'biais' && hb && hb.b.c === 'hors' ? hb.b : null, val = coupe ? fmtDeg(coupe.a) : '90';\n        var w = document.createElement('button'); w.type = 'button'; w.className = 'cp-angle-coin' + (coupe ? ' is-coupe' : ''); w.setAttribute('data-coin', c);\n        var lieu = (x[1] > 0 ? 'coin avant' : 'coin arri\u00E8re') + ' du ' + b.nom;\n        var t = (coupe ? (coupe.f ? 'Bord en biais' : 'Hors \u00E9querre') + ' au ' + lieu + ' : ' + val + '\u00B0' + (coupe.f ? ', retrait ' + fmtMm(Math.abs(coupe.x)) + ' mm' : '') + '. Modifier ou supprimer'\n          : cap(lieu) + ' d\\'\u00E9querre (90\u00B0).' + (hb ? ' Hors \u00E9querre : ' + (x[1] > 0 ? COTE.hors.min + ' \u00E0 89\u00B0' : '91 \u00E0 ' + COTE.hors.max + '\u00B0') : ''));   /* L72 : bornes de la r\u00E8gle ; plan ou retour fini sur tous ses c\u00F4t\u00E9s (pas de bout libre, la bulle de refus) : la 1re phrase seule */\n        w.textContent = val + '\u00B0'; w.title = t; w.setAttribute('aria-label', t); w.setAttribute('aria-haspopup', 'dialog');\n        if (!hb) w.setAttribute('aria-disabled', 'true');                /* A-315 : aspect d'une case impos\u00E9e ; le clic reste, il dit pourquoi */\n        A.dims.appendChild(w);\n        w.addEventListener('click', function (e) { e.preventDefault(); e.stopPropagation(); if (!renvoiAppui(w)) ouvreAngle(A, c, w); });\n        ['pointerdown', 'mousedown', 'touchstart'].forEach(function (ev) { w.addEventListener(ev, function (e) { e.stopPropagation(); noteAppui(w); }); });   /* le moteur ferme menus et fen\u00EAtres \u00E0 tout clic sur la sc\u00E8ne */\n      });\n    });\n    placeAngles(A);\n    var lay = A.S.layout; if (lay === 'angle' || lay === 'u-shape' || lay === 'g-shape') return;   /* L, U, G : anglesInt replace les badges de coin avec les siens, dans la m\u00EAme passe */\n    requestAnimationFrame(function () { placeAngles(A); }); setTimeout(function () { placeAngles(A); }, 250);\n    setTimeout(function () { placeAngles(A); }, 700);                   /* les cotes finissent de se placer apr\u00E8s le cadrage du dessin */\n  }\n  /* D10 v2 : badge du coin c \u2192 fen\u00EAtre du hors \u00E9querre (coin droit : rien de pos\u00E9 avant \u00AB Appliquer \u00BB) ou du type en place ;\n     plan fini sur 4 c\u00F4t\u00E9s : la bulle de refus. Rect de la pi\u00E8ce : celui que le moteur donne au carr\u00E9 vert (addHit) */\n  var badgeOuvert = null;\n  /* le badge sous le doigt \u00E0 l'appui : si une passe de placement (dessin qui finit de se cadrer) d\u00E9place les badges entre l'appui\n     et le clic, le clic tombe sur un autre badge ; on ouvre celui qui a \u00E9t\u00E9 touch\u00E9 (recette d'AUDIT, U \u00E0 375). Les passes\n     attendent la fin du geste (gele). */\n  var appui = null;\n  function noteAppui(w) { appui = { w: w, t: Date.now() }; }\n  function renvoiAppui(w) {\n    var a = appui; appui = null;\n    if (!a || a.w === w || Date.now() - a.t > 1000 || !a.w.isConnected) return false;\n    a.w.click(); return true;\n  }\n  function gele() { return !!(appui && Date.now() - appui.t < 1000); }\n  function passeBadges(A) { placeBiais(A); placeAngles(A); placeAnglesInt(A); }\n  function ouvreAngle(A, c, el) {\n    var rb = coinBrut(A, c); if (!rb) return;\n    var hb = boutDeCoin(A, c);\n    if (!hb) { toastBout(refusAngle(A, rb)); return; }               /* A-294 */\n    if (!(PRIX_BOUT.hors > 0)) return;\n    if (A.closeMenu) A.closeMenu();\n    var posee = (A.S.edges || {})[c] === 'biais' && hb.b.c === 'hors', hr = (A.__cpHits || {})[c];\n    A.currentEdgeKey = c; badgeOuvert = c; intOuvert = null; if (A.edgePopup) A.edgePopup.__cpInt = null;\n    var pp = A.edgePopup || document.getElementById('edge-dims-popup');   /* A-304, A-305 : l'\u00E9cart r\u00E9el de ce qu'APPLIQUER posera (ou le co\u00FBt de la coupe en place), et ce qu'il remplace */\n    if (pp && window.CP_annonce) {\n      var a0 = hb.sens > 0 ? COTE.hors.def : 180 - COTE.hors.def; pp.__cpEcart = window.CP_annonce(A, function (B) { return !poseAngle(B, c, posee ? 90 : a0); }, 'biais', 'hors', posee, c);\n      el = (A.dims && A.dims.querySelector('.cp-angle-coin[data-coin=\"' + c + '\"]')) || el;   /* le rendu qui suit la simulation a recr\u00E9\u00E9 le badge */\n    }\n    fenetreCoin(A, c, 'biais', hb.b, hr && hr.rect, hb.sens, { neuf: !posee, pres: el, retour: function () { rendFocus(c); } });\n  }\n  /* apr\u00E8s \u00AB Appliquer \u00BB, \u00AB Supprimer \u00BB ou \u2715 : le focus revient au badge du coin (recr\u00E9\u00E9 par le rendu), comme apr\u00E8s \u00C9chap,\n     sans d\u00E9filement (AUDIT Tour 522) */\n  function rendFocus(c) {\n    badgeOuvert = null;\n    setTimeout(function () { var A = getApp(), b = A && A.dims && A.dims.querySelector('.cp-angle-coin[data-coin=\"' + c + '\"]'); if (b) try { b.focus({ preventScroll: true }); } catch (er) { b.focus(); } }, 30);\n  }\n  window.addEventListener('click', function (e) {\n    var x = e.target && e.target.closest && e.target.closest('#edge-dims-popup .cp-dp-x'); if (!x || !badgeOuvert) return;\n    var A = getApp(), c = badgeOuvert; if (!A || A.currentEdgeKey !== c) { badgeOuvert = null; return; }   /* fen\u00EAtre ouverte depuis par le carr\u00E9 vert */\n    rendFocus(c);\n  }, true);\n  /* \u00C9chap (cp-a11y ferme la fen\u00EAtre) : le focus revient au badge ouvert */\n  window.addEventListener('keydown', function (e) {\n    if (e.key !== 'Escape' || !badgeOuvert) return;\n    var c = badgeOuvert, A0 = getApp(); badgeOuvert = null;\n    if (!A0 || A0.currentEdgeKey !== c) return;                        /* fen\u00EAtre ferm\u00E9e depuis, ou une autre ouverte */\n    setTimeout(function () { var A = getApp(), p = document.getElementById('edge-dims-popup'), b = A && A.dims && A.dims.querySelector('.cp-angle-coin[data-coin=\"' + c + '\"]'); if (p && !p.classList.contains('hidden')) A.closeEdgePopup(); if (b) b.focus(); }, 30);\n  }, true);\n  window.addEventListener('resize', function () { try { placeAngles(getApp()); placeAnglesInt(getApp()); } catch (e) {} });\n  /* \u2500\u2500 D12 (Romain 07/10 00:17, \u00AB sur l'angle int\u00E9rieur mettez orange comme les angles ext\u00E9rieurs \u00BB ; AUDIT Tour 539) : \u00E0\n     chaque angle int\u00E9rieur (L, U, G), le badge orange des coins ext\u00E9rieurs, \u00E0 la place du texte noir du moteur. Il ouvre\n     une fen\u00EAtre qui r\u00E8gle CE m\u00EAme angle par le champ sous le dessin (cp-trace : L \u00AB Angle entre les murs \u00BB, U et G un\n     champ par coin ; m\u00EAmes bornes 85 \u00E0 95\u00B0, m\u00EAmes effets, aucun prix nouveau) ; rien d'appliqu\u00E9 avant \u00AB Appliquer \u00BB ;\n     \u00AB Supprimer \u00BB remet 90\u00B0 ; \u2715 et \u00C9chap : rien ne change ; le focus revient au badge. \u2500\u2500 */\n  var ANGLES_INT_CSS = ANGLES_CSS.replace(/cp-angle-coin/g, 'cp-angle-int') + '#stage svg .inner-angle-overlay.cp-int-on text{visibility:hidden}';\n  var intOuvert = null;\n  function champInt(A, k) { return document.getElementById(k === 'L' ? 'cp-ang-input' : 'cp-ang-' + k); }\n  function valInt(A, k) { var S = A.S; if (k === 'L') return num(S.innerAngle) || 90; var c = S.cpAng && S.cpAng[S.layout]; return num(c && c[k]) || 90; }\n  function grpInt(A, k) { return k === 'L' ? A.svg.querySelector('.inner-angle-overlay') : A.svg.querySelector('.inner-angle-overlay[data-cp-corner=\"' + k + '\"]'); }\n  /* obstacles \u00E0 l'\u00E9cran : ceux du dessin (\u00E9tiquettes et traits des cotes, cases, textes) et les badges des coins, \u00AB mobiles \u00BB :\n     ils se replacent sans couvrir les badges int\u00E9rieurs (fin de placeAnglesInt) ; mieux vaut prendre leur place que la pierre.\n     coinsDurs : un badge de coin n'a pas trouv\u00E9 d'autre place ; les badges de coin sont alors des obstacles durs */\n  function obstaclesInt(A, coinsDurs) {\n    var r = obstaclesDessin(A);\n    Array.prototype.forEach.call(A.dims.querySelectorAll('.cp-angle-coin'), function (el) { if (getComputedStyle(el).display !== 'none' && el.getBoundingClientRect().width > 0) { var q = pastilleDe(el); if (coinsDurs) q.dur = true; else q.mob = true; r.push(q); } });\n    return r;\n  }\n  function coinSurInt(A, ints) { return Array.prototype.some.call(A.dims.querySelectorAll('.cp-angle-coin'), function (c) { var q = pastilleDe(c); return q.right > q.left && ints.some(function (i) { return couvre(q, i); }); }); }\n  function coinSurPierre(A) { var pcs = piecesPlan(A); return Array.prototype.some.call(A.dims.querySelectorAll('.cp-angle-coin'), function (c) { var q = c.getBoundingClientRect(); return q.width > 0 && surPlan(A, pcs, partVue(q, retraitVu(c))) > 0; }); }\n  /* badges int\u00E9rieurs plac\u00E9s ensemble : pour chaque badge, ses places (grille de 8 px jusqu'\u00E0 170 px, places pr\u00E9f\u00E9r\u00E9es et\n     places cal\u00E9es dans le coin) qui ne couvrent aucun obstacle dur et restent du c\u00F4t\u00E9 de son angle, rang\u00E9es comme dans\n     meilleurePlace (au-del\u00E0 de l'arc \u00E0 co\u00FBt \u00E9gal) ; puis la combinaison o\u00F9 aucun badge n'en couvre un autre, avec le moins\n     de pierre, puis de badges de coin, puis de co\u00FBt (40 places par badge, recherche born\u00E9e) \u2192 { nd, sp, nm, v, pos } */\n  function combinaison(A, specs, obs) {\n    var listes = specs.map(function (s) {\n      var hw = s.w.offsetWidth / 2, hh = s.w.offsetHeight / 2;\n      if (!s.o2) { var q0 = { left: s.repli[0] - hw, right: s.repli[0] + hw, top: s.repli[1] - hh, bottom: s.repli[1] + hh }, v0 = partVue(q0, retraitVu(s.w)); return [{ p: s.repli, nd: 0, sp: 0, nb: 0, nm: 0, v: 0, a: q0, r: q0, pv: v0, rv: v0 }]; }\n      var o = Object.assign({ obs: obs }, s.o2), bw = hw + 2, bh = hh + 2, hb = o.host, vus = {}, l = [], memo = o.memo || {};\n      var evalue = function (p) {                                        /* la place p, si elle ne couvre aucun obstacle dur et reste du c\u00F4t\u00E9 de son angle */\n        var cle = Math.round(p[0] * 4) + ',' + Math.round(p[1] * 4), a = { left: p[0] - bw, right: p[0] + bw, top: p[1] - bh, bottom: p[1] + bh };\n        if (a.left < hb.left || a.right > hb.right || a.top < hb.top || a.bottom > hb.bottom || !o.garde(p)) return null;\n        var b = basePlace(o, memo, p, a); if (b.nd) return null;\n        if (!('a' + cle in memo)) memo['a' + cle] = atteint(A, o.pcs, o.de, p);\n        if (!memo['a' + cle]) return null;\n        if (!('s' + cle in memo)) memo['s' + cle] = surPlan(A, o.pcs, partVue(a, o.iv));\n        var r = { left: p[0] - hw, right: p[0] + hw, top: p[1] - hh, bottom: p[1] + hh };   /* pv, rv : pastilles, avec et sans la marge (C1) */\n        return { p: p, a: a, nd: 0, sp: memo['s' + cle], nb: b.nb, nm: b.nm, v: b.c + (s.o.garde(p) ? 0 : 2), r: r, pv: partVue(a, o.iv), rv: partVue(r, o.iv) };\n      };\n      var ajoute = function (p) { var cle = Math.round(p[0] * 4) + ',' + Math.round(p[1] * 4); if (vus[cle]) return; vus[cle] = 1; var k = evalue(p); if (k) l.push(k); };\n      o.pref.forEach(ajoute);\n      [0, 6].forEach(function (d) { for (var dx = -170 + d; dx <= 170; dx += 12) for (var dy = -170 + d; dy <= 170; dy += 12) if (dx * dx + dy * dy <= 170 * 170) ajoute([o.x + dx, o.y + dy]); });   /* grille de meilleurePlace (tests d\u00E9j\u00E0 faits) et grille d\u00E9cal\u00E9e de 6 px */\n      var res = l.sort(function (a, b) { return mieux(a, b) ? -1 : mieux(b, a) ? 1 : 0; }).slice(0, 40);\n      res.evalue = evalue;\n      return res;\n    });\n    if (listes.some(function (l) { return !l.length; })) return null;\n    var n = listes.length, reste = [], meilleur = null, choix = [];\n    reste[n] = { sp: 0, nb: 0, nm: 0, v: 0 };\n    for (var i = n - 1; i >= 0; i--) reste[i] = { sp: reste[i + 1].sp + listes[i][0].sp, nb: reste[i + 1].nb + listes[i][0].nb, nm: reste[i + 1].nm + listes[i][0].nm, v: reste[i + 1].v + listes[i][0].v };\n    var va = function (i, sp, nb, nm, v) {\n      if (i === n) { var cet = { nd: 0, sp: sp, nb: nb, nm: nm, v: v }; if (mieux(cet, meilleur)) { cet.ks = choix.slice(); meilleur = cet; } return; }\n      for (var j = 0; j < listes[i].length; j++) {\n        var k = listes[i][j], r = reste[i + 1];\n        if (meilleur && !mieux({ nd: 0, sp: sp + k.sp + r.sp, nb: nb + k.nb + r.nb, nm: nm + k.nm + r.nm, v: v + k.v + r.v }, meilleur)) break;   /* les suivantes ne font pas mieux */\n        for (var q = 0; q < i && !couvre(k.pv, choix[q].rv); q++);\n        if (q < i) continue;                                             /* couvre la pastille d'un badge d\u00E9j\u00E0 choisi */\n        choix[i] = k; va(i + 1, sp + k.sp, nb + k.nb, nm + k.nm, v + k.v);\n      }\n    };\n    va(0, 0, 0, 0, 0);\n    if (!meilleur) return null;\n    /* affinage : la grille avance de 6 px ; un badge qui mord encore sur la pierre (le plan du haut inclin\u00E9, en G \u00E0 375), ou dont\n       la bo\u00EEte touche encore celle d'une cible (C1), cherche \u00E0 petits pas autour de sa place celle qui l'\u00E9vite, les autres badges\n       restant o\u00F9 ils sont */\n    meilleur.ks.forEach(function (k, i) {\n      if ((!k.sp && !k.nb) || !listes[i].evalue) return;\n      var bon = k;\n      for (var fx = -15; fx <= 15; fx += 3) for (var fy = -15; fy <= 15; fy += 3) {\n        var c = (fx || fy) && listes[i].evalue([k.p[0] + fx, k.p[1] + fy]); if (!c) continue;\n        if (meilleur.ks.some(function (q, j) { return j !== i && couvre(c.pv, q.rv); })) continue;\n        if (mieux(c, bon)) bon = c;\n      }\n      if (bon === k) return;\n      meilleur.sp += bon.sp - k.sp; meilleur.nb += bon.nb - k.nb; meilleur.nm += bon.nm - k.nm; meilleur.v += bon.v - k.v; meilleur.ks[i] = bon;\n    });\n    meilleur.pos = meilleur.ks.map(function (k) { return k.p; });\n    return meilleur;\n  }\n  /* la pose en place des badges int\u00E9rieurs, compt\u00E9e comme une pose nouvelle (obstacles durs, pierre, badges de coin, co\u00FBt) ;\n     null si un badge n'est pas encore pos\u00E9 ou n'est plus du c\u00F4t\u00E9 de son angle */\n  function poseActuelle(A, specs, obs, host) {\n    var pos = [], r = { nd: 0, sp: 0, nb: 0, nm: 0, v: 0, pos: pos };\n    for (var i = 0; i < specs.length; i++) {\n      var w = specs[i].w; if (!w.style.left || !w.style.top) return null;\n      pos.push([parseFloat(w.style.left) + host.left, parseFloat(w.style.top) + host.top]);\n    }\n    for (i = 0; i < specs.length; i++) {\n      /* jug\u00E9e sans la marge de 2 px d'une place nouvelle : une cote qui bouge d'un pixel (survol, d\u00E9filement) ne la d\u00E9fait pas */\n      var s = specs[i], p = pos[i], hw = s.w.offsetWidth / 2, hh = s.w.offsetHeight / 2, a = { left: p[0] - hw, right: p[0] + hw, top: p[1] - hh, bottom: p[1] + hh };\n      if (!s.o2) continue;                                               /* \u00E0 la place du texte du moteur : fixe */\n      var o = Object.assign({ obs: obs }, s.o2);\n      if (!o.garde(p) || Math.sqrt(Math.pow(p[0] - o.x, 2) + Math.pow(p[1] - o.y, 2)) > 170 || !atteint(A, o.pcs, o.de, p)) return null;   /* le dessin a \u00E9t\u00E9 recadr\u00E9 : hors de la zone de son angle */\n      var b = basePlace(o, {}, p, a);                                    /* pas le memo de la pass : ses bo\u00EEtes ont la marge */\n      r.nd += b.nd; r.nb += b.nb; r.nm += b.nm; r.v += b.c; r.sp += surPlan(A, o.pcs, partVue(a, o.iv));\n      for (var j = 0; j < i; j++) { var q = pos[j], wj = specs[j].w; if (couvre(partVue(a, retraitVu(s.w)), partVue({ left: q[0] - wj.offsetWidth / 2, right: q[0] + wj.offsetWidth / 2, top: q[1] - wj.offsetHeight / 2, bottom: q[1] + wj.offsetHeight / 2 }, retraitVu(wj)))) r.nd++; }   /* pastille contre pastille (C1) */\n    }\n    return r;\n  }\n  function placeAnglesInt(A, coinsDurs) {\n    if (!A || !A.dims || !A.svg) return;\n    /* repli d\u00E9j\u00E0 n\u00E9cessaire dans ce rendu (badges de coin durs, voir la fin) : on s'y tient jusqu'au rendu suivant, qui recr\u00E9e les\n       badges ; sinon, un badge de coin \u00E0 un pixel de la pierre fait alterner les deux poses d'une passe \u00E0 l'autre */\n    if (!coinsDurs && Array.prototype.some.call(A.dims.querySelectorAll('.cp-angle-int'), function (w) { return w.__cpCoinsDurs; })) coinsDurs = true;\n    var host = A.dims.getBoundingClientRect(), som = [], pcs = piecesPlan(A);\n    Array.prototype.forEach.call(A.svg.querySelectorAll('.inner-angle-overlay path'), function (p) {   /* sommets de tous les angles int\u00E9rieurs */\n      var m = /^M\\s*([-\\d.]+)[ ,]+([-\\d.]+)/.exec(p.getAttribute('d') || ''), M = p.getScreenCTM && p.getScreenCTM(); if (!m || !M) return;\n      var s = A.svg.createSVGPoint(); s.x = Number(m[1]); s.y = Number(m[2]); som.push(s.matrixTransform(M));\n    });\n    var d2 = function (a, b) { return (a[0] - b.x) * (a[0] - b.x) + (a[1] - b.y) * (a[1] - b.y); };\n    var specs = [];                                                      /* par badge : ses options de place, ou la place du texte du moteur */\n    Array.prototype.forEach.call(A.dims.querySelectorAll('.cp-angle-int'), function (w) {\n      var g = grpInt(A, w.getAttribute('data-int')), p = g && g.querySelector('path'), t = g && g.querySelector('text'); if (!p && !t) { w.style.display = 'none'; return; }\n      w.style.display = '';\n      var spec = { w: w }; specs.push(spec);\n      /* dans l'espace libre de l'angle : du sommet vers l'arc du secteur (bissectrice), au-del\u00E0 de l'arc ; si une \u00E9tiquette,\n         une case ou un autre badge y est (U \u00E9troit \u00E0 375), plus loin, ou plus pr\u00E8s de l'un des deux murs ; sans secteur\n         lisible, \u00E0 la place du texte du moteur */\n      var m = p && /^M\\s*([-\\d.]+)[ ,]+([-\\d.]+)\\s*L\\s*([-\\d.]+)[ ,]+([-\\d.]+)[\\s\\S]*?\\s([-\\d.]+)[ ,]+([-\\d.]+)\\s*Z?\\s*$/.exec(p.getAttribute('d') || ''), M = p && p.getScreenCTM && p.getScreenCTM();\n      if (m && M) {\n        var ecran = function (x, y) { var s = A.svg.createSVGPoint(); s.x = Number(x); s.y = Number(y); return s.matrixTransform(M); };\n        var V = ecran(m[1], m[2]), P1 = ecran(m[3], m[4]), P2 = ecran(m[5], m[6]);\n        var u = function (a) { var dx = a.x - V.x, dy = a.y - V.y, n = Math.sqrt(dx * dx + dy * dy) || 1; return [dx / n, dy / n]; };\n        var e1 = u(P1), e2 = u(P2), bi = [e1[0] + e2[0], e1[1] + e2[1]], nb = Math.sqrt(bi[0] * bi[0] + bi[1] * bi[1]);\n        if (nb > 0.1) {\n          bi = [bi[0] / nb, bi[1] / nb];\n          var R = Math.max(Math.abs(P1.x - V.x) + Math.abs(P1.y - V.y), 8), dirs = [bi];\n          var Vb = biaisEcran(A, w.getAttribute('data-int'));            /* A-345 : depuis le biais de la pi\u00E8ce d'angle */\n          if (Vb) { V = Vb; R = 8; }\n          [e1, e2].forEach(function (e) { var v = [bi[0] * 0.45 + e[0] * 0.55, bi[1] * 0.45 + e[1] * 0.55], n = Math.sqrt(v[0] * v[0] + v[1] * v[1]); dirs.push([v[0] / n, v[1] / n]); });\n          var cand = [];\n          [30, 40, 52, 66, 82, 100].forEach(function (k) { dirs.forEach(function (d) { cand.push([V.x + d[0] * (R + k), V.y + d[1] * (R + k)]); }); });\n          /* repli, si aucune place n'\u00E9vite cotes, cases, badges et pi\u00E8ces au-del\u00E0 de l'arc (G en 375) : cal\u00E9 dans le coin,\n             contre les deux murs (les cotes sont au milieu des bords, le coin reste libre) ; le badge prend la place du secteur\n             vert de l'angle, qu'il remplace */\n          var hw = w.offsetWidth / 2 + 3, hh = w.offsetHeight / 2 + 3, coin = [];\n          [[hw, hh], [hh, hw]].forEach(function (ab) { [0, 6, 12].forEach(function (k) { coin.push([V.x + e1[0] * (ab[0] + k) + e2[0] * (ab[1] + k), V.y + e1[1] * (ab[0] + k) + e2[1] * (ab[1] + k)]); }); });\n          /* ces places d'abord, puis la grille ; au-del\u00E0 de l'arc ; le moins encombr\u00E9 (un trait de cote crois\u00E9 plut\u00F4t qu'une\n             \u00E9tiquette couverte ; jamais une case, un badge ou une pi\u00E8ce s'il y a une autre place), au plus pr\u00E8s de la\n             bissectrice ; de pr\u00E9f\u00E9rence plus pr\u00E8s de son sommet que de tout autre angle int\u00E9rieur (6 sinon : en G \u00E0 375, mieux\n             vaut un badge un peu \u00E0 l'\u00E9cart, dont la fen\u00EAtre dit l'angle, qu'une case qu'on ne peut plus toucher) */\n          var rmin = R + w.offsetHeight / 2 + 8;                          /* au-del\u00E0 de l'arc, sur la taille r\u00E9elle du badge */\n          spec.repli = cand[0];\n          spec.o = { x: V.x + bi[0] * (R + 34), y: V.y + bi[1] * (R + 34), ref: [V.x, V.y], pcs: pcs, host: host, pref: cand, de: [V.x, V.y], memo: {}, iv: retraitVu(w),\n            garde: function (c) { return d2(c, V) >= rmin * rmin; },\n            biais: function (c) { var dx = c[0] - V.x, dy = c[1] - V.y, n = Math.sqrt(dx * dx + dy * dy) || 1, dv = d2(c, V);\n              return (1 - (dx * bi[0] + dy * bi[1]) / n) * 0.6 + (som.every(function (o) { return d2(c, o) >= dv - 1; }) ? 0 : 6); } };\n          spec.o2 = Object.assign({}, spec.o, { pref: coin.concat(cand), garde: function (c) { return d2(c, V) >= hh * hh; } });   /* repli : jusque dans le coin */\n          return;\n        }\n      }\n      var r = t.getBoundingClientRect(); spec.repli = [r.left + r.width / 2, r.top + r.height / 2];\n    });\n    /* pos\u00E9s l'un apr\u00E8s l'autre, les premiers badges peuvent prendre la place dont le dernier a besoin (G en 375) : on essaie\n       chaque ordre de pose (6 au plus) et on garde celui qui couvre le moins d'obstacles durs, puis le moins de pierre, puis\n       le moins de badges de coin, puis qui co\u00FBte le moins (m\u00EAme ordre que meilleurePlace) */\n    var ordres = [[]];\n    specs.forEach(function (s, i) { var n = []; ordres.forEach(function (o) { for (var k = 0; k <= o.length; k++) n.push(o.slice(0, k).concat([i], o.slice(k))); }); ordres = n; });\n    var pose = function (durs) {                                         /* durs : badges de coin obstacles durs, sinon \u00AB mobiles \u00BB */\n      var obs = obstaclesInt(A, durs), meilleur = null;\n      specs.forEach(function (s) { if (s.o) { s.o.memo = {}; s.o2.memo = s.o.memo; } });   /* les co\u00FBts en cache d\u00E9pendent des obstacles */\n      ordres.forEach(function (ordre) {\n        var plus = [], pos = {}, nds = 0, sps = 0, nbs = 0, nms = 0, total = 0;   /* plus : les badges d\u00E9j\u00E0 pos\u00E9s dans cet ordre */\n        ordre.forEach(function (i) {\n          var s = specs[i], r = s.o ? meilleurePlace(A, s.w, Object.assign({ obs: obs, plus: plus }, s.o)) : null;\n          if (r && r.dur && s.o2) { var r2 = meilleurePlace(A, s.w, Object.assign({ obs: obs, plus: plus }, s.o2)); if (r2 && mieux(r2, r)) r = r2; }   /* rien de libre au-del\u00E0 de l'arc : le coin */\n          var pt = r ? r.p : s.repli;\n          if (r) { total += r.v; nds += r.nd; sps += r.sp; nbs += r.nb || 0; nms += r.nm || 0; }\n          pos[i] = pt;\n          var hw = s.w.offsetWidth / 2, hh = s.w.offsetHeight / 2, pv = partVue({ left: pt[0] - hw, right: pt[0] + hw, top: pt[1] - hh, bottom: pt[1] + hh }, retraitVu(s.w));\n          plus.push({ left: pv.left, right: pv.right, top: pv.top, bottom: pv.bottom, poids: 30, dur: true, vu: true });   /* sa pastille (C1) */\n        });\n        var cet = { nd: nds, sp: sps, nb: nbs, nm: nms, v: total, pos: pos };\n        if (mieux(cet, meilleur)) meilleur = cet;\n      });\n      /* m\u00EAme ainsi, un badge peut prendre la seule place libre d'un autre alors qu'il en avait une autre (G apr\u00E8s U en 375) :\n         sans pose propre, on cherche la meilleure combinaison parmi toutes les places de chaque badge */\n      if (meilleur && (meilleur.nd > 0 || meilleur.sp > 0 || meilleur.nb > 0)) { var comb = combinaison(A, specs, obs); if (comb && mieux(comb, meilleur)) meilleur = comb; }\n      /* passes suivantes (une cote d\u00E9cal\u00E9e d'un pixel au survol, un d\u00E9filement) : les badges d\u00E9j\u00E0 pos\u00E9s restent o\u00F9 ils sont si la\n         nouvelle pose ne couvre pas moins d'obstacles durs, de pierre ou de badges de coin ; sinon, deux poses \u00E0 \u00E9galit\u00E9\n         s'\u00E9changent d'une passe \u00E0 l'autre, et un toucher pendant une passe tombe sur l'autre badge (recette d'AUDIT, U \u00E0 375 :\n         badge de coin touch\u00E9, fen\u00EAtre de l'angle ouverte) */\n      var actuel = poseActuelle(A, specs, obs, host);\n      if (actuel) {                                                      /* la nouvelle pose ne gagne que si elle couvre moins (nd, pierre, nb, nm) */\n        var km = [meilleur.nd, meilleur.sp, meilleur.nb || 0, meilleur.nm || 0], ka = [actuel.nd, actuel.sp, actuel.nb, actuel.nm], gagne = false;\n        for (var z = 0; z < 4; z++) if (km[z] !== ka[z]) { gagne = km[z] < ka[z]; break; }\n        if (!gagne && meilleur.v > actuel.v - 1.5) meilleur = actuel;\n      }\n      return meilleur;\n    };\n    /* d'abord les badges de coin comme obstacles durs : ils ne bougent pas (U, L, G au large) ; seulement si un badge int\u00E9rieur\n       reste alors sur la pierre ou sur un obstacle (G serr\u00E9 \u00E0 375), la m\u00EAme recherche avec les badges de coin \u00AB mobiles \u00BB */\n    var meilleur = pose(true);\n    if (!coinsDurs && A.S.layout === 'g-shape' && (meilleur.nd > 0 || meilleur.sp > 0 || meilleur.nb > 0)) { var mobile = pose(false); if (mieux(mobile, meilleur)) meilleur = mobile; }   /* en L et en U, les badges de coin ne bougent jamais (un toucher pendant le cadrage tombait sur l'angle) */\n    specs.forEach(function (s, i) { var pt = meilleur.pos[i]; s.w.style.left = (pt[0] - host.left) + 'px'; s.w.style.top = (pt[1] - host.top) + 'px'; });\n    /* un badge int\u00E9rieur sans place libre de badge (G en 375) : les badges de coin, qui ont plus de place hors du plan, se\n       replacent sans le couvrir */\n    var ints = intsPoses(A);\n    if (coinSurInt(A, ints)) placeAngles(A, ints);\n    /* le badge de coin n'a pas trouv\u00E9 d'autre place libre (G inclin\u00E9 \u00E0 375 et 412), or il ne va jamais sur le plan (A-301) : les\n       badges de coin reprennent leur place et les badges int\u00E9rieurs se replacent sans les couvrir */\n    if (coinsDurs || (!coinSurInt(A, ints) && !coinSurPierre(A))) return;\n    Array.prototype.forEach.call(A.dims.querySelectorAll('.cp-angle-int'), function (w) { w.__cpCoinsDurs = true; });\n    placeAngles(A, []);\n    placeAnglesInt(A, true);\n  }\n  function anglesInt(A, essai) {\n    if (!A || !A.dims || !A.svg) return;\n    Array.prototype.forEach.call(A.dims.querySelectorAll('.cp-angle-int'), function (w) { w.remove(); });\n    if (window.CP_enSimulation && window.CP_enSimulation()) return;    /* rendu de simulation (cp-annonces) */\n    var lay = A.S.layout; if (!(lay === 'angle' || lay === 'u-shape' || lay === 'g-shape')) return;   /* \u00AB sur devis \u00BB compris : l'angle reste r\u00E9glable, comme par son champ */\n    if (!document.getElementById('cp-angles-int-css')) { var st = document.createElement('style'); st.id = 'cp-angles-int-css'; st.textContent = ANGLES_INT_CSS; document.head.appendChild(st); }\n    var manque = false;\n    Array.prototype.forEach.call(A.svg.querySelectorAll('.inner-angle-overlay'), function (g, i) {\n      var k = lay === 'angle' ? (i ? null : 'L') : g.getAttribute('data-cp-corner'), f = k && champInt(A, k);\n      if (!f) { if (k) manque = true; return; }                          /* sans son champ : le texte du moteur reste */\n      var lab = document.querySelector('label[for=\"' + f.id + '\"]'), nom = lab ? lab.textContent.trim() : 'Angle entre les murs', v = valInt(A, k);\n      var w = document.createElement('button'); w.type = 'button'; w.className = 'cp-angle-int' + (v !== 90 ? ' is-coupe' : ''); w.setAttribute('data-int', k);\n      var t = nom + ' : ' + v + '\u00B0' + (v === 90 ? ' (d\\'\u00E9querre)' : '') + '. Modifier';\n      w.textContent = v + '\u00B0'; w.title = t; w.setAttribute('aria-label', t); w.setAttribute('aria-haspopup', 'dialog');\n      A.dims.appendChild(w); g.classList.add('cp-int-on');\n      w.addEventListener('click', function (e) { e.preventDefault(); e.stopPropagation(); if (!renvoiAppui(w)) ouvreAngleInt(A, k, w); });\n      ['pointerdown', 'mousedown', 'touchstart'].forEach(function (ev) { w.addEventListener(ev, function (e) { e.stopPropagation(); noteAppui(w); }); });   /* le moteur ferme menus et fen\u00EAtres \u00E0 tout clic sur la sc\u00E8ne */\n    });\n    /* forme chang\u00E9e au menu (U puis G) : cp-trace cr\u00E9e les champs de la nouvelle forme juste apr\u00E8s ce rendu ; on reprend ensuite */\n    if (manque && (essai || 0) < 3) setTimeout(function () { anglesInt(A, (essai || 0) + 1); }, 0);\n    /* passes suivantes (les cotes finissent de se placer apr\u00E8s le cadrage du dessin) : badges de coin puis badges int\u00E9rieurs dans\n       la m\u00EAme t\u00E2che, sans \u00E9tat interm\u00E9diaire o\u00F9 un badge de coin, revenu \u00E0 sa place, couvrirait un badge int\u00E9rieur */\n    var passe = function () { if (gele()) { setTimeout(passe, 300); return; } passeBadges(A); };\n    placeAnglesInt(A); requestAnimationFrame(passe); setTimeout(passe, 250); setTimeout(passe, 700);\n    suitCotes(A); surveilleCotes(A, 2500);\n    if (essai) aideAngles(A);                                           /* A-371 : badges pos\u00E9s apr\u00E8s le rendu */\n  }\n  /* A-371 (AUDIT Tour 832) : badges d'angle actifs (coin de bout ouvert, angle int\u00E9rieur), compt\u00E9s pour la ligne d'aide\n     (cp-decor-data, CP_aideCotes) ; null avant le premier rendu (texte d'apr\u00E8s la r\u00E8gle) et pendant une simulation */\n  function aideAngles(A) {\n    if (window.CP_enSimulation && window.CP_enSimulation()) return;\n    A.__cpAnglesVus = true;\n    if (typeof window.CP_aideMaj === 'function') window.CP_aideMaj();\n  }\n  window.CP_anglesActifs = function () {\n    var A = getApp(); if (!A || !A.dims || !A.__cpAnglesVus) return null;\n    return A.dims.querySelectorAll('.cp-angle-coin:not([aria-disabled=\"true\"]), .cp-angle-int').length;\n  };\n  /* pendant que le dessin finit de se cadrer, une cote peut bouger sans \u00E9criture ni changement de taille observable (U \u00E0 1440 :\n     \u00AB P1 \u00BB descend de 109 px entre deux passes) : \u00E0 chaque image, pendant 2,5 s, on compare la place des cotes dans leur calque\n     et on replace les badges d\u00E8s qu'elle change */\n  function placeCotes(A) {\n    var h = A.dims.getBoundingClientRect();\n    return Array.prototype.map.call(A.dims.querySelectorAll('.dim .label, .dim .subdivision-label'), function (e) { var q = e.getBoundingClientRect(); return Math.round(q.left - h.left) + ',' + Math.round(q.top - h.top) + ',' + Math.round(q.width) + ',' + Math.round(q.height); }).join(';');\n  }\n  function surveilleCotes(A, duree) {\n    var fin = Date.now() + duree, dims = A.dims, avant = placeCotes(A), jeton = {};\n    dims.__cpSurv = jeton;                                               /* un seul guet \u00E0 la fois : le rendu suivant le relance */\n    var tour = function () {\n      if (Date.now() > fin || A.dims !== dims || !dims.isConnected || dims.__cpSurv !== jeton) return;\n      if (!(window.CP_enSimulation && window.CP_enSimulation()) && !gele()) {\n        var s = placeCotes(A);\n        if (s !== avant) { passeBadges(A); avant = placeCotes(A); }\n      }\n      requestAnimationFrame(tour);\n    };\n    requestAnimationFrame(tour);\n  }\n  /* une cote qui bouge entre deux passes (cadrage du dessin, police charg\u00E9e) : les badges suivent \u00E0 l'image suivante (recette\n     d'AUDIT, U \u00E0 1440 : badge \u00E0 1 px de \u00AB P1 \u00BB le temps d'une passe) ; les badges eux-m\u00EAmes ne comptent pas ; rien pendant une\n     simulation de prix (cp-annonces) */\n  function suitCotes(A) {\n    if (A.dims.__cpSuit) return;\n    A.dims.__cpSuit = true;\n    var prevu = false, simu = function () { return window.CP_enSimulation && window.CP_enSimulation(); };\n    var maintenant = function () { if (gele()) { bientot(); return; } var G = getApp(); if (G && G.dims && G.svg && !simu()) passeBadges(G); };\n    var bientot = function () { if (prevu || simu()) return; prevu = true; requestAnimationFrame(function () { prevu = false; maintenant(); }); };\n    if (window.MutationObserver) new MutationObserver(function (ms) {   /* aussit\u00F4t (microt\u00E2che) : aucune autre t\u00E2che ne voit une cote d\u00E9plac\u00E9e sous un badge rest\u00E9 en place */\n      if (ms.some(function (m) { return m.target.nodeType === 1 && m.target.closest('.dim'); })) maintenant();   /* les cotes seules */\n    }).observe(A.dims, { attributes: true, attributeFilter: ['style', 'class'], subtree: true });\n    if (window.ResizeObserver) { var ro = new ResizeObserver(function () { maintenant(); }); ro.observe(A.dims); ro.observe(A.svg); }   /* cadrage du dessin : le calque des cotes change de taille, les cotes bougent sans style chang\u00E9 (U \u00E0 1440) */\n    if (document.fonts && document.fonts.status !== 'loaded') document.fonts.ready.then(bientot);\n  }\n  /* figure : les deux murs, l'angle entre eux (90\u00B0 en pointill\u00E9), comme la fen\u00EAtre du carr\u00E9 vert */\n  function figAngleInt(a) {\n    var X = 96, Y = 150, L = 150, rad = a * Math.PI / 180, ex = X + L * Math.cos(rad), ey = Y - L * Math.sin(rad), R = 42;\n    var ax = X + R * Math.cos(rad), ay = Y - R * Math.sin(rad);\n    return '<svg class=\"edge-schema\" viewBox=\"0 0 300 196\" role=\"img\" aria-label=\"Angle entre les murs, ' + a + ' degr\u00E9s\">' + FIG_DEFS +\n      '<line class=\"ns-rap\" x1=\"' + X + '\" y1=\"' + Y + '\" x2=\"' + X + '\" y2=\"' + (Y - L) + '\"/>' +\n      '<path class=\"ns-piece\" d=\"M ' + (X + L) + ',' + Y + ' L ' + X + ',' + Y + ' L ' + ex.toFixed(1) + ',' + ey.toFixed(1) + '\" fill=\"none\"/>' +\n      '<path class=\"ns-dim\" d=\"M ' + (X + R) + ',' + Y + ' A ' + R + ' ' + R + ' 0 0 0 ' + ax.toFixed(1) + ',' + ay.toFixed(1) + '\" fill=\"none\"/>' +\n      '<text class=\"ns-txt\" x=\"' + (X + 54) + '\" y=\"' + (Y - 26) + '\">' + a + '\u00B0</text>' +\n      '<text class=\"ns-txt\" x=\"' + (X + L / 2) + '\" y=\"' + (Y + 22) + '\" text-anchor=\"middle\">mur</text></svg>';\n  }\n  function ouvreAngleInt(A, k, el) {\n    var f = champInt(A, k); if (!f) return;\n    var lab = document.querySelector('label[for=\"' + f.id + '\"]'), nom = lab ? lab.textContent.trim() : 'Angle entre les murs';\n    var p = num(A._eff && A._eff.edgePricesEuro && A._eff.edgePricesEuro.innerAngle), cur = Math.max(85, Math.min(95, Math.round(valInt(A, k))));\n    var pose = function (v) { f.value = String(v); f.dispatchEvent(new Event('change', { bubbles: true })); };   /* le champ sous le dessin : m\u00EAme code, m\u00EAmes effets (cp-trace) */\n    if (A.closeMenu) A.closeMenu();\n    intOuvert = k;\n    var pp = A.edgePopup || document.getElementById('edge-dims-popup'); if (pp) pp.__cpInt = k;\n    if (pp && window.CP_annonce) {                                      /* A-304 : \u00E9cart r\u00E9el (cp-annonces) */\n      pp.__cpEcart = window.CP_annonce(A, function () { pose(cur === 90 ? 91 : 90); }, '', '', cur !== 90);\n      el = (A.dims && A.dims.querySelector('.cp-angle-int[data-int=\"' + k + '\"]')) || el;   /* badge recr\u00E9\u00E9 par le rendu qui suit la simulation */\n    }\n    fenetreCote(A, { titre: nom, tag: 'Hors d\\'\u00E9querre' + (p > 0 ? ' \u00B7 +' + eurs(p) + '\u20AC' : ''), piece: '90\u00B0 = d\\'\u00E9querre' + (p > 0 ? ', sans suppl\u00E9ment' : ''),\n      champs: [{ id: 'cp-int-v', label: 'Angle', unite: '\u00B0', min: 85, max: 95, val: cur, pas: 1 }],\n      schema: function (v) { return figAngleInt(Math.round(v[0])); },\n      ok: function (v) { pose(Math.round(v[0])); }, suppr: function () { pose(90); }, pres: el, retour: function () { rendFocusInt(k); } });\n  }\n  function rendFocusInt(k) {\n    intOuvert = null;\n    setTimeout(function () { var A = getApp(), b = A && A.dims && A.dims.querySelector('.cp-angle-int[data-int=\"' + k + '\"]'); if (b) try { b.focus({ preventScroll: true }); } catch (er) { b.focus(); } }, 60);\n  }\n  window.addEventListener('keydown', function (e) {                    /* \u00C9chap (cp-a11y ferme la fen\u00EAtre) : focus rendu au badge */\n    if (e.key !== 'Escape' || !intOuvert) return;\n    var p = document.getElementById('edge-dims-popup'), k = intOuvert;\n    if (!p || p.classList.contains('hidden') || p.__cpInt !== k) { intOuvert = null; return; }\n    setTimeout(function () { var A = getApp(); if (!p.classList.contains('hidden') && A && A.closeEdgePopup) A.closeEdgePopup(); rendFocusInt(k); }, 30);\n  }, true);\n  window.addEventListener('click', function (e) {                      /* \u2715 de la fen\u00EAtre : rien ne change, focus rendu au badge */\n    var x = e.target && e.target.closest && e.target.closest('#edge-dims-popup .cp-dp-x'), p = document.getElementById('edge-dims-popup');\n    if (!x || !intOuvert || !p || p.__cpInt !== intOuvert) return;\n    rendFocusInt(intOuvert);\n  }, true);\n  /* \u00AB Hors \u00E9querre \u00BB choisi au carr\u00E9 vert d'un coin de bout : un seul par bout, celui de l'autre coin est retir\u00E9, ses coins\n     arrondis aussi (la coupe prend tout le bout) ; \u00AB Coin arrondi \u00BB choisi : le hors \u00E9querre du bout est retir\u00E9 */\n  window.CP_coinAvant = function (A, c, t, mode) {\n    if (!A || !A.S || !A.__cpPierreWrapped) return;\n    var r = boutDeCoin(A, c);\n    if (t === 'straight') {                                            /* \u00AB Droit \u00BB au carr\u00E9 vert de l'un ou l'autre coin d'un bout : retire son hors \u00E9querre (le moteur remet ce coin droit) */\n      if (!r || r.b.c !== 'hors') return;\n      [coinDe(A, r.b.k), coinArr(A, r.b.k)].forEach(function (k) { if (k && k !== c && A.S.edges[k] === 'biais') { A.S.edges[k] = 'straight'; if (A.S.cpBiais) delete A.S.cpBiais[k]; } });\n      return;\n    }\n    if ((t !== 'biais' && t !== 'round1') || !r || (t === 'round1' && !modeU(A))) return;\n    [coinDe(A, r.b.k), coinArr(A, r.b.k)].forEach(function (k) {\n      if (!k || k === c) return;\n      if (A.S.edges[k] === 'biais') { A.S.edges[k] = 'straight'; if (A.S.cpBiais) delete A.S.cpBiais[k]; }\n      if (t === 'biais' && A.S.edges[k] === 'round1') A.S.edges[k] = 'straight';\n    });\n    if (t === 'biais') {\n      (A.S.cpHorsDernier = A.S.cpHorsDernier || {})[r.b.k] = c;\n      (A.S.cpCoupeMode = A.S.cpCoupeMode || {})[r.b.k] = mode === 'hors' ? 'hors' : 'biais';   /* type choisi : bout en biais ou hors \u00E9querre */\n      if (A.S.cpBiais) delete A.S.cpBiais[c];                         /* bornes du nouveau type : sa valeur par d\u00E9faut */\n    }\n  };\n  document.addEventListener('click', function (e) {\n    var x = e.target && e.target.closest && e.target.closest('#edge-menu .em-opt[data-type=\"biais\"], #edge-menu .em-opt[data-type=\"round1\"], #edge-menu .em-opt[data-type=\"straight\"]'); if (!x) return;\n    var A = getApp(); if (A) window.CP_coinAvant(A, A.menuTarget, x.getAttribute('data-type'), x.getAttribute('data-cp-mode'));\n  }, true);\n  /* \u00AB Chants supp. : 3 \u00D7 59,00 \u20AC = +177,00 \u20AC \u00BB du moteur : n chants en moins (ceux des bouts finis, nomm\u00E9s \u00E0 part) ; la ligne\n     dispara\u00EEt \u00E0 0. Le total du moteur ne bouge pas. */\n  /* \u00AB Chanfreins : 2 \u00D7 99,00 \u20AC = +198,00 \u20AC \u00BB du moteur : n de moins (la ligne dispara\u00EEt \u00E0 0) ; renvoie le nombre retir\u00E9 */\n  /* lot \u00AB messages 2 \u00BB (N11, N12) : une ligne de suppl\u00E9ment se lit sous ses deux formes, \u00AB {libell\u00E9} (+X\u20AC) : xN = +Y\u20AC \u00BB (avant)\n     et \u00AB {libell\u00E9} : N \u00D7 X \u20AC = +Y \u20AC \u00BB ou \u00AB {libell\u00E9} : +X \u20AC \u00BB (une seule), et s'\u00E9crit sous la nouvelle */\n  function ligneSupp(lab, q, u) { return lab + ' : ' + (q > 1 ? q + ' \u00D7 ' + fmt(u) + '\u00A0\u20AC = +' + fmt(u * q) : '+' + fmt(u)) + '\u00A0\u20AC'; }\n  function lireSupp(t) {\n    var s = String(t).replace(/\\s+/g, ' ').trim(), m, c = function (x) { return Math.round(parseFloat(x.replace(/[\\s.]/g, '').replace(',', '.')) * 100); };\n    if ((m = s.match(/^(.+?) \\(\\+([\\d .,]+)\u20AC\\) : x(\\d+) = \\+[\\d .,]+\u20AC$/))) return { lab: m[1], q: Number(m[3]), u: c(m[2]) };\n    if ((m = s.match(/^(.+) : (\\d+) \u00D7 ([\\d .,]+?) ?\u20AC = \\+[\\d .,]+? ?\u20AC$/))) return { lab: m[1], q: Number(m[2]), u: c(m[3]) };\n    if ((m = s.match(/^(.+) : \\+([\\d .,]+?) ?\u20AC$/))) return { lab: m[1], q: 1, u: c(m[2]) };\n    return null;\n  }\n  function retireLigne(td, re, n) {\n    var fait = 0;\n    Array.prototype.some.call(td.querySelectorAll('.td-options-list li'), function (li) {\n      var m = lireSupp(li.textContent);\n      if (!m || !re.test(m.lab)) return false;\n      fait = Math.max(0, Math.min(n, m.q)); var q = m.q - fait;\n      if (q > 0) li.textContent = ligneSupp(m.lab, q, m.u);\n      else li.parentNode.removeChild(li);\n      return true;\n    });\n    return fait;\n  }\n  /* renvoie le nombre de chants r\u00E9ellement retir\u00E9s de la ligne (pas plus qu'elle n'en comptait ; 0 sans ligne) */\n  function retireChants(td, n, cles, A) {                          /* R148-b2 : les cl\u00E9s retir\u00E9es sont not\u00E9es (A._cpChantsRetires) */\n    var fait = 0;\n    Array.prototype.some.call(td.querySelectorAll('.td-options-list li'), function (li) {\n      var m = lireSupp(li.textContent);\n      if (!m || m.lab !== 'Chants supp.' || li.hasAttribute('data-cp-bouts')) return false;\n      fait = Math.max(0, Math.min(n, m.q)); var q = m.q - fait;\n      if (A && cles) (A._cpChantsRetires = A._cpChantsRetires || []).push.apply(A._cpChantsRetires, cles.slice(0, fait));\n      if (q > 0) li.textContent = ligneSupp('Chants supp.', q, m.u);\n      else li.parentNode.removeChild(li);\n      return true;\n    });\n    return fait;\n  }\n  /* plans joints : le titre \u00AB Suppl\u00E9ments \u00BB = somme des lignes visibles. L'\u00E9cart entre la somme des plans et le prix de\n     base du moteur est dans le total sans ligne (le prix de base affich\u00E9 est la somme des plans) ; d'autres modules qui\n     r\u00E9\u00E9crivent le titre d'apr\u00E8s S.optionsTotalCents l'y comptaient (\u00AB +-78,20 \u20AC \u00BB) */\n  function resumeVisible(A) {\n    if (!enOption(A) || etat(A) || ilotOk(A)) return;\n    titreLignes(document.getElementById('td-options'));\n  }\n  /* titre = somme des lignes visibles ; aussi en droit quand un fini compris a retir\u00E9 des chants de \u00AB Chants supp. \u00BB (le\n     moteur avait d\u00E9j\u00E0 \u00E9crit le titre avec eux) */\n  function titreLignes(td) {\n    var sum = td && td.querySelector('.td-options-dropdown > summary'); if (!sum) return;\n    var tot = 0, n = 0, info = 0;\n    Array.prototype.forEach.call(td.querySelectorAll('.td-options-list li'), function (li) {\n      if (li.hidden || li.style.display === 'none' || (li.closest && li.closest('[hidden]'))) return;\n      if (li.hasAttribute('data-cp-info')) { info++; return; }         /* A-299 cas 2 et 3 : pi\u00E8ce finie sur 4 c\u00F4t\u00E9s, prix dans le prix de base */\n      var m = li.textContent.replace(/\\s+/g, ' ').match(/([+\\-\u2212])\\s?([\\d\\s  .]+,\\d{2})\\s?\u20AC\\s*$/);\n      if (m) { n++; tot += (m[1] === '+' ? 1 : -1) * Math.round(parseFloat(m[2].replace(/[\\s  .]/g, '').replace(',', '.')) * 100); }\n    });\n    if (!n && !info) {                                                 /* plus aucune ligne visible (chants compris retir\u00E9s) : \u00AB \u2014 \u00BB */\n      var det = td.querySelector('.td-options-dropdown'), garde = Array.prototype.slice.call(td.querySelectorAll('.td-options-list')).filter(function (u) { return u.closest('[hidden]') || u.hidden; });\n      if (det && !garde.length) { det.parentNode.replaceChild(document.createTextNode('\u2014'), det); }\n      return;\n    }\n    /* L73 : le signe du total, jamais \u00AB +- \u00BB ; F12 (COMMERCIAL) : que des lignes d'information, \u00AB \u2014 \u00BB, jamais \u00AB +0,00 \u20AC \u00BB */\n    var t = n ? 'Suppl\u00E9ments : ' + signeEur(tot) + '\u20AC' : 'Suppl\u00E9ments : \u2014';\n    if (sum.textContent !== t) sum.textContent = t;\n  }\n  /* ligne visible de #td-options (liste du moteur, sinon cr\u00E9\u00E9e) ; le total des suppl\u00E9ments est d\u00E9j\u00E0 dans S.optionsTotalCents */\n  function ligneOption(td, S, line) {\n    var ul = td.querySelector('.td-options-list:not(.cp-ilot-opt)');\n    if (ul) { var li = document.createElement('li'); li.textContent = line; ul.appendChild(li); }\n    else {\n      td.innerHTML = '<details class=\"td-options-dropdown\" open><summary></summary><div class=\"td-options-scroll\"><ul class=\"td-options-list\"><li></li></ul></div></details>';\n      td.querySelector('li').textContent = line;\n    }\n    var sum = td.querySelector('.td-options-dropdown > summary');\n    if (sum) sum.textContent = 'Suppl\u00E9ments : ' + signeEur(num(S.optionsTotalCents)) + '\u20AC';   /* L73 */\n  }\n  function signeEur(c) { return (c < 0 ? '\u2212' : '+') + fmt(Math.abs(c)); }   /* \u00AB +12,00 \u00BB, \u00AB \u221278,20 \u00BB (fmt \u00E9crit \u00AB -78,20 \u00BB) */\n\n  /* une seule profondeur pour tout le L ou le U (pi\u00E8ce d'angle 105 \u00D7 105) : la profondeur saisie sur une branche\n     s'applique aux autres, cotes hors tout gard\u00E9es (les murs ne bougent pas). Le moteur garde des longueurs int\u00E9rieures :\n     L : L2 = retour hors tout \u2212 P ; U : Lc = largeur hors tout \u2212 2 P, Lg / Ld = jambes hors tout \u2212 P. En entrant dans\n     la forme : profondeur du plan (P1, Pc) pour toutes. */\n  function horsTout(S) {\n    return S.layout === 'angle' ? { ret: num(S.L2) + num(S.P1) }\n      : { W: num(S.Pl) + num(S.Lc) + num(S.Pr), g: num(S.Pc) + num(S.Lg), d: num(S.Pc) + num(S.Ld) };\n  }\n  function syncProf(A) {\n    var S = A.S, lay = S.layout, snap = A.__cpPierreSnap;\n    if (lay !== 'angle' && lay !== 'u-shape') { A.__cpPierreSnap = null; return; }\n    var keys = lay === 'angle' ? ['P1', 'P2'] : ['Pc', 'Pl', 'Pr'], cur = keys.map(function (k) { return num(S[k]); });\n    var cible = null, garde = null;\n    if (!snap || snap.lay !== lay) { cible = cur[0]; garde = horsTout(S); }\n    else {\n      for (var i = 0; i < keys.length; i++) if (cur[i] !== snap.p[i]) { cible = cur[i]; garde = snap.ht; break; }\n    }\n    /* pi\u00E8ce d'angle en option : chaque plan joint garde sa profondeur. A-429 (AUDIT Tours 1213 et 1215) : aussi au-del\u00E0 de\n       P_MAX, comme le stratifi\u00E9 ; la pi\u00E8ce plus profonde est seule finie sur 4 c\u00F4t\u00E9s, au m\u00B2 (partieIlot), et une cote ne\n       change jamais une autre pi\u00E8ce */\n    if (cible != null && PA_OPT) cible = null;\n    if (cible != null) {\n      keys.forEach(function (k) { S[k] = cible; });\n      if (lay === 'angle') S.L2 = garde.ret - cible;\n      else { S.Lc = garde.W - 2 * cible; S.Lg = garde.g - cible; S.Ld = garde.d - cible; }\n      var n = document.getElementById('cp-l1-note'); if (n && n.parentNode) n.parentNode.removeChild(n);   /* cotes hors tout gard\u00E9es : la note de changement n'a plus lieu */\n    }\n    A.__cpPierreSnap = { lay: lay, p: keys.map(function (k) { return num(S[k]); }), ht: horsTout(S) };\n  }\n\n  function wrap(A) {\n    if (A.__cpPierreWrapped) return;\n    A.__cpPierreWrapped = true;\n    lireRegle(A); injectCss();\n    /* suppl\u00E9ment ajout\u00E9 apr\u00E8s le calcul du moteur, dans le m\u00EAme total (prix affich\u00E9, panier, contr\u00F4le d'int\u00E9grit\u00E9) */\n    var origOpts = A.updateTdOptionsList;\n    A.updateTdOptionsList = function () {\n      lireRegle(this);\n      var r = origOpts.apply(this, arguments), f = forme(this);\n      if (this.__cpFauxChanfreins) {                                    /* U-185 : les hors \u00E9querre compt\u00E9s comme chanfreins par le moteur en sortent */\n        var tdf = document.getElementById('td-options'), uf = Math.round(num(this._eff && this._eff.edgePricesEuro && this._eff.edgePricesEuro.bevel) * 100);\n        var nf = tdf ? retireLigne(tdf, /^Chanfreins?$/, this.__cpFauxChanfreins) : 0;\n        this.S.optionsTotalCents = Number(this.S.optionsTotalCents || 0) - nf * uf;\n      }\n      if ((f === 'angle' || f === 'u-shape' || f === 'g-shape') && !etat(this) && !ilotOk(this) && enOption(this)) {\n        /* plans joints : pi\u00E8ces d'angle choisies en ligne visible ; l'\u00E9cart entre la somme des plans (tranche et minimum de\n           chacun) et le prix de base du moteur rejoint le m\u00EAme total, sans ligne (le prix de base affich\u00E9 est la somme) */\n        var co = compoOption(this);\n        if (co) {\n          if (co.pa) {\n            this.S.optionsTotalCents = Number(this.S.optionsTotalCents || 0) + co.pa_cents;\n            var tdp = document.getElementById('td-options');\n            /* A-345 (COMMERCIAL) : la pi\u00E8ce du tarif, avant en biais ; \u00E0 plusieurs, \u00AB 2 \u00D7 869 \u20AC = +1 738,00 \u20AC \u00BB (format du lot 2) */\n            var pu = Math.round(co.pa_cents / co.pa), puT = pu % 100 ? fmt(pu) : fmtMm(pu / 100), quoi = ' (' + fmtMm(PIECE) + ' mm contre chaque mur, avant en biais) : ';\n            if (tdp) ligneOption(tdp, this.S, (co.pa > 1 ? 'Pi\u00E8ces d\\'angle' + quoi + co.pa + ' \u00D7 ' + puT + '\u00A0\u20AC = +' : 'Pi\u00E8ce d\\'angle' + quoi + '+') + fmt(co.pa_cents) + '\u20AC');\n          }\n          this.S.optionsTotalCents = Number(this.S.optionsTotalCents || 0) + co.ecart_cents;\n          var f4 = finies4(this);\n          if (f4.length) {                                               /* pi\u00E8ces finies sur 4 c\u00F4t\u00E9s : leurs chants sont compris (le moteur les compte, case coch\u00E9e sans verrou) */\n            var self = this, ks = [];\n            f4.forEach(function (p) {\n              var b = boutPiece(self, p);\n              [clesArrP(self, p), b && b.k].forEach(function (k) {\n                var cb = k && self.dims && self.dims.querySelector('.edge-checkbox-visual[data-edge=\"' + k + '\"]');\n                if (cb && ks.indexOf(k) < 0 && self.S.edgeBanding && self.S.edgeBanding[k] && cb.classList.contains('checked') && ['locked', 'forceAll', 'depthThreshold'].indexOf(cb.dataset.forceReason) < 0) ks.push(k);\n              });\n            });\n            if (ks.length) {\n              this.S.optionsTotalCents = Number(this.S.optionsTotalCents || 0) - Math.round(ks.length * num(this._eff && this._eff.edgeBandingUnitEuro) * 100);\n              var tdc = document.getElementById('td-options'); if (tdc) retireChants(tdc, ks.length, ks, this);\n            }\n            /* A-299 cas 2 et 3 (AUDIT Tour 625) : une ligne visible par pi\u00E8ce finie sur 4 c\u00F4t\u00E9s, au format d'A-316 ; son prix\n               est dans le prix de base (sans signe : ni suppl\u00E9ment ni annonce ne la comptent, data-cp-info). Textes de\n               COMMERCIAL (F1, F2) : la raison entre parenth\u00E8ses ; plancher D9b : \u00AB au m\u00E8tre lin\u00E9aire, son prix minimum \u00BB */\n            var tdf = document.getElementById('td-options'), pu4 = function (u) { return u % 1 ? u.toFixed(2).replace('.', ',') : fmtMm(u); };\n            var raison = function (id) {\n              if (partieIlot(self, id)) return 'plus de ' + fmtMm(P_MAX) + ' mm de profondeur';   /* A-313 (COMMERCIAL \u00A7 1.2) */\n              var pc = parCoin(self, id); return !pc ? 'chant arri\u00E8re' : pc.coin && coinsJn(self)[pc.coin] ? 'coin arrondi au coin ext\u00E9rieur' : 'coin arrondi au coin arri\u00E8re';\n            };\n            if (tdf) co.plans.filter(function (q) { return q.arr && q.facture_mm > 0; }).forEach(function (q) {\n              var n = nomF4(self, q.id || ''), N = cap(n) + ' ' + finiF4(n) + ' sur 4 c\u00F4t\u00E9s (' + raison(q.id) + ')';\n              var t = q.d9b ? N + ', au m\u00E8tre lin\u00E9aire, son prix minimum : ' + fmt(Math.round(q.facture_mm / 10)) + ' ml \u00D7 ' + pu4(q.prix_cm) + ' \u20AC = ' + fmt(q.cents) + ' \u20AC'\n                : N + ', au m\u00B2 : ' + mTxt(q.facture_mm) + ' m \u00D7 ' + mTxt(q.P) + ' m \u00D7 ' + fmtM2(q.m2) + ' \u20AC/m\u00B2 = ' + fmt(q.cents) + ' \u20AC';\n              ligneOption(tdf, self.S, t);\n              var lis = tdf.querySelectorAll('.td-options-list:not(.cp-ilot-opt) li'), li = lis[lis.length - 1]; if (li) li.setAttribute('data-cp-info', '1');\n            });\n            if (tdf) titreLignes(tdf);                                   /* F12 : que des lignes d'information, \u00AB Suppl\u00E9ments : \u2014 \u00BB */\n          }\n        }\n      } else if ((f === 'angle' || f === 'u-shape') && !etat(this) && !ilotOk(this)) {\n        var c = composition(this);\n        if (c && c.supplement_cents) {\n          this.S.optionsTotalCents = Number(this.S.optionsTotalCents || 0) + c.supplement_cents;\n          var td = document.getElementById('td-options');\n          /* L74 (lot \u00AB messages 1 \u00BB) : le montant est l'\u00E9cart avec le plan au m\u00E8tre, pas le prix de la pi\u00E8ce : le texte le dit ; le\n             signe \u00AB \u2212 \u00BB s'affiche */\n          if (td) ligneOption(td, this.S, (c.coins > 1 ? 'Pi\u00E8ces d\\'angle ' + paTxt() + ' cm (\u00D7' + c.coins + '), \u00E0 la place de la longueur au m\u00E8tre : ' : 'Pi\u00E8ce d\\'angle ' + paTxt() + ' cm, \u00E0 la place de la longueur au m\u00E8tre : ') +\n            signeEur(c.supplement_cents) + '\u20AC');\n        }\n      }\n      /* bouts : coin arrondi, hors \u00E9querre (fini ou brut) : une ligne nomm\u00E9e chacun, leur prix ajout\u00E9 au total. Fini droit : c'est le\n         chant du moteur, d\u00E9j\u00E0 dans son total et sur sa ligne \u00AB Chants supp. \u00BB ; seulement si la r\u00E8gle lui donne un autre\n         prix que le chant, il en sort pour sa propre ligne, l'\u00E9cart ajout\u00E9 au total ; compris (0 \u20AC) : il en sort aussi,\n         sans ligne (\u00AB (compris) \u00BB au r\u00E9capitulatif des bouts), le chant compt\u00E9 par le moteur retir\u00E9 du total */\n      if (!etat(this)) {\n        var S0 = this.S, self0 = this, tdb = document.getElementById('td-options'), aPart = finiAPart(this);\n        var sorti = function (b) { return b.c === 'fini' && aPart && (b.prix > 0 || FINI_COMPRIS); };\n        var finis = bouts(this).filter(sorti);\n        var unitChant = num(this._eff && this._eff.edgeBandingUnitEuro);\n        /* chant d'un bout fini retir\u00E9 seulement s'il est coch\u00E9 ET compt\u00E9 sur la ligne \u00AB Chants supp. \u00BB du moteur (sinon\n           les chants retir\u00E9s deux fois : A-271, L o\u00F9 le moteur ne les avait pas compt\u00E9s) */\n        var cochesK = finis.filter(function (b) { return S0.edgeBanding && S0.edgeBanding[b.k]; }).map(function (b) { return b.k; }), coches = cochesK.length;\n        var ote = !coches ? 0 : tdb ? retireChants(tdb, coches, cochesK, this) : coches;\n        bouts(this).forEach(function (b) {\n          if (b.c === 'fini' ? !sorti(b) : !(b.prix > 0)) return;\n          /* fini : son prix (\u00AB Bout fini droit \u00BB, 0 si compris), le chant du moteur retir\u00E9 une fois plus bas */\n          S0.optionsTotalCents = Number(S0.optionsTotalCents || 0) + Math.round(b.prix * 100);\n          /* \u00AB Bout gauche, coin avant, hors \u00E9querre 85\u00B0 : +169,00 \u20AC \u00BB (AUDIT Tour 480 ; T4 du lot \u00AB messages 2 \u00BB : une virgule\n             \u00E0 la place du 1er \u00AB : \u00BB) */\n          if (tdb && b.prix > 0) ligneOption(tdb, S0, ligneBout(self0, b) + ' : +' + fmt(Math.round(b.prix * 100)) + '\u00A0\u20AC');\n        });\n        S0.optionsTotalCents = Number(S0.optionsTotalCents || 0) - Math.round(ote * unitChant * 100);\n        /* D11 : finition lat\u00E9rale d'un bout fa\u00E7onn\u00E9, sur sa propre ligne, apr\u00E8s celle de son fa\u00E7onnage */\n        bouts(this).forEach(function (b) {\n          var ff = Math.round(finitionFacon(self0, b) * 100); if (!(ff > 0)) return;\n          S0.optionsTotalCents = Number(S0.optionsTotalCents || 0) + ff;\n          if (tdb) ligneOption(tdb, S0, 'Chant du ' + nomCote(b.nom) + ' (avec ' + faconDe(b) + ') : +' + fmt(ff) + ' \u20AC');   /* R148-b2 (COMMERCIAL Tour 212) */\n        });\n        rondsFini4(this).forEach(function (b) {                         /* A-291 : coins arrondis du plan (ou du retour) fini sur 4 c\u00F4t\u00E9s, un prix par coin */\n          S0.optionsTotalCents = Number(S0.optionsTotalCents || 0) + Math.round(b.prix * 100);\n          if (tdb) ligneOption(tdb, S0, ligneBout(self0, b) + ' : +' + fmt(Math.round(b.prix * 100)) + '\u00A0\u20AC');   /* T4 */\n        });\n        /* hors \u00E9querre ou coin arrondi du bout : au seul prix du bout ; le chant que le moteur coche d'office pr\u00E8s d'un coin\n           usin\u00E9 (\u00AB forc\u00E9 par un coin \u00BB) sort de \u00AB Chants supp. \u00BB */\n        var lf = livresFinis(this), forcesK = bouts(this).filter(function (b) { return (b.c === 'hors' || b.c === 'arrondi' || (lf[b.k] && b.c !== 'fini')) && S0.edgeBanding && S0.edgeBanding[b.k]; }).map(function (b) { return b.k; }), forces = forcesK.length;\n        if (forces) { var o2 = tdb ? retireChants(tdb, forces, forcesK, this) : forces; S0.optionsTotalCents = Number(S0.optionsTotalCents || 0) - Math.round(o2 * unitChant * 100); }\n        if (tdb && (finis.length || forces)) titreLignes(tdb);\n      }\n      /* \u00EElot : l'\u00E9cart jusqu'au prix au m\u00B2 dans le m\u00EAme total. Au r\u00E9capitulatif, \u00AB Suppl\u00E9ments : \u2014 \u00BB (les 4 chants compris\n         sont dits au prix de base) ; la ligne \u00AB \u00CElot : 4 chants compris \u00BB reste dans la liste, cach\u00E9e \u00E0 l'\u0153il et aux lecteurs\n         d'\u00E9cran : la propri\u00E9t\u00E9 \u00AB Options \u00BB du panier et _cfg_model la lisent (textContent) */\n      var il = etat(this) ? null : ilot(this);\n      if (il) {\n        this.S.optionsTotalCents = Number(this.S.optionsTotalCents || 0) + il.supplement_cents;\n        var tdi = document.getElementById('td-options');\n        if (tdi) {\n          var lt = il.forme ? 'Plan en ' + il.forme + ' : tous les c\u00F4t\u00E9s finis, compris' : fini4Office(this, il) ? 'Plan fini sur 4 c\u00F4t\u00E9s (profondeur ' + fmtMm(il.P) + ' mm) : ' + ARR_COMPRIS\n            : il.arriere ? FINI4 + ' : ' + ARR_COMPRIS : 'Plan fini sur 4 c\u00F4t\u00E9s : chants compris', ul0 = tdi.querySelector('.td-options-list');   /* A-370 */\n          if (ul0 && ul0.querySelector('li')) { var li0 = document.createElement('li'); li0.textContent = lt; li0.hidden = true; li0.style.display = 'none'; li0.setAttribute('aria-hidden', 'true'); ul0.appendChild(li0); }   /* autres options : gard\u00E9es */\n          else { tdi.innerHTML = '<ul class=\"td-options-list cp-ilot-opt\" hidden aria-hidden=\"true\" style=\"display:none\"><li></li></ul>\u2014'; tdi.querySelector('li').textContent = lt; }\n        }\n      }\n      /* G, retour fini sur 4 c\u00F4t\u00E9s : sa ligne, cach\u00E9e, pour \u00AB Options \u00BB de la commande (comme l'\u00EElot). Sans autre ligne\n         visible, la liste du moteur restait vide et \u00AB Options \u00BB reprenait le titre (\u00AB Suppl\u00E9ments : +118,00 \u20AC \u00BB) */\n      try {\n        if (!etat(this) && arrG(this)) {\n          var tdh = document.getElementById('td-options'), LG = 'Retour fini sur 4 c\u00F4t\u00E9s (chant arri\u00E8re) : chants compris';\n          if (tdh) {\n            var ulv = tdh.querySelector('.td-options-list:not(.cp-ilot-opt)');\n            var vis = ulv && Array.prototype.some.call(ulv.querySelectorAll('li'), function (li) { return !li.hidden && li.style.display !== 'none'; });\n            if (vis) { var lih = document.createElement('li'); lih.textContent = LG; lih.hidden = true; lih.style.display = 'none'; lih.setAttribute('aria-hidden', 'true'); ulv.appendChild(lih); }\n            else { tdh.innerHTML = '<ul class=\"td-options-list cp-ilot-opt\" hidden aria-hidden=\"true\" style=\"display:none\"><li></li></ul>\u2014'; tdh.querySelector('li').textContent = LG; }\n          }\n        }\n      } catch (e) {}\n      try { masquePrix(); } catch (e) {}\n      /* titre \u00AB Suppl\u00E9ments \u00BB des plans joints : aussi quand la liste est recalcul\u00E9e sans rendu (clic \u00AB Ajouter au\n         panier \u00BB) ; apr\u00E8s les modules qui r\u00E9\u00E9crivent le titre par-dessus celui-ci */\n      var selfO = this; Promise.resolve().then(function () { try { resumeVisible(selfO); } catch (e) {} });\n      return r;\n    };\n    /* D10 v2 : rect de la pi\u00E8ce de chaque coin, tel que le moteur le donne au carr\u00E9 vert (bornes de la fen\u00EAtre du badge) */\n    var origHit = A.addHit;\n    if (typeof origHit === 'function') A.addHit = function (x, y, w, h, id, rect, corner) { (this.__cpHits = this.__cpHits || {})[id] = { rect: rect, corner: corner }; return origHit.apply(this, arguments); };\n    /* R208 (Romain : \u00AB erreur type de chant/bord \u00BB ; AUDIT Tour 1191) : le c\u00F4t\u00E9 d'un bout livr\u00E9 fini par la fa\u00E7on de son coin (coin\n       arrondi, demi-rond ; D11, A-283) est factur\u00E9 fini mais n'est pas un chant du moteur (syncBouts), qui ne dessinait donc pas son\n       trait. Le temps du dessin du moteur seulement, sa cl\u00E9 est chant\u00E9e, puis rendue : trait fini sur tout le c\u00F4t\u00E9, comme un chant\n       coch\u00E9 \u00E0 la main ; prix, Options et cases ne bougent pas (le calcul vient apr\u00E8s le dessin) */\n    ['renderLinear', 'renderAngle', 'renderU', 'renderG'].forEach(function (fn) {\n      var o = A[fn]; if (typeof o !== 'function') return;\n      A[fn] = function () {\n        var S = this.S, eb = S.edgeBanding = S.edgeBanding || {}, mis = [];\n        try {\n          var et = etat(this);\n          if (!(et && et.mode === 'devis')) { var lf = livresFinis(this); bouts(this).forEach(function (b) { if ((b.c === 'arrondi' || lf[b.k]) && !eb[b.k]) { eb[b.k] = true; mis.push(b.k); } }); }\n        } catch (e) { console.warn('[cp-pierre]', e); }\n        var self = this;\n        try { return o.apply(this, arguments); } finally {\n          mis.forEach(function (k) {                                       /* la case reste celle d'avant (pastilles la dit) : pas un chant compt\u00E9 */\n            eb[k] = false;\n            var cb = self.dims && self.dims.querySelector('.edge-checkbox-visual[data-edge=\"' + k + '\"]'); if (cb) cb.classList.remove('checked');\n          });\n        }\n      };\n    });\n    var origRender = A.render;\n    A.render = function () {\n      lireRegle(this); menuDevis(); typesU(this); selMenu(this);\n      var S = this.S, lay = S.layout;\n      if (PA_OPT && S.cpPA && S.cpPA[lay] && (!PA_PROP || prixPiece(this) == null)) S.cpPA[lay] = {};   /* pi\u00E8ce d'angle non propos\u00E9e, ou d\u00E9cor sans son prix : plans joints */\n      /* chants : \u00E0 chaque changement de forme, seuls les chants inclus (verrouill\u00E9s par la r\u00E8gle, recoch\u00E9s par le\n         moteur) ; les cl\u00E9s passent d'une forme \u00E0 l'autre (\u00AB front \u00BB = avant en droit, bout de jambe en U) et un bout\n         aurait \u00E9t\u00E9 factur\u00E9 d'office. Faces contre le mur : jamais coch\u00E9es. */\n      var pierre = PA_ON || ILOT_ON;                     /* faces contre le mur et chants inclus : le mod\u00E8le de la pierre, pas des bouts seuls */\n      if (this.__cpPierreLay !== lay) {\n        if (pierre && this.__cpPierreLay && (lay === 'angle' || lay === 'u-shape' || lay === 'linear' || lay === 'g-shape')) { S.edgeBanding = {}; S.edgeBandingByEdge = {}; S.cpForceP = {}; }\n        this.__cpPierreLay = lay;\n      }\n      if (pierre && !ilotOk(this)) murs(lay).forEach(function (k) { if (S.edgeBanding) delete S.edgeBanding[k]; if (S.edgeBandingByEdge) delete S.edgeBandingByEdge[k]; });   /* \u00EElot : finies, comprises */\n      /* profondeur unique en L et U : mod\u00E8le de la pierre seulement (pi\u00E8ce d'angle ou \u00EElot) ; bouts seuls (stratifi\u00E9, H1) : chaque branche garde la sienne */\n      try { if (pierre) syncProf(this); syncCoins(this); garderCotes(this); syncBouts(this); syncFini4(this); decocheMasques(this); syncArrCotes(this); } catch (e) { console.warn('[cp-pierre]', e); }\n      /* A-428 : le chant arri\u00E8re vient peut-\u00EAtre de changer (coin rond pos\u00E9 ou retir\u00E9 au coin arri\u00E8re) : verrou des c\u00F4t\u00E9s impos\u00E9s\n         (R182-a, cp-modele) repos\u00E9 avant le dessin et le compte du moteur */\n      try { if (typeof window.CP_appliqueParEp === 'function') window.CP_appliqueParEp(this); } catch (e) { console.warn('[cp-pierre]', e); }\n      /* A-291 : chant arri\u00E8re coch\u00E9 ou rendu par un coin arrondi (syncCoins) : chants impos\u00E9s par la profondeur d\u00E8s ce rendu */\n      if (ILOT_ON && ILOT_CHANTS && this._eff) this._eff.forceBandingFromDepth = arriere(this) ? Math.min(ILOT_MIN, num(S.P)) : ILOT_MIN;\n      /* AUDIT Tour 1223 : en plans joints, la profondeur se r\u00E8gle pi\u00E8ce par pi\u00E8ce (syncProfPieces, poseProfPieces) */\n      if (parPiece(this) && this._eff) this._eff.forceBandingFromDepth = 0;\n      try { syncProfPieces(this); } catch (e) { console.warn('[cp-pierre]', e); }\n      verrouArr(this);                                   /* A-296 : sans \u00AB chants compris \u00BB, l'arri\u00E8re seul, par le verrou du moteur */\n      var mq = function () {}, sfr = function () {}, mg = function () {}, mp = function () {}, r;\n      try { var sf = sansForcage(this); if (sf) sfr = poseSansForcage(this, sf); } catch (e) { console.warn('[cp-pierre]', e); }\n      try { var pm = poseMursG(this); if (pm) mg = pm; } catch (e) { console.warn('[cp-pierre]', e); }   /* A-313 : faces contre le mur */\n      try { mq = masqueBiais(this); } catch (e) { console.warn('[cp-pierre]', e); }\n      try { var pp = poseProfPieces(this); if (pp) mp = pp; } catch (e) { console.warn('[cp-pierre]', e); }   /* pos\u00E9 en dernier : les autres voient la raison, comme celle du moteur */\n      try { r = origRender.apply(this, arguments); } finally { mp(); mq(); mg(); sfr(); }\n      try { if (releveMursG(this)) { var self = this; setTimeout(function () { self.render(); }, 0); } } catch (e) { console.warn('[cp-pierre]', e); }\n      if (this.__cpBulle) { var tb = this.__cpBulle; this.__cpBulle = null; setTimeout(function () { toastBout(tb); }, 0); }   /* A-294 : refus ou coupe retir\u00E9e, dits */\n      try { bouts(this).forEach(function (b) { if (b.c === 'hors' && S.edgeBanding) S.edgeBanding[b.k] = false; }); } catch (e) {}   /* hors \u00E9querre : plus de bord droit, donc pas de chant (la coupe a son prix) */\n      try { if (sf && sf.otes && S.edgeBanding) Object.keys(sf.otes).forEach(function (k) { var c = S.edgeBanding[k] && this.dims && this.dims.querySelector('.edge-checkbox-visual.checked[data-edge=\"' + k + '\"]'); if (!c) S.edgeBanding[k] = false; }, this); } catch (e) {}   /* chant retir\u00E9 par nous, recoch\u00E9 par le moteur sans case coch\u00E9e : hors du mod\u00E8le */\n      try { cacheMurs(pierre ? lay : null, ilotOk(this)); cssMasques(this); ilotUi(this); noteEtat(this); ligneCompo(this); prixBase(this); masquePrix(); dessin(this); pastilles(this); nommerArrG(); resumeVisible(this); } catch (e) { console.warn('[cp-pierre]', e); }\n      try { chantsVus(this); } catch (e) { console.warn('[cp-pierre] chants', e); }   /* R202 : ce qui est fini et ce qui se coche, pr\u00E8s du dessin */\n      try { anglesCoins(this); } catch (e) { console.warn('[cp-pierre] angles', e); }   /* D10 : saisie d'angle \u00E0 chaque coin de bout */\n      try { anglesInt(this); } catch (e) { console.warn('[cp-pierre] angles int\u00E9rieurs', e); }   /* D12 : badge de chaque angle int\u00E9rieur */\n      try { aideAngles(this); } catch (e) {}                             /* A-371 : la ligne d'aide suit les badges */\n      return r;\n    };\n    /* carr\u00E9 vert : hors \u00E9querre aux coins avant et arri\u00E8re d'un bout, coin arrondi au coin avant ; fen\u00EAtre de leur cote */\n    var oEP = A.showEdgePopup;\n    if (typeof oEP === 'function') A.showEdgePopup = function (rect, corner, key) {\n      badgeOuvert = null; intOuvert = null; if (this.edgePopup) this.edgePopup.__cpInt = null;   /* fen\u00EAtre du carr\u00E9 vert : pas celle d'un badge */\n      var t = this.S.edges[key], hb = (t === 'biais' || (t === 'round1' && modeU(this))) ? boutDeCoin(this, key) : null;\n      if (!hb && t === 'round1' && modeU(this)) hb = coinFini4(this, key);   /* A-291 : coin arrondi du plan fini sur 4 c\u00F4t\u00E9s */\n      var b = hb ? hb.b : null;\n      var r = oEP.apply(this, arguments);\n      if (b) try { fenetreCoin(this, key, t, b, rect, hb ? hb.sens : 1); } catch (e) { console.warn('[cp-pierre]', e); }\n      return r;\n    };\n    ['updateDisplayedMultiTotal', 'updateTdLongueurTotal', 'updateTdPrixBase'].forEach(function (fn) {\n      var o = A[fn]; if (typeof o !== 'function') return;\n      A[fn] = function () { var r = o.apply(this, arguments); try { prixBase(this); masquePrix(); } catch (e) {} return r; };\n    });\n    /* commande : pi\u00E8ces num\u00E9rot\u00E9es comme sur le dessin ; pas de \u00AB Jonction \u00BB (la pi\u00E8ce d'angle n'en a pas) */\n    var origProps = A.buildLineItemProperties;\n    if (typeof origProps === 'function') A.buildLineItemProperties = async function () {\n      lireRegle(this);\n      var p = await origProps.apply(this, arguments), f = forme(this);\n      try {\n        if (p && (f === 'angle' || f === 'u-shape' || f === 'g-shape') && toutPA(this)) delete p['Jonction'];   /* plans joints : la jonction reste */\n        var il = etat(this) ? null : ilot(this);                          /* \u00EElot : le calcul, pour l'atelier et le contr\u00F4le */\n        if (p && (f === 'angle' || f === 'u-shape' || (f === 'g-shape' && enOption(this)))) {   /* pi\u00E8ces num\u00E9rot\u00E9es ; en \u00EElot, avec leurs jonctions */\n          /* lot \u00AB messages 2 \u00BB, N29 (AUDIT Tour 616, point 3) : \u00AB Composition \u00BB, visible, dit les pi\u00E8ces comme le dessin ; le\n             texte num\u00E9rot\u00E9 de l'atelier passe dans \u00AB _composition \u00BB, cach\u00E9 (outil A-175 d'ADMIN) */\n          var compo = function (vu, atelier) { if (vu) p['Composition'] = vu; if (atelier) p['_composition'] = atelier; };\n          if (il) compo(texteIlot(this), texteIlot(this, true));\n          else if (enOption(this)) compo(texteOption(this, false), texteOption(this, true));\n          else if (prixPiece(this) != null) compo(texteDecoupe(this, true), texteDecoupe(this));\n        }\n        if (p && il && il.arriere) {                                       /* chant arri\u00E8re : pas le mot \u00AB \u00EElot \u00BB pour le client */\n          p[ILOT_CHANTS ? 'Plan fini 4 c\u00F4t\u00E9s' : 'Plan avec chant arri\u00E8re'] = (fini4Office(this, il) ? 'Profondeur ' : 'Chant arri\u00E8re, profondeur ') + fmtMm(il.P) + ' mm, ' + ARR_COMPRIS + ' : ' + il.texte;   /* A-296 : c\u00F4t\u00E9s au choix, dits par \u00AB Chants supp. \u00BB ; A-370 : d'office, \u00AB Profondeur \u2026 \u00BB */\n          p['_ilot'] = '\u00CElot de ' + fmtMm(il.P) + ' mm, ' + ARR_COMPRIS + ' : ' + (il.d9b ? il.d9b.texte_m2 : il.texte);   /* m\u00EAme calcul, format de l'\u00EElot (contr\u00F4le des commandes) */\n          if (il.d9b) p['_d9b'] = 'Prix au m\u00E8tre retenu (plus \u00E9lev\u00E9 que le m\u00B2) : ' + il.texte + ' (au m\u00B2 : ' + fmt(il.d9b.m2_cents) + ' \u20AC)';   /* D9b : contr\u00F4le des commandes, atelier (m\u00EAme texte qu'avant) */\n          if (il.base === 'mlTarif') {                                    /* R182-b (COMMERCIAL, \u00AB R\u00E8gle finale \u00BB) : les chants dits ; la profondeur factur\u00E9e pour l'atelier */\n            var cg = !!(this.S.edgeBanding && this.S.edgeBanding.sides) || arrCotes(this), cd = !!(this.S.edgeBanding && this.S.edgeBanding.right) || arrCotes(this);\n            p['Chants'] = ['Avant : fini (compris)', 'arri\u00E8re : fini (compris)'].concat(cg ? ['c\u00F4t\u00E9 gauche : fini'] : [], cd ? ['c\u00F4t\u00E9 droit : fini'] : []).join(' ; ');\n            p['_ilot'] = '\u00CElot de ' + fmtMm(il.P) + ' mm, ' + ARR_COMPRIS + (il.P_facture !== il.P ? ', factur\u00E9 en ' + fmtMm(il.P_facture) + ' mm' : '') + ' : ' + il.texte_m2;   /* en 900 : le texte d'avant, \u00E0 l'octet */\n          }\n        } else if (p && f === 'g-shape' && enOption(this)) {             /* D9b, retour du G au prix au m\u00E8tre : la comparaison pour le contr\u00F4le et l'atelier */\n          var coG = compoOption(this), rg = coG && coG.plans.filter(function (x) { return x.arr && x.d9b; })[0];\n          if (rg) p['_d9b'] = 'Retour fini sur 4 c\u00F4t\u00E9s, prix au m\u00E8tre retenu (plus \u00E9lev\u00E9 que le m\u00B2) : ' + fmt(Math.round(rg.facture_mm / 10)) + ' ml \u00D7 ' +\n            (rg.prix_cm % 1 ? rg.prix_cm.toFixed(2).replace('.', ',') : fmtMm(rg.prix_cm)) + ' \u20AC = ' + fmt(rg.ml_cents) + ' \u20AC (au m\u00B2 : ' + fmt(rg.m2_cents) + ' \u20AC)';\n        }\n        if (p && il && !il.arriere) {                                     /* A-316 : \u00AB Plan fini \u00BB pour le client ; le texte de l'\u00EElot, inchang\u00E9, en propri\u00E9t\u00E9 cach\u00E9e (contr\u00F4le des commandes A-175, atelier) */\n          p['Plan fini'] = il.forme ? 'Plan en ' + il.forme + ' de ' + fmtMm(il.P) + ' mm de profondeur, tous les c\u00F4t\u00E9s finis : ' + il.texte\n            : 'Plan de ' + fmtMm(il.P) + ' mm de profondeur, fini sur 4 c\u00F4t\u00E9s : ' + il.texte;\n          p['_ilot'] = il.forme ? '\u00CElot en ' + il.forme + ' de ' + fmtMm(il.P) + ' mm, tous les chants compris : ' + il.texte\n            : '\u00CElot de ' + fmtMm(il.P) + ' mm, 4 chants compris : ' + il.texte;\n        }\n        var bs = etat(this) ? [] : bouts(this).filter(function (b) { return b.c !== 'sans'; }).concat(rondsFini4(this)), A0 = this;   /* bouts finis ou usin\u00E9s, avec leur cote et leur coin */\n        /* R148-a (COMMERCIAL, \u00A7 1 ; Tour 177) : \u00AB Bouts \u00BB devient 2 cl\u00E9s : \u00AB Chants \u00BB, les c\u00F4t\u00E9s finis (\u00AB C\u00F4t\u00E9 gauche : fini ; c\u00F4t\u00E9 droit :\n           fini (compris) \u00BB) ; \u00AB Usinage des coins \u00BB, les coins arrondis, bords en biais et hors \u00E9querre (\u00AB C\u00F4t\u00E9 gauche, coin avant : coin\n           arrondi, rayon 30 mm \u00BB). Dans chaque cl\u00E9, la 2e entr\u00E9e et les suivantes commencent par une minuscule */\n        var mn = function (s, k) { return k ? s.charAt(0).toLowerCase() + s.slice(1) : s; }, chant = function (b) { return b.c === 'fini' && !b.jonction; };\n        var bC = bs.filter(chant), bU = bs.filter(function (b) { return !chant(b); });\n        if (p && bC.length) p['Chants'] = bC.map(function (b, k) { return mn(nomPanier(A0, b) + ' : ' + textePanier(b), k); }).join(' ; ');\n        if (p && bU.length) p['Usinage des coins'] = bU.map(function (b, k) { return mn(nomPanier(A0, b) + ' : ' + textePanier(b), k); }).join(' ; ');\n      } catch (e) {}\n      return p;\n    };\n    menuDevis(); suisTitres();\n    try { A.render(); } catch (e) {}\n  }\n\n  /* garde panier : en capture sur window, avant le moteur (qui \u00E9coute en capture sur document) */\n  window.addEventListener('click', function (e) {\n    if (!(e.target && e.target.closest && e.target.closest('#btn-add-cart'))) return;\n    var A = getApp(); if (!A || !A.S || !A.__cpPierreWrapped) return;\n    lireRegle(A);\n    var ko = controles(A).filter(function (c) { return !c.ok; });\n    if (!ko.length) return;\n    e.preventDefault(); e.stopPropagation(); e.stopImmediatePropagation();\n    var ki = ko.filter(function (c) { return c.interne; })[0];             /* lot \u00AB messages 1 \u00BB : A2, puis le pr\u00E9fixe commun (point 7) */\n    var tko = ko.map(function (c) { return String(c.message).replace(/\\.\\s*$/, ''); }).join(' ; ');   /* A-385 : un seul point final */\n    if (window.CFG_UI) window.CFG_UI.toast(ki ? ki.message : 'Commande impossible en l\\'\u00E9tat : ' + tko + (/[.!?]$/.test(tko) ? '' : '.'), 'error', 9000);\n  }, true);\n\n  var tries = 0, timer = setInterval(function () {\n    var A = getApp();\n    if (A && A.S && A.render && A.updateTdOptionsList) { clearInterval(timer); wrap(A); }\n    else if (++tries > 400) clearInterval(timer);\n  }, 50);\n})();\n"],
  "mappings": "CAuCC,UAAY,CACX,aAKA,IAAI,MAAQ,GAAM,MAAQ,KAAM,UAAY,IAAK,MAAQ,IAAK,MAAQ,IAAK,OAAS,KAChF,QAAU,IACV,SAAW,KACf,SAAS,YAAa,CAAE,OAAO,SAAW,uBAAmB,SAAS,IAAM,gCAA6B,MAAM,SAAS,CAAC,EAAI,cAAgB,EAAI,CACjJ,IAAI,OAAS,GAAO,SAAW,IAAK,OAAS,EACzC,QAAU,GACV,QAAU,GAAO,SAAW,IAAK,SAAW,KAAM,YAAc,IAAK,YAAc,CAAE,OAAQ,GAAM,MAAO,GAAM,UAAW,EAAK,EAAG,YAAc,GACjJ,OAAS,EAAG,MAAQ,iDACpB,UAAY,GACZ,QAAU,EACV,YAAc,mBACd,QAAU,EACV,SAAW,GAAM,UAAY,CAAE,KAAM,GAAI,QAAS,GAAI,QAAS,GAAI,KAAM,EAAG,EAC5E,WAAa,GACb,aAAe,GACf,WAAa,GACb,OAAS,QACT,QAAU,iBAEd,SAAS,QAAS,CAAE,GAAI,CAAE,OAAQ,OAAO,IAAQ,IAAe,IAAM,OAAO,GAAK,MAAY,CAAE,OAAO,OAAO,GAAK,CAAE,CACrH,SAAS,IAAI,EAAG,CAAE,IAAI,EAAI,OAAO,CAAC,EAAG,OAAO,SAAS,CAAC,EAAI,EAAI,CAAG,CACjE,SAAS,IAAI,EAAG,CAAE,OAAQ,EAAI,KAAK,QAAQ,CAAC,EAAE,QAAQ,IAAK,GAAG,EAAE,QAAQ,wBAAyB,MAAG,CAAG,CACvG,SAAS,MAAM,EAAG,CAAE,OAAO,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,wBAAyB,MAAG,CAAG,CAE7F,SAAS,MAAM,EAAG,CAAE,IAAI,EAAI,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,MAAO,EAAE,EAAE,QAAQ,MAAO,EAAE,EAAE,MAAM,GAAG,EAAG,OAAO,MAAM,EAAE,CAAC,CAAC,GAAK,EAAE,CAAC,EAAI,IAAM,EAAE,CAAC,EAAI,GAAK,CAC/I,SAAS,MAAM,EAAG,CAEhB,QADI,GAAK,OAAO,GAAK,EAAE,MAAQ,EAAE,KAAK,mBAAmB,GAAK,EAAG,GAAM,OAAO,qBAAuB,OAAO,oBAAoB,iBAAoB,CAAC,EAC5I,EAAI,EAAG,EAAI,GAAG,OAAQ,IAAK,GAAI,OAAO,GAAG,CAAC,EAAE,YAAY,IAAM,GAAI,OAAO,GAAG,CAAC,EACtF,OAAO,IACT,CACA,SAAS,UAAU,EAAG,CACpB,IAAI,EAAI,MAAM,CAAC,EACf,GAAI,CAAC,GAAK,CAAC,EAAE,WAAY,CAAE,MAAQ,GAAO,QAAU,GAAO,SAAW,GAAO,WAAa,GAAO,WAAa,GAAO,OAAS,QAAS,MAAQ,CAC/I,IAAI,GAAK,EAAE,WAAY,GAAK,EAAE,MAAQ,CAAC,EAAG,GAAK,EAAE,OAAS,CAAC,EAAG,EAAI,EAAE,MAAQ,CAAC,EAC7E,OAAS,EAAE,eAAiB,QAC5B,MAAQ,GAAG,KAAO,GAAM,MAAQ,IAAI,GAAG,MAAM,GAAK,KAAM,UAAY,IAAI,GAAG,UAAU,EAAG,QAAU,IAAI,GAAG,SAAS,GAAK,IAAK,MAAQ,QACpI,QAAU,GAAG,WAAa,GAC1B,OAAS,QAAU,GAAG,SAAW,IAAQ,CAAC,SAAU,SAAW,IAAI,EAAE,YAAY,GAAK,IACtF,OAAS,IAAI,EAAE,YAAY,EAC3B,QAAU,IAAI,GAAG,WAAW,EAC5B,MAAQ,KAAK,IAAI,IAAI,EAAE,aAAe,EAAE,YAAY,GAAG,GAAK,IAAK,WAAW,CAAC,CAAC,EAC9E,OAAS,IAAI,EAAE,UAAU,EAAI,EAAI,IAAI,EAAE,UAAU,EAAK,IAAI,EAAE,cAAgB,EAAE,aAAa,GAAG,GAAK,KAGnG,SAAW,KACX,GAAI,CACF,IAAI,GAAK,EAAE,0BAA4B,EAAE,0BAA0B,EAAI,KAAM,GAAK,IAAM,OAAO,SAAW,OAAO,QAAQ,GAAG,KAAK,EAC7H,IAAM,IAAI,GAAG,CAAC,EAAI,GAAK,IAAI,GAAG,CAAC,EAAI,SAAU,OAAS,IAAI,GAAG,CAAC,EAAG,SAAW,CAAE,EAAG,OAAQ,IAAK,GAAG,SAAW,GAAG,KAAM,EAC3H,MAAY,CAAC,CACb,QAAU,GAAG,KAAO,GAAM,SAAW,IAAI,GAAG,IAAI,GAAK,IAAK,SAAW,IAAI,GAAG,GAAG,GAAK,KAAM,YAAc,IAAI,GAAG,KAAK,EACpH,YAAc,CAAE,OAAQ,GAAG,QAAU,GAAM,MAAO,GAAG,IAAM,GAAM,UAAW,GAAG,IAAM,EAAK,EAAG,YAAc,GAAG,SAAW,GACzH,OAAS,IAAI,GAAG,SAAS,EACzB,UAAY,SAAS,GAAG,aAAa,EACrC,QAAU,IAAI,GAAG,YAAY,EAG7B,MAAQ,YAAc,iDAA0C,SAAS,EAAI,kCAAiC,6BAC9G,YAAc,YAAc,mBAAqB,4BAI7C,CAAC,SAAW,EAAE,YAAY,OAAS,YAAY,SAAS,MAAI,MAAQ,KAAK,IAAI,QAAS,IAAI,EAAE,aAAe,EAAE,YAAY,GAAG,GAAK,OAAO,GAExI,SAAW,aAAe,EAAE,OAAM,EAAE,KAAK,sBAAwB,QAAQ,CAAC,EAAI,KAAK,IAAI,SAAU,IAAI,EAAE,EAAE,CAAC,CAAC,EAAI,UAI/G,SAAS,CAAC,GAAK,EAAE,OAAM,EAAE,KAAK,sBAAwB,GAC1D,UAAU,CAAC,EACX,SAAW,GAAG,KAAO,GACrB,WAAa,GAAG,aAAe,QAC/B,UAAY,CAAE,KAAM,IAAI,GAAG,OAAO,EAAG,QAAS,IAAI,GAAG,UAAU,EAAG,QAAS,IAAI,GAAG,UAAU,EAAG,KAAM,IAAI,GAAG,QAAQ,CAAE,EACtH,aAAe,GAAG,cAAgB,GAClC,WAAa,GAAG,YAAc,GAG9B,IAAI,GAAK,IAAI,EAAE,GAAK,EAAE,EAAE,GAAG,EAAG,MAAQ,SAAU,EAAG,CACjD,IAAI,EAAI,CAAC,EAAG,cAAO,GAAK,EAAE,EAAE,MAAM,GAAG,EAAE,QAAQ,SAAU,EAAG,CAAE,IAAI,EAAI,EAAE,MAAM,GAAG,EAAO,EAAE,SAAW,GAAK,IAAI,EAAE,CAAC,CAAC,EAAI,GAAK,EAAE,CAAC,EAAE,KAAK,IAAM,KAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAI,IAAI,EAAE,CAAC,CAAC,EAAG,CAAC,EACnK,CACT,EACI,IAAM,MAAM,GAAG,SAAS,EAAG,IAAM,MAAM,GAAG,YAAY,EAAG,IAAM,MAAM,GAAG,YAAY,EACpF,IAAM,IAAI,EAAE,IAAM,SAAa,UAAU,KAAO,IAAI,EAAE,EAAO,IAAI,EAAE,IAAM,IAAG,aAAe,KAC3F,IAAM,IAAI,EAAE,IAAM,SAAW,UAAU,QAAU,IAAI,EAAE,GACvD,IAAM,IAAI,EAAE,IAAM,SAAW,UAAU,QAAU,IAAI,EAAE,GAC3D,KAAK,QAAQ,IAAM,IAAI,GAAG,YAAY,GAAK,GAAI,KAAK,QAAQ,IAAM,IAAI,GAAG,YAAY,GAAK,IAC1F,KAAK,QAAQ,IAAM,IAAI,GAAG,YAAY,GAAK,GAAI,KAAK,QAAQ,IAAM,IAAI,GAAG,YAAY,GAAK,IAC1F,KAAK,KAAK,IAAM,IAAI,GAAG,WAAW,GAAK,GAAI,KAAK,KAAK,IAAM,IAAI,GAAG,WAAW,GAAK,GAElF,IAAI,GAAK,OAAO,OAAO,UAAa,WAAa,OAAO,SAAS,CAAC,EAAI,KAClE,KAAU,GAAG,cAAgB,QAAS,MAAQ,GAAO,OAAS,IAAa,GAAG,OAAS,QAAO,QAAU,IAAW,GAAG,eAAiB,QAAO,SAAW,IAC/J,CACA,SAAS,OAAQ,CAAE,IAAI,EAAI,MAAM,MAAQ,EAAE,EAAG,OAAO,EAAI,SAAQ,CAAG,CAEpE,SAAS,MAAM,EAAG,CAAE,IAAI,EAAI,GAAK,EAAE,GAAK,EAAE,EAAE,OAAQ,OAAO,QAAU,IAAM,SAAW,IAAM,WAAa,IAAM,WAAa,EAAI,IAAM,CAQtI,IAAI,MAAQ,CAAE,MAAO,CAAC,GAAG,EAAG,UAAW,CAAC,IAAK,GAAG,EAAG,UAAW,CAAC,MAAO,MAAO,KAAK,CAAE,EACpF,SAAS,SAAS,EAAG,CAAE,IAAI,EAAI,GAAK,EAAE,GAAK,EAAE,EAAE,OAAQ,OAAO,SAAW,IAAM,SAAW,IAAM,WAAa,IAAM,UAAY,CAC/H,SAAS,OAAO,EAAG,EAAG,CACpB,IAAI,EAAI,EAAE,EAAE,OAAQ,GAAI,EAAE,IAAM,SAAW,IAAM,WAAa,IAAM,WAAY,MAAO,GACvF,GAAI,CAAC,OAAQ,OAAO,IAAM,UAE1B,GADI,CAAC,SACD,UAAU,CAAC,EAAI,QAAS,MAAO,GACnC,IAAI,EAAI,EAAE,EAAE,MAAQ,EAAE,EAAE,KAAK,CAAC,EAAG,MAAO,CAAC,EAAE,GAAK,EAAE,CAAC,EACrD,CAEA,SAAS,UAAU,EAAG,EAAG,CACvB,IAAI,EAAI,EAAE,EAAG,OAAI,EAAE,SAAW,QAAgB,IAAI,EAAE,UAAU,GAAK,GAC5D,KAAM,EAAE,OAAS,EAAE,MAAM,EAAE,MAAM,GAAM,CAAC,GAAG,CAAC,CAAC,GAAK,EAC3D,CAIA,SAAS,OAAO,EAAG,CACjB,IAAI,EAAI,EAAE,EAAG,EAAI,MAAO,GAAI,OAAO,OAAO,UAAa,YAAc,OAAO,OAAO,YAAe,WAAY,OAAO,KACrH,IAAI,GAAK,OAAO,WAAW,CAAC,EAAG,EAAI,OAAO,SAAS,EAAE,EAAG,EAAI,GAAG,MAAQ,OAAQ,GAAI,CAAC,GAAK,CAAC,EAAE,OAAQ,OAAO,KAC3G,IAAI,IAAM,SAAU,EAAG,CAAE,IAAI,GAAK,EAAE,IAAI,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,CAAC,EAAI,EAAE,KAAK,CAAC,EAAI,EAAE,CAAC,EAAI,EAAE,KAAK,CAAC,CAAG,CAAC,EAAG,OAAO,KAAK,MAAM,KAAK,IAAI,MAAM,KAAM,EAAE,EAAI,KAAK,IAAI,MAAM,KAAM,EAAE,CAAC,CAAG,EAC/K,GAAK,CAAC,EAAG,EAAE,OAAO,QAAQ,SAAU,EAAG,CAAE,GAAG,EAAE,EAAE,EAAI,IAAI,CAAC,CAAG,CAAC,EACjE,IAAI,EAAI,CAAE,OAAY,IAAJ,EAAQ,EAAE,OAAc,EAAE,OAAV,EAAoB,KAAM,IAAI,EAAE,KAAK,EAAG,OAAY,IAAJ,EAAQ,EAAE,QAAe,EAAE,MAAV,EAAmB,OAAQ,IAAI,EAAE,QAAQ,CAAE,EAC1I,QAAU,EAAI,SAAW,SAAU,GAAK,OAAO,OAAO,QAAW,WAAa,OAAO,OAAO,CAAC,EAAI,CAAC,EAGlG,MAAQ,CACV,IAAK,GAAG,MAAQ,QAAU,CAAC,OAAQ,QAAQ,EAAI,CAAC,SAAU,MAAM,EAChE,IAAK,GAAG,MAAQ,QAAU,CAAC,SAAU,MAAM,EAAI,CAAC,OAAQ,QAAQ,EAChE,IAAK,GAAG,MAAQ,QAAU,CAAC,SAAU,OAAO,EAAI,CAAC,QAAS,QAAQ,CACpE,EACI,GAAK,CAAC,EAAG,EAAI,EACjB,MAAM,SAAS,EAAE,QAAQ,SAAU,EAAG,CACpC,GAAK,OAAO,EAAG,CAAC,EAAW,IAAG,CAAC,EAAI,GAAM,IACzC,IAAI,EAAI,MAAM,CAAC,EAAG,GAAG,EAAE,CAAC,CAAC,GAAK,EAAG,GAAG,EAAE,CAAC,CAAC,GAAM,EAAI,EAAE,EAAE,CAAC,CAAC,EAC1D,CAAC,EACD,IAAI,OAAS,SAAU,GAAI,CAAE,OAAO,MAAM,SAAS,EAAE,KAAK,SAAU,EAAG,CAAE,OAAO,GAAG,CAAC,GAAK,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAK,CAAG,CAAC,CAAG,EAGpH,KAAO,CAAE,OAAQ,iBAAkB,KAAM,eAAgB,OAAQ,gBAAiB,OAAQ,QAAS,EACnG,OAAS,CAAE,OAAQ,UAAW,KAAM,OAAQ,OAAQ,UAAW,OAAQ,QAAS,EAChF,KAAO,CAAE,IAAK,sBAAoB,IAAK,sBAAoB,IAAK,WAAY,EAChF,MAAO,CAAE,GAAI,EAAG,OAAQ,EAAE,QAAU,EAAG,OAAQ,CAAC,SAAU,OAAQ,SAAU,QAAQ,EAAE,IAAI,SAAU,GAAI,CAAE,MAAO,CAAE,IAAK,KAAK,EAAE,EAAG,GAAQ,GAAI,KAAK,IAAI,EAAG,GAAG,EAAE,CAAC,EAAG,EAAG,EAAE,EAAE,EAAG,GAAI,OAAO,EAAE,EAAG,IAAK,MAAM,EAAG,EAAE,EAAG,KAAM,WAAW,EAAG,EAAE,CAAE,CAAG,CAAC,EAC1O,UAAW,MAAM,SAAS,EAAE,IAAI,SAAU,EAAG,CAAE,OAAO,GAAG,CAAC,EAAI,GAAK,KAAK,CAAC,EAAI,OAAU,EAAE,QAAU,EAAE,OAAO,CAAC,EAAK,oBAAgB,oBAAsB,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,EAAI,UAAY,CAAC,CAAE,CACjM,CACA,SAAS,KAAK,EAAG,CAAE,OAAQ,MAAM,EAAE,EAAE,MAAM,GAAK,CAAC,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,OAAO,EAAG,CAAC,CAAG,CAAC,EAAE,MAAQ,CAC1G,SAAS,OAAO,EAAG,CAAE,IAAI,GAAK,MAAM,EAAE,EAAE,MAAM,GAAK,CAAC,EAAG,OAAO,GAAG,OAAS,GAAK,KAAK,CAAC,IAAM,GAAG,MAAQ,CAItG,SAAS,MAAM,EAAG,CAChB,IAAI,EAAI,EAAE,EAAG,EAAI,MACjB,GAAI,EAAE,SAAW,QAAS,CACxB,IAAI,GAAK,IAAI,EAAE,EAAE,EAAG,GAAK,IAAI,EAAE,EAAE,EAAG,GAAK,IAAI,EAAE,EAAE,EAAG,EAAI,IAAI,EAAE,EAAE,EAAI,GAAI,GAAK,OAAO,EAAG,GAAG,EAAG,GAAK,EAAE,eAAiB,UAAW,IAAM,CAAC,IAAM,CAAC,CAAC,EAAE,MACjJ,MAAO,CAAE,GAAI,GAAK,EAAI,EAAG,OAAQ,CAC/B,CAAE,IAAK,iBAAkB,GAAI,OAAQ,GAAI,GAAK,GAAK,EAAK,KAAO,GAAK,GAAK,GAAK,GAAK,EAAG,GAAI,GAAQ,IAAK,MAAM,EAAG,MAAM,EAAG,KAAM,WAAW,EAAG,MAAM,CAAE,EACrJ,CAAE,IAAK,SAAU,GAAI,SAAU,GAAI,GAAK,EAAI,EAAK,IAAM,EAAK,GAAK,EAAI,GAAK,EAAK,EAAG,GAAI,GAAQ,IAAK,MAAM,EAAG,QAAQ,EAAG,KAAM,WAAW,EAAG,QAAQ,CAAE,CAAC,EACtJ,UAAW,CAAC,GAAK,GAAK,IAAM,oBAAgB,qBAAuB,GAAK,cAAgB,gBAAgB,CAAE,CAC9G,CACA,GAAI,EAAE,SAAW,UAAW,CAC1B,IAAI,GAAK,IAAI,EAAE,EAAE,EAAG,GAAK,IAAI,EAAE,EAAE,EAAG,GAAK,IAAI,EAAE,EAAE,EAAG,EAAI,GAAK,IAAI,EAAE,EAAE,EAAI,GAAI,EAAI,GAAK,IAAI,EAAE,EAAE,EAAG,EAAI,GAAK,IAAI,EAAE,EAAE,EAC9G,GAAK,OAAO,EAAG,GAAG,EAAG,GAAK,OAAO,EAAG,GAAG,EAAG,GAAK,EAAE,gBAAkB,UAAW,GAAK,EAAE,iBAAmB,UACxG,IAAM,EAAE,QAAU,CAAC,EAAG,IAAM,CAAC,IAAM,CAAC,CAAC,IAAI,EAAG,IAAM,CAAC,IAAM,CAAC,CAAC,IAAI,EAC/D,EAAI,SAAU,EAAG,EAAG,IAAK,CAAE,OAAO,IAAM,oBAAgB,qBAAuB,EAAI,cAAgB,gBAAkB,EACzH,MAAO,CAAE,IAAK,GAAK,EAAI,IAAM,GAAK,EAAI,GAAI,OAAQ,CAChD,CAAE,IAAK,eAAgB,GAAI,SAAU,GAAI,GAAK,EAAI,EAAK,IAAM,CAAC,IAAM,EAAI,GAAK,EAAI,EAAG,GAAI,GAAI,GAAI,IAAK,MAAM,EAAG,QAAQ,EAAG,KAAM,WAAW,EAAG,QAAQ,CAAE,EACvJ,CAAE,IAAK,OAAQ,GAAI,OAAQ,GAAI,GAAK,GAAK,EAAK,IAAM,IAAM,EAAI,KAAQ,GAAK,EAAK,IAAM,IAAM,EAAI,IAAM,EAAG,GAAI,GAAI,IAAM,GAAI,IAAK,MAAM,EAAG,MAAM,EAAG,KAAM,WAAW,EAAG,MAAM,CAAE,EAC9K,CAAE,IAAK,eAAgB,GAAI,SAAU,GAAI,GAAK,EAAI,EAAK,IAAM,CAAC,IAAM,EAAI,GAAK,EAAI,EAAG,GAAI,GAAI,GAAI,IAAK,MAAM,EAAG,QAAQ,EAAG,KAAM,WAAW,EAAG,QAAQ,CAAE,CAAC,EACxJ,UAAW,CAAC,GAAK,GAAK,iBAAgB,EAAE,GAAI,GAAI,GAAG,EAAG,GAAK,GAAK,iBAAgB,EAAE,GAAI,GAAI,GAAG,CAAC,CAAE,CACpG,CACA,OAAI,EAAE,SAAW,UAAkB,OAAO,CAAC,EACpC,IACT,CAEA,SAAS,QAAQ,IAAK,CACpB,IAAI,EAAI,OAAO,KAAc,EAAQ,EAAE,QAAQ,KAAM,GAAG,EAAE,MAAM,2DAA2D,EAC3H,GAAI,CAAC,EAAG,OAAO,KACf,IAAI,EAAI,WAAW,EAAE,CAAC,CAAC,EAAI,GAAI,EAAI,EAAE,CAAC,EAAI,WAAW,EAAE,CAAC,CAAC,EAAI,GAAK,EAAG,MAAO,CAAC,KAAK,IAAI,EAAG,CAAC,EAAG,KAAK,IAAI,EAAG,CAAC,CAAC,CAC7G,CACA,SAAS,QAAQ,IAAK,CACpB,MAAO,CAAC,UAAW,UAAW,SAAS,EAAE,OAAO,SAAU,EAAG,CAC3D,OAAO,IAAI,OAAS,GAAK,IAAI,MAAM,SAAU,EAAG,CAAE,OAAO,QAAQ,EAAE,CAAC,CAAC,CAAG,CAAC,GAAK,IAAI,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,CAAC,IAAM,IAAI,CAAC,EAAE,CAAC,CAAG,CAAC,CACpI,CAAC,EAAE,CAAC,GAAK,IACX,CACA,SAAS,aAAa,EAAG,EAAG,CAC1B,IAAI,IAAM,EAAE,iBAAmB,CAAC,EAAG,IAAM,EAAE,0BAA4B,EAAE,0BAA0B,EAAI,KAAM,EAAI,QAAQ,GAAG,EAC5H,GAAI,CAAC,KAAO,CAAC,EAAG,OAAO,IACvB,IAAI,KAAO,IAAK,GAAK,IACrB,WAAI,QAAQ,SAAU,EAAG,CACvB,GAAK,CAAC,UAAW,UAAW,SAAS,EAAE,MAAM,SAAU,EAAG,CAAE,OAAO,IAAM,GAAK,EAAE,CAAC,IAAM,IAAI,CAAC,CAAG,CAAC,EAChG,KAAI,EAAI,QAAQ,EAAE,CAAC,CAAC,EAAG,GAAK,EAC5B,KAAI,EAAI,EAAI,EAAE,CAAC,EAAI,EAAE,CAAC,EAAI,EAAK,EAAI,EAAE,CAAC,EAAI,EAAI,EAAE,CAAC,EAAI,EACjD,EAAI,GAAK,MAAQ,GAAK,EAAG,KAAO,IACtC,CAAC,EACM,IACT,CAIA,SAAS,SAAS,EAAG,CACnB,IAAI,EAAI,EAAE,aAAc,GAAK,EAAE,aAAc,KAAO,EAAI,GAAK,GAAK,EAAI,EAEtE,GADA,EAAE,UAAU,OAAO,eAAgB,IAAI,EAAG,EAAE,UAAU,OAAO,aAAc,MAAQ,EAAE,UAAY,EAAI,GAAK,CAAC,EACvG,KAAM,CAAE,IAAI,GAAK,KAAK,IAAI,GAAI,EAAI,EAAI,EAAE,EAAG,GAAK,EAAI,IAAM,EAAE,WAAa,GAAK,GAAI,EAAE,MAAM,YAAY,YAAa,GAAG,QAAQ,CAAC,EAAI,IAAI,EAAG,EAAE,MAAM,YAAY,YAAa,EAAE,QAAQ,CAAC,EAAI,IAAI,CAAG,CACvM,CACA,SAAS,YAAY,EAAG,CACtB,IAAI,GAAK,MAAM,CAAC,EAAG,GAAI,CAAC,GAAI,OAAO,KACnC,IAAI,GAAK,UAAU,CAAC,EAAG,GAAI,GAAG,IAAM,IAAM,KAAM,OAAO,KACvD,IAAI,EAAI,QAAQ,EAAE,iBAAmB,CAAC,CAAC,EAAG,IAAM,EAC5C,GAAK,IAAI,OAAO,CAAC,CAAC,EAClB,OAAS,GAAG,OAAO,IAAI,SAAU,EAAG,CACtC,IAAI,EAAI,aAAa,EAAG,EAAE,CAAC,EAAG,EAAI,IAAI,GAAK,EAAE,KAAK,EAAG,KAAO,EAAE,GAAK,EAAI,KAAK,IAAI,EAAE,GAAI,EAAE,GAAK,UAAY,EAAE,MAAQ,aAAe,QAAoB,EAAI,EAEtJ,IAAM,KAAK,MAAM,KAAK,MAAM,KAAO,EAAE,EAAI,CAAC,EAAG,EAAI,EAAE,IAAM,KAAK,MAAM,GAAK,KAAO,EAAE,EAAI,GAAG,EAAI,IAAK,IAAM,EAAE,IAAM,EAAI,KAGpH,GAAK,CAAC,EAAE,EAAE,KAAO,IAAM,GAAI,OAAI,KAAI,EAAI,KAC3C,KAAO,EACA,CAAE,IAAK,EAAE,IAAK,GAAI,EAAE,IAAM,KAAM,GAAI,EAAE,GAAI,EAAG,EAAE,EAAG,WAAY,KAAM,QAAS,EAAE,KAAO,CAAC,GAAK,GAAK,EAAE,EAAI,IAAO,EAAG,MAAO,EAAG,IAAK,CAAC,CAAC,EAAE,IAAK,GAAI,EAAE,IAAM,GAAK,KAC/J,IAAK,GAAI,SAAU,IAAK,SAAU,EAAE,IAAM,IAAM,KAAM,QAAS,EAAE,IAAM,qBAAkB,GAAK,EAAI,EAAE,CAAC,EAAI,EAAI,CACjH,CAAC,EACG,KAAO,KAAK,MAAM,IAAI,EAAE,eAAiB,EAAE,eAAe,EAAE,2BAA6B,EAAE,0BAA0B,CAAC,EAAI,CAAC,EAAI,IAAI,EAAE,kBAAoB,EAAE,kBAAkB,EAAI,CAAC,CAAC,EACvL,MAAO,CAAE,MAAO,OAAQ,YAAa,IAAK,GAAI,GAAG,GAAI,SAAU,GAAG,GAAK,KAAK,MAAM,GAAG,GAAK,GAAK,GAAG,EAAI,EAAG,UAAW,GAAG,UACrH,WAAY,KAAM,YAAa,IAAM,IAAK,CAC9C,CAKA,IAAI,SAAW,CAAE,MAAO,CAAE,EAAG,QAAS,EAAG,UAAW,CAAE,EAAG,OAAQ,EAAG,QAAS,EAAG,UAAW,CAAE,IAAK,OAAQ,IAAK,SAAU,IAAK,QAAS,CAAE,EACzI,SAAS,SAAU,CAAE,MAAO,oBAAoB,MAAM,KAAK,EAAI,SAAQ,MAAM,KAAK,EAAI,qCAAuC,CAC7H,SAAS,YAAY,EAAG,QAAS,CAC/B,IAAI,EAAI,YAAY,CAAC,EAAG,GAAI,CAAC,EAAG,MAAO,GACvC,IAAI,GAAK,SAAS,EAAE,EAAE,MAAM,GAAK,CAAC,EAAG,KAAO,MAAM,EAAE,EAAE,MAAM,GAAK,CAAC,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,OAAO,EAAG,CAAC,CAAG,CAAC,EAC7G,MAAQ,CAAC,EACb,EAAE,MAAM,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,GAAK,CAAG,CAAC,EAAE,QAAQ,SAAU,EAAG,CACrE,IAAI,QAAQ,SAAU,EAAG,CAAM,GAAG,CAAC,IAAM,EAAE,IAAI,MAAM,KAAK,QAAQ,CAAC,CAAG,CAAC,EAGvE,IAAI,OAAS,CAAC,CAAC,EAAE,IAAM,WAAW,EAAG,EAAE,EAAE,EACzC,MAAM,KAAK,EAAE,IAAM,IAAM,MAAM,EAAE,EAAE,EAAI,SAAQ,MAAM,EAAE,CAAC,EAAI,OAAS,EAAE,IAAM,IAAM,OAAO,EAAE,GAAG,EAAI,sBAAkB,OAAS,GAAK,uBAAsB,KACtJ,SAAW,EAAE,WAAa,EAAE,GAAK,gBAAe,MAAM,EAAE,UAAU,EAAI,OAAS,GAAG,CACvF,CAAC,EAED,QADI,IAAM,MAAM,OAAO,SAAU,EAAG,CAAE,OAAO,IAAM,QAAQ,CAAG,CAAC,EAAE,OAC1D,IAAM,EAAE,GAAI,MAAO,MAAM,KAAK,QAAQ,CAAC,EAC9C,IAAI,EAAI,MAAM,IAAI,SAAU,EAAG,EAAG,CAAE,OAAQ,QAAU,IAAI,CAAC,EAAI,IAAM,IAAM,CAAG,CAAC,EAC3E,EAAI,EAAE,UAAU,OAAO,OAAO,EAClC,OAAO,EAAE,KAAK,QAAU,MAAQ,IAAI,GAAK,EAAE,OAAS,MAAQ,EAAE,KAAK,KAAK,EAAI,GAC9E,CAMA,SAAS,eAAe,EAAG,CACzB,IAAI,GAAK,YAAY,CAAC,EAAG,GAAI,CAAC,GAAI,OAAO,KACzC,IAAI,IAAM,CAAC,EAAG,MAAQ,CAAC,EACvB,UAAG,MAAM,QAAQ,SAAU,EAAG,CAC5B,GAAM,EAAE,WAAa,EACrB,KAAI,EAAI,aAAa,EAAG,EAAE,CAAC,EAAG,GAAK,EACnC,KAAI,EAAI,OAAO,EAAE,EAAE,EAAQ,IAAI,CAAC,IAAK,IAAI,CAAC,EAAI,CAAE,EAAM,GAAI,EAAG,MAAO,CAAC,CAAE,EAAG,MAAM,KAAK,CAAC,GACtF,IAAI,CAAC,EAAE,IAAM,KAAK,MAAM,EAAE,WAAa,EAAE,EAAG,IAAI,CAAC,EAAE,MAAM,KAAK,CAAC,GACjE,CAAC,EACM,MAAM,IAAI,SAAU,EAAG,CAAE,OAAO,IAAI,CAAC,CAAG,CAAC,CAClD,CAEA,SAAS,YAAY,IAAK,MAAO,IAAK,IAAK,CACzC,IAAI,IAAM,OAAO,qBAAuB,CAAC,EAAG,IAAM,OAAO,IAAI,gBAAkB,CAAC,EAAG,IAAM,OAAO,IAAI,oBAAsB,CAAC,EACvH,MAAQ,SAAU,GAAI,EAAG,CAAM,IAAM,EAAI,GAAG,IAAI,KAAK,CAAE,GAAQ,SAAU,EAAG,WAAY,CAAE,mBAAiB,IAAK,OAAQ,IAAK,YAAa,GAAI,CAAE,CAAC,CAAG,EAGxJ,GAFA,MAAQ,KAAK,IAAI,EAAG,KAAK,EACrB,IAAM,GAAK,KAAO,IAAG,MAAQ,KAAK,KAAK,MAAQ,GAAG,EAAI,KACtD,IAAM,EAAG,CAAE,IAAI,GAAK,KAAK,MAAM,MAAQ,GAAG,EAAG,MAAM,IAAK,EAAE,EAAG,OAAS,GAAK,GAAK,CAChF,IAAM,GAAG,MAAM,IAAK,KAAK,CAC/B,CACA,SAAS,WAAW,MAAO,CAAE,OAAO,MAAM,OAAO,SAAU,GAAI,CAAE,OAAO,GAAG,YAAc,GAAG,WAAW,MAAQ,OAAO,GAAG,WAAW,MAAM,IAAM,GAAK,CAAC,EAAE,CAAC,CAAG,CAC5J,SAAS,eAAe,GAAI,CAAE,MAAO,CAAC,GAAG,MAAU,GAAG,iBAAiB,EAAG,GAAG,QAAW,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,GAAK,4BAA8B,CACvJ,GAAI,CACF,IAAI,OAAS,OAAO,MAChB,OAAO,QAAW,aAAY,OAAO,MAAQ,SAAU,EAAG,EAAG,CAC/D,IAAI,KAAO,MAAM,UAAU,MAAM,KAAK,SAAS,EAC/C,GAAI,CACF,IAAI,EAAI,OAAO,EAAG,MAAQ,cAAc,KAAK,OAAO,GAAK,EAAE,IAAM,EAAE,IAAM,CAAC,CAAC,GAAK,GAAK,OAAO,EAAE,MAAS,UAAY,GAAK,EAAE,GAAK,EAAE,mBAAqB,CAAC,KAAK,CAAC,EACzJ,KAAO,MAAQ,KAAK,MAAM,EAAE,IAAI,EAAI,KAAM,MAAQ,KAAO,KAAK,OAAS,CAAC,EAAI,CAAC,EAAG,KAAO,KAAO,WAAW,KAAK,EAAI,KAClH,EAAI,KAAK,IAAI,EAAG,SAAS,GAAK,EAAE,GAAK,EAAE,EAAE,SAAU,EAAE,GAAK,CAAC,EAAG,GAAK,KAAO,EAAE,0BAA0B,EAAI,KAC1G,MAAQ,KAAO,KAAK,OAAO,IAAI,IAAM,GAAG,KAAK,EAAI,IAAI,EAAE,eAAe,EAAE,CAAC,EAAI,IAAI,EAAE,EAAE,iBAAiB,GAAK,CAAC,EAAI,EAChH,GAAK,MAAQ,SAAS,CAAC,GAAK,CAAC,OAAO,CAAC,EAAI,eAAe,CAAC,EAAI,KACjE,GAAI,IAAM,GAAG,OAAQ,CACnB,IAAI,IAAM,OAAO,KAAK,WAAW,IAAI,EAAG,GAAK,KAAK,WAAY,IAAM,eAAe,EAAE,EACjF,IAAM,GAAG,IAAI,SAAU,EAAG,EAAG,CAC/B,OAAO,IAAM,EAAI,CAAE,GAAI,EAAE,EAAE,GAAI,SAAU,EAAE,GAAK,EAAG,WAAY,EAAG,EAC9D,CAAE,GAAI,EAAE,EAAE,GAAI,SAAU,EAAE,GAAK,EAAG,WAAY,CAAE,mBAAiB,IAAK,MAAS,EAAE,MAAM,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,IAAM,MAAM,EAAE,EAAE,EAAI,SAAQ,MAAM,EAAE,CAAC,EAAI,KAAO,CAAC,EAAE,KAAK,IAAI,EAAG,OAAQ,IAAK,YAAa,GAAI,CAAE,CAC9N,CAAC,EACD,YAAY,IAAK,MAAQ,GAAG,OAAO,SAAU,EAAG,EAAG,CAAE,OAAO,EAAI,IAAI,EAAE,EAAE,KAAK,EAAI,EAAE,GAAK,CAAG,EAAG,CAAC,EAAG,IAAK,GAAG,EAC1G,KAAK,MAAQ,IAAI,MAAM,EAAE,QAAQ,EACjC,KAAK,CAAC,EAAI,OAAO,OAAO,CAAC,EAAG,EAAG,CAAE,KAAM,KAAK,UAAU,IAAI,CAAE,CAAC,CAC/D,SAAW,MAAQ,IAAM,OAAO,KAAK,EAAE,IAAM,OAAO,GAAG,EAAE,GAAK,IAAI,GAAG,KAAK,EAAI,GAAK,MAAQ,GAAK,KAAK,SAAW,IAAI,GAAG,KAAK,EAAI,MAAO,CAKrI,IAAI,GAAK,IAAI,GAAG,KAAK,EAAG,EAAI,KAAK,MAAM,OAAS,GAAK,EAAE,EAAI,EAAG,KAAO,OAAO,KAAK,WAAW,IAAI,EAC5F,KAAO,CAAC,CAAE,GAAI,KAAK,GAAI,SAAU,EAAG,WAAY,KAAK,UAAW,CAAC,EACrE,YAAY,KAAM,MAAQ,EAAI,GAAI,eAAe,KAAK,UAAU,EAAG,IAAI,EACvE,KAAK,MAAQ,KAAK,MAAM,EAAE,QAAQ,EAClC,KAAK,CAAC,EAAI,OAAO,OAAO,CAAC,EAAG,EAAG,CAAE,KAAM,KAAK,UAAU,IAAI,CAAE,CAAC,CAC/D,CACF,OAAS,EAAG,CAAE,QAAQ,KAAK,cAAe,CAAC,CAAG,CAC9C,OAAO,OAAO,MAAM,KAAM,IAAI,CAChC,EACF,MAAY,CAAC,CAIb,IAAI,SAAW,CAAC,EAAG,UAAY,EAAG,MAAQ,CAAC,EAC3C,SAAS,QAAQ,EAAG,EAAG,CACrB,GAAI,OAAO,OAAO,WAAc,YAAe,OAAO,iBAAmB,OAAO,gBAAgB,EAAI,OAAO,KAC3G,IAAI,IAAM,KAAK,UAAU,EAAE,CAAC,EAAI,IAAM,EAAE,EACxC,GAAI,OAAO,SAAU,OAAO,SAAS,GAAG,EACxC,IAAI,IAAM,SAAS,cAAc,wBAA0B,EAAE,EAAI,IAAI,EACrE,MAD4E,CAAC,KAAO,CAAC,IAAI,eAAe,EAAE,QACtG,KAAK,IAAI,GAAK,MAAM,EAAE,CAAC,GAAK,GAAK,OACrC,MAAM,EAAE,CAAC,EAAI,KAAK,IAAI,EAClB,EAAE,UAAY,KAAM,SAAW,CAAC,EAAG,UAAY,GACnD,SAAS,GAAG,EAAI,KAChB,WAAW,UAAY,CACrB,IAAI,EAAI,OAAO,EAAG,GAAI,CAAC,GAAK,CAAC,EAAE,GAAK,KAAK,UAAU,EAAE,CAAC,EAAI,IAAM,EAAE,IAAM,IAAK,CAAE,OAAO,SAAS,GAAG,EAAG,MAAQ,CAC7G,IAAI,MAAQ,OAAO,EAAG,EAAE,CAAC,EAAG,EAAI,OAAO,UAAU,EAAG,CAAC,SAAU,EAAG,CAAE,IAAI,EAAI,EAAE,EAAE,OAAQ,EAAE,EAAE,KAAO,EAAE,EAAE,MAAQ,CAAC,EAAG,EAAE,EAAE,KAAK,CAAC,EAAI,EAAE,EAAE,KAAK,CAAC,GAAK,CAAC,EAAG,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,EAAI,CAAC,MAAY,OAAO,OAAO,gBAAgB,QAAQ,EAAG,EAAG,IAAI,CAAG,CAAC,CAAC,EACrO,EAAI,GAAK,EAAE,MAAO,EAAI,GAAK,EAAE,MAAM,CAAC,EACxC,SAAS,GAAG,EAAI,GAAK,EAAK,MAAQ,EAAE,MAAQ,EAAE,MAAQ,EAAE,MAAQ,EAAE,MAAS,KAC3E,GAAI,CAAE,EAAE,OAAO,CAAG,MAAY,CAAC,CACjC,EAAG,GAAG,GACC,IACT,CAEA,SAAS,MAAM,OAAQ,CACrB,IAAI,GAAM,CAAE,GAAI,GAAI,GAAI,uBAAwB,EAAG,MAAM,GAAK,GAC9D,MAAO,+GAAiH,GAAK,eAAiB,GAAK,IAAM,IACvJ,yRAEJ,CACA,OAAO,gBAAkB,CACvB,MAAO,SAAU,EAAG,EAAG,CACrB,GAAI,CAAC,SAAS,CAAC,GAAK,CAAC,SAAW,UAAU,CAAC,EAAI,QAAS,MAAO,CAAC,EAChE,IAAI,GAAK,UAAU,CAAC,EAAG,GAAI,IAAM,KAAM,MAAO,CAAC,EAC/C,IAAI,IAAM,UAAU,EAAG,EAAE,CAAC,EAAG,GAAK,KAAK,IAAI,IAAM,EAAE,EAAI,IACnD,OAAS,EAAE,EAAE,SAAW,QAAW,EAAE,EAAE,WAAa,OAAS,KAAO,KACpE,EAAE,EAAE,SAAW,UAAa,EAAE,IAAM,OAAU,EAAE,IAAM,OAAS,EAAE,EAAE,OAAS,OAAU,KAAO,KAAS,EAAE,IAAM,IAAM,KAAO,KAC3H,IAAM,mBAAkB,GAAK,GAAK,QAAQ,EAAG,CAAC,EAAI,KAItD,MAAO,CAAC,CAAE,EAAG,KAAM,IAAK,MAAM,MAAM,EAAG,IAAK,GAAK,IAAI,KAAK,MAAM,GAAK,GAAG,CAAC,EAAI,UAAO,mBAAiB,SAAU,CAAC,GAAI,MAAO,IACzH,MAAO,GAAK,sCAAsC,MAAM,KAAK,EAAI,oIAC9D,IAAM,KAAO,0BAA4B,GAAK,EAAI,SAAM,KAAO,IAAI,KAAK,IAAI,EAAE,CAAC,EAAI,WAAQ,IAAM,IAAM,oCAA+B,CAAC,CAC9I,EACA,MAAO,SAAU,EAAG,EAAG,CAAE,OAAO,SAAS,CAAC,GAAK,OAAO,EAAG,EAAE,CAAC,EAAI,KAAO,IAAM,EAC7E,QAAS,SAAU,EAAG,EAAG,EAAG,CAC1B,IAAI,EAAI,EAAE,EAAE,OACZ,GADoB,EAAE,EAAE,KAAO,EAAE,EAAE,MAAQ,CAAC,EAAG,EAAE,EAAE,KAAK,CAAC,EAAI,EAAE,EAAE,KAAK,CAAC,GAAK,CAAC,EAAG,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,EAAI,IAAM,KACrG,IAAM,KACR,GAAI,IAAM,QAAS,EAAE,EAAE,MAAQ,OAC1B,CAAE,IAAI,GAAK,IAAM,UAAY,SAAW,SAAc,EAAE,EAAE,EAAE,IAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAI,GAAO,CAE9F,EAEA,UAAW,SAAU,EAAG,CACtB,IAAI,EAAI,OAAO,QAAU,OAAO,OAAO,OAAO,MAAS,WAAa,OAAO,OAAO,KAAK,EAClF,OAAO,YAAc,OAAO,WAAW,KAAO,MAAQ,OAAO,WAAW,MAAQ,GAAK,EAAI,KAC9F,OAAO,SAAS,CAAC,GAAK,IAAM,IAC9B,CACF,EAGA,SAAS,UAAU,EAAG,CACpB,IAAI,EAAI,GAAK,EAAE,0BAA4B,EAAE,0BAA0B,EAAI,KAAM,EAAI,OAAO,gBAAkB,CAAC,EAC3G,EAAI,GAAK,IAAI,EAAE,EAAE,KAAK,CAAC,EAC3B,OAAO,EAAI,EAAI,EAAI,IACrB,CAOA,SAAS,OAAO,EAAG,CACjB,GAAI,CAAC,QAAS,OAAO,KACrB,IAAI,EAAI,GAAK,EAAE,0BAA4B,EAAE,0BAA0B,EAAI,KAAM,EAAI,OAAO,YAAc,CAAC,EAAG,EAAI,GAAK,IAAI,EAAE,EAAE,KAAK,CAAC,EACrI,OAAO,EAAI,EAAI,EAAI,IACrB,CAEA,SAAS,UAAU,EAAG,CAAE,IAAI,IAAM,GAAK,EAAE,GAAK,EAAE,EAAE,OAAQ,OAAO,YAAY,GAAG,EAAI,OAAO,CAAC,EAAI,IAAM,CAGtG,SAAS,UAAU,EAAG,CACpB,IAAI,EAAI,GAAK,EAAE,EAAG,OAAK,EACnB,EAAE,SAAW,UAAkB,KAAK,IAAI,IAAI,EAAE,KAAK,EAAG,IAAI,EAAE,MAAM,EAAG,IAAI,EAAE,OAAO,EAAG,IAAI,EAAE,QAAQ,CAAC,EACjG,EAAE,SAAW,QAAU,KAAK,IAAI,IAAI,EAAE,EAAE,EAAG,IAAI,EAAE,EAAE,CAAC,EAAI,EAAE,SAAW,UAAY,KAAK,IAAI,IAAI,EAAE,EAAE,EAAG,IAAI,EAAE,EAAE,EAAG,IAAI,EAAE,EAAE,CAAC,EAAI,IAAI,EAAE,CAAC,EAF1G,CAGnC,CAGA,SAAS,WAAW,EAAG,CACrB,IAAI,IAAO,GAAK,EAAE,iBAAoB,CAAC,EAAG,EAAI,QAAQ,GAAG,EAAG,OAAK,EAC1D,IAAI,OAAO,SAAU,EAAG,EAAG,CAAE,IAAI,EAAI,QAAQ,EAAE,CAAC,CAAC,EAAG,OAAO,EAAI,KAAK,IAAI,EAAG,EAAE,CAAC,CAAC,EAAI,CAAG,EAAG,GAAQ,GAAK,EADlC,OAE7E,CAWA,SAAS,UAAW,CAAE,OAAO,QAAU,GAAK,OAAS,CAAG,CACxD,SAAS,UAAW,CAAE,OAAO,SAAS,EAAI,KAAK,IAAI,QAAS,MAAM,EAAI,MAAQ,CAC9E,SAAS,MAAM,EAAG,CAChB,IAAI,EAAI,OAAO,CAAC,EAAG,GAAI,GAAK,MAAQ,CAAC,SAAS,GAAK,CAAC,QAAS,OAAO,EACpE,IAAI,EAAI,aAAa,EAAG,MAAM,EAAG,EAAI,GAAK,KAAK,OAAO,YAAc,CAAC,GAAG,EAAE,KAAK,CAAC,EAChF,OAAO,EAAI,EAAI,EAAI,IACrB,CACA,SAAS,cAAc,EAAG,EAAG,CAC3B,IAAI,EAAI,GAAK,EAAE,EAAG,MAAI,CAAC,GAAK,EAAE,SAAW,UAAY,EAAE,OAAS,GAAW,IAC3E,EAAI,GAAK,KAAO,IAAI,EAAE,CAAC,EAAI,IAAI,CAAC,EACzB,GAAK,SAAS,GAAK,EAAI,UAAY,MAAM,CAAC,GAAK,KACxD,CACA,SAAS,QAAQ,EAAG,EAAG,CACrB,OAAK,cAAc,EAAG,CAAC,GACf,GAAK,KAAO,IAAI,EAAE,EAAE,CAAC,EAAI,IAAI,CAAC,GAAK,WAAW,CAAC,GAAK,EAAE,EAAE,YAAc,GAD7C,EAEnC,CACA,SAAS,aAAa,EAAG,CAAE,OAAO,cAAc,CAAC,GAAK,IAAI,EAAE,EAAE,CAAC,GAAK,WAAW,CAAC,CAAG,CACnF,OAAO,gBAAkB,SAAU,EAAG,CAAE,SAAI,GAAK,OAAO,EAAU,CAAC,EAAE,GAAK,EAAE,GAAK,EAAE,mBAAqB,QAAQ,CAAC,EAAI,EAIrH,SAAS,YAAY,EAAG,GAAI,CAAE,MAAO,CAAC,EAAE,aAAe,IAAM,CAAC,GAAG,OAAS,EAAE,GAAG,SAAW,aAAa,CAAC,GAAK,CAI7G,SAAS,UAAU,EAAG,CACpB,GAAI,GAAC,SAAW,aAAe,CAAC,GAAK,CAAC,EAAE,MAAQ,CAAC,EAAE,GACnD,KAAI,EAAI,MAAM,CAAC,EAAG,GAAK,EAAE,KAAK,cAAgB,EAAE,KAAK,eAAiB,CAAC,EACvE,GAAG,YAAc,QAAQ,CAAC,GAAK,CAAC,EAAE,GAAK,EAAE,0BAA4B,IACvE,CAIA,SAAS,YAAY,EAAG,CACtB,IAAI,EAAI,EAAE,EAAG,MAAQ,EAAE,aAAc,MAAQ,EAAE,SAAW,UAAY,QAAQ,CAAC,EAC/E,GADkF,EAAE,aAAe,MAC/F,eAAe,CAAC,OAAS,OAAS,EAAE,SAAW,UACnD,KAAI,IAAO,EAAE,QAAU,EAAE,SAAW,CAAC,GAAG,OAAS,EAAE,QAAQ,QAAU,CAAC,EAAI,GAAK,EAAE,WACjF,MAAM,OAAO,QAAQ,SAAU,EAAG,CAChC,IAAI,GAAK,EAAE,MAAQ,EAAE,KAAK,cAAc,oCAAsC,EAAE,EAAI,IAAI,EAAG,OAAS,CAAC,EAAE,IAAM,GAAG,UAAU,SAAS,SAAS,GAAK,CAAC,GAAG,UAAU,SAAS,UAAU,GAC9K,KAAI,OAAS,GAAG,EAAE,CAAC,IAAM,IAE7B,IAAI,EAAI,GAAG,EAAE,CAAC,EAAI,GAAG,EAAE,CAAC,GAAK,CAAC,EAAO,OAAQ,EAAE,EAAI,QAAiB,EAAE,IAAM,QAAU,MAAI,EAAE,EAAI,OAClG,CAAC,EACH,CAOA,SAAS,SAAS,EAAG,CAAE,OAAO,OAAO,GAAY,EAAM,EAAE,UAAU,KAAK,EAAE,QAAQ,OAAQ,GAAG,EAAE,KAAK,EAAE,YAAY,CAAG,CACrH,IAAI,UAAY,CAAC,EACjB,SAAS,WAAW,IAAK,CACvB,IAAI,EAAI,OAAO,UAAY,CAAC,EAAG,EAAI,SAAS,GAAG,EAAG,GAAI,CAAC,EAAG,MAAO,GACjE,GAAI,EAAE,GAAG,GAAK,KAAM,OAAO,SAAS,EAAE,GAAG,CAAC,EAC1C,IAAI,EAAI,OAAO,KAAK,CAAC,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,SAAS,CAAC,IAAM,CAAG,CAAC,EAAE,CAAC,EAC3E,OAAO,EAAI,SAAS,EAAE,CAAC,CAAC,EAAI,EAC9B,CACA,SAAS,SAAS,EAAG,CACnB,GAAI,CAAC,WAAa,CAAC,GAAK,CAAC,EAAE,GAAK,EAAE,EAAE,SAAW,UAAY,CAAC,QAAQ,CAAC,EAAG,MAAO,GAC/E,IAAI,EAAI,EAAE,cAAgB,EAAE,aAAa,EAAE,EAAE,OAAO,EAAG,IAAM,GAAK,EAAE,KAAM,EAAI,WAAW,GAAG,EAC5F,OAAK,EACE,IAAM,WADC,KAAO,CAAC,UAAU,GAAG,IAAK,UAAU,GAAG,EAAI,EAAG,QAAQ,KAAK,sCAAkC,IAAM,iFAAqE,GAAY,GAEpM,CAGA,SAAS,aAAa,EAAG,CACvB,IAAI,EAAI,EAAE,EAAG,IAAM,SAAS,CAAC,EAAG,IAAM,EAAE,WAAY,GAAK,EAAE,YAAc,EAAE,aAAe,CAAC,EACvF,KAAO,CAAC,IAAK,EAAE,WAAa,CAAE,MAAO,GAAG,QAAU,GAAM,MAAO,GAAG,QAAU,EAAK,EAC5E,CAAC,KAAO,MAAW,EAAE,SAAW,UAAY,QAAQ,CAAC,IAAK,GAAG,MAAQ,IAAI,MAAO,GAAG,MAAQ,IAAI,OAAS,OAAO,EAAE,WAC5H,CACA,OAAO,YAAc,SAAU,EAAG,CAAE,SAAI,GAAK,OAAO,EAAU,CAAC,EAAE,GAAK,EAAE,mBAAqB,SAAS,CAAC,EAAI,EAI3G,SAAS,QAAQ,EAAG,CAClB,IAAI,EAAI,GAAK,EAAE,EAAG,EAAI,IAAI,GAAK,EAAE,CAAC,EAAG,GAAI,CAAC,SAAW,CAAC,GAAK,EAAE,SAAW,UAAY,EAAE,OAAS,IAAM,KAAK,CAAC,GAAK,EAAE,EAAI,SAAS,IAAM,EAAE,GAAK,WAAW,CAAC,GAAI,MAAO,GACnK,IAAI,EAAI,aAAa,EAAG,MAAM,EAAG,EAAI,GAAK,KAAK,OAAO,YAAc,CAAC,GAAG,EAAE,KAAK,CAAC,EAChF,OAAO,EAAI,CACb,CACA,SAAS,WAAY,CAAE,MAAO,8CAA0C,MAAM,SAAS,EAAI,EAAE,EAAG,sBAAqB,CAKrH,SAAS,SAAS,EAAG,CACnB,IAAI,EAAI,EAAE,EAAG,EAAI,EAAE,OAAS,OAAQ,GAAK,EAAE,kBAAoB,UAAW,GAAK,EAAE,eAAiB,UAClG,OAAI,EAAU,GAAK,CAAC,0BAA0B,EAAI,CAAC,sBAAsB,EAClE,GAAK,CAAC,GAAK,uBAAyB,uBAAuB,EAAI,CAAC,uBAAuB,CAChG,CAEA,SAAS,YAAY,EAAG,CACtB,IAAI,EAAI,EAAE,EAAG,EAAI,EAAE,OAAS,OAAQ,OAAI,EAAE,kBAAoB,UAAkB,KACzE,EAAI,CAAE,EAAG,EAAE,eAAiB,UAAY,uBAAyB,uBAAwB,IAAK,oCAA+B,GAAI,GAAI,EACxI,CAAE,EAAG,EAAE,eAAiB,UAAY,wBAA0B,wBAAyB,IAAK,qCAAgC,GAAI,GAAI,CAC1I,CACA,SAAS,WAAW,EAAG,CAAE,IAAI,EAAI,EAAE,EAAG,OAAO,EAAE,OAAS,OAAS,cAAiB,EAAE,kBAAoB,UAAY,sBAAwB,sBAAyB,CAQrK,IAAI,UAAY,CAAE,MAAO,CAAC,OAAQ,QAAQ,EAAG,UAAW,CAAC,SAAU,OAAQ,QAAQ,EAAG,UAAW,CAAC,SAAU,OAAQ,SAAU,QAAQ,CAAE,EACpI,QAAU,CAAE,MAAO,CAAE,KAAM,iBAAkB,OAAQ,QAAS,EAChE,UAAW,CAAE,OAAQ,eAAgB,KAAM,OAAQ,OAAQ,cAAe,EAC1E,UAAW,CAAE,OAAQ,iBAAkB,KAAM,eAAgB,OAAQ,gBAAiB,OAAQ,QAAS,CAAE,EAC3G,SAAS,MAAM,EAAG,EAAG,CAAE,OAAQ,QAAQ,EAAE,EAAE,MAAM,GAAK,CAAC,GAAG,CAAC,GAAK,CAAG,CACnE,SAAS,MAAM,EAAG,CAAE,MAAO,SAAS,KAAK,CAAC,CAAG,CAC7C,SAAS,KAAK,EAAG,CAAE,OAAQ,MAAM,CAAC,EAAI,SAAW,OAAS,CAAG,CAC7D,SAAS,OAAO,EAAG,CAAE,OAAO,MAAM,CAAC,EAAI,QAAU,MAAQ,CAEzD,SAAS,SAAS,EAAG,EAAG,CACtB,IAAI,EAAI,EAAE,EAAG,EAAI,EAAE,OAAQ,EAAI,SAAU,EAAG,CAAE,OAAO,IAAM,UAAY,IAAM,GAAK,EAClF,GAAI,IAAM,QAAS,MAAO,CAAE,KAAM,OAAQ,OAAQ,aAAc,EAAE,CAAC,GAAK,KACxE,GAAI,IAAM,UAAW,CACnB,IAAI,EAAI,EAAE,gBAAkB,UAAW,EAAI,EAAE,iBAAmB,UAChE,MAAO,CAAE,OAAQ,EAAI,eAAiB,YAAa,OAAQ,EAAI,gBAAkB,aAAc,KAAM,IAAM,EAAI,WAAc,EAAI,gBAAkB,gBAAkB,EAAE,CAAC,GAAK,IAC/K,CACA,GAAI,IAAM,UAAW,OAAO,KAC5B,GAAI,IAAM,SAAU,OAAO,SAAS,CAAC,EAAE,CAAC,EACxC,IAAI,EAAI,EAAE,EAAE,YAAY,EAAG,EAAI,EAAE,EAAE,YAAY,EAAG,EAAI,EAAE,EAAE,eAAe,EACzE,OAAI,EAAE,OAAS,OAAe,CAAE,OAAQ,IAAM,IAAM,eAAiB,oBAAqB,KAAM,CAAE,GAAI,gBAAiB,GAAI,cAAe,GAAI,cAAe,GAAI,cAAe,EAAE,EAAI,CAAC,EACrL,OAAQ,CAAE,GAAI,sBAAuB,GAAI,mBAAoB,GAAI,iBAAkB,GAAI,kBAAmB,EAAE,EAAI,CAAC,CAAE,EAAE,CAAC,GAAK,KACtH,CAAE,OAAQ,CAAE,GAAI,uBAAwB,GAAI,oBAAqB,GAAI,uBAAwB,GAAI,mBAAoB,EAAE,EAAI,CAAC,EACjI,KAAM,CAAE,GAAI,iBAAkB,GAAI,eAAgB,GAAI,eAAgB,GAAI,eAAgB,EAAE,EAAI,CAAC,EAAG,OAAQ,IAAM,IAAM,qBAAuB,oBAAqB,EAAE,CAAC,GAAK,IAChL,CACA,IAAI,WAAa,CAAC,OAAQ,cAAe,eAAgB,YAAa,gBAAiB,aAAc,WAAY,gBAAiB,iBAAkB,eAAgB,oBAClK,gBAAiB,cAAe,cAAe,eAAgB,sBAAuB,mBAAoB,iBAAkB,mBAAoB,uBAAwB,oBACxK,uBAAwB,oBAAqB,iBAAkB,eAAgB,eAAgB,gBAAiB,qBAAsB,oBAAoB,EAE5J,SAAS,UAAU,EAAG,EAAG,CACvB,IAAI,EAAI,EAAE,EAAG,EAAI,EAAE,OACnB,GAAI,IAAM,SAAW,IAAM,UAAW,CAAE,IAAI,EAAI,CAAE,KAAM,EAAG,OAAQ,EAAG,OAAQ,EAAG,OAAQ,CAAE,EAAE,CAAC,EAAG,OAAO,GAAK,MAAS,IAAM,UAAc,IAAM,QAAU,IAAM,UAAY,KAAO,MAAM,CAAC,EAAE,CAAC,CAAG,CAChM,GAAI,IAAM,UAAW,OAAO,KAC5B,IAAI,EAAI,EAAE,OAAS,OACnB,OAAI,IAAM,SAAiB,CAAE,EAAG,WAAW,CAAC,EAAG,IAAK,6BAAwB,GAAI,GAAI,EAChF,KAAO,EAAI,SAAW,UAAkB,CAAE,EAAG,EAAI,mBAAqB,oBAAqB,IAAK,EAAI,qCAAiC,oCAA+B,GAAI,GAAI,EACzK,KAAO,EAAI,SAAW,WAAa,MAAQ,YAAY,CAAC,EAAI,IACrE,CACA,SAAS,YAAY,EAAG,EAAG,CAAE,IAAI,EAAI,KAAM,OAAC,UAAU,EAAE,EAAE,MAAM,GAAK,CAAC,GAAG,QAAQ,SAAU,EAAG,CAAE,IAAI,EAAI,UAAU,EAAG,CAAC,EAAO,CAAC,GAAK,GAAK,EAAE,IAAM,IAAG,EAAI,EAAG,CAAC,EAAU,CAAG,CAQxK,SAAS,SAAS,EAAG,CAAE,IAAI,EAAI,GAAK,EAAE,GAAK,EAAE,EAAE,OAAQ,MAAO,CAAC,GAAG,IAAM,WAAa,IAAM,SAAW,IAAM,YAAc,SAAS,CAAC,GAAK,UAAU,CAAC,EAAI,OAAS,OAAO,CAAC,GAAK,KAAO,CACrL,SAAS,OAAO,EAAG,CAAE,OAAO,SAAS,CAAC,IAAM,EAAE,UAAU,CAAC,EAAI,QAAU,SAAS,CAAC,EAAI,CACrF,SAAS,YAAY,EAAG,EAAG,CAAE,IAAI,EAAI,EAAE,EAAG,EAAI,EAAE,OAAS,OAAQ,OAAO,IAAI,CAAE,OAAQ,EAAI,EAAE,OAAS,EAAE,QAAS,KAAM,EAAE,MAAO,OAAQ,EAAI,EAAE,QAAU,EAAE,OAAQ,OAAQ,EAAE,QAAS,EAAE,CAAC,CAAC,CAAG,CAC3L,SAAS,WAAW,EAAG,EAAG,CACxB,IAAI,EAAI,EAAE,EAAG,EAAI,EAAE,OACnB,OAAI,IAAM,QAAgB,IAAI,CAAE,KAAM,EAAE,GAAI,OAAQ,EAAE,EAAG,EAAE,CAAC,CAAC,EACzD,IAAM,UAAkB,IAAI,CAAE,OAAQ,EAAE,GAAI,KAAM,EAAE,GAAI,OAAQ,EAAE,EAAG,EAAE,CAAC,CAAC,EACtE,IAAM,UAAY,YAAY,EAAG,CAAC,EAAI,CAC/C,CACA,SAAS,WAAW,EAAG,EAAG,CAAE,IAAI,EAAI,EAAE,EAAE,OAAQ,OAAQ,IAAM,YAAe,IAAM,SAAW,IAAM,YAAc,SAAS,CAAC,IAAO,OAAO,CAAC,GAAK,MAAQ,WAAW,EAAG,CAAC,EAAI,KAAO,CAOlL,IAAI,WAAa,CACf,MAAO,CAAE,MAAO,OAAQ,KAAM,OAAQ,YAAa,OAAQ,aAAc,OAAQ,eAAgB,SAAU,YAAa,SAAU,iBAAkB,SAAU,kBAAmB,QAAS,EAC1L,UAAW,CAAE,MAAO,SAAU,UAAW,SAAU,aAAc,SAAU,UAAW,SAAU,cAAe,SAC7G,MAAO,SAAU,WAAY,SAAU,cAAe,SAAU,WAAY,SAAU,eAAgB,SACtG,WAAY,OAAQ,SAAU,OAAQ,eAAgB,OAAQ,cAAe,OAAQ,aAAc,OAAQ,cAAe,OAAQ,YAAa,eAAgB,EACjK,UAAW,CACT,aAAc,SAAU,aAAc,SAAU,aAAc,SAAU,aAAc,SAAU,iBAAkB,SAAU,kBAAmB,SAAU,aAAc,SACvK,aAAc,OAAQ,YAAa,OAAQ,YAAa,OAAQ,cAAe,OAAQ,eAAgB,OAAQ,eAAgB,OAAQ,kBAAmB,OAAQ,kBAAmB,OACrL,cAAe,SAAU,cAAe,SAAU,qBAAsB,SAAU,qBAAsB,SAAU,oBAAqB,SAAU,iBAAkB,SACnK,iBAAkB,SAAU,iBAAkB,SAAU,eAAgB,SACxE,YAAa,SAAU,qBAAsB,SAAU,yBAA0B,SAAU,kBAAmB,SAAU,oBAAqB,SAAU,oBAAqB,SAC5K,cAAe,SAAU,cAAe,SAAU,cAAe,SAAU,eAAgB,SAAU,sBAAuB,SAAU,sBAAuB,SAAU,qBAAsB,SAC7L,kBAAmB,SAAU,kBAAmB,SAAU,oBAAqB,SAAU,qBAAsB,SAC/G,cAAe,OAAQ,aAAc,OAAQ,aAAc,OAAQ,eAAgB,OAAQ,aAAc,OAAQ,kBAAmB,OAAQ,kBAAmB,OAAQ,mBAAoB,OAAQ,mBAAoB,OACvN,eAAgB,SAAU,eAAgB,SAAU,kBAAmB,SAAU,mBAAoB,SAAU,iBAAkB,SAAU,gBAAiB,SAAU,mBAAoB,SAC1L,oBAAqB,SAAU,sBAAuB,SAAU,qBAAsB,SAAU,sBAAuB,SAAU,qBAAsB,SAAU,mBAAoB,SACrL,qBAAsB,SAAU,qBAAsB,QAAS,CACnE,EACA,SAAS,YAAY,EAAG,EAAG,CAAE,IAAI,GAAK,WAAW,EAAE,EAAE,MAAM,GAAK,CAAC,GAAG,CAAC,EAAG,OAAO,EAAI,EAAE,MAAM,GAAG,EAAI,CAAC,CAAG,CACtG,OAAO,aAAe,SAAU,EAAG,EAAG,CAAE,SAAI,GAAK,OAAO,EAAU,GAAK,EAAE,EAAI,YAAY,EAAG,CAAC,EAAE,KAAK,GAAG,EAAI,EAAI,EAE/G,SAAS,UAAU,EAAG,EAAG,CAAE,OAAO,YAAY,EAAG,CAAC,EAAE,OAAO,SAAU,EAAG,EAAG,CAAE,OAAO,KAAK,IAAI,EAAG,WAAW,EAAG,CAAC,CAAC,CAAG,EAAG,CAAC,CAAG,CAG1H,SAAS,SAAS,EAAG,CACnB,IAAI,EAAI,GAAK,EAAE,GAAK,EAAE,EAAE,OACxB,MAAO,CAAC,EAAE,SAAW,aAAe,OAAO,CAAC,GAAK,OAAS,IAAM,YAAe,IAAM,SAAW,IAAM,YAAc,SAAS,CAAC,GAChI,CAEA,SAAS,cAAc,EAAG,CACxB,IAAI,EAAI,EAAE,EAAG,EAAI,WAAW,EAAE,MAAM,GAAK,CAAC,EAAG,GAAK,EAAE,OAAS,OAC7D,OAAO,OAAO,KAAK,CAAC,EAAE,OAAO,SAAU,EAAG,CAAE,OAAQ,EAAE,SAAW,WAAa,YAAY,KAAK,CAAC,IAAM,KAAO,YAAY,EAAG,CAAC,EAAE,KAAK,SAAU,EAAG,CAAE,OAAO,WAAW,EAAG,CAAC,CAAG,CAAC,CAAG,CAAC,CACnL,CAIA,SAAS,eAAe,EAAG,CACzB,IAAI,EAAI,EAAE,EAAG,GAAK,EAAE,YAAc,EAAE,aAAe,CAAC,EAAG,IAAM,EAAE,SAAW,EAAE,UAAY,CAAC,EACrF,GAAK,SAAS,CAAC,EAAI,cAAc,CAAC,EAAI,CAAC,EAAG,GAAK,CAAC,GACnD,UAAU,EAAE,MAAM,GAAK,CAAC,GAAG,QAAQ,SAAU,EAAG,CAAE,IAAI,EAAI,UAAU,EAAG,CAAC,EAAG,EAAI,SAAS,EAAG,CAAC,EAAO,IAAG,GAAG,CAAC,EAAI,GAAO,IAAG,GAAG,EAAE,CAAC,EAAI,EAAG,CAAC,EACvI,OAAO,KAAK,GAAG,EAAE,QAAQ,SAAU,EAAG,CAAM,GAAG,QAAQ,CAAC,EAAI,IAAK,GAAG,CAAC,EAAI,IAAI,CAAC,IAAM,GAAM,OAAO,IAAI,CAAC,EAAK,CAAC,EAC5G,GAAG,QAAQ,SAAU,EAAG,CAAM,GAAG,CAAC,IAAiB,KAAK,MAAM,IAAI,CAAC,EAAI,GAAG,CAAC,IAAM,IAAM,GAAG,CAAC,EAAI,GAAM,CAAC,CACxG,CAIA,SAAS,eAAe,EAAG,CACzB,GAAI,CAAC,SAAS,CAAC,EAAG,OAAO,KACzB,IAAI,GAAK,cAAc,CAAC,EAAG,GAAI,CAAC,GAAG,OAAQ,OAAO,KAClD,IAAI,MAAQ,SAAU,EAAG,CAAE,MAAO,CAAC,YAAY,EAAG,CAAC,EAAE,MAAM,SAAU,EAAG,CAAE,OAAO,WAAW,EAAG,CAAC,CAAG,CAAC,CAAG,EACnG,IAAM,EAAE,gBACZ,SAAE,gBAAkB,SAAU,EAAG,EAAG,KAAM,QAAS,SAAU,OAAQ,CACnE,IAAI,EAAI,CAAC,EAAE,MAAM,KAAK,SAAS,EAC/B,OAAI,GAAG,QAAQ,IAAI,GAAK,GAAK,SAAW,YAAc,EAAE,SAAW,UAAY,MAAM,IAAI,KAAM,EAAE,CAAC,EAAI,GAAM,EAAE,CAAC,EAAI,GAAM,EAAE,CAAC,EAAI,iBAAkB,EAAE,CAAC,EAAI,MAClJ,IAAI,MAAM,KAAM,CAAC,CAC1B,EACO,UAAY,CAAE,EAAE,gBAAkB,GAAK,CAChD,CAEA,SAAS,aAAa,EAAG,CAAE,MAAO,QAAO,MAAM,CAAC,EAAI,4HAA+G,MAAM,KAAK,EAAI,+BAAiC,CACnN,SAAS,YAAY,EAAG,CAAE,IAAI,EAAI,GAAK,EAAE,GAAK,EAAE,EAAE,OAAQ,MAAO,CAAC,EAAE,aAAe,UAAU,CAAC,GAAK,SAAS,CAAC,IAAM,EAAE,UAAU,CAAC,EAAI,QAAU,SAAS,CAAC,IAAM,OAAO,CAAC,GAAK,KAAO,CAClL,SAAS,MAAM,EAAG,EAAG,CACnB,GAAI,CAAC,YAAY,CAAC,EAAG,MAAO,GAC5B,IAAI,EAAI,EAAE,EAAG,GAAI,WAAW,EAAG,CAAC,EAAG,MAAO,GAC1C,GAAI,EAAE,SAAW,WAAa,IAAM,SAAU,OAAO,EAAE,SAAW,GAClE,IAAI,EAAI,EAAE,SAAW,EAAE,QAAQ,EAAE,MAAM,EAAG,MAAO,CAAC,EAAE,GAAK,EAAE,CAAC,IAAM,GACpE,CACA,SAAS,UAAU,EAAG,EAAG,GAAI,CAC3B,IAAI,EAAI,EAAE,EAAG,GAAI,EAAE,SAAW,WAAa,IAAM,SAAU,CAAE,EAAE,OAAS,GAAI,MAAQ,CACpF,IAAI,EAAI,EAAE,QAAU,EAAE,SAAW,CAAC,GAAI,EAAE,EAAE,MAAM,EAAI,EAAE,EAAE,MAAM,GAAK,CAAC,GAAG,CAAC,EAAI,EAC9E,CAEA,SAAS,QAAQ,EAAG,EAAG,CACrB,IAAI,EAAI,EAAE,EAAG,GAAI,EAAE,SAAW,WAAa,IAAM,SAAU,OAAO,EAAE,eAAiB,KACrF,IAAI,EAAI,EAAE,aAAe,EAAE,YAAY,EAAE,MAAM,EAAG,OAAQ,GAAK,EAAE,CAAC,GAAM,IAC1E,CACA,SAAS,YAAY,EAAG,EAAG,EAAG,CAC5B,IAAI,EAAI,EAAE,EAAG,GAAI,EAAE,SAAW,WAAa,IAAM,SAAU,CAAM,EAAG,EAAE,cAAgB,EAAQ,OAAO,EAAE,cAAe,MAAQ,CAC9H,IAAI,EAAI,EAAE,YAAc,EAAE,aAAe,CAAC,EAAG,EAAI,EAAE,EAAE,MAAM,EAAI,EAAE,EAAE,MAAM,GAAK,CAAC,EAAO,EAAG,EAAE,CAAC,EAAI,EAAQ,OAAO,EAAE,CAAC,CACpH,CACA,SAAS,QAAQ,EAAG,CAAE,OAAQ,UAAU,EAAE,EAAE,MAAM,GAAK,CAAC,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,MAAM,EAAG,CAAC,CAAG,CAAC,CAAG,CACzG,SAAS,QAAQ,EAAG,CAAE,OAAO,QAAQ,CAAC,EAAE,IAAI,SAAU,EAAG,CAAE,OAAO,UAAU,EAAG,CAAC,CAAG,CAAC,EAAE,OAAO,OAAO,CAAG,CAEvG,IAAI,SAAW,CAAE,cAAe,CAAE,OAAQ,CAAC,CAAC,OAAQ,QAAQ,EAAG,GAAG,CAAE,EAAG,aAAc,CAAE,OAAQ,CAAC,CAAC,OAAQ,QAAQ,EAAG,GAAG,CAAE,EACvH,UAAW,CAAE,QAAS,CAAC,CAAC,SAAU,MAAM,EAAG,GAAG,EAAG,QAAS,CAAC,CAAC,OAAQ,QAAQ,EAAG,GAAG,CAAE,EACpF,UAAW,CAAE,QAAS,CAAC,CAAC,SAAU,MAAM,EAAG,KAAK,EAAG,OAAQ,CAAC,CAAC,OAAQ,QAAQ,EAAG,KAAK,EAAG,SAAU,CAAC,CAAC,SAAU,QAAQ,EAAG,KAAK,CAAE,EAChI,SAAU,CAAE,SAAU,CAAC,CAAC,SAAU,MAAM,EAAG,KAAK,EAAG,OAAQ,CAAC,CAAC,OAAQ,QAAQ,EAAG,KAAK,EAAG,SAAU,CAAC,CAAC,SAAU,QAAQ,EAAG,KAAK,CAAE,CAAE,EACpI,SAAS,QAAQ,EAAG,CAAE,IAAI,EAAI,EAAE,EAAG,EAAI,EAAE,OAAQ,OAAO,SAAS,IAAM,QAAW,EAAE,WAAa,OAAS,aAAe,cAAiB,IAAM,UAAa,EAAE,OAAS,OAAS,SAAW,UAAa,CAAC,GAAK,CAAC,CAAG,CAEnN,SAAS,KAAK,EAAG,EAAG,CAClB,IAAI,EAAI,GAAK,YAAY,CAAC,EAAI,QAAQ,CAAC,EAAE,CAAC,EAAI,KAAM,GAAI,CAAC,EAAG,OAAO,KACnE,IAAI,EAAI,EAAE,EAAG,EAAI,EAAE,OAAQ,EAAI,EAAE,CAAC,EAClC,MAAO,CAAE,OAAQ,EAAE,CAAC,EAAG,GAAI,OAAO,EAAG,CAAC,EAAG,IAAK,IAAM,QAAU,CAAC,CAAC,EAAE,MAAQ,CAAC,GAAG,IAAM,UAAY,EAAE,OAAS,EAAE,SAAW,CAAC,GAAG,CAAC,CAAE,CACjI,CACA,SAAS,OAAO,EAAG,EAAG,CAAE,IAAI,EAAI,KAAK,EAAG,CAAC,EAAG,MAAO,CAAC,EAAE,GAAK,CAAC,EAAE,IAAM,CAAC,EAAE,KAAO,MAAM,CAAC,GAAK,UAAU,QAAU,EAAI,CAClH,SAAS,MAAM,EAAG,EAAG,CAAE,IAAI,EAAI,QAAQ,CAAC,EAAE,CAAC,EAAG,MAAO,qBAAoB,KAAK,MAAM,EAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAI,OAAS,KAAK,MAAM,EAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAG,CAIrI,SAAS,YAAY,EAAG,CACtB,MAAO,8BAAgC,EAAE,GAAK,4CAA4C,4DACxF,gEACJ,CACA,SAAS,cAAc,EAAG,CACxB,OAAO,EAAE,GAAK,gFAA6E,8FAC7F,CACA,SAAS,WAAW,EAAG,CAAE,OAAO,YAAY,CAAC,GAAK,EAAE,EAAE,SAAW,SAAW,CAC5E,SAAS,KAAK,EAAG,CAAE,OAAO,WAAW,CAAC,GAAK,EAAE,EAAE,SAAW,EAAM,CAEhE,SAAS,UAAU,EAAG,CACpB,GAAK,YAAY,CAAC,EAClB,KAAI,EAAI,EAAE,EAAG,EAAE,YAAc,EAAE,aAAe,CAAC,EAAG,EAAE,gBAAkB,EAAE,iBAAmB,CAAC,EAC5F,UAAU,EAAE,MAAM,EAAE,QAAQ,SAAU,EAAG,CACvC,IAAI,GAAK,MAAM,EAAG,CAAC,EAAG,EAAI,UAAU,EAAG,CAAC,EACxC,CAAC,SAAS,EAAG,CAAC,CAAC,EAAE,OAAO,IAAM,EAAI,CAAC,EAAE,CAAC,EAAI,CAAC,CAAC,EAAE,QAAQ,SAAU,EAAG,CAAM,IAAK,EAAE,YAAY,CAAC,EAAI,GAAI,EAAE,gBAAgB,CAAC,EAAI,GAAM,CAAC,CACrI,CAAC,EACH,CAEA,SAAS,aAAc,CACrB,IAAI,EAAI,OAAO,EAAG,GAAI,GAAC,GAAK,CAAC,EAAE,GAAK,CAAC,EAAE,MACvC,KAAI,EAAI,SAAS,gBAAiB,GAAK,YAAY,CAAC,GAAK,CAAC,KAAK,CAAC,EAEhE,GADA,EAAE,UAAU,OAAO,eAAgB,EAAE,EACjC,EAAC,GAGL,KAAI,GAAK,YAAY,CAAC,EAAG,IAAM,SAAU,EAAG,CAAE,IAAI,EAAI,IAAM,GAAG,MAAM,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,KAAO,CAAG,CAAC,EAAE,CAAC,EAAG,MAAO,CAAC,EAAE,GAAK,EAAE,KAAO,EAAE,IAAM,EACjJ,QAAU,MAAM,CAAC,EAAE,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,CAAG,CAAC,EACvD,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,SAAU,EAAG,CACzC,IAAI,EAAI,MAAM,EAAG,CAAC,EAAG,EAAI,IAAI,CAAC,EAAG,GAAK,MAAM,EAAG,CAAC,EAAG,GAAK,QAAQ,EAAG,CAAC,EAAG,GAAK,IAAM,GAAG,MAAQ,QAAQ,CAAC,EAAE,GAAG,IAAI,EAAG,GAAK,WAAW,EAAG,CAAC,EAClI,GAAK,IAAI,CAAC,EAAG,KAAO,GAAK,mEAA+D,iCACxF,GAAK,GAAK,MAAQ,MAAM,EAAG,GAAG,IAAI,EAAI,sBAAqB,KAAK,CAAC,EAAG,IAAM,MAAM,CAAC,EAAI,MAAQ,OAAS,EAGtG,KAAO,EAAE,EAAE,SAAW,WAAa,IAAM,SAGzC,EAAI,GAAK,4BAA2B,KAAK,CAAC,EAAI,0CAC9C,GAAK,4BAA2B,KAAK,CAAC,EAAI,mDAAmD,GAAK,4CAAqC,KACvI,KAAQ,GAAK,4BAA2B,KAAK,CAAC,EAAI,mDAA4C,KAAO,mCACnG,4BAA2B,KAAK,CAAC,EAAI,2FACvC,GAAK,4BAA2B,KAAK,CAAC,EAAI,mDAA4C,KAAO,IAC7F,4BAA2B,KAAK,CAAC,EAAI,+EACrC,MAAQ,SAAUA,IAAI,IAAK,OAAQ,MAAO,CACxCA,IAAG,aAAa,MAAM,IAAM,YAAYA,IAAG,aAAa,OAAQ,UAAU,EAC1EA,IAAG,aAAa,cAAc,IAAM,OAAO,KAAK,GAAGA,IAAG,aAAa,eAAgB,OAAO,KAAK,CAAC,EAChG,SAAcA,IAAG,aAAa,eAAe,IAAM,QAAQA,IAAG,aAAa,gBAAiB,MAAM,EAAQA,IAAG,UAAU,SAAS,UAAU,GAAGA,IAAG,UAAU,IAAI,UAAU,GACxKA,IAAG,aAAa,YAAY,IAAM,KAAKA,IAAG,aAAa,aAAc,GAAG,EACxEA,IAAG,QAAU,MAAKA,IAAG,MAAQ,IACnC,EACI,EAAI,SAAS,EAAG,CAAC,EAAG,GAAK,GAAK,EAAE,KAAK,cAAc,oCAAsC,EAAI,IAAI,EACjG,KAAM,MAAM,GAAI,EAAG,CAAC,CAAC,IAAM,GAAI,EAAE,EAAG,QAAQ,KAAK,CAAC,GACtD,IAAI,EAAI,IAAM,UAAU,EAAG,CAAC,EAAG,IAAM,GAAK,EAAE,KAAK,cAAc,oCAAsC,EAAE,EAAI,IAAI,EAC3G,MAAO,MAAM,IAAK,YAAc,QAAQ,EAAE,GAAG,EAAI,0EAAkE,GAAM,EAAI,EAAG,QAAQ,KAAK,EAAE,CAAC,EACtJ,CAAC,EAKG,SAAS,CAAC,GAAG,MAAM,UAAU,QAAQ,KAAK,EAAE,KAAK,iBAAiB,8EAA8E,EAAG,SAAU,EAAG,CAClK,GAAI,UAAQ,QAAQ,EAAE,QAAQ,IAAI,GAAK,GACvC,KAAI,OAAS,EAAE,aAAa,YAAY,GAAK,IAAI,MAAM,oBAAoB,GAAK,CAAC,GAAG,CAAC,EAAG,EAAI,MAAQ,YAAc,KAAO,0CAA6C,IAClK,EAAE,aAAa,YAAY,IAAM,GAAG,EAAE,aAAa,aAAc,CAAC,EAClE,EAAE,QAAU,IAAG,EAAE,MAAQ,IAC/B,CAAC,GACH,CACA,SAAS,YAAa,CAAE,YAAY,CAAG,CAGvC,OAAO,iBAAiB,QAAS,SAAU,EAAG,CAC5C,IAAI,EAAI,OAAO,EAAG,GAAK,EAAE,QAAU,EAAE,OAAO,SAAW,EAAE,OAAO,QAAQ,kCAAkC,EAC1G,GAAI,GAAC,IAAM,CAAC,GAAK,CAAC,EAAE,GAAK,CAAC,EAAE,MAAQ,CAAC,EAAE,KAAK,SAAS,EAAE,GAAK,CAAC,EAAE,mBAAqB,CAAC,YAAY,CAAC,GAAK,KAAK,CAAC,GAC7G,KAAI,EAAI,GAAG,QAAQ,KAAM,EAAI,KAAM,KAAO,KAC1C,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,SAAU,EAAG,CAAM,SAAS,EAAG,CAAC,IAAM,IAAG,EAAI,GAAG,IAAI,EAAI,UAAU,EAAG,CAAC,EAAO,GAAK,EAAE,IAAM,GAAK,MAAM,EAAG,CAAC,IAAG,KAAO,EAAG,CAAC,EACrJ,IAAI,UAAY,UAAY,CAAM,EAAE,QAAQ,WAAW,UAAY,CAAE,EAAE,OAAO,CAAG,EAAG,CAAC,CAAG,EACxF,GAAI,CAAC,GAAK,CAAC,KAAM,CACf,IAAI,GAAK,SAAS,CAAC,GAAK,GAAG,QAAQ,cAAgB,iBAAmB,UAAU,EAAG,CAAC,EAAI,EACpF,GAAK,QAAS,EAAE,eAAe,EAAG,EAAE,gBAAgB,EAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAG,UAAU,aAAa,EAAE,CAAC,EAAG,UAAU,GAChK,MACF,CAGA,GAFA,EAAE,eAAe,EAAG,EAAE,gBAAgB,EAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAEhG,CAAC,EAAG,CAAM,MAAQ,WAAW,EAAG,IAAI,GAAG,UAAU,aAAa,WAAW,EAAG,IAAI,CAAC,CAAC,EAAG,UAAU,EAAG,MAAQ,CAC9G,IAAI,EAAI,MAAM,EAAG,CAAC,EAAG,GAAK,QAAQ,EAAG,CAAC,EACtC,GAAI,WAAW,EAAG,CAAC,EAAG,CAAE,UAAU,aAAa,WAAW,EAAG,CAAC,CAAC,CAAC,EAAG,UAAU,EAAG,MAAQ,CACxF,GAAI,GAAI,CAAE,UAAU,oBAAmB,KAAK,CAAC,EAAI,mCAAkC,GAAG,MAAQ,QAAQ,CAAC,EAAE,GAAG,IAAI,EAAI,MAAQ,MAAM,EAAG,GAAG,IAAI,EAAI,sBAAqB,KAAK,CAAC,GAAK,2CAAyC,EAAG,UAAU,EAAG,MAAQ,CACjP,GAAI,CAAC,MAAM,EAAG,CAAC,EAAG,CAAE,IAAI,GAAK,UAAU,EAAG,CAAC,EAAG,IAAM,GAAK,SAAS,EAAG,CAAC,GAAG,CAAC,CAAC,EAAI,CAAC,EAAG,GAAI,IAAI,OAAQ,CAAE,UAAU,WAAW,EAAG,GAAG,CAAC,EAAG,UAAU,EAAG,MAAQ,CAAE,CAC3J,UAAU,EAAG,EAAG,CAAC,MAAM,EAAG,CAAC,CAAC,EAAG,EAAE,OAAO,EACxC,IAAI,GAAK,EAAE,KAAK,cAAc,oCAAsC,EAAI,IAAI,EAAO,IAAI,GAAG,MAAM,EAClG,EAAG,EAAI,EAEP,SAAS,OAAO,EAAG,EAAG,CACpB,IAAI,IAAM,GAAK,EAAE,GAAK,EAAE,EAAE,OAAQ,OAAM,MAAQ,UAAY,MAAQ,SAAW,MAAQ,UACnF,QAAQ,EAAG,CAAC,EAAU,GACtB,MAAQ,UAAY,SAAS,CAAC,GAC9B,CAAC,YAAY,GAAG,EAAU,IAC9B,EAAI,GAAK,KAAO,UAAU,CAAC,EAAI,IAAI,CAAC,EAC7B,GAAK,UAAY,GAAK,UAAY,OAAO,CAAC,GAAK,MALoD,EAM5G,CAMA,SAAS,WAAW,EAAG,CACrB,IAAI,EAAI,EAAE,EAAG,EAAI,UAAU,CAAC,EAC5B,GAAI,EAAE,SAAW,QAAS,CACxB,IAAI,GAAK,EAAE,eAAiB,WAAa,CAAC,EAAE,MAC5C,MAAO,CAAE,EAAM,UAAW,EAAG,OAAQ,CAAC,CAAE,IAAK,iBAAkB,GAAI,IAAI,EAAE,EAAE,GAAK,GAAK,EAAI,EAAG,EAAG,CAAE,IAAK,SAAU,GAAI,IAAI,EAAE,EAAE,GAAK,GAAK,EAAI,EAAG,CAAC,EAC5I,SAAU,GAAK,oDAAsD,qDAAgD,CACzH,CACA,GAAI,EAAE,SAAW,UAAW,CAC1B,IAAI,EAAI,EAAE,QAAU,CAAC,EAAG,GAAK,EAAE,gBAAkB,WAAa,CAAC,EAAE,EAAG,GAAK,EAAE,iBAAmB,WAAa,CAAC,EAAE,EAC1G,KAAO,SAAU,EAAG,EAAG,CAAE,OAAO,EAAI,SAAW,EAAI,8CAAgD,yCAAqC,EAAI,kBAAoB,EACpK,MAAO,CAAE,EAAM,UAAW,EAAG,OAAQ,CAAC,CAAE,IAAK,eAAgB,GAAI,IAAI,EAAE,EAAE,GAAK,GAAK,EAAI,EAAG,EACxF,CAAE,IAAK,OAAQ,GAAI,IAAI,EAAE,EAAE,GAAK,GAAK,IAAI,EAAE,EAAE,EAAI,IAAM,GAAK,IAAI,EAAE,EAAE,EAAI,EAAG,EAAG,CAAE,IAAK,eAAgB,GAAI,IAAI,EAAE,EAAE,GAAK,GAAK,EAAI,EAAG,CAAC,EACnI,SAAU,KAAK,GAAI,QAAQ,EAAI,MAAQ,KAAK,GAAI,QAAQ,CAAE,CAC9D,CACA,OAAO,IACT,CAGA,SAAS,UAAU,EAAG,QAAS,CAC7B,IAAI,GAAK,WAAW,CAAC,EAAG,GAAI,CAAC,GAAI,MAAO,GACxC,IAAI,EAAI,GAAG,OAAO,IAAI,SAAU,EAAG,EAAG,CAAE,OAAQ,QAAU,IAAI,CAAC,EAAI,IAAM,IAAM,EAAE,IAAM,IAAM,MAAM,EAAE,EAAE,EAAI,SAAQ,MAAM,GAAG,CAAC,EAAI,KAAO,CAAC,EACzI,OAAI,QAAgB,EAAE,KAAK,KAAK,EAAI,eAAiB,GAAG,UAAY,EAAI,IAAM,IAAM,WAAa,GAAG,UAAY,EAAI,IAAM,IAAM,sBAAqB,GAAG,SACjJ,EAAE,MAAM,EAAG,EAAE,EAAE,KAAK,IAAI,EAAI,OAAS,EAAE,EAAE,OAAS,CAAC,EAAI,kCAA8B,GAAG,UAAY,EAAI,kCAAoC,4BACrJ,CACA,SAAS,KAAK,GAAI,CAAE,OAAQ,GAAK,KAAM,QAAQ,GAAK,GAAK,EAAI,CAAC,EAAE,QAAQ,IAAK,GAAG,CAAG,CACnF,OAAO,UAAY,SAAU,EAAG,CAAE,OAAO,OAAO,GAAK,OAAO,CAAC,CAAG,EAChE,OAAO,aAAe,SAAU,EAAG,CAAE,SAAI,GAAK,OAAO,EAAU,OAAO,CAAC,EAAK,QAAQ,CAAC,EAAI,SAAW,YAAe,CAAG,EAEtH,OAAO,iBAAmB,SAAU,EAAG,CAAE,EAAI,GAAK,OAAO,EAAG,IAAI,EAAI,MAAM,CAAC,EAAG,OAAO,EAAI,MAAQ,CAAG,EAEpG,OAAO,WAAa,SAAU,EAAG,CAC/B,EAAI,GAAK,OAAO,EAAG,IAAI,EAAI,GAAK,EAAE,GAAK,EAAE,EAAE,OAAQ,MAAI,CAAC,OAAS,EAAE,IAAM,SAAW,IAAM,YAAc,OAAO,CAAC,EAAU,KACnH,CAAE,MAAO,MAAO,MAAO,CAAE,EAAG,IAAM,SAAW,OAAO,EAAG,GAAG,EAAG,EAAG,IAAM,WAAa,OAAO,EAAG,GAAG,EAAG,EAAG,IAAM,WAAa,OAAO,EAAG,GAAG,CAAE,CAAE,CACnJ,EAEA,OAAO,YAAc,SAAU,EAAG,CAChC,EAAI,GAAK,OAAO,EAAG,IAAI,EAAI,GAAK,EAAE,EAAG,GAAI,CAAC,GAAK,EAAE,SAAW,UAAY,EAAE,OAAS,IAAM,OAAO,CAAC,GAAK,KAAM,MAAO,GACnH,IAAI,EAAI,WAAW,CAAC,EAAG,GAAI,EAAE,EAAI,QAAS,MAAO,GACjD,IAAI,GAAK,SAAU,GAAI,CAAE,OAAO,OAAO,KAAK,MAAM,GAAK,EAAE,CAAC,CAAG,EAAG,GAAK,IACrE,MAAO,QAAU,GAAG,CAAC,EAAI,GAAK,8KAC5B,KAAK,QAAQ,EAAI,GAAK,OAAS,GAAG,CAAC,IAAM,GAAG,SAAW,CAAC,EAAI,QAAO,GAAG,CAAC,EAAI,MAAQ,GAAG,CAAC,EAAI,SAAQ,GAAG,SAAW,CAAC,GAAK,GAAK,wGAChI,EACA,OAAO,WAAa,SAAU,EAAG,EAAG,CAAE,OAAO,OAAO,GAAK,OAAO,EAAG,CAAC,EAAI,SAAW,CAAG,EACtF,SAAS,KAAK,EAAG,CACf,GAAI,CAAC,OAAO,CAAC,EAAG,OAAO,KACvB,IAAI,GAAK,OAAO,CAAC,EAAG,EAAI,UAAU,CAAC,EAAG,EAAI,IAAI,EAAE,kBAAkB,CAAC,EAC/D,EAAI,IAAI,EAAE,eAAiB,EAAE,eAAe,EAAE,2BAA6B,EAAE,0BAA0B,CAAC,EAAI,CAAC,EACjH,GAAI,EAAE,EAAI,GAAK,EAAI,GAAI,OAAO,KAC9B,IAAI,KAAO,KAAK,MAAM,EAAI,CAAC,EAAG,GAAK,KAAK,CAAC,EACzC,GAAI,EAAE,EAAE,SAAW,SAAU,CAC3B,IAAI,GAAK,QAAQ,CAAC,EAAG,KAAO,IAAM,OAAS,EAAI,OAAS,IAAM,EAC1D,MAAQ,IAAM,SAAS,EAAG,GAAK,MAAQ,KAAK,IAAI,EAAG,MAAM,EAAI,EAC7D,QAAO,GAAK,MAAM,CAAC,GACvB,IAAI,MAAQ,KAAK,MAAM,GAAK,KAAK,IAAI,GAAK,EAAG,IAAI,EAAI,GAAI,EACrD,IAAM,IAAI,CAAC,EAAI,WAAU,KAAK,EAAE,EAAI,WAAU,MAAM,EAAE,EAAI,mBAAa,IAAI,KAAK,EAAI,WAAQ,KAAO,GAAK,EAAI,aAAe,OAAO,MAAM,EAAE,QAAQ,IAAK,GAAG,EAAI,UAAS,IACvK,EAAI,CAAE,GAAQ,EAAM,IAAK,EAAG,QAAS,GAAI,OAAQ,GAAK,SAAW,aAAe,IAAM,YAAa,MAAO,iBAAkB,MAAQ,KAAM,MAAO,IAAK,KAAM,IAAK,EACrK,GAAI,MAAO,CACT,IAAI,GAAK,KAAK,MAAM,GAAK,OAAS,EAAE,EAAI,IACxC,EAAE,UAAY,GAAI,EAAE,QAAU,GAAI,EAAE,KAAO,UAAW,EAAE,SAAW,IACnE,EAAE,MAAQ,IAAI,CAAC,EAAI,aAAY,GAAK,EAAI,GAAG,QAAQ,CAAC,EAAE,QAAQ,IAAK,GAAG,EAAI,MAAM,EAAE,GAAK,gBAAa,IAAI,KAAK,EAAI,SACnH,CACA,GAAI,CAAC,YAAa,CAChB,IAAI,IAAO,EAAE,MAAQ,EAAE,KAAK,eAAkB,CAAC,EAAG,KAAO,CAAE,MAAO,QAAS,KAAM,aAAW,MAAO,oBAAe,MAAO,kBAAa,EAAG,GAAK,SAAS,CAAC,EACxJ,EAAE,eAAiB,CAAC,QAAS,OAAQ,QAAS,OAAO,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,IAAM,OAAS,GAAK,IAAI,UAAY,CAAC,IAAM,IAAQ,EAAE,KAAO,IAAM,SAAW,IAAM,SAAW,CAAC,EAAE,IAAI,SAAU,EAAG,CAAE,OAAO,KAAK,CAAC,CAAG,CAAC,EAGzN,EAAE,MAAQ,GAAK,CAAC,sEAA4D,oEAAyD,EACjI,CAAC,QAAS,OAAO,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,IAAI,UAAY,CAAC,IAAM,IAAQ,EAAE,EAAE,aAAe,EAAE,EAAE,YAAY,CAAC,CAAG,CAAC,EAAE,IAAI,SAAU,EAAG,CAC5I,IAAI,GAAK,EAAE,MAAQ,EAAE,KAAK,cAAc,oCAAsC,EAAI,IAAI,EACtF,OAAO,KAAK,CAAC,GAAK,IAAM,GAAG,UAAU,SAAS,UAAU,EAAI,oCAAgC,aAC9F,CAAC,CACH,CAIA,GAAI,IAAM,aAAa,CAAC,GAAK,KAAO,MAAO,CACzC,IAAI,GAAK,EAAI,EAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ,IAAK,GAAG,EAAI,MAAM,CAAC,EACzD,EAAE,IAAM,CAAE,SAAU,MAAO,SAAU,KAAM,SAAU,GAAI,EACzD,EAAE,YAAc,KAAM,EAAE,iBAAmB,EAAG,EAAE,KAAO,KACvD,EAAE,MAAQ,IAAI,CAAC,EAAI,YAAW,GAAK,aAAU,IAAI,IAAI,EAAI,SAC3D,CACA,OAAO,CACT,CAEA,IAAI,GAAK,WAAW,CAAC,EAAG,KAAO,GAAG,OAAO,OAAO,SAAU,EAAG,EAAG,CAAE,OAAO,EAAI,EAAE,EAAI,EAAG,CAAC,EAAG,IAAM,KAAK,MAAM,GAAK,KAAO,EAAI,GAAG,EAC9H,MAAO,CAAE,GAAQ,EAAM,IAAK,KAAM,MAAO,EAAE,EAAE,SAAW,QAAU,IAAM,IAAK,WAAY,KAAK,MAAM,KAAO,EAAI,GAAG,EAAI,IAAK,UAAW,GAAG,UACvI,OAAQ,GAAG,OAAO,IAAI,SAAU,EAAG,CAAE,MAAO,CAAE,IAAK,EAAE,IAAK,YAAa,EAAE,GAAI,cAAe,CAAE,CAAG,CAAC,EAAG,SAAU,GAAG,SAClH,YAAa,IAAK,iBAAkB,IAAM,KAC1C,MAAO,IAAM,GAAG,OAAO,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,IAAM,KAAK,EAAE,EAAE,CAAG,CAAC,EAAE,KAAK,KAAK,EAAI,YAAW,GAAK,WAAU,MAAM,EAAE,EAAI,mBAAa,IAAI,GAAG,EAAI,SAAK,CACnK,CACA,OAAO,QAAU,UAAY,CAAE,IAAI,EAAI,OAAO,EAAG,OAAO,GAAK,CAAC,KAAK,CAAC,EAAI,KAAK,CAAC,EAAI,IAAM,EAGxF,OAAO,gBAAkB,SAAU,EAAG,CAAE,EAAI,GAAK,OAAO,EAAG,IAAI,EAAI,MAAM,CAAC,EAAG,OAAQ,IAAM,SAAW,IAAM,aAAe,UAAU,CAAC,GAAK,MAAQ,CAAC,YAAY,CAAC,GAAK,MAAQ,CAAG,EAGjL,OAAO,gBAAkB,SAAU,EAAG,CAAE,EAAI,GAAK,OAAO,EAAG,IAAI,EAAI,MAAM,CAAC,EAAG,OAAQ,IAAM,SAAW,IAAM,WAAa,IAAM,YAAc,OAAO,CAAC,CAAG,EAKxJ,SAAS,SAAS,EAAG,CACnB,IAAI,EAAI,EAAE,EACV,GAAI,EAAE,SAAW,QAAS,MAAO,CAAE,MAAO,EAAG,GAAI,CAC/C,CAAE,IAAK,iBAAkB,EAAG,IAAI,EAAE,EAAE,EAAG,EAAG,IAAI,EAAE,EAAE,EAAG,MAAO,CAAE,EAC9D,CAAE,IAAK,SAAU,EAAG,IAAI,EAAE,EAAE,EAAI,IAAI,EAAE,EAAE,EAAG,EAAG,IAAI,EAAE,EAAE,EAAG,MAAO,CAAE,CAAC,CAAE,EACvE,GAAI,EAAE,SAAW,UAAW,CAC1B,IAAI,GAAK,IAAI,EAAE,EAAE,EAAG,GAAK,IAAI,EAAE,EAAE,EAAG,GAAK,IAAI,EAAE,EAAE,EACjD,MAAO,CAAE,MAAO,EAAG,GAAI,CACrB,CAAE,IAAK,eAAgB,EAAG,GAAK,IAAI,EAAE,EAAE,EAAG,EAAG,GAAI,MAAO,CAAE,EAC1D,CAAE,IAAK,OAAQ,EAAG,GAAK,IAAI,EAAE,EAAE,EAAI,GAAI,EAAG,GAAI,MAAO,CAAE,EACvD,CAAE,IAAK,eAAgB,EAAG,GAAK,IAAI,EAAE,EAAE,EAAG,EAAG,GAAI,MAAO,CAAE,CAAC,CAAE,CACjE,CACA,OAAO,IACT,CAEA,SAAS,YAAY,EAAG,CACtB,IAAI,EAAI,SAAS,CAAC,EAAG,GAAI,CAAC,EAAG,OAAO,KACpC,IAAI,GAAK,UAAU,CAAC,EAAG,KAAO,IAAI,EAAE,kBAAoB,EAAE,kBAAkB,EAAI,CAAC,EAC7E,OAAS,CAAC,EAAG,OAAS,EAC1B,EAAE,GAAG,QAAQ,SAAU,EAAG,CACxB,IAAI,GAAK,EAAE,EAAI,EAAE,MAAQ,MACrB,GAAK,IAAK,OAAO,KAAK,CAAE,IAAK,EAAE,IAAK,GAAQ,WAAY,KAAK,IAAI,GAAI,SAAS,CAAE,CAAC,EAAG,QAAU,KAAK,IAAI,GAAI,SAAS,EAC1H,CAAC,EACD,IAAI,GAAK,KAAK,MAAM,OAAS,EAAE,EAC3B,KAAO,IAAI,EAAE,eAAiB,EAAE,eAAe,EAAI,CAAC,EAAI,KACxD,KAAO,IAAM,KAAO,KAAO,KAAK,MAAM,EAAE,MAAQ,GAAK,IAAM,GAAK,IAAI,EACxE,MAAO,CAAE,MAAO,EAAE,MAAO,iBAAkB,IAAM,KAAO,KAAO,KAAK,MAAM,GAAK,GAAG,EAAG,OAAgB,UAAW,GAC9G,kBAAmB,KAAM,WAAY,KAAK,MAAM,IAAI,EAAG,iBAAkB,MAAQ,KAAO,KAAO,KAAO,KAAK,MAAM,IAAI,CAAE,CAC3H,CAKA,IAAI,IAAM,CAAC,SAAK,SAAK,SAAK,SAAK,QAAG,EAClC,SAAS,cAAc,EAAG,CACxB,IAAI,EAAI,EAAE,EAAG,EAAI,MAAO,IAAM,CAAC,EAC3B,MAAQ,SAAU,IAAK,GAAI,IAAK,KAAMC,QAAQ,CAAM,GAAK,GAAG,IAAI,KAAK,CAAE,IAAU,GAAQ,IAAU,KAAY,OAAQA,QAAQ,EAAG,OAAO,GAAG,CAAE,CAAC,CAAG,EAClJ,MAAQ,SAAU,IAAK,EAAG,KAAM,CAAE,IAAI,KAAK,CAAE,MAAO,GAAM,KAAY,IAAU,KAAM,CAAC,EAAG,CAAC,EAAG,OAAQ,CAAC,EAAG,CAAK,CAAC,CAAG,EACvH,GAAI,EAAE,SAAW,QAAS,CACxB,IAAI,GAAK,IAAI,EAAE,EAAE,EAAG,GAAK,IAAI,EAAE,EAAE,EAAG,GAAK,IAAI,EAAE,EAAE,EAAG,EAAI,IAAI,EAAE,EAAE,EAAI,GACpE,OAAI,EAAE,WAAa,QACjB,MAAM,OAAQ,GAAK,EAAG,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,GAAK,EAAG,CAAC,EAAG,CAAC,GAAK,EAAG,EAAE,EAAG,CAAC,EAAG,EAAE,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,CAAC,GAAK,EAAG,CAAC,EAAG,CAAC,GAAK,EAAG,EAAE,CAAC,CAAC,CAAC,EACzG,MAAM,CAAC,CAAC,GAAK,EAAG,CAAC,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,GAAK,GAAI,CAAC,EAAG,CAAC,GAAK,GAAI,EAAE,EAAG,CAAC,GAAK,EAAG,EAAE,CAAC,EAAG,CAAC,GAAK,GAAK,EAAG,GAAK,CAAC,EAAG,GAAG,EAC5G,MAAM,SAAU,EAAI,EAAG,CAAC,CAAC,GAAK,GAAI,CAAC,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,GAAK,GAAI,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,CAAC,GAAK,GAAI,CAAC,EAAG,CAAC,GAAI,CAAC,CAAC,CAAC,CAAC,IAExG,MAAM,OAAQ,GAAK,EAAG,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,GAAI,EAAE,EAAG,CAAC,EAAG,EAAE,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,EAAE,CAAC,CAAC,CAAC,EACvF,MAAM,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,EAAE,EAAG,CAAC,GAAI,EAAE,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,EAAG,CAAC,GAAK,EAAG,GAAK,CAAC,EAAG,GAAG,EACjF,MAAM,SAAU,EAAI,EAAG,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,GAAI,CAAC,CAAC,CAAC,CAAC,GAEjF,GACT,CACA,GAAI,EAAE,SAAW,UAAW,CAC1B,IAAI,GAAK,IAAI,EAAE,EAAE,EAAG,GAAK,IAAI,EAAE,EAAE,EAAG,GAAK,IAAI,EAAE,EAAE,EAAG,EAAI,GAAK,IAAI,EAAE,EAAE,EAAI,GAAI,EAAI,GAAK,IAAI,EAAE,EAAE,EAAG,EAAI,GAAK,IAAI,EAAE,EAAE,EAClH,aAAM,eAAgB,EAAI,EAAG,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,GAAI,CAAC,CAAC,CAAC,CAAC,EAC5F,MAAM,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,EAAE,EAAG,CAAC,GAAI,EAAE,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,EAAG,CAAC,GAAK,EAAG,GAAK,CAAC,EAAG,GAAG,EACjF,MAAM,OAAQ,EAAI,EAAI,EAAG,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,EAAI,EAAG,CAAC,EAAG,CAAC,EAAI,EAAG,EAAE,EAAG,CAAC,EAAG,EAAE,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,EAAE,CAAC,EAAG,CAAC,CAAC,EAAI,EAAG,CAAC,EAAG,CAAC,EAAI,EAAG,EAAE,CAAC,CAAC,CAAC,EAC3H,MAAM,CAAC,CAAC,EAAI,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAI,GAAI,CAAC,EAAG,CAAC,EAAI,GAAI,EAAE,EAAG,CAAC,EAAI,EAAG,EAAE,CAAC,EAAG,CAAC,EAAI,GAAK,EAAG,GAAK,CAAC,EAAG,GAAG,EACrG,MAAM,eAAgB,EAAI,EAAG,CAAC,CAAC,EAAI,GAAI,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAI,GAAI,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,CAAC,EAAI,GAAI,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,CAAC,CAAC,EACjG,GACT,CACA,GAAI,EAAE,SAAW,UAAW,CAC1B,IAAI,GAAK,EAAE,OAAS,OAAQ,GAAK,IAAI,EAAE,KAAK,EAAG,IAAM,IAAI,EAAE,QAAQ,EAAG,GAAU,IAAL,GAAS,EAAE,OAAc,EAAE,OAAV,EAAoB,GAAU,IAAL,GAAS,EAAE,QAAe,EAAE,MAAV,EACnI,GAAK,GAAK,IAAI,EAAE,IAAI,EAAG,GAAK,GAAW,IAAL,GAAS,EAAE,MAAa,EAAE,MAAV,EAAoB,GAAK,GAAW,IAAL,GAAS,EAAE,OAAc,EAAE,KAAV,EACtG,aAAM,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,EAAE,EAAG,CAAC,GAAI,EAAE,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,EAAG,CAAC,GAAK,EAAG,GAAK,CAAC,EAAG,KAAK,EACnF,MAAM,CAAC,CAAC,GAAK,EAAG,CAAC,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,GAAI,CAAC,EAAG,CAAC,GAAK,GAAI,CAAC,EAAG,CAAC,GAAK,GAAI,EAAE,EAAG,CAAC,GAAK,EAAG,EAAE,CAAC,EAAG,CAAC,GAAK,GAAK,EAAG,GAAK,CAAC,EAAG,KAAK,EAC1G,GAAI,MAAM,CAAC,CAAC,GAAI,GAAK,CAAC,EAAG,CAAC,GAAI,EAAE,EAAG,CAAC,GAAK,EAAG,EAAE,EAAG,CAAC,GAAK,EAAG,GAAK,GAAG,EAAG,CAAC,GAAK,GAAI,GAAK,GAAG,EAAG,CAAC,GAAK,GAAI,GAAK,CAAC,CAAC,EAAG,CAAC,GAAK,GAAK,EAAG,GAAK,IAAM,CAAC,EAAG,KAAK,EAC/I,MAAM,CAAC,CAAC,EAAG,GAAK,CAAC,EAAG,CAAC,EAAG,EAAE,EAAG,CAAC,EAAG,EAAE,EAAG,CAAC,EAAG,GAAK,GAAG,EAAG,CAAC,GAAI,GAAK,GAAG,EAAG,CAAC,GAAI,GAAK,CAAC,CAAC,EAAG,CAAC,GAAK,EAAG,GAAK,IAAM,CAAC,EAAG,KAAK,EAC/G,GACT,CACA,OAAO,IACT,CACA,SAAS,OAAO,IAAK,CACnB,IAAI,GAAK,IAAI,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,CAAC,CAAG,CAAC,EAAG,GAAK,IAAI,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,CAAC,CAAG,CAAC,EAC3F,MAAO,EAAE,KAAK,IAAI,MAAM,KAAM,EAAE,EAAI,KAAK,IAAI,MAAM,KAAM,EAAE,GAAK,GAAI,KAAK,IAAI,MAAM,KAAM,EAAE,EAAI,KAAK,IAAI,MAAM,KAAM,EAAE,GAAK,CAAC,CAC9H,CAIA,SAAS,aAAa,EAAG,QAAS,CAChC,OAAQ,cAAc,CAAC,GAAK,CAAC,GAAG,IAAI,SAAU,EAAG,EAAG,CAClD,OAAI,QAAgB,EAAE,MAAQ,oBAAoB,MAAM,EAAI,MAAQ,EAAE,IAAM,IAAM,MAAM,EAAE,EAAE,EAAI,MACzF,IAAI,CAAC,EAAI,KAAO,EAAE,MAAQ,oBAAoB,MAAM,EAAI,SAAW,EAAE,IAAM,IAAM,MAAM,EAAE,EAAE,EAAI,MACxG,CAAC,EAAE,KAAK,QAAU,KAAO,KAAK,CAChC,CAEA,IAAI,QAAU,CAAE,KAAM,UAAW,iBAAkB,oBAAqB,OAAQ,YAAa,KAAM,UAAW,eAAgB,mBAAoB,eAAgB,kBAAmB,EACrL,SAAS,OAAO,EAAG,CACjB,IAAI,EAAI,SAAS,CAAC,EAAG,OAAK,EACnB,EAAE,GAAG,OAAO,SAAU,EAAG,CAAE,IAAI,GAAK,EAAE,EAAI,EAAE,MAAQ,MAAO,OAAO,GAAK,GAAK,GAAK,GAAK,CAAC,EAAE,IAAI,SAAU,EAAG,CAC/G,MAAO,YAAc,QAAQ,EAAE,GAAG,EAAI,OAAS,MAAM,EAAE,MAAQ,KAAK,EAAI,8BAA6B,MAAM,EAAE,EAAI,EAAE,MAAQ,KAAK,EAAI,MACtI,CAAC,EAAE,KAAK,GAAG,EAHyB,EAItC,CAKA,SAAS,cAAc,EAAG,CAAE,OAAO,SAAW,GAAK,EAAE,GAAK,EAAE,EAAE,SAAW,UAAY,IAAI,EAAE,EAAE,CAAC,GAAK,UAAY,UAAU,CAAC,GAAK,IAAM,CAGrI,SAAS,oBAAqB,CAC5B,MAAO,mBAAqB,MAAM,SAAW,CAAC,EAAI,+CAA8C,YAAY,OAAS,oBAAmB,IACtI,oCAAgC,MAAM,SAAW,CAAC,EAAI,iCAC1D,CAGA,SAAS,WAAY,CAAE,MAAO,uGAAmG,CACjI,SAAS,eAAgB,CAAE,MAAO,yBAA2B,MAAM,KAAK,EAAI,gFAAyE,MAAM,KAAK,EAAI,iCAAgC,CACpM,SAAS,gBAAgB,EAAG,CAAE,MAAO,aAAe,IAAM,QAAU,IAAM,KAAO,mHAAyG,CAC1L,SAAS,mBAAmB,EAAG,CAAE,MAAO,aAAe,IAAM,QAAU,IAAM,KAAO,eAAiB,MAAM,KAAK,EAAI,gDAA+C,YAAY,CAAC,EAAI,oBAAmB,IAAM,oCAAgC,MAAM,KAAK,EAAI,iCAAgC,CAG5R,SAAS,UAAU,EAAG,CACpB,IAAI,EAAI,MAAM,CAAC,EAAG,IAAM,CAAC,EACrB,IAAM,SAAU,GAAI,GAAI,IAAK,MAAO,CAAE,IAAI,KAAK,CAAE,GAAQ,GAAI,CAAC,CAAC,GAAI,SAAU,GAAM,QAAS,IAAM,MAAQ,MAAQ,GAAI,CAAC,CAAG,EAC9H,GAAI,CAAC,EAAK,OAAI,cAAc,CAAC,GAAG,IAAI,mBAAoB,GAAO,mBAAmB,CAAC,EAAU,IAC7F,GAAI,IAAM,WAAa,CAAC,OAAO,CAAC,EAC9B,WAAI,WAAY,GAAO,UAAU,CAAC,EAAI,OAAS,SAAS,CAAC,EACrD,yBAA2B,MAAM,KAAK,EAAI,gFAAyE,MAAM,KAAK,EAAI,kCAClI,uGAAiG,EAC9F,IAET,GAAI,OAAO,CAAC,EAAG,CACb,IAAI,GAAK,MAAM,CAAC,EAAG,GAAK,EAAE,EAAG,MAAQ,OAAO,CAAC,GAAK,KAAO,SAAW,MACpE,GAAI,CAAC,GACH,WAAI,KAAK,CAAE,GAAI,eAAgB,GAAI,GAAO,SAAU,GAAM,QAAS,GAAM,OAAQ,wBAAsB,QAAS,OAAO,gBAAkB,mFAA4E,CAAC,EAC/M,IAEL,IAAM,WAAW,IAAI,mBAAoB,GAAG,OAAQ,0GACtD,yEAA0E,EACxE,GAAG,IAAI,IAAI,oBAAqB,UAAU,CAAC,GAAK,KAAM,gHACxD,iDAAyC,EAE3C,IAAI,SAAW,GAAG,WAAa,CAAC,GAAG,KAAK,OAAO,EAC/C,GAAG,OAAO,QAAQ,SAAU,EAAG,CAI7B,IAAI,GAAK,EAAE,IAAK,GAAK,gBAAkB,KAAO,eAAiB,OAAS,IAAI,QAAQ,OAAQ,GAAG,EAC3F,GAAK,MAAM,EAAG,EAAE,EAAE,EAAG,GAAK,KAAK,EAAE,EAAG,IAAM,MAAM,EAAE,EAAI,MAAQ,OAAS,GAAI,GAAK,GAAG,OAAO,CAAC,EAAE,YAAY,EAAI,GAAG,MAAM,CAAC,EAC3H,IAAI,GAAK,cAAe,EAAE,GAAK,OAAS,EAAE,GAAK,MAAO,cAAgB,GAAK,MAAQ,MAAM,EAAE,CAAC,EAAI,sBAAwB,MAAM,KAAK,EAAI,SAAQ,MAAM,KAAK,EAAI,MAC5J,cAAgB,GAAK,SAAW,MAAM,KAAK,EAAI,SAAQ,MAAM,KAAK,EAAI,YAAc,MAAM,EAAE,CAAC,EAAI,MAAM,EAGzG,IAAI,KAAO,cAAU,GAAK,qDAAqD,EAAE,GAAK,EAAI,OAAS,MAAM,CAAC,EAAE,EAAE,EAAI,eAAiB,IAE/H,KAAO,EAAE,GAAK,QAAU,OAAO,OAAO,WAAc,WAAa,OAAO,UAAU,EAAG,QAAU,EAAE,GAAG,EAAI,KACxG,QAAU,KAAO,uBAAsB,KAAK,EAAI,SAAQ,MAAM,KAAK,GAAG,EAAI,cAAgB,KAC1F,EAAE,GAAI,IAAI,GAAI,EAAE,KAAO,GAAM,EAAE,IAAM,WAAa,EAAE,IAAM,QAC3D,EAAE,GAAK,EAAI,KACR,EAAE,GAAK,UAAY,cAAU,GAAK,qBAAuB,MAAM,UAAY,EAAE,EAAE,EAAI,+BAAiC,MAAM,EAAE,EAAE,EAAI,MAClI,cAAU,GAAK,yCAAyC,SAAW,uBAAyB,MAAM,EAAE,GAAK,MAAM,EAAI,iBAAmB,WAAW,EACrJ,6BAA6B,GAAK,WAAa,MAAM,EAAE,EAAE,EAAI,gCAA+B,MAAM,SAAS,EAAI,SAAQ,MAAM,MAAM,EAAI,MAAQ,WAAW,CAAC,EACxJ,IAAI,GAAI,EAAE,GAAK,GAAK,EAAE,IAAM,QAC9B,EAAE,GAAK,EAAI,GAAK,MAAQ,MAAM,EAAE,EAAE,EAAI,QAAU,MAAM,MAAM,EAAI,kCAAqC,SAAW,gCAA4B,QAAU,qCAAuC,IAAM,MAAQ,WAAW,EACvN,GAAK,WAAa,MAAM,EAAE,EAAE,EAAI,SAAW,MAAM,MAAM,EAAI,uBAAyB,WAAW,CAAC,CACpG,CAAC,EAGD,IAAIC,QAAS,CAAE,MAAO,CAAE,EAAG,CAAC,OAAQ,QAAQ,CAAE,EAAG,UAAW,CAAE,EAAG,CAAC,SAAU,MAAM,EAAG,EAAG,CAAC,OAAQ,QAAQ,CAAE,EACzG,UAAW,CAAE,IAAK,CAAC,SAAU,MAAM,EAAG,IAAK,CAAC,OAAQ,QAAQ,EAAG,IAAK,CAAC,GAAG,OAAS,OAAS,SAAW,SAAU,QAAQ,CAAE,CAAE,EACzH,SAAW,CAAE,EAAG,cAAY,EAAG,cAAY,IAAK,sBAAoB,IAAK,sBAAoB,IAAK,WAAY,EAAG,KAAO,MAAM,GAAG,MAAM,GAAK,CAAC,GAAG,OAAS,EACzJ,MAAQ,SAAU,EAAG,CAAE,IAAI,EAAI,MAAM,EAAG,EAAE,EAAE,EAAG,OAAQ,MAAM,CAAC,EAAI,MAAQ,OAAS,CAAG,EAC1F,OAAC,MAAM,GAAG,MAAM,GAAK,CAAC,GAAG,QAAQ,SAAU,EAAG,CAC5C,GAAK,OAAO,EAAG,CAAC,EAChB,KAAI,mBAAqB,EAAG,KAAK,IAAI,UAAU,EAAG,CAAC,EAAI,EAAE,EAAI,IAAM,kHACjE,qCAAgC,EAClC,IAAI,IAAMA,QAAO,GAAG,MAAM,GAAK,CAAC,GAAG,CAAC,GAAK,CAAC,EAAG,EAAI,GAAG,OAAO,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,KAAO,GAAG,CAAC,CAAG,CAAC,EAAE,CAAC,EAAGC,GAAI,GAAG,OAAO,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,KAAO,GAAG,CAAC,CAAG,CAAC,EAAE,CAAC,EAC1K,GAAKA,IAAG,IAAI,2BAA6B,EAAG,EAAE,IAAMA,GAAE,EACxD,oBAAoB,IAAM,IAAM,SAAS,CAAC,EAAI,IAAM,MAAQ,MAAM,CAAC,EAAI,KAAO,MAAM,EAAE,CAAC,EAAI,WAAa,MAAMA,EAAC,EAAI,KAAO,MAAMA,GAAE,CAAC,EAAI,iHAChE,IAAM,gBAAe,IAC5F,oBAAoB,IAAM,IAAM,SAAS,CAAC,EAAI,IAAM,MAAQ,MAAM,CAAC,EAAI,OAAS,MAAMA,EAAC,EAAI,gCAA4B,MAAM,EAAE,CAAC,EAAI,MAAM,EAC9I,CAAC,EACM,GACT,CACA,IAAI,EAAI,SAAS,CAAC,EAAG,EAAI,EAAE,EAAG,GAAK,IAAM,QAAU,IAAM,IACrD,GAAK,EAAE,GAAG,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,CAAG,CAAC,EAAG,EAAI,GAAG,CAAC,EAAG,IAAM,EAAI,MAAO,GAAK,UAAU,CAAC,GAAK,KAAO,SAAW,MAE/G,IAEA,IAAI,mBAAoB,UAAU,CAAC,GAAK,KAAM,YAAc,GAAK,eAAiB,MAAM,KAAK,EAAI,gDAA+C,YAAY,CAAC,EAAI,oBAAmB,IACvL,oCAAgC,MAAM,KAAK,EAAI,kCAC/C,YAAc,GAAK,eAAiB,MAAM,KAAK,EAAI,0DAAiD,EAJ5F,IAAI,oBAAqB,UAAU,CAAC,GAAK,KAAM,YAAc,GAAK,oHAC1E,YAAc,GAAK,iCAA2B,EAIhD,IAAI,IAAM,GAAG,MAAM,SAAU,EAAG,CAAE,OAAO,GAAK,OAAS,GAAK,EAAI,CAAC,GAAK,GAAG,MAAM,SAAU,EAAG,CAAE,OAAO,IAAM,CAAG,CAAC,EAC/G,IAAI,oBAAqB,IAAK,MAAQ,GAAK,mCAAkC,MAAM,KAAK,EAAI,SAAQ,MAAM,EAAE,EAAI,4DAC9G,MAAQ,GAAK,mBAAqB,MAAM,KAAK,EAAI,SAAQ,MAAM,EAAE,EAAI,oCAAiC,EACxG,EAAE,GAAG,QAAQ,SAAU,EAAG,CACxB,IAAI,GAAK,kBAAoB,EAAE,IAAI,QAAQ,OAAQ,GAAG,EACtD,GAAI,IAAK,CACP,IAAI,GAAK,EAAE,MAAQ,EAAI,UAEvB,IAAI,GAAI,EAAE,GAAK,IAAM,EAAE,GAAK,OAAQ,WAAa,GAAK,gDAAmC,EAAE,IAAM,gBAAe,MAAM,EAAE,CAAC,EAAI,yCAA2C,MAAM,EAAE,EAAI,SAAQ,MAAM,MAAM,EAAI,8BAC1M,kCAAwB,EAAE,IAAM,yBAAwB,MAAM,EAAE,EAAI,SAAQ,MAAM,MAAM,EAAI,sBAAwB,MAAM,EAAE,CAAC,EAAI,MAAM,EACzI,MACF,CAEA,IAAI,MAAQ,EAAE,MAAQ,MAAO,KAAO,MAAQ,UACxC,GAAK,EAAE,IAAM,OAAU,EAAE,GAAK,MAAQ,EAAE,GAAK,OACjD,IAAI,GAAI,GAAI,gDAAuC,EAAE,IAAM,gBAAe,MAAM,EAAE,CAAC,EAAI,uCAAyC,MAAM,KAAK,EAAI,yBAA2B,MAAM,IAAI,EAAI,SAAQ,MAAM,MAAM,EAAI,8BAC9M,gDAAuC,EAAE,IAAM,sBAAqB,MAAM,KAAK,EAAI,cAAgB,MAAM,IAAI,EAAI,SAAQ,MAAM,MAAM,EAAI,sBAAwB,MAAM,EAAE,CAAC,EAAI,MAAM,CACxL,CAAC,EACD,IAAI,KAAO,IAAM,QAAU,CAAC,IAAI,EAAE,UAAU,GAAK,EAAE,GAAK,UAAY,CAAE,IAAI,EAAI,EAAE,OAAS,EAAE,MAAM,SAAS,EAAG,OAAO,EAAI,CAAC,IAAI,EAAE,CAAC,GAAK,GAAI,IAAI,EAAE,CAAC,GAAK,EAAE,EAAI,CAAC,EAAE,CAAG,GAAG,EACpK,WAAI,kBAAmB,KAAK,MAAM,SAAU,EAAG,CAAE,OAAO,KAAK,IAAI,EAAI,EAAE,EAAI,GAAM,CAAC,GAAI,IAAM,WAAa,GAAK,0BAAsB,oBAAoB,iEACrJ,IAAM,WAAa,GAAK,0BAAsB,oBAAoB,iCAA2B,EACzF,GACT,CAIA,OAAO,gBAAkB,SAAU,EAAG,CACpC,EAAI,GAAK,OAAO,EAAG,IAAI,EAAI,GAAK,EAAE,EAAI,MAAM,CAAC,EAAI,KAAM,IAAM,CAAC,EAC9D,GAAI,CAAC,EAAG,OAAO,IACf,GAAI,OAAO,CAAC,EAAG,CACb,IAAI,GAAK,MAAM,CAAC,EAAG,OAAI,IAAI,GAAG,OAAO,QAAQ,SAAU,EAAG,CAAE,IAAI,KAAK,CAAE,IAAK,QAAU,EAAE,IAAK,IAAK,EAAE,IAAK,GAAI,EAAE,GAAI,IAAK,MAAO,CAAC,CAAG,CAAC,EAC7H,GACT,CACA,GAAI,IAAM,UAAW,OAAO,IAC5B,IAAI,EAAI,SAAS,CAAC,EAAG,OAAI,GAAG,EAAE,GAAG,QAAQ,SAAU,EAAG,CAAE,IAAI,KAAK,CAAE,IAAK,WAAa,EAAE,IAAK,IAAK,EAAE,IAAK,GAAI,EAAE,EAAG,IAAK,MAAO,CAAC,CAAG,CAAC,EAC3H,GACT,EAIA,SAAS,QAAQ,EAAG,CAClB,IAAI,EAAI,GAAK,EAAE,EAAI,MAAM,CAAC,EAAI,KAC9B,GADwC,CAAC,IACrC,SAAS,CAAC,EAAI,CAAC,OAAO,CAAC,EAAK,IAAM,WAAa,OAAO,CAAC,GAAI,OAAO,KACtE,IAAI,IAAM,MAAM,CAAC,GAAK,CAAC,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,OAAO,EAAG,CAAC,GAAK,KAAK,IAAI,UAAU,EAAG,CAAC,EAAI,EAAE,EAAI,GAAM,CAAC,EAC/G,OAAO,GAAG,OAAS,CAAE,EAAG,MAAO,MAAO,EAAG,EAAI,IAC/C,CACA,OAAO,eAAiB,SAAU,EAAG,CAAE,SAAI,GAAK,OAAO,EAAU,EAAI,QAAQ,CAAC,EAAI,IAAM,EACxF,OAAO,eAAiB,UAAY,CAClC,IAAI,EAAI,OAAO,EAAG,GAAI,CAAC,GAAK,CAAC,EAAE,EAAG,OAAO,KACzC,IAAI,GAAK,MAAM,CAAC,IAAM,MAAM,CAAC,IAAM,WAAa,SAAS,CAAC,GAAI,GAAK,IAAM,OAAO,CAAC,EAAG,GAAK,IAAM,CAAC,IAAM,SAAS,CAAC,EAChH,MAAO,CAAE,MAAO,MAAM,CAAC,EAAG,WAAY,UAAU,CAAC,EAAG,YAAa,IAAM,CAAC,GAAM,GAAK,YAAY,CAAC,EAAI,YAAY,CAAC,EAAK,KACpH,QAAS,GAAM,GAAK,UAAU,EAAG,EAAI,EAAI,GAAK,YAAY,EAAG,EAAI,EAAI,aAAa,CAAC,EAAK,KACxF,OAAQ,IAAM,CAAC,IAAM,CAAC,GAAK,cAAc,CAAC,EAAI,KAAM,KAAM,GAAK,KAAK,CAAC,EAAI,KAAM,UAAW,UAAU,CAAC,CAAE,CAC3G,EAKA,SAAS,KAAK,EAAG,CACf,IAAI,EAAI,MAAM,CAAC,EAAG,GAAI,CAAC,EAAG,OAAO,cAAc,CAAC,EAAI,CAAE,KAAM,QAAS,MAAO,mBAAmB,EAAI,IAAK,EAAI,KAC5G,GAAI,IAAM,WAAa,CAAC,SAAS,CAAC,EAAG,MAAO,CAAE,KAAM,QAAS,MAAO,UAAU,EAAI,IAAK,EACvF,GAAI,IAAM,WAAa,UAAU,CAAC,EAAI,OAAS,CAAC,SAAS,CAAC,EAAG,MAAO,CAAE,KAAM,QAAS,MAAO,cAAc,EAAI,IAAK,EACnH,IAAI,GAAK,IAAM,QAAU,IAAM,IAC/B,GAAI,IAAM,WAAa,UAAU,CAAC,EAAI,OAAS,GAAI,SAAS,CAAC,EAAI,CAAC,SAAS,CAAC,EAAI,UAAU,CAAC,GAAK,KAAM,MAAO,CAAE,KAAM,QAAS,MAAO,mBAAmB,CAAC,EAAI,IAAK,UACzJ,CAAC,SAAS,CAAC,GAAK,UAAU,CAAC,GAAK,KAAM,MAAO,CAAE,KAAM,QAAS,MAAO,gBAAgB,CAAC,EAAI,IAAK,EACxG,IAAI,GAAK,UAAU,CAAC,EAAE,OAAO,SAAU,EAAG,CAAE,MAAO,CAAC,EAAE,EAAI,CAAC,EAEvD,GAAK,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,OAAS,CAAC,EAAE,CAAC,EACxD,GAAI,GAAI,MAAO,CAAE,KAAM,OAAQ,QAAS,GAAM,MAAO,GAAG,QAAU,GAAI,EAEtE,IAAI,IAAM,GAAG,IAAI,SAAU,EAAG,CAAE,OAAO,OAAO,EAAE,OAAO,EAAE,QAAQ,SAAU,EAAE,CAAG,CAAC,EAAE,KAAK,KAAK,EAC7F,OAAI,GAAG,OAAe,CAAE,KAAM,OAAQ,MAAO,sCAAsC,KAAO,SAAS,KAAK,GAAG,EAAI,IAAM,KAAM,EACpH,IACT,CACA,SAAS,SAAS,EAAG,CACnB,IAAI,EAAI,KAAK,CAAC,EAAG,EAAI,SAAS,gBAAiB,IAAM,SAAS,eAAe,cAAc,EAAG,EAAI,SAAS,eAAe,gBAAgB,EAG1I,GAFA,EAAE,UAAU,OAAO,mBAAoB,CAAC,CAAC,CAAC,EAC1C,EAAE,aAAa,iBAAkB,EAAI,EAAE,KAAO,EAAE,EAC5C,CAAC,EAAG,CAAM,GAAK,EAAE,YAAY,EAAE,WAAW,YAAY,CAAC,EAAG,MAAQ,CACtE,GAAI,GAAC,KAAO,CAAC,IAAI,YACjB,CAAK,IACH,EAAI,SAAS,cAAc,GAAG,EAAG,EAAE,GAAK,iBAAkB,EAAE,aAAa,OAAQ,QAAQ,EACzF,EAAE,MAAM,QAAU,sHAClB,IAAI,WAAW,aAAa,EAAG,GAAG,GAIpC,IAAI,EAAI,EAAE,MAAM,QAAQ,OAAQ,EAAE,EAAG,KAAO,EAAE,OAAS,SAAW,EAAE,QAAS,EAAI,KAAO,EAAE,OAAO,uBAAuB,EAAI,GAC5H,GAAI,EAAE,aAAa,eAAe,IAAM,IACxC,EAAE,aAAa,gBAAiB,CAAC,EACjC,EAAE,YAAc,EAAI,EAAI,EAAI,EAAE,MAAM,EAAG,CAAC,EACpC,IAAI,IACR,KAAI,EAAI,EAAE,MAAM,CAAC,EAAE,MAAM,gBAAgB,EAAE,CAAC,EACxC,EAAI,SAAS,cAAc,GAAG,EAAG,EAAE,KAAO,QAAS,EAAE,YAAc,EAAG,EAAE,MAAM,QAAU,4CAC5F,EAAE,YAAY,CAAC,EAAG,EAAE,YAAY,SAAS,eAAe,EAAE,MAAM,EAAI,EAAE,MAAM,CAAC,CAAC,GAChF,CACA,SAAS,WAAY,CACnB,GAAI,UAAS,eAAe,eAAe,EAC3C,KAAI,GAAK,SAAS,cAAc,OAAO,EAAG,GAAG,GAAK,gBAGlD,GAAG,YAAc,w3BAS8J,QAAQ,EAAI,SAAS,EAAI,WAAW,EAAI,SAAS,EAAI,aAAa,GAChP,SAAS,MAAQ,SAAS,iBAAiB,YAAY,EAAE,EAC5D,CAEA,SAAS,YAAa,CACpB,IAAI,EAAI,SAAS,gBAAiB,GAAK,EAAE,UAAU,SAAS,kBAAkB,EAC9E,KAAI,EAAI,SACR,CAAC,eAAgB,gBAAiB,oBAAqB,YAAY,EAAE,QAAQ,SAAU,GAAI,CACzF,IAAI,EAAI,SAAS,eAAe,EAAE,EAAO,GAAK,EAAE,cAAgB,IAAG,EAAE,YAAc,EACrF,CAAC,EACH,CACA,SAAS,WAAW,EAAG,CACrB,IAAI,EAAI,MAAM,CAAC,EAAG,GAAK,SAAS,eAAe,iBAAiB,EAChE,SAAS,gBAAgB,UAAU,OAAO,kBAAmB,CAAC,CAAC,GAAK,CAAC,SAAS,CAAC,CAAC,EAGhF,SAAS,gBAAgB,UAAU,OAAO,cAAe,IAAM,WAAa,EAAE,SAAS,CAAC,GAAK,OAAO,CAAC,GAAK,KAAK,EAC/G,IAAI,IAAM,IAAM,SAAW,IAAM,WAAc,IAAM,WAAa,SAAS,CAAC,IAAO,CAAC,KAAK,CAAC,EAAG,GAAK,IAAM,OAAO,CAAC,EAAG,GAAK,IAAM,CAAC,IAAM,SAAS,CAAC,EAAG,EAAI,IAAM,CAAC,IAAM,CAAC,GAAK,YAAY,CAAC,EAAI,KAC1L,GAAI,CAAC,GAAK,CAAC,IAAM,CAAC,GAAI,CAAM,IAAM,GAAG,YAAY,GAAG,WAAW,YAAY,EAAE,EAAG,MAAQ,CACxF,IAAI,KAAO,SAAS,eAAe,iBAAiB,GAAM,SAAS,eAAe,OAAO,GAAK,SAAS,eAAe,OAAO,EAAE,WAC/H,GAAK,KACL,CAAK,KAAM,GAAK,SAAS,cAAc,GAAG,EAAG,GAAG,GAAK,kBAAmB,KAAK,YAAY,EAAE,GAC3F,IAAI,GAAK,IAAM,GAAK,GAAK,OAAO,CAAC,EAAG,EAAI,iBAAgB,GAAK,UAAU,CAAC,EAAI,GAAK,YAAY,EAAG,EAAK,EAAI,aAAa,EAAG,EAAI,GAAK,KAAO,GAAK,IAAM,GAAK,IACrJ,GAAG,cAAgB,IAAG,GAAG,YAAc,GAC7C,CAIA,SAAS,eAAe,EAAG,GAAI,CAC7B,IAAI,EAAI,MAAM,CAAC,EACY,GADL,EAAE,IAAM,SAAW,IAAM,WAAa,IAAM,YAAc,KAAK,CAAC,GAAK,KAAK,CAAC,GAAK,CAAC,SAAS,CAAC,IACjH,GAAK,IAAM,YAAY,CAAC,EAAO,CAAC,IAAI,OAAO,KAC3C,IAAI,EAAI,GAAG,MAAM,OAAO,SAAU,EAAG,EAAG,CAAE,OAAO,GAAK,EAAE,WAAa,EAAI,KAAK,MAAM,EAAE,WAAa,EAAE,EAAI,EAAI,EAAG,CAAC,EACjH,OAAO,EAAI,EAAI,EAAI,IACrB,CACA,OAAO,kBAAoB,UAAY,CAAE,IAAI,EAAI,OAAO,EAAG,OAAO,GAAK,EAAE,EAAI,eAAe,CAAC,EAAI,IAAM,EAIvG,IAAI,WAAa,6CACjB,SAAS,eAAe,EAAG,GAAI,CAC7B,IAAI,GAAK,SAAS,eAAe,qBAAqB,EAAG,GAAK,GAC9D,KAAI,KAAO,GAAG,YAAY,QAAQ,WAAY,EAAE,EAAG,EAAI,eAAe,EAAG,EAAE,EAAG,GAAK,KAAK,MAAM,IAAI,EAAE,EAAE,KAAK,CAAC,EAAG,EAAI,KACnH,GAAI,GAAK,IAAM,GAAI,CACjB,IAAI,KAAO,OAAO,kBAAoB,CAAC,EAAG,MAAQ,IAAI,KAAK,KAAK,GAAK,EAAG,MAAQ,OAAO,KAAK,gBAAkB,IAAI,EAAE,KAAK,EACrH,GAAK,EAAI,OAAO,eAAe,QAAS,CAAE,sBAAuB,EAAG,sBAAuB,CAAE,CAAC,EAAI,IAAM,MAAO,EAAI,EAAE,EAAG,EAAI,EAAE,OAC9H,IAAM,IAAM,QAAU,CAAC,CAAC,EAAE,MAAQ,OAAO,MAAM,IAAM,UAAY,EAAE,OAAS,EAAE,SAAW,CAAC,CAAC,EAAE,KAAK,SAAU,EAAG,CAAE,OAAQ,IAAM,UAAY,EAAE,OAAS,EAAE,QAAQ,CAAC,CAAG,CAAC,EACrK,GAAK,GAAG,MAAM,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,WAAa,CAAG,CAAC,EAAG,KAAO,GAAG,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,GAAG,CAAC,EAAE,CAAG,CAAC,EAAG,KAAO,GAAG,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,WAAa,EAAE,EAAI,CAAC,EAC1L,EAAI,MAAQ,GAAG,GAAK,uBAAsB,EAAI,uBAAuB,IAAM,gBAAe,EAAI,uBAC1F,KAAO,gBAAe,EAAI,gCAA+B,KAAO,gBAAe,EAAI,aAAe,gBAAe,EAAI,0BAC3H,CACI,GAAG,cAAgB,IAAG,GAAG,YAAc,GAC7C,CACA,SAAS,SAAS,EAAG,CACnB,IAAI,EAAI,MAAM,CAAC,EAAG,GAAK,SAAS,eAAe,cAAc,EACzD,GAAK,IAAM,CAAC,KAAK,CAAC,EAAI,KAAK,CAAC,EAAI,KACpC,GAAI,GAAI,CACN,IAAI,GAAK,GAAG,MAAQ,WAAa,GAAG,MAAQ,4CAAqC,GAAG,MAChF,GAAG,QAAU,MAAM,QAAQ,sBAAuB,EAAE,GAAK,GAAG,OAAS,UAAY,KAAO,GAAG,OAAS,KAAO,MAAQ,iBAAgB,GAAG,MAAQ,2CAAoC,GAAG,MACrL,GAAG,cAAgB,KAAI,GAAG,YAAc,IAAI,MAClD,CACA,GAAI,GAAC,IAAM,EAAE,IAAM,SAAW,IAAM,WAAa,IAAM,YAAc,KAAK,CAAC,GAC3E,IAAI,SAAS,CAAC,EAAG,CACf,IAAI,GAAK,YAAY,CAAC,EAAG,GAAI,CAAC,GAAI,OAClC,IAAI,GAAK,SAAUC,GAAG,CAAE,OAAOA,GAAI,EAAIA,GAAE,QAAQ,CAAC,EAAE,QAAQ,IAAK,GAAG,EAAI,MAAMA,EAAC,CAAG,EAK9E,GAAK,GAAG,MAAM,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,WAAa,CAAG,CAAC,EAAE,IAAI,SAAU,EAAG,CAInF,IAAI,IAAM,EAAE,IAAM,EAAE,IAAM,IAAM,OAAO,EAAE,GAAG,EAAI,qBAAiB,EAAE,IAAK,KACxE,OAAI,EAAE,KAAO,EAAE,IAAK,KAAO,IAAI,KAAK,MAAM,EAAE,WAAa,EAAE,CAAC,EAAI,YAAW,GAAG,EAAE,OAAO,EAAI,aAClF,EAAE,IAAK,KAAO,KAAK,EAAE,UAAU,EAAI,WAAU,KAAK,EAAE,CAAC,EAAI,WAAU,MAAM,EAAE,EAAE,EAAI,gBACrF,KAAO,IAAI,KAAK,MAAM,EAAE,WAAa,EAAE,CAAC,EAAI,YAAW,GAAG,EAAE,OAAO,EAAI,aACrE,CAAC,IAAI,OAAO,CAAC,EAAE,YAAY,EAAI,IAAI,MAAM,CAAC,EAAG,KAAM,IAAI,EAAE,KAAK,EAAI,SAAI,CAC/E,CAAC,EACD,GAAG,KAAK,CAAC,sBAAoB,GAAI,IAAI,GAAG,WAAW,EAAI,SAAI,CAAC,EAC5D,IAAI,IAAM,KAAK,UAAU,EAAE,EAC3B,GAAI,CAAC,GAAG,cAAc,QAAQ,GAAK,GAAG,aAAa,YAAY,IAAM,IAAK,CACxE,GAAG,aAAa,aAAc,GAAG,EAAG,GAAG,YAAc,GACrD,IAAI,MAAQ,SAAS,cAAc,MAAM,EAAG,MAAM,UAAY,QAAS,MAAM,aAAa,OAAQ,MAAM,EAAG,MAAM,aAAa,aAAc,qCAA+B,EAC3K,MAAM,SAAW,EACjB,MAAM,iBAAiB,SAAU,UAAY,CAAE,SAAS,KAAK,CAAG,EAAG,CAAE,QAAS,EAAK,CAAC,EACpF,GAAG,QAAQ,SAAU,EAAG,EAAG,CACzB,IAAI,IAAM,IAAM,GAAG,OAAS,EAAG,GAAK,SAAS,cAAc,MAAM,EAAG,GAAG,UAAY,IAAM,UAAY,UAAgB,KAAK,GAAG,aAAa,OAAQ,UAAU,EAC5J,EAAE,QAAQ,SAAUC,GAAG,EAAG,CACxB,GAAKA,GACL,CAAI,GAAG,YAAY,GAAG,YAAY,SAAS,eAAe,GAAG,CAAC,EAC9D,IAAI,EAAI,SAAS,cAAc,MAAM,EAAG,EAAE,UAAY,CAAC,UAAW,UAAW,SAAS,EAAE,CAAC,EAAG,EAAE,YAAcA,GAAG,GAAG,YAAY,CAAC,EACjI,CAAC,EACG,KAAO,GAAG,YAAY,SAAS,eAAe,GAAG,CAAC,EAAG,GAAG,YAAY,EAAE,IAC/D,MAAM,YAAY,MAAM,YAAY,SAAS,eAAe,GAAG,CAAC,EAAG,MAAM,YAAY,EAAE,EACpG,CAAC,EACD,GAAG,aAAa,MAAO,GAAG,UAAU,CACtC,CACA,IAAI,IAAM,GAAG,cAAc,QAAQ,EAAO,MAAO,SAAS,GAAG,EAAG,WAAW,UAAY,CAAE,SAAS,GAAG,CAAG,EAAG,CAAC,GAC5G,eAAe,EAAG,EAAE,EACpB,MACF,CACA,IAAI,EAAI,IAAI,EAAE,eAAiB,EAAE,eAAe,EAAE,2BAA6B,EAAE,0BAA0B,CAAC,EAAI,CAAC,EAAG,EAAI,IAAI,EAAE,kBAAoB,EAAE,kBAAkB,EAAI,CAAC,EAC3K,GAAM,EAAI,GAAK,EAAI,EAEnB,KAAI,EAAI,IAAI,CAAC,EAAI,gBAAY,EAAI,EAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ,IAAK,GAAG,EAAI,MAAM,CAAC,GAAK,gBAAU,IAAI,KAAK,MAAM,EAAI,CAAC,CAAC,EAAI,aACjH,GAAG,cAAgB,IAAG,GAAG,YAAc,IAC7C,CAIA,IAAI,YAAc,GAClB,SAAS,UAAU,EAAG,EAAG,CACvB,IAAI,EAAI,MAAM,CAAC,EACf,GADsB,EAAE,IAAM,SAAW,IAAM,YAC3C,SAAS,CAAC,EAAG,OAAO,KACxB,IAAI,EAAI,YAAa,GAAK,IAAM,QAAU,IAAM,IAAK,IAAM,UAAU,CAAC,EAAI,MAC1E,GAAI,IAAM,UAAU,CAAC,GAAK,KAAO,UAAU,CAAC,GAAK,KAAM,OAAO,KAC9D,GAAI,UAAU,KAAK,CAAC,GAAK,4CAA4C,KAAK,CAAC,EACzE,MAAO,iBAAmB,GAAK,SAAW,MAAM,KAAK,EAAI,SAAQ,MAAM,UAAU,CAAC,GAAK,KAAO,SAAW,KAAK,EAAI,MACpH,GAAI,CAAC,QAAQ,KAAK,CAAC,GAAK,CAAC,qCAAqC,KAAK,CAAC,EAAG,OAAO,KAC9E,IAAI,KAAO,IAAM,WAAa,IAAM,KAAM,OAAS,KAAO,EAAI,GAAK,MAC/D,IAAM,IAAM,QAAW,IAAM,KAAO,OAAS,SAAa,KAAO,OAAS,QAC9E,OAAI,IAAY,IAAM,KAAO,EAAI,UAAY,OAAO,KAAO,EAAI,GAAK,UAAU,CAAC,EAAI,SAAS,EAAI,SAAQ,MAAM,MAAM,EAAI,MACjH,IAAM,KAAO,EAAI,OAAS,MAAM,KAAK,EAAI,cAAgB,MAAM,MAAQ,SAAS,EAAI,SAAQ,MAAM,MAAM,EAAI,KACrH,CACA,SAAS,YAAa,CACpB,SAAS,iBAAiB,QAAS,SAAU,EAAG,CAC9C,IAAI,GAAK,EAAE,QAAU,EAAE,OAAO,SAAW,EAAE,OAAO,QAAQ,wBAAwB,EAClF,GAAI,GAAI,CAAE,IAAI,EAAI,GAAG,YAAY,KAAK,EAAE,MAAM,gBAAgB,EAAG,YAAc,EAAI,EAAE,CAAC,EAAE,YAAY,EAAI,EAAI,CAC9G,EAAG,EAAI,EACP,IAAI,GAAK,SAAS,eAAe,kBAAkB,EAAG,IAAM,SAAS,eAAe,iBAAiB,EACrG,GAAI,GAAC,IAAM,OAAO,kBAAqB,YAEvC,KAAI,QAAU,KACd,IAAI,iBAAiB,UAAY,CAC/B,IAAI,EAAI,OAAO,EAAG,GAAI,GAAC,GAAK,CAAC,EAAE,GAC/B,KAAI,EAAI,GAAG,YAAY,KAAK,EAAG,EAAI,UAAU,EAAG,CAAC,IAAM,IAAM,QAAU,QAAU,MAAO,GAAK,EAC7F,SAAU,EACN,IAAM,IAAG,GAAG,YAAc,GAC1B,KAAO,IAAI,aAAa,YAAY,GAAK,IAAI,aAAa,YAAY,IAAM,GAAG,IAAI,aAAa,aAAc,CAAC,EACnH,MAAM,UAAU,QAAQ,KAAK,IAAM,IAAI,iBAAiB,OAAO,EAAI,CAAC,EAAG,SAAU,EAAG,CAClF,IAAI,EAAI,EAAE,aAAa,YAAY,GAAK,GAAQ,qBAAqB,KAAK,CAAC,GAAK,IAAM,GAAG,EAAE,aAAa,aAAc,CAAC,CACzH,CAAC,EACD,IAAI,EAAI,SAAS,cAAc,oCAAoC,EAAG,EAAI,MAAM,CAAC,EACjF,GAAI,GAAK,iBAAiB,KAAK,CAAC,EAAG,CACjC,IAAI,GAAK,+CAA8C,IAAM,QAAU,IAAM,KAAO,IAChF,EAAE,cAAgB,KAAI,EAAE,YAAc,GAC5C,GACF,CAAC,EAAE,QAAQ,KAAO,GAAI,CAAE,UAAW,GAAM,cAAe,GAAM,QAAS,GAAM,WAAY,GAAM,gBAAiB,CAAC,YAAY,CAAE,CAAC,EAClI,CAEA,SAAS,WAAY,CAEnB,MAAM,UAAU,QAAQ,KAAK,SAAS,iBAAiB,oCAAoC,EAAG,SAAU,EAAG,CACzG,IAAI,EAAI,EAAE,cAAc,kBAAkB,EAC1C,GAAI,CAAC,OAAS,OAAQ,CAAM,GAAG,EAAE,WAAW,YAAY,CAAC,EAAG,MAAQ,CAChE,IACJ,EAAI,SAAS,cAAc,OAAO,EAAG,EAAE,UAAY,kBAAmB,EAAE,YAAc,2BAAyB,EAAE,YAAY,CAAC,EAChI,CAAC,CACH,CAKA,IAAI,GAAK,6BACT,SAAS,GAAG,EAAG,EAAG,CAAE,IAAI,EAAI,SAAS,gBAAgB,GAAI,CAAC,EAAG,QAAS,KAAK,EAAG,EAAE,aAAa,EAAG,EAAE,CAAC,CAAC,EAAG,OAAO,CAAG,CACjH,SAAS,OAAO,EAAG,CACjB,IAAI,IAAM,EAAE,IAAK,GAAK,IACtB,OAAM,UAAU,QAAQ,KAAK,IAAI,iBAAiB,4DAA4D,EAAG,SAAU,EAAG,CAAE,EAAE,OAAO,CAAG,CAAC,EAC7I,IAAI,EAAI,MAAM,CAAC,EAAG,GAAK,EAEvB,KAAI,IAAM,CAAE,QAAW,IAAK,MAAO,IAAK,OAAQ,IAAK,KAAM,MAAO,KAAM,MAAO,QAAS,KAAM,EAAG,GAAK,SAAS,CAAC,EAKhH,GAJA,MAAM,UAAU,QAAQ,KAAK,IAAI,iBAAiB,iBAAiB,EAAG,SAAU,EAAG,CACjF,IAAI,EAAI,IAAI,EAAE,aAAa,YAAY,GAAK,SAAS,GACjD,CAAC,IAAO,GAAK,OAAO,EAAG,CAAC,IAAI,EAAE,aAAa,UAAW,MAAM,CAClE,CAAC,GACI,IAAM,SAAW,IAAM,YAAc,CAAC,KAAK,CAAC,GAAK,OAAO,CAAC,EAAG,CAAE,SAAS,EAAG,GAAG,EAAG,MAAQ,CAC7F,GAAI,IAAE,IAAM,SAAW,IAAM,WAAc,IAAM,WAAa,KAAQ,KAAK,CAAC,GAG5E,KAAI,GAAK,OAAO,OAAO,mBAAsB,WAAa,OAAO,kBAAkB,CAAC,EAAI,KACpF,IAAM,GAAK,GAAG,OAAO,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,CAAC,EAAI,CAAC,EAAG,IAAM,EAAE,WAAa,CAAC,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,SAAS,EAAE,CAAC,GAAK,SAAS,EAAE,CAAC,CAAG,CAAC,EAC9J,GAAI,GAAC,IAAI,QAAU,CAAC,GAAG,QACvB,KAAI,EAAI,CAAC,KAAK,IAAI,MAAM,KAAM,GAAG,IAAI,SAAU,EAAG,CAAE,OAAO,IAAI,EAAE,CAAC,CAAG,CAAC,CAAC,EAAG,KAAK,IAAI,MAAM,KAAM,GAAG,IAAI,SAAU,EAAG,CAAE,OAAO,IAAI,EAAE,CAAC,CAAG,CAAC,CAAC,CAAC,EACrI,IAAM,SAAU,EAAG,CAAE,MAAO,CAAC,EAAE,CAAC,EAAI,EAAE,CAAC,EAAG,EAAE,CAAC,EAAI,EAAE,CAAC,CAAC,CAAG,EAAG,IAAM,SAAU,EAAG,CAAE,OAAO,EAAE,IAAI,SAAU,EAAG,CAAE,OAAO,IAAI,CAAC,EAAE,KAAK,GAAG,CAAG,CAAC,EAAE,KAAK,GAAG,CAAG,EACnJ,KAAO,IAAI,cAAc,YAAY,EAAG,GAAK,MAAQ,KAAK,cAAc,cAAc,EACtF,MAAQ,IAAM,GAAG,cAAc,aAAa,GAAK,CAAE,aAAc,UAAY,CAAE,OAAO,IAAM,CAAE,GAAG,aAAa,MAAM,EAAI,KACxH,EAAI,OAAO,OAAO,cAAiB,WAAa,OAAO,aAAa,EAAI,KAAM,IAAM,EAAE,iBAAmB,EAAE,gBAAgB,EAC/H,GAAI,KAAM,CACR,IAAI,GAAK,GAAG,IAAK,CAAE,MAAO,mBAAoB,iBAAkB,MAAO,CAAC,EAAG,MAAQ,CAAC,EACpF,IAAI,QAAQ,SAAU,EAAG,EAAG,CAG1B,IAAI,KAAO,EAAE,IAAI,IAAI,GAAG,EAAG,EAAI,GAC3B,KAAQ,GAAK,EAAE,KAAQ,OAAS,UACpC,GAAI,GAAK,EAAE,KAAO,KAAO,OAAO,WAAY,CAC1C,IAAI,GAAK,KAAK,OAAO,SAAUF,GAAG,EAAG,CAAE,OAAQ,EAAE,CAAC,EAAIA,GAAE,CAAC,EAAI,MAAS,KAAK,IAAI,EAAE,CAAC,EAAIA,GAAE,CAAC,CAAC,EAAI,MAAQ,EAAE,CAAC,EAAIA,GAAE,CAAC,EAAM,EAAIA,EAAG,EAAG,KAAK,CAAC,CAAC,EACvI,KAAO,QAAU,OAAO,WAAW,YAAY,IAAK,iBAAmB,EAAG,IAAK,EAAE,IAAK,GAAG,CAAC,EAAG,GAAG,CAAC,EAAG,OAAO,WAAW,WAAW,EAAE,IAAI,IAAK,CAAC,EAAG,IAAI,EAAI,GAC1J,CACA,EAAE,YAAY,GAAG,UAAW,CAAE,OAAQ,IAAI,EAAE,GAAG,EAAG,IAAW,CAAC,CAAC,EAG/D,IAAI,EAAI,KAAK,CAAC,EAAG,EAAI,KAAK,CAAC,EAAG,GAAK,KAAK,CAAC,EAAG,EAAI,EAAE,EAAE,CAAC,EAAI,EAAE,CAAC,GAAK,GAAI,EAAE,CAAC,EAAI,EAAE,CAAC,GAAK,CAAC,EAAG,GAAK,KAAK,MAAM,EAAE,CAAC,EAAI,GAAG,CAAC,EAAG,EAAE,CAAC,EAAI,GAAG,CAAC,CAAC,GAAK,EAAG,GAAK,GAC3I,GAAK,EAAE,CAAC,GAAK,EAAE,CAAC,EAAI,GAAG,CAAC,GAAK,GAAK,GAAK,GAAK,GAAK,EAAE,CAAC,GAAK,EAAE,CAAC,EAAI,GAAG,CAAC,GAAK,GAAK,GAAK,GACnF,GAAK,GAAG,OAAQ,CAAE,MAAO,kBAAmB,EAAG,GAAI,EAAG,GAAI,YAAa,GAAI,cAAe,IAAK,cAAe,SAAU,oBAAqB,UAAW,KAAM,UAAW,cAAe,oBAC1L,UAAW,UAAY,SAAS,EAAG,CAAC,EAAI,IAAM,GAAK,IAAM,GAAK,IAAK,WAAY,CAAC,EAAG,EAAG,EAAE,EAAE,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,KAAK,GAAG,CAAG,CAAC,EAAE,KAAK,GAAG,CAAE,CAAC,EACjJ,GAAG,YAAc,MAAM,KAAK,MAAM,EAAE,CAAC,EAAI,EAAE,CAAC,EAAG,EAAE,CAAC,EAAI,EAAE,CAAC,CAAC,CAAC,EAAG,MAAM,KAAK,EAAE,CAC7E,CAAC,EACD,MAAM,QAAQ,SAAU,EAAG,CAAE,GAAG,YAAY,CAAC,CAAG,CAAC,EAGjD,IAAI,YAAY,EAAE,EAClB,aAAa,CAAC,EACd,WAAW,CAAC,CACd,KAGF,CAIA,SAAS,aAAa,EAAG,CACvB,IAAI,MAAQ,MAAM,UAAU,IAAI,KAAK,EAAE,IAAI,iBAAiB,2BAA2B,EAAG,SAAU,EAAG,CACrG,IAAI,EAAI,EAAE,cAAgB,EAAE,aAAa,EAAG,IAAM,CAAC,EAAG,GAAI,CAAC,GAAK,CAAC,EAAE,OAAQ,OAAO,IAClF,QAAS,EAAI,EAAG,EAAI,EAAE,OAAO,cAAe,IAAK,CAAE,IAAI,EAAI,EAAE,OAAO,QAAQ,CAAC,EAAG,IAAI,KAAK,CAAC,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,EAAG,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,CAAC,CAAC,CAAG,CACtJ,OAAO,GACT,CAAC,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,OAAS,CAAG,CAAC,EAC/C,GAAI,GAAC,MAAM,QAAU,CAAC,EAAE,MAExB,KAAI,OAAS,SAAU,EAAG,CACxB,MAAO,CAAC,CAAC,EAAE,OAAO,MAAM,UAAU,MAAM,KAAK,EAAE,iBAAiB,GAAG,CAAC,CAAC,EAAE,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,sBAAsB,CAAG,CAAC,EAC1H,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,MAAQ,GAAK,EAAE,OAAS,CAAG,CAAC,CAChE,EACI,QAAU,SAAU,GAAI,GAAI,GAAI,CAClC,QAAS,EAAI,EAAG,EAAI,GAAG,OAAQ,IAE7B,QADI,EAAI,GAAG,CAAC,EAAG,GAAK,KAAK,IAAI,EAAG,KAAK,KAAK,EAAE,MAAQ,CAAC,CAAC,EAAG,GAAK,KAAK,IAAI,EAAG,KAAK,KAAK,EAAE,OAAS,CAAC,CAAC,EACxF,EAAI,EAAG,GAAK,GAAI,IAAK,QAAS,EAAI,EAAG,GAAK,GAAI,IAErD,QADI,EAAI,EAAE,KAAO,GAAM,KAAK,IAAI,EAAG,EAAE,MAAQ,CAAC,EAAI,EAAI,GAAK,GAAI,EAAI,EAAE,IAAM,GAAM,KAAK,IAAI,EAAG,EAAE,OAAS,CAAC,EAAI,EAAI,GAAK,GAC7G,EAAI,EAAG,EAAI,MAAM,OAAQ,IAAK,GAAI,SAAS,MAAM,CAAC,EAAG,EAAG,CAAC,EAAG,OAAO,MAAM,CAAC,EAGvF,OAAO,IACT,EAEI,WAAa,SAAU,EAAG,CAC5B,OAAO,MAAM,UAAU,OAAO,KAAK,EAAE,iBAAiB,GAAG,EAAG,SAAU,EAAG,CAAE,MAAO,CAAC,EAAE,SAAS,QAAU,KAAK,KAAK,EAAE,aAAe,EAAE,CAAG,CAAC,EACtI,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,sBAAsB,CAAG,CAAC,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,MAAQ,GAAK,EAAE,OAAS,CAAG,CAAC,CACxH,EACI,KAAO,MAAM,UAAU,MAAM,KAAK,EAAE,KAAK,iBAAiB,MAAM,CAAC,EACjE,aAAe,SAAU,EAAG,GAAI,GAAI,GAAI,CAC1C,IAAI,OAAS,CAAC,EAAE,OAAO,MAAM,CAAC,EAAG,KAAK,OAAO,SAAU,EAAG,CAAE,OAAO,IAAM,CAAG,CAAC,EAAE,IAAI,UAAU,CAAC,EAC9F,OAAO,GAAG,KAAK,SAAU,EAAG,CAAE,OAAO,OAAO,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,KAAO,GAAK,EAAE,MAAQ,GAAK,EAAE,MAAQ,GAAK,EAAE,KAAO,GAAK,EAAE,IAAM,GAAK,EAAE,OAAS,GAAK,EAAE,OAAS,GAAK,EAAE,IAAM,CAAG,CAAC,CAAG,CAAC,CAChM,EACA,KAAK,QAAQ,SAAU,EAAG,CACxB,IAAI,GAAK,OAAO,CAAC,EAAG,EAAI,EAAE,sBAAsB,EAAG,EAAI,GAAG,QAAU,QAAQ,GAAI,EAAG,CAAC,EAAG,GAAK,EAM5F,QALI,GAAK,WAAW,CAAC,EAGjB,GAAK,EAAE,OAAO,SAAUG,GAAG,EAAG,CAAE,OAAOA,GAAI,EAAE,CAAC,CAAG,EAAG,CAAC,EAAI,EAAE,OAAQ,GAAK,EAAE,OAAO,SAAUA,GAAG,EAAG,CAAE,OAAOA,GAAI,EAAE,CAAC,CAAG,EAAG,CAAC,EAAI,EAAE,OAC9H,EAAI,EAAE,UAAU,SAAS,GAAG,EAAG,GAAK,GAAM,EAAE,IAAM,EAAE,QAAU,EAAI,GAAK,EAAI,IAAQ,EAAE,KAAO,EAAE,OAAS,EAAI,GAAK,EAAI,GAC/G,EAAI,EAAG,GAAK,IAAK,GAAK,EAAG,QAAS,EAAI,EAAG,EAAI,EAAG,IAAK,CAC5D,IAAI,IAAM,EAAI,CAAC,GAAK,IAAM,EAAG,GAAK,EAAI,EAAI,GAAI,GAAK,EAAI,GAAK,EAC5D,GAAI,CAAC,QAAQ,GAAI,GAAI,EAAE,GAAK,CAAC,aAAa,EAAG,GAAI,GAAI,EAAE,EAAG,CAAE,EAAE,MAAM,UAAY,GAAK,MAAQ,GAAK,KAAM,MAAQ,CAClH,CACF,CAAC,EACH,CAEA,SAAS,SAAS,EAAG,EAAG,CAAE,IAAI,IAAM,KAAK,MAAM,EAAE,CAAC,EAAI,EAAE,CAAC,EAAG,EAAE,CAAC,EAAI,EAAE,CAAC,CAAC,EAAI,IAAM,KAAK,GAAI,OAAO,IAAM,GAAK,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAK,CAMrJ,SAAS,WAAW,EAAG,CACrB,IAAI,GAAK,EAAE,IAAM,MAAM,UAAU,MAAM,KAAK,EAAE,IAAI,iBAAiB,wCAAwC,CAAC,EAAI,CAAC,EAC7G,EAAI,GAAG,QAAU,GAAG,CAAC,EAAE,WAAY,EAAI,GAAK,EAAE,cAAgB,EAAE,aAAa,EAAG,EAAI,EAAI,KAAK,KAAK,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,CAAC,EAAI,EAC/H,GAAM,EAAI,EACV,KAAI,IAAM,EAAE,MAAQ,EAAE,KAAK,cAAc,wBAAwB,EAAG,GAAK,KAAO,iBAAiB,GAAG,EAAG,GAAK,KAAK,IAAK,IAAM,WAAW,GAAG,QAAQ,GAAM,GAAI,EAAE,EAC1J,GAAK,EAAE,QAAQ,EAAG,MAAQ,SAAU,EAAG,CAAE,MAAO,CAAC,EAAE,EAAI,EAAE,CAAC,EAAI,EAAE,EAAI,EAAE,CAAC,EAAI,EAAE,EAAG,EAAE,EAAI,EAAE,CAAC,EAAI,EAAE,EAAI,EAAE,CAAC,EAAI,EAAE,CAAC,CAAG,EAChH,IAAM,gBAAgB,EAAG,EAAI,EAAG,IAAM,WAAW,CAAC,EAAG,MAAQ,EAAE,IAAI,sBAAsB,EAC7F,GAAG,QAAQ,SAAU,EAAG,CACtB,EAAE,aAAa,YAAa,GAAK,CAAC,EAAG,EAAE,aAAa,cAAgB,IAAM,GAAG,YAAe,GAAG,EAC/F,EAAE,aAAa,OAAS,IAAM,GAAG,OAAU,SAAS,EAAG,EAAE,aAAa,cAAgB,IAAM,GAAG,YAAe,mBAAmB,EACjI,IAAI,GAAK,EAAE,aAAa,UAAU,GAAK,IAAI,MAAM,GAAG,EAAE,IAAI,SAAUA,GAAG,CAAE,OAAOA,GAAE,MAAM,GAAG,EAAE,IAAI,MAAM,CAAG,CAAC,EAAG,GAAI,IAAE,OAAS,GAC7H,KAAI,EAAI,MAAM,EAAE,CAAC,CAAC,EAAG,EAAI,MAAM,EAAE,CAAC,CAAC,EAAG,GAAK,MAAM,EAAE,CAAC,CAAC,EAAG,GAAK,KAAK,MAAM,EAAE,CAAC,EAAI,EAAE,CAAC,EAAG,EAAE,CAAC,EAAI,EAAE,CAAC,CAAC,GAAK,EACjG,EAAI,EAAE,EAAE,CAAC,EAAI,EAAE,CAAC,GAAK,IAAK,EAAE,CAAC,EAAI,EAAE,CAAC,GAAK,EAAE,EAAG,EAAI,CAAC,CAAC,EAAE,CAAC,EAAG,EAAE,CAAC,CAAC,EAAG,EAAI,EAAE,EAAE,CAAC,EAAI,EAAE,CAAC,GAAK,GAAI,EAAE,CAAC,EAAI,EAAE,CAAC,GAAK,CAAC,GACzG,GAAG,CAAC,EAAI,EAAE,CAAC,GAAK,EAAE,CAAC,GAAK,GAAG,CAAC,EAAI,EAAE,CAAC,GAAK,EAAE,CAAC,EAAI,IAAG,EAAI,CAAC,CAAC,EAAE,CAAC,EAAG,CAAC,EAAE,CAAC,CAAC,GAkBxE,QAjBI,GAAK,EAAE,sBAAsB,EAAI,EAAI,EAAI,EAAG,GAAK,GAAK,GACtD,MAAQ,SAAUC,GAAG,CAAE,MAAO,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,EAAE,EAAG,CAAC,GAAI,EAAE,EAAG,CAAC,GAAI,CAAC,CAAC,EAAE,IAAI,SAAUD,GAAG,CAAE,MAAO,CAACC,GAAE,CAAC,EAAI,EAAE,CAAC,EAAI,GAAKD,GAAE,CAAC,EAAI,EAAE,CAAC,EAAI,GAAKA,GAAE,CAAC,EAAGC,GAAE,CAAC,EAAI,EAAE,CAAC,EAAI,GAAKD,GAAE,CAAC,EAAI,EAAE,CAAC,EAAI,GAAKA,GAAE,CAAC,CAAC,CAAG,CAAC,CAAG,EAE3L,KAAO,CAAC,EAAG,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,EAAG,KAAO,SAAUE,GAAG,GAAI,CAAE,IAAIC,GAAID,GAAE,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,CAAC,EAAI,GAAG,CAAC,EAAI,EAAE,CAAC,EAAI,GAAG,CAAC,CAAG,CAAC,EAAG,MAAO,CAAC,KAAK,IAAI,MAAM,KAAMC,EAAC,EAAG,KAAK,IAAI,MAAM,KAAMA,EAAC,CAAC,CAAG,EACzL,OAAS,SAAUD,GAAG,EAAG,CAC3B,IAAI,EAAI,CAAC,CAAC,EAAE,KAAM,EAAE,GAAG,EAAG,CAAC,EAAE,MAAO,EAAE,GAAG,EAAG,CAAC,EAAE,MAAO,EAAE,MAAM,EAAG,CAAC,EAAE,KAAM,EAAE,MAAM,CAAC,EACnF,OAAO,KAAK,MAAM,SAAU,GAAI,CAAE,IAAI,EAAI,KAAKA,GAAG,EAAE,EAAG,EAAI,KAAK,EAAG,EAAE,EAAG,OAAO,EAAE,CAAC,EAAI,EAAE,CAAC,GAAK,EAAE,CAAC,EAAI,EAAE,CAAC,CAAG,CAAC,CAC9G,EACI,SAAW,SAAUD,GAAG,CAE1B,QADI,GAAK,KAAK,IAAI,EAAG,KAAK,KAAK,EAAE,CAAC,EAAG,GAAK,KAAK,IAAI,EAAG,KAAK,KAAK,EAAE,CAAC,EAAG,EAAI,EACjE,EAAI,EAAG,GAAK,GAAI,IAAK,QAAS,EAAI,EAAG,GAAK,GAAI,IAAK,CAC1D,IAAI,IAAM,EAAI,EAAI,GAAK,GAAK,GAAI,IAAM,EAAI,EAAI,GAAK,GAAK,GACpD,UAAU,EAAG,IAAKA,GAAE,CAAC,EAAI,EAAE,CAAC,EAAI,GAAK,EAAE,CAAC,EAAI,GAAIA,GAAE,CAAC,EAAI,EAAE,CAAC,EAAI,GAAK,EAAE,CAAC,EAAI,EAAE,GAAG,GACrF,CACA,OAAO,CACT,EACI,SAAW,KAAM,OAAS,CAAC,CAAC,EACvB,EAAI,EAAG,GAAK,GAAK,EAAG,GAAK,EAAG,OAAO,KAAK,EAAG,CAAC,CAAC,EACtD,QAAS,EAAI,EAAG,GAAK,IAAM,EAAE,UAAY,CAAC,SAAS,EAAE,CAAC,GAAK,CAAC,SAAS,EAAE,CAAC,GAAK,CAAC,SAAS,EAAE,CAAC,GAAI,GAAK,EACjG,QAAS,EAAI,EAAG,EAAI,OAAO,OAAQ,IAAK,CACtC,IAAI,EAAI,CAAC,EAAE,CAAC,EAAI,EAAE,CAAC,GAAK,EAAI,IAAM,EAAE,CAAC,EAAI,OAAO,CAAC,EAAG,EAAE,CAAC,EAAI,EAAE,CAAC,GAAK,EAAI,IAAM,EAAE,CAAC,EAAI,OAAO,CAAC,CAAC,EAAG,EAAI,MAAM,CAAC,EAC3G,GAAI,GAAE,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,CAAC,EAAI,MAAM,MAAQ,EAAE,CAAC,EAAI,MAAM,OAAS,EAAE,CAAC,EAAI,MAAM,KAAO,EAAE,CAAC,EAAI,MAAM,MAAQ,CAAC,EACtH,KAAI,GAAK,EAAG,GAAK,EAEjB,GADA,IAAI,QAAQ,SAAU,EAAG,CAAM,OAAO,EAAG,CAAC,IAAS,EAAE,QAAU,EAAG,KAAW,KAAQ,CAAC,EAClF,aAAa,GAAK,SAAS,EAAE,CAAC,GAAM,KAAO,SAAS,EAAE,CAAC,GAAK,SAAS,EAAE,CAAC,IAAM,GAAK,IAAM,SAAS,EAAE,CAAC,IACzG,KAAI,EAAI,CAAC,GAAI,SAAS,CAAC,EAAG,EAAE,EAE5B,IADI,CAAC,UAAY,EAAE,CAAC,EAAI,SAAS,EAAE,CAAC,GAAM,EAAE,CAAC,IAAM,SAAS,EAAE,CAAC,IAAM,EAAE,CAAC,EAAI,SAAS,EAAE,CAAC,GAAM,EAAE,CAAC,IAAM,SAAS,EAAE,CAAC,GAAK,EAAE,CAAC,EAAI,SAAS,EAAE,CAAC,MAAM,SAAW,CAAE,EAAM,EAAM,CAAK,GAC3K,CAAC,EAAE,CAAC,GAAK,CAAC,EAAE,CAAC,GAAK,CAAC,EAAE,CAAC,EAAG,OAC/B,CAEF,GAAK,SACL,KAAI,EAAI,GAAG,EAAI,SAAS,EAAE,CAAC,EAAI,GAAG,EAAI,SAAS,EAAE,CAAC,EAAI,GAAG,EAAG,EAAI,GAAG,EAAI,SAAS,EAAE,CAAC,EAAI,GAAG,EAAI,SAAS,EAAE,CAAC,EAAI,GAAG,EACjH,EAAE,aAAa,IAAK,CAAC,EAAG,EAAE,aAAa,IAAK,CAAC,EAAG,EAAE,aAAa,YAAa,UAAY,SAAS,EAAE,CAAC,EAAG,EAAE,CAAC,CAAC,EAAI,IAAM,EAAI,IAAM,EAAI,GAAG,EACtI,IAAI,EAAI,SAAS,EAAE,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,CAAC,CAAG,CAAC,EAAG,EAAI,SAAS,EAAE,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,CAAC,CAAG,CAAC,EACvG,IAAI,KAAK,CAAE,KAAM,KAAK,IAAI,MAAM,KAAM,CAAC,EAAG,MAAO,KAAK,IAAI,MAAM,KAAM,CAAC,EAAG,IAAK,KAAK,IAAI,MAAM,KAAM,CAAC,EAAG,OAAQ,KAAK,IAAI,MAAM,KAAM,CAAC,EAAG,MAAO,GAAI,IAAK,EAAK,CAAC,GACjK,CAAC,EACH,CAIA,SAAS,SAAS,EAAG,IAAK,CACxB,IAAI,KAAO,IAAI,cAAc,YAAY,EAAG,GAAK,KACjD,KAAI,EAAI,OAAO,OAAO,cAAiB,WAAa,OAAO,aAAa,EAAI,KAAM,GAAK,KAAK,cAAc,cAAc,EACpH,MAAQ,IAAM,GAAG,cAAc,aAAa,GAAK,CAAE,aAAc,UAAY,CAAE,OAAO,IAAM,CAAE,GAAG,aAAa,MAAM,EAAI,KACxH,KAAQ,GAAK,EAAE,KAAQ,OAAS,UAAW,EAAI,GAAG,IAAK,CAAE,MAAO,iBAAkB,iBAAkB,MAAO,CAAC,EAChH,MAAM,UAAU,QAAQ,KAAK,KAAK,iBAAiB,cAAc,EAAG,SAAU,EAAG,CAC/E,IAAI,IAAM,EAAE,aAAa,WAAW,GAAK,IAAI,QAAQ,wBAAyB,EAAE,EAAG,KAAO,IAAM,IAAI,cAAc,GAAK,UAAU,EAC7H,MAAM,EAAE,YAAY,GAAG,UAAW,CAAE,OAAQ,KAAK,aAAa,QAAQ,EAAG,KAAY,OAAQ,KAAM,eAAgB,MAAO,gBAAiB,oBAAqB,CAAC,CAAC,CACxK,CAAC,EACG,EAAE,YAAY,KAAK,WAAW,aAAa,EAAG,IAAI,EACxD,CAIA,IAAI,KAAO,CACT,OAAQ,CAAC,MAAM,EACf,MAAO,CAAC,OAAQ,cAAe,iBAAkB,cAAc,EAC/D,UAAW,CAAC,YAAa,WAAY,aAAc,kBAAmB,gBAAiB,iBAAkB,gBAAiB,iBACxH,YAAa,aAAc,eAAgB,eAAgB,gBAAiB,eAAe,EAE7F,UAAW,CAAC,eAAgB,cAAe,gBAAiB,eAAgB,gBAAiB,cAAe,eAAgB,gBAAiB,eAC3I,oBAAqB,oBAAqB,eAAgB,iBAAkB,oBAAqB,mBAAoB,sBACrH,mBAAoB,sBAAuB,sBAAuB,iBAClE,gBAAiB,eAAgB,iBAAkB,gBAAiB,iBAAkB,eAAgB,gBAAiB,iBAAkB,iBACzI,qBAAsB,qBAAsB,oBAAqB,oBAAqB,uBAAwB,oBAAqB,uBACnI,oBAAqB,uBAAwB,uBAAwB,qBAAsB,oBAAoB,CACnH,EAKA,SAAS,KAAK,IAAK,CAAE,OAAQ,KAAK,GAAG,GAAK,CAAC,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,WAAW,QAAQ,CAAC,GAAK,CAAG,CAAC,CAAG,CAG3G,SAAS,SAAU,CACjB,OAAO,OAAO,KAAK,IAAI,EAAE,IAAI,SAAU,IAAK,CAC1C,OAAO,KAAK,GAAG,EAAE,IAAI,SAAU,EAAG,CAChC,MAAO,sBAAwB,IAAM,0EAA4E,EAAI,KACvH,CAAC,EAAE,KAAK,GAAG,EAAI,0BACjB,CAAC,EAAE,KAAK,EAAE,CACZ,CAIA,IAAI,OAAS,CAAE,MAAO,CAAC,QAAS,kBAAkB,EAAG,UAAW,CAAC,aAAc,aAAa,EAC1F,UAAW,CAAC,iBAAkB,eAAgB,mBAAoB,mBAAmB,EACrF,SAAU,CAAC,eAAgB,gBAAiB,kBAAmB,oBAAoB,CAAE,EACvF,SAAS,YAAY,EAAG,CACtB,IAAI,EAAI,EAAE,EAAE,OAAQ,GAAI,SAAW,oBAAsB,IAAM,UAAY,OAAO,CAAC,EAAG,OAAO,KAC7F,IAAI,GAAK,OAAO,IAAM,UAAa,EAAE,EAAE,OAAS,OAAS,SAAW,UAAa,CAAC,EAAG,OAAK,GACnF,GAAG,OAAO,MAAM,CAAC,EAAE,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,CAAG,CAAC,CAAC,EAD0C,IAEvG,CAGA,SAAS,eAAe,EAAG,CACzB,IAAI,EAAI,YAAY,CAAC,EAAG,EAAI,EAAE,EAAQ,GACtC,CAAC,cAAe,mBAAmB,EAAE,QAAQ,SAAU,EAAG,CAAE,IAAI,EAAI,EAAE,CAAC,EAAO,GAAG,OAAO,KAAK,CAAC,EAAE,QAAQ,SAAU,EAAG,CAAM,EAAE,QAAQ,CAAC,EAAI,GAAK,CAAC,SAAS,KAAK,CAAC,GAAG,OAAO,EAAE,CAAC,CAAG,CAAC,CAAG,CAAC,CACtL,CACA,SAAS,WAAW,EAAG,CACrB,IAAI,EAAI,YAAY,CAAC,EAAG,EAAI,SAAS,gBAAiB,GAAK,SAAS,eAAe,qBAAqB,EACxG,EAAE,UAAU,OAAO,kBAAmB,CAAC,CAAC,CAAC,EACzC,IAAI,IAAM,EAAI,kFAAoF,EAAE,IAAI,SAAU,EAAG,CAAE,MAAO,oBAAsB,EAAI,KAAO,CAAC,EAAE,KAAK,EAAE,EAAI,4BAA8B,GACvM,CAAC,IAAM,MAAO,GAAK,SAAS,cAAc,OAAO,EAAG,GAAG,GAAK,sBAAuB,SAAS,KAAK,YAAY,EAAE,GAC/G,IAAM,GAAG,cAAgB,MAAK,GAAG,YAAc,IACrD,CACA,SAAS,UAAU,IAAK,OAAQ,CAC9B,IAAI,EAAI,SAAS,gBACjB,OAAO,KAAK,IAAI,EAAE,QAAQ,SAAU,EAAG,CAAE,EAAE,UAAU,OAAO,iBAAmB,EAAG,IAAM,KAAO,CAAC,MAAM,CAAG,CAAC,CAC5G,CAKA,IAAI,WAAa,CAAE,MAAO,aAAc,KAAM,kBAAgB,MAAO,oBAAe,MAAO,kBAAa,EAAG,UAAY,KACvH,SAAS,cAAe,CACtB,GAAK,SAAS,gBAAgB,UAAU,SAAS,SAAS,EAC1D,KAAI,GAAK,OAAO,GAAK,CAAE,EAAG,CAAC,CAAE,EAAG,MAAQ,GAAG,EAAE,SAAW,SAAU,GAAK,OAAS,GAAG,GAAK,QAAQ,EAAE,EAAG,MAAQ,IAAM,aAAa,EAAE,EAClI,MAAM,UAAU,QAAQ,KAAK,SAAS,iBAAiB,wCAAwC,EAAG,SAAU,EAAG,CAC7G,GAAI,SAAS,EAAE,QAAQ,OAAS,SAC5B,GAAC,cAAgB,CAAC,IAAM,EAAE,QAAQ,OAAS,SAE/C,KAAI,IAAM,EAAE,aAAa,YAAY,GAAK,IAAI,MAAM,oBAAoB,GAAK,CAAC,GAAG,CAAC,GAAK,GACnF,EAAI,MAAQ,WAAW,EAAE,QAAQ,IAAI,EAAI,EAAG,GAAK,EACrD,KAAI,EAAI,YAAc,EAAI,iCAAmC,GAAM,YAAc,gCAA4B,GAAM,gCAA4B,IAC3I,EAAE,aAAa,YAAY,IAAM,GAAG,EAAE,aAAa,aAAc,CAAC,EAClE,EAAE,QAAU,IAAG,EAAE,MAAQ,IAC/B,CAAC,EACH,CACA,SAAS,OAAO,EAAG,CACjB,IAAI,EAAI,SAAS,gBAAiB,GAAK,OAAO,CAAC,EAC/C,EAAE,UAAU,OAAO,UAAW,EAAE,EAGhC,EAAE,UAAU,OAAO,eAAgB,SAAS,CAAC,EAAI,OAAO,CAAC,EAAI,UAAU,CAAC,IAAM,IAAI,EAC9E,CAAC,WAAa,EAAE,MAAQ,OAAO,kBAAqB,aACtD,UAAY,IAAI,iBAAiB,UAAY,CAAE,aAAa,EAAG,cAAc,EAAG,WAAW,EAAG,WAAW,EAAG,iBAAiB,EAAG,eAAe,CAAG,CAAC,EACnJ,UAAU,QAAQ,EAAE,KAAM,CAAE,QAAS,GAAM,UAAW,GAAM,WAAY,GAAM,gBAAiB,CAAC,YAAY,CAAE,CAAC,GAE7G,KAAM,aAAa,EAAG,WAAW,aAAc,CAAC,GACpD,IAAI,GAAK,aAAa,CAAC,GAAK,CAAC,KAAK,CAAC,EACnC,EAAE,UAAU,OAAO,gBAAiB,EAAE,EAClC,KAAM,cAAc,EAAG,WAAW,cAAe,CAAC,GACtD,IAAI,GAAK,QAAQ,CAAC,EAClB,EAAE,UAAU,OAAO,cAAe,EAAE,EAChC,KAAM,WAAW,EAAG,WAAW,WAAY,CAAC,EAClD,CAKA,SAAS,UAAW,CAClB,OAAO,WAAW,IAAI,SAAU,EAAG,CAAE,MAAO,uGAAyG,EAAI,KAAO,CAAC,EAAE,KAAK,GAAG,EACzK,6EACJ,CACA,SAAS,YAAa,CACpB,IAAI,EAAI,+GACR,OAAO,EAAI,6NAC2I,QAAQ,CAChK,CAGA,SAAS,SAAU,CACjB,IAAI,EAAI,6GACR,OAAO,EAAI,gOAEb,CACA,SAAS,YAAa,CACpB,IAAI,EAAI,OAAO,EAAG,GAAI,GAAC,GAAK,CAAC,EAAE,GAAK,CAAC,EAAE,MAAQ,CAAC,SAAS,gBAAgB,UAAU,SAAS,aAAa,GACzG,KAAI,GAAK,EAAE,KAAK,cAAc,yCAAyC,EAAG,EAAI,oCAAmC,UAAU,EAAE,QAAQ,oBAAqB,EAAE,EAAI,IAAU,KACtK,GAAG,aAAa,MAAM,IAAM,YAAY,GAAG,aAAa,OAAQ,UAAU,EAC1E,GAAG,aAAa,cAAc,IAAM,SAAS,GAAG,aAAa,eAAgB,OAAO,EAGpF,GAAG,aAAa,eAAe,IAAM,QAAQ,GAAG,aAAa,gBAAiB,MAAM,EACpF,GAAG,aAAa,UAAU,IAAM,MAAM,GAAG,aAAa,WAAY,IAAI,EACtE,GAAG,aAAa,YAAY,IAAM,GAAG,GAAG,aAAa,aAAc,CAAC,EACpE,GAAG,QAAU,IAAG,GAAG,MAAQ,IACjC,CACA,OAAO,iBAAiB,QAAS,SAAU,EAAG,CAC5C,IAAI,EAAI,OAAO,EAAG,GAAK,EAAE,QAAU,EAAE,OAAO,SAAW,EAAE,OAAO,QAAQ,yCAAyC,EAC7G,CAAC,IAAM,CAAC,GAAK,CAAC,EAAE,GAAK,CAAC,EAAE,MAAQ,CAAC,EAAE,KAAK,SAAS,EAAE,GAAK,CAAC,EAAE,mBAAqB,CAAC,QAAQ,CAAC,IAC9F,EAAE,eAAe,EAAG,EAAE,gBAAgB,EAAO,EAAE,0BAA0B,EAAE,yBAAyB,EACpG,UAAU,UAAU,EAAI,GAAG,EACvB,EAAE,QAAQ,WAAW,UAAY,CAAE,EAAE,OAAO,CAAG,EAAG,CAAC,EACzD,EAAG,EAAI,EACP,SAAS,eAAgB,CACvB,IAAI,EAAI,OAAO,EAAG,GAAI,GAAC,GAAK,CAAC,EAAE,GAAK,CAAC,EAAE,MAAQ,CAAC,SAAS,gBAAgB,UAAU,SAAS,eAAe,GAC3G,KAAI,GAAK,EAAE,KAAK,cAAc,yCAAyC,EAAG,GAAK,GAC/E,KAAI,GAAK,YAAc,0DAAmD,SAAS,EAAI,kCAAiC,0CAEpH,GAAK,QAAQ,CAAC,EAAG,IAAM,CAAC,CAAC,EAAE,EAAE,aAAc,EAAI,IAAM,+FAAyF,GAAG,OAAO,CAAC,EAAE,YAAY,EAAI,GAAG,MAAM,CAAC,EAAI,IACzL,YAAY,CAAC,EAAK,GAAK,sFAA4E,qGACnG,SAAS,EAAK,GAAK,oCAAmC,GAAK,IAAM,mDAAkD,GAAK,IACxH,GAAK,oCAAmC,GAAK,0CAC7C,mDAAkD,GAAK,IACvD,GAAG,aAAa,MAAM,IAAM,YAAY,GAAG,aAAa,OAAQ,UAAU,EAC1E,GAAG,aAAa,cAAc,IAAM,OAAO,EAAE,GAAG,GAAG,aAAa,eAAgB,OAAO,EAAE,CAAC,EAC1F,KAAW,GAAG,aAAa,eAAe,IAAM,QAAQ,GAAG,aAAa,gBAAiB,MAAM,EAAQ,GAAG,UAAU,SAAS,UAAU,GAAG,GAAG,UAAU,IAAI,UAAU,IAEnK,GAAG,aAAa,eAAe,GAAG,GAAG,gBAAgB,eAAe,EAIpE,GAAG,UAAU,SAAS,UAAU,GAAG,GAAG,UAAU,OAAO,UAAU,GAEnE,GAAG,aAAa,UAAU,IAAM,KAAK,GAAG,aAAa,WAAY,GAAG,EACpE,GAAG,aAAa,YAAY,IAAM,GAAG,GAAG,aAAa,aAAc,CAAC,EACpE,GAAG,QAAU,IAAG,GAAG,MAAQ,IACjC,CAGA,OAAO,iBAAiB,QAAS,SAAU,EAAG,CAC5C,IAAI,EAAI,OAAO,EAAG,GAAK,EAAE,QAAU,EAAE,OAAO,SAAW,EAAE,OAAO,QAAQ,yCAAyC,EACjH,GAAI,GAAC,IAAM,CAAC,GAAK,CAAC,EAAE,GAAK,CAAC,EAAE,MAAQ,CAAC,EAAE,KAAK,SAAS,EAAE,GAAK,CAAC,EAAE,mBAAqB,CAAC,aAAa,CAAC,GAAK,KAAK,CAAC,GAC9G,GAAE,eAAe,EAAG,EAAE,gBAAgB,EAAO,EAAE,0BAA0B,EAAE,yBAAyB,EACpG,IAAI,UAAY,UAAY,CAAM,EAAE,QAAQ,WAAW,UAAY,CAAE,EAAE,OAAO,CAAG,EAAG,CAAC,CAAG,EACxF,GAAI,EAAE,EAAE,aAAc,CAAE,UAAU,4GAAiG,EAAG,UAAU,EAAG,MAAQ,CAC3J,GAAI,CAAC,QAAQ,CAAC,EAAG,CAAE,IAAI,GAAK,SAAS,CAAC,EAAG,GAAI,GAAG,OAAQ,CAAE,UAAU,WAAW,GAAO,EAAE,CAAC,EAAG,UAAU,EAAG,MAAQ,CAAE,CACnH,IAAI,MAAQ,QAAQ,CAAC,GAAK,CAAC,SAAS,EAAI,GAAK,cAAc,CAAC,EAC5D,EAAE,EAAE,UAAY,CAAC,QAAQ,CAAC,EAC1B,EAAE,OAAO,EACT,IAAI,EAAI,EAAE,KAAK,cAAc,yCAAyC,EAAO,GAAG,EAAE,MAAM,EACpF,OAAS,OAAO,QAAU,OAAO,OAAO,OAAO,WAAW,UAAY,CAAE,OAAO,OAAO,MAAM,MAAO,OAAQ,GAAI,CAAG,EAAG,CAAC,EAC5H,EAAG,EAAI,EAOP,SAAS,cAAc,EAAG,CACxB,GAAI,OAAO,OAAO,WAAc,YAAc,OAAO,OAAO,UAAa,YAAc,OAAO,OAAO,eAAkB,WAAY,MAAO,GAC1I,GAAI,CACF,IAAI,EAAI,OAAO,UAAU,EAAG,CAAC,SAAU,EAAG,CAAE,EAAE,EAAE,UAAY,GAAM,EAAE,OAAO,CAAG,CAAC,CAAC,EAAG,GAAI,CAAC,GAAK,CAAC,EAAE,OAAS,CAAC,EAAE,MAAM,CAAC,EAAG,MAAO,GAC7H,IAAI,EAAI,OAAO,SAAS,EAAE,MAAO,EAAE,MAAM,CAAC,CAAC,EAAG,MAAQ,EAAE,MAAQ,CAAC,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,GAAK,CAAC,SAAS,KAAK,EAAE,GAAG,CAAG,CAAC,EAChI,OAAO,OAAO,cAAc,OAAO,OAAO,CAAC,EAAG,EAAG,CAAE,UAAW,GAAI,IAAW,CAAC,EAAG,KAAM,IAAI,GAAK,EAClG,OAAS,EAAG,CAAE,eAAQ,KAAK,cAAe,CAAC,EAAU,EAAI,CAC3D,CAYA,IAAI,MAAQ,CACV,OAAQ,CAAC,CAAE,EAAG,QAAS,IAAK,oBAAe,GAAI,GAAI,EAAG,CAAE,EAAG,QAAS,IAAK,mBAAc,GAAI,GAAI,CAAC,EAChG,MAAO,CAAC,CAAE,EAAG,cAAe,IAAK,2BAAsB,GAAI,GAAI,EAAG,CAAE,EAAG,oBAAqB,IAAK,6BAAwB,GAAI,GAAI,CAAC,EAClI,UAAW,CAAC,CAAE,EAAG,QAAS,IAAK,sCAAiC,GAAI,GAAI,EAAG,CAAE,EAAG,QAAS,IAAK,sCAAiC,GAAI,GAAI,CAAC,CAC1I,EACI,IAAM,CAAE,KAAM,gBAAiB,KAAM,aAAc,QAAS,UAAW,KAAM,iBAAe,EAC5F,KAAO,CACT,QAAS,CAAE,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,EACvC,QAAS,CAAE,IAAK,sBAAuB,EAAG,KAAM,IAAK,GAAI,IAAK,IAAK,IAAK,EAAG,EAC3E,KAAM,CAAE,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,KAAM,EAAG,CAC9C,EACA,SAAS,IAAI,EAAG,CAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY,EAAI,EAAE,MAAM,CAAC,CAAG,CACjE,SAAS,OAAO,EAAG,CAAE,IAAI,EAAI,KAAK,MAAM,IAAI,CAAC,EAAI,EAAE,EAAI,GAAI,OAAO,OAAO,CAAC,EAAE,QAAQ,IAAK,GAAG,CAAG,CAG/F,SAAS,SAAS,EAAG,CAAE,OAAO,EAAI,UAAU,QAAU,UAAU,IAAM,CACtE,SAAS,YAAa,CAAE,OAAO,UAAU,QAAU,GAAK,UAAU,KAAO,CAAG,CAC5E,SAAS,MAAM,EAAG,CAAE,OAAS,UAAU,KAAO,EAAc,UAAU,QAAU,EAAa,CAAC,CAAC,EAAV,GAAlC,EAA+C,CAElG,SAAS,UAAU,EAAG,EAAG,CAAE,MAAO,IAAK,KAAK,KAAK,IAAI,CAAC,GAAK,GAAK,IAAI,EAAI,IAAM,KAAK,EAAI,CACvF,SAAS,YAAY,EAAG,EAAG,CAAE,OAAO,KAAK,OAAO,GAAK,KAAO,KAAK,KAAK,GAAK,IAAI,CAAC,GAAK,KAAK,GAAK,GAAG,CAAC,CAAG,CAGtG,SAAS,SAAS,EAAG,EAAG,CACtB,GAAI,EAAG,MAAO,CAAE,IAAK,KAAK,QAAQ,IAAK,IAAK,KAAK,QAAQ,IAAK,IAAK,KAAK,QAAQ,GAAI,EACpF,IAAI,GAAK,KAAK,IAAI,EAAG,KAAK,IAAI,YAAY,EAAG,EAAE,CAAC,CAAC,EAAG,GAAK,KAAK,IAAI,GAAI,KAAK,IAAI,YAAY,EAAG,KAAK,KAAK,GAAG,CAAC,EAAG,KAAK,IAAI,YAAY,EAAG,KAAK,KAAK,GAAG,CAAC,CAAC,EACtJ,MAAO,CAAE,IAAK,GAAI,IAAK,GAAI,IAAK,KAAK,IAAI,YAAY,EAAG,KAAK,KAAK,GAAG,CAAC,CAAE,CAC1E,CACA,SAAS,SAAS,EAAG,EAAG,CACtB,OAAI,IAAM,QAAU,WAAmB,IAAI,GAAK,EAAE,MAAQ,EAAE,KAAK,mBAAmB,EAC7E,UAAU,CAAC,GAAK,CACzB,CACA,SAAS,OAAO,EAAG,EAAG,CACpB,GAAI,aAAc,CAAE,GAAI,IAAM,OAAQ,MAAO,GAAO,GAAI,IAAM,OAAQ,MAAO,EAAM,CACnF,OAAI,IAAM,OAAe,WAAW,EAC7B,IAAM,QAAU,SAAS,EAAG,CAAC,EAAI,CAC1C,CACA,SAAS,aAAc,CAAE,OAAO,aAAe,OAAS,MAAQ,CAGhE,SAAS,QAAQ,EAAG,CAClB,IAAI,EAAI,EAAE,EAAG,GAAK,SAAU,EAAG,CAAE,MAAO,CAAC,MAAM,EAAG,YAAY,EAAG,EAAE,CAAC,CAAC,CAAG,EACxE,GAAI,EAAE,SAAW,UAAW,OAAO,MAAM,EAAE,MAAM,IAAM,UAAU,EAAE,MAAM,EAAI,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAI,MAAM,EAAE,MAAM,GACxH,GAAI,OAAS,CAAC,SAAS,CAAC,EAAG,OAAO,KAClC,IAAI,EAAI,EAAE,OAAS,OAAQ,EAAI,CAAC,CAAE,EAAG,EAAI,mBAAqB,oBAAqB,IAAK,EAAI,qCAAiC,oCAA+B,GAAI,GAAI,CAAC,EAGjK,GAAK,MAAQ,YAAY,CAAC,EAAI,KAAM,OAAI,IAAI,EAAE,KAAK,EAAE,EACzD,EAAE,KAAK,CAAE,EAAG,WAAW,CAAC,EAAG,IAAK,6BAAwB,GAAI,GAAI,CAAC,EAC1D,EAAE,OAAO,EAAE,CACpB,CAEA,SAAS,MAAM,EAAG,CAChB,IAAI,IAAM,EAAE,EAAE,OAAQ,MAAQ,SAAW,QAAQ,CAAC,EAAI,KAAM,GAAI,CAAC,OAAS,OAAO,CAAC,EAAG,MAAO,CAAC,EAC7F,IAAI,IAAO,EAAE,EAAE,QAAU,EAAE,EAAE,SAAW,CAAC,EAAI,GAAM,IAAI,GAAG,EAAI,IAAI,GAAG,GAAK,CAAC,EAC3E,OAAO,MAAM,IAAI,SAAU,EAAG,CAC5B,IAAI,EAAI,GAAG,EAAE,CAAC,GAAK,CAAC,EAAG,EAAI,EAAE,GAAK,YAAY,GAC1C,CAAC,OAAO,EAAG,CAAC,GAAM,IAAM,QAAU,CAAC,IAAI,EAAE,CAAC,KAAI,EAAI,YAAY,GAClE,IAAI,EAAI,CAAE,EAAG,EAAE,EAAG,IAAK,EAAE,IAAK,GAAI,EAAE,GAAI,EAAM,EAAG,KAAM,KAAM,CAAE,EAC/D,GAAI,IAAM,OACR,EAAE,EAAI,IAAI,EAAE,CAAC,EAAG,EAAE,KAAO,EAAE,MAAQ,KAAM,EAAE,EAAI,MAAM,EAAE,CAAC,EAAG,EAAE,EAAI,KAAK,MAAM,UAAU,SAAS,EAAG,CAAC,EAAG,EAAE,CAAC,EAAI,EAAE,EAAI,GACnH,EAAE,EAAI,EAAE,EAAI,KAAK,IAAI,EAAE,CAAC,EAAI,EAAE,EAAG,EAAE,KAAO,SAAS,EAAE,CAAC,UAC7C,IAAM,UACf,EAAE,MAAS,EAAE,OAAS,EAAE,MAAM,OAAU,EAAE,MAAM,MAAM,EAAI,CAAC,EAAG,EAAE,EAAI,KAAK,IAAI,EAAG,EAAE,MAAM,MAAM,EAC9F,EAAE,EAAI,EAAE,GAAK,KAAO,EAAE,EAAI,KAAK,QAAQ,IAAK,EAAE,KAAO,UAAU,QAAU,EAAE,MACtE,CAAE,IAAI,GAAK,KAAK,CAAC,EAAG,EAAE,EAAI,GAAM,EAAE,IAAM,GAAK,EAAE,GAAK,KAAO,EAAE,EAAI,GAAG,IAAO,KAAM,EAAE,KAAO,SAAS,EAAG,CAAC,CAAG,CACjH,OAAO,CACT,CAAC,CACH,CAGA,SAAS,QAAQ,EAAG,EAAG,CACrB,GAAI,EAAE,SAAU,OAAO,IAAI,EAAE,GAAG,EAChC,IAAI,EAAI,GACR,GAAI,EAAE,IAAM,OAAQ,EAAI,EAAE,EAAI,EAAI,kBAAiB,qBAC1C,EAAE,IAAM,UAAW,CAC1B,IAAI,GAAK,OAAO,EAAG,EAAE,CAAC,EAAG,IAAM,EAAE,OAAS,CAAC,GAAG,KAAK,SAAU,EAAG,CAAE,OAAO,IAAM,EAAI,CAAC,EAAG,IAAM,EAAE,OAAS,CAAC,GAAG,KAAK,SAAU,EAAG,CAAE,OAAO,IAAM,EAAI,CAAC,EAClJ,EAAI,IAAM,GAAK,4BAA2B,GAAK,kBAAiB,YAClE,CACA,OAAO,IAAI,EAAE,GAAG,GAAK,EAAI,KAAO,EAAI,GACtC,CAEA,SAAS,UAAU,EAAG,CACpB,OAAI,EAAE,IAAM,WAAmB,EAAE,EAAI,EAAI,EAAE,EAAI,kBAAoB,gBAAkB,WAAa,MAAM,EAAE,CAAC,EAAI,MAC3G,EAAE,IAAM,OAAe,EAAE,EAAI,0BAA4B,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC,EAAI,MAAQ,mBAAkB,OAAO,EAAE,CAAC,EAAI,OACrH,IAAI,EAAE,CAAC,EAAE,YAAY,GAAK,EAAE,IAAM,QAAU,aAAe,aAAe,GACnF,CAKA,SAAS,QAAQ,IAAK,CACpB,IAAI,EAAI,OAAO,KAAO,EAAE,EACxB,OAAI,IAAM,2BAA6B,qCAChC,EAAE,QAAQ,wBAAyB,eAAS,EAAE,QAAQ,oBAAqB,sBAAgB,CACpG,CACA,SAAS,UAAU,EAAG,EAAG,CACvB,GAAI,EAAE,SAAU,OAAO,IAAI,EAAE,GAAG,EAChC,GAAI,EAAE,IAAM,OAAQ,CAAE,IAAI,GAAK,UAAU,EAAG,CAAC,EAAG,GAAI,GAAI,OAAO,IAAI,EAAE,CAAG,CACxE,OAAO,IAAI,QAAQ,EAAE,GAAG,CAAC,EAAI,QAAQ,EAAG,CAAC,EAAE,MAAM,IAAI,EAAE,GAAG,EAAE,MAAM,CACpE,CAIA,SAAS,QAAQ,EAAG,EAAG,CAAE,IAAI,EAAI,GAAK,OAAO,OAAO,cAAiB,WAAa,OAAO,aAAa,EAAG,CAAC,EAAI,KAAM,OAAO,EAAI,EAAE,QAAQ,WAAY,EAAE,EAAI,IAAM,CACjK,SAAS,UAAU,EAAG,EAAG,CACvB,IAAI,GAAK,EAAE,IAAM,OAAS,CAAC,EAAE,IAAI,EAAI,EAAE,IAAM,UAAa,EAAE,OAAS,CAAC,EAAK,CAAC,EAAG,EAAI,GAAG,IAAI,SAAU,EAAG,CAAE,OAAO,QAAQ,EAAG,CAAC,CAAG,CAAC,EAChI,OAAO,EAAE,QAAU,EAAE,MAAM,OAAO,EAAI,EAAE,KAAK,MAAM,EAAI,IACzD,CACA,SAAS,UAAU,EAAG,EAAG,CACvB,GAAI,EAAE,IAAM,OAAQ,MAAO,YAAc,QAAQ,EAAE,GAAG,EACtD,IAAI,GAAK,UAAU,EAAG,CAAC,EAAG,OAAK,GAC3B,EAAE,IAAM,OAAe,EAAE,EAAI,kBAAoB,GAAK,cAAgB,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC,EAAI,MAAQ,oBAAmB,GAAK,MAAQ,OAAO,EAAE,CAAC,EAAI,QAC/I,EAAE,EAAI,EAAI,mBAAqB,kBAAoB,GAAK,YAAc,MAAM,EAAE,CAAC,EAAI,MAFjD,UAAU,EAAG,CAAC,EAAI,KAAO,YAAY,CAAC,CAGlF,CACA,SAAS,QAAQ,EAAG,CAAE,OAAO,EAAE,IAAM,UAAY,kBAAoB,EAAE,IAAM,QAAU,EAAE,EAAI,mBAAqB,cAAgB,CAClI,SAAS,YAAY,EAAG,CAAE,OAAO,EAAE,IAAM,OAAS,QAAU,aAAe,aAAe,IAAM,UAAU,CAAC,EAAE,QAAQ,iBAAkB,eAAe,CAAG,CAKzJ,SAAS,cAAc,EAAG,EAAG,CAC3B,GAAI,CAAC,YAAc,cAAgB,EAAE,IAAM,OAAQ,MAAO,GAC1D,IAAI,EAAI,EAAE,EAAE,OAAS,CAAC,EAAG,KAAO,EAAE,OAAO,EAAG,EAAE,CAAC,CAAC,IAAM,QAAU,EAAE,QAAQ,EAAG,EAAE,CAAC,CAAC,IAAM,OACvF,OAAQ,EAAE,IAAM,WAAc,EAAE,IAAM,QAAU,EAAE,GAAM,KAAQ,SAAS,EAAG,MAAM,EAAI,CACxF,CAEA,SAAS,UAAU,EAAG,CAAE,MAAO,CAAC,YAAc,KAAK,MAAM,UAAU,KAAO,GAAG,IAAM,KAAK,MAAM,IAAI,EAAE,MAAQ,EAAE,KAAK,mBAAmB,EAAI,GAAG,CAAG,CAEhJ,OAAO,gBAAkB,SAAU,EAAG,EAAG,CAAE,IAAI,GAAK,GAAK,EAAE,GAAK,CAAC,KAAK,CAAC,EAAI,MAAM,CAAC,EAAI,CAAC,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,GAAK,CAAC,EAAE,QAAU,CAAC,EAAE,CAAC,EAAG,OAAO,EAAI,QAAQ,EAAE,GAAG,EAAI,IAAM,EAC1L,OAAO,SAAW,UAAY,CAC5B,IAAI,EAAI,OAAO,EAAG,MAAI,CAAC,GAAK,CAAC,EAAE,EAAU,KAClC,MAAM,CAAC,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,MAAQ,CAAC,EAAE,OAAO,WAAW,CAAC,CAAC,EAAE,IAAI,SAAU,EAAG,CACrG,IAAI,GAAK,EAAE,IAAM,OAAU,EAAE,EAAI,UAAY,OAAU,EAAE,EAGrD,EAAI,CAAE,IAAK,EAAE,EAAG,KAAM,EAAE,SAAW,EAAE,IAAM,QAAQ,EAAE,GAAG,EAAG,MAAO,GAAI,KAAM,EAAE,EAAG,MAAO,KAAO,OAAS,OAAO,KAAO,WAAa,KAAO,UAAa,KAAO,KAAM,MAAO,YAAY,CAAC,EAC1L,cAAe,KAAK,MAAM,EAAE,KAAO,GAAG,EAAG,YAAa,EAAE,IAAM,OAAU,aAAe,UAAY,QAAY,EAAE,KAAO,EAAI,gBAAe,IAAM,EAC/I,EAAE,IAAM,SAAU,EAAE,WAAa,EAAE,EAAG,EAAE,MAAQ,EAAE,EAAG,EAAE,KAAO,EAAE,KAAM,EAAE,SAAW,EAAE,EAAI,OAAS,QAClG,EAAE,IAAM,YAAa,EAAE,MAAQ,EAAE,MAAO,EAAE,OAAS,EAAE,GACzD,EAAE,QAAU,UAAU,EAAG,CAAC,EAAI,MAAQ,YAAY,CAAC,EAKnD,IAAI,GAAK,QAAQ,EAAG,CAAC,EAAG,GAAK,EAAE,SAAW,GAAK,GAAG,MAAM,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,MAAO,EAAE,EAC5F,OAAI,KAAI,EAAE,SAAW,IACrB,EAAE,eAAiB,EAAE,SAAW,IAAI,EAAE,GAAG,EAAI,IAAI,QAAQ,EAAE,GAAG,CAAC,EAAI,GAAG,MAAM,IAAI,EAAE,GAAG,EAAE,MAAM,GAAK,MAAQ,YAAY,CAAC,EAChH,CACT,CAAC,CACH,EAGA,SAAS,UAAU,EAAG,CACpB,IAAI,EAAI,EAAE,EAAG,IAAM,EAAE,OAAQ,EAAE,YAAc,EAAE,aAAe,CAAC,EAAG,EAAE,gBAAkB,EAAE,iBAAmB,CAAC,EAI5G,IAAI,KAAO,EAAE,WAAY,EAAE,WAAa,KACxC,IAAI,IAAO,EAAE,QAAU,EAAE,SAAW,CAAC,EAAI,GAAM,IAAI,GAAG,EAAI,IAAI,GAAG,GAAK,CAAC,EACvE,GAAI,KAAM,CACR,IAAI,GAAK,MAAM,CAAC,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,KAAK,CAAG,CAAC,EAAE,CAAC,EAC/D,KAAO,GAAG,IAAM,QAAU,GAAG,IAAM,UACjC,KAAK,OAAS,OAAO,EAAG,MAAM,EAAG,GAAG,GAAG,CAAC,EAAI,CAAE,EAAG,OAAQ,EAAG,IAAK,EAC5D,CAAC,KAAK,OAAS,OAAO,EAAG,MAAM,IAAG,GAAG,GAAG,CAAC,EAAI,CAAE,EAAG,OAAQ,EAAG,IAAK,GAE/E,CAEA,IAAI,GAAK,YAAY,CAAC,EACtB,MAAM,CAAC,EAAE,QAAQ,SAAU,EAAG,CAAM,GAAG,EAAE,CAAC,GAAK,EAAE,IAAM,QAAU,CAAC,cAAc,OAAO,GAAG,EAAE,CAAC,CAAG,CAAC,EACjG,MAAM,CAAC,EAAE,QAAQ,SAAU,EAAG,CAAE,EAAE,YAAY,EAAE,CAAC,EAAI,EAAE,IAAM,OAAQ,EAAE,gBAAgB,EAAE,CAAC,EAAI,EAAE,IAAM,MAAQ,CAAC,CACjH,CACA,SAAS,SAAS,EAAG,EAAG,CAAE,OAAO,EAAE,IAAM,UAAY,eAAiB,WAAa,CACnF,SAAS,UAAU,EAAG,CAAM,OAAO,QAAU,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM,EAAG,OAAQ,GAAI,CAAG,CACxG,SAAS,UAAU,EAAG,CAAE,OAAO,IAAI,EAAE,GAAG,EAAI,qBAAoB,OAAO,EAAE,CAAC,EAAI,iJAAiI,CAG/M,OAAO,iBAAiB,QAAS,SAAU,EAAG,CAC5C,IAAI,EAAI,OAAO,EAAG,GAAK,EAAE,QAAU,EAAE,OAAO,SAAW,EAAE,OAAO,QAAQ,kCAAkC,EAC1G,GAAI,GAAC,IAAM,CAAC,GAAK,CAAC,EAAE,GAAK,CAAC,EAAE,MAAQ,CAAC,EAAE,KAAK,SAAS,EAAE,GAAK,CAAC,EAAE,mBAC/D,KAAI,EAAI,GAAG,QAAQ,KAAM,EAAI,MAAM,CAAC,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,CAAG,CAAC,EAAE,CAAC,EAAG,GAAK,EAC1F,KAAI,OAAS,UAAY,CAAE,EAAE,eAAe,EAAG,EAAE,gBAAgB,EAAO,EAAE,0BAA0B,EAAE,yBAAyB,CAAG,EAClI,GAAI,EAAE,IAAM,WAAa,YAAY,CAAC,EAAE,CAAC,EAAG,CAAE,OAAO,EAAG,MAAQ,CAGhE,GAAI,EAAE,IAAM,OAAQ,CACR,GAAV,OAAO,EAAO,EAAE,EAAG,OACnB,UAAU,UAAU,CAAC,CAAC,EAAO,EAAE,QAAQ,WAAW,UAAY,CAAE,EAAE,OAAO,CAAG,EAAG,CAAC,EAChF,MACF,CACA,GAAI,aAAc,CAAE,OAAO,EAAG,MAAQ,CAClC,GAAG,UAAU,SAAS,UAAU,IACpC,EAAE,EAAE,WAAa,CAAE,EAAM,MAAO,CAAC,GAAG,UAAU,SAAS,SAAS,CAAE,IACpE,EAAG,EAAI,EAKP,SAAS,UAAU,EAAG,CACpB,GAAK,EAAE,KACP,KAAI,EAAI,KAAK,CAAC,EAAG,GAAI,KAAK,EAAE,OAAS,SACrC,KAAI,GAAK,YAAY,CAAC,EACtB,MAAM,CAAC,EAAE,QAAQ,SAAU,EAAG,CAC5B,IAAI,GAAK,EAAE,KAAK,cAAc,oCAAsC,EAAE,EAAI,IAAI,EAE9E,GADI,CAAC,IAAM,EAAE,IAAM,SAAQ,GAAK,YAAY,EAAG,CAAC,GAC5C,EAAC,GACL,KAAI,IAAM,KAAM,MAAQ,OAAQ,IAAM,KAAM,IAAM,IAI9C,IAAM,KAAK,MAAM,cAAc,EAAG,CAAC,EAAI,GAAG,EAAG,MAAQ,+BAErD,MAAQ,UAAY,CAAE,MAAO,YAAc,QAAQ,EAAE,GAAG,EAAI,gBAAkB,QAAQ,CAAC,GAAK,IAAM,EAAI,MAAQ,IAAI,GAAG,EAAI,WAAQ,0BAA4B,EAC7J,EAAE,IAAM,WAAa,GAAG,EAAE,CAAC,GAC7B,GAAG,UAAU,IAAI,WAAY,eAAe,EAAG,IAAM,MAAM,GAClD,EAAE,IAAM,QACjB,GAAG,UAAU,OAAO,SAAS,EAAO,EAAE,EAAE,cAAa,EAAE,EAAE,YAAY,EAAE,CAAC,EAAI,IAC5E,GAAG,UAAU,IAAI,WAAY,EAAE,EAAI,eAAiB,cAAc,EAClE,YAAY,EAAG,CAAC,EAChB,IAAM,EAAE,EAAI,MAAM,EAAI,YAAc,QAAQ,EAAE,GAAG,EAAI,2DACrD,MAAQ,EAAE,EAAI,OAAS,QAAS,IAAM,EAAE,EAAI,KAAO,KAC1C,cAAgB,EAAE,IAAM,SACjC,GAAG,UAAU,IAAI,WAAY,iBAAiB,EAAG,IAAM,YAAc,QAAQ,EAAE,GAAG,EAAI,kCAEnF,MACL,GAAG,aAAa,cAAe,GAAG,EAAG,GAAG,aAAa,gBAAiB,KAAK,EAAG,GAAG,aAAa,cAAe,GAAG,EAAG,GAAG,aAAa,iBAAkB,GAAG,GAC1J,CAAC,EACD,iBAAiB,GACnB,CAGA,SAAS,YAAY,EAAG,EAAG,CACzB,GAAI,CAAC,EAAE,KAAM,OAAO,KACpB,IAAI,IAAM,SAAS,cAAc,KAAK,EAAG,IAAI,UAAY,wCACzD,IAAI,MAAM,SAAW,WAAY,IAAI,MAAM,UAAY,wBAAyB,IAAI,MAAM,OAAS,MACnG,IAAI,GAAK,SAAS,cAAc,KAAK,EAAG,UAAG,UAAY,uBAAwB,GAAG,QAAQ,KAAO,EAAE,EAAG,GAAG,QAAQ,YAAc,OAC/H,GAAG,iBAAiB,UAAW,SAAU,EAAG,EAAM,EAAE,MAAQ,SAAW,EAAE,MAAQ,OAAO,EAAE,eAAe,EAAG,GAAG,MAAM,EAAK,CAAC,EAC3H,GAAG,iBAAiB,QAAS,UAAY,CAAC,CAAC,EAC3C,IAAI,YAAY,EAAE,EAAG,EAAE,KAAK,YAAY,GAAG,EACpC,EACT,CAIA,SAAS,YAAY,EAAG,EAAG,CACzB,IAAI,KAAO,UAAY,CACrB,IAAI,EAAI,OAAO,EAAG,EAAE,CAAC,GAAK,WAAW,EAAG,EAAE,CAAC,EAAG,GAAK,OAAO,EAAE,EAAE,MAAM,GAAK,CAAC,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,QAAQ,CAAC,GAAK,CAAG,CAAC,EAAE,CAAC,EAC7H,KAAO,SAAU,EAAG,CAAE,MAAO,CAAC,EAAE,MAAM,KAAK,SAAS,iBAAiB,+BAAiC,EAAI,IAAI,CAAC,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,sBAAsB,EAAE,MAAQ,CAAG,CAAC,EAAE,CAAC,CAAG,EAC1L,GAAK,EAAE,MAAQ,EAAE,KAAK,cAAc,oCAAsC,EAAE,EAAI,IAAI,EAAG,IAAM,IAAM,GAAG,QAAQ,0BAA0B,EACxI,GAAK,GAAK,KAAK,CAAC,EAAG,GAAK,GAAK,KAAK,EAAE,CAAC,IAAM,EAAI,EAAE,CAAC,EAAI,EAAE,CAAC,CAAC,EAC9D,GAAI,GAAC,IAAM,CAAC,IAAM,CAAC,KAAO,CAAC,IAAI,YAC/B,KAAI,GAAK,GAAG,sBAAsB,EAAG,GAAK,GAAG,sBAAsB,EAAG,EAAI,IAAI,WAAW,sBAAsB,EAC/G,IAAI,MAAM,MAAS,GAAG,KAAO,GAAG,MAAQ,EAAI,GAAG,KAAO,GAAG,MAAQ,GAAK,EAAI,EAAE,KAAQ,KACpF,IAAI,MAAM,KAAQ,GAAG,IAAM,GAAG,OAAS,EAAI,GAAG,IAAM,GAAG,OAAS,GAAK,EAAI,EAAE,IAAO,KAC9E,OAAO,OAAO,iBAAoB,YAAY,OAAO,gBAAgB,CAAC,EAC5E,EACA,WAAW,KAAM,CAAC,EAAG,WAAW,KAAM,GAAG,CAC3C,CACA,SAAS,kBAAmB,CAC1B,IAAI,EAAI,OAAO,EAAO,CAAC,GAAK,CAAC,EAAE,MAC/B,MAAM,UAAU,QAAQ,KAAK,EAAE,KAAK,iBAAiB,oCAAoC,EAAG,SAAU,GAAI,CACxG,IAAI,EAAI,GAAG,aAAa,aAAa,EAAG,GAAK,GAAG,aAAa,eAAe,EAAG,IAAM,GAAG,aAAa,aAAa,EAAG,IAAM,GAAG,aAAa,gBAAgB,IAAM,IAC7J,GAAG,aAAa,YAAY,IAAM,GAAG,GAAG,aAAa,aAAc,CAAC,EACpE,GAAG,QAAU,IAAG,GAAG,MAAQ,GAC3B,GAAG,aAAa,MAAM,IAAM,YAAY,GAAG,aAAa,OAAQ,UAAU,EAC1E,GAAG,aAAa,cAAc,IAAM,IAAI,GAAG,aAAa,eAAgB,EAAE,EAC1E,KAAO,GAAG,aAAa,eAAe,IAAM,QAAQ,GAAG,aAAa,gBAAiB,MAAM,EAC3F,CAAC,KAAO,GAAG,aAAa,eAAe,GAAG,GAAG,gBAAgB,eAAe,EAC5E,GAAG,aAAa,UAAU,IAAM,KAAK,GAAG,aAAa,WAAY,GAAG,CAC1E,CAAC,CACH,CAWA,IAAI,SAAW,CAAE,MAAO,QAAS,KAAM,aAAW,MAAO,oBAAe,MAAO,kBAAa,EAI5F,SAAS,YAAY,EAAG,CAAE,IAAI,EAAI,MAAM,GAAK,OAAO,CAAC,EAAG,OAAO,OAAS,SAAW,aAAe,CAAC,CAAC,GAAK,IAAI,EAAE,qBAAqB,EAAI,CAAG,CAC3I,SAAS,SAAS,EAAG,CACnB,IAAI,EAAI,OAAO,OAAO,cAAiB,WAAa,OAAO,aAAa,CAAC,EAAI,KAC7E,OAAO,KAAK,MAAM,IAAI,IAAgB,GAAK,EAAE,MAAQ,EAAE,KAAK,oBAAmB,EAAI,GAAG,CACxF,CACA,SAAS,SAAS,EAAG,CACnB,IAAI,IAAM,CAAC,EAAG,EAAI,SAAS,gBAAiB,GAAI,CAAC,GAAK,CAAC,EAAE,MAAQ,CAAC,EAAE,GAAK,EAAE,EAAE,SAAW,UAAY,CAAC,YAAY,CAAC,EAAG,OAAO,IAC5H,IAAI,EAAI,KAAK,CAAC,EAAG,GAAI,GAAK,EAAE,OAAS,QAAS,OAAO,IACrD,IAAI,GAAK,SAAS,CAAC,EAAG,GAAK,QAAQ,CAAC,EACpC,OAAC,OAAQ,QAAS,QAAS,OAAO,EAAE,QAAQ,SAAU,EAAG,CACvD,IAAI,GAAK,EAAE,KAAK,cAAc,oCAAsC,EAAI,IAAI,EAAG,IAAM,IAAM,GAAG,QAAQ,0BAA0B,EAChI,GAAI,GAAC,IAAM,CAAC,KAAO,CAAC,GAAG,eAAe,EAAE,QAAU,iBAAiB,GAAG,EAAE,UAAY,QACpF,KAAI,GAAK,GAAG,UAAU,SAAS,SAAS,EAAG,IAAM,GAAG,UAAU,SAAS,UAAU,EAAG,EAAI,KAAM,EAAI,CAAE,EAAM,GAAQ,GAAS,EAC3H,GAAI,GAAG,aAAa,aAAa,EAAG,CAC9B,GAAG,UAAU,SAAS,iBAAiB,GAAG,IAAI,KAAK,CAAE,EAAM,GAAI,GAAM,IAAK,GAAM,KAAM,GAAM,IAAK,SAAS,CAAC,EAAI,qBAAmB,CAAC,EACvI,MACF,CACI,IAAM,OACJ,EAAE,UAAU,SAAS,eAAe,GAAK,EAAE,OAAS,GAAM,EAAI,GAAK,oCAAgC,2CAC9F,KAAI,EAAI,iBACP,IAAM,KAAS,IAAM,GAAK,EAAI,gBACjC,GAAK,GAAK,EAAE,KAAO,GAAI,GAAK,GAAK,UAAY,KAAO,IAAI,EAAE,EAAI,WAC9D,KAAI,EAAI,QACZ,IACL,EAAE,IAAM,SAAS,CAAC,EAAI,SAAQ,EAAG,IAAI,KAAK,CAAC,GAC7C,CAAC,EACM,GACT,CACA,SAAS,UAAU,EAAG,CACpB,IAAI,EAAI,SAAS,CAAC,EAAG,EAAI,SAAS,gBAClC,EAAE,UAAU,OAAO,gBAAiB,EAAE,OAAS,CAAC,EAChD,WAAW,EAAG,CAAC,EAAG,eAAe,CACnC,CAIA,SAAS,WAAW,EAAG,EAAG,CACxB,IAAI,EAAI,SAAS,eAAe,gBAAgB,EAAG,GAAK,CAAC,EAAG,EAAI,GAChE,EAAE,QAAQ,SAAU,EAAG,CAAE,GAAG,EAAE,CAAC,EAAI,CAAG,CAAC,EACvC,IAAI,MAAQ,CAAC,QAAS,OAAO,EAAE,IAAI,SAAU,EAAG,CAAE,OAAO,GAAG,CAAC,CAAG,CAAC,EAAE,OAAO,OAAO,EAAG,KAAO,MAAM,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,CAAC,EAAE,CAAC,EACtI,IAAM,GAAG,MAAQ,GAAG,KAAK,OAAS,wHAA8G,GAMpJ,GAHI,EAAE,QAAU,EAAE,MAAM,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,EAAE,GAAK,CAAC,GAAK,GAAG,MAAQ,CAAC,GAAG,KAAK,OAAQ,EAAI,sGAC1F,KAAM,EAAI,uHAAoH,IAAI,KAAK,IAAI,EAAI,WAAQ,IACvJ,MAAM,QAAU,MAAM,MAAM,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,EAAE,GAAK,CAAC,IAAG,EAAI,wEAAqE,KACnJ,CAAC,EAAG,CAAM,GAAK,EAAE,YAAY,EAAE,WAAW,YAAY,CAAC,EAAG,MAAQ,CACtE,IAAI,KAAO,SAAS,eAAe,iBAAiB,GAAM,SAAS,eAAe,OAAO,GAAK,SAAS,eAAe,OAAO,EAAE,WAAkB,OAC5I,IAAK,EAAI,SAAS,cAAc,GAAG,EAAG,EAAE,GAAK,iBAAkB,EAAE,aAAa,OAAQ,MAAM,EAAG,KAAK,YAAY,CAAC,GAClH,EAAE,cAAgB,IAAG,EAAE,YAAc,GACrC,KAAK,SAAQ,KAAK,OAAS,IACjC,CAGA,SAAS,gBAAiB,CACxB,IAAI,EAAI,OAAO,EAAG,EAAI,SAAS,gBAAqB,CAAC,GAAK,CAAC,EAAE,UAAU,SAAS,eAAe,GAAK,EAAE,UAAU,SAAS,SAAS,GAClI,SAAS,CAAC,EAAE,QAAQ,SAAU,EAAG,CAC/B,GAAI,IAAE,IAAM,QAAU,EAAE,MAAS,EAAE,IAAM,SAAW,CAAC,EAAE,MACvD,KAAI,GAAK,EAAE,KAAK,cAAc,oCAAsC,EAAE,EAAI,IAAI,EAAG,GAAK,GACtF,KAAI,EAAI,EAAE,IAAM,QAAU,oDAAsD,YAAc,SAAS,EAAE,CAAC,EAAE,YAAY,EAAI,OAAS,EAAE,GAAK,UAAY,IAAI,EAAE,IAAI,EAAI,WAAQ,gCAAkC,IAAI,EAAE,IAAI,EAAI,YAC1N,GAAG,aAAa,YAAY,IAAM,GAAG,GAAG,aAAa,aAAc,CAAC,EACpE,GAAG,QAAU,IAAG,GAAG,MAAQ,IACjC,CAAC,CACH,CAGA,SAAS,cAAe,CACtB,MAAO,yEACT,CAGA,SAAS,UAAW,CAClB,IAAI,EAAI,8BACR,OAAO,EAAI,6JACT,EAAI,mFACJ,EAAI,sFAAwF,EAAI,+CAChG,EAAI,kGAAoG,EAAI,kOAKhH,CAUA,IAAI,WAAa,CACf,OAAQ,CAAE,MAAO,aAAc,MAAO,aAAc,EACpD,cAAe,CAAE,YAAa,SAAU,kBAAmB,QAAS,EACpE,aAAc,CAAE,YAAa,SAAU,kBAAmB,QAAS,EACnE,UAAW,CAAE,MAAO,UAAW,MAAO,SAAU,EAChD,UAAW,CAAE,iBAAkB,UAAW,YAAa,WAAY,EACnE,SAAU,CAAE,kBAAmB,UAAW,qBAAsB,YAAa,oBAAqB,WAAY,CAChH,EACI,UAAY,CAAE,OAAQ,CAAE,MAAO,IAAK,MAAO,GAAI,EAAG,MAAO,CAAE,YAAa,KAAM,kBAAmB,IAAK,EAAG,UAAW,CAAE,MAAO,KAAM,MAAO,IAAK,EACjJ,UAAW,CAAE,iBAAkB,SAAU,YAAa,WAAY,kBAAmB,SAAU,qBAAsB,WAAY,oBAAqB,UAAW,CAAE,EACjK,WAAa,CAAE,OAAQ,CAAC,UAAW,WAAY,aAAc,aAAa,EAAG,MAAO,CAAC,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,QAAQ,EACrK,UAAW,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,SAAS,EACvF,UAAW,CAAC,UAAW,UAAW,UAAW,SAAU,SAAU,SAAU,WAAY,WAAY,WAAY,WAAY,YAAa,YAAa,YAAa,WAAW,CAAE,EAC7K,MAAQ,SAAU,EAAG,KAAM,CAAE,MAAO,+EAAiF,EAAI,wDAA0D,MAAQ,IAAM,QAAU,EAC3M,WAAa,CAAE,KAAM,MAAM,oBAAoB,CAAE,EACrD,SAAS,QAAS,CAAE,OAAO,WAAa,UAAU,QAAU,GAAK,UAAU,QAAU,EAAI,CACzF,SAAS,SAAS,EAAG,CAAE,MAAO,CAAC,EAAE,GAAK,EAAE,MAAQ,EAAE,KAAK,QAAU,EAAE,KAAK,OAAO,GAAK,CACpF,SAAS,MAAM,EAAG,CAAE,OAAO,OAAO,GAAK,CAAC,SAAS,CAAC,CAAG,CACrD,SAAS,OAAO,EAAG,EAAG,CACpB,IAAI,EAAI,EAAE,EAAG,EAAI,EAAE,OAAQ,EAAI,IAAM,QAAU,WAAW,EAAE,WAAa,OAAS,aAAe,aAAa,EAAI,IAAM,UAAY,WAAW,EAAE,OAAS,OAAS,SAAW,SAAS,EAAI,WAAW,CAAC,EACvM,OAAQ,GAAK,EAAE,CAAC,GAAM,IACxB,CACA,SAAS,WAAW,EAAG,EAAG,CAAE,OAAO,GAAI,MAAM,CAAC,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,OAAO,EAAG,EAAE,CAAC,IAAM,CAAG,CAAC,EAAE,CAAC,GAAK,IAAa,CAGzH,IAAI,UAAY,CAAE,UAAW,CAAE,qBAAsB,WAAY,qBAAsB,UAAW,EAAG,SAAU,CAAE,sBAAuB,WAAY,sBAAuB,UAAW,CAAE,EACxL,SAAS,WAAW,EAAG,EAAG,CACxB,IAAI,EAAI,OAAO,EAAG,CAAC,EAAG,GAAI,GAAK,EAAE,EAAE,SAAW,UAAW,OAAO,EAChE,IAAI,EAAI,UAAU,EAAE,EAAE,OAAS,OAAS,SAAW,SAAS,EAAG,OAAQ,GAAK,EAAE,CAAC,GAAM,IACvF,CACA,SAAS,WAAW,EAAG,EAAG,CAAE,OAAO,GAAI,MAAM,CAAC,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,WAAW,EAAG,EAAE,CAAC,IAAM,CAAG,CAAC,EAAE,CAAC,GAAK,IAAa,CAE7H,SAAS,QAAQ,EAAG,EAAG,CACrB,IAAI,EAAI,OAAO,EAAG,CAAC,EAAG,GAAI,CAAC,EAAG,OAAO,WAAW,EAAG,CAAC,EACpD,IAAI,GAAK,OAAO,EAAE,EAAE,MAAM,GAAK,CAAC,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,QAAQ,CAAC,GAAK,CAAG,CAAC,EAAE,CAAC,EAAG,OAAO,EAAK,EAAE,CAAC,IAAM,EAAI,EAAE,CAAC,EAAI,EAAE,CAAC,EAAK,IACpI,CAEA,SAAS,WAAW,EAAG,EAAG,CACxB,GAAI,CAAC,EAAG,OAAO,KACf,IAAI,EAAI,KAAM,aAAM,CAAC,EAAE,QAAQ,SAAU,EAAG,CAAM,CAAC,GAAK,OAAO,EAAG,EAAE,CAAC,IAAM,EAAG,EAAI,CAAE,EAAM,KAAM,CAAE,EAAY,CAAC,GAAK,QAAQ,EAAG,EAAE,CAAC,IAAM,IAAG,EAAI,CAAE,EAAM,KAAM,EAAG,EAAG,CAAC,EAC7J,CACT,CAKA,SAAS,QAAQ,EAAG,EAAG,CACrB,IAAI,EAAI,EAAE,EAAE,OACZ,OAAI,IAAM,SAAiB,cAAc,CAAC,EACnC,YAAY,CAAC,GAAK,CAAC,CAAC,YAAY,EAAG,EAAE,CAAC,CAC/C,CAEA,SAAS,OAAO,EAAG,CACjB,GAAI,CAAC,UAAY,CAAC,MAAM,CAAC,GAAK,EAAE,UAAU,QAAU,GAAI,MAAO,CAAC,EAChE,IAAI,EAAI,EAAE,EAAE,OACZ,OAAI,IAAM,UAAY,QAAQ,CAAC,EAAU,MAAM,OACxC,QAAQ,CAAC,CAClB,CACA,SAAS,UAAU,EAAG,EAAG,CACvB,IAAI,EAAI,KAAM,MAAI,CAAC,GAAK,QAAQ,CAAC,EAAE,CAAC,GACpC,OAAO,CAAC,EAAE,QAAQ,SAAU,EAAG,CAAM,CAAC,GAAK,OAAO,EAAG,EAAE,CAAC,IAAM,EAAG,EAAI,CAAE,EAAM,KAAM,CAAE,EAAY,CAAC,GAAK,QAAQ,EAAG,EAAE,CAAC,IAAM,IAAG,EAAI,CAAE,EAAM,KAAM,EAAG,EAAG,CAAC,EAChJ,CACT,CAEA,SAAS,aAAa,EAAG,EAAG,CAC1B,MAAI,CAAC,GAAK,CAAC,YAAY,CAAC,EAAU,CAAC,EAC/B,QAAQ,CAAC,EAAE,CAAC,EAAU,OAAO,EAAG,CAAC,EAAI,KAAK,EAAG,CAAC,EAAE,OAAS,CAAC,EACvD,UAAU,EAAE,EAAE,MAAM,EAAE,OAAO,SAAU,EAAG,CAAE,IAAI,EAAI,UAAU,EAAG,CAAC,EAAG,GAAK,GAAK,QAAQ,EAAG,EAAE,CAAC,EAAG,MAAO,CAAC,CAAC,IAAM,KAAO,GAAK,OAAO,EAAG,EAAE,CAAC,IAAM,EAAI,CAAC,CAC5J,CAKA,SAAS,SAAS,EAAG,GAAI,CACvB,OAAO,MAAM,CAAC,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,SAAW,CAAC,IAAM,GAAG,QAAQ,EAAE,CAAC,GAAK,EAAI,CAAC,EAC5F,IAAI,SAAU,EAAG,CAAE,MAAO,CAAE,EAAG,CAAC,CAAC,EAAE,EAAG,KAAM,QAAQ,EAAG,EAAE,IAAI,EAAG,IAAK,EAAE,GAAI,CAAG,CAAC,CACpF,CACA,SAAS,UAAU,EAAG,SAAU,CAC9B,MAAO,CAAC,GAAM,EAAK,EAAE,IAAI,SAAU,EAAG,CACpC,IAAI,EAAI,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,CAAG,CAAC,EAAG,GAAI,CAAC,EAAE,OAAQ,OAAO,KAC5E,IAAI,EAAI,EAAK,EAAE,OAAS,EAAI,qBAAuB,mBAAuB,EAAE,OAAS,EAAI,sBAAqB,qBAAoB,OAAI,SAAiB,EAChJ,EAAE,MAAM,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,CAAC,EAAI,EAAI,KAAO,EAAE,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,CAAC,EAAE,KAAK,KAAK,EAAI,IAAM,EAAI,IAAM,EAAE,IAAI,SAAU,EAAG,CAAE,MAAO,MAAQ,EAAE,GAAK,CAAC,EAAE,KAAK,MAAM,CAC7L,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,MAAM,CAChC,CACA,SAAS,aAAa,EAAG,EAAG,EAAG,CAC7B,IAAI,EAAI,OAAO,GAAM,SAAW,EAAK,EAAI,SAAW,OAAS,IAAM,MAAM,CAAC,EAAG,EAAI,EAAE,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,CAAG,CAAC,EAAG,EAAI,EAAE,KAAK,SAAU,EAAG,CAAE,MAAO,CAAC,EAAE,CAAG,CAAC,EAC/J,OAAQ,IAAM,OAAS,eAAiB,mBAAqB,cAAgB,IAAM,MAAQ,OAAS,EAAI,IAAM,OAAO,CAAC,EAAI,kCAA8B,IAAM,aAAe,WAAa,EACxL,0BAA4B,GAAK,EAAI,sCAAqC,EAAI,gBAAkB,mBAAkB,qBAAwB,UAAU,CAAC,EAAI,GAC7J,CACA,SAAS,QAAQ,EAAG,CAAE,OAAO,EAAE,OAAS,EAAI,EAAE,MAAM,EAAG,EAAE,EAAE,KAAK,IAAI,EAAI,OAAS,EAAE,EAAE,OAAS,CAAC,EAAI,EAAE,CAAC,CAAG,CACzG,SAAS,WAAW,EAAG,EAAG,CACxB,IAAI,EAAI,OAAO,GAAM,SAAW,EAAK,EAAI,SAAW,OACpD,MAAO,mBAAsB,UAAU,CAAC,EAAI,OAAS,MAAM,CAAC,EAAI,OAAS,OAAS,EAAI,IAAM,OAAO,CAAC,EAAI,uCAC1G,CAEA,SAAS,eAAe,EAAG,EAAG,CAC5B,IAAI,EAAI,EAAE,EACV,GAAI,EAAE,SAAW,SAAU,CACzB,GAAI,QAAQ,CAAC,GAAK,CAAC,aAAa,CAAC,GAAK,CAAC,MAAM,OAAO,KAAK,SAAU,EAAG,CAAE,IAAI,GAAK,QAAQ,EAAG,EAAE,CAAC,EAAG,OAAO,KAAO,GAAK,OAAO,EAAG,EAAE,CAAC,IAAM,EAAI,CAAC,EAAG,OAAO,KACvJ,IAAI,EAAI,SAAS,CAAC,EAAG,OAAO,EAAE,OAAS,CAAE,EAAG,GAAO,CAAK,EAAI,IAC9D,CACA,IAAI,EAAI,KACR,oBAAa,EAAG,CAAC,EAAE,QAAQ,SAAU,EAAG,CACtC,GAAI,KAAK,MAAM,EAAG,CAAC,GACnB,KAAI,EAAI,UAAU,EAAG,CAAC,EAAG,GAAK,EAAI,SAAS,EAAG,CAAC,EAAE,CAAC,CAAC,EAAI,CAAC,EAAO,GAAG,SAAQ,EAAI,CAAE,EAAG,MAAM,EAAG,CAAC,EAAG,EAAG,EAAG,GACxG,CAAC,EACM,CACT,CACA,SAAS,UAAU,EAAG,EAAG,EAAG,CAAE,IAAI,EAAI,eAAe,EAAG,CAAC,EAAG,OAAO,EAAI,aAAa,EAAE,EAAG,EAAE,EAAG,CAAC,EAAI,IAAM,CACzG,SAAS,WAAW,EAAG,CACrB,IAAI,EAAI,EAAE,EAAE,OAAS,CAAC,EAAG,EAAI,IAAI,EAAE,EAAE,WAAW,GAAK,KAAK,QAAQ,IAAK,GAAK,QAAQ,CAAC,EACjF,EAAI,OAAO,CAAC,EAAE,IAAI,SAAU,EAAG,CACjC,IAAI,MAAQ,CAAC,OAAO,EAAG,EAAE,CAAC,EAAG,QAAQ,EAAG,EAAE,CAAC,CAAC,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,GAAK,CAAC,GAAG,CAAC,GAAK,EAAE,CAAC,IAAM,QAAU,CAAC,EAC9G,OAAO,MAAM,OAAS,CAAE,EAAG,EAAE,EAAG,IAAK,EAAE,IAAK,GAAI,EAAE,GAAI,EAAG,UAAW,MAAc,EAAG,MAAM,OAAQ,EAAM,KAAM,UAAU,QAAU,MAAM,OAAQ,MAAO,EAAK,EAAI,IACnK,CAAC,EAAE,OAAO,OAAO,EAEjB,cAAO,KAAK,EAAE,EAAE,QAAQ,SAAU,EAAG,CAAM,EAAE,CAAC,IAAM,UAAY,OAAO,EAAG,CAAC,GAAG,EAAE,KAAK,CAAE,EAAG,EAAG,IAAK,MAAM,EAAG,CAAC,EAAG,GAAI,KAAM,EAAG,UAAW,MAAO,CAAC,CAAC,EAAG,EAAG,EAAG,EAAM,KAAM,UAAU,QAAS,MAAO,GAAM,SAAU,EAAK,CAAC,CAAG,CAAC,EAClN,CACT,CACA,SAAS,SAAS,EAAG,EAAG,CAAE,IAAI,EAAI,UAAU,EAAE,EAAE,MAAM,EAAG,EAAI,GAAK,EAAE,EAAE,CAAC,EAAG,OAAO,IAAI,GAAK,EAAE,EAAE,CAAC,CAAC,GAAK,GAAK,CAC1G,SAAS,KAAK,EAAG,CAAE,OAAO,KAAK,MAAM,CAAC,IAAM,EAAI,OAAO,CAAC,EAAI,IAAI,KAAK,MAAM,EAAI,GAAG,CAAC,CAAG,CACtF,OAAO,cAAgB,SAAU,EAAG,CAClC,IAAI,EAAI,OAAO,EAAG,GAAI,CAAC,GAAK,CAAC,EAAE,EAAG,MAAO,GACzC,IAAI,GAAK,EAAE,EAAE,OAAS,CAAC,GAAG,CAAC,EAAG,OAAQ,IAAM,SAAW,CAAC,CAAC,WAAW,EAAG,CAAC,GAAO,IAAM,UAAY,MAAM,CAAC,GAAK,CAAC,EAAE,WAAW,EAAG,CAAC,GAAK,UAAU,EAAG,CAAC,GAAK,OAAO,EAAG,CAAC,EACpK,EACA,OAAO,eAAiB,SAAU,EAAG,CACnC,IAAI,EAAI,OAAO,EAAG,EAAI,GAAK,EAAE,IAAM,EAAE,EAAE,OAAS,CAAC,GAAG,CAAC,IAAM,QAAU,WAAW,EAAG,CAAC,EAAI,KACxF,OAAO,GAAK,EAAE,EAAE,IAAM,OAAU,EAAE,EAAE,EAAI,iBAAmB,MAAM,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,EAAI,MAAQ,IAAI,KAAO,IAAM,OAAO,EAAE,EAAE,CAAC,EAAI,OAAO,IACtI,EACA,OAAO,YAAc,SAAU,EAAG,CAAE,IAAI,EAAI,OAAO,EAAG,EAAI,GAAK,EAAE,EAAI,WAAW,EAAG,CAAC,EAAI,KAAM,OAAO,GAAK,EAAE,EAAE,KAAO,IAAM,WAAa,YAAc,EACtJ,OAAO,cAAgB,UAAY,CAAE,IAAI,EAAI,OAAO,EAAG,OAAO,GAAK,EAAE,GAAK,MAAM,CAAC,EAAI,UAAU,QAAU,CAAG,EAG5G,SAAS,OAAO,EAAG,CACjB,IAAI,EAAI,EAAE,KAAM,GAAI,GAAC,GAAK,CAAC,EAAE,WAC7B,KAAI,GAAK,EAAE,eAAiB,EAAE,gBAAkB,CAAC,EAC5C,EAAE,SAAQ,EAAE,OAAS,CAAE,GAAI,EAAE,UAAU,SAAW,GAAM,IAAK,IAAI,GAAG,MAAM,CAAE,GACjF,IAAI,EAAI,MAAM,CAAC,EACf,EAAE,UAAU,MAAQ,UAAY,WAAW,EAC3C,EAAE,UAAU,OAAS,EAAE,OAAO,IAAO,GAAK,UAAU,QAAU,EAC9D,GAAG,OAAS,EAAE,OAAO,GAAK,EAAE,OAAO,IAAM,EAC3C,CAKA,SAAS,UAAU,EAAG,CACpB,IAAI,EAAI,EAAE,EAAG,IAAM,EAAE,OAAQ,EAAI,EAAE,MAAQ,EAAE,OAAS,CAAC,EAAG,IAAO,EAAE,QAAU,EAAE,SAAW,CAAC,EAAI,GAAM,IAAI,GAAG,EAAI,IAAI,GAAG,GAAK,CAAC,EAAI,IAAM,CAAC,EACpI,EAAI,EAAE,QAAU,EAAE,SAAW,CAAC,EAAG,EAAI,MAAM,CAAC,EAAG,GAAK,WAAW,EAAG,IAAM,EAAE,cAAgB,EAAE,eAAiB,CAAC,EAElH,GAAI,EAAG,CACL,IAAI,OAAS,SAAU,EAAG,CAAE,IAAI,GAAK,QAAQ,EAAG,CAAC,EAAG,MAAO,CAAC,CAAC,IAAM,OAAO,EAAG,CAAC,IAAM,KAAO,EAAE,EAAE,IAAM,UAAY,EAAE,EAAE,IAAM,OAAS,EACpI,GAAI,MAAQ,SAAU,CACpB,IAAI,GAAK,aAAa,CAAC,GAAK,MAAM,OAAO,KAAK,SAAU,EAAG,CAAE,OAAO,OAAO,EAAE,CAAC,CAAG,CAAC,EAAG,IAAM,IAAM,CAAC,EAAE,cAAgB,CAAC,QAAQ,CAAC,EAAI,SAAS,CAAC,EAAI,CAAC,EAC7I,IAAI,SACN,MAAM,OAAO,QAAQ,SAAU,EAAG,CAAM,OAAO,EAAE,CAAC,IAAG,EAAE,QAAQ,EAAG,EAAE,CAAC,CAAC,EAAI,WAAY,CAAC,EACvF,EAAE,UAAY,aAAa,GAAO,IAAK,QAAQ,EAAG,GAAK,IAErD,IAAM,CAAC,EAAE,cAAgB,EAAE,aAAe,CAAE,MAAO,EAAE,YAAc,EAAK,EAAG,EAAE,UAAY,IACpF,CAAC,IAAM,EAAE,eAAgB,EAAE,UAAY,EAAE,aAAa,MAAO,OAAO,EAAE,aACjF,SAAW,YAAY,CAAC,EAAG,CACzB,IAAI,GAAK,QAAQ,CAAC,EAAG,IAAM,CAAC,EAExB,KAAO,SAAU,EAAG,GAAI,CAC1B,IAAI,MAAQ,KAEZ,GADA,GAAG,QAAQ,SAAU,EAAG,CAAE,GAAI,SAAS,MAAM,EAAG,CAAC,GAAW,KAAI,EAAI,UAAU,EAAG,CAAC,EAAG,GAAK,EAAI,SAAS,EAAG,CAAC,EAAE,CAAC,CAAC,EAAI,CAAC,EAAO,GAAG,SAAQ,MAAQ,aAAa,MAAM,EAAG,CAAC,EAAG,GAAI,QAAQ,GAAG,CAAC,EACpL,MAAO,CAAE,EAAE,CAAC,EAAI,WAAY,EAAE,UAAY,MAAO,MAAQ,CAC7D,GAAG,QAAQ,SAAU,EAAG,CAAO,IAAI,CAAC,IAAG,IAAI,CAAC,EAAI,EAAG,CAAC,CACtD,EACA,UAAU,GAAG,EAAE,QAAQ,SAAU,EAAG,CAClC,IAAI,EAAI,UAAU,EAAG,CAAC,EAAG,GAAK,GAAK,QAAQ,EAAG,EAAE,CAAC,EAC7C,IAAM,CAAC,GAAG,EAAE,GAAK,OAAO,EAAE,CAAC,GAAG,KAAK,GAAI,CAAC,CAAC,CAAC,CAChD,CAAC,EACD,OAAO,KAAK,EAAE,EAAE,QAAQ,SAAU,EAAG,CACnC,GAAI,EAAE,CAAC,IAAM,SACb,KAAI,EAAI,KAAK,EAAG,CAAC,EACjB,GAAI,CAAC,OAAO,EAAG,CAAC,EAAG,CAAE,EAAE,CAAC,EAAI,WAAgB,IAAM,EAAE,IAAM,EAAE,OAAM,EAAE,UAAY,cAAc,CAAC,GAAG,MAAQ,CAC1G,KAAK,EAAG,EAAE,MAAM,EAClB,CAAC,EACD,UAAU,GAAG,EAAE,QAAQ,SAAU,EAAG,CAClC,IAAI,GAAK,QAAQ,EAAG,CAAC,EACrB,GAAI,WAAW,EAAG,CAAC,EAAG,CAAM,IAAI,YAAY,EAAG,EAAG,IAAI,EAAG,MAAQ,CAC7D,IAAI,CAAC,GAAK,CAAC,IAAM,YAAY,EAAG,EAAG,CAAE,MAAO,MAAM,EAAG,CAAC,EAAG,KAAM,IAAI,CAAC,CAAE,CAAC,EAAG,UAAU,EAAG,EAAG,EAAI,GACzF,IAAI,CAAC,GAAK,GAAG,OAAS,IAAI,CAAC,EAAG,GAAG,KAAO,IAAI,CAAC,EAC7C,CAAC,IAAI,CAAC,GAAK,KAAM,UAAU,EAAG,EAAG,GAAG,QAAU,EAAI,EAAG,YAAY,EAAG,EAAG,IAAI,EACtF,CAAC,CACH,CACF,CAmBA,GAlBA,MAAM,CAAC,EAAE,QAAQ,SAAU,EAAG,CAC5B,IAAI,GAAK,OAAO,EAAG,EAAE,CAAC,EAAG,GAAK,QAAQ,EAAG,EAAE,CAAC,EAAG,EAAI,GAAG,EAAE,CAAC,EAAO,KAAI,IAAI,EAAE,EAAI,GAAO,KAAI,IAAI,EAAE,EAAI,GAC/F,GAAK,IAAM,KAAO,IAAM,CAAC,QAAQ,EAAG,CAAC,IAAM,EAAE,EAAE,IAAM,UAAY,EAAE,EAAE,IAAM,UAAS,EAAE,EAAE,EAAI,YAChG,IAAI,GAAK,CAAC,EAAE,IAAM,IAAM,EAAE,EAAE,IAAM,SAAU,GAAK,CAAC,EAAE,IAAM,IAAM,EAAE,EAAE,IAAM,SAC1E,GAAI,IAAM,GAAI,CAAE,IAAI,MAAQ,IAAI,EAAE,CAAC,IAAM,GAAK,GAAK,GAAI,MAAQ,QAAU,GAAK,GAAK,GAAI,EAAE,KAAK,EAAI,WAAY,OAAO,EAAE,KAAK,EAAG,GAAK,QAAU,GAAI,GAAK,CAAC,EAAI,CAC5J,IAAI,GAAK,GAAK,UAAU,QAAU,EAAG,GAAK,IAAM,IAAM,EAAE,EAAE,IAAM,SAAU,GAAK,IAAM,IAAM,EAAE,EAAE,IAAM,SACrG,GAAI,IAAM,GAAI,CACZ,CAAC,GAAI,EAAE,EAAE,QAAQ,SAAU,EAAG,CAAM,GAAK,EAAE,CAAC,IAAM,UAAY,IAAG,EAAE,CAAC,EAAI,WAAY,CAAC,EACrF,IAAI,IAAM,EAAE,aAAe,CAAC,GAAG,EAAE,CAAC,EAAG,EAAI,MAAM,GAAK,KAAO,QAAW,GAAK,EAAE,IAAM,OAAS,EAAE,EAAI,UAAU,QAAU,CAAE,EACpH,EAAI,GAAK,GAAK,GAAI,IAAM,SAAS,SAAS,EAAG,CAAC,EAAG,CAAC,EACtD,EAAE,CAAC,EAAI,KAAK,IAAI,IAAI,IAAK,KAAK,IAAI,IAAI,IAAK,KAAK,MAAM,IAAI,EAAE,CAAC,CAAC,GAAK,IAAI,GAAG,CAAC,CAAC,EAC5E,GAAG,EAAE,CAAC,EAAI,CAAE,EAAG,OAAQ,EAAG,GAAK,EAAE,CAAC,EAAI,CAAC,EAAE,CAAC,EAAG,KAAM,EAAG,CAAK,CAC7D,MAAW,IAAM,IACf,EAAE,YAAc,KAAK,IAAI,KAAK,QAAQ,IAAK,KAAK,IAAI,KAAK,QAAQ,IAAK,KAAK,MAAM,SAAS,EAAG,CAAC,EAAI,CAAC,EAAG,KAAK,MAAM,IAAI,EAAE,WAAW,GAAK,KAAK,QAAQ,GAAG,CAAC,CAAC,EACzJ,GAAG,EAAE,CAAC,EAAI,CAAE,EAAG,UAAW,EAAG,EAAE,YAAa,MAAO,CAAC,GAAK,GAAK,KAAM,GAAK,GAAK,IAAI,EAAE,OAAO,OAAO,CAAE,GAC3F,IAAM,EAAE,IAAM,QAAU,EAAE,IAAM,WAAa,EAAE,IAAM,YAAY,OAAO,GAAG,EAAE,CAAC,CAC3F,CAAC,EAEG,CAAC,MAAM,CAAC,EAAE,SAAW,QAAQ,CAAC,GAAK,CAAC,GAAG,OAAQ,CACjD,IAAI,QAAU,CAAC,EACf,QAAQ,CAAC,EAAE,QAAQ,SAAU,EAAG,CAAE,IAAI,EAAI,GAAG,EAAE,CAAC,EAAO,GAAK,EAAE,IAAM,QAAU,EAAE,MAAQ,EAAE,EAAE,IAAI,IAAM,SAAW,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,MAAM,EAAE,EAAI,mBAAqB,sBAAqB,OAAS,EAAE,GAAG,CAAG,CAAC,EAC3M,QAAQ,SAAQ,EAAE,UAAY,sEAA+D,QAAQ,OAAO,GAAK,QAAQ,OAAS,EAAI,mBAAkB,kBAAiB,0DAC/K,CACA,IAAI,KAAO,CAAC,EACZ,OAAO,CAAC,EAAE,QAAQ,SAAU,EAAG,CAC7B,IAAI,GAAK,CAAC,OAAO,EAAG,EAAE,CAAC,EAAG,QAAQ,EAAG,EAAE,CAAC,CAAC,EAAE,OAAO,OAAO,EAAG,GAAG,QAAQ,SAAU,EAAG,CAAE,KAAK,CAAC,EAAI,CAAG,CAAC,EAChG,GAAG,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,CAAC,IAAM,QAAU,CAAC,IAAG,EAAE,YAAc,KAAK,IAAI,KAAK,QAAQ,IAAK,KAAK,IAAI,KAAK,QAAQ,IAAK,KAAK,MAAM,SAAS,EAAG,CAAC,EAAI,CAAC,EAAG,KAAK,MAAM,IAAI,EAAE,WAAW,GAAK,KAAK,QAAQ,GAAG,CAAC,CAAC,EACpN,CAAC,EACD,OAAO,KAAK,QAAQ,CAAC,CAAC,EAAE,QAAQ,SAAU,EAAG,CAC3C,GAAK,OAAO,EAAG,CAAC,IAAW,KAAK,CAAC,EAAI,EAAO,EAAE,CAAC,IAAM,UACrD,KAAI,GAAK,MAAM,CAAC,EAAG,EAAI,KAAK,IAAI,MAAM,KAAM,KAAK,EAAG,CAAC,EAAE,OAAO,IAAI,SAAU,EAAG,CAAE,IAAI,EAAI,IAAM,GAAG,OAAO,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,KAAO,CAAG,CAAC,EAAE,CAAC,EAAG,OAAO,EAAI,IAAI,EAAE,CAAC,EAAI,GAAK,CAAC,CAAC,EACtL,EAAE,YAAc,KAAK,IAAI,KAAK,QAAQ,IAAK,KAAK,IAAI,KAAK,QAAQ,IAAK,KAAK,MAAM,EAAI,CAAC,EAAG,KAAK,MAAM,IAAI,EAAE,WAAW,GAAK,KAAK,QAAQ,GAAG,CAAC,CAAC,EAC9I,CAAC,GACA,WAAW,GAAG,GAAK,CAAC,GAAG,QAAQ,SAAU,EAAG,CAAM,CAAC,IAAI,CAAC,IAAM,EAAE,CAAC,IAAM,SAAY,GAAK,EAAE,CAAC,IAAM,UAAY,CAAC,KAAK,CAAC,KAAO,EAAE,CAAC,EAAI,WAAY,OAAO,EAAE,CAAC,EAAK,CAAC,CACjK,CAIA,SAAS,YAAY,EAAG,CACtB,IAAI,EAAI,EAAE,EAAG,EAAI,EAAE,OAAS,CAAC,EAAG,EAAI,EAAE,MAAQ,CAAC,EAAG,IAAM,WAAW,EAAE,MAAM,GAAK,CAAC,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,CAAC,IAAM,OAAS,CAAC,EACpI,GAAI,CAAC,GAAG,QAAU,CAAC,EAAE,UAAW,OAAO,UAAY,CAAC,EACpD,IAAI,GAAK,EAAE,UAAW,GAAK,EAAE,eAAiB,EAAE,gBAAkB,CAAC,EAAG,IAAM,CAAE,EAAG,GAAG,MAAO,EAAG,GAAG,MAAO,EAAG,CAAC,CAAE,EAAG,KAAO,CAAC,EACrH,OAAS,WAAW,EAAE,MAAM,GAAK,CAAC,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,CAAC,IAAM,OAAS,CAAC,EAAE,OAC3F,EAAE,MAAQ,EAAE,OAAS,CAAC,EACtB,GAAG,QAAQ,SAAU,EAAG,CACtB,IAAI,EAAI,WAAW,EAAG,CAAC,EAAG,EAAI,GAAK,EAAE,EAAG,EAAI,IAAI,EAAE,SAAW,EAAE,QAAQ,CAAC,CAAC,GAAK,KAAK,QAAQ,IAAK,EAAI,EAAI,SAAS,EAAG,CAAC,EAAI,IACrH,GAAK,EAAE,IAAM,QAAU,CAAC,EAAE,IAAG,KAAK,CAAC,EAAI,GAC3C,IAAI,EAAE,CAAC,EAAI,EAAE,MAAM,CAAC,EAAG,EAAE,CAAC,EAAI,QAC9B,EAAE,MAAM,CAAC,EAAI,GAAK,EAAE,KAAO,IAAM,CAAE,GAAI,EAAG,GAAI,CAAE,EAAI,CAAE,GAAI,EAAG,GAAI,CAAE,CACrE,CAAC,EAID,GAAG,MAAQ,GAAU,MAAO,EAAE,mBAAqB,GAAG,OAAa,GAAG,MAAQ,EAC9E,IAAI,KAAO,EAAE,kBACb,OAAI,OAAO,MAAS,aAAY,EAAE,kBAAoB,SAAU,KAAM,OAAQ,IAAK,CAAE,GAAI,MAAK,GAAG,EAAW,OAAO,KAAK,MAAM,KAAM,SAAS,CAAG,GACzI,UAAY,CACjB,GAAG,QAAQ,SAAU,EAAG,CAAM,EAAE,CAAC,IAAM,UAAS,EAAE,CAAC,EAAI,SAAa,IAAI,EAAE,CAAC,EAAG,EAAE,MAAM,CAAC,EAAI,IAAI,EAAE,CAAC,EAAQ,OAAO,EAAE,MAAM,CAAC,CAAG,CAAC,EAC9H,GAAG,MAAQ,IAAI,EAAG,GAAG,MAAQ,IAAI,EAAG,EAAE,mBAAqB,EACvD,OAAO,MAAS,aAAY,EAAE,kBAAoB,KACxD,CACF,CAMA,IAAI,OAAS,CAAE,OAAQ,CAAC,CAAC,UAAW,YAAY,EAAG,CAAC,WAAY,aAAa,CAAC,EAAG,MAAO,CAAC,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,SAAU,QAAQ,CAAC,EAC7K,UAAW,CAAC,CAAC,UAAW,SAAS,EAAG,CAAC,UAAW,SAAS,CAAC,EAAG,UAAW,CAAC,CAAC,UAAW,SAAS,EAAG,CAAC,WAAY,UAAU,EAAG,CAAC,WAAY,UAAU,EAAG,CAAC,SAAU,QAAQ,EAAG,CAAC,YAAa,WAAW,EAAG,CAAC,YAAa,WAAW,CAAC,CAAE,EAGrO,SAAS,YAAY,EAAG,CACtB,IAAI,EAAI,EAAE,EAAG,EAAI,EAAE,OAAS,CAAC,EAAG,IAAM,CAAC,EAAG,OAAK,MAAM,CAAC,GACtD,MAAM,CAAC,EAAE,QAAQ,SAAU,EAAG,CACxB,EAAE,IAAM,YAAW,IAAI,EAAE,CAAC,EAAI,GAClC,IAAI,EAAI,OAAO,EAAG,EAAE,CAAC,EAAO,CAAC,GAAK,EAAE,IAAM,SACzC,OAAO,EAAE,MAAM,GAAK,CAAC,GAAG,QAAQ,SAAU,EAAG,CAAM,EAAE,QAAQ,CAAC,GAAK,GAAK,EAAE,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,CAAC,IAAM,MAAQ,CAAC,IAAG,IAAI,EAAE,CAAC,EAAI,EAAG,CAAC,CAC5I,CAAC,EACM,GACT,CACA,SAAS,YAAY,EAAG,CACtB,IAAI,EAAI,MAAM,CAAC,EAAG,GAAK,MAAM,CAAC,EAC9B,GAAI,CAAC,GAAK,CAAC,GAAG,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,MAAQ,CAAC,EAAG,OAAO,KACpE,IAAI,EAAI,EAAE,EAAG,EAAI,EAAE,OAAS,CAAC,EAAG,KAAO,CAAC,EAAG,KAAO,CAAC,EAmBnD,GAlBA,GAAG,QAAQ,SAAU,EAAG,CACtB,IAAI,EAAI,OAAO,EAAG,EAAE,CAAC,EAAG,GAAK,QAAQ,EAAG,EAAE,CAAC,EAI3C,GAJkD,EAAE,IAAM,SAAQ,KAAK,EAAE,CAAC,EAAI,GAG1E,KAAO,EAAE,EAAE,IAAM,SAAY,GAAK,EAAE,EAAE,IAAM,YAAY,KAAK,EAAE,EAAI,GACnE,CAAC,EAAG,CAAM,GAAK,EAAE,CAAC,IAAM,UAAS,KAAK,CAAC,EAAI,GAAG,MAAQ,CACrD,KACD,EAAE,CAAC,IAAM,SAAW,EAAE,CAAC,IAAM,YAAU,KAAK,CAAC,EAAI,IAEpD,OAAO,EAAE,MAAM,GAAK,CAAC,GAAG,QAAQ,SAAU,EAAG,CAAM,EAAE,QAAQ,CAAC,GAAK,GAAG,EAAE,QAAQ,SAAU,EAAG,CAAM,EAAE,CAAC,IAAM,SAAQ,KAAK,CAAC,EAAI,EAAG,CAAC,CAAG,CAAC,EACzI,CAAC,EAGG,GAAK,UAAU,EAAE,MAAM,GAAK,YAAY,CAAC,IAC3C,WAAW,CAAC,EAAE,QAAQ,SAAU,EAAG,CAAE,EAAE,MAAM,QAAQ,SAAU,EAAG,CAAE,KAAK,CAAC,EAAI,CAAG,CAAC,CAAG,CAAC,EACtF,QAAQ,CAAC,EAAE,QAAQ,SAAU,EAAG,CAAE,IAAI,EAAI,UAAU,EAAG,CAAC,EAAG,CAAC,SAAS,EAAG,CAAC,EAAG,GAAK,EAAE,CAAC,EAAE,QAAQ,SAAU,EAAG,CAAM,IAAG,KAAK,CAAC,EAAI,EAAG,CAAC,CAAG,CAAC,GAEpI,CAAC,OAAO,KAAK,IAAI,EAAE,SAClB,WAAW,EAAE,MAAM,GAAK,CAAC,GAAG,KAAK,SAAU,EAAG,CAAE,IAAI,EAAI,EAAE,CAAC,EAAG,OAAQ,IAAM,UAAY,IAAM,QAAU,IAAM,UAAY,CAAC,KAAK,CAAC,CAAG,CAAC,EAAG,OAAO,KACpJ,IAAI,IAAM,EAAE,OAAQ,IAAM,MAAQ,SAAW,UAAY,MAAQ,QAAU,SAAW,MAAQ,UAAY,KAAO,KAAM,GAAM,EAAE,MAAQ,EAAE,KAAK,eAAkB,CAAC,EAC7J,MAAQ,YAAY,CAAC,EACzB,MAAO,CAAE,KAAY,MAAc,OAAQ,SAAU,EAAG,CAAE,OAAO,IAAI,MAAQ,YAAY,KAAK,CAAC,EAAI,MAAQ,OAAS,CAAC,IAAM,EAAM,CAAE,CACrI,CAOA,SAAS,OAAO,EAAG,EAAG,CAAE,OAAQ,EAAE,EAAE,OAAS,OAAS,MAAQ,MAAQ,CAAG,CACzE,SAAS,SAAS,EAAG,EAAG,CAAE,IAAI,GAAK,EAAE,cAAgB,CAAC,GAAG,OAAO,EAAG,CAAC,CAAC,EAAG,MAAO,CAAC,CAAC,GAAK,CAAC,MAAM,EAAG,CAAC,CAAG,CACpG,SAAS,UAAU,EAAG,CACpB,GAAI,EAAE,EAAE,SAAW,WAAa,CAAC,SAAS,CAAC,EAAG,OAAO,KACrD,IAAI,IAAM,EAAE,gBAAiB,KAAO,EAAE,wBAAyB,KAAO,KAAMG,MAAO,KAAK,SAAS,EACjG,SAAE,WAAa,CAAC,EAAG,EAAE,aAAe,CAAC,EACrC,EAAE,wBAA0B,UAAY,CAAE,IAAI,GAAK,KAAK,MAAM,KAAM,SAAS,EAAG,YAAO,GAAW,EAAI,EACtG,EAAE,gBAAkB,SAAU,EAAG,EAAG,KAAM,QAAS,SAAU,OAAQ,CACnE,IAAI,EAAI,CAAC,EAAE,MAAM,KAAK,SAAS,EAC/B,OAAIA,MAAK,QAAQ,IAAI,GAAK,IACxB,EAAE,WAAW,IAAI,EAAI,CAAC,IAAI,CAAC,EAAG,IAAI,CAAC,CAAC,EAChC,SAAW,kBAAoB,SAAS,EAAG,IAAI,IAC7C,SAAW,MAAQ,KAAK,YAAY,KAAK,WAAW,YAAY,IAAI,EACxE,EAAE,CAAC,EAAI,GAAO,EAAE,CAAC,EAAI,GAAM,EAAE,CAAC,EAAI,OAC9B,EAAE,EAAE,cAAa,EAAE,EAAE,YAAY,IAAI,EAAI,IAC7C,EAAE,aAAa,IAAI,EAAI,IAG3B,KAAO,KACA,IAAI,MAAM,KAAM,CAAC,CAC1B,EACO,UAAY,CAAE,EAAE,gBAAkB,IAAK,EAAE,wBAA0B,IAAM,CAClF,CAGA,SAAS,YAAY,EAAG,CACtB,IAAI,IAAM,EAAE,WAAY,EAAI,EAAE,EAAG,GAAI,CAAC,KAAO,EAAE,SAAW,WAAa,OAAO,OAAO,UAAa,YAAc,OAAO,OAAO,YAAe,WAAY,MAAO,GAChK,OAAO,KAAK,EAAE,cAAgB,CAAC,CAAC,EAAE,QAAQ,SAAU,EAAG,CAAM,EAAE,cAAa,EAAE,YAAY,CAAC,EAAI,GAAO,CAAC,EACvG,IAAI,IAAM,EAAE,WAAa,CAAC,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,SAAS,EAAE,CAAC,GAAK,SAAS,EAAE,CAAC,CAAG,CAAC,EAAG,EAAI,OAAO,SAAS,OAAO,WAAW,CAAC,CAAC,EAAG,GAAI,CAAC,GAAG,QAAU,CAAC,GAAK,CAAC,EAAE,OAAQ,MAAO,GACnL,IAAI,EAAI,CAAC,KAAK,IAAI,MAAM,KAAM,GAAG,IAAI,SAAU,EAAG,CAAE,OAAO,IAAI,EAAE,CAAC,CAAG,CAAC,CAAC,EAAG,KAAK,IAAI,MAAM,KAAM,GAAG,IAAI,SAAU,EAAG,CAAE,OAAO,IAAI,EAAE,CAAC,CAAG,CAAC,CAAC,CAAC,EACrI,KAAO,SAAU,EAAG,EAAG,EAAG,CAC5B,IAAI,GAAK,EAAE,CAAC,EAAI,EAAE,CAAC,EAAG,GAAK,EAAE,CAAC,EAAI,EAAE,CAAC,EAAG,GAAK,GAAK,GAAK,GAAK,GAAI,EAAI,GAAK,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,EAAE,CAAC,EAAI,EAAE,CAAC,GAAK,IAAM,EAAE,CAAC,EAAI,EAAE,CAAC,GAAK,IAAM,EAAE,CAAC,EAAI,EACpJ,OAAO,KAAK,MAAM,EAAE,CAAC,EAAI,EAAE,CAAC,EAAI,EAAI,GAAI,EAAE,CAAC,EAAI,EAAE,CAAC,EAAI,EAAI,EAAE,CAC9D,EACI,EAAI,EAAE,aAAe,EAAE,cAAgB,CAAC,EAAG,QAAU,GACzD,cAAO,KAAK,GAAG,EAAE,QAAQ,SAAU,EAAG,CACpC,IAAI,EAAI,OAAO,EAAG,CAAC,EAAG,GAAI,GAAE,CAAC,EAC7B,KAAI,EAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAI,EAAE,CAAC,EAAG,IAAI,CAAC,EAAE,CAAC,EAAI,EAAE,CAAC,CAAC,EAAG,KAAO,KACrD,EAAE,OAAO,QAAQ,SAAU,EAAG,CAAE,EAAE,IAAI,QAAQ,SAAU,EAAG,EAAG,CAAE,IAAI,EAAI,KAAK,EAAG,EAAG,EAAE,KAAK,EAAI,GAAK,EAAE,IAAI,MAAM,CAAC,GAAO,CAAC,MAAQ,EAAI,KAAK,KAAG,KAAO,CAAE,EAAM,GAAI,EAAE,EAAG,EAAG,CAAC,CAAG,CAAC,EACvK,OACL,EAAE,CAAC,EAAI,KAAK,GACR,EAAE,aAAe,EAAE,YAAY,CAAC,GAAK,SAAS,EAAG,CAAC,IAAG,QAAU,KACrE,CAAC,EACM,OACT,CACA,SAAS,gBAAgB,EAAG,GAAI,CAC9B,IAAI,IAAM,EAAE,gBAAiB,KAAO,EAAE,wBAAyB,KAAO,KACtE,SAAE,wBAA0B,UAAY,CAAE,IAAI,GAAK,KAAK,MAAM,KAAM,SAAS,EAAG,YAAO,GAAW,EAAI,EACtG,EAAE,gBAAkB,SAAU,EAAG,EAAG,KAAM,QAAS,SAAU,OAAQ,CACnE,IAAI,EAAI,CAAC,EAAE,MAAM,KAAK,SAAS,EAC/B,OAAI,SAAW,QAAU,CAAC,GAAG,KAAK,IAAI,IAChC,GAAG,OAAO,IAAI,GAAK,GAAG,MAAM,IAAI,GAAK,EAAE,CAAC,EAAI,GAAM,EAAE,CAAC,EAAI,GAAM,EAAE,CAAC,EAAI,SAAU,EAAE,CAAC,EAAI,OAErF,SAAW,MAAQ,KAAK,YAAY,KAAK,WAAW,YAAY,IAAI,EACxE,EAAE,CAAC,EAAI,GAAO,EAAE,CAAC,EAAI,GAAO,EAAE,CAAC,EAAI,OAAQ,EAAE,CAAC,EAAI,KAC9C,EAAE,EAAE,cAAa,EAAE,EAAE,YAAY,IAAI,EAAI,KAC5C,GAAG,KAAO,GAAG,MAAQ,CAAC,GAAG,IAAI,EAAI,IAGtC,KAAO,KACA,IAAI,MAAM,KAAM,CAAC,CAC1B,EACO,UAAY,CAAE,EAAE,gBAAkB,IAAK,EAAE,wBAA0B,IAAM,CAClF,CAKA,IAAI,OAAS,KACb,SAAS,SAAS,EAAG,CACnB,IAAI,KAAO,SAAS,eAAe,WAAW,EAAG,GAAK,KACtD,KAAI,EAAI,EAAE,WAAY,EAAI,MAAM,CAAC,EAAG,GAAK,EAAI,WAAW,EAAG,CAAC,EAAI,KAAM,EAAI,IAAM,OAAO,EAAG,GAAG,CAAC,IAAM,EAAI,GAAK,KAAM,EAAI,EAAE,EAAE,OAAS,CAAC,EACjI,GAAK,KAAK,cAAc,6BAA6B,EAAG,GAAK,IAAM,GAAG,cAAc,MAAM,EAC1F,IAAM,QAAU,OAAM,OAAS,GAAG,aAClC,KAAI,GAAG,YAAc,EAAI,eAAiB,QAC9C,IAAI,KAAO,SAAU,GAAI,EAAG,CAAE,IAAI,EAAI,IAAM,GAAG,cAAc,WAAW,EAAO,IAAG,EAAE,YAAc,IAAM,KAAK,CAAC,EAAI,SAAK,EACnH,MAAQ,KAAK,cAAc,6DAA6D,EAAO,OAAS,MAAM,YAAY,MAAM,WAAW,YAAY,KAAK,EAChK,IAAI,GAAK,EAAI,WAAW,EAAG,CAAC,EAAI,KAAM,GAAK,GAAK,CAAC,IAAM,EAAI,UAAU,EAAG,CAAC,EAAI,KACzE,SAAW,CAAC,EAAE,GAAK,IAAM,GAAG,KAAO,GAAK,CAAC,QAAQ,EAAG,GAAG,CAAC,GAGxD,SAAW,CAAC,EAAE,GAAK,UAAY,GAAK,CAAC,IAAM,CAAC,IAC5C,GAAK,KAAK,cAAc,2BAA2B,EAAO,IAAI,GAAG,UAAU,OAAO,eAAgB,UAAY,QAAQ,EAG1H,CAAC,CAAC,QAAS,gBAAiB,MAAM,uBAAuB,EAAG,UAAU,OAAO,EAAG,CAAC,OAAQ,IAAI,KAAM,WAAW,KAAM,UAAU,IAAI,CAAC,EAAE,QAAQ,SAAU,EAAG,CACxJ,IAAI,GAAK,KAAK,cAAc,yBAA2B,EAAE,CAAC,EAAI,IAAI,EAMlE,GALI,CAAC,IAAM,EAAE,CAAC,EAAI,IAChB,GAAK,SAAS,cAAc,QAAQ,EAAG,GAAG,KAAO,SAAU,GAAG,UAAY,SAAU,GAAG,aAAa,YAAa,OAAO,EAAG,GAAG,aAAa,eAAgB,EAAE,CAAC,CAAC,EAC/J,GAAG,UAAY,EAAE,CAAC,EAAI,gDACtB,KAAK,aAAa,GAAI,KAAK,cAAc,4BAA4B,CAAC,GAEpE,EAAC,GACL,GAAI,IAAM,EAAE,CAAC,EAAI,EAAG,CAClB,IAAI,IAAM,EAAE,CAAC,IAAM,SAAW,GAAG,EAAE,IAAM,QAAW,GAAG,EAAE,KAAO,EAAE,CAAC,IAAM,SACzE,GAAG,MAAM,eAAe,SAAS,EACjC,GAAG,cAAc,MAAM,EAAE,YAAc,EAAE,CAAC,GAAK,IAAM,KAAO,EAAE,CAAC,IAAM,QAAU,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,EAAI,MAAQ,OAAO,GAAG,EAAE,CAAC,EAAI,QAAO,IACzI,KAAK,GAAI,EAAE,CAAC,CAAC,EAAG,GAAG,UAAU,OAAO,SAAU,GAAG,CACnD,MAAO,GAAG,MAAM,YAAY,UAAW,OAAQ,WAAW,CAC5D,CAAC,EAGD,IAAI,GAAK,CAAC,EAAE,GAAK,GAAK,YAAY,CAAC,GAAK,QAAQ,CAAC,EAAE,CAAC,GAChD,IAAM,KACH,GAAK,OAAO,EAAG,CAAC,EAAM,IAAM,CAAC,UAAa,KAAQ,UAAU,QAAU,GAAK,GAAG,MAAM,eAAe,SAAS,EAAG,KAAK,GAAI,UAAU,OAAO,GACzI,GAAG,MAAM,YAAY,UAAW,OAAQ,WAAW,GAE1D,IAAI,GAAK,IAAM,CAAC,OAAO,EAAG,CAAC,EAAI,KAAK,EAAG,CAAC,EAAI,KACxC,KAAO,GAAG,IAAM,GAAG,QAAY,CAAC,EAAE,YAAc,EAAE,WAAW,IAAM,GAAK,KAAK,IAAI,EAAI,EAAE,WAAW,EAAI,MAAM,UAAU,YAAY,EAAE,CAAC,EAAG,EAAE,WAAa,CAAE,EAAM,EAAG,KAAK,IAAI,CAAE,GACnL,CAEA,SAAS,QAAQ,EAAG,CAClB,IAAI,EAAI,EAAE,oBAAyB,OAAO,GAAM,YAAc,EAAE,QAChE,EAAE,oBAAsB,UAAY,CAAE,IAAI,EAAI,EAAE,MAAM,KAAM,SAAS,EAAG,GAAI,CAAE,SAAS,IAAI,CAAG,OAAS,EAAG,CAAE,QAAQ,KAAK,cAAe,CAAC,CAAG,CAAE,OAAO,CAAG,EACxJ,EAAE,oBAAoB,MAAQ,GAChC,CAGA,SAAS,WAAY,CACnB,IAAI,EAAI,SAAS,eAAe,oBAAoB,EAAG,GAAI,CAAC,EAAG,OAAO,KACtE,IAAI,GAAK,iBAAiB,CAAC,EAAG,GAAI,GAAG,UAAY,QAAU,GAAG,aAAe,SAAU,OAAO,KAC9F,IAAI,EAAI,EAAE,sBAAsB,EAAG,GAAK,SAAS,gBAAgB,aACjE,OAAO,EAAE,OAAS,GAAK,EAAE,IAAM,GAAK,EAAE,IAAM,IAAM,EAAE,QAAU,GAAK,EAAI,CAAE,IAAK,EAAE,IAAK,EAAG,IAAI,GAAG,MAAM,CAAE,EAAI,IAC7G,CAGA,SAAS,SAAU,CAAM,OAAO,OAAO,kBAAqB,YAAY,OAAO,iBAAiB,CAAG,CAEnG,SAAS,cAAc,MAAO,GAAI,GAAI,CACpC,MAAM,MAAM,UAAY,OAAQ,MAAM,UAAU,OAAO,QAAQ,EAC/D,IAAI,MAAQ,UAAY,CACtB,GAAI,OAAM,UAAU,SAAS,QAAQ,EACrC,KAAI,EAAI,GAAI,GAAK,SAAS,gBAAgB,YAAa,GAAK,MAAM,aAAe,IAAK,GAAK,MAAM,cAAgB,IAC7G,GAAK,UAAU,EAAG,OAAS,CAAC,CAAC,IAAM,GAAK,GAAG,IAAM,EAAI,EAAG,GAAK,IAAM,CAAC,OAAS,GAAG,IAAM,SAAS,gBAAgB,aAC/G,GAAK,GAAK,EAAG,GAAK,GAAK,EACvB,GAAK,GAAK,GAAK,IAAG,GAAK,GAAK,GAAK,GACjC,GAAK,GAAK,GAAK,IAAG,GAAK,GAAK,GAAK,GACrC,GAAK,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,GAAK,GAAK,CAAC,CAAC,EAAG,GAAK,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,GAAK,GAAK,CAAC,CAAC,EACvF,IAAI,KAAO,MAAM,aAAc,GAAK,KAAO,KAAK,sBAAsB,EAAI,KAC1E,MAAM,MAAM,KAAQ,IAAM,GAAK,GAAG,KAAO,GAAM,KAAM,MAAM,MAAM,IAAO,IAAM,GAAK,GAAG,IAAM,GAAM,KAClG,QAAQ,EACV,EACA,MAAM,EAAG,sBAAsB,KAAK,EAAG,WAAW,MAAO,GAAG,CAC9D,CAGA,SAAS,WAAW,MAAO,GAAI,CAC7B,MAAM,MAAM,UAAY,OAAQ,MAAM,UAAU,OAAO,QAAQ,EAC/D,IAAI,OAAS,GAGT,MAAQ,UAAY,CACtB,GAAI,GAAG,YAAa,OAAO,GAC3B,IAAI,GAAK,OAAO,EAAG,EAAI,IAAM,GAAG,KAAM,EAAI,GAAG,aAAa,WAAW,EAAG,EAAI,GAAG,aAAa,UAAU,EAClG,EAAI,IAAM,EAAI,EAAE,cAAc,6BAA+B,EAAI,IAAI,EAAI,EAAI,EAAE,cAAc,2BAA6B,EAAI,IAAI,EAAI,MAC1I,OAAI,IAAG,GAAK,GACL,EACT,EACI,MAAQ,UAAY,CACtB,GAAI,QAAM,UAAU,SAAS,QAAQ,GAAK,CAAC,MAAM,EAAE,aACnD,KAAI,EAAI,GAAI,GAAK,SAAS,gBAAgB,YAAa,GAAK,MAAM,aAAe,IAAK,GAAK,MAAM,cAAgB,IAC7G,GAAK,UAAU,EAAG,OAAS,CAAC,CAAC,IAAM,GAAK,GAAG,IAAM,EAAI,EAAG,GAAK,IAAM,CAAC,OAAS,GAAG,IAAM,SAAS,gBAAgB,aAC/G,EAAI,GAAG,sBAAsB,EAAG,GAAK,UAAY,CAAE,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,EAAE,KAAO,EAAE,MAAQ,EAAI,GAAK,EAAG,GAAK,GAAK,CAAC,CAAC,CAAG,EAAG,GAAK,UAAY,CAAE,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,EAAE,IAAM,EAAE,OAAS,EAAI,GAAK,EAAG,GAAK,GAAK,CAAC,CAAC,CAAG,EAC7N,IAAM,EAAE,OAAS,EAAI,IAAM,GAAK,EAAG,KAAO,EAAE,IAAM,EAAI,IAAM,EAAG,GAAK,EAAE,MAAQ,EAAI,IAAM,GAAK,GAAK,IAAM,GAAK,EAAI,EAAG,GAAK,EAAE,KAAO,EAAI,IAAM,GAAK,IAAM,GAAK,EAAI,EAChK,CAAC,KAAO,CAAC,MAAQ,CAAC,IAAM,CAAC,KACtB,SAAU,OAAS,GAAM,OAAO,SAAS,EAAG,EAAE,IAAM,EAAI,CAAC,EAAG,EAAI,GAAG,sBAAsB,GAC9F,IAAM,IAER,IAAI,GAAK,KAAO,KAAO,GAAG,EAAI,GAAK,EAAE,MAAQ,EAAI,EAAE,KAAO,EAAI,GAC1D,GAAK,IAAM,EAAE,OAAS,EAAI,KAAO,EAAE,IAAM,EAAI,GAAK,GAAG,EACzD,GAAK,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,GAAK,GAAK,CAAC,CAAC,EAC1C,IAAI,KAAO,MAAM,aAAc,GAAK,KAAO,KAAK,sBAAsB,EAAI,KAC1E,MAAM,MAAM,KAAQ,IAAM,GAAK,GAAG,KAAO,GAAM,KAAM,MAAM,MAAM,IAAO,IAAM,GAAK,GAAG,IAAM,GAAM,KAClG,QAAQ,EACV,EACA,MAAM,EAAG,sBAAsB,KAAK,EAAG,WAAW,MAAO,GAAG,EAAG,WAAW,MAAO,GAAG,EAAG,WAAW,MAAO,GAAG,CAC9G,CAMA,SAAS,YAAY,EAAG,EAAG,CACzB,IAAI,MAAQ,EAAE,WAAa,SAAS,eAAe,iBAAiB,EAAG,MAAQ,SAAS,eAAe,kBAAkB,EAAG,QAAU,SAAS,eAAe,oBAAoB,EAClL,GAAI,GAAC,OAAS,CAAC,OAAS,CAAC,SACzB,OAAM,YAAc,EAAE,MACtB,IAAI,GAAK,SAAS,cAAc,MAAM,EAAG,GAAG,UAAY,SAAU,GAAG,YAAc,EAAE,IAAK,MAAM,YAAY,EAAE,EAC9G,IAAI,EAAI,EAAE,OAAQ,GAAK,EAAE,SAAW,EAAG,EAAI,GAC3C,EAAE,QAAQ,SAAU,EAAG,CAAE,GAAK,eAAiB,EAAE,GAAK,YAAc,CAAC,EACrE,EAAE,QAAQ,SAAU,EAAG,CACrB,GAAK,yEAA2E,EAAE,GAAK,kFACvD,EAAE,GAAK,YAAc,EAAE,KAAO,GAAK,sFACZ,EAAE,GAAK,yDAChE,CAAC,EACD,EAAE,QAAQ,SAAU,EAAG,EAAG,CAAE,GAAK,2CAA6C,EAAI,YAAc,CAAC,EACjG,QAAQ,UAAY,sHACW,GAAK,aAAe,IAAM,KAAO,EAAI,0JAEpE,IAAI,KAAO,QAAQ,cAAc,mBAAmB,EAAG,KAAO,QAAQ,iBAAiB,sBAAsB,EAC7G,QAAQ,cAAc,aAAa,EAAE,YAAc,EAAE,OAAS,GAC9D,IAAI,KAAO,EAAE,IAAI,SAAU,EAAG,EAAG,CAC/B,IAAI,IAAM,QAAQ,cAAc,IAAM,EAAE,EAAE,EAAG,KAAO,QAAQ,cAAc,iBAAmB,CAAC,EAC9F,YAAK,CAAC,EAAE,YAAc,EAAE,MACxB,IAAI,WAAW,cAAc,MAAM,EAAE,YAAc,EAAE,MACrD,IAAI,IAAM,EAAE,IAAK,IAAI,IAAM,EAAE,IAAK,IAAI,MAAQ,EAAE,IAChD,KAAK,YAAc,EAAE,MAAS,MAAQ,OAAO,EAAE,GAAG,EAAI,SAAQ,OAAO,EAAE,GAAG,GAAK,EAAE,QAAU,OAAM,GAAK,KAAO,EAAE,MACxG,GACT,CAAC,EACG,KAAO,SAAU,IAAK,CAAE,IAAI,EAAI,OAAO,OAAO,IAAI,KAAK,EAAE,QAAQ,IAAK,GAAG,CAAC,EAAG,OAAO,SAAS,CAAC,GAAK,OAAO,IAAI,KAAK,EAAE,KAAK,IAAM,GAAK,EAAI,GAAK,EAC9I,KAAO,UAAY,CAAE,OAAO,KAAK,IAAI,IAAI,CAAG,EAC5CC,QAAS,UAAY,CAAE,IAAI,EAAI,KAAK,EAAO,EAAE,QAAU,EAAE,MAAM,QAAQ,IAAG,KAAK,UAAY,EAAE,OAAO,CAAC,EAAG,EACxG,OAAS,SAAU,EAAG,CACxB,EAAE,QAAQ,SAAU,EAAG,EAAG,CAAE,IAAI,GAAK,QAAQ,cAAc,iBAAmB,CAAC,EAAG,GAAG,YAAe,IAAM,GAAK,EAAK,EAAK,EAAE,MAAS,MAAQ,OAAO,EAAE,GAAG,EAAI,SAAQ,OAAO,EAAE,GAAG,GAAK,EAAE,QAAU,OAAM,GAAK,KAAO,EAAE,MAAS,GAAG,UAAU,OAAO,WAAY,IAAM,GAAK,CAAC,CAAC,CAAC,CAAG,CAAC,EAChR,KAAK,QAAQ,SAAU,IAAK,CAAE,IAAI,WAAW,UAAU,OAAO,WAAY,CAAC,CAAC,CAAC,CAAG,CAAC,CACnF,EACI,OAAS,SAAU,EAAG,CAAE,GAAI,EAAE,KAAM,CAAE,IAAI,EAAI,EAAE,KAAK,EAAG,KAAK,CAAC,EAAO,GAAG,EAAE,QAAQ,SAAU,EAAG,EAAG,CAAM,IAAM,GAAK,SAAS,CAAC,IAAG,KAAK,CAAC,EAAE,MAAQ,EAAG,CAAC,CAAG,CAAE,OAAO,EAAE,EAAGA,QAAO,CAAG,EAC/K,QAAU,UAAY,CACxB,IAAI,EAAI,KAAK,EAAG,IAAM,KAGtB,GAFA,EAAE,QAAQ,SAAU,EAAG,EAAG,CAAM,CAAC,KAAO,EAAE,EAAE,CAAC,GAAK,EAAE,KAAO,EAAE,CAAC,GAAK,EAAE,OAAM,IAAM,EAAE,MAAQ,SAAW,OAAO,EAAE,GAAG,EAAI,SAAQ,OAAO,EAAE,GAAG,GAAK,EAAE,QAAU,OAAM,GAAK,KAAO,EAAE,MAAO,CAAC,EACnL,CAAC,KAAO,EAAE,WAAU,IAAM,EAAE,SAAS,CAAC,GACtC,IAAK,CAAE,OAAO,GAAG,EAAG,KAAK,CAAC,EAAE,MAAM,EAAG,MAAQ,CACjD,EAAE,eAAe,EAAG,EAAE,GAAG,CAAC,EAAO,EAAE,QAAQ,EAAE,OAAO,CACtD,EACA,MAAM,UAAU,QAAQ,KAAK,QAAQ,iBAAiB,UAAU,EAAG,SAAU,EAAG,CAC9E,EAAE,iBAAiB,QAAS,UAAY,CACtC,IAAI,EAAI,EAAE,IAAI,SAAUC,GAAG,CAAE,OAAOA,GAAE,EAAI,CAAC,EAAE,QAAQ,EAAE,aAAa,UAAU,CAAC,EAAG,EAAI,EAAE,CAAC,EAAG,EAAI,KAAK,KAAK,CAAC,CAAC,EAC5G,KAAK,CAAC,EAAE,MAAQ,KAAK,MAAM,KAAK,IAAI,EAAE,IAAK,KAAK,IAAI,EAAE,KAAM,SAAS,CAAC,EAAI,EAAI,EAAE,KAAO,OAAO,EAAE,aAAa,WAAW,CAAC,GAAK,EAAE,KAAO,EAAE,CAAC,EAAI,EAAE,EAAI,GACpJ,OAAO,CAAC,CACV,CAAC,CACH,CAAC,EACD,KAAK,QAAQ,SAAU,IAAK,EAAG,CAC7B,IAAI,iBAAiB,QAAS,UAAY,CAAE,OAAO,CAAC,CAAG,CAAC,EACxD,IAAI,iBAAiB,UAAW,SAAU,EAAG,CAAM,EAAE,MAAQ,UAAW,EAAE,eAAe,EAAG,QAAQ,EAAK,CAAC,CAC5G,CAAC,EACD,QAAQ,cAAc,aAAa,EAAE,iBAAiB,QAAS,OAAO,EACtE,QAAQ,cAAc,cAAc,EAAE,iBAAiB,QAAS,UAAY,CAAE,EAAE,eAAe,EAAG,EAAE,MAAM,EAAO,EAAE,QAAQ,EAAE,OAAO,CAAG,CAAC,EACxID,QAAO,EACH,EAAE,GAAI,cAAc,MAAO,EAAE,GAAG,CAAC,EAAG,EAAE,GAAG,CAAC,CAAC,EACtC,EAAE,MAAM,WAAW,MAAO,EAAE,IAAI,EACzC,WAAW,UAAY,CAAE,GAAI,CAAE,KAAK,CAAC,EAAE,MAAM,CAAE,cAAe,CAAC,CAAC,EAAE,IAAK,CAAC,EAAG,KAAK,CAAC,EAAE,OAAO,CAAG,MAAY,CAAC,CAAE,EAAG,CAAC,EAClH,CAEA,IAAI,SAAW,gTAGf,SAAS,QAAQ,EAAG,CAClB,IAAI,EAAI,6BAA6B,KAAK,GAAK,EAAE,EAAG,GAAI,EAAG,MAAO,CAAE,EAAG,EAAE,CAAC,IAAM,QAAS,EAAG,EAAE,CAAC,IAAM,QAAS,EAC9G,IAAI,EAAI,OAAO,GAAK,EAAE,EAAE,MAAM,EAAE,EAAG,MAAO,CAAE,EAAG,EAAE,OAAO,CAAC,IAAM,IAAK,EAAG,EAAE,OAAO,CAAC,IAAM,GAAI,CAC7F,CAKA,SAAS,SAAS,EAAG,EAAG,MAAO,EAAG,GAAI,KAAM,CAC1C,IAAI,GAAM,KAAO,KAAO,QAAQ,CAAC,EAAE,EAAK,IAAM,EAC1C,GAAK,GAAK,GAAI,GAAK,IAAM,GAAI,GAAK,GAAI,GAAK,IAAK,EAAI,QAAQ,CAAC,EAAG,EAAI,KAAO,IAC3E,EAAI,EAAK,GAAK,GAAO,GAAK,GAAK,EAAI,GAAK,GAAK,KAAM,GAAK,KAAK,KAAK,EAAI,GAAK,GAAK,GAAK,IAAM,GAAI,KAAK,IAAI,EAAG,KAAK,IAAI,CAAC,EAAI,CAAC,CAAC,EAC3H,GAAK,EAAE,EAAI,GAAK,GAAI,GAAK,EAAE,EAAI,GAAK,GAAI,GAAK,EAAE,EAAI,GAAK,EAAG,GAAK,EAAE,EAAI,GAAK,EAC3E,GAAK,EAAI,CAAC,GAAI,GAAK,GAAK,EAAE,EAAI,CAAC,GAAK,GAAK,GAAI,EAAE,EAC/C,EAAI,EAAI,CAAC,EAAE,EAAI,GAAK,GAAI,EAAE,EAAI,CAAC,GAAI,EAAE,EAAI,GAAK,EAAE,EAChD,GAAK,CAAC,CAAC,GAAI,EAAE,EAAG,CAAC,GAAI,EAAE,EAAG,CAAC,GAAI,EAAE,EAAG,CAAC,GAAI,EAAE,CAAC,EAAG,GAAK,GAAG,UAAU,SAAUE,GAAG,CAAE,OAAOA,GAAE,CAAC,IAAM,IAAMA,GAAE,CAAC,IAAM,EAAI,CAAC,EACpH,IAAM,CAAC,EAAG,EAAG,IAAK,EAAI,EAAG,EAAI,EAAG,IAAK,CAAE,IAAI,EAAI,IAAI,GAAK,GAAK,CAAC,EAAG,IAAI,KAAK,IAAM,EAAI,GAAK,CAAC,CAAG,CAEjG,IAAI,EAAI,KAAO,IAAI,IAAI,SAAUA,GAAG,CAAE,OAAOA,GAAE,CAAC,EAAI,IAAMA,GAAE,CAAC,CAAG,CAAC,EAAE,KAAK,KAAK,EAAI,KAC7E,GAAK,EAAK,EAAE,EAAI,GAAK,GAAK,GAAK,GAAO,EAAE,EAAI,GAAK,GAAK,GAAK,GAAK,IAAM,GAAK,GAAK,GAAG,CAAC,GAAK,GAAK,GAAK,GAAG,CAAC,GAAK,EAC5G,KAAO,EAAI,4BAA8B,GAAK,SAAW,GAAK,SAAW,GAAK,SAAW,GAAK,+BAAiC,GAAK,SAAW,GAAG,CAAC,EAAI,SAAW,GAAK,SAAW,GAAG,CAAC,EAAI,+BAC5J,GAAK,SAAW,GAAK,SAAW,GAAK,SAAW,GAAG,CAAC,EAAI,uFACxD,EAAE,EAAI,GAAK,EAAI,GAAK,GAAK,SAAW,IAAM,GAAK,mBAAqB,EAAE,EAAI,QAAU,OAAS,KAAO,MAAM,KAAK,IAAI,CAAC,CAAC,EAAI,aACvJ,4BAA8B,GAAK,SAAW,GAAK,SAAW,GAAK,SAAW,GAAK,+BAAiC,GAAG,CAAC,EAAI,SAAW,GAAK,SAAW,GAAG,CAAC,EAAI,SAAW,GAAK,+BACjJ,GAAK,SAAW,GAAK,SAAW,GAAG,CAAC,EAAI,SAAW,GAAK,sFACzD,KAAK,IAAI,GAAK,GAAI,KAAK,IAAI,GAAK,GAAI,GAAG,CAAC,EAAI,SAAW,EAAE,EAAI,GAAK,GAAK,GAAK,GAAK,0BAA4B,MAAM,KAAK,IAAI,CAAC,CAAC,EAAI,aAC/J,GAAK,EAAE,GAAG,CAAC,EAAI,EAAE,CAAC,GAAK,GAAK,EAAI,EAAI,GAAK,KAAM,GAAG,CAAC,EAAI,EAAE,CAAC,GAAK,GAAK,EAAI,GAAK,GAAK,EAAE,EACpF,IAAM,EAAK,KAAO,EAAK,EAAE,EAAI,IAAM,IAAQ,EAAE,EAAI,IAAM,IAAS,KAAO,EAAK,EAAE,EAAI,IAAM,IAAQ,EAAE,EAAI,IAAM,IAC5G,OAAS,MAAQ,IAAM,4BAA+B,GAAK,IAAM,EAAK,SAAW,IAAM,EAAE,EAAI,GAAK,KAAO,oCACzG,MAAQ,IAAM,4BAA+B,GAAK,IAAM,EAAK,SAAW,IAAM,EAAE,EAAI,GAAK,KAAO,oCAChG,4BAA8B,MAAQ,IAAM,GAAK,EAAI,GAAK,GAAK,UAAY,GAAK,IAAM,GAAK,EAAI,EAAI,IAAM,mBAAqB,MAAQ,IAAM,MAAQ,SAAW,eACnK,MAAO,8FAA0F,OAAO,KAAK,EAAI,0BAAyB,MAAM,KAAK,IAAI,CAAC,CAAC,EAAI,SAAW,QAAQ,OAAO,EAAG,CAAC,GAAK,SAAW,EAAE,EAAI,MAAQ,QAAU,KAAO,EAAE,EAAI,QAAU,WAAa,KAAO,SAC9Q,6BAA+B,GAAK,QAAU,GAAK,aAAe,GAAK,IAAM,cAAgB,GAAK,IAAM,uCACzE,EAAI,MAAQ,KAC3C,2BAA6B,GAAG,CAAC,EAAI,QAAU,GAAG,CAAC,EAAI,mBAAqB,EAAI,SAAY,EAAE,EAAI,MAAQ,SAAY,KAAO,OAAO,KAAK,EAAI,cAAa,OAAS,QACvK,CACA,SAAS,WAAW,EAAG,EAAG,EAAG,CAM3B,QALI,GAAK,GAAI,GAAK,IAAK,GAAK,GAAI,GAAK,IAAK,EAAI,QAAQ,CAAC,EAAG,GAAK,GAAK,KAAO,GAAK,KAAM,GAAK,KAAK,KAAK,GAAK,IAAM,EAAG,KAAK,IAAI,EAAG,EAAI,CAAC,CAAC,EACjI,GAAK,EAAE,EAAI,GAAK,GAAI,GAAK,EAAE,EAAI,GAAK,GAAI,GAAK,EAAE,EAAI,GAAK,EAAG,GAAK,EAAE,EAAI,GAAK,EAAG,GAAK,CAAC,GAAK,GAAK,GAAI,EAAE,EAAG,GAAK,CAAC,GAAI,GAAK,GAAK,EAAE,EAC7H,GAAK,CAAC,CAAC,GAAI,EAAE,EAAG,CAAC,GAAI,EAAE,EAAG,CAAC,GAAI,EAAE,EAAG,CAAC,GAAI,EAAE,CAAC,EAAG,GAAK,GAAG,UAAU,SAAU,EAAG,CAAE,OAAO,EAAE,CAAC,IAAM,IAAM,EAAE,CAAC,IAAM,EAAI,CAAC,EACpH,IAAM,IAAI,GAAK,GAAK,CAAC,EAAG,MAAS,IAAI,CAAC,IAAM,GAAM,GAAK,GAAI,KAAO,QAAU,GAAK,GAAK,GACtF,EAAI,KAAO,MAAM,CAAC,EAAI,IAAM,MAAM,CAAC,EAC9B,EAAI,EAAG,EAAI,EAAG,IAAK,GAAK,MAAQ,IAAI,GAAK,GAAK,CAAC,EAAE,CAAC,EAAI,IAAM,IAAI,GAAK,GAAK,CAAC,EAAE,CAAC,EACvF,GAAK,MAAQ,KAAK,CAAC,EAAI,IAAM,KAAK,CAAC,EAAI,MAAQ,GAAK,IAAM,GAAK,UAAY,MAAM,CAAC,EAAI,IAAM,MAAM,CAAC,EAAI,KACvG,IAAI,IAAM,KAAO,KAAK,CAAC,EAAI,IAAM,KAAK,CAAC,EAAI,MAAQ,GAAK,IAAM,GAAK,UAAY,MAAM,CAAC,EAAI,IAAM,MAAM,CAAC,EACnG,GAAK,GAAK,IAAM,GAAK,IAAK,GAAK,GAAK,IAAM,GAAK,GAAK,EACxD,MAAO,6FAA+F,MAAM,CAAC,EAAI,SAAW,QAAQ,OAAO,EAAG,CAAC,GAAK,SAAW,EAAE,EAAI,MAAQ,QAAU,KAAO,EAAE,EAAI,QAAU,WAAa,KAAO,SAChO,6BAA+B,GAAK,QAAU,GAAK,aAAe,GAAK,IAAM,cAAgB,GAAK,IAAM,uCACzE,EAAI,8BAAqC,IAAM,8BACjD,GAAK,QAAU,GAAK,4BAA8B,MAAM,CAAC,EAAI,kBAC9F,CAGA,SAAS,YAAY,EAAG,IAAK,EAAG,EAAG,KAAM,KAAM,IAAK,CAClD,IAAI,EAAI,IAAI,MAAQ,KAAK,CAAC,EAAG,EAAI,IAAI,MAAQ,KAAK,CAAC,EAAG,EAAI,SAAS,EAAG,CAAC,EACvE,GAAI,IAAM,QAAS,CACjB,IAAI,KAAO,CAAC,EAAE,KAAO,IAAI,MAAO,KAAO,KAAO,IAAI,KAC9C,GAAK,KAAO,QAAU,EAAE,EAAE,aAAe,CAAC,GAAG,EAAE,CAAC,IAAM,EAAE,IAAM,OAAU,EAAE,EAAI,QAAU,OAAU,SAAU,EAAI,MAAM,KAAO,OAAO,EACpI,EAAI,SAAU,EAAG,CAAE,OAAO,KAAK,MAAM,UAAU,EAAG,KAAO,CAAC,EAAI,EAAE,EAAI,EAAI,EAAG,IAAM,KAAO,EAAI,IAAI,EAAE,EAAE,SAAW,EAAE,EAAE,QAAQ,GAAG,CAAC,EAC/H,MAAQ,KAAO,UAAY,CAAC,EAAI,UAAY,CAAM,EAAE,cAAe,EAAE,cAAc,GAAG,EAAQ,EAAE,EAAE,MAAM,GAAG,EAAI,WAAgB,EAAE,EAAE,SAAS,OAAO,EAAE,EAAE,QAAQ,GAAG,EAAG,EAAE,OAAO,CAAG,EACjL,KAAO,SAAU,EAAG,CAAE,EAAE,EAAE,QAAU,EAAE,EAAE,SAAW,CAAC,EAAG,EAAE,EAAE,QAAQ,GAAG,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,CAAC,CAAC,GAAI,EAAE,EAAE,cAAgB,EAAE,EAAE,eAAiB,CAAC,GAAG,EAAE,CAAC,EAAI,KAAM,EAAE,EAAE,YAAc,EAAE,EAAE,aAAe,CAAC,GAAG,EAAE,CAAC,EAAI,EAAI,QAAU,OAAQ,EAAE,OAAO,CAAG,EACvP,GAAI,EAAG,CACL,IAAI,GAAK,KAAK,QAAQ,IAAK,GAAK,KAAK,QAAQ,IAAK,KAAO,EAAE,KAAO,IAAM,EAAI,EACxE,KAAO,IAAG,GAAK,KAAK,IAAI,GAAI,KAAK,IAAI,GAAI,KAAK,MAAM,KAAO,EAAE,CAAC,CAAC,GACnE,YAAY,EAAG,CAAE,MAAO,IAAI,EAAE,GAAG,EAAG,IAAK,uBAAsB,KAAK,UAAU,OAAO,EAAI,SACvF,MAAO,YAAc,KAAO,EAAI,cAAiB,oBAAoB,uCAAgC,MAAM,CAAC,EAAI,MAChH,OAAQ,CAAC,CAAE,GAAI,YAAa,MAAO,UAAW,MAAO,KAAM,IAAK,GAAI,IAAK,GAAI,IAAK,KAAK,IAAI,GAAI,KAAK,IAAI,GAAI,KAAK,MAAM,KAAO,KAAK,QAAQ,GAAG,CAAC,CAAC,EAAG,IAAK,CAAE,CAAC,EAC3J,OAAQ,SAAU,EAAG,CAAE,OAAO,SAAS,EAAG,KAAK,MAAM,EAAE,CAAC,CAAC,EAAG,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAG,IAAK,EAAE,GAAI,IAAI,CAAG,EACnG,GAAI,SAAU,EAAG,CAAE,KAAK,EAAE,CAAC,CAAC,CAAG,EAAG,MAAc,KAAY,OAAQ,KAAO,IAAI,MAAO,CAAC,EACzF,MACF,CAEA,IAAI,KAAO,KAAO,EAAI,KAAK,KAAK,IAAM,GAAI,KAAO,KAAO,EAAI,GAAK,KAAK,KAAK,IACvE,GAAK,IAAM,EAAE,GAAG,EAAK,KAAO,EAAI,KAAK,KAAK,IAAM,IAAM,KAAK,KAAK,IACpE,YAAY,EAAG,CAAE,MAAO,IAAI,EAAE,GAAG,EAAG,IAAK,yBAAqB,KAAK,UAAU,IAAI,EAAI,SACnF,MAAO,mCAAkC,KAAO,EAAI,iBAAoB,uBAAuB,oBAAmB,MAAM,CAAC,EAAI,MAC7H,OAAQ,CAAC,CAAE,GAAI,YAAa,MAAO,QAAS,MAAO,OAAK,IAAK,KAAM,IAAK,KAAM,IAAK,KAAK,IAAI,KAAM,KAAK,IAAI,KAAM,EAAE,CAAC,EAAG,IAAK,EAAI,CAAC,EACjI,OAAQ,SAAU,EAAG,CAAE,OAAO,SAAS,EAAG,YAAY,EAAG,EAAE,CAAC,CAAC,EAAG,EAAE,CAAC,EAAG,IAAK,EAAE,GAAI,IAAI,CAAG,EACxF,GAAI,SAAU,EAAG,CACf,GAAI,CAAC,KAAM,CAAE,KAAK,KAAK,IAAI,YAAY,EAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAG,MAAQ,CAC3D,IAAI,IAAM,UAAU,EAAG,IAAK,EAAE,CAAC,CAAC,EAAO,KAAK,UAAU,GAAG,CAC3D,EAAG,MAAc,KAAY,OAAQ,KAAO,IAAI,MAAO,CAAC,EAC1D,MACF,CACA,IAAI,GAAK,KAAK,QAAS,KAAO,KAAK,MAAM,KAAK,IAAI,GAAK,IAAU,GAAK,IAAU,CAAC,EAAI,CAAC,EAClF,IAAM,KAAK,IAAI,GAAG,IAAK,KAAK,IAAI,GAAG,IAAK,SAAS,IAAI,GAAK,KAAO,EAAI,KAAO,GAAG,GAAG,CAAC,EAAG,GAAK,KAAK,IAAI,GAAG,IAAK,KAAK,IAAI,IAAK,IAAI,EAAE,EAAE,WAAW,GAAK,GAAG,GAAG,CAAC,EAC7J,YAAY,EAAG,CAAE,MAAO,IAAI,EAAE,GAAG,EAAG,IAAK,sBAAqB,KAAK,UAAU,OAAO,EAAI,SAAK,OAAQ,OAAS,GAAK,kBAAiB,cAAgB,oBAAmB,MAAM,CAAC,EAAI,MAChL,OAAQ,CAAC,CAAE,GAAI,YAAa,MAAO,QAAS,MAAO,KAAM,IAAK,GAAG,IAAK,IAAU,IAAK,GAAI,IAAK,CAAE,CAAC,EACjG,OAAQ,SAAU,EAAG,CAAE,OAAO,WAAW,EAAG,KAAK,MAAM,EAAE,CAAC,CAAC,EAAG,GAAG,CAAG,EACpE,GAAI,SAAU,EAAG,CAAE,EAAE,EAAE,YAAc,KAAK,MAAM,EAAE,CAAC,CAAC,EAAG,EAAE,OAAO,CAAG,EACnE,MAAO,UAAY,CAAM,EAAE,cAAe,EAAE,cAAc,GAAG,EAAQ,EAAE,EAAE,MAAM,GAAG,EAAI,WAAY,EAAE,OAAO,CAAG,CAAE,CAAC,CACrH,CAOA,OAAO,WAAa,SAAU,EAAG,CAC/B,GAAI,CAAC,GAAK,CAAC,EAAE,EAAG,OAAO,KACvB,UAAU,CAAC,EAGX,IAAI,EAAI,EAAE,EAAE,SAAW,WAAa,SAAS,CAAC,GAAK,OAAO,CAAC,GAAK,KAChE,OAAO,UAAY,YAAY,EAAE,EAAE,MAAM,GAAK,GAAK,CAAE,GAAI,MAAO,GAAI,SAAW,CAAE,EAAI,IACvF,EACA,OAAO,aAAe,SAAU,EAAG,EAAG,EAAG,CACvC,OAAK,IAAM,UAAY,IAAM,QAAW,CAAC,GAAK,CAAC,EAAE,GAAK,CAAC,EAAE,mBAAqB,CAAC,MAAM,CAAC,EAAU,KACzF,UAAU,EAAG,EAAG,CAAC,GAAK,IAC/B,EAEA,OAAO,iBAAmB,SAAU,EAAG,EAAG,EAAG,CAC3C,GAAI,CAAC,OAAO,aAAa,EAAG,EAAG,CAAC,EAAG,OAAO,KAC1C,IAAI,EAAI,eAAe,EAAG,CAAC,EAAG,OAAO,EAAI,mBAAsB,UAAU,EAAE,EAAG,EAAI,EAAI,IACxF,EACA,OAAO,iBAAiB,QAAS,SAAU,EAAG,CAC5C,IAAI,EAAI,EAAE,QAAU,EAAE,OAAO,SAAW,EAAE,OAAO,QAAQ,8EAA8E,EAAG,GAAK,EAC/I,KAAI,EAAI,OAAO,EAAG,IAAM,GAAK,OAAO,aAAa,EAAG,EAAE,WAAY,EAAE,aAAa,WAAW,CAAC,EAAQ,MACrG,EAAE,eAAe,EAAG,EAAE,gBAAgB,EAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAChG,EAAE,WAAW,EAAE,UAAU,EAC7B,UAAU,GAAG,GACf,EAAG,EAAI,EAWP,SAAS,SAAS,EAAG,EAAG,CACtB,IAAI,EAAI,KAAM,MAAI,CAAC,GAAK,CAAC,WACxB,QAAQ,CAAC,GAAK,CAAC,GAAG,OAAO,QAAQ,CAAC,CAAC,EAAE,QAAQ,SAAU,EAAG,CACrD,CAAC,GAAK,OAAO,EAAG,EAAE,CAAC,IAAM,EAAG,EAAI,CAAE,EAAM,KAAM,CAAE,EAAY,CAAC,GAAK,QAAQ,EAAG,EAAE,CAAC,IAAM,IAAG,EAAI,CAAE,EAAM,KAAM,EAAG,EACpH,CAAC,EACM,CACT,CACA,SAAS,WAAW,EAAG,GAAI,CACzB,IAAI,EAAI,EAAE,EAAG,EAAI,UAAU,EAAE,MAAM,GAAK,IAAM,GAAG,EAAI,YAAY,EAAG,GAAG,EAAE,CAAC,EAAI,KAC9E,GAAI,GAAK,MAAM,EAAG,CAAC,EAAG,CACpB,IAAI,EAAI,MAAM,EAAG,CAAC,EAAG,GAAK,QAAQ,EAAG,CAAC,EAAG,GAAK,IAAM,GAAG,MAAQ,QAAQ,CAAC,EAAE,GAAG,IAAI,EACjF,OAAQ,MAAM,CAAC,EAAI,OAAS,OAAS,EAAI,IAAM,OAAO,CAAC,EAAI,oEAA6D,GAAK,oCAAuC,GAAK,MAAQ,MAAM,EAAG,GAAG,IAAI,EAAI,sBAAqB,KAAK,CAAC,GAAK,IACjO,2CAAwC,KAAK,CAAC,EAAI,IACxD,CACA,OAAI,EAAE,aAAqB,kIACvB,EAAE,SAAW,UAAY,aAAa,CAAC,GAAK,EAAE,YAAc,GAAa,uHACtE,4GACT,CACA,SAAS,UAAU,EAAG,EAAG,KAAM,CAC7B,IAAI,EAAI,EAAE,EAAG,GAAK,SAAS,EAAG,CAAC,EAAG,GAAI,CAAC,GAAI,MAAO,uCAClD,IAAI,EAAI,OAAO,OAAO,IAAI,EAAE,QAAQ,IAAK,GAAG,EAAE,QAAQ,OAAK,EAAE,EAAE,KAAK,CAAC,EAAG,GAAI,CAAC,SAAS,CAAC,EAAG,MAAO,uDACjG,EAAI,KAAK,MAAM,EAAI,EAAE,EAAI,GACzB,IAAI,GAAK,WAAW,EAAG,CAAC,EAAG,EAAI,EAAE,MAAQ,EAAE,OAAS,CAAC,EAAG,EAAI,EAAE,QAAU,EAAE,SAAW,CAAC,EACtF,GAAI,IAAM,GACR,OAAI,EAAE,CAAC,IAAM,UAAW,EAAE,CAAC,EAAI,WAAY,OAAO,EAAE,CAAC,EAAG,EAAE,OAAO,GAC1D,KAET,GAAI,CAAC,GAAI,OAAO,WAAW,EAAG,EAAE,EAChC,IAAI,GAAK,GAAG,KAAO,EAAI,KAAK,KAAK,IAAM,GAAI,GAAK,GAAG,KAAO,EAAI,GAAK,KAAK,KAAK,IAC7E,GAAI,EAAE,UAAU,KAAO,GAAI,MAAO,wDAClC,GAAI,EAAI,IAAM,EAAI,GAAI,MAAO,aAAe,GAAG,KAAO,EAAI,aAAe,mBAAkB,SAAW,OAAO,EAAE,EAAI,SAAQ,OAAO,EAAE,EAAI,4BACxI,IAAI,EAAI,GAAG,EAAG,EAAI,SAAS,EAAG,CAAC,EAAG,EAAI,MAAM,CAAC,EAC7C,OAAC,OAAO,EAAG,EAAE,CAAC,EAAG,QAAQ,EAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,SAAU,EAAG,CACjD,CAAC,GAAK,IAAM,IACZ,EAAE,CAAC,IAAM,UAAW,EAAE,CAAC,EAAI,WAAY,OAAO,EAAE,CAAC,GACjD,EAAE,CAAC,IAAM,UAAY,IAAG,EAAE,CAAC,EAAI,YACrC,CAAC,EACD,EAAE,CAAC,EAAI,SAAU,EAAE,YAAc,EAAE,aAAe,CAAC,GAAG,EAAE,CAAC,EAAI,QAAS,EAAE,cAAgB,EAAE,eAAiB,CAAC,GAAG,EAAE,CAAC,EAAI,EACtH,EAAE,CAAC,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,YAAY,EAAG,CAAC,CAAC,CAAC,EAC9C,EAAE,OAAO,EACF,IACT,CACA,IAAI,WAAa,uqBAejB,SAAS,gBAAgB,EAAG,UAAW,CACrC,IAAI,EAAI,CAAC,EAAG,GAAK,GAAO,MAAQ,SAAU,EAAG,EAAG,IAAK,EAAG,MAAO,CAAE,EAAI,GAAK,EAAG,EAAE,KAAK,CAAE,KAAM,EAAE,KAAO,EAAG,MAAO,EAAE,MAAQ,EAAG,IAAK,EAAE,IAAM,EAAG,OAAQ,EAAE,OAAS,EAAG,MAAO,EAAG,IAAK,CAAC,CAAC,IAAK,GAAQ,MAAO,CAAC,CAAC,KAAM,CAAC,CAAG,EAC/M,MAAQ,SAAU,GAAI,EAAG,IAAK,EAAG,MAAO,CAAE,IAAI,EAAI,GAAG,sBAAsB,EAAO,EAAE,MAAQ,GAAK,EAAE,OAAS,GAAK,EAAE,MAAQ,KAAO,EAAE,OAAS,KAAK,MAAM,EAAG,GAAK,GAAI,IAAK,EAAG,KAAK,CAAG,EACpL,IAAM,CAAC,EAEX,MAAM,UAAU,QAAQ,KAAK,EAAE,KAAK,iBAAiB,iGAAiG,EAAG,SAAU,GAAI,CAAE,IAAI,KAAK,EAAE,EAAO,iBAAiB,EAAE,EAAE,UAAY,QAAQ,MAAM,GAAI,GAAI,GAAM,GAAG,QAAQ,0BAA0B,EAAI,EAAI,EAAG,EAAI,CAAG,CAAC,EAChT,GAAK,GAGL,MAAM,UAAU,QAAQ,KAAK,EAAE,KAAK,iBAAiB,yBAAyB,EAAG,SAAU,GAAI,CAAM,iBAAiB,EAAE,EAAE,UAAY,QAAQ,MAAM,GAAI,GAAI,GAAM,CAAC,CAAG,CAAC,EACvK,IAAI,MAAQ,CAAC,EAAE,OAAO,YAAc,OAAO,WAAW,mBAAmB,EAAE,SAC3E,aAAM,UAAU,QAAQ,KAAK,EAAE,KAAK,iBAAiB,sCAAsC,EAAG,SAAU,GAAI,CAAE,IAAI,EAAI,MAAQ,QAAQ,GAAG,sBAAsB,EAAG,UAAU,EAAE,CAAC,EAAI,GAAG,sBAAsB,EAAO,EAAE,MAAQ,EAAE,MAAQ,EAAE,OAAS,EAAE,KAAO,iBAAiB,EAAE,EAAE,UAAY,QAAQ,MAAM,EAAG,GAAI,EAAI,CAAG,CAAC,EACzT,MAAM,UAAU,QAAQ,KAAK,EAAE,KAAK,iBAAiB,yBAAyB,EAAG,SAAU,GAAI,CAC7F,IAAI,KAAK,EAAE,EAAG,IAAI,EAAI,GAAG,sBAAsB,EAAO,EAAE,MAAQ,GAAK,EAAE,OAAS,GAAK,iBAAiB,EAAE,EAAE,UAAY,QAAQ,MAAM,EAAG,GAAI,EAAI,CACjJ,CAAC,EACD,MAAM,UAAU,QAAQ,KAAK,EAAE,KAAK,iBAAiB,GAAG,EAAG,SAAU,GAAI,CACvE,GAAI,KAAG,SAAS,QAAU,IAAI,QAAQ,EAAE,GAAK,GAAK,CAAC,KAAK,KAAK,GAAG,aAAe,EAAE,GAAK,GAAG,QAAQ,sDAAsD,GAAK,IAAI,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,SAAS,EAAE,CAAG,CAAC,GAC5M,KAAI,EAAI,GAAG,sBAAsB,EAAG,GAAK,iBAAiB,EAAE,EAAO,EAAE,MAAQ,GAAK,EAAE,OAAS,GAAK,GAAG,UAAY,QAAU,GAAG,aAAe,UAAU,MAAM,EAAG,GAAI,EAAI,EAC1K,CAAC,EACD,MAAM,UAAU,QAAQ,KAAK,EAAE,KAAK,iBAAiB,mEAAmE,EAAG,SAAU,GAAI,CACvI,IAAI,EAAI,GAAG,sBAAsB,EAAG,GAAK,iBAAiB,EAAE,EAAG,GAAK,WAAW,GAAG,cAAc,GAAK,EAAG,GAAK,WAAW,GAAG,eAAe,GAAK,EAC3I,GAAG,UAAY,QAAW,CAAC,EAAE,OAAS,CAAC,EAAE,SACzC,IAAI,MAAM,CAAE,KAAM,EAAE,KAAM,MAAO,EAAE,MAAO,IAAK,EAAE,IAAK,OAAQ,EAAE,IAAM,EAAG,EAAG,CAAC,EAC7E,IAAI,MAAM,CAAE,KAAM,EAAE,KAAM,MAAO,EAAE,KAAO,GAAI,IAAK,EAAE,IAAK,OAAQ,EAAE,MAAO,EAAG,CAAC,EAC/E,CAAC,IAAM,CAAC,IAAI,MAAM,EAAG,CAAC,EAC5B,CAAC,EACD,MAAM,UAAU,QAAQ,KAAK,EAAE,IAAI,iBAAiB,MAAM,EAAG,SAAU,EAAG,CAAE,IAAI,GAAK,EAAE,aAAe,IAAI,KAAK,EAAO,CAAC,EAAE,QAAQ,sBAAsB,GAAK,GAAK,EAAE,WAAa,EAAE,UAAU,SAAS,iBAAiB,IAAI,MAAM,EAAG,KAAK,KAAK,CAAC,EAAI,GAAK,GAAI,KAAK,KAAK,CAAC,CAAC,CAAG,CAAC,EAC3Q,MAAM,UAAU,QAAQ,KAAK,EAAE,IAAI,iBAAiB,UAAU,EAAG,SAAU,EAAG,CAAE,IAAI,EAAI,EAAE,sBAAsB,EAAO,EAAE,MAAQ,GAAK,EAAE,OAAS,GAAG,MAAM,EAAG,GAAI,EAAI,CAAG,CAAC,EACzK,GAAK,GAGD,OAAO,YAAc,OAAO,WAAW,mBAAmB,EAAE,SAAS,MAAM,UAAU,QAAQ,KAAK,EAAE,KAAK,iBAAiB,kCAAkC,EAAG,SAAU,EAAG,CAAE,MAAM,EAAG,GAAI,GAAM,EAAG,EAAI,CAAG,CAAC,EACzM,CACT,CAGA,IAAI,aAAe,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAC5C,SAAS,UAAU,EAAG,CACpB,IAAI,GAAK,iBAAiB,EAAG,UAAU,EAAG,GAAI,GAAG,UAAY,QAAU,GAAG,WAAa,WAAY,OAAO,aAC1G,IAAI,EAAI,WAAW,GAAG,GAAG,GAAK,EAAG,EAAI,WAAW,GAAG,KAAK,GAAK,EAAG,EAAI,WAAW,GAAG,MAAM,GAAK,EAAG,EAAI,WAAW,GAAG,IAAI,GAAK,EAC3H,OAAO,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,EAAI,EAAI,EAAE,aAAe,EAAI,EAAI,EAAE,aAAe,CAAE,EAAM,EAAM,EAAM,CAAK,EAAI,YAChI,CACA,SAAS,QAAQ,EAAG,GAAI,CAAE,OAAO,KAAO,GAAG,GAAK,GAAG,GAAK,GAAG,GAAK,GAAG,GAAK,CAAE,KAAM,EAAE,KAAO,GAAG,EAAG,MAAO,EAAE,MAAQ,GAAG,EAAG,IAAK,EAAE,IAAM,GAAG,EAAG,OAAQ,EAAE,OAAS,GAAG,CAAE,EAAI,CAAG,CACxK,SAAS,OAAO,EAAG,EAAG,CAAE,MAAO,EAAE,EAAE,OAAS,EAAE,MAAQ,EAAE,MAAQ,EAAE,OAAS,EAAE,QAAU,EAAE,KAAO,EAAE,KAAO,EAAE,OAAS,CACpH,SAAS,KAAK,GAAI,IAAK,OAAQ,GAAI,CACjC,OAAO,IAAI,OAAO,SAAU,EAAG,EAAG,CAChC,IAAI,EAAI,EAAE,IAAM,GAAK,GAAK,GAC1B,GAAI,CAAC,OAAO,EAAG,CAAC,EAAG,OAAO,EAC1B,GAAI,EAAE,QAAU,EAAG,OAAO,GAAK,EAAE,OAAS,IAC1C,IAAI,IAAM,KAAK,IAAI,EAAE,MAAO,EAAE,KAAK,EAAI,KAAK,IAAI,EAAE,KAAM,EAAE,IAAI,IAAM,EAAE,MAAQ,EAAE,MAAO,IAAM,KAAK,IAAI,EAAE,OAAQ,EAAE,MAAM,EAAI,KAAK,IAAI,EAAE,IAAK,EAAE,GAAG,IAAM,EAAE,OAAS,EAAE,KACpK,OAAO,EAAI,KAAK,IAAI,GAAI,EAAE,GAAK,QAAiB,EAClD,EAAG,CAAC,CACN,CACA,SAAS,OAAO,GAAI,MAAO,CAAE,IAAI,EAAI,GAAG,sBAAsB,EAAG,MAAO,CAAE,KAAM,EAAE,KAAM,MAAO,EAAE,MAAO,IAAK,EAAE,IAAK,OAAQ,EAAE,OAAQ,KAAa,CAAG,CAItJ,SAAS,WAAW,EAAG,CAAE,IAAI,EAAI,QAAQ,OAAO,EAAG,EAAE,EAAG,UAAU,CAAC,CAAC,EAAG,SAAE,MAAQ,GAAI,EAAE,GAAK,GAAa,CAAG,CAE5G,SAAS,UAAU,EAAG,CACpB,OAAO,MAAM,UAAU,OAAO,KAAK,EAAE,KAAK,iBAAiB,eAAe,EAAG,SAAU,EAAG,CAAE,OAAO,EAAE,MAAM,UAAY,QAAU,EAAE,sBAAsB,EAAE,MAAQ,CAAG,CAAC,EACpK,IAAI,SAAU,EAAG,CAAE,IAAI,EAAI,WAAW,CAAC,EAAG,SAAE,IAAM,GAAa,CAAG,CAAC,CACxE,CAUA,SAAS,WAAW,EAAG,CACrB,IAAI,EAAI,CAAC,EACT,aAAM,UAAU,QAAQ,KAAK,EAAE,IAAI,iBAAiB,yBAAyB,EAAG,SAAU,EAAG,CAC3F,IAAI,EAAI,MAAM,UAAU,OAAO,KAAK,EAAE,iBAAiB,4BAA4B,EAAG,SAAU,EAAG,CAAE,MAAO,CAAC,EAAE,QAAQ,+BAA+B,CAAG,CAAC,EAAE,IAAI,EAC5J,EAAI,GAAK,EAAE,cAAgB,EAAE,aAAa,EAAG,GAAK,EAEtD,SADI,EAAI,CAAE,EAAM,GAAI,EAAE,QAAQ,EAAG,QAAS,CAAC,EAAG,KAAM,KAAM,GAAI,IAAK,EAC1D,EAAI,EAAE,WAAY,GAAK,IAAM,EAAE,IAAK,EAAI,EAAE,WAAY,CAC7D,IAAI,EAAI,oCAAoC,KAAM,EAAE,cAAgB,EAAE,aAAa,WAAW,GAAM,EAAE,EAAG,GAAK,GAAK,SAAS,eAAe,EAAE,CAAC,CAAC,EAAG,EAAI,IAAM,EAAE,cAAgB,EAAE,aAAa,EAC7L,GAAI,GAAC,IAAM,CAAC,GACZ,KAAI,OAAS,MAAM,UAAU,OAAO,KAAK,GAAG,iBAAiB,sCAAsC,EAAG,SAAU,EAAG,CAAE,OAAO,OAAO,EAAE,eAAkB,UAAY,CAAC,EAChK,IAAM,OAAO,IAAI,SAAU,EAAG,CAAE,IAAI,GAAK,EAAE,WAAa,EAAE,UAAU,SAAW,EAAE,UAAU,QAAQ,YAAY,EAAG,OAAO,GAAK,EAAE,SAAS,GAAG,MAAM,EAAI,CAAG,CAAC,EAC9J,GAAI,CAAC,EAAE,MAAQ,kBAAkB,KAAK,EAAE,CAAC,CAAC,GAAK,OAAO,SAAW,GAAK,OAAO,CAAC,EAAE,QAAQ,YAAY,IAAM,WAAa,OAAO,CAAC,EAAE,QAAU,OAAO,CAAC,EAAE,OAAO,cAAgB,EAAG,CAE7K,QADI,EAAI,IAAI,CAAC,EAAG,IAAM,CAAC,EACd,EAAI,EAAG,EAAI,OAAO,CAAC,EAAE,OAAO,cAAe,IAAK,CAAE,IAAI,EAAI,OAAO,CAAC,EAAE,OAAO,QAAQ,CAAC,EAAG,IAAI,KAAK,CAAC,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,EAAG,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,CAAC,CAAC,CAAG,CACtK,EAAE,KAAO,IACT,EAAE,GAAK,CAAC,KAAK,IAAI,MAAM,KAAM,IAAI,IAAI,SAAUA,GAAG,CAAE,OAAOA,GAAE,CAAC,CAAG,CAAC,CAAC,EAAG,KAAK,IAAI,MAAM,KAAM,IAAI,IAAI,SAAUA,GAAG,CAAE,OAAOA,GAAE,CAAC,CAAG,CAAC,CAAC,EAC/H,KAAK,IAAI,MAAM,KAAM,IAAI,IAAI,SAAUA,GAAG,CAAE,OAAOA,GAAE,CAAC,CAAG,CAAC,CAAC,EAAG,KAAK,IAAI,MAAM,KAAM,IAAI,IAAI,SAAUA,GAAG,CAAE,OAAOA,GAAE,CAAC,CAAG,CAAC,CAAC,CAAC,EAC5H,QACF,CACA,EAAE,QAAQ,KAAK,OAAO,IAAI,SAAU,EAAGC,GAAG,CAAE,MAAO,CAAE,EAAM,GAAI,IAAIA,EAAC,EAAE,QAAQ,CAAE,CAAG,CAAC,CAAC,EACvF,EACI,EAAE,MAAQ,OAAO,EAAE,eAAkB,aAAY,EAAE,KAAK,CAAC,EAC/D,CAAC,EAGD,MAAM,UAAU,QAAQ,KAAK,EAAE,IAAI,iBAAiB,2BAA2B,EAAG,SAAU,EAAG,CAC7F,IAAI,EAAI,EAAE,cAAgB,EAAE,aAAa,EAAG,GAAI,GAAC,GAAK,CAAC,EAAE,QAAU,EAAE,OAAO,cAAgB,GAE5F,SADI,IAAM,CAAC,EACF,EAAI,EAAG,EAAI,EAAE,OAAO,cAAe,IAAK,CAAE,IAAI,EAAI,EAAE,OAAO,QAAQ,CAAC,EAAG,IAAI,KAAK,CAAC,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,EAAG,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,EAAI,EAAE,CAAC,CAAC,CAAG,CACtJ,EAAE,KAAK,CAAE,EAAM,GAAI,EAAE,QAAQ,EAAG,QAAS,CAAC,EAAG,KAAM,IAAK,GAAI,CAAC,KAAK,IAAI,MAAM,KAAM,IAAI,IAAI,SAAUD,GAAG,CAAE,OAAOA,GAAE,CAAC,CAAG,CAAC,CAAC,EAAG,KAAK,IAAI,MAAM,KAAM,IAAI,IAAI,SAAUA,GAAG,CAAE,OAAOA,GAAE,CAAC,CAAG,CAAC,CAAC,EACpL,KAAK,IAAI,MAAM,KAAM,IAAI,IAAI,SAAUA,GAAG,CAAE,OAAOA,GAAE,CAAC,CAAG,CAAC,CAAC,EAAG,KAAK,IAAI,MAAM,KAAM,IAAI,IAAI,SAAUA,GAAG,CAAE,OAAOA,GAAE,CAAC,CAAG,CAAC,CAAC,CAAC,CAAE,CAAC,EACjI,CAAC,EACM,CACT,CAGA,SAAS,WAAW,EAAG,EAAG,CACxB,IAAI,GAAK,OAAO,OAAO,mBAAsB,WAAa,OAAO,kBAAkB,CAAC,EAAI,KAAM,EAAI,IAAM,GAAG,OAAO,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,OAAS,CAAG,CAAC,EAAE,CAAC,EAC7J,IAAM,EAAE,WAAa,CAAC,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,SAAS,EAAE,CAAC,GAAK,SAAS,EAAE,CAAC,CAAG,CAAC,EAAG,EAAI,EAAE,KAAO,EAAE,IAAI,cAAgB,EAAE,IAAI,aAAa,EACpJ,GAAI,CAAC,GAAK,CAAC,GAAG,QAAU,CAAC,EAAG,OAAO,KACnC,IAAI,EAAI,EAAE,IAAI,eAAe,EAC7B,SAAE,GAAK,EAAE,IAAI,CAAC,EAAE,CAAC,EAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAK,EAAI,KAAK,IAAI,MAAM,KAAM,GAAG,IAAI,SAAU,EAAG,CAAE,OAAO,IAAI,EAAE,CAAC,CAAG,CAAC,CAAC,EACtG,EAAE,GAAK,EAAE,IAAI,CAAC,EAAE,CAAC,EAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAK,EAAI,KAAK,IAAI,MAAM,KAAM,GAAG,IAAI,SAAU,EAAG,CAAE,OAAO,IAAI,EAAE,CAAC,CAAG,CAAC,CAAC,EAC/F,EAAE,gBAAgB,CAAC,CAC5B,CACA,SAAS,SAAS,IAAK,EAAG,EAAG,CAE3B,QADI,OAAS,GACJ,EAAI,EAAG,EAAI,IAAI,OAAS,EAAG,EAAI,IAAI,OAAQ,EAAI,IAAK,CAC3D,IAAI,EAAI,IAAI,CAAC,EAAG,EAAI,IAAI,CAAC,EACpB,EAAE,CAAC,EAAI,GAAQ,EAAE,CAAC,EAAI,GAAM,GAAK,EAAE,CAAC,EAAI,EAAE,CAAC,IAAM,EAAI,EAAE,CAAC,IAAM,EAAE,CAAC,EAAI,EAAE,CAAC,GAAK,EAAE,CAAC,IAAG,OAAS,CAAC,OACpG,CACA,OAAO,MACT,CACA,SAAS,UAAU,EAAG,IAAK,EAAG,EAAG,CAC/B,IAAI,EAAI,KAAM,GAAK,SAAU,GAAI,CAAE,OAAK,IAAK,EAAI,EAAE,IAAI,eAAe,EAAG,EAAE,EAAI,EAAG,EAAE,EAAI,GAAY,EAAE,gBAAgB,EAAE,CAAG,EAC3H,OAAO,IAAI,KAAK,SAAU,EAAG,CAC3B,GAAI,EAAE,MAAQ,GAAI,EAAI,EAAE,GAAG,CAAC,GAAK,EAAI,EAAE,GAAG,CAAC,GAAK,EAAI,EAAE,GAAG,CAAC,GAAK,EAAI,EAAE,GAAG,CAAC,GAAK,CAAC,SAAS,EAAE,KAAM,EAAG,CAAC,EAAG,MAAO,WACrG,CAAC,EAAE,EAAE,cAAc,GAAG,EAAE,EAAE,CAAC,EAAG,MAAO,GAC9C,OAAO,EAAE,QAAQ,MAAM,SAAU,GAAI,CAAE,MAAO,CAAC,GAAG,QAAU,GAAG,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,EAAE,cAAc,GAAG,EAAE,EAAE,CAAC,CAAG,CAAC,CAAG,CAAC,CAC9H,CAAC,CACH,CACA,SAAS,QAAQ,EAAG,IAAK,EAAG,CAC1B,IAAI,EAAI,EAAG,GAAK,CAAC,EAAE,KAAO,GAAI,EAAE,KAAO,EAAE,OAAS,EAAG,EAAE,MAAQ,CAAC,EAAG,GAAK,CAAC,EAAE,IAAM,GAAI,EAAE,IAAM,EAAE,QAAU,EAAG,EAAE,OAAS,CAAC,EACxH,UAAG,QAAQ,SAAU,EAAG,CAAE,GAAG,QAAQ,SAAU,EAAG,CAAM,UAAU,EAAG,IAAK,EAAG,CAAC,GAAG,GAAK,CAAC,CAAG,CAAC,EACpF,CACT,CAGA,SAAS,QAAQ,EAAG,IAAK,GAAI,EAAG,CAC9B,QAAS,EAAI,GAAK,GAAK,OAAQ,GAAK,GAAK,GAAI,UAAU,EAAG,IAAK,GAAG,CAAC,GAAK,EAAE,CAAC,EAAI,GAAG,CAAC,GAAK,EAAG,GAAG,CAAC,GAAK,EAAE,CAAC,EAAI,GAAG,CAAC,GAAK,CAAC,EAAG,MAAO,GAC/H,MAAO,EACT,CAUA,SAAS,MAAM,EAAG,EAAG,CACnB,GAAI,CAAC,EAAG,MAAO,GAEf,QADI,GAAK,CAAC,EAAE,GAAI,EAAE,GAAI,EAAE,IAAM,EAAG,EAAE,IAAM,CAAC,EAAG,GAAK,CAAC,EAAE,GAAI,EAAE,GAAI,EAAE,IAAM,EAAG,EAAE,IAAM,CAAC,EAC1E,EAAI,EAAG,EAAI,EAAG,IAAK,GAAI,GAAG,CAAC,IAAM,GAAG,CAAC,EAAG,OAAO,GAAG,CAAC,EAAI,GAAG,CAAC,EACpE,OAAO,EAAE,EAAI,EAAE,EAAI,IACrB,CAGA,SAAS,UAAU,EAAG,KAAM,EAAG,EAAG,CAChC,IAAI,IAAM,IAAM,KAAK,MAAM,EAAE,CAAC,EAAI,CAAC,EAAI,IAAM,KAAK,MAAM,EAAE,CAAC,EAAI,CAAC,EAChE,GAAI,EAAE,OAAO,MAAO,CAClB,IAAI,GAAK,EAAG,GAAK,EAAG,GAAK,EAAG,GAAK,QAAQ,EAAG,EAAE,EAAE,EAChD,EAAE,IAAI,QAAQ,SAAU,EAAG,CAAE,GAAI,EAAE,MAAO,CAAM,OAAO,EAAG,CAAC,GAAG,KAAM,MAAQ,CAAM,OAAO,EAAE,GAAK,GAAK,EAAG,CAAC,IAAS,EAAE,KAAK,KAAU,EAAE,KAAK,KAAQ,CAAC,EACnJ,KAAK,GAAG,EAAI,CAAE,GAAQ,GAAQ,GAAQ,EAAG,KAAK,EAAG,EAAE,IAAK,EAAE,OAAQ,EAAE,EAAI,KAAK,KAAK,KAAK,IAAI,EAAE,CAAC,EAAI,EAAE,IAAI,CAAC,EAAG,CAAC,EAAI,KAAK,IAAI,EAAE,CAAC,EAAI,EAAE,IAAI,CAAC,EAAG,CAAC,CAAC,EAAI,KAAO,EAAE,MAAQ,EAAE,MAAM,CAAC,EAAI,EAAG,CACpL,CACA,OAAO,KAAK,GAAG,CACjB,CACA,SAAS,eAAe,EAAG,EAAG,EAAG,CAC1B,EAAE,KAAI,EAAE,GAAK,UAAU,CAAC,GAC7B,IAAI,GAAK,EAAE,YAAc,EAAI,EAAG,GAAK,EAAE,aAAe,EAAI,EAAG,GAAK,EAAE,KAAM,MAAQ,CAAC,EAAG,KAAO,EAAE,MAAQ,CAAC,EACpG,OAAS,SAAU,EAAG,CACxB,IAAI,EAAI,CAAE,KAAM,EAAE,CAAC,EAAI,GAAI,MAAO,EAAE,CAAC,EAAI,GAAI,IAAK,EAAE,CAAC,EAAI,GAAI,OAAQ,EAAE,CAAC,EAAI,EAAG,EAC/E,GAAI,IAAE,KAAO,GAAG,MAAQ,EAAE,MAAQ,GAAG,OAAS,EAAE,IAAM,GAAG,KAAO,EAAE,OAAS,GAAG,QAAW,EAAE,OAAS,CAAC,EAAE,MAAM,CAAC,GAC9G,KAAI,EAAI,UAAU,EAAG,KAAM,EAAG,CAAC,EAAG,EAAI,CAAE,EAAM,EAAM,GAAI,EAAE,GAAI,GAAI,EAAE,GAAI,GAAI,EAAE,GAAI,EAAG,EAAE,CAAE,GACxF,EAAE,MAAQ,CAAC,GAAG,QAAQ,SAAU,EAAG,CAAE,IAAI,GAAK,EAAE,GAAK,QAAQ,EAAG,EAAE,EAAE,EAAI,EAAO,OAAO,GAAI,CAAC,IAAK,EAAE,KAAM,EAAE,GAAK,KAAK,GAAI,CAAC,CAAC,EAAG,EAAE,MAAM,EAAK,CAAC,EAC5I,MAAM,KAAK,CAAC,EACd,GACC,EAAE,MAAQ,CAAC,GAAG,QAAQ,MAAM,EAC7B,IAAI,OAAS,SAAU,GAAI,GAAI,CAAE,QAAS,GAAK,CAAC,GAAI,IAAM,GAAI,IAAM,GAAI,QAAS,GAAK,CAAC,GAAI,IAAM,GAAI,IAAM,GAAI,CAAE,IAAI,EAAI,GAAK,GAAK,GAAK,GAAQ,EAAI,GAAK,IAAM,GAAK,GAAK,IAAI,OAAO,CAAC,EAAE,EAAI,GAAI,EAAE,EAAI,EAAE,CAAC,CAAG,CAAE,EACzM,MAAQ,UAAY,CAAE,MAAM,KAAK,SAAU,EAAG,EAAG,CAAE,OAAQ,EAAE,GAAK,EAAE,IAAQ,EAAE,GAAK,EAAE,IAAQ,EAAE,EAAI,EAAE,CAAI,CAAC,CAAG,EAG7G,GAAK,SAAU,EAAG,CAAE,IAAI,EAAI,IAAM,KAAK,MAAM,EAAE,CAAC,EAAI,CAAC,EAAI,IAAM,KAAK,MAAM,EAAE,CAAC,EAAI,CAAC,EAAG,OAAM,KAAK,OAAO,KAAK,CAAC,EAAI,QAAQ,EAAG,EAAE,IAAK,EAAE,GAAI,CAAC,GAAU,KAAK,CAAC,CAAG,EAC7J,IAAM,SAAU,EAAG,CAAE,IAAI,EAAI,IAAM,KAAK,MAAM,EAAE,EAAE,CAAC,EAAI,CAAC,EAAI,IAAM,KAAK,MAAM,EAAE,EAAE,CAAC,EAAI,CAAC,EAAG,OAAM,KAAK,OAAO,KAAK,CAAC,EAAI,QAAQ,EAAG,EAAE,IAAK,QAAQ,EAAE,EAAG,EAAE,EAAE,CAAC,GAAU,KAAK,CAAC,CAAG,EAC7K,QAAU,UAAY,CAExB,QADIE,KAAM,KACD,EAAI,EAAG,EAAI,MAAM,OAAQ,IAAK,CACrC,IAAI,EAAI,MAAM,CAAC,EACf,GAAIA,OAAQ,EAAE,GAAKA,KAAI,IAAOA,KAAI,KAAO,GAAK,CAACA,KAAI,IAAM,CAACA,KAAI,IAAM,MACpE,GAAI,EAAAA,MAAOA,KAAI,KAAO,IAAM,EAAE,GAAKA,KAAI,IAAO,EAAE,KAAOA,KAAI,IAAM,EAAE,IAAMA,KAAI,MACzE,IAAE,IAAM,CAAC,GAAG,EAAE,CAAC,GACnB,KAAI,EAAI,CAAE,EAAG,EAAE,EAAG,EAAG,EAAE,EAAG,GAAI,EAAE,GAAI,GAAI,EAAE,GAAI,GAAI,EAAE,GAAI,GAAI,IAAI,CAAC,CAAE,EAC/D,MAAM,EAAGA,IAAG,IAAGA,KAAM,GAC3B,CACA,OAAIA,OAAKA,KAAI,IAAMA,KAAI,GAAK,GAAKA,KAAI,GAAK,GAAKA,KAAI,GAAK,GAAKA,KAAI,GAAK,GAC/DA,IACT,EACA,OAAO,GAAI,GAAG,EAAG,MAAM,EACvB,IAAI,IAAM,QAAQ,EAED,GAFQ,KAAO,CAAC,IAAI,MACrC,OAAO,IAAK,GAAG,EAAG,MAAM,EACxB,IAAM,QAAQ,EAAO,CAAC,KAAO,CAAC,IAAI,KAAK,OAAO,IAG9C,QAAS,GAAK,IAAK,IAAM,GAAI,IAAM,EAAG,QAAS,GAAK,IAAK,IAAM,GAAI,IAAM,GAAO,IAAM,KAAI,OAAO,CAAC,IAAI,EAAE,CAAC,EAAI,GAAI,IAAI,EAAE,CAAC,EAAI,EAAE,CAAC,EAC/H,aAAM,EACC,QAAQ,CACjB,CACA,SAAS,YAAY,EAAG,KAAM,CAC5B,GAAI,GAAC,GAAK,CAAC,EAAE,MAAQ,CAAC,EAAE,KACxB,KAAI,KAAO,EAAE,KAAK,sBAAsB,EACxC,MAAM,UAAU,QAAQ,KAAK,EAAE,KAAK,iBAAiB,gBAAgB,EAAG,SAAU,EAAG,CACnF,IAAI,EAAI,EAAE,IAAI,cAAc,wBAA0B,EAAE,aAAa,WAAW,EAAI,IAAI,EAAG,GAAI,CAAC,EAAG,CAAE,EAAE,MAAM,QAAU,OAAQ,MAAQ,CACvI,IAAI,EAAI,EAAE,sBAAsB,EAAG,EAAI,QAAQ,EAAE,aAAa,WAAW,CAAC,EAAG,GAAK,EAAE,EAAI,EAAI,GAAI,GAAK,EAAE,EAAI,EAAI,GAC/G,EAAE,MAAM,QAAU,GAClB,IAAI,GAAK,EAAE,EAAI,EAAE,MAAQ,EAAE,KAAM,GAAK,EAAE,EAAI,EAAE,OAAS,EAAE,IAAK,GAAK,GAAK,IAAM,EAAE,YAAc,EAAI,GAAI,GAAK,GAAK,IAAM,EAAE,aAAe,EAAI,GAC3I,EAAE,SAAW,CAAE,EAAG,GAAI,EAAG,GAAI,GAAQ,EAAO,EAC5C,EAAE,MAAM,KAAQ,GAAK,KAAK,KAAQ,KAAM,EAAE,MAAM,IAAO,GAAK,KAAK,IAAO,IAC1E,CAAC,EAED,QADI,GAAK,MAAM,UAAU,OAAO,KAAK,EAAE,KAAK,iBAAiB,gBAAgB,EAAG,SAAU,EAAG,CAAE,OAAO,EAAE,MAAM,UAAY,MAAQ,CAAC,EAC1H,EAAI,EAAG,EAAI,EAAG,IAAK,GAAG,QAAQ,SAAU,EAAG,EAAG,CACrD,GAAG,MAAM,EAAI,CAAC,EAAE,QAAQ,SAAU,EAAG,CACnC,IAAI,GAAK,WAAW,EAAE,MAAM,IAAI,EAAG,GAAK,WAAW,EAAE,MAAM,IAAI,EAAG,GAAK,WAAW,EAAE,MAAM,GAAG,EAAG,GAAK,WAAW,EAAE,MAAM,GAAG,EACvH,IAAM,EAAE,YAAc,EAAE,aAAe,EAAI,EAAI,KAAK,IAAI,GAAK,EAAE,EAAG,IAAM,EAAE,aAAe,EAAE,cAAgB,EAAI,KAAK,IAAI,GAAK,EAAE,EACnI,GAAI,MAAM,GAAK,IAAM,GACrB,KAAI,EAAI,IAAM,GAAK,EAAI,GAAI,EAAE,MAAM,KAAQ,GAAK,EAAI,GAAK,EAAK,KAAM,EAAE,MAAM,KAAQ,GAAK,EAAI,GAAK,EAAK,KACzG,CAAC,CACH,CAAC,EAID,IAAI,IAAM,gBAAgB,CAAC,EAAE,OAAO,MAAQ,CAAC,CAAC,EAAG,IAAM,WAAW,CAAC,EACnE,GAAG,QAAQ,SAAU,EAAG,CACtB,GAAK,EAAE,SACP,KAAI,EAAI,WAAW,EAAE,MAAM,IAAI,EAAI,KAAK,KAAM,EAAI,WAAW,EAAE,MAAM,GAAG,EAAI,KAAK,IAAK,EAAI,OAAO,CAAC,EAAG,GAAK,UAAU,CAAC,EAAG,GAAK,QAAQ,EAAG,EAAE,EACtI,EAAI,IAAI,OAAO,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,IAAM,CAAG,CAAC,EAAE,IAAI,SAAU,EAAG,CAAE,IAAI,EAAI,WAAW,CAAC,EAAG,SAAE,IAAM,GAAa,CAAG,CAAC,CAAC,EACnI,GAAI,GAAC,KAAK,EAAG,EAAG,GAAK,EAAE,GAAK,CAAC,QAAQ,EAAG,IAAK,EAAE,GAC/C,KAAI,IAAM,eAAe,EAAG,EAAG,CAAE,EAAM,EAAM,IAAK,CAAC,EAAG,CAAC,EAAG,IAAK,EAAG,IAAU,KAAY,OAAQ,GAAK,KAAM,CAAC,CAAC,EAAG,CAAC,CAAC,EAAG,GAAI,CAAC,EAAE,SAAS,EAAG,EAAE,SAAS,CAAC,EAAG,EAAO,CAAC,EAC3J,MAAO,EAAE,MAAM,KAAQ,IAAI,EAAE,CAAC,EAAI,KAAK,KAAQ,KAAM,EAAE,MAAM,IAAO,IAAI,EAAE,CAAC,EAAI,KAAK,IAAO,OACjG,CAAC,EACH,CACA,SAAS,YAAY,EAAG,CACtB,GAAI,GAAC,GAAK,CAAC,EAAE,MAAQ,CAAC,EAAE,OACxB,MAAM,UAAU,QAAQ,KAAK,EAAE,KAAK,iBAAiB,gBAAgB,EAAG,SAAU,EAAG,CAAE,EAAE,OAAO,CAAG,CAAC,EAChG,SAAO,iBAAmB,OAAO,gBAAgB,IACrD,KAAI,GAAK,KAAK,CAAC,EAEf,GAAI,GAAC,UAAY,EAAE,UAAU,KAAO,IAAO,IAAM,GAAG,OAAS,SAC7D,IAAI,CAAC,SAAS,eAAe,eAAe,EAAG,CAAE,IAAI,GAAK,SAAS,cAAc,OAAO,EAAG,GAAG,GAAK,gBAAiB,GAAG,YAAc,WAAY,SAAS,KAAK,YAAY,EAAE,CAAG,CAChL,IAAI,EAAI,EAAE,EAAE,OAAS,CAAC,EAAG,IAAM,CAAC,GAC/B,QAAQ,CAAC,GAAK,CAAC,GAAG,OAAO,QAAQ,CAAC,CAAC,EAAE,QAAQ,SAAU,EAAG,CACzD,CAAC,CAAC,OAAO,EAAG,EAAE,CAAC,EAAG,CAAC,EAAG,CAAC,QAAQ,EAAG,EAAE,CAAC,EAAG,EAAE,CAAC,EAAE,QAAQ,SAAU,EAAG,CAChE,IAAI,EAAI,EAAE,CAAC,EAAG,GAAI,GAAC,GAAK,IAAI,CAAC,GAAK,CAAC,EAAE,IAAI,cAAc,wBAA0B,EAAI,IAAI,GAAW,KAAI,CAAC,EAAI,EAC7G,IAAI,GAAK,WAAW,EAAG,CAAC,EAAG,MAAQ,EAAE,CAAC,IAAM,SAAW,IAAM,GAAG,EAAE,IAAM,OAAS,GAAG,EAAI,KAAM,IAAM,MAAQ,OAAO,MAAM,CAAC,EAAI,KAC1H,EAAI,SAAS,cAAc,QAAQ,EAAG,EAAE,KAAO,SAAU,EAAE,UAAY,iBAAmB,MAAQ,YAAc,IAAK,EAAE,aAAa,YAAa,CAAC,EACtJ,IAAI,MAAQ,EAAE,CAAC,EAAI,EAAI,aAAe,mBAAkB,OAAS,EAAE,IAC/D,EAAK,OAAS,MAAM,EAAI,gBAAkB,mBAAkB,OAAS,KAAO,MAAQ,IAAM,QAAO,MAAM,EAAI,aAAe,MAAM,KAAK,IAAI,MAAM,CAAC,CAAC,EAAI,MAAQ,IAAM,0BACnK,IAAI,IAAI,EAAI,2BAAwB,GAAK,uBAAsB,EAAE,CAAC,EAAI,EAAI,KAAK,KAAK,IAAM,eAAW,WAAU,KAAK,KAAK,IAAM,QAAO,IAC1I,EAAE,YAAc,IAAM,OAAK,EAAE,MAAQ,EAAG,EAAE,aAAa,aAAc,CAAC,EAAG,EAAE,aAAa,gBAAiB,QAAQ,EAC5G,IAAI,EAAE,aAAa,gBAAiB,MAAM,EAC/C,EAAE,KAAK,YAAY,CAAC,EACpB,EAAE,iBAAiB,QAAS,SAAU,EAAG,CAAE,EAAE,eAAe,EAAG,EAAE,gBAAgB,EAAQ,YAAY,CAAC,GAAG,WAAW,EAAG,EAAG,CAAC,CAAG,CAAC,EAC/H,CAAC,cAAe,YAAa,YAAY,EAAE,QAAQ,SAAU,GAAI,CAAE,EAAE,iBAAiB,GAAI,SAAU,EAAG,CAAE,EAAE,gBAAgB,EAAG,UAAU,CAAC,CAAG,CAAC,CAAG,CAAC,EACnJ,CAAC,CACH,CAAC,EACD,YAAY,CAAC,EACb,IAAI,IAAM,EAAE,EAAE,OAAY,MAAQ,SAAW,MAAQ,WAAa,MAAQ,YAC1E,sBAAsB,UAAY,CAAE,YAAY,CAAC,CAAG,CAAC,EAAG,WAAW,UAAY,CAAE,YAAY,CAAC,CAAG,EAAG,GAAG,EACvG,WAAW,UAAY,CAAE,YAAY,CAAC,CAAG,EAAG,GAAG,IACjD,CAGA,IAAI,YAAc,KAId,MAAQ,KACZ,SAAS,UAAU,EAAG,CAAE,MAAQ,CAAE,EAAM,EAAG,KAAK,IAAI,CAAE,CAAG,CACzD,SAAS,YAAY,EAAG,CACtB,IAAI,EAAI,MACR,OADe,MAAQ,KACnB,CAAC,GAAK,EAAE,IAAM,GAAK,KAAK,IAAI,EAAI,EAAE,EAAI,KAAQ,CAAC,EAAE,EAAE,YAAoB,IAC3E,EAAE,EAAE,MAAM,EAAU,GACtB,CACA,SAAS,MAAO,CAAE,MAAO,CAAC,EAAE,OAAS,KAAK,IAAI,EAAI,MAAM,EAAI,IAAO,CACnE,SAAS,YAAY,EAAG,CAAE,WAAW,CAAC,EAAG,YAAY,CAAC,EAAG,eAAe,CAAC,CAAG,CAC5E,SAAS,WAAW,EAAG,EAAG,GAAI,CAC5B,IAAI,GAAK,SAAS,EAAG,CAAC,EAAG,GAAK,GAC9B,KAAI,GAAK,WAAW,EAAG,CAAC,EACxB,GAAI,CAAC,GAAI,CAAE,UAAU,WAAW,EAAG,EAAE,CAAC,EAAG,MAAQ,CACjD,GAAM,UAAU,KAAO,EACvB,CAAI,EAAE,WAAW,EAAE,UAAU,EAC7B,IAAI,OAAS,EAAE,EAAE,OAAS,CAAC,GAAG,CAAC,IAAM,SAAW,GAAG,EAAE,IAAM,OAAQ,IAAM,EAAE,UAAY,CAAC,GAAG,CAAC,EAC5F,EAAE,eAAiB,EAAG,YAAc,EAAG,UAAY,KAAU,EAAE,YAAW,EAAE,UAAU,QAAU,MAChG,IAAI,GAAK,EAAE,WAAa,SAAS,eAAe,iBAAiB,EACjE,GAAI,IAAM,OAAO,WAAY,CAC3B,IAAI,GAAK,GAAG,KAAO,EAAI,KAAK,KAAK,IAAM,IAAM,KAAK,KAAK,IAAK,GAAG,UAAY,OAAO,WAAW,EAAG,SAAU,EAAG,CAAE,MAAO,CAAC,UAAU,EAAG,EAAG,MAAQ,GAAK,EAAE,CAAG,EAAG,QAAS,OAAQ,MAAO,CAAC,EACrL,GAAM,EAAE,MAAQ,EAAE,KAAK,cAAc,6BAA+B,EAAI,IAAI,GAAM,EACpF,CACA,YAAY,EAAG,EAAG,QAAS,GAAG,EAAG,IAAM,GAAG,KAAM,GAAG,KAAM,CAAE,KAAM,CAAC,MAAO,KAAM,GAAI,OAAQ,UAAY,CAAE,UAAU,CAAC,CAAG,CAAE,CAAC,GAC5H,CAGA,SAAS,UAAU,EAAG,CACpB,YAAc,KACd,WAAW,UAAY,CAAE,IAAI,EAAI,OAAO,EAAG,EAAI,GAAK,EAAE,MAAQ,EAAE,KAAK,cAAc,6BAA+B,EAAI,IAAI,EAAG,GAAI,EAAG,GAAI,CAAE,EAAE,MAAM,CAAE,cAAe,EAAK,CAAC,CAAG,MAAa,CAAE,EAAE,MAAM,CAAG,CAAE,EAAG,EAAE,CAC/M,CACA,OAAO,iBAAiB,QAAS,SAAU,EAAG,CAC5C,IAAI,EAAI,EAAE,QAAU,EAAE,OAAO,SAAW,EAAE,OAAO,QAAQ,2BAA2B,EAAG,GAAI,GAAC,GAAK,CAAC,aAClG,KAAI,EAAI,OAAO,EAAG,EAAI,YAAa,GAAI,CAAC,GAAK,EAAE,iBAAmB,EAAG,CAAE,YAAc,KAAM,MAAQ,CACnG,UAAU,CAAC,EACb,EAAG,EAAI,EAEP,OAAO,iBAAiB,UAAW,SAAU,EAAG,CAC9C,GAAI,IAAE,MAAQ,UAAY,CAAC,aAC3B,KAAI,EAAI,YAAa,GAAK,OAAO,EAAG,YAAc,KAC9C,GAAC,IAAM,GAAG,iBAAmB,IACjC,WAAW,UAAY,CAAE,IAAI,EAAI,OAAO,EAAG,EAAI,SAAS,eAAe,iBAAiB,EAAG,EAAI,GAAK,EAAE,MAAQ,EAAE,KAAK,cAAc,6BAA+B,EAAI,IAAI,EAAO,GAAK,CAAC,EAAE,UAAU,SAAS,QAAQ,GAAG,EAAE,eAAe,EAAO,GAAG,EAAE,MAAM,CAAG,EAAG,EAAE,EACpQ,EAAG,EAAI,EACP,OAAO,iBAAiB,SAAU,UAAY,CAAE,GAAI,CAAE,YAAY,OAAO,CAAC,EAAG,eAAe,OAAO,CAAC,CAAG,MAAY,CAAC,CAAE,CAAC,EAMvH,IAAI,eAAiB,WAAW,QAAQ,iBAAkB,cAAc,EAAI,oEACxE,UAAY,KAChB,SAAS,SAAS,EAAG,EAAG,CAAE,OAAO,SAAS,eAAe,IAAM,IAAM,eAAiB,UAAY,CAAC,CAAG,CACtG,SAAS,OAAO,EAAG,EAAG,CAAE,IAAI,EAAI,EAAE,EAAG,GAAI,IAAM,IAAK,OAAO,IAAI,EAAE,UAAU,GAAK,GAAI,IAAI,EAAI,EAAE,OAAS,EAAE,MAAM,EAAE,MAAM,EAAG,OAAO,IAAI,GAAK,EAAE,CAAC,CAAC,GAAK,EAAI,CACvJ,SAAS,OAAO,EAAG,EAAG,CAAE,OAAO,IAAM,IAAM,EAAE,IAAI,cAAc,sBAAsB,EAAI,EAAE,IAAI,cAAc,wCAA0C,EAAI,IAAI,CAAG,CAIlK,SAAS,aAAa,EAAG,UAAW,CAClC,IAAI,EAAI,gBAAgB,CAAC,EACzB,aAAM,UAAU,QAAQ,KAAK,EAAE,KAAK,iBAAiB,gBAAgB,EAAG,SAAU,GAAI,CAAE,GAAI,iBAAiB,EAAE,EAAE,UAAY,QAAU,GAAG,sBAAsB,EAAE,MAAQ,EAAG,CAAE,IAAI,EAAI,WAAW,EAAE,EAAO,UAAW,EAAE,IAAM,GAAW,EAAE,IAAM,GAAM,EAAE,KAAK,CAAC,CAAG,CAAE,CAAC,EAC9P,CACT,CACA,SAAS,WAAW,EAAG,KAAM,CAAE,OAAO,MAAM,UAAU,KAAK,KAAK,EAAE,KAAK,iBAAiB,gBAAgB,EAAG,SAAU,EAAG,CAAE,IAAI,EAAI,WAAW,CAAC,EAAG,OAAO,EAAE,MAAQ,EAAE,MAAQ,KAAK,KAAK,SAAU,EAAG,CAAE,OAAO,OAAO,EAAG,CAAC,CAAG,CAAC,CAAG,CAAC,CAAG,CAClO,SAAS,cAAc,EAAG,CAAE,IAAI,IAAM,WAAW,CAAC,EAAG,OAAO,MAAM,UAAU,KAAK,KAAK,EAAE,KAAK,iBAAiB,gBAAgB,EAAG,SAAU,EAAG,CAAE,IAAI,EAAI,EAAE,sBAAsB,EAAG,OAAO,EAAE,MAAQ,GAAK,QAAQ,EAAG,IAAK,QAAQ,EAAG,UAAU,CAAC,CAAC,CAAC,EAAI,CAAG,CAAC,CAAG,CAK5P,SAAS,YAAY,EAAG,MAAO,IAAK,CAClC,IAAI,OAAS,MAAM,IAAI,SAAU,EAAG,CAClC,IAAI,GAAK,EAAE,EAAE,YAAc,EAAG,GAAK,EAAE,EAAE,aAAe,EACtD,GAAI,CAAC,EAAE,GAAI,CAAE,IAAI,GAAK,CAAE,KAAM,EAAE,MAAM,CAAC,EAAI,GAAI,MAAO,EAAE,MAAM,CAAC,EAAI,GAAI,IAAK,EAAE,MAAM,CAAC,EAAI,GAAI,OAAQ,EAAE,MAAM,CAAC,EAAI,EAAG,EAAG,GAAK,QAAQ,GAAI,UAAU,EAAE,CAAC,CAAC,EAAG,MAAO,CAAC,CAAE,EAAG,EAAE,MAAO,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,CAAC,CAAG,CACnP,IAAI,EAAI,OAAO,OAAO,CAAE,GAAS,EAAG,EAAE,EAAE,EAAG,GAAK,GAAK,EAAG,GAAK,GAAK,EAAG,GAAK,EAAE,KAAM,IAAM,CAAC,EAAG,EAAI,CAAC,EAAG,KAAO,EAAE,MAAQ,CAAC,EAClH,OAAS,SAAU,EAAG,CACxB,IAAI,IAAM,KAAK,MAAM,EAAE,CAAC,EAAI,CAAC,EAAI,IAAM,KAAK,MAAM,EAAE,CAAC,EAAI,CAAC,EAAG,EAAI,CAAE,KAAM,EAAE,CAAC,EAAI,GAAI,MAAO,EAAE,CAAC,EAAI,GAAI,IAAK,EAAE,CAAC,EAAI,GAAI,OAAQ,EAAE,CAAC,EAAI,EAAG,EACxI,GAAI,EAAE,KAAO,GAAG,MAAQ,EAAE,MAAQ,GAAG,OAAS,EAAE,IAAM,GAAG,KAAO,EAAE,OAAS,GAAG,QAAU,CAAC,EAAE,MAAM,CAAC,EAAG,OAAO,KAC5G,IAAI,EAAI,UAAU,EAAG,KAAM,EAAG,CAAC,EAE/B,GAFsC,EAAE,KAClC,IAAM,OAAO,OAAO,KAAK,IAAM,GAAG,EAAI,QAAQ,EAAG,EAAE,IAAK,EAAE,GAAI,CAAC,GACjE,CAAC,KAAK,IAAM,GAAG,GAAG,OAAO,KACvB,IAAM,OAAO,OAAO,KAAK,IAAM,GAAG,EAAI,QAAQ,EAAG,EAAE,IAAK,QAAQ,EAAG,EAAE,EAAE,CAAC,GAC9E,IAAI,EAAI,CAAE,KAAM,EAAE,CAAC,EAAI,GAAI,MAAO,EAAE,CAAC,EAAI,GAAI,IAAK,EAAE,CAAC,EAAI,GAAI,OAAQ,EAAE,CAAC,EAAI,EAAG,EAC/E,MAAO,CAAE,EAAM,EAAM,GAAI,EAAG,GAAI,KAAK,IAAM,GAAG,EAAG,GAAI,EAAE,GAAI,GAAI,EAAE,GAAI,EAAG,EAAE,GAAK,EAAE,EAAE,MAAM,CAAC,EAAI,EAAI,GAAI,EAAM,GAAI,QAAQ,EAAG,EAAE,EAAE,EAAG,GAAI,QAAQ,EAAG,EAAE,EAAE,CAAE,CACzJ,EACI,OAAS,SAAU,EAAG,CAAE,IAAI,IAAM,KAAK,MAAM,EAAE,CAAC,EAAI,CAAC,EAAI,IAAM,KAAK,MAAM,EAAE,CAAC,EAAI,CAAC,EAAG,GAAI,KAAI,GAAG,EAAW,KAAI,GAAG,EAAI,EAAG,IAAI,EAAI,OAAO,CAAC,EAAO,GAAG,EAAE,KAAK,CAAC,EAAG,EAClK,EAAE,KAAK,QAAQ,MAAM,EACrB,CAAC,EAAG,CAAC,EAAE,QAAQ,SAAU,EAAG,CAAE,QAAS,GAAK,KAAO,EAAG,IAAM,IAAK,IAAM,GAAI,QAAS,GAAK,KAAO,EAAG,IAAM,IAAK,IAAM,GAAQ,GAAK,GAAK,GAAK,IAAM,OAAW,OAAO,CAAC,EAAE,EAAI,GAAI,EAAE,EAAI,EAAE,CAAC,CAAG,CAAC,EAC3L,IAAI,IAAM,EAAE,KAAK,SAAU,EAAG,EAAG,CAAE,OAAO,MAAM,EAAG,CAAC,EAAI,GAAK,MAAM,EAAG,CAAC,EAAI,EAAI,CAAG,CAAC,EAAE,MAAM,EAAG,EAAE,EAChG,WAAI,OAAS,OACN,GACT,CAAC,EACD,GAAI,OAAO,KAAK,SAAU,EAAG,CAAE,MAAO,CAAC,EAAE,MAAQ,CAAC,EAAG,OAAO,KAC5D,IAAI,EAAI,OAAO,OAAQ,MAAQ,CAAC,EAAG,SAAW,KAAM,MAAQ,CAAC,EAC7D,MAAM,CAAC,EAAI,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,CAAE,EACvC,QAAS,EAAI,EAAI,EAAG,GAAK,EAAG,IAAK,MAAM,CAAC,EAAI,CAAE,GAAI,MAAM,EAAI,CAAC,EAAE,GAAK,OAAO,CAAC,EAAE,CAAC,EAAE,GAAI,GAAI,MAAM,EAAI,CAAC,EAAE,GAAK,OAAO,CAAC,EAAE,CAAC,EAAE,GAAI,GAAI,MAAM,EAAI,CAAC,EAAE,GAAK,OAAO,CAAC,EAAE,CAAC,EAAE,GAAI,EAAG,MAAM,EAAI,CAAC,EAAE,EAAI,OAAO,CAAC,EAAE,CAAC,EAAE,CAAE,EACtM,IAAI,GAAK,SAAUD,GAAG,GAAI,GAAI,GAAI,EAAG,CACnC,GAAIA,KAAM,EAAG,CAAE,IAAI,IAAM,CAAE,GAAI,EAAG,GAAQ,GAAQ,GAAQ,CAAK,EAAO,MAAM,IAAK,QAAQ,IAAK,IAAI,GAAK,MAAM,MAAM,EAAG,SAAW,KAAO,MAAQ,CAChJ,QAAS,EAAI,EAAG,EAAI,OAAOA,EAAC,EAAE,OAAQ,IAAK,CACzC,IAAI,EAAI,OAAOA,EAAC,EAAE,CAAC,EAAG,EAAI,MAAMA,GAAI,CAAC,EACrC,GAAI,UAAY,CAAC,MAAM,CAAE,GAAI,EAAG,GAAI,GAAK,EAAE,GAAK,EAAE,GAAI,GAAI,GAAK,EAAE,GAAK,EAAE,GAAI,GAAI,GAAK,EAAE,GAAK,EAAE,GAAI,EAAG,EAAI,EAAE,EAAI,EAAE,CAAE,EAAG,QAAQ,EAAG,MACjI,QAAS,EAAI,EAAG,EAAIA,IAAK,CAAC,OAAO,EAAE,GAAI,MAAM,CAAC,EAAE,EAAE,EAAG,IAAI,CACrD,EAAIA,KACR,MAAMA,EAAC,EAAI,EAAG,GAAGA,GAAI,EAAG,GAAK,EAAE,GAAI,GAAK,EAAE,GAAI,GAAK,EAAE,GAAI,EAAI,EAAE,CAAC,EAClE,CACF,EAEA,OADA,GAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EACX,UAIL,SAAS,GAAG,QAAQ,SAAU,EAAGA,GAAG,CAClC,GAAK,GAAC,EAAE,IAAM,CAAC,EAAE,IAAO,CAAC,OAAOA,EAAC,EAAE,QAEnC,SADI,IAAM,EACD,GAAK,IAAK,IAAM,GAAI,IAAM,EAAG,QAAS,GAAK,IAAK,IAAM,GAAI,IAAM,EAAG,CAC1E,IAAI,GAAK,IAAM,KAAO,OAAOA,EAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,EAAI,GAAI,EAAE,EAAE,CAAC,EAAI,EAAE,CAAC,EAAQ,IACrE,SAAS,GAAG,KAAK,SAAU,EAAG,EAAG,CAAE,OAAO,IAAMA,IAAK,OAAO,EAAE,GAAI,EAAE,EAAE,CAAG,CAAC,GAC1E,MAAM,EAAG,GAAG,IAAG,IAAM,GAC3B,CACI,MAAQ,IACZ,SAAS,IAAM,IAAI,GAAK,EAAE,GAAI,SAAS,IAAM,IAAI,GAAK,EAAE,GAAI,SAAS,IAAM,IAAI,GAAK,EAAE,GAAI,SAAS,GAAK,IAAI,EAAI,EAAE,EAAG,SAAS,GAAGA,EAAC,EAAI,KACxI,CAAC,EACD,SAAS,IAAM,SAAS,GAAG,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,CAAG,CAAC,EACpD,UAhBe,IAiBxB,CAGA,SAAS,aAAa,EAAG,MAAO,IAAK,KAAM,CAEzC,QADI,IAAM,CAAC,EAAG,EAAI,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,GAAS,EACtD,EAAI,EAAG,EAAI,MAAM,OAAQ,IAAK,CACrC,IAAI,EAAI,MAAM,CAAC,EAAE,EAAG,GAAI,CAAC,EAAE,MAAM,MAAQ,CAAC,EAAE,MAAM,IAAK,OAAO,KAC9D,IAAI,KAAK,CAAC,WAAW,EAAE,MAAM,IAAI,EAAI,KAAK,KAAM,WAAW,EAAE,MAAM,GAAG,EAAI,KAAK,GAAG,CAAC,CACrF,CACA,IAAK,EAAI,EAAG,EAAI,MAAM,OAAQ,IAAK,CAEjC,IAAI,EAAI,MAAM,CAAC,EAAG,EAAI,IAAI,CAAC,EAAG,GAAK,EAAE,EAAE,YAAc,EAAG,GAAK,EAAE,EAAE,aAAe,EAAG,EAAI,CAAE,KAAM,EAAE,CAAC,EAAI,GAAI,MAAO,EAAE,CAAC,EAAI,GAAI,IAAK,EAAE,CAAC,EAAI,GAAI,OAAQ,EAAE,CAAC,EAAI,EAAG,EAC9J,GAAK,EAAE,GACP,KAAI,EAAI,OAAO,OAAO,CAAE,GAAS,EAAG,EAAE,EAAE,EACxC,GAAI,CAAC,EAAE,MAAM,CAAC,GAAK,KAAK,KAAK,KAAK,IAAI,EAAE,CAAC,EAAI,EAAE,EAAG,CAAC,EAAI,KAAK,IAAI,EAAE,CAAC,EAAI,EAAE,EAAG,CAAC,CAAC,EAAI,KAAO,CAAC,QAAQ,EAAG,EAAE,IAAK,EAAE,GAAI,CAAC,EAAG,OAAO,KAC7H,IAAI,EAAI,UAAU,EAAG,CAAC,EAAG,EAAG,CAAC,EAC7B,EAAE,IAAM,EAAE,GAAI,EAAE,IAAM,EAAE,GAAI,EAAE,IAAM,EAAE,GAAI,EAAE,GAAK,EAAE,EAAG,EAAE,IAAM,QAAQ,EAAG,EAAE,IAAK,QAAQ,EAAG,EAAE,EAAE,CAAC,EAChG,QAAS,EAAI,EAAG,EAAI,EAAG,IAAK,CAAE,IAAI,EAAI,IAAI,CAAC,EAAG,GAAK,MAAM,CAAC,EAAE,EAAO,OAAO,QAAQ,EAAG,UAAU,EAAE,CAAC,CAAC,EAAG,QAAQ,CAAE,KAAM,EAAE,CAAC,EAAI,GAAG,YAAc,EAAG,MAAO,EAAE,CAAC,EAAI,GAAG,YAAc,EAAG,IAAK,EAAE,CAAC,EAAI,GAAG,aAAe,EAAG,OAAQ,EAAE,CAAC,EAAI,GAAG,aAAe,CAAE,EAAG,UAAU,EAAE,CAAC,CAAC,GAAG,EAAE,IAAM,EACrR,CACA,OAAO,CACT,CACA,SAAS,eAAe,EAAG,UAAW,CACpC,GAAI,GAAC,GAAK,CAAC,EAAE,MAAQ,CAAC,EAAE,KAGxB,CAAI,CAAC,WAAa,MAAM,UAAU,KAAK,KAAK,EAAE,KAAK,iBAAiB,eAAe,EAAG,SAAU,EAAG,CAAE,OAAO,EAAE,aAAe,CAAC,IAAG,UAAY,IAC7I,IAAI,KAAO,EAAE,KAAK,sBAAsB,EAAG,IAAM,CAAC,EAAG,IAAM,WAAW,CAAC,EACvE,MAAM,UAAU,QAAQ,KAAK,EAAE,IAAI,iBAAiB,2BAA2B,EAAG,SAAU,EAAG,CAC7F,IAAI,EAAI,+BAA+B,KAAK,EAAE,aAAa,GAAG,GAAK,EAAE,EAAG,EAAI,EAAE,cAAgB,EAAE,aAAa,EAAG,GAAI,GAAC,GAAK,CAAC,GAC3H,KAAI,EAAI,EAAE,IAAI,eAAe,EAAG,EAAE,EAAI,OAAO,EAAE,CAAC,CAAC,EAAG,EAAE,EAAI,OAAO,EAAE,CAAC,CAAC,EAAG,IAAI,KAAK,EAAE,gBAAgB,CAAC,CAAC,EACvG,CAAC,EACD,IAAI,GAAK,SAAU,EAAG,EAAG,CAAE,OAAQ,EAAE,CAAC,EAAI,EAAE,IAAM,EAAE,CAAC,EAAI,EAAE,IAAM,EAAE,CAAC,EAAI,EAAE,IAAM,EAAE,CAAC,EAAI,EAAE,EAAI,EACzF,MAAQ,CAAC,EACb,MAAM,UAAU,QAAQ,KAAK,EAAE,KAAK,iBAAiB,eAAe,EAAG,SAAU,EAAG,CAClF,IAAI,EAAI,OAAO,EAAG,EAAE,aAAa,UAAU,CAAC,EAAG,EAAI,GAAK,EAAE,cAAc,MAAM,EAAG,EAAI,GAAK,EAAE,cAAc,MAAM,EAAG,GAAI,CAAC,GAAK,CAAC,EAAG,CAAE,EAAE,MAAM,QAAU,OAAQ,MAAQ,CACrK,EAAE,MAAM,QAAU,GAClB,IAAI,KAAO,CAAE,CAAK,EAAG,MAAM,KAAK,IAAI,EAIpC,IAAI,EAAI,GAAK,uGAAuG,KAAK,EAAE,aAAa,GAAG,GAAK,EAAE,EAAG,EAAI,GAAK,EAAE,cAAgB,EAAE,aAAa,EAC/L,GAAI,GAAK,EAAG,CACV,IAAI,MAAQ,SAAU,EAAG,EAAG,CAAE,IAAI,EAAI,EAAE,IAAI,eAAe,EAAG,SAAE,EAAI,OAAO,CAAC,EAAG,EAAE,EAAI,OAAO,CAAC,EAAU,EAAE,gBAAgB,CAAC,CAAG,EACzH,EAAI,MAAM,EAAE,CAAC,EAAG,EAAE,CAAC,CAAC,EAAG,GAAK,MAAM,EAAE,CAAC,EAAG,EAAE,CAAC,CAAC,EAAG,GAAK,MAAM,EAAE,CAAC,EAAG,EAAE,CAAC,CAAC,EACpE,EAAI,SAAU,EAAG,CAAE,IAAI,GAAK,EAAE,EAAI,EAAE,EAAG,GAAK,EAAE,EAAI,EAAE,EAAG,EAAI,KAAK,KAAK,GAAK,GAAK,GAAK,EAAE,GAAK,EAAG,MAAO,CAAC,GAAK,EAAG,GAAK,CAAC,CAAG,EACvH,GAAK,EAAE,EAAE,EAAG,GAAK,EAAE,EAAE,EAAG,GAAK,CAAC,GAAG,CAAC,EAAI,GAAG,CAAC,EAAG,GAAG,CAAC,EAAI,GAAG,CAAC,CAAC,EAAG,GAAK,KAAK,KAAK,GAAG,CAAC,EAAI,GAAG,CAAC,EAAI,GAAG,CAAC,EAAI,GAAG,CAAC,CAAC,EAC7G,GAAI,GAAK,GAAK,CACZ,GAAK,CAAC,GAAG,CAAC,EAAI,GAAI,GAAG,CAAC,EAAI,EAAE,EAC5B,IAAI,EAAI,KAAK,IAAI,KAAK,IAAI,GAAG,EAAI,EAAE,CAAC,EAAI,KAAK,IAAI,GAAG,EAAI,EAAE,CAAC,EAAG,CAAC,EAAG,KAAO,CAAC,EAAE,EACxE,GAAK,WAAW,EAAG,EAAE,aAAa,UAAU,CAAC,EAC7C,KAAM,EAAI,GAAI,EAAI,GACtB,CAAC,GAAI,EAAE,EAAE,QAAQ,SAAU,EAAG,CAAE,IAAI,EAAI,CAAC,GAAG,CAAC,EAAI,IAAO,EAAE,CAAC,EAAI,IAAM,GAAG,CAAC,EAAI,IAAO,EAAE,CAAC,EAAI,GAAI,EAAG,EAAI,KAAK,KAAK,EAAE,CAAC,EAAI,EAAE,CAAC,EAAI,EAAE,CAAC,EAAI,EAAE,CAAC,CAAC,EAAG,KAAK,KAAK,CAAC,EAAE,CAAC,EAAI,EAAG,EAAE,CAAC,EAAI,CAAC,CAAC,CAAG,CAAC,EAC9K,IAAI,KAAO,CAAC,EACZ,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAG,EAAE,QAAQ,SAAU,EAAG,CAAE,KAAK,QAAQ,SAAU,EAAG,CAAE,KAAK,KAAK,CAAC,EAAE,EAAI,EAAE,CAAC,GAAK,EAAI,GAAI,EAAE,EAAI,EAAE,CAAC,GAAK,EAAI,EAAE,CAAC,CAAG,CAAC,CAAG,CAAC,EAI3I,IAAI,GAAK,EAAE,YAAc,EAAI,EAAG,GAAK,EAAE,aAAe,EAAI,EAAG,KAAO,CAAC,EACrE,CAAC,CAAC,GAAI,EAAE,EAAG,CAAC,GAAI,EAAE,CAAC,EAAE,QAAQ,SAAU,GAAI,CAAE,CAAC,EAAG,EAAG,EAAE,EAAE,QAAQ,SAAU,EAAG,CAAE,KAAK,KAAK,CAAC,EAAE,EAAI,GAAG,CAAC,GAAK,GAAG,CAAC,EAAI,GAAK,GAAG,CAAC,GAAK,GAAG,CAAC,EAAI,GAAI,EAAE,EAAI,GAAG,CAAC,GAAK,GAAG,CAAC,EAAI,GAAK,GAAG,CAAC,GAAK,GAAG,CAAC,EAAI,EAAE,CAAC,CAAG,CAAC,CAAG,CAAC,EAKnM,IAAI,KAAO,EAAI,EAAE,aAAe,EAAI,EACpC,KAAK,MAAQ,KAAK,CAAC,EACnB,KAAK,EAAI,CAAE,EAAG,EAAE,EAAI,GAAG,CAAC,GAAK,EAAI,IAAK,EAAG,EAAE,EAAI,GAAG,CAAC,GAAK,EAAI,IAAK,IAAK,CAAC,EAAE,EAAG,EAAE,CAAC,EAAG,IAAU,KAAY,KAAM,KAAM,GAAI,CAAC,EAAE,EAAG,EAAE,CAAC,EAAG,KAAM,CAAC,EAAG,GAAI,UAAU,CAAC,EAC3J,MAAO,SAAU,EAAG,CAAE,OAAO,GAAG,EAAG,CAAC,GAAK,KAAO,IAAM,EACtD,MAAO,SAAU,EAAG,CAAE,IAAI,GAAK,EAAE,CAAC,EAAI,EAAE,EAAG,GAAK,EAAE,CAAC,EAAI,EAAE,EAAG,EAAI,KAAK,KAAK,GAAK,GAAK,GAAK,EAAE,GAAK,EAAG,GAAK,GAAG,EAAG,CAAC,EAC7G,OAAQ,GAAK,GAAK,GAAG,CAAC,EAAI,GAAK,GAAG,CAAC,GAAK,GAAK,IAAO,IAAI,MAAM,SAAU,EAAG,CAAE,OAAO,GAAG,EAAG,CAAC,GAAK,GAAK,CAAG,CAAC,EAAI,EAAI,EAAI,CAAE,EAC3H,KAAK,GAAK,OAAO,OAAO,CAAC,EAAG,KAAK,EAAG,CAAE,KAAM,KAAK,OAAO,IAAI,EAAG,MAAO,SAAU,EAAG,CAAE,OAAO,GAAG,EAAG,CAAC,GAAK,GAAK,EAAI,CAAE,CAAC,EACpH,MACF,CACF,CACA,IAAI,EAAI,EAAE,sBAAsB,EAAG,KAAK,MAAQ,CAAC,EAAE,KAAO,EAAE,MAAQ,EAAG,EAAE,IAAM,EAAE,OAAS,CAAC,CAC7F,CAAC,EAID,IAAI,OAAS,CAAC,CAAC,CAAC,EAChB,MAAM,QAAQ,SAAU,EAAG,EAAG,CAAE,IAAI,EAAI,CAAC,EAAG,OAAO,QAAQ,SAAU,EAAG,CAAE,QAAS,EAAI,EAAG,GAAK,EAAE,OAAQ,IAAK,EAAE,KAAK,EAAE,MAAM,EAAG,CAAC,EAAE,OAAO,CAAC,CAAC,EAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAG,CAAC,EAAG,OAAS,CAAG,CAAC,EAC9K,IAAI,KAAO,SAAU,KAAM,CACzB,IAAI,IAAM,aAAa,EAAG,IAAI,EAAGE,UAAW,KAkB5C,GAjBA,MAAM,QAAQ,SAAU,EAAG,CAAM,EAAE,IAAK,EAAE,EAAE,KAAO,CAAC,EAAG,EAAE,GAAG,KAAO,EAAE,EAAE,KAAQ,CAAC,EAChF,OAAO,QAAQ,SAAU,MAAO,CAC9B,IAAI,KAAO,CAAC,EAAG,IAAM,CAAC,EAAG,IAAM,EAAG,IAAM,EAAG,IAAM,EAAG,IAAM,EAAG,MAAQ,EACrE,MAAM,QAAQ,SAAU,EAAG,CACzB,IAAI,EAAI,MAAM,CAAC,EAAG,EAAI,EAAE,EAAI,eAAe,EAAG,EAAE,EAAG,OAAO,OAAO,CAAE,IAAU,IAAW,EAAG,EAAE,CAAC,CAAC,EAAI,KACnG,GAAI,GAAK,EAAE,KAAO,EAAE,GAAI,CAAE,IAAI,GAAK,eAAe,EAAG,EAAE,EAAG,OAAO,OAAO,CAAE,IAAU,IAAW,EAAG,EAAE,EAAE,CAAC,EAAO,IAAM,MAAM,GAAI,CAAC,IAAG,EAAI,GAAI,CAC1I,IAAI,GAAK,EAAI,EAAE,EAAI,EAAE,MACjB,IAAK,OAAS,EAAE,EAAG,KAAO,EAAE,GAAI,KAAO,EAAE,GAAI,KAAO,EAAE,IAAM,EAAG,KAAO,EAAE,IAAM,GAClF,IAAI,CAAC,EAAI,GACT,IAAI,GAAK,EAAE,EAAE,YAAc,EAAG,GAAK,EAAE,EAAE,aAAe,EAAG,GAAK,QAAQ,CAAE,KAAM,GAAG,CAAC,EAAI,GAAI,MAAO,GAAG,CAAC,EAAI,GAAI,IAAK,GAAG,CAAC,EAAI,GAAI,OAAQ,GAAG,CAAC,EAAI,EAAG,EAAG,UAAU,EAAE,CAAC,CAAC,EAClK,KAAK,KAAK,CAAE,KAAM,GAAG,KAAM,MAAO,GAAG,MAAO,IAAK,GAAG,IAAK,OAAQ,GAAG,OAAQ,MAAO,GAAI,IAAK,GAAM,GAAI,EAAK,CAAC,CAC9G,CAAC,EACD,IAAI,IAAM,CAAE,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,EAAG,MAAO,GAAS,EAC/D,MAAM,IAAKA,SAAQ,IAAGA,UAAW,IACvC,CAAC,EAGGA,YAAaA,UAAS,GAAK,GAAKA,UAAS,GAAK,GAAKA,UAAS,GAAK,GAAI,CAAE,IAAI,KAAO,YAAY,EAAG,MAAO,GAAG,EAAO,MAAQ,MAAM,KAAMA,SAAQ,IAAGA,UAAW,KAAM,CAKtK,IAAI,OAAS,aAAa,EAAG,MAAO,IAAK,IAAI,EAC7C,GAAI,OAAQ,CAEV,QADI,GAAK,CAACA,UAAS,GAAIA,UAAS,GAAIA,UAAS,IAAM,EAAGA,UAAS,IAAM,CAAC,EAAG,GAAK,CAAC,OAAO,GAAI,OAAO,GAAI,OAAO,GAAI,OAAO,EAAE,EAAG,MAAQ,GAC3H,EAAI,EAAG,EAAI,EAAG,IAAK,GAAI,GAAG,CAAC,IAAM,GAAG,CAAC,EAAG,CAAE,MAAQ,GAAG,CAAC,EAAI,GAAG,CAAC,EAAG,KAAO,CAC7E,CAAC,OAASA,UAAS,EAAI,OAAO,EAAI,MAAKA,UAAW,OACxD,CACA,OAAOA,SACT,EAGI,SAAW,KAAK,EAAI,EACxB,GAAI,CAAC,WAAa,EAAE,EAAE,SAAW,YAAc,SAAS,GAAK,GAAK,SAAS,GAAK,GAAK,SAAS,GAAK,GAAI,CAAE,IAAI,OAAS,KAAK,EAAK,EAAO,MAAM,OAAQ,QAAQ,IAAG,SAAW,OAAQ,CACnL,MAAM,QAAQ,SAAU,EAAG,EAAG,CAAE,IAAI,GAAK,SAAS,IAAI,CAAC,EAAG,EAAE,EAAE,MAAM,KAAQ,GAAG,CAAC,EAAI,KAAK,KAAQ,KAAM,EAAE,EAAE,MAAM,IAAO,GAAG,CAAC,EAAI,KAAK,IAAO,IAAM,CAAC,EAGnJ,IAAI,KAAO,UAAU,CAAC,EAClB,WAAW,EAAG,IAAI,GAAG,YAAY,EAAG,IAAI,EAGxC,aAAc,CAAC,WAAW,EAAG,IAAI,GAAK,CAAC,cAAc,CAAC,KAC1D,MAAM,UAAU,QAAQ,KAAK,EAAE,KAAK,iBAAiB,eAAe,EAAG,SAAU,EAAG,CAAE,EAAE,cAAgB,EAAM,CAAC,EAC/G,YAAY,EAAG,CAAC,CAAC,EACjB,eAAe,EAAG,EAAI,GACxB,CACA,SAAS,UAAU,EAAG,MAAO,CAC3B,GAAI,GAAC,GAAK,CAAC,EAAE,MAAQ,CAAC,EAAE,OACxB,MAAM,UAAU,QAAQ,KAAK,EAAE,KAAK,iBAAiB,eAAe,EAAG,SAAU,EAAG,CAAE,EAAE,OAAO,CAAG,CAAC,EAC/F,SAAO,iBAAmB,OAAO,gBAAgB,IACrD,KAAI,IAAM,EAAE,EAAE,OAAQ,GAAM,MAAQ,SAAW,MAAQ,WAAa,MAAQ,UAC5E,IAAI,CAAC,SAAS,eAAe,mBAAmB,EAAG,CAAE,IAAI,GAAK,SAAS,cAAc,OAAO,EAAG,GAAG,GAAK,oBAAqB,GAAG,YAAc,eAAgB,SAAS,KAAK,YAAY,EAAE,CAAG,CAC5L,IAAI,OAAS,GACb,MAAM,UAAU,QAAQ,KAAK,EAAE,IAAI,iBAAiB,sBAAsB,EAAG,SAAU,EAAG,EAAG,CAC3F,IAAI,EAAI,MAAQ,QAAW,EAAI,KAAO,IAAO,EAAE,aAAa,gBAAgB,EAAG,EAAI,GAAK,SAAS,EAAG,CAAC,EACrG,GAAI,CAAC,EAAG,CAAM,IAAG,OAAS,IAAM,MAAQ,CACxC,IAAI,IAAM,SAAS,cAAc,cAAgB,EAAE,GAAK,IAAI,EAAG,IAAM,IAAM,IAAI,YAAY,KAAK,EAAI,uBAAwB,EAAI,OAAO,EAAG,CAAC,EACvI,EAAI,SAAS,cAAc,QAAQ,EAAG,EAAE,KAAO,SAAU,EAAE,UAAY,gBAAkB,IAAM,GAAK,YAAc,IAAK,EAAE,aAAa,WAAY,CAAC,EACvJ,IAAI,EAAI,IAAM,MAAQ,EAAI,QAAO,IAAM,GAAK,kBAAkB,IAAM,aACpE,EAAE,YAAc,EAAI,OAAK,EAAE,MAAQ,EAAG,EAAE,aAAa,aAAc,CAAC,EAAG,EAAE,aAAa,gBAAiB,QAAQ,EAC/G,EAAE,KAAK,YAAY,CAAC,EAAG,EAAE,UAAU,IAAI,WAAW,EAClD,EAAE,iBAAiB,QAAS,SAAU,EAAG,CAAE,EAAE,eAAe,EAAG,EAAE,gBAAgB,EAAQ,YAAY,CAAC,GAAG,cAAc,EAAG,EAAG,CAAC,CAAG,CAAC,EAClI,CAAC,cAAe,YAAa,YAAY,EAAE,QAAQ,SAAU,GAAI,CAAE,EAAE,iBAAiB,GAAI,SAAU,EAAG,CAAE,EAAE,gBAAgB,EAAG,UAAU,CAAC,CAAG,CAAC,CAAG,CAAC,CACnJ,CAAC,EAEG,SAAW,OAAS,GAAK,GAAG,WAAW,UAAY,CAAE,UAAU,GAAI,OAAS,GAAK,CAAC,CAAG,EAAG,CAAC,EAG7F,IAAI,MAAQ,UAAY,CAAE,GAAI,KAAK,EAAG,CAAE,WAAW,MAAO,GAAG,EAAG,MAAQ,CAAE,YAAY,CAAC,CAAG,EAC1F,eAAe,CAAC,EAAG,sBAAsB,KAAK,EAAG,WAAW,MAAO,GAAG,EAAG,WAAW,MAAO,GAAG,EAC9F,UAAU,CAAC,EAAG,eAAe,EAAG,IAAI,EAChC,OAAO,WAAW,CAAC,GACzB,CAGA,SAAS,WAAW,EAAG,CACjB,OAAO,iBAAmB,OAAO,gBAAgB,IACrD,EAAE,cAAgB,GACd,OAAO,OAAO,YAAe,YAAY,OAAO,WAAW,EACjE,CACA,OAAO,gBAAkB,UAAY,CACnC,IAAI,EAAI,OAAO,EAAG,MAAI,CAAC,GAAK,CAAC,EAAE,MAAQ,CAAC,EAAE,cAAsB,KACzD,EAAE,KAAK,iBAAiB,2DAA2D,EAAE,MAC9F,EAIA,SAAS,WAAW,EAAG,CACrB,IAAI,EAAI,EAAE,KAAK,sBAAsB,EACrC,OAAO,MAAM,UAAU,IAAI,KAAK,EAAE,KAAK,iBAAiB,sCAAsC,EAAG,SAAU,EAAG,CAAE,IAAI,EAAI,EAAE,sBAAsB,EAAG,OAAO,KAAK,MAAM,EAAE,KAAO,EAAE,IAAI,EAAI,IAAM,KAAK,MAAM,EAAE,IAAM,EAAE,GAAG,EAAI,IAAM,KAAK,MAAM,EAAE,KAAK,EAAI,IAAM,KAAK,MAAM,EAAE,MAAM,CAAG,CAAC,EAAE,KAAK,GAAG,CAC/R,CACA,SAAS,eAAe,EAAG,MAAO,CAChC,IAAI,IAAM,KAAK,IAAI,EAAI,MAAO,KAAO,EAAE,KAAM,MAAQ,WAAW,CAAC,EAAG,MAAQ,CAAC,EAC7E,KAAK,SAAW,MAChB,IAAI,KAAO,UAAY,CACrB,GAAI,OAAK,IAAI,EAAI,KAAO,EAAE,OAAS,MAAQ,CAAC,KAAK,aAAe,KAAK,WAAa,OAClF,IAAI,EAAE,OAAO,iBAAmB,OAAO,gBAAgB,IAAM,CAAC,KAAK,EAAG,CACpE,IAAI,EAAI,WAAW,CAAC,EAChB,IAAM,QAAS,YAAY,CAAC,EAAG,MAAQ,WAAW,CAAC,EACzD,CACA,sBAAsB,IAAI,EAC5B,EACA,sBAAsB,IAAI,CAC5B,CAIA,SAAS,UAAU,EAAG,CACpB,GAAI,GAAE,KAAK,SACX,GAAE,KAAK,SAAW,GAClB,IAAI,MAAQ,GAAO,KAAO,UAAY,CAAE,OAAO,OAAO,iBAAmB,OAAO,gBAAgB,CAAG,EAC/F,WAAa,UAAY,CAAE,GAAI,KAAK,EAAG,CAAE,QAAQ,EAAG,MAAQ,CAAE,IAAI,EAAI,OAAO,EAAO,GAAK,EAAE,MAAQ,EAAE,KAAO,CAAC,KAAK,GAAG,YAAY,CAAC,CAAG,EACrI,QAAU,UAAY,CAAM,OAAS,KAAK,IAAW,MAAQ,GAAM,sBAAsB,UAAY,CAAE,MAAQ,GAAO,WAAW,CAAG,CAAC,EAAG,EAI5I,GAHI,OAAO,kBAAkB,IAAI,iBAAiB,SAAU,GAAI,CAC1D,GAAG,KAAK,SAAU,EAAG,CAAE,OAAO,EAAE,OAAO,WAAa,GAAK,EAAE,OAAO,QAAQ,MAAM,CAAG,CAAC,GAAG,WAAW,CACxG,CAAC,EAAE,QAAQ,EAAE,KAAM,CAAE,WAAY,GAAM,gBAAiB,CAAC,QAAS,OAAO,EAAG,QAAS,EAAK,CAAC,EACvF,OAAO,eAAgB,CAAE,IAAI,GAAK,IAAI,eAAe,UAAY,CAAE,WAAW,CAAG,CAAC,EAAG,GAAG,QAAQ,EAAE,IAAI,EAAG,GAAG,QAAQ,EAAE,GAAG,CAAG,CAC5H,SAAS,OAAS,SAAS,MAAM,SAAW,UAAU,SAAS,MAAM,MAAM,KAAK,OAAO,EAC7F,CAEA,SAAS,YAAY,EAAG,CACtB,IAAI,EAAI,GAAI,EAAI,IAAK,EAAI,IAAK,IAAM,EAAI,KAAK,GAAK,IAAK,GAAK,EAAI,EAAI,KAAK,IAAI,GAAG,EAAG,GAAK,EAAI,EAAI,KAAK,IAAI,GAAG,EAAG,EAAI,GAC/G,GAAK,EAAI,EAAI,KAAK,IAAI,GAAG,EAAG,GAAK,EAAI,EAAI,KAAK,IAAI,GAAG,EACzD,MAAO,+FAAiG,EAAI,eAAc,SACxH,4BAA8B,EAAI,SAAW,EAAI,SAAW,EAAI,UAAY,EAAI,GAAK,mCACnD,EAAI,GAAK,IAAM,EAAI,MAAQ,EAAI,IAAM,EAAI,MAAQ,GAAG,QAAQ,CAAC,EAAI,IAAM,GAAG,QAAQ,CAAC,EAAI,6CACzF,EAAI,GAAK,IAAM,EAAI,MAAQ,EAAI,IAAM,EAAI,UAAY,GAAG,QAAQ,CAAC,EAAI,IAAM,GAAG,QAAQ,CAAC,EAAI,2CAC7F,EAAI,IAAM,SAAW,EAAI,IAAM,KAAO,EAAI,uCAC1C,EAAI,EAAI,GAAK,SAAW,EAAI,IAAM,yCACpE,CACA,SAAS,cAAc,EAAG,EAAG,GAAI,CAC/B,IAAI,EAAI,SAAS,EAAG,CAAC,EAAG,GAAK,EAC7B,KAAI,IAAM,SAAS,cAAc,cAAgB,EAAE,GAAK,IAAI,EAAG,IAAM,IAAM,IAAI,YAAY,KAAK,EAAI,uBAChG,EAAI,IAAI,EAAE,MAAQ,EAAE,KAAK,gBAAkB,EAAE,KAAK,eAAe,UAAU,EAAG,IAAM,KAAK,IAAI,GAAI,KAAK,IAAI,GAAI,KAAK,MAAM,OAAO,EAAG,CAAC,CAAC,CAAC,CAAC,EACvI,KAAO,SAAU,EAAG,CAAE,EAAE,MAAQ,OAAO,CAAC,EAAG,EAAE,cAAc,IAAI,MAAM,SAAU,CAAE,QAAS,EAAK,CAAC,CAAC,CAAG,EACpG,EAAE,WAAW,EAAE,UAAU,EAC7B,UAAY,EACZ,IAAI,GAAK,EAAE,WAAa,SAAS,eAAe,iBAAiB,EAAO,KAAI,GAAG,QAAU,GACrF,IAAM,OAAO,aACf,GAAG,UAAY,OAAO,WAAW,EAAG,UAAY,CAAE,KAAK,MAAQ,GAAK,GAAK,EAAE,CAAG,EAAG,GAAI,GAAI,MAAQ,EAAE,EACnG,GAAM,EAAE,MAAQ,EAAE,KAAK,cAAc,2BAA6B,EAAI,IAAI,GAAM,IAElF,YAAY,EAAG,CAAE,MAAO,IAAK,IAAK,qBAAqB,EAAI,EAAI,UAAS,KAAK,CAAC,EAAI,SAAM,IAAK,MAAO,yBAAsB,EAAI,EAAI,uBAAsB,IACtJ,OAAQ,CAAC,CAAE,GAAI,WAAY,MAAO,QAAS,MAAO,OAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,CAAE,CAAC,EAC3F,OAAQ,SAAU,EAAG,CAAE,OAAO,YAAY,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,CAAG,EAC7D,GAAI,SAAU,EAAG,CAAE,KAAK,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,CAAG,EAAG,MAAO,UAAY,CAAE,KAAK,EAAE,CAAG,EAAG,KAAM,GAAI,OAAQ,UAAY,CAAE,aAAa,CAAC,CAAG,CAAE,CAAC,EACxI,CACA,SAAS,aAAa,EAAG,CACvB,UAAY,KACZ,WAAW,UAAY,CAAE,IAAI,EAAI,OAAO,EAAG,EAAI,GAAK,EAAE,MAAQ,EAAE,KAAK,cAAc,2BAA6B,EAAI,IAAI,EAAG,GAAI,EAAG,GAAI,CAAE,EAAE,MAAM,CAAE,cAAe,EAAK,CAAC,CAAG,MAAa,CAAE,EAAE,MAAM,CAAG,CAAE,EAAG,EAAE,CAC7M,CACA,OAAO,iBAAiB,UAAW,SAAU,EAAG,CAC9C,GAAI,IAAE,MAAQ,UAAY,CAAC,WAC3B,KAAI,EAAI,SAAS,eAAe,iBAAiB,EAAG,EAAI,UACxD,GAAI,CAAC,GAAK,EAAE,UAAU,SAAS,QAAQ,GAAK,EAAE,UAAY,EAAG,CAAE,UAAY,KAAM,MAAQ,CACzF,WAAW,UAAY,CAAE,IAAI,EAAI,OAAO,EAAO,CAAC,EAAE,UAAU,SAAS,QAAQ,GAAK,GAAK,EAAE,gBAAgB,EAAE,eAAe,EAAG,aAAa,CAAC,CAAG,EAAG,EAAE,EACrJ,EAAG,EAAI,EACP,OAAO,iBAAiB,QAAS,SAAU,EAAG,CAC5C,IAAI,EAAI,EAAE,QAAU,EAAE,OAAO,SAAW,EAAE,OAAO,QAAQ,2BAA2B,EAAG,EAAI,SAAS,eAAe,iBAAiB,EAChI,CAAC,GAAK,CAAC,WAAa,CAAC,GAAK,EAAE,UAAY,WAC5C,aAAa,SAAS,CACxB,EAAG,EAAI,EAGP,OAAO,aAAe,SAAU,EAAG,EAAG,EAAG,KAAM,CAC7C,GAAI,GAAC,GAAK,CAAC,EAAE,GAAK,CAAC,EAAE,mBACrB,KAAI,EAAI,WAAW,EAAG,CAAC,EACvB,GAAI,IAAM,WAAY,CACpB,GAAI,CAAC,GAAK,EAAE,EAAE,IAAM,OAAQ,OAC5B,CAAC,OAAO,EAAG,EAAE,EAAE,CAAC,EAAG,QAAQ,EAAG,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,SAAU,EAAG,CAAM,GAAK,IAAM,GAAK,EAAE,EAAE,MAAM,CAAC,IAAM,UAAW,EAAE,EAAE,MAAM,CAAC,EAAI,WAAgB,EAAE,EAAE,SAAS,OAAO,EAAE,EAAE,QAAQ,CAAC,EAAK,CAAC,EACnL,MACF,CACK,IAAM,SAAW,IAAM,UAAa,CAAC,GAAM,IAAM,UAAY,CAAC,MAAM,CAAC,IAC1E,CAAC,OAAO,EAAG,EAAE,EAAE,CAAC,EAAG,QAAQ,EAAG,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,SAAU,EAAG,CACrD,CAAC,GAAK,IAAM,IACZ,EAAE,EAAE,MAAM,CAAC,IAAM,UAAW,EAAE,EAAE,MAAM,CAAC,EAAI,WAAgB,EAAE,EAAE,SAAS,OAAO,EAAE,EAAE,QAAQ,CAAC,GAC5F,IAAM,SAAW,EAAE,EAAE,MAAM,CAAC,IAAM,WAAU,EAAE,EAAE,MAAM,CAAC,EAAI,YACjE,CAAC,EACG,IAAM,WACP,EAAE,EAAE,cAAgB,EAAE,EAAE,eAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,EAAI,GACtD,EAAE,EAAE,YAAc,EAAE,EAAE,aAAe,CAAC,GAAG,EAAE,EAAE,CAAC,EAAI,OAAS,OAAS,OAAS,QAC1E,EAAE,EAAE,SAAS,OAAO,EAAE,EAAE,QAAQ,CAAC,IAEzC,EACA,SAAS,iBAAiB,QAAS,SAAU,EAAG,CAC9C,IAAI,EAAI,EAAE,QAAU,EAAE,OAAO,SAAW,EAAE,OAAO,QAAQ,yHAAyH,EAAG,GAAK,EAC1L,KAAI,EAAI,OAAO,EAAO,GAAG,OAAO,aAAa,EAAG,EAAE,WAAY,EAAE,aAAa,WAAW,EAAG,EAAE,aAAa,cAAc,CAAC,EAC3H,EAAG,EAAI,EAMP,SAAS,UAAU,IAAK,EAAG,EAAG,CAAE,OAAO,IAAM,OAAS,EAAI,EAAI,EAAI,SAAQ,IAAI,CAAC,EAAI,iBAAW,IAAI,EAAI,CAAC,EAAI,IAAM,IAAI,CAAC,GAAK,YAAM,CACjI,SAAS,SAAS,EAAG,CACnB,IAAI,EAAI,OAAO,CAAC,EAAE,QAAQ,OAAQ,GAAG,EAAE,KAAK,EAAG,EAAG,EAAI,SAAU,EAAG,CAAE,OAAO,KAAK,MAAM,WAAW,EAAE,QAAQ,SAAU,EAAE,EAAE,QAAQ,IAAK,GAAG,CAAC,EAAI,GAAG,CAAG,EACrJ,OAAK,EAAI,EAAE,MAAM,kDAAkD,GAAW,CAAE,IAAK,EAAE,CAAC,EAAG,EAAG,OAAO,EAAE,CAAC,CAAC,EAAG,EAAG,EAAE,EAAE,CAAC,CAAC,CAAE,GAClH,EAAI,EAAE,MAAM,kDAAkD,GAAW,CAAE,IAAK,EAAE,CAAC,EAAG,EAAG,OAAO,EAAE,CAAC,CAAC,EAAG,EAAG,EAAE,EAAE,CAAC,CAAC,CAAE,GAClH,EAAI,EAAE,MAAM,2BAA2B,GAAW,CAAE,IAAK,EAAE,CAAC,EAAG,EAAG,EAAG,EAAG,EAAE,EAAE,CAAC,CAAC,CAAE,EAC9E,IACT,CACA,SAAS,YAAY,GAAI,GAAI,EAAG,CAC9B,IAAI,KAAO,EACX,aAAM,UAAU,KAAK,KAAK,GAAG,iBAAiB,qBAAqB,EAAG,SAAU,GAAI,CAClF,IAAI,EAAI,SAAS,GAAG,WAAW,EAC/B,GAAI,CAAC,GAAK,CAAC,GAAG,KAAK,EAAE,GAAG,EAAG,MAAO,GAClC,KAAO,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,EAAE,CAAC,CAAC,EAAG,IAAI,EAAI,EAAE,EAAI,KACpD,OAAI,EAAI,EAAG,GAAG,YAAc,UAAU,EAAE,IAAK,EAAG,EAAE,CAAC,EAC9C,GAAG,WAAW,YAAY,EAAE,EAC1B,EACT,CAAC,EACM,IACT,CAEA,SAAS,aAAa,GAAI,EAAG,KAAM,EAAG,CACpC,IAAI,KAAO,EACX,aAAM,UAAU,KAAK,KAAK,GAAG,iBAAiB,qBAAqB,EAAG,SAAU,GAAI,CAClF,IAAI,EAAI,SAAS,GAAG,WAAW,EAC/B,GAAI,CAAC,GAAK,EAAE,MAAQ,gBAAkB,GAAG,aAAa,eAAe,EAAG,MAAO,GAC/E,KAAO,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,EAAE,CAAC,CAAC,EAAG,IAAI,EAAI,EAAE,EAAI,KACpD,OAAI,GAAK,OAAO,EAAE,iBAAmB,EAAE,kBAAoB,CAAC,GAAG,KAAK,MAAM,EAAE,iBAAkB,KAAK,MAAM,EAAG,IAAI,CAAC,EAC7G,EAAI,EAAG,GAAG,YAAc,UAAU,eAAgB,EAAG,EAAE,CAAC,EACvD,GAAG,WAAW,YAAY,EAAE,EAC1B,EACT,CAAC,EACM,IACT,CAIA,SAAS,cAAc,EAAG,CACpB,CAAC,SAAS,CAAC,GAAK,KAAK,CAAC,GAAK,OAAO,CAAC,GACvC,YAAY,SAAS,eAAe,YAAY,CAAC,CACnD,CAGA,SAAS,YAAY,GAAI,CACvB,IAAI,IAAM,IAAM,GAAG,cAAc,gCAAgC,EAAG,GAAK,IACzE,KAAI,IAAM,EAAG,EAAI,EAAG,KAAO,EAO3B,GANA,MAAM,UAAU,QAAQ,KAAK,GAAG,iBAAiB,qBAAqB,EAAG,SAAU,GAAI,CACrF,GAAI,KAAG,QAAU,GAAG,MAAM,UAAY,QAAW,GAAG,SAAW,GAAG,QAAQ,UAAU,GACpF,IAAI,GAAG,aAAa,cAAc,EAAG,CAAE,OAAQ,MAAQ,CACvD,IAAI,EAAI,GAAG,YAAY,QAAQ,OAAQ,GAAG,EAAE,MAAM,uCAAuC,EACrF,IAAK,IAAK,MAAQ,EAAE,CAAC,IAAM,IAAM,EAAI,IAAM,KAAK,MAAM,WAAW,EAAE,CAAC,EAAE,QAAQ,WAAY,EAAE,EAAE,QAAQ,IAAK,GAAG,CAAC,EAAI,GAAG,GAC5H,CAAC,EACG,CAAC,GAAK,CAAC,KAAM,CACf,IAAI,IAAM,GAAG,cAAc,sBAAsB,EAAG,MAAQ,MAAM,UAAU,MAAM,KAAK,GAAG,iBAAiB,kBAAkB,CAAC,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,QAAQ,UAAU,GAAK,EAAE,MAAQ,CAAC,EAC7L,KAAO,CAAC,MAAM,QAAU,IAAI,WAAW,aAAa,SAAS,eAAe,QAAG,EAAG,GAAG,EACzF,MACF,CAEA,IAAI,EAAI,EAAI,oBAAmB,SAAS,GAAG,EAAI,SAAM,0BACjD,IAAI,cAAgB,IAAG,IAAI,YAAc,GAC/C,CAEA,SAAS,YAAY,GAAI,EAAG,KAAM,CAChC,IAAI,GAAK,GAAG,cAAc,oCAAoC,EAC9D,GAAI,GAAI,CAAE,IAAI,GAAK,SAAS,cAAc,IAAI,EAAG,GAAG,YAAc,KAAM,GAAG,YAAY,EAAE,CAAG,MAE1F,GAAG,UAAY,yJACf,GAAG,cAAc,IAAI,EAAE,YAAc,KAEvC,IAAI,IAAM,GAAG,cAAc,gCAAgC,EACvD,MAAK,IAAI,YAAc,oBAAmB,SAAS,IAAI,EAAE,iBAAiB,CAAC,EAAI,SACrF,CACA,SAAS,SAAS,EAAG,CAAE,OAAQ,EAAI,EAAI,SAAM,KAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAG,CAMtE,SAAS,SAAS,EAAG,CACnB,OAAO,EAAE,SAAW,QAAU,CAAE,IAAK,IAAI,EAAE,EAAE,EAAI,IAAI,EAAE,EAAE,CAAE,EACvD,CAAE,EAAG,IAAI,EAAE,EAAE,EAAI,IAAI,EAAE,EAAE,EAAI,IAAI,EAAE,EAAE,EAAG,EAAG,IAAI,EAAE,EAAE,EAAI,IAAI,EAAE,EAAE,EAAG,EAAG,IAAI,EAAE,EAAE,EAAI,IAAI,EAAE,EAAE,CAAE,CACjG,CACA,SAAS,SAAS,EAAG,CACnB,IAAI,EAAI,EAAE,EAAG,IAAM,EAAE,OAAQ,KAAO,EAAE,eACtC,GAAI,MAAQ,SAAW,MAAQ,UAAW,CAAE,EAAE,eAAiB,KAAM,MAAQ,CAC7E,IAAI,KAAO,MAAQ,QAAU,CAAC,KAAM,IAAI,EAAI,CAAC,KAAM,KAAM,IAAI,EAAG,IAAM,KAAK,IAAI,SAAU,EAAG,CAAE,OAAO,IAAI,EAAE,CAAC,CAAC,CAAG,CAAC,EAC7G,MAAQ,KAAM,MAAQ,KAC1B,GAAI,CAAC,MAAQ,KAAK,MAAQ,IAAO,MAAQ,IAAI,CAAC,EAAG,MAAQ,SAAS,CAAC,MAEjE,SAAS,EAAI,EAAG,EAAI,KAAK,OAAQ,IAAK,GAAI,IAAI,CAAC,IAAM,KAAK,EAAE,CAAC,EAAG,CAAE,MAAQ,IAAI,CAAC,EAAG,MAAQ,KAAK,GAAI,KAAO,CAM5G,GADI,OAAS,MAAQ,SAAQ,MAAQ,MACjC,OAAS,KAAM,CACjB,KAAK,QAAQ,SAAU,EAAG,CAAE,EAAE,CAAC,EAAI,KAAO,CAAC,EACvC,MAAQ,QAAS,EAAE,GAAK,MAAM,IAAM,OACjC,EAAE,GAAK,MAAM,EAAI,EAAI,MAAO,EAAE,GAAK,MAAM,EAAI,MAAO,EAAE,GAAK,MAAM,EAAI,OAC5E,IAAI,EAAI,SAAS,eAAe,YAAY,EAAO,GAAK,EAAE,YAAY,EAAE,WAAW,YAAY,CAAC,CAClG,CACA,EAAE,eAAiB,CAAE,IAAU,EAAG,KAAK,IAAI,SAAU,EAAG,CAAE,OAAO,IAAI,EAAE,CAAC,CAAC,CAAG,CAAC,EAAG,GAAI,SAAS,CAAC,CAAE,CAClG,CAEA,SAAS,KAAK,EAAG,CACf,GAAI,GAAE,kBACN,GAAE,kBAAoB,GACtB,UAAU,CAAC,EAAG,UAAU,EAExB,IAAI,SAAW,EAAE,oBACjB,EAAE,oBAAsB,UAAY,CAClC,UAAU,IAAI,EACd,IAAI,EAAI,SAAS,MAAM,KAAM,SAAS,EAAG,EAAI,MAAM,IAAI,EACvD,GAAI,KAAK,mBAAoB,CAC3B,IAAI,IAAM,SAAS,eAAe,YAAY,EAAG,GAAK,KAAK,MAAM,IAAI,KAAK,MAAQ,KAAK,KAAK,gBAAkB,KAAK,KAAK,eAAe,KAAK,EAAI,GAAG,EAC/I,GAAK,IAAM,YAAY,IAAK,gBAAiB,KAAK,kBAAkB,EAAI,EAC5E,KAAK,EAAE,kBAAoB,OAAO,KAAK,EAAE,mBAAqB,CAAC,EAAI,GAAK,EAC1E,CACA,IAAK,IAAM,SAAW,IAAM,WAAa,IAAM,YAAc,CAAC,KAAK,IAAI,GAAK,CAAC,OAAO,IAAI,GAAK,SAAS,IAAI,EAAG,CAG3G,IAAI,GAAK,YAAY,IAAI,EACzB,GAAI,GAAI,CACN,GAAI,GAAG,GAAI,CACT,KAAK,EAAE,kBAAoB,OAAO,KAAK,EAAE,mBAAqB,CAAC,EAAI,GAAG,SACtE,IAAI,IAAM,SAAS,eAAe,YAAY,EAE1C,GAAK,KAAK,MAAM,GAAG,SAAW,GAAG,EAAE,EAAG,IAAM,GAAK,IAAM,IAAI,EAAE,EAAI,MAAM,GAAK,GAAG,EAAG,KAAO,KAAO,MAAM,KAAK,EAAI,4CAC/G,KAAK,YAAY,IAAK,KAAK,GAAI,GAAG,GAAK,EAAI,oBAAoB,KAAO,GAAG,GAAK,SAAQ,IAAM,iBAAW,mBAAmB,KAAO,KAAO,IAAI,GAAG,QAAQ,EAAI,QAAG,CACpK,CACA,KAAK,EAAE,kBAAoB,OAAO,KAAK,EAAE,mBAAqB,CAAC,EAAI,GAAG,YACtE,IAAI,GAAK,QAAQ,IAAI,EACrB,GAAI,GAAG,OAAQ,CACb,IAAI,KAAO,KAAM,GAAK,CAAC,EAQvB,GAPA,GAAG,QAAQ,SAAU,EAAG,CACtB,IAAI,EAAI,UAAU,KAAM,CAAC,EACzB,CAAC,SAAS,KAAM,CAAC,EAAG,GAAK,EAAE,CAAC,EAAE,QAAQ,SAAU,EAAG,CACjD,IAAI,GAAK,GAAK,KAAK,MAAQ,KAAK,KAAK,cAAc,oCAAsC,EAAI,IAAI,EAC7F,IAAM,GAAG,QAAQ,CAAC,EAAI,GAAK,KAAK,EAAE,aAAe,KAAK,EAAE,YAAY,CAAC,GAAK,GAAG,UAAU,SAAS,SAAS,GAAK,CAAC,SAAU,WAAY,gBAAgB,EAAE,QAAQ,GAAG,QAAQ,WAAW,EAAI,GAAG,GAAG,KAAK,CAAC,CAC3M,CAAC,CACH,CAAC,EACG,GAAG,OAAQ,CACb,KAAK,EAAE,kBAAoB,OAAO,KAAK,EAAE,mBAAqB,CAAC,EAAI,KAAK,MAAM,GAAG,OAAS,IAAI,KAAK,MAAQ,KAAK,KAAK,mBAAmB,EAAI,GAAG,EAC/I,IAAI,IAAM,SAAS,eAAe,YAAY,EAAO,KAAK,aAAa,IAAK,GAAG,OAAQ,GAAI,IAAI,CACjG,CAIA,IAAI,IAAM,SAAS,eAAe,YAAY,EAAG,IAAM,SAAU,EAAG,CAAE,OAAO,EAAI,EAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ,IAAK,GAAG,EAAI,MAAM,CAAC,CAAG,EAC5H,OAAS,SAAU,GAAI,CACzB,GAAI,WAAW,KAAM,EAAE,EAAG,MAAO,WAAa,MAAM,KAAK,EAAI,oBAC7D,IAAI,GAAK,QAAQ,KAAM,EAAE,EAAG,OAAQ,GAAuB,GAAG,MAAQ,QAAQ,IAAI,EAAE,GAAG,IAAI,EAAI,oCAAmC,kCAAzF,kBAC3C,EACI,KAAK,GAAG,MAAM,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,KAAO,EAAE,WAAa,CAAG,CAAC,EAAE,QAAQ,SAAU,EAAG,CAChG,IAAI,EAAI,MAAM,KAAM,EAAE,IAAM,EAAE,EAAG,EAAI,IAAI,CAAC,EAAI,IAAM,OAAO,CAAC,EAAI,uBAAmB,OAAO,EAAE,EAAE,EAAI,IAC9F,EAAI,EAAE,IAAM,EAAI,iDAA6C,IAAI,KAAK,MAAM,EAAE,WAAa,EAAE,CAAC,EAAI,YAAW,IAAI,EAAE,OAAO,EAAI,aAAU,IAAI,EAAE,KAAK,EAAI,UACvJ,EAAI,gBAAe,KAAK,EAAE,UAAU,EAAI,WAAU,KAAK,EAAE,CAAC,EAAI,WAAU,MAAM,EAAE,EAAE,EAAI,mBAAa,IAAI,EAAE,KAAK,EAAI,UACtH,YAAY,IAAK,KAAK,EAAG,CAAC,EAC1B,IAAI,IAAM,IAAI,iBAAiB,uCAAuC,EAAG,GAAK,IAAI,IAAI,OAAS,CAAC,EAAO,IAAI,GAAG,aAAa,eAAgB,GAAG,CAChJ,CAAC,EACG,KAAK,YAAY,GAAG,CAC1B,CACF,CACF,UAAY,IAAM,SAAW,IAAM,YAAc,CAAC,KAAK,IAAI,GAAK,CAAC,OAAO,IAAI,EAAG,CAC7E,IAAI,EAAI,YAAY,IAAI,EACxB,GAAI,GAAK,EAAE,iBAAkB,CAC3B,KAAK,EAAE,kBAAoB,OAAO,KAAK,EAAE,mBAAqB,CAAC,EAAI,EAAE,iBACrE,IAAI,GAAK,SAAS,eAAe,YAAY,EAGzC,IAAI,YAAY,GAAI,KAAK,GAAI,EAAE,MAAQ,EAAI,qBAAqB,MAAM,EAAI,YAAW,EAAE,MAAQ,iDAA6C,oBAAoB,MAAM,EAAI,oDAC5K,SAAS,EAAE,gBAAgB,EAAI,QAAG,CACtC,CACF,CAKA,GAAI,CAAC,KAAK,IAAI,EAAG,CACf,IAAI,GAAK,KAAK,EAAG,MAAQ,KAAM,IAAM,SAAS,eAAe,YAAY,EAAG,MAAQ,UAAU,IAAI,EAC9F,MAAQ,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,QAAU,QAAU,EAAE,KAAO,GAAK,aAAe,EACvF,MAAQ,MAAM,IAAI,EAAE,OAAO,KAAK,EAChC,UAAY,IAAI,KAAK,MAAQ,KAAK,KAAK,mBAAmB,EAG1D,QAAU,MAAM,OAAO,SAAU,EAAG,CAAE,OAAO,GAAG,aAAe,GAAG,YAAY,EAAE,CAAC,CAAG,CAAC,EAAE,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,CAAG,CAAC,EAAG,OAAS,QAAQ,OAC3I,IAAO,OAAa,IAAM,aAAa,IAAK,OAAQ,QAAS,IAAI,EAAI,OAArD,EACpB,MAAM,IAAI,EAAE,QAAQ,SAAU,EAAG,EAC3B,EAAE,IAAM,OAAS,CAAC,MAAM,CAAC,EAAI,EAAE,EAAE,KAAO,MAE5C,GAAG,kBAAoB,OAAO,GAAG,mBAAqB,CAAC,EAAI,KAAK,MAAM,EAAE,KAAO,GAAG,EAG9E,KAAO,EAAE,KAAO,GAAG,YAAY,IAAK,GAAI,UAAU,MAAO,CAAC,EAAI,OAAS,IAAI,KAAK,MAAM,EAAE,KAAO,GAAG,CAAC,EAAI,YAAI,EACjH,CAAC,EACD,GAAG,kBAAoB,OAAO,GAAG,mBAAqB,CAAC,EAAI,KAAK,MAAM,IAAM,UAAY,GAAG,EAE3F,MAAM,IAAI,EAAE,QAAQ,SAAU,EAAG,CAC/B,IAAI,GAAK,KAAK,MAAM,cAAc,MAAO,CAAC,EAAI,GAAG,EAAS,GAAK,IAC/D,GAAG,kBAAoB,OAAO,GAAG,mBAAqB,CAAC,EAAI,GACvD,KAAK,YAAY,IAAK,GAAI,YAAc,QAAQ,EAAE,GAAG,EAAI,UAAY,QAAQ,CAAC,EAAI,QAAU,IAAI,EAAE,EAAI,SAAI,EAChH,CAAC,EACD,WAAW,IAAI,EAAE,QAAQ,SAAU,EAAG,CACpC,GAAG,kBAAoB,OAAO,GAAG,mBAAqB,CAAC,EAAI,KAAK,MAAM,EAAE,KAAO,GAAG,EAC9E,KAAK,YAAY,IAAK,GAAI,UAAU,MAAO,CAAC,EAAI,OAAS,IAAI,KAAK,MAAM,EAAE,KAAO,GAAG,CAAC,EAAI,YAAI,CACnG,CAAC,EAGD,IAAI,GAAK,YAAY,IAAI,EAAG,QAAU,MAAM,IAAI,EAAE,OAAO,SAAU,EAAG,CAAE,OAAQ,EAAE,IAAM,QAAU,EAAE,IAAM,WAAc,GAAG,EAAE,CAAC,GAAK,EAAE,IAAM,SAAY,GAAG,aAAe,GAAG,YAAY,EAAE,CAAC,CAAG,CAAC,EAAE,IAAI,SAAU,EAAG,CAAE,OAAO,EAAE,CAAG,CAAC,EAAG,OAAS,QAAQ,OACrP,GAAI,OAAQ,CAAE,IAAI,GAAK,IAAM,aAAa,IAAK,OAAQ,QAAS,IAAI,EAAI,OAAQ,GAAG,kBAAoB,OAAO,GAAG,mBAAqB,CAAC,EAAI,KAAK,MAAM,GAAK,UAAY,GAAG,CAAG,CACzK,MAAQ,MAAM,QAAU,SAAS,YAAY,GAAG,CACtD,CAIA,IAAI,GAAK,KAAK,IAAI,EAAI,KAAO,KAAK,IAAI,EACtC,GAAI,GAAI,CACN,KAAK,EAAE,kBAAoB,OAAO,KAAK,EAAE,mBAAqB,CAAC,EAAI,GAAG,iBACtE,IAAI,IAAM,SAAS,eAAe,YAAY,EAC9C,GAAI,IAAK,CACP,IAAI,GAAK,GAAG,MAAQ,WAAa,GAAG,MAAQ,yCAAqC,YAAY,KAAM,EAAE,EAAI,2CAAuC,MAAM,GAAG,CAAC,EAAI,UAAY,YACtK,GAAG,QAAU,MAAQ,MAAQ,YAAc,+CAA0C,IAAM,IAAI,cAAc,kBAAkB,EACnI,GAAI,KAAO,IAAI,cAAc,IAAI,EAAG,CAAE,IAAI,IAAM,SAAS,cAAc,IAAI,EAAG,IAAI,YAAc,GAAI,IAAI,OAAS,GAAM,IAAI,MAAM,QAAU,OAAQ,IAAI,aAAa,cAAe,MAAM,EAAG,IAAI,YAAY,GAAG,CAAG,MAC3M,IAAI,UAAY,8GAA0G,IAAI,cAAc,IAAI,EAAE,YAAc,EACzK,CACF,CAGA,GAAI,CACF,GAAI,CAAC,KAAK,IAAI,GAAK,KAAK,IAAI,EAAG,CAC7B,IAAI,IAAM,SAAS,eAAe,YAAY,EAAG,GAAK,oEACtD,GAAI,IAAK,CACP,IAAI,IAAM,IAAI,cAAc,oCAAoC,EAC5D,IAAM,KAAO,MAAM,UAAU,KAAK,KAAK,IAAI,iBAAiB,IAAI,EAAG,SAAU,GAAI,CAAE,MAAO,CAAC,GAAG,QAAU,GAAG,MAAM,UAAY,MAAQ,CAAC,EAC1I,GAAI,IAAK,CAAE,IAAI,IAAM,SAAS,cAAc,IAAI,EAAG,IAAI,YAAc,GAAI,IAAI,OAAS,GAAM,IAAI,MAAM,QAAU,OAAQ,IAAI,aAAa,cAAe,MAAM,EAAG,IAAI,YAAY,GAAG,CAAG,MAChL,IAAI,UAAY,8GAA0G,IAAI,cAAc,IAAI,EAAE,YAAc,EACzK,CACF,CACF,MAAY,CAAC,CACb,GAAI,CAAE,WAAW,CAAG,MAAY,CAAC,CAGjC,IAAI,MAAQ,KAAM,eAAQ,QAAQ,EAAE,KAAK,UAAY,CAAE,GAAI,CAAE,cAAc,KAAK,CAAG,MAAY,CAAC,CAAE,CAAC,EAC5F,CACT,EAEA,IAAI,QAAU,EAAE,OACZ,OAAO,SAAY,aAAY,EAAE,OAAS,SAAU,EAAG,EAAG,EAAG,EAAG,GAAI,KAAM,OAAQ,CAAE,OAAC,KAAK,SAAW,KAAK,UAAY,CAAC,GAAG,EAAE,EAAI,CAAE,KAAY,MAAe,EAAU,QAAQ,MAAM,KAAM,SAAS,CAAG,GAK3M,CAAC,eAAgB,cAAe,UAAW,SAAS,EAAE,QAAQ,SAAU,GAAI,CAC1E,IAAI,EAAI,EAAE,EAAE,EAAO,OAAO,GAAM,aAChC,EAAE,EAAE,EAAI,UAAY,CAClB,IAAI,EAAI,KAAK,EAAG,GAAK,EAAE,YAAc,EAAE,aAAe,CAAC,EAAG,IAAM,CAAC,EACjE,GAAI,CACF,IAAI,GAAK,KAAK,IAAI,EAClB,GAAI,EAAE,IAAM,GAAG,OAAS,SAAU,CAAE,IAAI,GAAK,YAAY,IAAI,EAAG,MAAM,IAAI,EAAE,QAAQ,SAAU,EAAG,EAAO,EAAE,IAAM,WAAa,GAAG,EAAE,CAAC,IAAM,CAAC,GAAG,EAAE,CAAC,IAAK,GAAG,EAAE,CAAC,EAAI,GAAM,IAAI,KAAK,EAAE,CAAC,EAAK,CAAC,CAAG,CAC5L,OAAS,EAAG,CAAE,QAAQ,KAAK,cAAe,CAAC,CAAG,CAC9C,IAAI,KAAO,KACX,GAAI,CAAE,OAAO,EAAE,MAAM,KAAM,SAAS,CAAG,QAAE,CACvC,IAAI,QAAQ,SAAU,EAAG,CACvB,GAAG,CAAC,EAAI,GACR,IAAI,GAAK,KAAK,MAAQ,KAAK,KAAK,cAAc,oCAAsC,EAAI,IAAI,EAAO,IAAI,GAAG,UAAU,OAAO,SAAS,CACtI,CAAC,CACH,CACF,EACF,CAAC,EACD,IAAI,WAAa,EAAE,OACnB,EAAE,OAAS,UAAY,CACrB,UAAU,IAAI,EAAG,UAAU,EAAG,OAAO,IAAI,EAAG,QAAQ,IAAI,EACxD,IAAI,EAAI,KAAK,EAAG,IAAM,EAAE,OACpB,QAAU,EAAE,MAAQ,EAAE,KAAK,GAAG,IAAM,CAAC,SAAW,UAAU,IAAI,GAAK,QAAO,EAAE,KAAK,GAAG,EAAI,CAAC,GAI7F,IAAI,OAAS,OAAS,QAClB,KAAK,gBAAkB,MACrB,QAAU,KAAK,gBAAkB,MAAQ,SAAW,MAAQ,WAAa,MAAQ,UAAY,MAAQ,aAAc,EAAE,YAAc,CAAC,EAAG,EAAE,kBAAoB,CAAC,EAAG,EAAE,SAAW,CAAC,GACnL,KAAK,cAAgB,KAEnB,QAAU,CAAC,OAAO,IAAI,GAAG,KAAK,GAAG,EAAE,QAAQ,SAAU,EAAG,CAAM,EAAE,aAAa,OAAO,EAAE,YAAY,CAAC,EAAO,EAAE,mBAAmB,OAAO,EAAE,kBAAkB,CAAC,CAAG,CAAC,EAEnK,GAAI,CAAM,QAAQ,SAAS,IAAI,EAAG,UAAU,IAAI,EAAG,YAAY,IAAI,EAAG,UAAU,IAAI,EAAG,UAAU,IAAI,EAAG,eAAe,IAAI,EAAG,aAAa,IAAI,CAAG,OAAS,EAAG,CAAE,QAAQ,KAAK,cAAe,CAAC,CAAG,CAGhM,GAAI,CAAM,OAAO,OAAO,kBAAqB,YAAY,OAAO,iBAAiB,IAAI,CAAG,OAAS,EAAG,CAAE,QAAQ,KAAK,cAAe,CAAC,CAAG,CAElI,SAAW,aAAe,KAAK,OAAM,KAAK,KAAK,sBAAwB,QAAQ,IAAI,EAAI,KAAK,IAAI,SAAU,IAAI,EAAE,CAAC,CAAC,EAAI,UAEtH,SAAS,IAAI,GAAK,KAAK,OAAM,KAAK,KAAK,sBAAwB,GACnE,GAAI,CAAE,eAAe,IAAI,CAAG,OAAS,EAAG,CAAE,QAAQ,KAAK,cAAe,CAAC,CAAG,CAC1E,UAAU,IAAI,EACd,IAAI,GAAK,UAAY,CAAC,EAAG,IAAM,UAAY,CAAC,EAAG,GAAK,UAAY,CAAC,EAAG,GAAK,UAAY,CAAC,EAAG,EACzF,GAAI,CAAE,IAAI,GAAK,YAAY,IAAI,EAAO,KAAI,IAAM,gBAAgB,KAAM,EAAE,EAAG,OAAS,EAAG,CAAE,QAAQ,KAAK,cAAe,CAAC,CAAG,CACzH,GAAI,CAAE,IAAI,GAAK,UAAU,IAAI,EAAO,KAAI,GAAK,GAAI,OAAS,EAAG,CAAE,QAAQ,KAAK,cAAe,CAAC,CAAG,CAC/F,GAAI,CAAE,GAAK,YAAY,IAAI,CAAG,OAAS,EAAG,CAAE,QAAQ,KAAK,cAAe,CAAC,CAAG,CAC5E,GAAI,CAAE,IAAI,GAAK,eAAe,IAAI,EAAO,KAAI,GAAK,GAAI,OAAS,EAAG,CAAE,QAAQ,KAAK,cAAe,CAAC,CAAG,CACpG,GAAI,CAAE,EAAI,WAAW,MAAM,KAAM,SAAS,CAAG,QAAE,CAAU,GAAG,EAAG,GAAG,EAAG,GAAG,EAAG,IAAI,CAAG,CAClF,GAAI,CAAE,GAAI,YAAY,IAAI,EAAG,CAAE,IAAI,KAAO,KAAM,WAAW,UAAY,CAAE,KAAK,OAAO,CAAG,EAAG,CAAC,CAAG,CAAE,OAAS,EAAG,CAAE,QAAQ,KAAK,cAAe,CAAC,CAAG,CAC/I,GAAI,KAAK,UAAW,CAAE,IAAI,GAAK,KAAK,UAAW,KAAK,UAAY,KAAM,WAAW,UAAY,CAAE,UAAU,EAAE,CAAG,EAAG,CAAC,CAAG,CACrH,GAAI,CAAE,MAAM,IAAI,EAAE,QAAQ,SAAU,EAAG,CAAM,EAAE,IAAM,QAAU,EAAE,cAAa,EAAE,YAAY,EAAE,CAAC,EAAI,GAAO,CAAC,CAAG,MAAY,CAAC,CAC3H,GAAI,CAAM,IAAM,GAAG,MAAQ,EAAE,aAAa,OAAO,KAAK,GAAG,IAAI,EAAE,QAAQ,SAAU,EAAG,CAAE,IAAI,EAAI,EAAE,YAAY,CAAC,GAAK,KAAK,MAAQ,KAAK,KAAK,cAAc,4CAA8C,EAAI,IAAI,EAAQ,IAAG,EAAE,YAAY,CAAC,EAAI,GAAO,EAAG,IAAI,CAAG,MAAY,CAAC,CACzQ,GAAI,CAAE,UAAU,OAAS,IAAM,KAAM,OAAO,IAAI,CAAC,EAAG,WAAW,IAAI,EAAG,OAAO,IAAI,EAAG,SAAS,IAAI,EAAG,WAAW,IAAI,EAAG,SAAS,IAAI,EAAG,WAAW,EAAG,OAAO,IAAI,EAAG,UAAU,IAAI,EAAG,WAAW,EAAG,cAAc,IAAI,CAAG,OAAS,EAAG,CAAE,QAAQ,KAAK,cAAe,CAAC,CAAG,CACpQ,GAAI,CAAE,UAAU,IAAI,CAAG,OAAS,EAAG,CAAE,QAAQ,KAAK,qBAAsB,CAAC,CAAG,CAC5E,GAAI,CAAE,YAAY,IAAI,CAAG,OAAS,EAAG,CAAE,QAAQ,KAAK,qBAAsB,CAAC,CAAG,CAC9E,GAAI,CAAE,UAAU,IAAI,CAAG,OAAS,EAAG,CAAE,QAAQ,KAAK,mCAAiC,CAAC,CAAG,CACvF,GAAI,CAAE,WAAW,IAAI,CAAG,MAAY,CAAC,CACrC,OAAO,CACT,EAEA,IAAI,IAAM,EAAE,cACR,OAAO,KAAQ,aAAY,EAAE,cAAgB,SAAU,KAAM,OAAQ,IAAK,CAC5E,YAAc,KAAM,UAAY,KAAU,KAAK,YAAW,KAAK,UAAU,QAAU,MACnF,IAAI,EAAI,KAAK,EAAE,MAAM,GAAG,EAAG,GAAM,IAAM,SAAY,IAAM,UAAY,MAAM,IAAI,EAAM,WAAW,KAAM,GAAG,EAAI,KACzG,CAAC,IAAM,IAAM,UAAY,MAAM,IAAI,IAAG,GAAK,UAAU,KAAM,GAAG,GAClE,IAAI,EAAI,GAAK,GAAG,EAAI,KAChB,EAAI,IAAI,MAAM,KAAM,SAAS,EACjC,GAAI,EAAG,GAAI,CAAE,YAAY,KAAM,IAAK,EAAG,EAAG,KAAM,GAAK,GAAG,KAAO,CAAC,CAAG,OAAS,EAAG,CAAE,QAAQ,KAAK,cAAe,CAAC,CAAG,CACjH,OAAO,CACT,GACA,CAAC,4BAA6B,wBAAyB,kBAAkB,EAAE,QAAQ,SAAU,GAAI,CAC/F,IAAI,EAAI,EAAE,EAAE,EAAO,OAAO,GAAM,aAChC,EAAE,EAAE,EAAI,UAAY,CAAE,IAAI,EAAI,EAAE,MAAM,KAAM,SAAS,EAAG,GAAI,CAAE,SAAS,IAAI,EAAG,WAAW,CAAG,MAAY,CAAC,CAAE,OAAO,CAAG,EACvH,CAAC,EAED,IAAI,UAAY,EAAE,wBACd,OAAO,WAAc,aAAY,EAAE,wBAA0B,gBAAkB,CACjF,UAAU,IAAI,EACd,IAAI,EAAI,MAAM,UAAU,MAAM,KAAM,SAAS,EAAG,EAAI,MAAM,IAAI,EAC9D,GAAI,CACE,IAAM,IAAM,SAAW,IAAM,WAAa,IAAM,YAAc,OAAO,IAAI,GAAG,OAAO,EAAE,SACzF,IAAI,GAAK,KAAK,IAAI,EAAI,KAAO,KAAK,IAAI,EACtC,GAAI,IAAM,IAAM,SAAW,IAAM,WAAc,IAAM,WAAa,SAAS,IAAI,GAAK,CAGlF,IAAI,MAAQ,SAAU,GAAI,QAAS,CAAM,KAAI,EAAE,YAAiB,IAAQ,UAAS,EAAE,aAAkB,QAAS,EAC1G,GAAI,MAAM,UAAU,IAAI,EAAG,UAAU,KAAM,EAAI,CAAC,EAC3C,SAAS,IAAI,EAAG,MAAM,YAAY,KAAM,EAAK,EAAG,YAAY,KAAM,EAAI,CAAC,EACvE,UAAU,IAAI,GAAK,MAAM,MAAM,aAAa,KAAM,EAAI,EAAG,aAAa,IAAI,CAAC,CACtF,CACA,GAAI,GAAK,IAAM,GAAG,SAIhB,GAHA,EAAE,YAAc,0BAAsB,4BAAyB,GAAK,YAAY,KAAM,EAAE,EAAI,cAAgB,iCAAgC,MAAM,GAAG,CAAC,EAAI,QAAU,YAAc,MAAQ,GAAG,MAC7L,EAAE,MAAW,cAAa,MAAM,GAAG,CAAC,EAAI,QAAU,YAAc,OAAS,GAAG,IAAM,GAAG,IAAI,SAAW,GAAG,OACnG,GAAG,MAAK,EAAE,KAAU,6DAAmD,GAAG,MAAQ,gBAAe,IAAI,GAAG,IAAI,QAAQ,EAAI,YACxH,GAAG,OAAS,UAAW,CACzB,IAAI,GAAK,CAAC,EAAE,KAAK,EAAE,aAAe,KAAK,EAAE,YAAY,QAAU,SAAS,IAAI,EAAG,GAAK,CAAC,EAAE,KAAK,EAAE,aAAe,KAAK,EAAE,YAAY,QAAU,SAAS,IAAI,EACvJ,EAAE,OAAY,CAAC,yBAA0B,6BAA0B,EAAE,OAAO,GAAK,CAAC,0BAAoB,EAAI,CAAC,EAAG,GAAK,CAAC,yBAAmB,EAAI,CAAC,CAAC,EAAE,KAAK,KAAK,EACzJ,EAAE,MAAW,cAAa,MAAM,GAAG,CAAC,EAAI,QAAU,aAAe,GAAG,YAAc,GAAG,EAAI,mBAAkB,MAAM,GAAG,SAAS,EAAI,MAAQ,IAAM,MAAQ,GAAG,QAC5J,UACS,GAAK,IAAM,WAAa,SAAS,IAAI,EAAG,CACjD,IAAI,IAAM,YAAY,IAAI,EAAG,GAAK,KAAO,IAAI,MAAM,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,KAAO,EAAE,GAAK,CAAC,EAAE,CAAC,EAChG,KAAI,EAAE,KAAU,4FAA4E,IAAI,KAAK,MAAM,GAAG,WAAa,EAAE,CAAC,EAAI,aACnI,GAAG,QAAU,EAAI,GAAG,QAAQ,QAAQ,CAAC,EAAE,QAAQ,IAAK,GAAG,EAAI,MAAM,GAAG,OAAO,GAAK,aAAU,IAAI,GAAG,QAAQ,EAAI,uBAAiB,IAAI,GAAG,QAAQ,EAAI,WACtJ,CACI,GAAK,IAAM,CAAC,GAAG,UACjB,EAAE,WAAW,EAAI,GAAG,MAAQ,WAAa,GAAG,MAAQ,OAAS,MAAM,GAAG,CAAC,EAAI,mDAA+C,GAAG,MACzH,WAAa,MAAM,GAAG,CAAC,EAAI,+CAA2C,GAAG,MAC7E,EAAE,MAAW,GAAG,MAAQ,cAAa,GAAG,MAAQ,OAAS,MAAM,GAAG,CAAC,EAAI,kCAAoC,GAAG,MAC1G,cAAa,MAAM,GAAG,CAAC,EAAI,2BAA6B,GAAG,OAEjE,IAAI,GAAK,KAAK,IAAI,EAAI,CAAC,EAAI,MAAM,IAAI,EAAE,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,MAAQ,CAAC,EAAE,OAAO,WAAW,IAAI,CAAC,EAAG,GAAK,KAIlH,GAAK,SAAU,EAAG,EAAG,CAAE,OAAO,EAAI,EAAE,OAAO,CAAC,EAAE,YAAY,EAAI,EAAE,MAAM,CAAC,EAAI,CAAG,EAAG,MAAQ,SAAU,EAAG,CAAE,OAAO,EAAE,IAAM,QAAU,CAAC,EAAE,QAAU,EAC9I,GAAK,GAAG,OAAO,KAAK,EAAG,GAAK,GAAG,OAAO,SAAU,EAAG,CAAE,MAAO,CAAC,MAAM,CAAC,CAAG,CAAC,EACxE,GAAK,GAAG,SAAQ,EAAE,OAAY,GAAG,IAAI,SAAU,EAAG,EAAG,CAAE,OAAO,GAAG,UAAU,GAAI,CAAC,EAAI,MAAQ,YAAY,CAAC,EAAG,CAAC,CAAG,CAAC,EAAE,KAAK,KAAK,GAC7H,GAAK,GAAG,SAAQ,EAAE,mBAAmB,EAAI,GAAG,IAAI,SAAU,EAAG,EAAG,CAAE,OAAO,GAAG,UAAU,GAAI,CAAC,EAAI,MAAQ,YAAY,CAAC,EAAG,CAAC,CAAG,CAAC,EAAE,KAAK,KAAK,EAC9I,MAAY,CAAC,CACb,OAAO,CACT,GACA,UAAU,EAAG,WAAW,EACxB,GAAI,CAAE,EAAE,OAAO,CAAG,MAAY,CAAC,EACjC,CAGA,OAAO,iBAAiB,QAAS,SAAU,EAAG,CAC5C,GAAM,EAAE,QAAU,EAAE,OAAO,SAAW,EAAE,OAAO,QAAQ,eAAe,EACtE,KAAI,EAAI,OAAO,EAAG,GAAI,GAAC,GAAK,CAAC,EAAE,GAAK,CAAC,EAAE,mBACvC,WAAU,CAAC,EACX,IAAI,GAAK,UAAU,CAAC,EAAE,OAAO,SAAU,EAAG,CAAE,MAAO,CAAC,EAAE,EAAI,CAAC,EAC3D,GAAK,GAAG,OACR,GAAE,eAAe,EAAG,EAAE,gBAAgB,EAAG,EAAE,yBAAyB,EACpE,IAAI,GAAK,GAAG,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,OAAS,CAAC,EAAE,CAAC,EACpD,IAAM,GAAG,IAAI,SAAU,EAAG,CAAE,OAAO,OAAO,EAAE,OAAO,EAAE,QAAQ,SAAU,EAAE,CAAG,CAAC,EAAE,KAAK,KAAK,EACzF,OAAO,QAAQ,OAAO,OAAO,MAAM,GAAK,GAAG,QAAU,sCAAsC,KAAO,SAAS,KAAK,GAAG,EAAI,GAAK,KAAM,QAAS,GAAI,IACrJ,EAAG,EAAI,EAEP,IAAI,MAAQ,EAAG,MAAQ,YAAY,UAAY,CAC7C,IAAI,EAAI,OAAO,EACX,GAAK,EAAE,GAAK,EAAE,QAAU,EAAE,qBAAuB,cAAc,KAAK,EAAG,KAAK,CAAC,GACxE,EAAE,MAAQ,KAAK,cAAc,KAAK,CAC7C,EAAG,EAAE,CACP,GAAG",
  "names": ["cb", "joints", "PAIRES", "b", "u", "t", "s", "C", "P", "v", "murs", "dessin", "c", "q", "i", "bon", "meilleur"]
}
