diff --git a/modele-social/CHANGELOG.md b/modele-social/CHANGELOG.md index a609c59a0..c21e7596b 100644 --- a/modele-social/CHANGELOG.md +++ b/modele-social/CHANGELOG.md @@ -1,13 +1,19 @@ # Journal des modifications -## 1.4.2 +## 1.5.0 + +- Mise à jour des modalités de calcul de la cotisation maladie pour les indépendant, suite à la loi portant les mesures d’urgence pour la protection du pouvoir d’achat d’août 2022. +- Correction des calculs des assiette du conjoint collaborateur +- Mise à jour des modalités de calcul des cotisations CIPAV en 2023 suite au passage du recouvrement à l’Urssaf +- Ajoute la question sur les activités saisonnières pour le calcul des cotisations sans assiette minimale pour les indeps -Mise à jour des modalités de calcul de la cotisation maladie pour les indépendant, suite à la loi portant les mesures d’urgence pour la protection du pouvoir d’achat d’août 2022. ### Détails : - Déprécie la règle : `dirigeant . indépendant . cotisations et contributions . maladie . réduction supplémentaire` - Met à jour les descriptions des cotisation indépendant - Met à jour les formules de `dirigeant . indépendant . cotisations et contributions . maladie`, `dirigeant . indépendant . PL . maladie` et `dirigeant . indépendant . cotisations et contributions . indemnités journalières maladie` +- Correction de l’exonération incapacité de la CNAVPL +- Ajoute la règle : `entreprise . activité . saisonière` ## 1.4.1 diff --git a/modele-social/règles/dirigeant/indépendant.yaml b/modele-social/règles/dirigeant/indépendant.yaml index 901fa791f..c7d7a20d3 100644 --- a/modele-social/règles/dirigeant/indépendant.yaml +++ b/modele-social/règles/dirigeant/indépendant.yaml @@ -117,7 +117,12 @@ dirigeant . indépendant . cotisations et contributions: réduction ACRE. dirigeant . indépendant . assiette minimale: - non applicable si: situation personnelle . RSA + non applicable si: + une de ces conditions: + - une de ces conditions: + - situation personnelle . RSA + - entreprise . activité . saisonnière + - entreprise . activité . saisonnière valeur: oui description: | Si le revenu du chef d'entreprise est déficitaire ou inférieur aux bases de calcul, certaines cotisations seront portées à un montant minimum. @@ -487,7 +492,10 @@ dirigeant . indépendant . cotisations et contributions . maladie: arrondi: 2 décimales réduction supplémentaire: - non applicable si: situation personnelle . RSA + non applicable si: + une de ces conditions: + - situation personnelle . RSA + - entreprise . activité . saisonnière applicable si: date < 01/2022 titre: réduction supplémentaire (avant 2022) déprécié: oui @@ -749,14 +757,16 @@ dirigeant . indépendant . cotisations et contributions . exonérations . pensio avec: retraite complémentaire: - non applicable: PL . CNAVPL # Non applicable pour les professions libérales reglementées + non applicable si: PL . CNAVPL # Non applicable pour les professions libérales reglementées remplace: retraite complémentaire valeur: retraite complémentaire * prorata indemnités journalières maladie: - non applicable: PL . CNAVPL remplace: indemnités journalières maladie - valeur: indemnités journalières maladie * prorata + variations: + - si: PL . CNAVPL . indemnités journalières maladie + alors: PL . CNAVPL . indemnités journalières maladie * prorata + - sinon: indemnités journalières maladie * prorata maladie: remplace: maladie @@ -768,7 +778,7 @@ dirigeant . indépendant . cotisations et contributions . exonérations . pensio prorata: privé: oui - valeur: durée / 1 an + valeur: 100% - durée / 1 an unité: '%' dirigeant . indépendant . cotisations et contributions . exonérations . ZFU . taux: diff --git a/modele-social/règles/dirigeant/professions-libérales/CARCDSF.yaml b/modele-social/règles/dirigeant/professions-libérales/CARCDSF.yaml index b950062e9..4d99a7d13 100644 --- a/modele-social/règles/dirigeant/professions-libérales/CARCDSF.yaml +++ b/modele-social/règles/dirigeant/professions-libérales/CARCDSF.yaml @@ -11,6 +11,7 @@ dirigeant . indépendant . PL . CARCDSF: Site Web: http://www.carcdsf.fr dirigeant . indépendant . PL . CARCDSF . retraite complémentaire: + non applicable si: CNAVPL . exonération incapacité remplace: cotisations et contributions . retraite complémentaire formule: somme: diff --git a/modele-social/règles/dirigeant/professions-libérales/CARMF.yaml b/modele-social/règles/dirigeant/professions-libérales/CARMF.yaml index 08913f896..1b786b52d 100644 --- a/modele-social/règles/dirigeant/professions-libérales/CARMF.yaml +++ b/modele-social/règles/dirigeant/professions-libérales/CARMF.yaml @@ -44,6 +44,7 @@ dirigeant . indépendant . PL . CARMF . participation CPAM retraite: Avenant 5 à la convention médical: https://www.ameli.fr/sites/default/files/Documents/434342/document/avis_relatif_a_lavenant_ndeg_5_a_la_convention_nationale_organisant_les_rapports_entre_les_medecins_liberaux_et_lassurance_maladie.pdf dirigeant . indépendant . PL . CARMF . retraite complémentaire: + non applicable si: CNAVPL . exonération incapacité remplace: cotisations et contributions . retraite complémentaire description: >- La CARMF gère le régime de retraite complémentaire. diff --git a/modele-social/règles/dirigeant/professions-libérales/CARPIMKO.yaml b/modele-social/règles/dirigeant/professions-libérales/CARPIMKO.yaml index aa961af89..dcca438f2 100644 --- a/modele-social/règles/dirigeant/professions-libérales/CARPIMKO.yaml +++ b/modele-social/règles/dirigeant/professions-libérales/CARPIMKO.yaml @@ -7,6 +7,7 @@ dirigeant . indépendant . PL . CARPIMKO: dirigeant . indépendant . PL . CARPIMKO . retraite complémentaire: remplace: cotisations et contributions . retraite complémentaire + non applicable si: CNAVPL . exonération incapacité formule: somme: - variations: diff --git a/modele-social/règles/dirigeant/professions-libérales/CAVP.yaml b/modele-social/règles/dirigeant/professions-libérales/CAVP.yaml index 973c83347..59d952e6c 100644 --- a/modele-social/règles/dirigeant/professions-libérales/CAVP.yaml +++ b/modele-social/règles/dirigeant/professions-libérales/CAVP.yaml @@ -40,6 +40,7 @@ dirigeant . indépendant . PL . CAVP . cotisation de référence: site cavp.fr: https://www.cavp.fr/votre-profil/pharmacien-en-activite/vos-cotisations-regime-complementaire dirigeant . indépendant . PL . CAVP . retraite complémentaire: + non applicable si: CNAVPL . exonération incapacité remplace: cotisations et contributions . retraite complémentaire formule: part géré par répartition + part géré par capitalisation références: diff --git a/modele-social/règles/dirigeant/professions-libérales/CIPAV.yaml b/modele-social/règles/dirigeant/professions-libérales/CIPAV.yaml index 4e9de4423..b9f88d9e5 100644 --- a/modele-social/règles/dirigeant/professions-libérales/CIPAV.yaml +++ b/modele-social/règles/dirigeant/professions-libérales/CIPAV.yaml @@ -24,6 +24,13 @@ dirigeant . indépendant . PL . option régime général: par défaut: non dirigeant . indépendant . PL . CIPAV: + une de ces conditions: + - métier = 'rattaché CIPAV' + - toutes ces conditions: + - entreprise . date de création < 01/2019 + - option régime général = non + - entreprise . activité . nature . libérale . réglementée = non + description: | La CIPAV est la caisse de retraite autonomes des professions libérales réglementées. remplace: @@ -33,17 +40,11 @@ dirigeant . indépendant . PL . CIPAV: Site web: https://www.lacipav.fr/ article de loi (chercher "travailleurs indépendants créant leur activité"): https://www.legifrance.gouv.fr/eli/loi/2017/12/30/CPAX1725580L/jo/texte#JORFARTI000036339157 guide pratique CIPAV 2022: https://www.lacipav.fr/sites/default/files/2022-01/Guide%20pratique%202022%20-%20Professionnels%20lib%C3%A9raux%20-%20La%20Cipav_0.pdf - formule: - une de ces conditions: - - métier = 'rattaché CIPAV' - - toutes ces conditions: - - entreprise . date de création < 01/2019 - - option régime général = non - - entreprise . activité . nature . libérale . réglementée = non dirigeant . indépendant . PL . CIPAV . retraite complémentaire: unité: €/an arrondi: oui + non applicable si: CNAVPL . exonération incapacité variations: - si: date < 01/2023 alors: avant 2023 @@ -63,7 +64,6 @@ dirigeant . indépendant . PL . CIPAV . retraite complémentaire: avant 2023: privé: oui applicable si: date < 01/2023 - remplace: retraite complémentaire non applicable si: exonération incapacité unité: €/an variations: diff --git a/modele-social/règles/dirigeant/professions-libérales/CNAVPL.yaml b/modele-social/règles/dirigeant/professions-libérales/CNAVPL.yaml index 0b44a4f9c..04dd44256 100644 --- a/modele-social/règles/dirigeant/professions-libérales/CNAVPL.yaml +++ b/modele-social/règles/dirigeant/professions-libérales/CNAVPL.yaml @@ -4,10 +4,10 @@ dirigeant . indépendant . PL . CNAVPL: l'organisme qui fédère les différentes caisses existantes (CIPAV, CARPIMKO, CARCDSF, CAVEC etc..) non applicable si: régime général + valeur: oui rend non applicable: règle: situation personnelle . RSA dans: dirigeant . indépendant . cotisations et contributions - valeur: oui références: liste des caisses: https://www.cnavpl.fr/regimes-complementaires-et-prevoyance/ Guide CNAVPL (PDF): https://www.cnavpl.fr/wp-content/uploads/2022/03/guideweb-2022.pdf @@ -89,13 +89,7 @@ dirigeant . indépendant . PL . CNAVPL . exonération incapacité: Si vous avez été atteint d’une incapacité d’exercice de votre profession pendant au moins six mois, vous êtes alors exonéré du paiement des cotisations du régime général et du régime complémentaire rend non applicable: - - CAVP - - CARMF - - CARPIMKO - - CARCDSF - - CIPAV - CNAVPL . retraite - - cotisations et contributions . PCV - cotisations et contributions . retraite de base - cotisations et contributions . retraite complémentaire diff --git a/modele-social/règles/dirigeant/professions-libérales/profession-libérale.yaml b/modele-social/règles/dirigeant/professions-libérales/profession-libérale.yaml index 482622803..a34b15c20 100644 --- a/modele-social/règles/dirigeant/professions-libérales/profession-libérale.yaml +++ b/modele-social/règles/dirigeant/professions-libérales/profession-libérale.yaml @@ -108,10 +108,9 @@ dirigeant . indépendant . PL . régime général: C'est le cas des professions libérales non règlementées crées avant le 01/2019, ou celles ayant exercé leur [droit d'option](/documentation/dirigeant/indépendant/PL/option-régime-général) - formule: - toutes ces conditions: - - CIPAV = non - - entreprise . activité . nature . libérale . réglementée = non + toutes ces conditions: + - CIPAV = non + - entreprise . activité . nature . libérale . réglementée = non dirigeant . indépendant . PL . régime général . taux spécifique retraite complémentaire: question: Avez-vous opté pour des taux spécifiques de cotisation retraite complémentaire ? diff --git a/modele-social/règles/entreprise/activité.yaml b/modele-social/règles/entreprise/activité.yaml index 67a380a74..7069920e2 100644 --- a/modele-social/règles/entreprise/activité.yaml +++ b/modele-social/règles/entreprise/activité.yaml @@ -159,3 +159,18 @@ entreprise . activité . débit de tabac: applicable si: activité . nature = 'commerciale' question: Exercez-vous une activité de vente de tabac ? par défaut: non + +entreprise . activité . saisonnière: + question: Exercez-vous une activité saisonnière ? + par défaut: non + description: | + Les professionnels exerçant une activité saisonnière peuvent bénéficier + d’une dispense de minimale pour les cotisations d’indeminités journalières, + de retraite de base et di’nvalidité-décès. + + Ainsi, si votre revenu est inférieur à l’assiette minimale de cotisations, + vous cotisez sur votre revenu réel. + + Vous pouvez demander l‘application de cette dispense depuis votre espace en urssaf: Messagerie > Nouveau message > Un autre sujet (informations, documents ou justificatifs) > Demander des informations sur mon compte ou un récapitulatif > Faire une demande ou un complément de demande » + + > À noter : l’assiette minimale pour la retraite de base permet de garantir la validation de 3 trimestres d’assurance vieillesse. diff --git a/site/source/locales/rules-en.yaml b/site/source/locales/rules-en.yaml index 40788ef07..7df2529da 100644 --- a/site/source/locales/rules-en.yaml +++ b/site/source/locales/rules-en.yaml @@ -1796,28 +1796,6 @@ dirigeant . indépendant . PL . CIPAV: dirigeant . indépendant . PL . CIPAV . conjoint collaborateur: titre.en: '[automatic] collaborating spouse' titre.fr: conjoint collaborateur -dirigeant . indépendant . PL . CIPAV . conjoint collaborateur . invalidité et décès: - titre.en: '[automatic] disability and death' - titre.fr: invalidité et décès -dirigeant . indépendant . PL . CIPAV . conjoint collaborateur . pourcentage: - titre.en: '[automatic] percentage' - titre.fr: pourcentage -dirigeant . indépendant . PL . CIPAV . conjoint collaborateur . proportion: - question.en: '[automatic] What proportion of income does the spouse contribute - to the CIPAV supplementary plan and the CIPAV disability-death plan?' - question.fr: À quelle proportion du revenu le conjoint cotise-t'il pour le - régime complémentaire et le régime d'invalidité-décès CIPAV ? - titre.en: '[automatic] proportion' - titre.fr: proportion -dirigeant . indépendant . PL . CIPAV . conjoint collaborateur . proportion . moitié: - titre.en: '[automatic] 50 %' - titre.fr: 50 % -dirigeant . indépendant . PL . CIPAV . conjoint collaborateur . proportion . quart: - titre.en: '[automatic] 25 %' - titre.fr: 25 % -dirigeant . indépendant . PL . CIPAV . conjoint collaborateur . retraite complémentaire: - titre.en: '[automatic] supplementary pension' - titre.fr: retraite complémentaire dirigeant . indépendant . PL . CIPAV . exonération incapacité: titre.en: '[automatic] disability exemption' titre.fr: exonération incapacité @@ -2737,80 +2715,9 @@ dirigeant . indépendant . conjoint collaborateur . assiette: question.fr: Sur quelle base le conjoint cotise-t'il ? titre.en: '[automatic] Choice of plate' titre.fr: Choix assiette -dirigeant . indépendant . conjoint collaborateur . assiette . forfaitaire: - description.en: > - [automatic] The collaborating spouse will pay contributions - equivalent to a lump sum professional income - - fixed at 1/3 of the social security ceiling, - - with the exception of the daily allowance contribution which is calculated on - - a base equivalent to 40% of the PASS. - description.fr: | - Le conjoint collaborateur paiera des cotisations équivalentes à un revenu - professionnel forfaitaire, fixé à 1/3 du plafond de la sécurité sociale, - à l’exception de la cotisation indemnités journalières qui est calculée sur - une assiette équivalente à 40% du PASS. - titre.en: '[automatic] lump sum' - titre.fr: forfaitaire -dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage: - question.en: '[automatic] What proportion of income does the spouse contribute?' - question.fr: À quelle proportion du revenu le conjoint cotise-t'il ? - titre.en: '[automatic] Proportion of income' - titre.fr: Proportion revenu -dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage . moitié: - titre.en: '[automatic] 1/2' - titre.fr: 1/2 -dirigeant . indépendant . conjoint collaborateur . assiette . pourcentage . tiers: - titre.en: '[automatic] 1/3' - titre.fr: 1/3 -dirigeant . indépendant . conjoint collaborateur . assiette . revenu avec partage: - description.en: > - [automatic] The collaborating spouse and the manager will each - pay social contributions on a share of the professional income. - - **This option reduces the amount of contributions to be paid by the manager, but it also reduces his social counterparts (retirement pension, death benefit, etc.)**. - description.fr: > - Le conjoint collaborateur et le gérant paieront des cotisations - sociales chacun sur une part du revenu professionnel. - - **Cette option baisse le montant des cotisations à payer pour le gérant, mais elle diminue également ses contreparties sociales (pension de retraite, indemnité décès, etc)** - titre.en: '[automatic] split income' - titre.fr: revenu avec partage -dirigeant . indépendant . conjoint collaborateur . assiette . revenu avec partage . assiette gérant: - titre.en: "[automatic] manager's plate" - titre.fr: assiette gérant -dirigeant . indépendant . conjoint collaborateur . assiette . revenu sans partage: - description.en: '[automatic] The collaborating spouse will pay social security - contributions calculated on a percentage basis of the contribution base of - the manager of the company.' - description.fr: Le conjoint collaborateur paiera des cotisations sociales - calculées sur une base d'un pourcentage du assiette des cotisations du - gérant de l'entreprise. - titre.en: '[automatic] undivided income' - titre.fr: revenu sans partage dirigeant . indépendant . conjoint collaborateur . cotisations: titre.en: '[automatic] contributions' titre.fr: cotisations -dirigeant . indépendant . conjoint collaborateur . cotisations . assiette: - titre.en: '[automatic] plate' - titre.fr: assiette -dirigeant . indépendant . conjoint collaborateur . cotisations . assiette retraite: - titre.en: '[automatic] pension base' - titre.fr: assiette retraite -dirigeant . indépendant . conjoint collaborateur . cotisations . indemnités journalières maladie: - titre.en: '[automatic] daily sickness benefits' - titre.fr: indemnités journalières maladie -dirigeant . indépendant . conjoint collaborateur . cotisations . invalidité et décès: - titre.en: '[automatic] disability and death' - titre.fr: invalidité et décès -dirigeant . indépendant . conjoint collaborateur . cotisations . retraite complémentaire: - titre.en: '[automatic] supplementary pension' - titre.fr: retraite complémentaire -dirigeant . indépendant . conjoint collaborateur . cotisations . retraite de base: - titre.en: '[automatic] basic retirement' - titre.fr: retraite de base dirigeant . indépendant . cotisations et contributions: description.en: > [automatic] This is the total amount due by the self-employed @@ -4156,6 +4063,47 @@ entreprise . activité . nature . libérale . réglementée: question.fr: Est-ce une activité libérale réglementée ? titre.en: '[automatic] regulated' titre.fr: réglementée +entreprise . activité . saisonnière: + description.en: > + [automatic] Professionals working in a seasonal activity can + benefit from + + a minimum exemption for the contributions of daily allowances, + + basic pension and disability-death contributions. + + + Thus, if your income is lower than the minimum contribution base + + you contribute on your actual income. + + + You can request the application of this exemption from your space in urssaf: Messaging > New message > Another subject (information, documents or proofs) > Request information on my account or a summary > Make a request or an additional request " + + + > Note: the minimum base for the basic pension guarantees the validation of 3 quarters of old age insurance. + description.fr: > + Les professionnels exerçant une activité saisonnière peuvent + bénéficier + + d’une dispense de minimale pour les cotisations d’indeminités journalières, + + de retraite de base et di’nvalidité-décès. + + + Ainsi, si votre revenu est inférieur à l’assiette minimale de cotisations, + + vous cotisez sur votre revenu réel. + + + Vous pouvez demander l‘application de cette dispense depuis votre espace en urssaf: Messagerie > Nouveau message > Un autre sujet (informations, documents ou justificatifs) > Demander des informations sur mon compte ou un récapitulatif > Faire une demande ou un complément de demande » + + + > À noter : l’assiette minimale pour la retraite de base permet de garantir la validation de 3 trimestres d’assurance vieillesse. + question.en: '[automatic] Do you have a seasonal activity?' + question.fr: Exercez-vous une activité saisonnière ? + titre.en: '[automatic] seasonal' + titre.fr: saisonnière entreprise . activité . service ou vente: question.en: '[automatic] What type of business is the company in?' question.fr: Quelle est le type d'activité de l'entreprise ? diff --git a/site/source/pages/Simulateurs/configs/indépendant.ts b/site/source/pages/Simulateurs/configs/indépendant.ts index 74201a445..901892cbc 100644 --- a/site/source/pages/Simulateurs/configs/indépendant.ts +++ b/site/source/pages/Simulateurs/configs/indépendant.ts @@ -48,6 +48,7 @@ export const configIndépendant: SimulationConfig = { ], 'non prioritaires': [ 'dirigeant . indépendant . cotisations facultatives', + 'entreprise . activité . saisonnière', 'dirigeant . indépendant . IJSS', 'dirigeant . indépendant . PL . PAMC . IJSS', 'dirigeant . indépendant . PL . CNAVPL . exonération incapacité', diff --git a/site/test/regressions/__snapshots__/simulations-indépendant.test.ts.snap b/site/test/regressions/__snapshots__/simulations-indépendant.test.ts.snap index 215013d3b..7abb56aba 100644 --- a/site/test/regressions/__snapshots__/simulations-indépendant.test.ts.snap +++ b/site/test/regressions/__snapshots__/simulations-indépendant.test.ts.snap @@ -14,14 +14,14 @@ impôt . montant: 9189" exports[`calculate simulations-indépendant > activité 1`] = ` "dirigeant . indépendant . cotisations et contributions . début activité: null -dirigeant . indépendant . revenu professionnel: 20723 -dirigeant . rémunération . cotisations: 6740 +dirigeant . indépendant . revenu professionnel: 20771 +dirigeant . rémunération . cotisations: 8503 dirigeant . rémunération . net: 20000 -dirigeant . rémunération . net . après impôt: 19244 -dirigeant . rémunération . totale: 26740 +dirigeant . rémunération . net . après impôt: 19236 +dirigeant . rémunération . totale: 28503 entreprise . charges: 0 -entreprise . chiffre d'affaires: 26740 -impôt . montant: 756" +entreprise . chiffre d'affaires: 28503 +impôt . montant: 764" `; exports[`calculate simulations-indépendant > activité 2`] = ` diff --git a/site/test/regressions/__snapshots__/simulations-professions-libérales.test.ts.snap b/site/test/regressions/__snapshots__/simulations-professions-libérales.test.ts.snap index 208b89bff..2ab869434 100644 --- a/site/test/regressions/__snapshots__/simulations-professions-libérales.test.ts.snap +++ b/site/test/regressions/__snapshots__/simulations-professions-libérales.test.ts.snap @@ -6,7 +6,7 @@ dirigeant . rémunération . net: 5000 dirigeant . rémunération . net . après impôt: 5000 entreprise . chiffre d'affaires: 6222 impôt . montant: 0 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 24 protection sociale . retraite . trimestres: 3" `; @@ -16,7 +16,7 @@ dirigeant . rémunération . net: 20000 dirigeant . rémunération . net . après impôt: 19253 entreprise . chiffre d'affaires: 24544 impôt . montant: 747 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 95 protection sociale . retraite . trimestres: 4" `; @@ -26,7 +26,7 @@ dirigeant . rémunération . net: 50000 dirigeant . rémunération . net . après impôt: 40828 entreprise . chiffre d'affaires: 71074 impôt . montant: 9172 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 291 protection sociale . retraite . trimestres: 4 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; @@ -37,7 +37,7 @@ dirigeant . rémunération . net: 60000 dirigeant . rémunération . net . après impôt: 47656 entreprise . chiffre d'affaires: 92227 impôt . montant: 12344 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 409 protection sociale . retraite . trimestres: 4 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; @@ -48,7 +48,7 @@ dirigeant . rémunération . net: 60000 dirigeant . rémunération . net . après impôt: 47662 entreprise . chiffre d'affaires: 91510 impôt . montant: 12338 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 409 protection sociale . retraite . trimestres: 4 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; @@ -59,7 +59,7 @@ dirigeant . rémunération . net: 60000 dirigeant . rémunération . net . après impôt: 47665 entreprise . chiffre d'affaires: 91185 impôt . montant: 12335 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 409 protection sociale . retraite . trimestres: 4 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; @@ -70,7 +70,7 @@ dirigeant . rémunération . net: 60000 dirigeant . rémunération . net . après impôt: 47648 entreprise . chiffre d'affaires: 93267 impôt . montant: 12352 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 410 protection sociale . retraite . trimestres: 4 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; @@ -81,7 +81,7 @@ dirigeant . rémunération . net: 60000 dirigeant . rémunération . net . après impôt: 47663 entreprise . chiffre d'affaires: 91448 impôt . montant: 12337 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 409 protection sociale . retraite . trimestres: 4 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; @@ -92,7 +92,7 @@ dirigeant . rémunération . net: 1000 dirigeant . rémunération . net . après impôt: 1000 entreprise . chiffre d'affaires: 2772 impôt . montant: 0 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 5 protection sociale . retraite . trimestres: 3" `; @@ -102,18 +102,18 @@ dirigeant . rémunération . net: 60000 dirigeant . rémunération . net . après impôt: 47637 entreprise . chiffre d'affaires: 94556 impôt . montant: 12363 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 410 protection sociale . retraite . trimestres: 4 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; exports[`calculate simulations-professions-libérales > CIPAV exonération incapacité 1`] = ` -"dirigeant . indépendant . cotisations et contributions: 7418 +"dirigeant . indépendant . cotisations et contributions: 7053 dirigeant . rémunération . net: 40000 -dirigeant . rémunération . net . après impôt: 34021 -entreprise . chiffre d'affaires: 47418 -impôt . montant: 5979 -protection sociale . retraite . complémentaire: undefined +dirigeant . rémunération . net . après impôt: 34024 +entreprise . chiffre d'affaires: 47053 +impôt . montant: 5976 +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 0 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; @@ -124,7 +124,7 @@ dirigeant . rémunération . net: 10000 dirigeant . rémunération . net . après impôt: 10000 entreprise . chiffre d'affaires: 13434 impôt . montant: 0 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 48 protection sociale . retraite . trimestres: 4" `; @@ -134,7 +134,7 @@ dirigeant . rémunération . net: 50000 dirigeant . rémunération . net . après impôt: 40828 entreprise . chiffre d'affaires: 71074 impôt . montant: 9172 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 291 protection sociale . retraite . trimestres: 4 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; @@ -145,7 +145,7 @@ dirigeant . rémunération . net: 100000 dirigeant . rémunération . net . après impôt: 72415 entreprise . chiffre d'affaires: 146865 impôt . montant: 27585 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 874 protection sociale . retraite . trimestres: 4 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; @@ -156,7 +156,7 @@ dirigeant . rémunération . net: 500 dirigeant . rémunération . net . après impôt: 500 entreprise . chiffre d'affaires: 1423 impôt . montant: 0 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 2 protection sociale . retraite . trimestres: 3" `; @@ -166,7 +166,7 @@ dirigeant . rémunération . net: 1000 dirigeant . rémunération . net . après impôt: 1000 entreprise . chiffre d'affaires: 2024 impôt . montant: 0 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 5 protection sociale . retraite . trimestres: 3" `; @@ -176,7 +176,7 @@ dirigeant . rémunération . net: 1500 dirigeant . rémunération . net . après impôt: 1500 entreprise . chiffre d'affaires: 2624 impôt . montant: 0 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 7 protection sociale . retraite . trimestres: 3" `; @@ -186,7 +186,7 @@ dirigeant . rémunération . net: 2000 dirigeant . rémunération . net . après impôt: 2000 entreprise . chiffre d'affaires: 3226 impôt . montant: 0 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 10 protection sociale . retraite . trimestres: 3" `; @@ -196,7 +196,7 @@ dirigeant . rémunération . net: 5000 dirigeant . rémunération . net . après impôt: 5000 entreprise . chiffre d'affaires: 6846 impôt . montant: 0 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 24 protection sociale . retraite . trimestres: 3" `; @@ -206,7 +206,7 @@ dirigeant . rémunération . net: 10000 dirigeant . rémunération . net . après impôt: 10000 entreprise . chiffre d'affaires: 13434 impôt . montant: 0 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 48 protection sociale . retraite . trimestres: 4" `; @@ -216,7 +216,7 @@ dirigeant . rémunération . net: 100000 dirigeant . rémunération . net . après impôt: 72415 entreprise . chiffre d'affaires: 146865 impôt . montant: 27585 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 874 protection sociale . retraite . trimestres: 4 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; @@ -227,7 +227,7 @@ dirigeant . rémunération . net: 1000000 dirigeant . rémunération . net . après impôt: 527756 entreprise . chiffre d'affaires: 1244199 impôt . montant: 472244 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 1188 protection sociale . retraite . trimestres: 4 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; @@ -238,7 +238,7 @@ dirigeant . rémunération . net: 21916 dirigeant . rémunération . net . après impôt: 20840 entreprise . chiffre d'affaires: 30000 impôt . montant: 1076 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4" `; @@ -248,7 +248,7 @@ dirigeant . rémunération . net: 21737 dirigeant . rémunération . net . après impôt: 20689 entreprise . chiffre d'affaires: 30000 impôt . montant: 1048 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4" `; @@ -258,7 +258,7 @@ dirigeant . rémunération . net: 236610 dirigeant . rémunération . net . après impôt: 148282 entreprise . chiffre d'affaires: 300000 impôt . montant: 88328 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4" `; @@ -268,7 +268,7 @@ dirigeant . rémunération . net: 38695 dirigeant . rémunération . net . après impôt: 33086 entreprise . chiffre d'affaires: 50000 impôt . montant: 5609 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; @@ -279,7 +279,7 @@ dirigeant . rémunération . net: 38315 dirigeant . rémunération . net . après impôt: 32820 entreprise . chiffre d'affaires: 50000 impôt . montant: 5495 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; @@ -290,7 +290,7 @@ dirigeant . rémunération . net: 15457 dirigeant . rémunération . net . après impôt: 15456 entreprise . chiffre d'affaires: 20000 impôt . montant: 1 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4" `; @@ -300,7 +300,7 @@ dirigeant . rémunération . net: 35296 dirigeant . rémunération . net . après impôt: 30707 entreprise . chiffre d'affaires: 50000 impôt . montant: 4589 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; @@ -311,7 +311,7 @@ dirigeant . rémunération . net: 35598 dirigeant . rémunération . net . après impôt: 30920 entreprise . chiffre d'affaires: 50000 impôt . montant: 4678 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4" `; @@ -321,7 +321,7 @@ dirigeant . rémunération . net: 30196 dirigeant . rémunération . net . après impôt: 27138 entreprise . chiffre d'affaires: 50000 impôt . montant: 3058 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4" `; @@ -331,7 +331,7 @@ dirigeant . rémunération . net: 211175 dirigeant . rémunération . net . après impôt: 134293 entreprise . chiffre d'affaires: 300000 impôt . montant: 76882 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4" `; @@ -341,7 +341,7 @@ dirigeant . rémunération . net: 291966 dirigeant . rémunération . net . après impôt: 175922 entreprise . chiffre d'affaires: 400000 impôt . montant: 116044 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4" `; @@ -351,7 +351,7 @@ dirigeant . rémunération . net: 85353 dirigeant . rémunération . net . après impôt: 64073 entreprise . chiffre d'affaires: 120000 impôt . montant: 21280 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4 Notifications affichées : entreprise . TVA . franchise de TVA . seuils dépassés" `; @@ -362,7 +362,7 @@ dirigeant . rémunération . net: 35598 dirigeant . rémunération . net . après impôt: 30920 entreprise . chiffre d'affaires: 50000 impôt . montant: 4678 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4" `; @@ -372,7 +372,7 @@ dirigeant . rémunération . net: 37729 dirigeant . rémunération . net . après impôt: 32411 entreprise . chiffre d'affaires: 50000 impôt . montant: 5318 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4" `; @@ -382,7 +382,7 @@ dirigeant . rémunération . net: 14874 dirigeant . rémunération . net . après impôt: 14874 entreprise . chiffre d'affaires: 20000 impôt . montant: 0 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4 Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; @@ -393,7 +393,7 @@ dirigeant . rémunération . net: 2657 dirigeant . rémunération . net . après impôt: 2657 entreprise . chiffre d'affaires: 4000 impôt . montant: 0 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 3 Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable, dirigeant . indépendant . PL . CARCDSF . sage-femme . exonération PCV" `; @@ -404,7 +404,7 @@ dirigeant . rémunération . net: 14874 dirigeant . rémunération . net . après impôt: 14874 entreprise . chiffre d'affaires: 20000 impôt . montant: 0 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4 Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; @@ -415,7 +415,7 @@ dirigeant . rémunération . net: 14797 dirigeant . rémunération . net . après impôt: 14797 entreprise . chiffre d'affaires: 20000 impôt . montant: 0 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4 Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; @@ -426,7 +426,7 @@ dirigeant . rémunération . net: 14720 dirigeant . rémunération . net . après impôt: 14720 entreprise . chiffre d'affaires: 20000 impôt . montant: 0 -protection sociale . retraite . complémentaire: undefined +protection sociale . retraite . complémentaire: 0 protection sociale . retraite . trimestres: 4 Notifications affichées : dirigeant . indépendant . PL . CARCDSF . retraite complémentaire . cotisation forfaitaire . réduction applicable" `; diff --git a/site/test/regressions/simulations-indépendant.test.ts b/site/test/regressions/simulations-indépendant.test.ts index 6b2ceca3e..8a1a7db3d 100644 --- a/site/test/regressions/simulations-indépendant.test.ts +++ b/site/test/regressions/simulations-indépendant.test.ts @@ -36,6 +36,7 @@ it('calculate simulations-indépendant', () => { "dirigeant . rémunération . net", "entreprise . activité . débit de tabac", "entreprise . activité . nature", + "entreprise . activité . saisonnière", "entreprise . catégorie juridique", "entreprise . charges", "entreprise . chiffre d'affaires", diff --git a/site/test/regressions/simulations-professions-libérales.test.ts b/site/test/regressions/simulations-professions-libérales.test.ts index 8c1570af3..279bfb387 100644 --- a/site/test/regressions/simulations-professions-libérales.test.ts +++ b/site/test/regressions/simulations-professions-libérales.test.ts @@ -32,12 +32,12 @@ it('calculate simulations-professions-libérales', () => { "dirigeant . indépendant . IJSS", "dirigeant . indépendant . PL . CNAVPL . exonération incapacité", "dirigeant . indépendant . PL . métier", - "dirigeant . indépendant . PL . régime général", "dirigeant . indépendant . conjoint collaborateur", "dirigeant . indépendant . cotisations et contributions . exonérations . pension invalidité", "dirigeant . indépendant . cotisations facultatives", "dirigeant . indépendant . revenus étrangers", "dirigeant . rémunération . net", + "entreprise . activité . saisonnière", "entreprise . charges", "entreprise . chiffre d'affaires", "entreprise . date de création", diff --git a/site/vite.config.ts.timestamp-1673027151599.mjs b/site/vite.config.ts.timestamp-1673027151599.mjs new file mode 100644 index 000000000..783c45dc7 --- /dev/null +++ b/site/vite.config.ts.timestamp-1673027151599.mjs @@ -0,0 +1,348 @@ +// vite.config.ts +import replace from "file:///home/johan/Projets/mon-entreprise/node_modules/@rollup/plugin-replace/dist/rollup-plugin-replace.cjs.js"; +import yaml from "file:///home/johan/Projets/mon-entreprise/node_modules/@rollup/plugin-yaml/dist/index.js"; +import legacy from "file:///home/johan/Projets/mon-entreprise/node_modules/@vitejs/plugin-legacy/dist/index.mjs"; +import react from "file:///home/johan/Projets/mon-entreprise/node_modules/@vitejs/plugin-react/dist/index.mjs"; +import fs from "fs/promises"; +import path from "path"; +import serveStatic from "file:///home/johan/Projets/mon-entreprise/node_modules/serve-static/index.js"; +import { defineConfig, loadEnv } from "file:///home/johan/Projets/mon-entreprise/node_modules/vite/dist/node/index.js"; +import { VitePWA } from "file:///home/johan/Projets/mon-entreprise/node_modules/vite-plugin-pwa/dist/index.mjs"; + +// scripts/runScriptOnFileChange/execOnFileChange.ts +import { getPackageDeps } from "file:///home/johan/Projets/mon-entreprise/node_modules/@rushstack/package-deps-hash/lib/index.js"; +import { exec as originalExec } from "child_process"; +import { existsSync, lstatSync, readFileSync, writeFileSync } from "fs"; +import { relative, resolve } from "path"; +import { promisify } from "util"; +var exec = promisify(originalExec); +var execOnFileChange = async (config) => { + const path2 = resolve(config.basePath, config.depsPath); + const deps = Object.fromEntries(getPackageDeps(config.basePath)); + const depsEntries = Object.entries(deps); + const existingDeps = existsSync(path2) ? JSON.parse(readFileSync(path2, { encoding: "utf8" })) : {}; + const existingDepsEntries = Object.entries(existingDeps); + const promises = config.options.map(async (cfg) => { + let fileChanged = null; + const index = cfg.paths.map((val) => { + const isDir = lstatSync(resolve(config.basePath, val)).isDirectory(); + const isFile = lstatSync(resolve(config.basePath, val)).isFile(); + return { + isDir, + isFile, + absolute: resolve(config.basePath, val), + relative: relative( + resolve(config.basePath), + resolve(config.basePath, val) + ) + }; + }).findIndex(({ absolute, relative: relative2, isFile, isDir }) => { + if (isFile) { + if (deps[relative2] !== existingDeps[relative2]) { + fileChanged = relative2; + } + return deps[relative2] !== existingDeps[relative2]; + } else if (isDir) { + const index2 = depsEntries.findIndex( + ([a, b], i) => { + var _a, _b; + return (relative2.length ? a.startsWith(relative2 + "/") : true) && (((_a = existingDepsEntries == null ? void 0 : existingDepsEntries[i]) == null ? void 0 : _a[0]) !== a || ((_b = existingDepsEntries == null ? void 0 : existingDepsEntries[i]) == null ? void 0 : _b[1]) !== b); + } + ); + if (index2 > -1) { + fileChanged = depsEntries[index2][0]; + } + return index2 > -1; + } + throw new Error("Path is not a directory or a file: " + absolute); + }); + if (index > -1) { + const result = await exec(cfg.run); + return { + path: cfg.paths[index], + fileChanged, + run: cfg.run, + result + }; + } + return null; + }); + const res = await Promise.all(promises); + writeFileSync(path2, JSON.stringify(deps, null, 2)); + return res; +}; + +// scripts/runScriptOnFileChange/index.ts +var runScriptOnFileChange = async () => { + console.log("Search for changed file..."); + const results = await execOnFileChange({ + basePath: "./", + depsPath: ".deps.json", + options: [ + { + paths: [ + "./source/pages/Simulateurs/EconomieCollaborative/activit\xE9s.yaml", + "./source/pages/Simulateurs/EconomieCollaborative/activit\xE9s.en.yaml" + ], + run: "yarn build:yaml-to-dts" + } + ] + }); + results.filter((x) => !!x).forEach(({ fileChanged, run, result }) => { + console.log("Changed file detected:", fileChanged); + console.log("Execute:", run, "\n"); + if (result.stdout) { + console.log(result.stdout); + } + if (result.stderr) { + console.error(result.stderr); + } + }); +}; + +// vite-pwa-options.ts +var pwaOptions = { + registerType: "prompt", + strategies: "injectManifest", + srcDir: "source", + filename: "sw.ts", + injectManifest: { + maximumFileSizeToCacheInBytes: 3e6, + manifestTransforms: [ + (entries) => { + const manifest = entries.filter( + (entry) => !/assets\/.*(-legacy|lazy_)/.test(entry.url) && (entry.url.endsWith(".html") ? /(infrance|mon-entreprise)\.html/.test(entry.url) : true) + ); + return { manifest }; + } + ] + }, + includeAssets: ["logo-*.png"], + manifest: { + start_url: "/", + name: "Mon entreprise", + short_name: "Mon entreprise", + description: "L'assistant officiel du cr\xE9ateur d'entreprise", + lang: "fr", + orientation: "portrait-primary", + display: "minimal-ui", + theme_color: "#2975d1", + background_color: "#ffffff", + icons: [ + { + src: "/favicon/android-chrome-192x192-shadow.png?v=2.0", + sizes: "192x192", + type: "image/png" + }, + { + src: "/favicon/android-chrome-512x512-shadow.png?v=2.0", + sizes: "512x512", + type: "image/png" + } + ] + } +}; + +// vite.config.ts +var __vite_injected_original_import_meta_url = "file:///home/johan/Projets/mon-entreprise/site/vite.config.ts"; +var env = (mode) => loadEnv(mode, process.cwd(), ""); +var vite_config_default = defineConfig(({ command, mode }) => ({ + resolve: { + alias: { "@": path.resolve("./source") }, + extensions: [".js", ".ts", ".jsx", ".tsx", ".json"] + }, + publicDir: "source/public", + build: { + sourcemap: true, + rollupOptions: { + output: { + chunkFileNames: (chunkInfo) => { + if (chunkInfo.isDynamicEntry) { + return "assets/lazy_[name].[hash].js"; + } + return "assets/[name].[hash].js"; + } + } + } + }, + define: { + BRANCH_NAME: JSON.stringify(getBranch(mode)), + IS_DEVELOPMENT: mode === "development", + IS_STAGING: mode === "production" && !isProductionBranch(mode), + IS_PRODUCTION: mode === "production" && isProductionBranch(mode) + }, + plugins: [ + { + name: "run-script-on-file-change", + apply: "serve", + buildStart() { + if (mode === "development") { + void runScriptOnFileChange(); + } + } + }, + command === "build" && replace({ + __SENTRY_DEBUG__: false, + preventAssignment: false + }), + react({ + babel: { + plugins: [["babel-plugin-styled-components", { pure: true }]] + } + }), + yaml(), + multipleSPA({ + defaultSite: "mon-entreprise", + templatePath: "./source/template.html", + sites: { + "mon-entreprise": { + lang: "fr", + entry: "/source/entry-fr.tsx", + title: "mon-entreprise.urssaf.fr : L'assistant officiel du cr\xE9ateur d'entreprise", + description: "Du statut juridique \xE0 la premi\xE8re embauche, en passant par la simulation des cotisations, vous trouverez ici toutes les ressources pour d\xE9marrer votre activit\xE9.", + shareImage: "/source/images/logo-monentreprise.svg", + shareImageAlt: "Logo mon-entreprise, site Urssaf" + }, + infrance: { + lang: "en", + entry: "/source/entry-en.tsx", + title: "My company in France: A step-by-step guide to start a business in France", + description: "Find the type of company that suits you and follow the steps to register your company. Discover the French social security system by simulating your hiring costs. Discover the procedures to hire in France and learn the basics of French labour law.", + shareImage: "/logo-mycompany-share.png", + shareImageAlt: "Logo My company in France by Urssaf" + } + } + }), + VitePWA(pwaOptions), + legacy({ + targets: ["defaults", "not IE 11"] + }) + ], + server: { + port: 3e3, + hmr: { + clientPort: typeof env(mode).HMR_CLIENT_PORT !== "undefined" ? parseInt(env(mode).HMR_CLIENT_PORT) : void 0 + }, + watch: { + ignored: [ + "!**/node_modules/publicodes/**", + "!**/node_modules/publicodes-react/**" + ] + }, + proxy: { + "/api": "http://localhost:3004", + "/twemoji": { + target: "https://twemoji.maxcdn.com", + changeOrigin: true, + rewrite: (path2) => path2.replace(/^\/twemoji/, ""), + timeout: 3 * 1e3 + } + } + }, + optimizeDeps: { + entries: ["./source/entry-fr.tsx", "./source/entry-en.tsx"], + exclude: ["publicodes-react", "publicodes"], + include: ["publicodes > moo", "publicodes > nearley"] + }, + ssr: { + noExternal: [ + /react-aria|react-stately|internationalized/, + /markdown-to-jsx/, + /styled-components|emotion/, + /publicodes-react/ + ] + } +})); +function multipleSPA(options) { + const fillTemplate = async (siteName) => { + const siteData = options.sites[siteName]; + const template = await fs.readFile(options.templatePath, "utf-8"); + const filledTemplate = template.toString().replace(/\{\{(.+)\}\}/g, (_match, p1) => siteData[p1.trim()]); + return filledTemplate; + }; + return { + name: "multiple-spa", + enforce: "pre", + configureServer(vite) { + vite.middlewares.use( + "/simulateur-iframe-integration.js", + serveStatic(new URL("./dist", __vite_injected_original_import_meta_url).pathname, { + index: "simulateur-iframe-integration.js" + }) + ); + vite.middlewares.use(async (req, res, next) => { + var _a; + const url = (_a = req.originalUrl) == null ? void 0 : _a.replace(/^\/%2F/, "/"); + const firstLevelDir = url == null ? void 0 : url.slice(1).split("/")[0]; + if (url && /\?.*html-proxy/.test(url)) { + return next(); + } + if (url && ["/", "/index.html"].includes(url)) { + res.writeHead(302, { Location: "/" + options.defaultSite }).end(); + } else if (firstLevelDir && url && Object.keys(options.sites).map((site) => `/${site}.html`).includes(url)) { + const siteName = firstLevelDir.replace(".html", ""); + const content = await vite.transformIndexHtml( + "/" + siteName, + await fillTemplate(siteName) + ); + res.end(content); + } else if (firstLevelDir && Object.keys(options.sites).some((name) => firstLevelDir === name)) { + const siteName = firstLevelDir; + const content = await vite.transformIndexHtml( + url, + await fillTemplate(siteName) + ); + res.end(content); + } else { + next(); + } + }); + }, + config(config, { command }) { + var _a, _b; + if (command === "build" && !((_a = config.build) == null ? void 0 : _a.ssr)) { + config.build = { + ...config.build, + rollupOptions: { + ...(_b = config.build) == null ? void 0 : _b.rollupOptions, + input: Object.fromEntries( + Object.keys(options.sites).map((name) => [ + name, + `virtual:${name}.html` + ]) + ) + } + }; + } + }, + resolveId(id) { + const pathname = id.split("/").slice(-1)[0]; + if (pathname == null ? void 0 : pathname.startsWith("virtual:")) { + return pathname.replace("virtual:", ""); + } + return null; + }, + async load(id) { + if (Object.keys(options.sites).some((name) => id.endsWith(name + ".html"))) { + return await fillTemplate(id.replace(/\.html$/, "")); + } + } + }; +} +var getBranch = (mode) => { + var _a, _b, _c; + let branch = (_c = (_b = (_a = env(mode).VITE_GITHUB_REF) == null ? void 0 : _a.split("/")) == null ? void 0 : _b.slice(-1)) == null ? void 0 : _c[0]; + if (branch === "merge") { + branch = env(mode).VITE_GITHUB_HEAD_REF; + } + return branch ?? ""; +}; +var isProductionBranch = (mode) => { + return ["master", "next"].includes(getBranch(mode)); +}; +export { + vite_config_default as default, + getBranch, + isProductionBranch +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiLCAic2NyaXB0cy9ydW5TY3JpcHRPbkZpbGVDaGFuZ2UvZXhlY09uRmlsZUNoYW5nZS50cyIsICJzY3JpcHRzL3J1blNjcmlwdE9uRmlsZUNoYW5nZS9pbmRleC50cyIsICJ2aXRlLXB3YS1vcHRpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL2hvbWUvam9oYW4vUHJvamV0cy9tb24tZW50cmVwcmlzZS9zaXRlXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvaG9tZS9qb2hhbi9Qcm9qZXRzL21vbi1lbnRyZXByaXNlL3NpdGUvdml0ZS5jb25maWcudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL2hvbWUvam9oYW4vUHJvamV0cy9tb24tZW50cmVwcmlzZS9zaXRlL3ZpdGUuY29uZmlnLnRzXCI7LyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IHJlcGxhY2UgZnJvbSAnQHJvbGx1cC9wbHVnaW4tcmVwbGFjZSdcbmltcG9ydCB5YW1sIGZyb20gJ0Byb2xsdXAvcGx1Z2luLXlhbWwnXG5pbXBvcnQgbGVnYWN5IGZyb20gJ0B2aXRlanMvcGx1Z2luLWxlZ2FjeSdcbmltcG9ydCByZWFjdCBmcm9tICdAdml0ZWpzL3BsdWdpbi1yZWFjdCdcbmltcG9ydCBmcyBmcm9tICdmcy9wcm9taXNlcydcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgc2VydmVTdGF0aWMgZnJvbSAnc2VydmUtc3RhdGljJ1xuaW1wb3J0IHsgUGx1Z2luLCBkZWZpbmVDb25maWcsIGxvYWRFbnYgfSBmcm9tICd2aXRlJ1xuaW1wb3J0IHsgVml0ZVBXQSB9IGZyb20gJ3ZpdGUtcGx1Z2luLXB3YSdcblxuaW1wb3J0IHsgcnVuU2NyaXB0T25GaWxlQ2hhbmdlIH0gZnJvbSAnLi9zY3JpcHRzL3J1blNjcmlwdE9uRmlsZUNoYW5nZSdcbmltcG9ydCB7IHB3YU9wdGlvbnMgfSBmcm9tICcuL3ZpdGUtcHdhLW9wdGlvbnMnXG5cbmNvbnN0IGVudiA9IChtb2RlOiBzdHJpbmcpID0+IGxvYWRFbnYobW9kZSwgcHJvY2Vzcy5jd2QoKSwgJycpXG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZygoeyBjb21tYW5kLCBtb2RlIH0pID0+ICh7XG5cdHJlc29sdmU6IHtcblx0XHRhbGlhczogeyAnQCc6IHBhdGgucmVzb2x2ZSgnLi9zb3VyY2UnKSB9LFxuXHRcdGV4dGVuc2lvbnM6IFsnLmpzJywgJy50cycsICcuanN4JywgJy50c3gnLCAnLmpzb24nXSxcblx0fSxcblx0cHVibGljRGlyOiAnc291cmNlL3B1YmxpYycsXG5cdGJ1aWxkOiB7XG5cdFx0c291cmNlbWFwOiB0cnVlLFxuXHRcdHJvbGx1cE9wdGlvbnM6IHtcblx0XHRcdG91dHB1dDoge1xuXHRcdFx0XHRjaHVua0ZpbGVOYW1lczogKGNodW5rSW5mbykgPT4ge1xuXHRcdFx0XHRcdGlmIChjaHVua0luZm8uaXNEeW5hbWljRW50cnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiAnYXNzZXRzL2xhenlfW25hbWVdLltoYXNoXS5qcydcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gJ2Fzc2V0cy9bbmFtZV0uW2hhc2hdLmpzJ1xuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXHRkZWZpbmU6IHtcblx0XHRCUkFOQ0hfTkFNRTogSlNPTi5zdHJpbmdpZnkoZ2V0QnJhbmNoKG1vZGUpKSxcblx0XHRJU19ERVZFTE9QTUVOVDogbW9kZSA9PT0gJ2RldmVsb3BtZW50Jyxcblx0XHRJU19TVEFHSU5HOiBtb2RlID09PSAncHJvZHVjdGlvbicgJiYgIWlzUHJvZHVjdGlvbkJyYW5jaChtb2RlKSxcblx0XHRJU19QUk9EVUNUSU9OOiBtb2RlID09PSAncHJvZHVjdGlvbicgJiYgaXNQcm9kdWN0aW9uQnJhbmNoKG1vZGUpLFxuXHR9LFxuXHRwbHVnaW5zOiBbXG5cdFx0e1xuXHRcdFx0bmFtZTogJ3J1bi1zY3JpcHQtb24tZmlsZS1jaGFuZ2UnLFxuXHRcdFx0YXBwbHk6ICdzZXJ2ZScsXG5cdFx0XHRidWlsZFN0YXJ0KCkge1xuXHRcdFx0XHRpZiAobW9kZSA9PT0gJ2RldmVsb3BtZW50Jykge1xuXHRcdFx0XHRcdHZvaWQgcnVuU2NyaXB0T25GaWxlQ2hhbmdlKClcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHR9LFxuXHRcdGNvbW1hbmQgPT09ICdidWlsZCcgJiZcblx0XHRcdHJlcGxhY2Uoe1xuXHRcdFx0XHRfX1NFTlRSWV9ERUJVR19fOiBmYWxzZSxcblx0XHRcdFx0cHJldmVudEFzc2lnbm1lbnQ6IGZhbHNlLFxuXHRcdFx0fSksXG5cdFx0cmVhY3Qoe1xuXHRcdFx0YmFiZWw6IHtcblx0XHRcdFx0cGx1Z2luczogW1snYmFiZWwtcGx1Z2luLXN0eWxlZC1jb21wb25lbnRzJywgeyBwdXJlOiB0cnVlIH1dXSxcblx0XHRcdH0sXG5cdFx0fSksXG5cdFx0eWFtbCgpLFxuXHRcdG11bHRpcGxlU1BBKHtcblx0XHRcdGRlZmF1bHRTaXRlOiAnbW9uLWVudHJlcHJpc2UnLFxuXHRcdFx0dGVtcGxhdGVQYXRoOiAnLi9zb3VyY2UvdGVtcGxhdGUuaHRtbCcsXG5cdFx0XHRzaXRlczoge1xuXHRcdFx0XHQnbW9uLWVudHJlcHJpc2UnOiB7XG5cdFx0XHRcdFx0bGFuZzogJ2ZyJyxcblx0XHRcdFx0XHRlbnRyeTogJy9zb3VyY2UvZW50cnktZnIudHN4Jyxcblx0XHRcdFx0XHR0aXRsZTpcblx0XHRcdFx0XHRcdFwibW9uLWVudHJlcHJpc2UudXJzc2FmLmZyIDogTCdhc3Npc3RhbnQgb2ZmaWNpZWwgZHUgY3JcdTAwRTlhdGV1ciBkJ2VudHJlcHJpc2VcIixcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjpcblx0XHRcdFx0XHRcdCdEdSBzdGF0dXQganVyaWRpcXVlIFx1MDBFMCBsYSBwcmVtaVx1MDBFOHJlIGVtYmF1Y2hlLCBlbiBwYXNzYW50IHBhciBsYSBzaW11bGF0aW9uIGRlcyBjb3Rpc2F0aW9ucywgdm91cyB0cm91dmVyZXogaWNpIHRvdXRlcyBsZXMgcmVzc291cmNlcyBwb3VyIGRcdTAwRTltYXJyZXIgdm90cmUgYWN0aXZpdFx1MDBFOS4nLFxuXHRcdFx0XHRcdHNoYXJlSW1hZ2U6ICcvc291cmNlL2ltYWdlcy9sb2dvLW1vbmVudHJlcHJpc2Uuc3ZnJyxcblx0XHRcdFx0XHRzaGFyZUltYWdlQWx0OiAnTG9nbyBtb24tZW50cmVwcmlzZSwgc2l0ZSBVcnNzYWYnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRpbmZyYW5jZToge1xuXHRcdFx0XHRcdGxhbmc6ICdlbicsXG5cdFx0XHRcdFx0ZW50cnk6ICcvc291cmNlL2VudHJ5LWVuLnRzeCcsXG5cdFx0XHRcdFx0dGl0bGU6XG5cdFx0XHRcdFx0XHQnTXkgY29tcGFueSBpbiBGcmFuY2U6IEEgc3RlcC1ieS1zdGVwIGd1aWRlIHRvIHN0YXJ0IGEgYnVzaW5lc3MgaW4gRnJhbmNlJyxcblx0XHRcdFx0XHRkZXNjcmlwdGlvbjpcblx0XHRcdFx0XHRcdCdGaW5kIHRoZSB0eXBlIG9mIGNvbXBhbnkgdGhhdCBzdWl0cyB5b3UgYW5kIGZvbGxvdyB0aGUgc3RlcHMgdG8gcmVnaXN0ZXIgeW91ciBjb21wYW55LiBEaXNjb3ZlciB0aGUgRnJlbmNoIHNvY2lhbCBzZWN1cml0eSBzeXN0ZW0gYnkgc2ltdWxhdGluZyB5b3VyIGhpcmluZyBjb3N0cy4gRGlzY292ZXIgdGhlIHByb2NlZHVyZXMgdG8gaGlyZSBpbiBGcmFuY2UgYW5kIGxlYXJuIHRoZSBiYXNpY3Mgb2YgRnJlbmNoIGxhYm91ciBsYXcuJyxcblx0XHRcdFx0XHRzaGFyZUltYWdlOiAnL2xvZ28tbXljb21wYW55LXNoYXJlLnBuZycsXG5cdFx0XHRcdFx0c2hhcmVJbWFnZUFsdDogJ0xvZ28gTXkgY29tcGFueSBpbiBGcmFuY2UgYnkgVXJzc2FmJyxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0fSksXG5cdFx0Vml0ZVBXQShwd2FPcHRpb25zKSxcblx0XHRsZWdhY3koe1xuXHRcdFx0dGFyZ2V0czogWydkZWZhdWx0cycsICdub3QgSUUgMTEnXSxcblx0XHR9KSxcblx0XSxcblx0c2VydmVyOiB7XG5cdFx0cG9ydDogMzAwMCxcblx0XHRobXI6IHtcblx0XHRcdGNsaWVudFBvcnQ6XG5cdFx0XHRcdHR5cGVvZiBlbnYobW9kZSkuSE1SX0NMSUVOVF9QT1JUICE9PSAndW5kZWZpbmVkJ1xuXHRcdFx0XHRcdD8gcGFyc2VJbnQoZW52KG1vZGUpLkhNUl9DTElFTlRfUE9SVClcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHR9LFxuXHRcdC8vIEtlZXAgd2F0Y2hpbmcgY2hhbmdlcyBpbiB0aGUgcHVibGljb2RlcyBwYWNrYWdlIHRvIHN1cHBvcnQgbGl2ZSByZWxvYWRcblx0XHQvLyB3aGVuIHdlIGl0ZXJhdGUgb24gcHVibGljb2RlcyBsb2dpYy5cblx0XHQvLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnLyNzZXJ2ZXItd2F0Y2hcblx0XHR3YXRjaDoge1xuXHRcdFx0aWdub3JlZDogW1xuXHRcdFx0XHQnISoqL25vZGVfbW9kdWxlcy9wdWJsaWNvZGVzLyoqJyxcblx0XHRcdFx0JyEqKi9ub2RlX21vZHVsZXMvcHVibGljb2Rlcy1yZWFjdC8qKicsXG5cdFx0XHRdLFxuXHRcdH0sXG5cdFx0cHJveHk6IHtcblx0XHRcdCcvYXBpJzogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwNCcsXG5cdFx0XHQnL3R3ZW1vamknOiB7XG5cdFx0XHRcdHRhcmdldDogJ2h0dHBzOi8vdHdlbW9qaS5tYXhjZG4uY29tJyxcblx0XHRcdFx0Y2hhbmdlT3JpZ2luOiB0cnVlLFxuXHRcdFx0XHRyZXdyaXRlOiAocGF0aCkgPT4gcGF0aC5yZXBsYWNlKC9eXFwvdHdlbW9qaS8sICcnKSxcblx0XHRcdFx0dGltZW91dDogMyAqIDEwMDAsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdH0sXG5cdG9wdGltaXplRGVwczoge1xuXHRcdGVudHJpZXM6IFsnLi9zb3VyY2UvZW50cnktZnIudHN4JywgJy4vc291cmNlL2VudHJ5LWVuLnRzeCddLFxuXHRcdGV4Y2x1ZGU6IFsncHVibGljb2Rlcy1yZWFjdCcsICdwdWJsaWNvZGVzJ10sXG5cdFx0Ly8gT3B0aW1pemUgY2pzIGRlcHMgZnJvbSBwdWJsaWNvZGVzXG5cdFx0aW5jbHVkZTogWydwdWJsaWNvZGVzID4gbW9vJywgJ3B1YmxpY29kZXMgPiBuZWFybGV5J10sXG5cdH0sXG5cdHNzcjoge1xuXHRcdC8qKlxuXHRcdCAqIFByZXZlbnQgbGlzdGVkIGRlcGVuZGVuY2llcyBmcm9tIGJlaW5nIGV4dGVybmFsaXplZCBmb3IgU1NSIGJ1aWxkIGNhdXNlIHNvbWVcblx0XHQgKiBwYWNrYWdlcyBhcmUgbm90IGVzbSByZWFkeSBvciBwYWNrYWdlLmpzb24gc2V0dXAgc2VlbXMgd3JvbmcsIHdhaXQgdGhpcyBwciB0byBiZSBtZXJnZTpcblx0XHQgKiByZWFjdC1zcGVjdHJ1bTogaHR0cHM6Ly9naXRodWIuY29tL2Fkb2JlL3JlYWN0LXNwZWN0cnVtL3B1bGwvMzYzMFxuXHRcdCAqIG1hcmtkb3duLXRvLWpzeDogaHR0cHM6Ly9naXRodWIuY29tL3Byb2JhYmx5dXAvbWFya2Rvd24tdG8tanN4L3B1bGwvNDE0XG5cdFx0ICogc3R5bGVkLWNvbXBvbmVudHM6IGh0dHBzOi8vZ2l0aHViLmNvbS9zdHlsZWQtY29tcG9uZW50cy9zdHlsZWQtY29tcG9uZW50cy9pc3N1ZXMvMzYwMVxuXHRcdCAqIHB1YmxpY29kZXMtcmVhY3Q6IEFkZCB0eXBlIG1vZHVsZVxuXHRcdCAqL1xuXHRcdG5vRXh0ZXJuYWw6IFtcblx0XHRcdC9yZWFjdC1hcmlhfHJlYWN0LXN0YXRlbHl8aW50ZXJuYXRpb25hbGl6ZWQvLFxuXHRcdFx0L21hcmtkb3duLXRvLWpzeC8sXG5cdFx0XHQvc3R5bGVkLWNvbXBvbmVudHN8ZW1vdGlvbi8sXG5cdFx0XHQvcHVibGljb2Rlcy1yZWFjdC8sIC8vIFRPRE8gcmVtb3ZlIHRoaXMgYWZ0ZXIgcHVibGljb2Rlcy1yZWFjdCB1cGdyYWRlXG5cdFx0XSxcblx0fSxcbn0pKVxuXG50eXBlIE11bHRpcGxlU1BBT3B0aW9ucyA9IHtcblx0ZGVmYXVsdFNpdGU6IHN0cmluZ1xuXHR0ZW1wbGF0ZVBhdGg6IHN0cmluZ1xuXHRzaXRlczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5cbn1cblxuLyoqXG4gKiBBIGN1c3RvbSBwbHVnaW4gdG8gY3JlYXRlIG11bHRpcGxlIHZpcnR1YWwgaHRtbCBmaWxlcyBmcm9tIGEgdGVtcGxhdGUuIFdpbGxcbiAqIGdlbmVyYXRlIGRpc3RpbmN0IGVudHJ5IHBvaW50cyBhbmQgc2luZ2xlLXBhZ2UgYXBwbGljYXRpb24gb3V0cHV0cy5cbiAqL1xuZnVuY3Rpb24gbXVsdGlwbGVTUEEob3B0aW9uczogTXVsdGlwbGVTUEFPcHRpb25zKTogUGx1Z2luIHtcblx0Y29uc3QgZmlsbFRlbXBsYXRlID0gYXN5bmMgKHNpdGVOYW1lOiBzdHJpbmcpID0+IHtcblx0XHRjb25zdCBzaXRlRGF0YSA9IG9wdGlvbnMuc2l0ZXNbc2l0ZU5hbWVdXG5cdFx0Y29uc3QgdGVtcGxhdGUgPSBhd2FpdCBmcy5yZWFkRmlsZShvcHRpb25zLnRlbXBsYXRlUGF0aCwgJ3V0Zi04Jylcblx0XHRjb25zdCBmaWxsZWRUZW1wbGF0ZSA9IHRlbXBsYXRlXG5cdFx0XHQudG9TdHJpbmcoKVxuXHRcdFx0LnJlcGxhY2UoL1xce1xceyguKylcXH1cXH0vZywgKF9tYXRjaCwgcDEpID0+IHNpdGVEYXRhWyhwMSBhcyBzdHJpbmcpLnRyaW0oKV0pXG5cblx0XHRyZXR1cm4gZmlsbGVkVGVtcGxhdGVcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bmFtZTogJ211bHRpcGxlLXNwYScsXG5cdFx0ZW5mb3JjZTogJ3ByZScsXG5cblx0XHRjb25maWd1cmVTZXJ2ZXIodml0ZSkge1xuXHRcdFx0Ly8gVE9ETzogdGhpcyBtaWRkbGV3YXJlIGlzIHNwZWNpZmljIHRvIHRoZSBcIm1vbi1lbnRyZXByaXNlXCIgYXBwIGFuZFxuXHRcdFx0Ly8gc2hvdWxkbid0IGJlIGluIHRoZSBcIm11bHRpcGxlU1BBXCIgcGx1Z2luXG5cdFx0XHR2aXRlLm1pZGRsZXdhcmVzLnVzZShcblx0XHRcdFx0Jy9zaW11bGF0ZXVyLWlmcmFtZS1pbnRlZ3JhdGlvbi5qcycsXG5cdFx0XHRcdHNlcnZlU3RhdGljKG5ldyBVUkwoJy4vZGlzdCcsIGltcG9ydC5tZXRhLnVybCkucGF0aG5hbWUsIHtcblx0XHRcdFx0XHRpbmRleDogJ3NpbXVsYXRldXItaWZyYW1lLWludGVncmF0aW9uLmpzJyxcblx0XHRcdFx0fSlcblx0XHRcdClcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbWlzdXNlZC1wcm9taXNlc1xuXHRcdFx0dml0ZS5taWRkbGV3YXJlcy51c2UoYXN5bmMgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHVybCA9IHJlcS5vcmlnaW5hbFVybD8ucmVwbGFjZSgvXlxcLyUyRi8sICcvJylcblxuXHRcdFx0XHRjb25zdCBmaXJzdExldmVsRGlyID0gdXJsPy5zbGljZSgxKS5zcGxpdCgnLycpWzBdXG5cblx0XHRcdFx0aWYgKHVybCAmJiAvXFw/LipodG1sLXByb3h5Ly50ZXN0KHVybCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV4dCgpXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodXJsICYmIFsnLycsICcvaW5kZXguaHRtbCddLmluY2x1ZGVzKHVybCkpIHtcblx0XHRcdFx0XHRyZXMud3JpdGVIZWFkKDMwMiwgeyBMb2NhdGlvbjogJy8nICsgb3B0aW9ucy5kZWZhdWx0U2l0ZSB9KS5lbmQoKVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHRoaXMgY29uZGl0aW9uIGlzIGZvciB0aGUgc3RhcnQ6bmV0bGlmeSBzY3JpcHQgdG8gbWF0Y2ggL21vbi1lbnRyZXByaXNlIG9yIC9pbmZyYW5jZVxuXHRcdFx0XHRlbHNlIGlmIChcblx0XHRcdFx0XHRmaXJzdExldmVsRGlyICYmXG5cdFx0XHRcdFx0dXJsICYmXG5cdFx0XHRcdFx0T2JqZWN0LmtleXMob3B0aW9ucy5zaXRlcylcblx0XHRcdFx0XHRcdC5tYXAoKHNpdGUpID0+IGAvJHtzaXRlfS5odG1sYClcblx0XHRcdFx0XHRcdC5pbmNsdWRlcyh1cmwpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnN0IHNpdGVOYW1lID0gZmlyc3RMZXZlbERpci5yZXBsYWNlKCcuaHRtbCcsICcnKVxuXHRcdFx0XHRcdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB2aXRlLnRyYW5zZm9ybUluZGV4SHRtbChcblx0XHRcdFx0XHRcdCcvJyArIHNpdGVOYW1lLFxuXHRcdFx0XHRcdFx0YXdhaXQgZmlsbFRlbXBsYXRlKHNpdGVOYW1lKVxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHRyZXMuZW5kKGNvbnRlbnQpXG5cdFx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdFx0Zmlyc3RMZXZlbERpciAmJlxuXHRcdFx0XHRcdE9iamVjdC5rZXlzKG9wdGlvbnMuc2l0ZXMpLnNvbWUoKG5hbWUpID0+IGZpcnN0TGV2ZWxEaXIgPT09IG5hbWUpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnN0IHNpdGVOYW1lID0gZmlyc3RMZXZlbERpclxuXHRcdFx0XHRcdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB2aXRlLnRyYW5zZm9ybUluZGV4SHRtbChcblx0XHRcdFx0XHRcdHVybCxcblx0XHRcdFx0XHRcdGF3YWl0IGZpbGxUZW1wbGF0ZShzaXRlTmFtZSlcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0cmVzLmVuZChjb250ZW50KVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG5leHQoKVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdH0sXG5cblx0XHRjb25maWcoY29uZmlnLCB7IGNvbW1hbmQgfSkge1xuXHRcdFx0aWYgKGNvbW1hbmQgPT09ICdidWlsZCcgJiYgIWNvbmZpZy5idWlsZD8uc3NyKSB7XG5cdFx0XHRcdGNvbmZpZy5idWlsZCA9IHtcblx0XHRcdFx0XHQuLi5jb25maWcuYnVpbGQsXG5cdFx0XHRcdFx0cm9sbHVwT3B0aW9uczoge1xuXHRcdFx0XHRcdFx0Li4uY29uZmlnLmJ1aWxkPy5yb2xsdXBPcHRpb25zLFxuXHRcdFx0XHRcdFx0aW5wdXQ6IE9iamVjdC5mcm9tRW50cmllcyhcblx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMob3B0aW9ucy5zaXRlcykubWFwKChuYW1lKSA9PiBbXG5cdFx0XHRcdFx0XHRcdFx0bmFtZSxcblx0XHRcdFx0XHRcdFx0XHRgdmlydHVhbDoke25hbWV9Lmh0bWxgLFxuXHRcdFx0XHRcdFx0XHRdKVxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHJlc29sdmVJZChpZCkge1xuXHRcdFx0Y29uc3QgcGF0aG5hbWUgPSBpZC5zcGxpdCgnLycpLnNsaWNlKC0xKVswXVxuXHRcdFx0aWYgKHBhdGhuYW1lPy5zdGFydHNXaXRoKCd2aXJ0dWFsOicpKSB7XG5cdFx0XHRcdHJldHVybiBwYXRobmFtZS5yZXBsYWNlKCd2aXJ0dWFsOicsICcnKVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbnVsbFxuXHRcdH0sXG5cblx0XHRhc3luYyBsb2FkKGlkKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdE9iamVjdC5rZXlzKG9wdGlvbnMuc2l0ZXMpLnNvbWUoKG5hbWUpID0+IGlkLmVuZHNXaXRoKG5hbWUgKyAnLmh0bWwnKSlcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gYXdhaXQgZmlsbFRlbXBsYXRlKGlkLnJlcGxhY2UoL1xcLmh0bWwkLywgJycpKVxuXHRcdFx0fVxuXHRcdH0sXG5cdH1cbn1cblxuLyoqXG4gKiBHaXQgYnJhbmNoIG5hbWVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEJyYW5jaCA9IChtb2RlOiBzdHJpbmcpID0+IHtcblx0bGV0IGJyYW5jaDogc3RyaW5nIHwgdW5kZWZpbmVkID0gZW52KG1vZGUpXG5cdFx0LlZJVEVfR0lUSFVCX1JFRj8uc3BsaXQoJy8nKVxuXHRcdD8uc2xpY2UoLTEpPy5bMF1cblxuXHRpZiAoYnJhbmNoID09PSAnbWVyZ2UnKSB7XG5cdFx0YnJhbmNoID0gZW52KG1vZGUpLlZJVEVfR0lUSFVCX0hFQURfUkVGXG5cdH1cblxuXHRyZXR1cm4gYnJhbmNoID8/ICcnXG59XG5cbi8qKlxuICogV2UgdXNlIHRoaXMgZnVuY3Rpb24gdG8gaGlkZSBzb21lIGZlYXR1cmVzIGluIHByb2R1Y3Rpb24gd2hpbGUga2VlcGluZyB0aGVtXG4gKiBpbiBmZWF0dXJlLWJyYW5jaGVzLiBJbiBjYXNlIHdlIGRvIEEvQiB0ZXN0aW5nIHdpdGggc2V2ZXJhbCBicmFuY2hlcyBzZXJ2ZWRcbiAqIGluIHByb2R1Y3Rpb24sIHdlIHNob3VsZCBhZGQgdGhlIHB1YmxpYyBmYWNlZCBicmFuY2ggbmFtZXMgaW4gdGhlIHRlc3QgYmVsb3cuXG4gKiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBpbXBvcnQubWV0YS5lbnYuTU9ERSBpbiB0aGF0IGEgZmVhdHVyZSBicmFuY2ggbWF5XG4gKiBiZSBidWlsZCBpbiBwcm9kdWN0aW9uIG1vZGUgKHdpdGggdGhlIE5PREVfRU5WKSBidXQgd2UgbWF5IHN0aWxsIHdhbnQgdG8gc2hvd1xuICogb3IgaGlkZSBzb21lIGZlYXR1cmVzLlxuICovXG5leHBvcnQgY29uc3QgaXNQcm9kdWN0aW9uQnJhbmNoID0gKG1vZGU6IHN0cmluZykgPT4ge1xuXHRyZXR1cm4gWydtYXN0ZXInLCAnbmV4dCddLmluY2x1ZGVzKGdldEJyYW5jaChtb2RlKSlcbn1cbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL2hvbWUvam9oYW4vUHJvamV0cy9tb24tZW50cmVwcmlzZS9zaXRlL3NjcmlwdHMvcnVuU2NyaXB0T25GaWxlQ2hhbmdlXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvaG9tZS9qb2hhbi9Qcm9qZXRzL21vbi1lbnRyZXByaXNlL3NpdGUvc2NyaXB0cy9ydW5TY3JpcHRPbkZpbGVDaGFuZ2UvZXhlY09uRmlsZUNoYW5nZS50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vaG9tZS9qb2hhbi9Qcm9qZXRzL21vbi1lbnRyZXByaXNlL3NpdGUvc2NyaXB0cy9ydW5TY3JpcHRPbkZpbGVDaGFuZ2UvZXhlY09uRmlsZUNoYW5nZS50c1wiO2ltcG9ydCB7IGdldFBhY2thZ2VEZXBzIH0gZnJvbSAnQHJ1c2hzdGFjay9wYWNrYWdlLWRlcHMtaGFzaCdcbmltcG9ydCB7IGV4ZWMgYXMgb3JpZ2luYWxFeGVjIH0gZnJvbSAnY2hpbGRfcHJvY2VzcydcbmltcG9ydCB7IGV4aXN0c1N5bmMsIGxzdGF0U3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSAnZnMnXG5pbXBvcnQgeyByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJ1xuXG5jb25zdCBleGVjID0gcHJvbWlzaWZ5KG9yaWdpbmFsRXhlYylcblxudHlwZSBEaXJQYXRoID0gc3RyaW5nXG50eXBlIEZpbGVQYXRoID0gc3RyaW5nXG5cbmludGVyZmFjZSBPcHRpb24ge1xuXHRwYXRoczogKERpclBhdGggfCBGaWxlUGF0aClbXVxuXHRydW46IHN0cmluZ1xufVxuXG5pbnRlcmZhY2UgQ29uZmlnIHtcblx0YmFzZVBhdGg6IHN0cmluZ1xuXHRkZXBzUGF0aDogc3RyaW5nXG5cdG9wdGlvbnM6IE9wdGlvbltdXG59XG5cbnR5cGUgRGVwcyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuLyoqXG4gKiBFeGVjdXRlIGEgY29tbWFuZCB3aGVuIGEgZmlsZSBvciBhIGZpbGUgaW4gdGhlIGRpcmVjdG9yeSBjaGFuZ2VzXG4gKi9cbmV4cG9ydCBjb25zdCBleGVjT25GaWxlQ2hhbmdlID0gYXN5bmMgKGNvbmZpZzogQ29uZmlnKSA9PiB7XG5cdGNvbnN0IHBhdGggPSByZXNvbHZlKGNvbmZpZy5iYXNlUGF0aCwgY29uZmlnLmRlcHNQYXRoKVxuXG5cdGNvbnN0IGRlcHM6IERlcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoZ2V0UGFja2FnZURlcHMoY29uZmlnLmJhc2VQYXRoKSlcblx0Y29uc3QgZGVwc0VudHJpZXMgPSBPYmplY3QuZW50cmllcyhkZXBzKVxuXG5cdGNvbnN0IGV4aXN0aW5nRGVwcyA9IGV4aXN0c1N5bmMocGF0aClcblx0XHQ/IChKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhwYXRoLCB7IGVuY29kaW5nOiAndXRmOCcgfSkpIGFzIERlcHMpXG5cdFx0OiB7fVxuXHRjb25zdCBleGlzdGluZ0RlcHNFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZXhpc3RpbmdEZXBzKVxuXG5cdGNvbnN0IHByb21pc2VzID0gY29uZmlnLm9wdGlvbnMubWFwKGFzeW5jIChjZmcpID0+IHtcblx0XHRsZXQgZmlsZUNoYW5nZWQ6IG51bGwgfCBzdHJpbmcgPSBudWxsXG5cdFx0Y29uc3QgaW5kZXggPSBjZmcucGF0aHNcblx0XHRcdC5tYXAoKHZhbCkgPT4ge1xuXHRcdFx0XHRjb25zdCBpc0RpciA9IGxzdGF0U3luYyhyZXNvbHZlKGNvbmZpZy5iYXNlUGF0aCwgdmFsKSkuaXNEaXJlY3RvcnkoKVxuXHRcdFx0XHRjb25zdCBpc0ZpbGUgPSBsc3RhdFN5bmMocmVzb2x2ZShjb25maWcuYmFzZVBhdGgsIHZhbCkpLmlzRmlsZSgpXG5cblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRpc0Rpcixcblx0XHRcdFx0XHRpc0ZpbGUsXG5cdFx0XHRcdFx0YWJzb2x1dGU6IHJlc29sdmUoY29uZmlnLmJhc2VQYXRoLCB2YWwpLFxuXHRcdFx0XHRcdHJlbGF0aXZlOiByZWxhdGl2ZShcblx0XHRcdFx0XHRcdHJlc29sdmUoY29uZmlnLmJhc2VQYXRoKSxcblx0XHRcdFx0XHRcdHJlc29sdmUoY29uZmlnLmJhc2VQYXRoLCB2YWwpXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5maW5kSW5kZXgoKHsgYWJzb2x1dGUsIHJlbGF0aXZlLCBpc0ZpbGUsIGlzRGlyIH0pID0+IHtcblx0XHRcdFx0aWYgKGlzRmlsZSkge1xuXHRcdFx0XHRcdGlmIChkZXBzW3JlbGF0aXZlXSAhPT0gZXhpc3RpbmdEZXBzW3JlbGF0aXZlXSkge1xuXHRcdFx0XHRcdFx0ZmlsZUNoYW5nZWQgPSByZWxhdGl2ZVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBkZXBzW3JlbGF0aXZlXSAhPT0gZXhpc3RpbmdEZXBzW3JlbGF0aXZlXVxuXHRcdFx0XHR9IGVsc2UgaWYgKGlzRGlyKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5kZXggPSBkZXBzRW50cmllcy5maW5kSW5kZXgoXG5cdFx0XHRcdFx0XHQoW2EsIGJdLCBpKSA9PlxuXHRcdFx0XHRcdFx0XHQocmVsYXRpdmUubGVuZ3RoID8gYS5zdGFydHNXaXRoKHJlbGF0aXZlICsgJy8nKSA6IHRydWUpICYmXG5cdFx0XHRcdFx0XHRcdChleGlzdGluZ0RlcHNFbnRyaWVzPy5baV0/LlswXSAhPT0gYSB8fFxuXHRcdFx0XHRcdFx0XHRcdGV4aXN0aW5nRGVwc0VudHJpZXM/LltpXT8uWzFdICE9PSBiKVxuXHRcdFx0XHRcdClcblxuXHRcdFx0XHRcdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0XHRcdFx0XHRmaWxlQ2hhbmdlZCA9IGRlcHNFbnRyaWVzW2luZGV4XVswXVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBpbmRleCA+IC0xXG5cdFx0XHRcdH1cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdQYXRoIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBhIGZpbGU6ICcgKyBhYnNvbHV0ZSlcblx0XHRcdH0pXG5cblx0XHRpZiAoaW5kZXggPiAtMSkge1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlYyhjZmcucnVuKVxuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRwYXRoOiBjZmcucGF0aHNbaW5kZXhdLFxuXHRcdFx0XHRmaWxlQ2hhbmdlZCxcblx0XHRcdFx0cnVuOiBjZmcucnVuLFxuXHRcdFx0XHRyZXN1bHQsXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGxcblx0fSlcblxuXHRjb25zdCByZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcblxuXHR3cml0ZUZpbGVTeW5jKHBhdGgsIEpTT04uc3RyaW5naWZ5KGRlcHMsIG51bGwsIDIpKVxuXG5cdHJldHVybiByZXNcbn1cbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL2hvbWUvam9oYW4vUHJvamV0cy9tb24tZW50cmVwcmlzZS9zaXRlL3NjcmlwdHMvcnVuU2NyaXB0T25GaWxlQ2hhbmdlXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvaG9tZS9qb2hhbi9Qcm9qZXRzL21vbi1lbnRyZXByaXNlL3NpdGUvc2NyaXB0cy9ydW5TY3JpcHRPbkZpbGVDaGFuZ2UvaW5kZXgudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL2hvbWUvam9oYW4vUHJvamV0cy9tb24tZW50cmVwcmlzZS9zaXRlL3NjcmlwdHMvcnVuU2NyaXB0T25GaWxlQ2hhbmdlL2luZGV4LnRzXCI7aW1wb3J0IHsgZXhlY09uRmlsZUNoYW5nZSB9IGZyb20gJy4vZXhlY09uRmlsZUNoYW5nZS5qcydcblxuZXhwb3J0IGNvbnN0IHJ1blNjcmlwdE9uRmlsZUNoYW5nZSA9IGFzeW5jICgpID0+IHtcblx0Y29uc29sZS5sb2coJ1NlYXJjaCBmb3IgY2hhbmdlZCBmaWxlLi4uJylcblxuXHRjb25zdCByZXN1bHRzID0gYXdhaXQgZXhlY09uRmlsZUNoYW5nZSh7XG5cdFx0YmFzZVBhdGg6ICcuLycsXG5cdFx0ZGVwc1BhdGg6ICcuZGVwcy5qc29uJyxcblx0XHRvcHRpb25zOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdGhzOiBbXG5cdFx0XHRcdFx0Jy4vc291cmNlL3BhZ2VzL1NpbXVsYXRldXJzL0Vjb25vbWllQ29sbGFib3JhdGl2ZS9hY3Rpdml0XHUwMEU5cy55YW1sJyxcblx0XHRcdFx0XHQnLi9zb3VyY2UvcGFnZXMvU2ltdWxhdGV1cnMvRWNvbm9taWVDb2xsYWJvcmF0aXZlL2FjdGl2aXRcdTAwRTlzLmVuLnlhbWwnLFxuXHRcdFx0XHRdLFxuXHRcdFx0XHRydW46ICd5YXJuIGJ1aWxkOnlhbWwtdG8tZHRzJyxcblx0XHRcdH0sXG5cdFx0XSxcblx0fSlcblxuXHRyZXN1bHRzXG5cdFx0LmZpbHRlcig8VD4oeDogbnVsbCB8IFQpOiB4IGlzIFQgPT4gISF4KVxuXHRcdC5mb3JFYWNoKCh7IGZpbGVDaGFuZ2VkLCBydW4sIHJlc3VsdCB9KSA9PiB7XG5cdFx0XHRjb25zb2xlLmxvZygnQ2hhbmdlZCBmaWxlIGRldGVjdGVkOicsIGZpbGVDaGFuZ2VkKVxuXHRcdFx0Y29uc29sZS5sb2coJ0V4ZWN1dGU6JywgcnVuLCAnXFxuJylcblxuXHRcdFx0aWYgKHJlc3VsdC5zdGRvdXQpIHtcblx0XHRcdFx0Y29uc29sZS5sb2cocmVzdWx0LnN0ZG91dClcblx0XHRcdH1cblx0XHRcdGlmIChyZXN1bHQuc3RkZXJyKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IocmVzdWx0LnN0ZGVycilcblx0XHRcdH1cblx0XHR9KVxufVxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvaG9tZS9qb2hhbi9Qcm9qZXRzL21vbi1lbnRyZXByaXNlL3NpdGVcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIi9ob21lL2pvaGFuL1Byb2pldHMvbW9uLWVudHJlcHJpc2Uvc2l0ZS92aXRlLXB3YS1vcHRpb25zLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9ob21lL2pvaGFuL1Byb2pldHMvbW9uLWVudHJlcHJpc2Uvc2l0ZS92aXRlLXB3YS1vcHRpb25zLnRzXCI7aW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJ3ZpdGUtcGx1Z2luLXB3YSdcblxuZXhwb3J0IGNvbnN0IHB3YU9wdGlvbnM6IFBhcnRpYWw8T3B0aW9ucz4gPSB7XG5cdC8vIHNlbGZEZXN0cm95aW5nOiB0cnVlLCAvLyBVbnJlZ2lzdGVyIFBXQVxuXHRyZWdpc3RlclR5cGU6ICdwcm9tcHQnLFxuXHRzdHJhdGVnaWVzOiAnaW5qZWN0TWFuaWZlc3QnLFxuXHRzcmNEaXI6ICdzb3VyY2UnLFxuXHRmaWxlbmFtZTogJ3N3LnRzJyxcblx0aW5qZWN0TWFuaWZlc3Q6IHtcblx0XHRtYXhpbXVtRmlsZVNpemVUb0NhY2hlSW5CeXRlczogMzAwMDAwMCxcblx0XHRtYW5pZmVzdFRyYW5zZm9ybXM6IFtcblx0XHRcdChlbnRyaWVzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG1hbmlmZXN0ID0gZW50cmllcy5maWx0ZXIoXG5cdFx0XHRcdFx0KGVudHJ5KSA9PlxuXHRcdFx0XHRcdFx0IS9hc3NldHNcXC8uKigtbGVnYWN5fGxhenlfKS8udGVzdChlbnRyeS51cmwpICYmXG5cdFx0XHRcdFx0XHQoZW50cnkudXJsLmVuZHNXaXRoKCcuaHRtbCcpXG5cdFx0XHRcdFx0XHRcdD8gLyhpbmZyYW5jZXxtb24tZW50cmVwcmlzZSlcXC5odG1sLy50ZXN0KGVudHJ5LnVybClcblx0XHRcdFx0XHRcdFx0OiB0cnVlKVxuXHRcdFx0XHQpXG5cblx0XHRcdFx0cmV0dXJuIHsgbWFuaWZlc3QgfVxuXHRcdFx0fSxcblx0XHRdLFxuXHR9LFxuXHRpbmNsdWRlQXNzZXRzOiBbJ2xvZ28tKi5wbmcnXSxcblx0bWFuaWZlc3Q6IHtcblx0XHRzdGFydF91cmw6ICcvJyxcblx0XHRuYW1lOiAnTW9uIGVudHJlcHJpc2UnLFxuXHRcdHNob3J0X25hbWU6ICdNb24gZW50cmVwcmlzZScsXG5cdFx0ZGVzY3JpcHRpb246IFwiTCdhc3Npc3RhbnQgb2ZmaWNpZWwgZHUgY3JcdTAwRTlhdGV1ciBkJ2VudHJlcHJpc2VcIixcblx0XHRsYW5nOiAnZnInLFxuXHRcdG9yaWVudGF0aW9uOiAncG9ydHJhaXQtcHJpbWFyeScsXG5cdFx0ZGlzcGxheTogJ21pbmltYWwtdWknLFxuXHRcdHRoZW1lX2NvbG9yOiAnIzI5NzVkMScsXG5cdFx0YmFja2dyb3VuZF9jb2xvcjogJyNmZmZmZmYnLFxuXHRcdGljb25zOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHNyYzogJy9mYXZpY29uL2FuZHJvaWQtY2hyb21lLTE5MngxOTItc2hhZG93LnBuZz92PTIuMCcsXG5cdFx0XHRcdHNpemVzOiAnMTkyeDE5MicsXG5cdFx0XHRcdHR5cGU6ICdpbWFnZS9wbmcnLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0c3JjOiAnL2Zhdmljb24vYW5kcm9pZC1jaHJvbWUtNTEyeDUxMi1zaGFkb3cucG5nP3Y9Mi4wJyxcblx0XHRcdFx0c2l6ZXM6ICc1MTJ4NTEyJyxcblx0XHRcdFx0dHlwZTogJ2ltYWdlL3BuZycsXG5cdFx0XHR9LFxuXHRcdF0sXG5cdH0sXG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQ0EsT0FBTyxhQUFhO0FBQ3BCLE9BQU8sVUFBVTtBQUNqQixPQUFPLFlBQVk7QUFDbkIsT0FBTyxXQUFXO0FBQ2xCLE9BQU8sUUFBUTtBQUNmLE9BQU8sVUFBVTtBQUNqQixPQUFPLGlCQUFpQjtBQUN4QixTQUFpQixjQUFjLGVBQWU7QUFDOUMsU0FBUyxlQUFlOzs7QUNUbVgsU0FBUyxzQkFBc0I7QUFDMWEsU0FBUyxRQUFRLG9CQUFvQjtBQUNyQyxTQUFTLFlBQVksV0FBVyxjQUFjLHFCQUFxQjtBQUNuRSxTQUFTLFVBQVUsZUFBZTtBQUNsQyxTQUFTLGlCQUFpQjtBQUUxQixJQUFNLE9BQU8sVUFBVSxZQUFZO0FBcUI1QixJQUFNLG1CQUFt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Q0MsT0FBTyxLQUFLLFFBQVEsS0FBSyxFQUFFLEtBQUssQ0FBQyxTQUFTLEdBQUcsU0FBUyxPQUFPLE9BQU8sQ0FBQyxHQUNwRTtBQUNELGVBQU8sTUFBTSxhQUFhLEdBQUcsUUFBUSxXQUFXLEVBQUUsQ0FBQztBQUFBLE1BQ3BEO0FBQUEsSUFDRDtBQUFBLEVBQ0Q7QUFDRDtBQUtPLElBQU0sWUFBWSxDQUFDLFNBQWlCO0FBclEzQztBQXNRQyxNQUFJLFVBQTZCLHFCQUFJLElBQUksRUFDdkMsb0JBRCtCLG1CQUNkLE1BQU0sU0FEUSxtQkFFOUIsTUFBTSxRQUZ3QixtQkFFbEI7QUFFZixNQUFJLFdBQVcsU0FBUztBQUN2QixhQUFTLElBQUksSUFBSSxFQUFFO0FBQUEsRUFDcEI7QUFFQSxTQUFPLFVBQVU7QUFDbEI7QUFVTyxJQUFNLHFCQUFxQixDQUFDLFNBQWlCO0FBQ25ELFNBQU8sQ0FBQyxVQUFVLE1BQU0sRUFBRSxTQUFTLFVBQVUsSUFBSSxDQUFDO0FBQ25EOyIsCiAgIm5hbWVzIjogWyJwYXRoIiwgInJlbGF0aXZlIiwgImluZGV4IiwgInBhdGgiXQp9Cg==