import $ from 'jquery'
import { j3pAddContent, j3pAddElt, j3pAjouteBouton, j3pAjouteDiv, j3pArrondi, j3pClone, j3pDetruit, j3pElement, j3pEmpty, j3pEnsureHtmlElement, j3pFocus, j3pGetNewId, j3pIsHtmlElement, j3pNombreBienEcrit, j3pNotify, j3pShowError, j3pValeurde } from 'src/legacy/core/functions'
import { j3pCreeSegment, j3pCreeSVG } from 'src/legacy/core/functionsSvg'
import { recupeTaille, startRecordingButton, stopRecordingButton } from 'src/legacy/outils/audiorecord/audiorecord'
import ecouteImg from 'src/legacy/outils/memory/ecoute.png'
import { InitSlider } from 'src/legacy/outils/slider/slider'
import { addDefaultTable, addDefaultTableDetailed, addTable, getCells } from 'src/legacy/themes/table'
import { j3pAffiche, mqAjoute, mqCommandes, mqRestriction } from 'src/lib/mathquill/functions'
import { checkImgUrl } from 'src/lib/utils/net'
import { hasProp } from 'src/lib/utils/object'
import onLoad from './images/Loading_2.gif'
import './function.css'
const genSon = 'data:audio/wav;base64,UklGRuy3AABXQVZFZm10IBAAAAABAAEAIlYAACJWAAABAAgAZGF0Yci3AACIhISCgH5+enx+gHx4cm5udHp+fHh0cHJ0enx8enx+fn6GiIyMiIaKio6Wmp6goJycnp6coJ6cnJqanqSoqqigmJKSmJygop6ampycmpaOjIiIhoSChoiGgHx2cG5qaGhiYmRkZmRgXFpUUlJUVlhcVlZYWmBgYFxaWlxiZmpsbGxsampubnBwbmxsbnB0cHBubGpqbGxwcnRwbnB2enyAfoB8fH5+goSEhISCgICEhoyKhoCChIiMjIyKiIaCgoaMioiEhISGjpaanJyYlpSWnqKkoJyYlpiYmJaSkI6MioSKjIyIhIB8en5+fHp2eHp6fn6AfHp8enh8foSEgoJ+foKGiIaAeHR2dn58fHx8fHZ2cnBydnRwcHJ6fHp2dHBwbm5sbm5wcHJubnB0dHBwbG50dnx8enp4enZ2dnZ0dnh4fH5+fHp2dHR0enZ0cnZ6eHp6eHh0dnh0dHZ2eHZ0cGxqamZiXFpYWFhaWlhYVlhYVlZaWl5gYGJkZmhoaGxucHJ0eHR2en58fHh0dnZ8foCAgH6ChoSEhISEhoaIjJKWmpiSkpSWmp6enJiampqcnpqYkI6MjIyOjIiGhoiIhoqIiISChISKjo6MiISEhoqOkJKSkpSQjpKYmpqWkJCOkpKUkpKQio6OjI6MhoKAenp2dHJuamhoZGRoamhmZmZkZmhqamhoaGxsbm5qamZoaGpqbm5ubmxuamxsbm50cnR2fHx+foSAfn6CiIqMjpKSkpaeoqCWlJSWlpSanp6alJSSkJCSlpaSkpKWmqCemJKOjI6SlpaYnJqUlJaYlpKQkJCSlpqYkI6OjoyKiIiEgHx+hoaIhoJ8dHBucnR0cHJycHJucGpoZmZoZGZoaG5ubmpsamhkZGRkZGZqbGhmZmhkZGZkYmJkZGZqbG5wcGhoam5yenx6eHZ0dnp6eHh4dnp6fHx6eHRybG5ucnR0cnBudHRycnBwcHZ4enp+fnx8fHZ4fH6EhISGiIiGioqMjoyKiIaIjJSampiWkI6MkI6UlJKQjIqEhoqIgoCAfHp+goCAfnh4dnJ2dHRycHBsbnJwdG5waGhqampsaGRiZmhoamhmaGZsbGxubmxsbm5wcnR0cHBubnJ0eHp2dHZ2eHp8fn5+fnx+goaKioqEhIiOlJiYmJSSkI6OjpCQkJCQjo6SkpKMjIiGiIqMkJCQkI6MioiIhoqKioaIhIaGioiKioqKjIqIiIaEhIKCgICEhISAfHp4eHp6dnR2cHBycnJ0dHJycGpudHR0dHBsbG5ucnJ0cnBwcHZ4eHp4dHBydnp+hIB8eHZ2dnp+fHh2dnR6en5+fHZ0cHBydnRybmxqamZoZmJgXFpaYmZoampoaGhucHJycHBwdnx+goaGiIiMjpSWmpqYlpacnqCinpygoqakoqSkoKCepKaopqKenJaWlJKSkpCKjIyMjo6MiIaIhIiKjpKUkpKSkI6OjIiGgHx6fHp4dnZ0dHJ0dnR0dHJydHZ2eHZ2dHJ0dnh8foCAfn6CgoB8fHx4eHRwdHZ4eHhyamhmaGpsam5ydHZ2eHh2dnJucG5udHx+goB+gH54dnRydHZ4fHx+goSAfn58en58fH6GjpKSlpKQjpKQkpKSkIyOjpCMioaAgHp4dHBycHBubGRgXlpaWFZSUlBQUlRQTkxITEpMTkxMTE5SVlpYWFxiZmhqbnJ2en5+gIB8enx+foKAfn6AgIKCgoSIjJCQkI6SkJKUkI6OjpKWlpiSkpaWmJSUkJCSlJKWmpyYmJaWlJKWmJaWlpqcnqCeoJiSkpCSkpCQkJKMioaCgHx6fHx4cm5ydHJycHBwbmxucnJ0dnh4cm5ucnR4enp4eHp+hoaIiIyOjo6Ump6cmJKSkpaWmJaWlpiWmJyenpqWmpqYlpaQiIKAgICAgICAfHh0dHZ0dHJybGpqbGxsamZoZGZmaGhqZmhoZmRmZGJiXmJmZmxsbnJydHZ8enp6dnR0dHZ0eHJ0dnZ6foaKkpaUkJKUkpCMioqOjpCQjo6OjoyOjpCSlJSSkI6IhoJ8eHR0dHZ8foSGioaIiIaEhIKEgoB+fn5+gHp4dnJydHh6enx4cnBsbGpoaGRgYF5eZmpqamRgXFpaXl5eWlhWVlZUVFBQTkpGRlJYWmBiZGRiZGRkZmZmZmZobG50eH6ChoiOlJqepqysrrCwsri6vr6+vLq+vsLGxsbEwLy4srCurKiinJiYnJ6mpKKinJyenJyYlpSQioaEgH5+fnp4cnR4en6CgHp4dHBsbGxscG5qZmZoampmZGJiYGJiYmBcWFRUVFJWWl5iZGZqbHJydHJubGhmZmpqaGpsbG5ucnR6foKEhoaIio6OjIiEhoiKjI6SlJqeoKCgoJ6gmpaUkIyMiISEhIKEhISGhoyMjpCOjo6QjIyMjoqIgoSEhIaKjIqGiIqMioqGhIKAgICAfHx0cm5sbHB2enx6enh8foKGiIKAfHp+foSEhIKGiIyOlJSYlpaSkpKQkJCQioaGhoaKjI6MjI6OjoyKhoSAfHZwbGpsbGxqaGhobGxqZmRkYmJgXmBgYmRkZmZoam5ydHR4eHh4dnRwcnJ0dHBycnR6foKCgoKGhoaGiISCgHp4eH5+gIKEgoKGiI6SlJSSkI6MjIiCgoCAfoKGjJCUlpSQkpCQkI6MhICAgHx6eHh6foKCiIaGhIKCgICCgoB+enp4dHR0dHJydHJwcnZ2eHh6eHh2cnBubGxwbG5sampucHR0dnZ0cnJucHBqaGJgXl5cYGJkYmJkYmRmZmZkYF5aXmJmaGhoaGhobHB0dnZ2dHR2eHZycG5qam5ydnp+foCEhIiIjIiIhICEgICAgoB+goSIio6OkJCSkpKOioyGgoKAgIKGjpKWnJyenJycmpqcmpiSkpKOjoyKhoaGio6QkpSSko6MioaGhoB+en5+goaIhoaIjI6OjoyKiIiKioiEgH5+fn6CgoaGiIyQkIyMiIqGioiEhoiGhoaGhIKChoyMjI6UkpKWkoyGhoSAenx4dnp8eHh6eHx+goB+goKAgICAfnp6eHh4enx+gIKChIKEiIqIhoSAfn5+enZ0dHJydHZ4eHhwcG5ydHJybnBucnRycnZ2eHx8fnh4enp4enx4eHh4eHp+foKEhoaIiIaGhoSCfHp4dnZ2dHRycHBydnh6fHp8fH5+fHp2enZ4dnR0cnJ0eHZ2dnBwbGxsbGxoaGZoZGRkYmBgYmZscnZ2dHJwcHBwbmxoZmZmaGxsamxqbGxqamxscHBydHR2dHZ0cm5sbnJ0enp6fn58enx+fH6CgoSChIaIhoaIhIKEiIqMjo6MjIyIgoB4dHJsbGhobGpsbG5sbm5ubnByeHZ2dnR0cnJ0dnp8fICCgoKAgH58eHZ2dHJ2fH6AfoKCiIqOkI6OjpCSlJSWmJqamJiampSYmJaWlpSOjIyIhoiIiIqIiIaGiIaEhIiKhoiIhoaMjIqOjpCOjpSUlJaSkpKOioqMjIiKioqIioqGhIaChICEgoCAgoB+foKChIKCgoB+hoiIhISEgIKCgICChISChIKAfH5+fHh4dnJydHJ0dHJwbnBydHZ8enZ6fH5+iIqIhoaIhoaOjIqOlJSQkpSQjo6KjI6MjIyOioaEhIKAgoKEgoB+fHp6dnRycHB0cnBwcG5ubGxoZmhoaGZoZmRkZmZkYmRgYGRqbGpubmxsbm5wcHR0dHh+foCChIJ+fn58fH5+enp6fHp4eHZydHR6enx+fH5+gHx+fnp+fH5+foKCfoKAfoCAgH6EhoSGhoiIiIaEhISEhICCgoB+foB6dG5qaGRmZGRgYFhSUFJWWFpcWlhYWl5cXFxaWlxiZGJmamhqam5ucHZ0dHp+goKEhoSGjIyOjpSSlJSSlpiYlpacnJqenqCipqSgoKKenJyenqCgnpycmpSQkI6OkJKUlpaWko6QjIiIhIKAfHhwcG5wbGxsaGZmZGJiYGJkYmZoZmZmZGZmamxscnB0cnZ2dnZ2eHh4fn6AgoaEhIKGiIiKiIaIhoaGiIyOkJCOkJCSlJaYmJaUlJKWlpqYmJaalpSWmJaYmJiWlpqampqYmJaWmpiWlpaSkIyMiIiGgoB6fnp6enh0cHJwbGhmZGRgYF5YWFpaWFhaWlhYWlhYWlpaXGJkZmRmYmRkZmhqbG5ucHJ0cnRwbm5ycG5wcHBudHRydnR0dnZ6enh8fnx+fn6AgoaIjpKWnJqcnp6anJyanJyeoJqYlpiYlpqYmJiWmpqanpyYlpSQkJKWmJiWmJSUko6MioaEfn58eHZ2dHBwbm5wdHR2cnZ2eHh6enp4eHh8fH6ChISGhoSGhoaEhISChoaGhoiIhoaIiIqOkJCSkIyIhoqMkJCUlJiamp6gnJqYmJqampaWkpSQjIyIgoB8fn5+fHx2eHh6enh0dHZ8fHp6eHh0cG5ubGxubGpoZmRiYmBgXFxcWl5iZGJkYmJiYmRmaGxudHZ4eHh2dnh4eH5+gIKCgoSCgoKAfnx4eHh4dnRwbm5wamhmZGJkYmBgYmRmYmRkXF5gZGJkZmRkZGZkYmJiYGBeYGJmamhkYmJgYGJkZmhsampsbm5wcHJycnJ2enx8enp4enh8fHx6fHx6fHx+enp6eHZ2fH5+foCAfnx8fH6CgoKEhoyQkJKWlJacnJ6goKSmpqakoKKgnpyampyalpiWlJSUlJSWmJyeoqCgoqKgoqSmqKyqpqampqampKSinJyalpKQjoyIhIKCgH5+fnx4dHR2dnp8fHp6enh4enx6enx8enx+goCAgn5+foSEgoSEhIKAgIKCgoaGiIaEhISGjIyKioyQkJCSkpSUkJCQjo6KioyMjJCQkpSUkpCMjIyMiIqIiIaGhoSEhoiIhoaIiIaGiISIioyMioqIiIiKioiEhoaEgIB6eHZ2dnRybnBwbm5sbHB0cHBubmxqbm5sbGpqbGhoaGRmamhmZmRkZGRkZGJiYGJkZGJgYGJkZmpqamZkYmJiYmJgXF5cWlheXl5gYGBeYF5eXl5eXlxaXGBgYGBgXl5iaGxubmxsaGpqbnBycnBwcnJycnR0dHJycHJ0dnRycHBycnR4fH5+foCAgoCAgoKGioyOkJCQkJCQkpSWlJaWlJSUlJSUlJSUkJKSkpCOjo6MjI6OjIqMiIaEhoSIioqMjI6OjpCSlJKSkI6QkJCOjIiKiIiIioqIhIKCgIKChISCgoKEgIB+gICAgICChIJ+fn58eHZ0cGxqamhoZmRkZGBgYGJkaGpsbnJ0eHx6fn5+foKChoyQkpSUkJKOjpCWnp6ioqKioKCenqCkpKamqKiopqKkoqKiqKiopKCYlJSUmJiYlpiSjoyMiIiIiI6OkIqIhoSEhIB8fHx6fHh2dHBqampqbGxsbmxqaGhmZmpobGxoaGhmZmZmaGRmZGZmZmRkYmBgXmBiZmZoaGpqaGZoaGhoZmZmZmZoam5ycnR0dHR2enh+ioyMioiGhoaGio6SlJKUkpKIjo6MiIiGhISGiIiQkpCMioqMjIyMioaEgHx2dnRycm5saGZkYmBiZGpqbGxoaGJiZGZsbnR2dnZ2cnR0eHp+goSEhIaAgH58fH6Afn56enh0cnJ0dHZ6dnJwbmpqam5sbGpsampoZmZkZGZoampudHRycnJ2dnh6enp2eHp6dHJycHJ0dnh8eHZ4dnR2dnh4dnZycHJwbmxqbGpsbm5wbGpoaGJiZGRmaGhoYmZkZmhsbnBydHZ4fH5+goaOkpacoqSkoqCenJ6mrKyurKyqqKKeoqKmpqqutLSysKyqqq6wsKyqqKSioJ6cnJqYkpSMjIqKjIyQjpSQjIqEhICGiIiKioSAgHx4eHR2dnJybmxmZGJiZGZmamxwcHBsbG5ydHZ6fH5+goKEhIaIiIaKjIqMjIqIioyMjIyMiIiIioiKioqKjo6QkI6QjpCOkpCQkpKQkpKSkJKWlJSQkI6QkIqMioaGgoB+foCAfn58eHRwcHBycm5ubmpoZGJgYGJiZGRiYmJgYGBgXGBgYF5aWlhUVlpWWFpgXl5aWFhWVFZYWFxeXmBgYmJkZmhqam5ucG5saGpqbnRydHZycGxqaGpubnR0dHZ4eHZ4enp+hISIioyOjoyOkpKWmpqYmJiYlJacnqCkpqKgmpaUlJaYmJqenqCalJSUkJSUlJaWmJCMioaAfn5+fHx8eHRycnBsampoaGpqaGZmaGhoampsbG5wcHB0cnJydHZ4enyAgICEgoB+goKChIKAfn5+foCCgoSGhoiIioiKiIiKjpCOjpCQkI6SlJqcnp6enp6cmpyenqCkoqCgmpaQkIqIjIqMjIqIiIiEhICAhIaIiIiGhISGjI6SlJiYmJKQjIqIioyOjo6MhIB+fHp6fH5+foB8eHR0dHR2eHh6eHZ0cG5saGZoamxsbGpkYGBeXl5kampqbmxoZmZmaGpubnRycnJwcHJ0dHR4enh4dnh2dnZ2enx8enx6eHh0dHJycnR0cnJycHBubm5wcnBwcnZ2eHR2dnh4eHx+gIKAgoKCgoCAfn5+fn58fHx6eHRydHZ0dnZycnBycnB0dnh0dHR0cnJ2enx6foCAgIB8fH6ChoaGioqGiIiKjpCUkpCQjoyKjo6QkpaUlpaUkpCMjIyMjpCQkIyIhIKChIKChIKAenZ0cG5ubmxubm5saGZmZGJmaGpqbm5wcHBsaGpmbnB0dnRydHZ2eHZ6en5+hISEhIKCgoCEgISGiISGhISChoiKioqIiISEhoSCgoSGhoqMjIqKioaIhoaEiIaIjJCUlJCOjo6QkpaYmJaWlpKQkI6SkJCQkJCOjoqMjo6Ojo6OjoqMjIyOjo6KioyIhIJ+fnx+enh4dHRubGZkZGRiXmBeWlhWVlZYVlpcXFpaWFxcXmRmZmZmZmZoaGhqcHRwdHR4en5+goKCgoSGiIqKjpKWlpaUkI6OjpKSkpaWlpSSko6OjJKSlpiWlpaUkpaYmpycnJ6goKCgoqKmqKioqKiopqikop6cmJaWlI6MjIiEgn58eHZ2dnR0dG5saGpscHBwbnBydHRycG50dHZ2eHh2dnRycnZ2dnp8fH5+fHp2dHR2dnZ4enp+enh2dHRydnp8fHp2cGpoZmRmamxsamZkZGRkZGRoZmxsaGxsaGpsbm5ubGxwcHJ2dnZ4enx+fn5+foKEhoqMjIyKioaGioqOkJKUlpaWlpiYmJSQjIyIhoaGhoKGhoCAgIKAgICAgISEhIB8fH58eHZ2dHJybmxsbGxsbGxqaGhoZmhoZmhscG5sbGpubm5ubnJwcG5saGpsbGxubnBwcHBwampsbnBydHR0cnJwbm52dnp6foB6enh0cnZ0dn6Afn5+fnx6foSIjI6UkJSOlJSUlpyeoqampKSenJqampyeoqCemJKOioiIjIyQkI6QjoqIiIKAfn56enx8fHx8eHh2dHR0dnRycnJwcG5ubnBybm5wcG5wcGxqbnJ2eHh6en58en5+gIKGioqKjIqIioiGhoaGhISCgoCAfn6AgIKGjIqKioyOkpSUlJaWlpaYlJSYmp6enJyYmJqcnp6gmpiYkpKMiIaGhoaIioaEgICAeHZ4cHBwbGpoZGJgXl5eXl5gXlxaWlxcYGBiZGJmZmhqampqbG5wcnJ0cnBydnp8foaGhIaGhoiIioyMkIyMjIyMioqOkpiaoKKgoKCenpyampyeoKCamJiYlJSSlJKSkpCQkJKWkoyIiIiKhoSEgoCAeHRsbGpqaGhkZGJeXFZaWlxcXl5eXl5cWFZUVFJUVFJQUFBSUlJSUFJSVFRWWlpaXl5kZGZqam5ucnJ0enx8fHp8fHp8fHp6en5+gIKChISGhoqMjo6Qkpaamp6enqCioqaopqioqKasqKSooKCYmJiWlpaWkJKSkIqGhoSAfn58dnZ4dnRycGpqcHB0dHZ2dnZ0dnZ6fn5+fnx2dHJydHJydnh2enZ2cnBwbG5wcnZ0dnZ4eHh8fHx+hoiIjIqKjI6WmJicoJygoJycmpqYlJKSmJiYmpiYmJaYmJqenJqYmJiSkpSUlJaYmJKQkJCQioiEhIKAfHhwbGhoampoZmJgXmBeWlhWVlZYWF5kZGZqbGpqamxscG5ycHJ0cnB2eHh8fn6AgHx8eHh6fn5+goKCgoKAhIaOlpygoqKgnpycoKKmpqiqpqKalpaUkpKWlpaSjIiAeH5+hIaGgoB8enh4fHx8foKCgHp2dHBoZGJkYmRiYFxWVFBUWl5iYmBcWFRWVlxgZGZkYmJgYGZmamxubnBwcGxoZmZkZGZucHBuamRkZmpubnJuamhkZmhqbnJycG5sbG52fH5+fnx6fICGjI6OjJCQlp6kpqKgnJicoqqytLKqoJycnqautLCqopycnqasrqyinpiWlpyipqSakIaCgoKKjIyKhIB8fHh0cnBwcHh6fHx4cnBqbHJ4fn6AfHRubGhsbnR2dHJsaGBgYGRqcnp8enh0bmxudHp+hISEgIB+gICChIiMkJSSkpKQioiMkJacoqKclIqKiIqQmJqYjoSAdnZ+hISGgHh0dHR2dnp2cHBycnR2dnJycnJ8fH6AfHRwbHB2fn6EgoB4cHB2fH5+fnx4eHp+gIaIjIyIiIqMjIaGgIB8gIaGjpCIhIB2dnp+hoqGhHp0dHZ+goaGgHx6dnyChoSEgHp8fH6GiISAeHR2enx+fn54cHBubGpqbnJ0dHZ4dHJycGxubm50dHR0cnBwbGhqbG5wcnRwbmpqaGhqbm5ycm5saGpscHJ2dnx8fH58eHZ0eHp6foKCgoKCgHx8foSKjpiYkoiAfH6KlJ6knJaQjIyWnqaoqqKenJqYmJiSlpianJSQiIB8eHh8foaIhoB0aGJmanZ+foB4cmxoam5ucnZ2dnJ0dnZ0dHRwbm52eHh4cm5oZmZscHZ6eHJoYF5gam52dHRsaGRmaGhscnJubG52eHp4eHBwcnyIjo6KhHh0eHh+ho6OjISAeHZ8foKGioqEhoaGio6Okpqgop6empSSlJaSkJKQiICAenh0dnZ2dHh2dnBwbmxoaG5udHZ6eHhydHBydHZ4eHp8foR+goKAeHZ8fo6WnJaIgHZyfH6OlpqYkIiAdHJ6ho6YmIyIgoB2eH6EipScmpCIgHRwcnZ6foyQhoBwaF5gbnqChoaGgHBoZGZqdH6IiIaEfnhydHZ2eoaWnJiQiIB4fIaOmKKmpJyMgHh6fo6aoJSOjoqGiI6SlpqiopqWlpKMioqKjpaorqigjIJ6fIaOnKSoppqGgHZ4foyepKCQhoBsaG50eH6OkoiAcGhgYm52foSOioBwbGRgZm50dHZ4cGxgYFhSUlZcYGJgXFhSUFJSUlRaWFpcYFxaWlRSTlJWXmZ2foR4amBcXGZ2ho6QkIiAaGJqcnyOnqCQiISAcHR+hIiWpqCUiIR6eH6KkJKepKCQgHp2dn6anqCclpCAdnZ6foaOmJCIgHhwam50cnJ6foSAcm5iYm50en6AgHRqXlxaXmhqcGhgWlhSTlBWXF5iamhcWlpYVFhcWlhicnZwaGRgVlxmbnqGkpKIgHh4dn6OpKqooJiKgHqEjpquvLSimJiQkp62wsbO1Mi2rqympq6+wLq2uLSurq6onqKqsLC0tKygoKCgmJygnJSQkIyEgICAdHBubm50foJ4aGBWTk5ebnZ4dnZoVk5WXF5ufIBwZmpkWl5qcHB6foSAcHRwaGhueHh6hoiAdHBwbG5+jpaSlJSQgH6EioqOoqigmJCAcn6KioyWoqCUkJCQjJKiqqqqrKiemJaSkI6anp6UlpKIgH6GiIiOlpSIgoSAcnJ2cGhmcHJwaGZkXFxiaGhqdnpybG5uaGJmdHx4eHRoUk5UVlpmdHhuYlxWTlJmdHZ4fnxwZmxsanJ6dnR2enZ4fn6AdHZ+hoqOmpyQhoaOjI6aopiQjo6IhI6WlIiGhoKEkqaooJaQhIB+lqCioqCSgHBwdHByfoB4ZmBgWlRWXlpWWmBgVlhaVE5OVFRQVFxgWFRUUFBUXmxscnRwaGhwbm54foB4dHZuanB2eHR6foqEgIaIiI6WpKSipqqsrLCyrKCmrLCwsriwpKKqqq62vry0sLCuqqqurKCcnqKgnJ6emJKSmJKSlpyWlp6ooISAfoiMkpCAaFxaYGZufHxgVFBOVmJubmZkXlBUWGJmamxqYFJSXGZweHx0YlhWXmRyfoR0ZF5eXmJ2fHhoWlRQVGZ6fHhsYlxebn6UlJKOgHh+jpyipqSgkIaOmJieoqCQhoaIjpaepqCQiIiGhpKenJKIhHx+ipKMiISAeHh+ho6OjpKMhIaOkI6SkoyEgoKCfH6CfHZ2eHpycHR0cHB2eHBsZmpobHBwamhqbGpqbm5oYGJmaGhucnBsbG5wcHJ4dGhmbGxwdnh4eHR4enh2fHp6foaMhHh0fo6UmIqAcHB2foyUkoiAdGxueoqQkIiAdmxudn6KiIiCeHB0fn6MkpCEgHJ2foyWopyQgICCip6utLCglpSSmq68urSsnpicprq+vrquopyerLC0srCgko6UmJqkpJiIgH58foyQhHhwcHJ2foiAeHBwaGpucnBqaGRgXl5mamhkYmJcXGBgYGBgYF5cWlRQUFBUWFZaXlxYWFxeYmZqaGRgYmRobGxsZGRmam5ydnR0bm50dnp6enh6enx+goSCgHx+gIKChIKChoaKioqIhIaMiIiCenp+ho6QiIBycHJ6foyKioR4cHJ2fH6EgoB4cnJ0dn6CgoB6dHB2en6EhIB4cGpudnyGhoB0cm50eoSKiISAeHh+foyMiIJ6eHx+hoqKioSAen5+hIqKjoyEhISIjI6KhoB6eHh8fn58eHBsanJ6fH56dHBqcnZ+fn58dnBydnyAfn5+fHx+goaGiIiGhoaIioyMjI6OlJiWlpSUkpSYmJqYkpCKioyOkI6IgHx+foSKioaCgoSIjIyMjIiIiIiOkJCIiIiKjI6OjIyKiIiKioyIhIaKiIaAenh+hIqMiIJ6dnh+hISGhoB6dnR2eoKAenRubGhmbnJ0bmxsZmRiZmxqamhkYF5maGhmZmZoZmhqcHJubGpscHRydHBsam5ucHJwbGZmanBwcHBoamxueHh2cHBscHR0dnZwbGpscnZ2dG5wam5yenp2cHBwdnp6dnRwcHBydHR0cGxubnZ4eHp6eHR2en5+gnx4dHRydHZ2dnZubnB0cHJydHJubm52enp8en5+fn6EhoaGhoqOjo6Ojo6OioqKioqGgoKGhoaEgoKCgoSGioiGhoiMjJCQkJKWmp6kqKikpKSoqq6usK6sqKSkqKSkoJ6cmpiWlpaSkIyGhIaGhoSGgoB8en6GjIqMjIqMjpKWmJaWkpKcmJiWkJCQkJCQkoqEgIKGiIiKiIiEgISMjIiEgICEhIiGgoB4cm50eHh0bmxqZmpsamhkYGBeZmhkYl5cWFxcYmZmYl5gYmpubm5ubm5ydnp8enh2dnZ2eHp6eHJwbm5ucnJwcHBwcHJycnBwbHBwcG5scm50cnB0eHh2dnZ4eHh4eHh2eHh4dnJwcG5ucGxsamhoZmZmZmZoZGJmaGhqbGxsam5wdHZ4dHRybm5wbm5saGRiZGJiYmRkYFxYXF5iZGRiZGRiYmZsbmxsanBucnRycnBscnR2dHRydHJ2eHyAfoB8fH6GioqOjpSUlp6goqSkoqissrS4trSwsLC6vLq4tLS2uLi2tLSuqKasrq6qpJyYlpaYnqCgnJiWlpycnJqampqcnJycmpKQkpKUlpaSioaEhISGgoCAgH6AfH6AfHp8enp6fHh2dHR0dnh6fHh4dHJycG5wcHJucnBwcG5ydHZ6enp8enp6foCChIiIhoaKioiIioiGhoiGhISAfHx6enp4eHZ0cGxsbGpqamhoZmZoZmhoZGhmaGpsbG5ucG5ucHR2dnh2eHh2fHp4enp4enp6fn5+foB+fH5+gH6ChIKGioqKjI6QjpKWmpiWkoyMioyIiIaGhIB8fHh4dnR0cnBycHBuamhobnJ0dHJ0dHJydHR0dHJycnBwamhkZGBgXlxgYmJeYGJiYmRkampqbGxsam5ycnZ4fn5+goSEhoaKjI6OkIyOjIyIhoiEhoaGhoSAfnx4dnZ4eHZ6eHh6fnp8foSAgoaGhIaMjIqMjoqIjIqGiIiGiIiGhIaCfn6AfHx+gHp6enh2dnp4en58enx+hISGhoiGiIqKhISEgoKEgHx6enp4enh4eHp4dnZ0dnh4eHZ6eHp8enh2enx+fn6AgoKAgoB+foCAfHp6fHp6dnh4enh4dnp8enx6enp+fnx+foCCfoB+gH6AgH6AgoSGhIKChIKEhoSGioiIioiKiIaGhISEgoKAgICAeHRycHBucGxsampscHJ0dHR2dnJycnZ0enx8eHp6fHp6eHp+fHp8enp8fn58gICAgoSCgoCEgn6CgoCAgoB8goSChIaGhIiGhISChIaEgoKEhISGhIiIhoaIhoaIiISGhoSCgoaEgoKEhISGiIiGhoaEhIaIiIiOjoiGgoKIioaGiIiKjIiGjI6MioqIioyKiIiIjI6Qjo6MjIyOjI6UkpSSjIySko6IgoaIhIB4dnh0cmxoaGxqZGBeYGBiYmBkZGZkYFpiZGJgYF5eYGBeXmBiYmBiYF5aXF5iYGJmZGRmYmBeYGBkZGJiZGBgYF5gZmpqaG5ucHZ4dHh+hIaOjJKYlJKSkpacnpyalpyemJSYmJianJiSlpSUlpqYmJ6ioKSioqampKKenqSmoJqYmpycmI6OlJKMioiAhISAfnx8eHZybnBuamxsampqZGZqbGZoaGhoaGZkaGpoamhiZGZkYF5cZGJcWlpYWFhUUlZYWlpYVlpiZGRkZmhucnZ0eHp+hIKChoySlpaSlJqcmJKSlJqcoJ6coJyamJaanqKgpKSkoqKgnqKkpqyqrKqspqaoqqiqrKqoqKCampqYmJiUlpqWlJSQioyMio6Ojo6OiIKCgoB+fnx8fHZycGxqaGhkYmRiZGJeXlxcXmBgYmJgWlxcWlpeXl5eYF5cYGBgYF5iZGRkZmZoamhoaGpubnBubm5sbm5wbnBycnRycnJydnp8enp6fHx6enx+foSCgoSIiIqKjpCSlJCQjI6QkJSWlJaalJCQjo6SkpKWmJaWlpKQlpiYkpKQkJKSjIiKioyOjI6Ojo6MiISKjIyIiIqIiISCgIKCgoSEhoiIiIaGhISGhoSEhoSCgoKAgHx6enh0dHJycnBucnR2dnh6fHx6fHx8fH5+fHp8eHx6fHx4enp6eHp8enp2dnh4eHp4eHp8fHp6eHh4dnZ0dnZ2dnZycG5qamhoaGZiZmZkZmRgYmBcWlxeXGBgYGBiZGZobG5ycHBycnR8foSGhoqMkpCSkJKWmJqampiUkpKSkpaanJqYmpyalpSUlpienqCeoJyamJaWmJqWmJSQkJCKhoaEgoCCgIKCgHx2cnR0dHZwcGxqamhmZmZmZGRkZGRmZGRgYGJkZmZkZGRmZmZmZmRoampmZGRmYmRmaGhoaGxubm5wcHJ0eHp8fHh6fH6EhIaKioqOlJKQkJKUmpqcnJyenqSkpqikpKaqrLCysK6wtri4trKurrC0uLSyrKqopqimpKKempqYlpCIhIaMiIiCeHZ2dHRwbGpqbm5uamhmZmZmamhoZGJgYmZoZmBcXF5gYFxYWl5iYGJgYGJmZmpsamZkZGhqbGhoZmRqbm5uamhqbnB0dHR0dHh8fn58enp6goaEgoKCiIySmJiSlpyipqagnJqkqKagnpycnp6gnJaQkpaWkIqCgHp6fn54cGxscG5wbmhkZGZsbm5saGhsbnJwbmhobG50cnBqaGxycnJsaGZqbnJ0cmxmamxwcG5sampydnh2eHh2en6AfHp2dHR4fH58enZ2eHp4dHBydnp8fHh0dHp8fn5+goaGjIyMjIyMkJKYlJKUkpiYnp6cmJaWlJSamJiWmJqcnJ6enJqenp6goJycnp6enpyamJiWlpiUkpKQkpKSkIyGhISCgIB6eHZ0cGxwbGxqbGxsamhqamxsaGhqampqbm5samxsbmxucnBycnJydHR0cHBwcnJwcG5wcHJ0dnh6enp6fHp4enx+fn5+fnx+foKEhoiIhIaIiIiKjoyOkJCSkJCSkpCSkJCQkJKSkpSUlJSSlJaUkJCOjo6MioyKiIaGgoB+fHh4dHJycG5samxobGxqbGxsbGpsbGpqbmxqaGpqaGZmampsbmxsbm5wcnJwdHJydHR0dHRycnJydHJycHBsaGpoaGZmZGRmaGhqamxsam5ubHBwbmxsbHBwcnR0dnp8fHx+gICChISEhoiIiIiKjIyOkJCQkI6MioaGiIyKioyOjoyMjpCMjIySkI6OlpyQgIKOnqigkIJ6fo6WlIZ4dHyGlJSQhIB4fo6QiIB2dn6GjoyAcm54foiEeGpmeoaGgHBsbn6EhH52bnZ+ioqEdnJ4foqKgHhycn6IioZ8eHZ+iIqCgHBydn6IgHZsbHR+gIB4amhudn6AdGhqbnh+gIBwbnJ+jIqAeHp6fo6SioJ8fIiWmJCChIaMmJ6YiIB+ipKQgHh6foaMiIBwcnZ6fn50ampyen6EeHBsdHp+fnhwanJ6goJ8cGZuenx8fHZsanZ+gHhwbGx2foKCfHBueoiIgHhycHR8gn50bGp2foiAcnJwdn6OjIB4en6Kko6EeH6GjpSQioCGjpyclI6KipSeoKCQhIiSnJySiICCipKUjIBydH6CgHp0aGZqcHZyZmBgYmxwcmxkXGJqcnRwampoam50dG5mamxwdnZ0cnJ0en58fHh2dnx+fn58eHx+foSEhICEhoyOkpKQkJKWkpCMjoyMkJKSkIqIiIqIiIiEgoKCgoKEgICChISKioyKhoaGhoSChIKAfoKAfHx6eHh6enJubnBwbmxsamhmamxwZmhmZmZmZGpoZmJmampoam5wcG5ycnBwbnJwcG5ucHJucHJybGpubmxucnZycnZ6enp6fHx8fn6EhIKEgoKChISChISEgoKEhIKCgoSCgoKGhoSCgIKCgH6ChoKAgoSAgH5+goB6fH54eHZ4eHR0cnR2cnJ0dnZ2eHp8enh6fHx8fn5+fnx8foKEhIiKjoiIjpKUkpaWlpaWmpyYlJaUkIyMjJCOjI6Qko6QkpKQjIqOkpCOjpCQio6MjIqKiIiKhoaIioqEiIaGhIaGhoiIhIaIhIKChIKAfn54dnx8eHZ2cnBycm5sbmxobGpobG5mZmpqaGpsbGxwcG5ydnZ0eHh2dHZ4dHZ8fHp+foB+goaAgoaKiIqOjoqMjoyOlJSSlJiWlJiYlJSUkJCQkJKQjIqIjJCMhoiIioyOioiGhoSAgHp8foSEgHx8fHx4dnRwbGpoaGZkYGJiXmBgYmJoZmZkZmZmaGpqbG5ucHBubmxucHBwbG5sam5ubGxubGpqampqam5qampubm5wcnJycm5wcHJ0dnR0dnh4enx8enx+fnx+fnh2dnh0eHh2eHZ2eHh+fn5+fn5+fH58foB+foKEhIKEhIKCgHx8fHh0dHRwcG5ubG5sbGxubm5sbG5wcnJ0dHR2dnh4dnZ4eHp8enp+foB+foSEhIaGhoiKioiIhoqIioqKiIiKiIiKioyMkI6OkJKWmJqcnp6gnqKioqKipKCenJqWlpiWlpaSlJCOjoyMjo6OkpKQkJKSlJKUlpaWlpaWkpCOiIaGhISCgoKAfH56eHR2dHBwdHJucHBucHJ0dnR0dnZ4dnx6fn6CgIKCgIKEhoaKioaGiIiEgoCCgoSCgH6EhIKGiISCgoCAhoqIhIqKiIiMjIyOjIqIjIqGhoaEgoCEgoB+goKAgHx4dnZ0dHZ0cG5ucGxucnBwcnJwcnZ0dHh2dHJ2dHBwcG5scHBsaGxqaGxwamZqamRmaGBiaGZiZmhkZmxsaGhuaGZobGhmam5oam5sZmZqZmRkZmJgYmZmYmJiZGRmZmRkZmhqbGxucnZ0dnh4enx8enx+gICAgH6CgoaGiIaEhIKGhIaIhoaGhoaGiIiGioqIhoiIiIaIhIaMioiKjIqIjIyIhoqMjIqKioiIioiGhoSEgICAfnx8enh0dHJycHBwbnBwbm5wcnJ2eHh2eHp6fHx8enx8fHx8fnx8fHx4eHp6fHp+foCChoiIjIyMjI6SkpCSkpCSkpKSkpKUkpKQjo6OjJCQkI6QkJCSkpSSkJKUkpaUlpaWmJaanJyenJyamJqanJqanJiWmpqYmJqamJiWmJSOjoqGgoKCgIKCgoB+fHx8eHZ0cnRycHBubGpsbGpsaGxsbGpqbGxsbGpsbGxscHJ0dHJydnR2eHZ4eHh4enh2eHh0dnZ2dHZ6eHh6fnx8fn58fICEgIKGiISGhoaEhoiIiIqKjIyOjo6KioyIiIyKhIaGgoCAfnp4eHRycnJwbm5wbm5wbG5ubGxsamxoaGZoZmhobGhqampsbnBwbnRwcG5ycHBydHBwcnRycnZ2dnZ2dHJ2enZ4enh4dHZ0eHR2dnp6fn5+goKGhoiKjI6QioqMiIiGiISEhoSAgoB8enx8eHZ2eHJydHJydHBubGxsaGhoZmRmZmZmZmZmaGZsampsbnBwbGpscHJ0cnJ2dnh6eHZ6fn6ChISGipCQkI6SlJaamJSWlpiUlJCQio6OjIiMiIiIioiEhoaEhISEhISGhoiIjI6OjpCOjpSYlJaYmJaamJSUlpKQjpCQjo6MioqIiIaGhoKCgoSAgoSEhIKEhoCCgIB+fHp4dnJwcm5samhoZmZqZmZmZGJkZGRkYmJiYmZmaGpubm5wcnB0dnZ2dHh6fHx+fH5+gICAhIKCiIqKjo6UkpSWlpKWmJiYnpycnp6cmp6goKKkpKCenp6ampqamJqcmJSUlJKQkIyKiIaIiIaEgH5+foB+fn58eHp6enp6enh4eHh8fH6AgoKAgoKEgoSEgoCAgHx+fn58eHh4dHJycnBsamhoZmZoaGhmamxubnBybnR0dHZ4eHp6enp6enh4eHx8eHx8enh2fHh2dnh0dnZ2dnp+fnx6enx4dnZ2dnZ4dHBwbm5ycG5ubnBucHJycnZ2cnZ2dHJ0dHBydnZ0dnZ0dHZ2dHR6eHh8fHp6fIB+goaGiIqGhoqIgH6CgHx+gHh0cnJqam5waGxycGxucnBydnp4en6EfH6CgH5+hoKAgoKAgIKCgIKCgoCAgH5+goCChoiEhIaIgoSGhISEhICChoaGhoSEhIaEhIB+goSCgH5+hIKGgoCAgoCAgH6AgoKEgH5+gH5+goB+foB+gH6CgIKEhISAgoKChISCgoKChISChIaEgoSEhIKCgoSGgoKEgoKCgH6CgIB+hISChIaGiIiGioqKjIyMioyIhISCgHp6enh2dnR2dHRwcHJycHJydHRycnJydHRyeHZ6enp4eHh0dHZ4fHp4dnBwbm50dnZwbGhmbG5wbmpkYGJiaG5ubmhkZGpydn6AfHZ0eH6GjpCMhIKEipSanJiWkpKYnqaoopqUlJSanqCglIyIiJKUlIqCfHp+hoiKhoSAfoaOkpSSioSCho6UlJKKhICGiI6QjoaAenx+goSCfHJwbm50dHRwaGBiZGhubmxkYGBgZGhsbGhiYF5iZm5waGZkYGZudnh0cGxqcHZ+gIB6dnR2foyQko6OlJykrKyopKCiqra8wsS6tLK6vsjOyMCwqqqutra0rKCWlpiaoqKckISAgoaOkIiAeHBwcnZ0bmhcWFZaXl5iYFRQTlJUWl5aVlJSUFRWWlhWUExKVlxcWlxUUFBWXF5gYFhWWl5oamhkZGJmbnp+fHh4dnh+ioqGhoB8foaMkpaYjIaMjpSepqCYkpKSlp6moJqWkpCWnqaooJqSlJqiqKiioJqWmJqepKCYkIiGjpaYkoiCenp+foB+enZwbm50dHRuaGJiZG5wbGJaVlZcXmBgXFhUVFhaXmBcWFRWXF5mZmRgYF5kaG5ycGxoam54foSCgHZ2eH6KlJSSjo6SmqKmqKCalJKWmp6goJiUkpSanqKgnJSQkpyipKCamJSUmqKmpJyUkI6WmqCiloyIjpSYlpaMhoKGjJCSkIiAenx+iIaGgnhydHp8fnx0cGpscnp+gHx0cHJ0foqKjISAgICGjo6QiICAfoaKjoyIgHx8foySkIqGgoCGkpqenJSQkJKcpKikoJiUmp6mqKCakIiMjpKQhIB0cnZ8foB8dGpoamxydnJsaGJkaG5ybmhiYmZoam5saGBaXF5kZmhkYFpaXmZqbGxoYmZqcnZ8eHRwbnJ6foaEgHp4eH6GioiEgHx+goiOjIaAeHh8foiIgnpydHZ+hIJ8cmxudn5+fnhwamxudHZybGRgYmRqbGpmYFpaWlxgYF5UUE5SVlxeXFhSVFRcYmZoZGBeXmpyenx4cm5ucnp+gH54dnR2foaMkJCIhIiOlpygoJqYmqKqsrSyrKiorra8vr66srK6vsbEwLiwrrK0uLaupJqWlpaWkoqAeHJwcHJwbGRgWlhYXmBeXFhWVlheYF5cWlhYWl5maGhkZmRobnJ0eHZ0dHZ6foaKioyMioyUlpiWmJaUkpaYlJCOjIqKjIyOjIyIhoaMkJCSkJKSlJaanJ6cmp6ipKisrqyoqqqqqq6usLCurqywsK6sqqimop6anJiUjoyKioqKiIiEgIB6fnx6enh0cG5sbGhmaGhoaGZoZGJkZGJkZGRiYmJgYmZoaGhmaGpqbGxsbnZ6en5+gISCiIqMkpaYnJyenJycnpqcmpqamJaUlJCOjIyIgoCAeHh4dHJycHBubmxoaGhqaGZqZmRiYFpYVlZUVFRSUFBOTEhERkRERkREREZGSEhISkpMTE5OVFJWWl5eYGBkZmZoam5ucHJ0eHx6foCEhoqOkpaWmJyeoKSoqKysrK6wsLCysrSysK6wsLKysLCysrKysrSysrCqqKimpqSioqCenJycmJaWkpCQjIyIgH54cHBqaGRmZGJeYF5cWFhWVFBOTk5QTk5QUlRWVlZYWlpeYmJoam5ydHp+foCCiIyOkpSWmJialpianJyampqYmJqanJyenqSkoqSoqq6wtLSyuLq6ury8ur6+vsLCwLy8vrq4uLa0tLCurKiiop6alpKQjoyGgoCAeHRwbm5samhkYGBcWlhaVlhWVlZYVlZWWFhYWFhYWlxcWlxcXmBiZGJmamx0dnp8fHp+foCChoaEiIqMjIqMjpCQkpSQkpKYlpienqCkpKSkpqSopKakpKKgoJyYmpiYlJSSjo6OioaCgIB8enh0cGpoZGJgXFpYVFRQUE5MSkhISERCQkJEQEBAPj4+Pjw6PDw8Ojo8Ojo+PkBAQkZISk5OUlJWWlpeYmRkaGxucHJ2fHx+goSIio6QlJqepKisrrKytrq8vMLGzMzO0NLS1tra2trc2Nja3Nza2trY0tLS0MrMyMbGwLy4tK6oopyalJKSkpCOjpKQjIqIhoaEhIB8enp4cm5uampmYmBaVlZUVFRYUlBOTkxMTk5QUlJSVFZaXF5iYmRkaGxscHBubnB0dnh6fHx8foCCgoKGiIqMjpCOkpSYmJqcnJyeoqSipqamqKaqqqqqrqyurq6usK6urKyqrKikpqaoqKiqqKimqKiopqaoqKaopKKinpycnJyYmpaQjIiGgHx4dGxoZF5YVFJOTkpGRD5APjo2NjY2NjQ2NDY4PDw8PD4+QkhOUFBWWFpeYGZoaGxucHJ2enp+foKAgoKCgoaIiIiKioyMjo6OjI6MjIqKhoCAenx6eHZ2eHR0dHBycnJwbHJucnR0dHR0dnx8foKAgIKChIiGhoaIiIiIiIaKiIiGiISEhIKAgIKAfn6AgH5+fn6AfoCCgoSIjIyOjpSUlpaWlpaYmJqenp6enp6cmJqalpaWlI6MioqIhoKEgoKCgoCAgHx8fH58enh4dnh2enp4eHp8enx+fH5+fHp4enh4dnZ2dHR0dHJwcHBsamxsbGpucGxqbG5sbm5ucHJ0cnJwcm5wdHR2dnZ0dHR2enx8foKGioyQlJSWmpqeoqaoqKqurLCysrS4urq8ury6vLi6uLa0srCspqSgnJaUkIqGgIB+fHZwcG5qaGZmZGBcXFhWVlZYVFJQUExMTkxISkpEREJCQkJCRERAQkJCQkJEREhKTlBQVFZUVFZWXF5iZGRkZmhqam5ucHBydHR0en5+gIaGiIqQkpSYmpyeoqSqrrK0tLa2uLi2trSytra4uLq4trSysq6sqqqopKakoqCenJiYkpKQjIqKiIqIhoKAfnx4dnZ2eHRybnBsbm5ubG5samhmZmRkZmZmZmpoaGpqbGxucHJ0cHBucHJ0eHh6en6ChoaIhoiKjpCSkpCSlJiYmpyeoKCioqSipKakpKaoqKqopqimpqikpKSgoJ6cmJaSkI6Ojo6KiIaKjIqKioqKjIyMjI6MioiIhoSAfoB8enZ0cnBwbmxqaGhkYF5cXFpYWlRSUFBQTEhIRkZIREJCQD4+PDo6PD48Pj5CQkJGRkhISk5QUlJYWF5iYmRkZmhoaGpsamxubnBydHR4eHh4eHp6fHx6eHZycHJwcHBucHBwcnRycnJubmxubnBwbnR0dHp8foKEhoqSmJyipKissrS4ury+wsjO0tbW0tLU1NLU1NLQzsrEwLy4srCsqKCcmJSQioSAenh0cHBsaGhgYFxcWlpYVlRWVFRWVlZYVlhYWFpeXmJiYGBgYmJkYmRmaGpubnBwcnZ4eHp6eHp+fnx+fn58enh4dnh2dHJ2dHR2dnp8fn6ChISGipCSlpqepqyytry+xMzM0tjc4uTm6Orq6uzu9Pb2+v7////////8/Pr49PDq5OTk5ODg3tjS0MjCwLq2sKqknpiQhoB4dG5qYFpWUkpGRkRAPj46NjQ0MjIyMjQwMjQyMjQ0NDQ0Njg2Njg4Ojw8Pj5AQkRGSEhKSk5OUFJWWFhcXF5eYmJkYmZoaGpsamhobGxsbnJ0dHR2dnZ4enp4enp6fH5+goCEhoiIjIyQkJSUlJSWlpaWlpaWmJaYmJiWlpSUlJCMjIqMjIqMjoyMjIiIhISCgH58fnp4enh2dnZ0cnBubmxsbGxubm5wbm5ubG5wcHBycnZ4cnJwcHBwdHR2dnh4dnZ0eHp+foB+gISEhIaGiIiKiIqKjIyMjo6MkI6QjpCOjIyOjo6MioyMioiOjIyOjIqKioqKiIaEhIKAgoCAfoB8enp4eHh2dnRydHR0cnR2dnh8fHx8fn6CgoKGiIyOjpCSlJSUlpSWmJKSkpCQkpKQjIyIiISEgoKCgIB8fHh6enx6enZ2dHRycnJycnRycHBwcHBwcHBwampoaGhmZGRkZmRmZmRiYF5cXFpaXFpYVlZYVFRWUlJSUlRSUlRUUlBOUFJSVFJWVlhYWl5eXmJmaGxucnR+hIaMkpaeoqqytrq+wsTIzM7OzM7OzMzKyMK8uLSwrqqkoJqYlpCKhoSCgHx8eHR0cnBsampoZmZmaGRqbGxsbnJydnZ6fH5+hISGioyMkpKQkJCSlJSUlpqYmp6enJ6amJKSjoyKioqIioaCgHh2dHJwbmxoZmRgXFxaWFhWWFpaXmRkaGhqbG5ydnx+goaMjJCUlpygoqCipqqusLS2tLSysK6wsK6wrqyqqKiipKKioqKenJycmJaUkpCKioaEgoKAgH56dHBwbGpqbGhqampqamZoaGhqaGhqbGxqbGxucHJ0dHR0dnR2dHR2cnBubGxqZmRiYGBcWFhUUE5KRkZEQEA+PDw8PDw6PD46Pj4+QEBGRkhKTk5QUlJQUlhWWFpaWlxeYmRmZGZoaGhubnJ0dnx8fH6Afn5+hIaGhoiKioyMjo6SlJSWmJianJycnqKkpqamqKimpqampqaoqKiqrKqqqKikoqCcmpqWlJCKioiChIKAfHh0cGxoZF5aVlJQUE5MTEhISEhISEZISEpMTFBSUlRWWlhaXF5kZGZsbnJ0dHh4en6AgoaKiIqOkpaYnJ6koqSmqqyytrq6vsDAwsbKyszMzs7Ozs7Q0M7Q0tTUztDMzszKysjGwMLAvry+vLi4srC0tLKsqKKgnJiUkpCOiIKAfHp4eHZycGxsampqbG5sbGpqaGhmZmRkZGRiYGBeXFxaWlhYWlpUVFJOTlBOTkxKSEpMTk5OUFJUVlZYVlpaWlpeYGRobnBydnp+gISGhoyQkpaYmpqcoKCkoqSmqKqsqqyqqKyqqqqopqCinpyYmJaUlJKOioqGhISCgIB+fn58enp6eHh2dnx8fHx6eHp6eHp6fn5+foCCgoKChISGhoSAgH5+enh2dHBsamhkZGZkYmJiYF5eXFxaXFxYWFhYVlJSUlJQTk5MTExMSkpMSEpMTlBOTlBQUFJSVFRWWFhaWFxaXFxcXGBgYmRkZGRiZmpqam5ydHh6foKEhoqIjJCSlJaYnJyeoqSkpKSopqSmqqqopqampKampqSkpKCgnpycmJaUlJCSjIyMjIyIioiIhoiGhIaGiIiGhoiKioqGhoKCgH5+fnx4dnZ2cnJwbnBwbGxucHJycnJycHBwbnBubmxsampucHJ0dHR2dnp6eHp6fH5+goSKjIyMkJSWmJiamp6ipqqsrq6ytLa2tri2trayrqyqqKSgmpaUkJCOjIyIhoKAgHh4dHBuampmZmZkZGRkZGJgYGBgYF5gYF5eXmBgYGBgXl5cYGJkaGRmZGRkZmhoZmxucHBycnJydnp8foCEiIqMjpCSkpaYlpqcnJiamJaWlpCQjo6QioqMjIyOjpCQlJCSkJCSkpKSkJCQjIiCgIB0cnBsamhkYFxYVFRQTExISEhGSEhIRkZERkhKTExOUlRWWlhcXl5iZGZqbGxwcHJ0dn5+foKEhoyKjIyMioiIjIyMjpCQlpaWnJqanJyanKCipKSoqKiqqqqooqCcmJSUkpCMioaEgICAenh2dHBwampqaGZqamhsbmxucnRycnR2cnJubmxqaGZkYmJeWlhWWFZWVFJUVFJQUFJSVlZWWFxeYGJkaG5wcHB0dnZ6fn6AgoSEiIqOkJienqKipqqwtLa+wMTIztDS1tra3N7k5uru9PT29vj49vb2+Pj28Ojk4NzY0MjCuLCmnJSMhoR8enZwbGhkYGBeXFhYVlRUUFBOTEhISEREQkRCQkJAPDw8Ojg2Ojg4ODo4ODo8PD5AQERCREJEREpMTExOTlBQVlRUVlpaXGBeZmZqbmxwcnR2eHp+goSKjpKSlpqenJ6eoKKmrKyqqqyqqqysrKqmpKKgoJycnJqanJiWlJKQjo6Mjo6OkI6QjI6MjoyMjoyQjo6MioiKjIqOjIyKiIaIhIaGhoiEiISAfHp8eHZ2dnR0cm5sZmRgYGBgXmBgYF5cXmJgYF5iYmJkZmhmZmhoaGpsbnB2enyChoqOkpaenqSqrri+wsTKztLU1tbW1tTU0s7KxsLCwLy6tLCqqKKiop6cmJaUkpKSjpCOjo6MjI6MjIqKiIKCgIB8eHh0cHJ0cnBubGhkYGRkYGJgYmBiYmJgZGRkaGRmZmZqampqbGxsbm5ubHBwbnBwcHRwcGxoampqamhqampqbG5wcnJwcHBycnJ0dHh4enp8fn5+fH6CgoKEgoKCgICCgHx6enh4enh4dnJycnBycnJycnJycm5ycHBubmxqbGpoZGJcVlZWVFJQSkpISkpKSEZGRkRGRkhISkxOUFBSUlZWVlhaWlpcXmJkZGZoamxubm5wcnJ0dnZ2eHh4dnh6eHp4eHp8fHx+foCEiIyOkpKUlJKUmJiampqcmpycnJqampqamJaUkpKQjIqGhoSCgoCAfn58fHh4dHJwdHZ2eHhycG5sbGxucHBwbnBycnh0eHZ4enx+foCGhoiMjI6UlJSanp6ipqqsrrK4vL7AxMbKys7Q1NTY2tre3uDk5uTk5Obm5OTk5N7a1NDMzMbCwLq2sq6qqKagoJyYlJKOkIyIhoSCfnx4dHRwbmxqZGBaWFZSUk5KSEhGRkRERERCQkRCQEJERkhKTExOTlBSUFRUVlpaXl5gYmJiYmRqaGpqbnBubnJ0dHZ4eHh8fn5+foCCgoaIioyOkpKUlpianp6goKCipKKkpKSkpKSioqSgoKCgmJSOioyIgoKCgHp8eHZ0cHBybmxsaGZkZGJgXlxaVlRQTk5OTEhKSEhGRERCQERCQEJERkhGRkhISk5OUFRWWlxcXmRkZmpqbGxubnJydHZ0dnZ0dHJycG5scGpubGpqamxscHBwcG5ucG5ucnRydHh8fHx+hIaIio6QkJaWmJiYmpycnp6eoKCgoqKkoqKkpqiqrqqmpKKioqKmqKqsqqysrKqoqKampqKgoqKenJyamJSQjoyKioqIhIKCgH5+fHh2dnR0dnRycHBwcG5ubm5sbGxsbm5ycHBubnBucnJycnRycnZ2dnR2dnh4enx+fH5+hIKChoiIioiMioqMjpCSkJCMjoyQlJKUlJCQkJSWlpyenp6eoKSkoqCenp6eoKCenJyamJiUlJKSko6KiIiEgH56enhycGxiYmBYVFJQTEpGREA8OjY4NDYyNDQwLi4wMC4sKiosLCoqKiwsLjAuMjQ4Ojw+RERISk5OUlZcXmRmbHB0dnp+foaIjI6Slpicnp6kpqq4trq+xsrM0tTY2tza3uDi4ODk4uTk5uTi4N7e3Nre3NjY1NLMysjIxsLAurCuqqikopyUkIyKiIKCgHx4dHBuaGhiYFxaWFZSUlBOSkpIRkRERERERkRCRkZKTExOTlBSVFZYXGJiZmZqcGpudHR2eHp4eHp6en5+foSGiIyQlJaanqKkqKqsrrS4vL7AxsbKztTa3t7g4t7e4OLi4ODe3trY1M7MyMLAurayrqyopqSgnJiSkIyKiISCgIB8enZycGpoZGJgXFxYVFJQTkxKSEZGRERAQD4+QEA8Pj5APkBAPjw8Pjw8PkBAPkBERkhKTk5QUFJUWFpaXmBiZGZoZmZoaGhsbnBydnR2dnZ6enp+foCAgoCCgoKChICCgoKCgoCAgICAfn58fHp4eHRsampoZmhoYmJgYGBgXmBiZGZmaGpqbGpubnBycnR0dnZ8gH6CgoKEiIyMioiKjI6OjoyKjpCQkI6SkJKWlpianJycoKCgoqKmpqSkpqaipqisrKqsqqimpqqoqqamoqKkoqCgnKCenpyampaUkpSWlpiampiYmJqYlpaWlJSUlJCMioiIgoCAfHx6dnBwbm5sbGxsampqbGpqampoam5ubGxubm5ybnBwcG5sbG5wcHBwcnJ0dnh4eHp6fn6ChIiKjo6QkpaYnpyenqCmpqqsrq6wsLK0trKytLKwsK6sqqainJyWlJKQjoiEgoB8enp4dHBwbmhkYmBcXFpaWFhSTkpIRERAQD48Ojg2MjIwLi4sKCYoJiQmJigkJiYmKCgsKiwqLjIyNjo8QkRGSEpWWl5manBydnp8fH6EiI6Okpianp6epKasrLK2tra2urq+vMLExsbKysjGxMTExsrKzMrKysTCxsTExsbEwsC+uLi0sKyopqSkoKCcmJaQkIyIhoaCgH58eHJybGhkZGBcXFpaVFJUUFBMTExISkpMSkpKSEpMTlBSVFRYWl5eXmJiZGRqbm5ycnR4en5+fn6EiIyQkpKWmJqeoKaqrq6ysrCwsK6urrK4uLq6ur6+vr68vr6+vLy8vLq4uLa0srCurqikoqKgoJ6elpaUkI6KiISCfnx4dHBuamhoZGRiYF5cVlZUUFJSUlJSUFBQUk5QUE5OTExOTExMTk5QUFBOUFBOTk5OTlBQUlJUVFJUVlZWVlZYVlZYVlhaWlxeYGBgYGZqampucnBwcnJ0dnp8foKEhIaMjI6Skpaamp6ioKKinqCgnp6ioqKgoKKmqKiqpqSipqampKKgoKCcmpycmpyYmJaSlJSWlpiWmJaWlJKYlpKWkJCSkpaWlpaWlJKSkIyMjIqIiIiIgoB+fHx6enhwcG5ubGxsbGpqaGhoZmRkZmZmaGpqaGZoaGhoZmhsaGxucHBubnBwcnJycnZ2eHh+fHx6enx8fHp8fn5+gICEgoKEhISEhIiKjIyMjo6MiIqKioqOjIyIhoiIhoaCgoSEhIKCgIB8fnx8fHp2cnBucG5samhmYmBeXmBeXFhWWlZUVFRUUlJQUFBOUFBOUFBQUFJSVFRWVlRWVlhYVlpcXF5cXlxeWlxeYGJiZGZkZGJmZmhkYmJkYmRmamhoZmhoamxsbG5ubnBwbmxydnh6fH6CgoKGhoiKjIyMkI6UlJicnJqYlpSSkpSQkI6OjIyMjIyQjoyMjo6OkJCSkJCOjpKSlJaWlJaWmpyanqCgoqSoqKqusLK2tri6ury6uLq6uLS0uLayrqignJqWlJCOjISEhICAfn58fHp6enh8fH6AgoSCgoCAgH6AgoCAgoCCgIKCgoKGhoSGhoaKioyOjo6OjIqMiIiChISGhoaGiISCgoCAgH5+enx6fHp8enh4dnh4eHp8fHx+goSEhoiMjo6QkJKSkpSSlJKSko6Qjo6IiIqIhoB+fHh0cHJubGxqamRiYmBcWlZWVFJQTk5MSkxIRkZEQD4+Ojo4NjQyMDAyMDIwMDAuMDAyMjY2NjY2NjY2ODw+QkJERkpMTk5SUlRWWFhcXl5eYGBkZGZmZmhobGxubnJ2dHh6fn6ChoiIjJKSmJyenJyenqKioqakoKCenpycnpyYmpyanJ6enqCkoqSioqKgoKCenqCioKCcnpqYmJaUkpCMioiGhoiGhIaEgoB6dnJwbGxoamZoaGZmaGZmZmRkZmZmZmRkZGJiZGJkZmZoam5sampucHR2dnh4eHx6fH6ChIKGjJKUmpqanJ6ipqiqsLS2trq+vsLGyMzOztTY3t7g4OLm7O7y9vr4/v///////////////////Pr47Oji2tbUzMS4sqiglo6IgHp2cGhiYF5cWlZUUE5MSkhGQkA+QD4+PDw+PDo6PDo6Ojo4ODY4NjY2ODg4Ojo4ODo6PDo+Pj5CRERESEZKSkpOUFJYWFhWWFpeXmBkZmhqbnBydHZ6fH5+goSKjpCUmJyeoqSmqKqssK6ytLa0srSwrK6urKikop6cmpyampiWkIyIiIiIhISAgIB4dHBubmxoZGJgXFhYWFRWUlBQTk5MTkpMSkhGRkhIRkhIRkZIRkhKSERGRkhISEpKSkxOTFBSVFRWWlxgYmZqaGpucHZ2fHx+hIqMjJSWmJ6iqKyusra6urq+wMLGxsTGxsTExsbKyMrKxsbGxsS+vLy4trSysrCwsrSwsq6wsK6usrCwrqyqqqyqqKSkoKCioKCgoJyako6QkJCKiISEgoB+fnx4dHR0cG5samhoZGBcWlpYWFZUUFBOTk5MSEhISEhKTExKSkpMSk5OUlJWWFhaXFxeXmBgYGJkZGRmZmZoampsam5wdHR2dnh4dnp+fn5+hIaGio6SlpiYmpycnJ6eoKCipKimqKSkqKikpKKioJ6cmpaWlpqampqenqCioKCenp6cnKCgnp6enpqYkpCOjIqIhoSCfnx4eHRwcG5qamZmZmRkYmJgYFpYWFRUVFRSVlZWVlZWWFhYVlhcXl5gYF5cWlpaWFhaWlpaXl5eYGZmaGpucHR0dnh8foSIhoiIjIyOjo6QkpCQioqIhISCgoKCgoaIhIiKioiKkJSSkpaYmJqeoKKkpKSkoqamqKaqqKSkpKKgoJ6eoKKeoKCgoJ6anJycnp6eoKCenJyenJyYlJSQjoqKiIaGhoSAgH58dnRwbGhmZGRiYmJgYF5eWlhYVlRSUlRWVFRSUE5QUFBOSkhKSkxMTExOTk5MTEhISkxMSk5MTFBQTlBSUlRYWFhaXFpcXGBiZGRmampsbG5ycHJycnJwcnJ0cnJ0dHR2dHR4en58foKAfoKEhoaGioyMjo6Ojo6MjoqKjpCQkpKUkI6MioiEhIKChISChIJ+fn58fHx8fnp4dnRydHR2dnJ0cnR0dHJycnJydHBycHBydHR4eHh2dHZ2cnBubmxqamxubHBsbGxsbnBwcnR2eHh6fHx+fn6ChIqMkJKWnKKmqq60ur7AwsbIzM7W2tzg5ujq7Oru7vDy7vDw7uzs6Obi3NTSzMjAvLiyrKimoJqSjISAfHh2cm5sZmhkYmJiXFpaWFRUUlRSUFBSUFBQUE5QUE5OUE5OTlBOTlBOUE5OTk5MTExOTk5KSkpMSk5QUlZWXl5iZGRkZGZoaG5ydHZ6enx8fn6ChIaKjIyMjI6QlJaYmpyamp6eoqKipqioqqqmoqKmpKKgpKSgoqSkpKKkpKKinJ6eoJ6cnJ6enJyamJSQjoyIhoaGhIJ+fHh0cG5ubGpoZGZiYFxaWlpUVFBOTkpGRkJCQEA8ODg2NDQ0NDQ0NDQ2Njg2Njo+QEJGSEhMTlJUVFZYWFpaXGBgYmRmZmpsbHJ0dHJ2dnh8fH5+hIqMjpKUlpycoqSorK6wsrK0tri2uri6ury8vLq6vLy8vLq6vry+vL6+vLi6urq4tra0tLS0tKysqKSioJyYmJaUkpKOioiGgoB+fnp2cnBsamhmaGBgYF5eYF5cWlpcXFhaWlpaWlpYWFpaWlhaVlpYVlhWVFRUUlBOTk5QUFJSUlJWWlxeYGRkZmpsbHBydHh6foCGio6QkJSYmJ6gpKSmqqqsrq6wsLCurq6sqKimpqioqqiqrKyusLCwsK6oqKakpKKioqCgoJ6cmpiYmJaWlJSUkpKQjoyKiIqKiISEhICAfHx+fHx8eHZ4enh4dnZ0dnZ2dnR2enx6eHh0cnJ0cHBsbGpqamhmZmRkZGZmZGJiYmBiZGRoaGZqbGxwbmxubm5wbm5ubGxubGpqbm5ucG5ydHZ2dnZ2eHp6fnx8fHx+foCEhISEhoSEhoiMjIyMioiCgoB+gICAfnx6enh0cnJwbGxsaGRkZGRmZGJiZmRoZmZoaGZmaGhkZmRiYmRmZGJgXlhYVlZUVlRSUlJQUFBOUExKSkxMSkpMTEpKTExMSkxOUFBOUlJWVlhYWlhaXFxeYGJiZmxubnR4en5+goiKjpKYmp6kpqyusrS6ury8vLq6ura4trSyrKqmpKCgoJyYkIyKiISGhISChICAfn6AgIKChIKChIKCgoKChIKEgoCAgICAfoKEgIKEiIaKiIiKioqMio6OkI6SlpSWmJycmpqYmJqcnJqYmJqYlpaenqKioKKgnqCkpqyqrrK2tra4uLy+vry+xMjIxMK+vLiysKyopqKenJqWlJCQioiCgoCAfHh2dHJubGxqbGpoaGhqaGZmamxoaGZkZmRkZGJkZGJiZmRkYmZkZGJkZGRobGxucnR2dHZ4enp6eHp8fnp4dnp4cHJycG5qamhoZmhkZGJgXlxeXFxaXl5eXFpaXFxaVlRUUlRUUE5QTExOTkxKTExMSk5MTE5SUlBQUlBSVFRUVlhYWlxcXl5cXF5eYGBkYmRkZGJiZGRkYmhmYmJkYmBgXl5gYl5kYGZoaGhqbnRydnp8fn6ChIaKjpCSlpaYmJqeoKCcnJycmpycnJycmpqamJiWlpiYmJSSkIqGgoB6enZ0cnJwaGhmYmBgYFxaXFxcWl5eYGBgZGJiZGZmampscHZ2eHh6foKEiIqQlJianKCkpqiqrrCwsra8vsLGyMrMztLU1trc3Nre3uDg3tze4OLg4N7c2tjW1tLQyMTCwLi0srCurqyopJ6cmpqYmJCOjo6QioaEgoKAfHh2eHR0bmhmYmJiYFpWVFJSTkxIRkZEQkJAPkRCREBAQkJAQkZEREJGRkRERkhISEZISEZKTEhOTlBSVFZcXF5eZGhmamhscHR0eHp+hISGjI6UmpyepKqqqqqurqysrq6srKyoqKqqqKakpKSgoJ6clpaYmJiUlJKWlJSQkI6MjIiKjIyKiIiIhoSEgoKCgoB+fnx6dnR0cHJubnBwcHBwbm5ubGxsbGpoZmRiYmBeYGBiXlpaXFpYVlZUWFRUVFRUVFBQUlJUVFZWWFhaXGBgYmBiZGZoamxsampqbGpqamxqam5wcHJycHBucHJ0dHZ8fn6EhoqIiIyMjo6QkJKWmJqanJ6goqSkqKaoqqisrKyoqqimqqiqqqqqqqyopqKgoJ6eoqKioJygnpqclpiYlJKSioiGhISAgH56fHp2eHRycnRwbm5sbm5sbGpsbmxwbnBwbGpsampqaGRmZGRiYmBgYGJkZGRmaGxsbm5sbG5ucnJ0dnZ4eHh4eHZ4dHJ0dHRybnBsbGpqaGhoamhqaGhoZGJiYGJeXmBgYGBiYmRiYmJkZGZmamhqam5wcG5ycnZ4eHh4dnZ4enp8fH5+hIaKioyQlJSYmJqanqCmqqiopKaopqakoKCipqCgnJiUkpKUkJCMjIyMjIyOjo6OkJCQjo6OjI6QkpKUkI6KiIaIioyOjIqIhIaEgIB+fHh2fHh4eHh4dHR0dHJydHJwcnZ0dnh8fHx6fH58en58fn6ChIKGhoSIiIqMjo6OkJCOjpCOjIqIiIaGhIKEgoB8enhycHBucGxsbGpqaGhmZGJgYF5cXFpYWFhYVlZYWFhYWFZaWlxeXl5kYmRmZmpsbGxubnBwcnR0dHZ6fHx+goSIhoiGhISEhIaKjIqMioyMio6OioqKhoSGiIqIioyKiIaIiIiKjIyKio6MioqKjIiKiIiEgIB8enZ2cHBsamhmamhiZGJkZmZmaGhmaGhsamxsbGxsamhoZmZkZmRkZGJgYFpaXFhYVlhYVlZSUFJSVlJUVlhaWl5gYmZoaGpqbnBydHR0cHJycnZ0dnh2eHh4enp8fHx8fH5+fnyAfoSGhoaIiIiIioyOjo6QkI6OjpCOjpSSlJaUlJKOkI6OjpCOjo6OkJCQkpSWlpaWnJ6ioqaoqKiqrK6urrKwsK6usKyoqKSipJ6cmpaUkI6OjoqKjI6SlJSUlJSWlpqcnp6goKCgoqCeoJ6cmJiWlJiSkoyMgoB8enp2eHRwbm5waGpqaGpmYmBaXFhYVFRQUE5MTExKTkxKSkhKSEpMTE5OTExMUE5OUlRWWFxeXmJmZmpwdHZ6fIKGioqMjI6WpLre6MCAQCxuvv///////8BAIBAAABY+br7+/////////6BAGBAWJj5ecn6OmJKIgGhQQDI+XnqOqr7MzsiwgGBOQDQkHBoiLDxOVFpeYlxYXn6u1MBgEAAACi5efrrW/v///+iogEAQAAAAAB4+br7+/////////8CQaEAgCg4ePnaerrq+0t7u9vjo0La2xtrk2MCUhIB+ipKQioaGlJ663vr44MCuvt7oyIBALDY+Zn6u3v7////gsIBQIAAAAAAAFjZWfr7+///////QkGBEKCIiKjpKVl5mcHx+foqetsbS1tTU1My4mIBoWEpAPj5GTl5ufp6+1ubm4NLEtKCQgHBkYGZ2ioyAaF5mfp623v7/////4MCQaEAkFBYeNk52ns7+/////////9iwkIBgSEA4OERSUlRcbHqSpr7S2t7g3NDAoIBYQCwgHBgcJC4+WnaOrsbQzMCooKSsoIBAEAQOJj5Wbo6+3vj04MCQYDAQAAAGFCI2Vn6+/v//////yKCIeGhSQDo6RlZcWFBMTlhmfpayvsbO2PTs0LCQdGBUTEhERkxWZnqWrr7KzsjAtrKsqKCQgHBiYmx6jp6+3v7////gsIBgQCgYFBomPl5+vv7/////////6MCQgGRSRDw8QkRAPkZWbn6eusza7v7///DgwKiIcGBYUExITl5ufpamtry+wsbOyKiAYlpaXm5+jqa+5vrw4LCIaEAoFAgIEh46Wn6u2v7//////9CggGhYSDwwLi40NjY4Pk5aanqOqr7S2tjUzMCokIBgUERAOjw+SlZmdn6WpKiqqKigiGhERkxWZHZ+pr7e4tCwkGhEKBAEAAAGHj5efq7a/v////DQtJiAaFhIQDw0NjY2Oj5GVF54fp6uvsrOzMCwoIhwYFBCPDY0NjxKWmp6hpSeqrSwoIBkWFRUXm58jp6+3Ojm0LCQcDQgDg4WJj5efr7m/v////////DIsJCAcGBYUkxMVl5ufo6etszm/P//////4MCokIBoWFBOUlxmcn6SprzO1MSoiHBoaGxubnJ+nr7S1MiogGBAJBAGBAoWLk5+rs7u///////goIBoVEQ8ODI0MjxGVmRuen6Wqra+zNDSwrCYhHhoYExAPD5ETlhufp60vraomJCOjpSWmqSsus7W2tDAmIBgRDgwLC46Tm6Ors7u/////////+jIoIhyZFRIPDpCSlJYYm5+jp6+1t7m4NDAqJSAaFBCOjQwMjZGWm5+iIaGhIB8dnp+gIB8fn6KjIRwWEQyJhgQEBQeLDZGWnaWtsrO0NDGuKiQgGxYRjQsKCgoKCouPkpWZnqMnqq0srS2rqSSgGxcUEI4NDpCVmp0dnp+foiOlpycmpSUlJSQiIBwYFJKQkJERERGTl5yfp6uvs7a3tza1si4opCAcGhiXFhSUlRYXmp0foqWnqq2xszQzsa4qpiGeHBsZmBYVFZeanqOnrrO1tjQxsCwoIyAaGBUUFBSVlpcYmpyfIaOmp6ipqimpqCalIiAcGReVFBIRERERkpOVF5mbnh+foqQlpSQhIB2dHh4cmhQRDw+Tl5+lq6+ztzg2tTAsIhkSDIoJio6Tl52ipaerrrCwLiooJKMioaIiIaAeHJwcnRybmxqamxscHZ+ipKWmpqYlI6IgHRubGhkZmZoZmRkanZ+kJqiopySiIBwaGBYTEA6PDw+Rk5UXmBkaGxuenp6enZ0cG5ucHBubmhmYmBgYGJkZGZmbHB0foaIioiEgHx6enx+fn5+goCChoaIjJKWnKKorrCwrqigmJKOiISAfnh4enx8foKChIaGioqKioiEgHx6dnJ2cnBwampoZmRiYGJeYGBiZmZobGpoZmJgXFpcWlpaXF5iZmpucnJwdHR2dn6CgoSEgoKAfnx6fHp4enyAgIKCgoKAfHh4enx8fn5+fnx+fn5+fn58fn5+gICAgHx6enx6enp4eHZ2dHR0dnZ2dnZ2cHBucG5wbmxsZmZkYmBiXlxeXFxgYmZkZmZmaGRiYl5cXlxaXF5eYGJiXmJkYmRkZmpsbG5ucHBwcHBwbnBwcG5sampqbnBydnp8foSIhIaCgoCCgoSAgH6AgHx+fHx6fHp4enx+goaKjIyOjIyIhIB8eHZ0cnJ0dHR2dnp8enp2cnBsamhkZmhoZmZoaGZqaGZmZmRmZmhoaGpqaG5wdHR0bm5sbG5ucnJydHJwbm5wcnR0cnJ2dHR0dnh4en58fn6Afn5+gIB6enh6eH6CgoKGhoiIioyKioiGiIJ+fnx8enZ4dnZ2dHZ4eHh2enx6eHRwbGpqaGhqaGRiYmJkYmJiYmJkZGZoZmZoaGhsamxubm5wcnZ2eHp+foCCgHp8fHh4eHh4fHp+foKGjJCSlpaYlJKQjIiGhoSChISIioqOjpCOjoqIhoKAgH58eHh2eHh2dHBwbG5wcnR0dHJ0cnBwbmxmYmRiYGBgXl5aWlxaWlhYVFRUVFJSUlRUVlZUWFxeXmJmZmhoaGhoZGJkZGRmbGxucnR0eHx+fHp8fH5+gH6AgIaIiIaGhoSGiIqMjI6UmJicnqCgnqCgnp6coJ6enKCenpyenJ6amJaUkJCOjIyIiIqKhoqKioiGgIB+fnx0cG5samhmZGBgXlxcWlZWVFJUUlJSUlJSVFRUUFJQUlJSWlpaWlxcXFpaWFZWWFhaXF5gYmJiZmpqbGpsbGhoZmhqamxucHJ2eHp6fHx+fn5+gISGhoiKiIqKjo6QjoyKiIqMio6OjpSYmJycmpqenJiYlpSQkI6OjIiGhoJ+fnx4dnJubGxubGhoZmZgYF5aWFhWVlRUUlBQUFJUVFZWWFZYWFpcXl5gXl5gXl5cXl5eXl5gYGJiYmZqcHBwcnR0dnZ4eHZ6eHh6enp8foKAfoKEhoiGiIqMkpSUlpyenqCenpyampiYlJaUlJSWmJSQjpaWlpqYmJqampialpSQioaAgH5+gH6AgoaGioqIjIaIhISAgHh0dGxubGhkYmRkZmRmaGhqbG5wcHBwcGxubmxqbGhoYmJkZGBkYmBgYGJiZGZmaGRmZmRqampsbnJ0dnZ2eHh4enx+fn6EgoaEhIiKjI6MioyIgoSCgH5+fHx8fn58fnp6enp+fn5+goCEhoqMjI6OjIyMjIiEhoKAgH58fHp6enp6eHh4dnZ2dnRycHBsamhoZmRmZGRmZmhqbGxwcHR0cnJwbHBsbmpoZmZkZGRoZGRmbGxucG5ydnZ0dHZ2eHZ2enh4enh4eHp6eHJybmxqaGhmZmRmZGRmZGRkYmJkYmRkZmZoaGZoaGhoaGxsbGxucHJydnZ4eHZ2dnZ2dnR0dHR2dnZ4eHp6eHh4enx+fn58fn6AgIKChIKCgoaGhoaIhoaEhISCgIB+fn58eHp6eHJycnB0dnZ2eHZ6eHh8fHp6enp4eHx6eHZ2dHJwcG5sampqampsbHBycnBycnZ4eHp8fHp+hIKGhoqMjI6QkJCOjo6Qjo6MjI6OkJCOlJSSkpKSko6QkJKUkpCOkJSSlJiYmJianJ6enp6goqKkoqKioJyalpKSjo6OjIyIiIaGhIKCgoKAfn56enh0cHBwbm5qZmZkZGRkZGBeXFhYVlZUVlRUVFRUUFBQTkxMSkxOTkxOTlRWWlxaXl5eYGJkZmJmZmRmZmhoZmRiYGJiYmJkZGRmZmZoaGpubnBwdHh6foSEhoqKjIyMjo6OjoyIioqKjIqKjJCOjo6MjIyKioqIioyIioqKio6MjIiGhIB+fnp4dnR0cnBubm5ubGpsbGxqbGxqamxsbmxwbm5wcnZ4eH5+goKGhoiIioqIhIaGhISGiIiIiIiEiIaGiIKEgIB6eHRycG5saGZmamhoaGZoZmZoaGhmZmhoampqamxsbGpqamhmZGRkZGJgYGZmZGJmaGpwcnR0dnh2dnp8fH5+foB+hoaMioyOkJSWlpiYnp6cnJqcnJqcnJycnqKkpKqusLCysrS2trSwsK6sqqimqKSioqKioqSgnJyenp6gnpqYlJSUkpCOiISGgoSAfHp4eHZybGxqaGhmYmBgXlpcXFpYVFJSUlBQSkpISEZGRERGRkhISkxMTlJSVFhWWFhYWlpaWl5eZGRmam5wdHZ2eHZ4eHp6fHx+hISGio6MiIqKjIyQlpSUlJKQkpCOjoqMioiKioaIhISEgoKAgIB+goCAenp6eHZ0cnJwamhmZmZkZGJgXFhaVFBQTlBUVlhWTEhGTFBUVlZSUE5OTE5UWFxYWlxgZGZqbGpudHZ2cnR0en58fH6KkpaYnp6qrrK0uL7AxMTIzszMztDU1tzi6u7u8Pj8+ODQzt72//////Dg0Mi6uLy8wsC4sKqmpKakop6gnJSMiIKCgIB8fHp6enRwamhmYFxWVFZSUlJSVFZSUlJQSk5QUlBMSlJUVFBSUlJUVlpcWFZWWFhcXFxgYmJgYmRoam5ucHBubGhobnR2dnR2eHh4fHx6fn6GhoqOlJaWlJSSlpaYmJKMjoyMjIiKjpaUlJCQjIqIhISGhICAeHZ2dnh8eHZ0bmxqam5samhmYmBiZGZmZmZoamxiVEhKVF5qdnBgUEZGSFJeZGZoamhkZmhqaGpsbGpsaGRkYFxaYGZsbnJybmhmZGJiZnR6cGhgXGR0fo6OiISAenZ2eHx+foaKjpaenJiYmJqalIyGhoyWnqSgloqGhIqSlJaYlJCEgH6GjIiEkpSQiIB4cnBwdHh6foKGioyIgoCAgoiOjIaAeHh4en5+goKChIaIioyKhoaEgn6GlJqalo6QlpaQiIaGiIqOjo6MkI6MioqMjoyGhIaIjI6MhoaOmJ6enJiWmp6kpqagmJCKjpaUkpSanpySiIaOkJSUlJCKiISAgoaMjJCSkoiAeHZ4eH5+gH58enJsbG5ycnRwbm5udHZ0cHB2eHRwcHJ2eHh2dHBwbGxydnZybGpqbmxoaGhkYF5eYGZoamRgXlxcWFpcXF5gXlpYXGJqaGRgYGJeWFhaXl5iZGZoaGpoYFpUUlJSVlhYUlBOVFZaWlhWVl5gYl5YWFZaXmZsbnBwbm5qaGZqbHBqaGpwcnR4dnh+gIB+enh6dnh4en6IjIyMjpSWko6QkpKWmJ6msLCsqqqopqCcnqCmrrCytrq+vr68uLi2uLS0tLS6wsjKzs7QzMjGwLq4tLCsqKSgnpqWkIaCgHhwamJgXl5eXmJiYmBgXlxYWFRUUlJUUlBKSEhGRkpOUlZaXmJmbG5ycGxkWEQwKiw2TmZ+nra+uKSIcFRIPDg6PkhSXm5+mKq+zNDQwKiYiIB8fH6OnKKinJCMioaGiIySlpqcnqKqusrU2tzQwKSQgHZ+jqa+ztDEsJBsXFpqfrbu///////goIBgTEhGRkxSUmRufq7K3ujUsIhgSDg4Pl52lKKqoIhwVEQ6NDY6ODo8Pj5IVl5ufoKAcGBEMigmJjI8TlRSTEA2MjZGXn6+9v///+CgYDAgFBIWJjZKXm58hpKerLKwoohwWEpKTFp2nL7U2My0gGRYTk5cbHZ+jpqmtsbW3OLg0LSUgGhgYmhyfo6anJiWnq7O/v///////+CggGBQTlxsfIqOkIaEgoSKlp6kpJyQhICCipquvMK8rJiAaFhQUE5eZnJ4fn6Eipaeqq6soIiAYFJERkZISExMUFZmfq7e/v/////AgFBAMCw0RlZqen6IgHx6fHx+goB6eHZ4foqetsza3tTAoIh4bGxueoaSnqSqrK6yur7GxMCwoJCAcGhkZGBcWFRSWFxufrbu////////oGBAJCAqPk5mcHZ4cGpoZGBWUEpIQkRKUmJ2foyMgnBgSDgwLDI6RlJebHR4dnZ4en6CgHhsZFxSTkxISEZIREZMWm5+vu7///////+gaEQwJiY2Tm5+nqispJyQiIB4dnZ8foqaqrjGzsCwlIBwZF5eZnZ+lqKmqKSgmJaUlpqenJiKgHhycGxkWFBKREJKXH6e3v///////8BgMBwQFh4+VnaOmJSIgHBqZF5cXmJqcn6OnrK+xsCwkIBgUkpOXnJ+nqiqqKCMhIB+hIqWmJKMgnx4eHx4bGBKPDY+Vn6u/v///////+CAMCAWIj5unsre3MiggGhcWFpeaHJ8ipaqvs7e4NC4kHBQQD4+TmZ+lpyYiHBYSEBCSlpqdnx6cGBSSEA6MigmICIoPl5+vv7/////wIAwFA4WLl5+vtrayKiIcGJibn6Wpra+0Nzi7PLy6tCwiHBgWFpufp66ysq4oIBwaGpyfpquvsbApIh0ZGBcXmBcUEI2MDI+Xn6uzu7y5MCQYDAUCAwePl5+ioJ0YFBISFZmlp6oqKakpqaqtLSolIBgQjguND5OXnZ+gHJkWFJQVmR2ip6utK6gkoBmWFBQVl5iaGhmaG5+mr7m////////sIBgSEBGTl5ucnZybm5ueoymyt74/v////rw6OLg1sSwlIBwaGZsdn6IiIKAenh2en6Onq66vrqwoJCAdmxoYmBeZGpyfo6mzu7/////8MCgcFRGQkZMVl5qbGhgWlZaZnaOnrbG2uTi4NTMwLiklIhyaGJaWFZWXF5aVlZUVlpeaHZ+jp6orKaciGBUTExMTlJaXmRobHaGmq7G2uDUwJBgQCAQDg4WHio2Pjw+PD5GUmJ2ipqmrqiYiIBwaGRYUEhAODAqKiwuNDo+QkZOUlZeZnZ+jpSUkIiAbFhQSkhMVl5sdHx6eHh6foyeutbu8NiwgGBAMCAiJjI+VmZscn6Glqayvs7e7O7s4trSyLiiiIBoWE5EQEZOWGJscnh8fn6Cipaesr7GzMS6pJCAaGJkZnJ+ipCSjISEhpaqvt7+////0KCAUDQsKjZGVmJubGhoanaevtzu+vrw5NDEvLKqopSIdGhYUFJUWl5qbnh8foaOlqa2yNTa3NrQwLCciHpwcHJ2foiKioqKjpamvt7+/////+iwgFRANDI+Tl5yeHp4cHR8jJ6+3vb+//jk0MC0rKaglIBwWEI8PkZOWmJscG5ucHR+ipqiqqqkmIhwWEQ8Njo8RE5WWlhWUFRaZn6WttTe1MCQYEAgFBIWHiw4PkZGRkhOVl5ufpSesri4sKSYiIBoWEg6MCooJCYqNDo8QEJGSk5UXGZ0foiIgHRoWEg8MC4wNj5GVl5mamhgYGRueo6uvtTQwKCAVDgoIB4mNj5WXmhqbnJ6fpamusrW3trQxLiwoJSEdGhaUEpGSk5ebHp+ipCSmJiepra+zM7IwrismIhwZGJmcn6KlqKmpJiOmKq+3v7/////8MCQaFRIRk5YZnZ+hIaGjpimtr7S3ubq6ODSysC0qJSAcGBQSEZGTlpmdH5+goKEgIaOmJ6srrCqopiIeGRYUFBWXm56iJSYlI6OkJquvt7+/////9CggGBQSE5WXmhqbG50fo6etMLO2NrWzsS6sqygkIBsYFBEQDw+RlJcYmpqbGxubnR2foCGhIB4bGRgVEhANC40Nj5GVF5mZmBYUFBYXm5+kJyelIBYQCgcFhQUFhoiKCwyOkZUZnZ+jI6QiIB0amZmYlxQRkA4MiwoLDQ+RlJcZGhsbnJ0eHx+hoSAfnp0cGpgVEhGRkxWXm58ipCOiIB6fH6OnrbG2uDUwKCAaFpQSERGTFRaXmh2ip6+zuLu8O7k2MrEvr7CwrywpJSGeGpmanZ+hpCWmJygnqKmrK6ysLCqqKKioJqUiIB2dHZ+hI6aoqikoJaSlp6qvMjW4tzQsJSAaFhUTEpMUlRUVl5mdn6aprC2uLSspqCamJqcmJSKgHRqYlxYWl5eYmJgZGZqbnZ+hI6QkI6IhIB+fHhybGRaVFJSXF5qdnp+enZwcHZ+hpKeqK6soJCAcGZeWFRWVFJSTk5QUl5qdn6OlJiUkIiAfHZ2dHJubGRgVlROTkpMTEpOTEpKTlBSVl5kaGpqaGRgXFhUUlBQSkhGRkpMUFReXmRiYmJeXmJobHR6foB6dmxkYFpYWFZWVlhWVFRWWl5mbHJ2enh2dnZ4eHx+hIaMjoyOjIyOkpKYmJiYlpaWlJaWlpiYmpqYlpKSjoyMhIB4dnBuamhqbnB0en58fHh0dHZ8foqUlpiYkoqCgHR0cHBsbGhmZGRiZmp0eH6EioqIioiGhoaIiIyOkJCSkpSUlpqYmJqWlpSSlJaanqassLK0trawrqiinJaQkIqIiIaGioyQlpagpKiqqKCempiYmp6mqqqknJSMgnpybGhgXFhWWlpeZmhucHBwbmpkYF5cWFRUVlZWVlZWWlhaXFpcWFZUVlRUVlxeYmZqampqaGRgWlhOSERCPj5CRkhKTlJUWFpeYGZmamhkYl5gYmZqcHR6eHR0bGZgYmBgXmBcWlhYWF5iZm5ubmxsZmBcVlRUWFxgYmZucnJ2enx+goJ+fn58fH5+goKGjJCSlJaYlJSQjIiCfnx4enx+goaKjI6OkpSYnp6cmpiSjIqOkpiepqqqpqCYkIiCgIB4dHBqaGhscnZ+goaEhIB2cGxqaGZmZGZmam5udHZ4enx8eHZycHBwcnR0eHh0cnJwcGxqaGRgWlRMSkhKTlJeZGZobGxsbnJ2fH6GiIiIhoSIipKaoKasrKigmpiSkI6OjIiGhH6ChoqUnJ6gnpyUjoyMiIqOkJKQkpSSlpqenpycmJSQjIyIiIqOjIqKjIyKioqIhIKAdGxkXFhUVFZWXGBiYGBeXFxaXmRobnJwcGpoZGRmbG50dnh0cGhiXFhYWFhUUlJOTFBUXGJmZmRkYlxaWFpYWFhYVFZWVlpaXF5eYmJgXF5gYGJkaGpscHJ2eHp+hISEgoB6eHh0cHB2eHx+hoiOkpKSkJKQkpSanqausra4tLCurrC2ury+wsC4sKiioJ6ampiUjoqEgoCIjo6OioiGhIKAgoKChIaCgH5+gICAgoSCgHx8enh2cnRybmxoaGRgXFpWVlBMSkQ8ODY0NDY4Ojw8QkRERkhGSEZGSEhMTlZYXFxYVFBOTE5OVFhaXlxaWFZWVFhaXFxYVlZUWGBmbnR2eHp4enh4en6AhIiKjJKWnqSorrCwsLK0tLS2tri6vr6+wsLIys7O1NLSzMjAuraysLCurq6yrrCwsLKusKqkoqCgoqSmrK6wqqKYjIJ8fHx8enp4cGheWFJSVFJQUExIQEA+QERGTExOTEhGRkZCQkREQkJAPkBETFJYXF5eYGBgYGBiZmxscG50dnp+gICEhoSCgoCCfoKGioqOjpCSlpyepKqusrKysLCwsra6vsbO1NjU1NDIxsTAvsTIysrKxsK8uraqpqSYkIqIhIaGjJSUlpiUkpCQioaEgHx2cG5ubnJ0dHJybGhmZGBcWlhUUE5OTEpKTkxOTkxIREA8ODg2Njg4PD5CRkZKTFBSVlRYWFZcXl5eXmBkZGRoam5ycG5oYGBcXl5gZm5wbmxqbG5ubG5saGhsbm5oZmx6ipaepKSgnJiMhoB8enp8foKKlJicmpiQjIqIiIaKiIiIhISEhoyOjIaAeHBmZmBYUE5SVFheZGpubm5saGRkYGBgXmJqdnp8enh2dHBydn6IjIByYlxWXGx+kqausKSUiIB+fn54dGpiXGBqdo6esrq0qqakqrK+xs7QzMa8urq+xMLAsKCUjo6UnqaqoJSKhoKGjpSYmJaQiIB+goaIhoB0cG50en6OmJygmpCMio6QkpCMioaAfHh2cmhgUk5SWGJufoyQjIBgSEA+RlZufp62xMS0oJCAcGBQSEBCRE5aanZ6enZuYmBianZ+io6Uko6CdGhiXlxaWlpcYGZsbGpmZmRkYmRkam5wcG5ubnBydGxoZmZkYGBeYmZqZGJkZGhscG5wcHJucG5ubmxqbm5oXFRQUFZebn6SnpyQgFhISFZufq7O5uzgwKSQhIB6cGhmam5yeH5+gHpwamhyfp64xMbArKCQhHhybnBwbmxucHZ2dGhgTkhKUl5yfoSAYFhOUlpkbmxqZmRkYGBiYGBgXl5mbnp+gnhsYFhSVlxmbnJwaGBYUk5GQD5ETl5ufpyutqyQcFBKXH6e1v7//////8iwrqqsrKyutr7AsKiglpSUnrbW/v//////4tLQ0tTU0tDIxsC6tKiglpSWnq68wLysmIh0amxyeoqSlpCEcGJWTkhOVl5qcHR0amBUSERARk5aYmZiWFBCODAqLjQ4PjoyLCosLjZCSlReYGBIOC4uPk5meo6anJSEcGBSTExOSkxMUlRQSERGTFpsfIyWoqCalI6MjpaepqKglpCMiIiGio6YmJiWmqCkqqiglpKSmJ6eoKCgnpiSkpSUkpCQlJyirrCwsKacnJ6ipqqurKaglIqEfHhybGpqam5ubGBSTFJebn6Omp6gloBiTFZqfpakrrCikIBoYFhYXF5mZGZiWlBEQkRKVmx8ipKUjIB0bGhudoaSmJaMgGhgXmZ0foqMjI6MiIBycGxudn6EioiEgHRsaGpudnp+iIyOjIiEhISKjpqeqK6wrKickoyIioiIhoJ6cGpkYGJkZmRgYF5qcnp+fnx8foaKhIBsaG52fpKWmpSKhoB6dnRydHJuaGRiYFpWVFRYXmpudnRwbmxucHB0dn6AgHx4dHB0enx+fnp4dnh6eHBqaGhqaGZoZGJgXmBeWl5kZmpqam5wcnp+goiMjpCSlJaWkpSUkIqKjIiEgIB4dnJybmhmaGZkZmZmaGpoaGZudHRwaGZuen58cGZiZmpwdnx+foJ8dHJwbmpmZmZqbG5saGBeXmJoamxubm50dHZ2cGpqdn6Cgnx4eHp8foSEgHp2eHx+goSAgHp+hI6QjISAgoyUlpSQjpSepKikop6kqq6wsLCurq6wsrKwrq60tri2tLCopqioqKakoKCgoKKioJyYmJqamJSUkpKSlpiYlpSWlJSWlJCSjpCOjpCOjo6OjIyKiIiGhoiAgH58eHRycG5qaGRgYFxaWFZWVFJSVFRQUFJQUFJSVFBSVlRWVFZUVlhaXFhcXmBeXl5gYmJkZGZoaGZmZmhoaGhoaGpqampubnBwcnR4eHh8fH5+fn5+fnx8fHp8fHx6fHh2dnJydHR0dHZ2dnR2dnRydnR0dHZ2eHh4eHRydHRwcG5ubmxqaGhoaGhkYmReYGBiZGJiYmRiYmBgZGJkZmJkZmZoampoaGxsbGxubnBqbGxsbHBucnJwbGpqaGhoZmhoamxqbGxubnBubm5wcHR2eHh4fHx8fH58fn6AgICEhISGhoiIiIqMioqOkpSSlJSSlJaWlJaYmpiWmJaWlpaYmJiYmJianJiYlpaUlJaYmJiWlpaWlJSQioqIhoSChIKCgoJ+goCAfH6AfHp8fn5+fn58enp8eHh4eHh4enp8enx8enp6enh6dnh4dHZ0eHJ2dHR0dHR0dnZ2dHZ2eHh8fH5+goSEhIaGiIaGiIiIhoiIiIaGhISGhICAgICAfoSGgoaEhISGhoiIjIyOjo6Mjo6OjIqIioqIioqIiISGhoSGhISEhoaGhIKCgIB+goCAgoKCgICAfn56enp4dnZ0dHJucGhiYmRgXlpYVlZUUlJQUFBQUFJUUFJUUFJSVFRWVlhYVlZYVlpcXmBeXFxaXFxeYF5gYGJmZmhobHBscHBudHZ4eHp+foCChIaGiIqMjJCSkpKQkJSOkJKQkI6OjoyKioiGhoKGhoaGjI6Ojo6QkpKSkpKWlpaYmpqcmp6cmpiampqanJyYlpiWmJiYlpSUlJCQkI6MioiIgoCAfnx6dnRwcG5ubGpoZmZmZGZkYmJgYGBgYGBeXlxaXl5eYFpcWlpcXF5eYGJgYmJkYmJiZGRiZGZkYmBgYF5eXl5gZGJiYmRmZGZoZmhmam5ydnh4en58foKChoiKjo6QkpaYmJqYmJiWmJianJ6eoKCenJyampiWlpaUkJCMioaGhoSEhIKAgICAgIB+fHx6enh4dnZ0cG5ubGhmZmZkYmRkZGRmZGJiZGRkZmZoZmZmaGhmaGhmaGhoamxqaGpqamxqamxqamxsbG5ubnBydHh4enp8fn6EhoqMjpCSlpicmp6enqKkpqioqKaopKaopKKioqCgoJ6cnqKioqKkpqSkpqioqq6usLKysLCyrq6wsLCwqqqsqKSenJiWmJKQjIiIhIKAfnx4eHJwampoaGZkZGJiZGRkYmJgYmJkZGZmZmRkZmZoaGpmZGZoZmhmZmhoaGpsbG5ucnJ2dnh4en6CgIKAgIKEhISCgoKCgICAfHp6enh4enp6enp2eHh6eHh6enp8en5+gIKEhIKChISCgoSEgoKEhIKCgHx6enh0cnBubGpqaGhmZmZkYmRiZGRiYmJiZGRgYmRiYmBkaGhqamhoamhoaGpqbGpqampoaGhoZmZkYmBiYmRgZFxcXF5eWlxYVFhWWFhYVlZYWFhYWFpaXFxeYF5gYGBiZGJkZmRmZmhoaGpudHp+jIBQQFZ+ztCogHyGioB6foSMkpicmJKOmqaytrKsoqCamp6enJSQlqausKScnJycnKKqrKicnqaspKCerLK2vsSwkHByfr7e0sCwqqSckIiAdnyKmpiMgH6CgH6WrsLAqJSIgHJqYmZ8lpyAYF5ueHJ8lrrEsJCAbmxoZGZqbGpueoyQgGBunriwmISGgHh2dnJwbnqCgoaOjoiAcnaMopBwbn6WkIB+jpKIgoqUkIB0eo6eoJCIioyAeH6OioBqZmRobn6IgGxean6KgnpyZlhabn6AaFhebnJ6dGhgVl5scnBmZFpWXm56cFRQXm5ycHBqYFRaZm5ubG5sYFhaZGxqYFpshnhsZGJgYm52foSCeGxocn6EeHJ+mJyWlpSQgoKGkJqmrKiYkI6YmpSIjJakrrKokIB+jpqYlJaemIR4dHhycHB8hoqKhHRmYmRqdn6EgHZwbGpqaGhyenx4eHZ0aFpSVlxsdnhiYFxaWmJmaGpubmhmZmJYUlpebnJwbGhmZmZkYGBocHZ2eHJqZmZqdn58eHZ4eH5+enRydn6IioaGiIKEhoyMioqOlpqYmJSQiISOnq6wqKCemp6ioJiSlp6utrKonJqenqSqrrCmoqaioJqSkJqssqiSjI6OioiOkoqAfISKiIBoYGRueHpsYF5gYF5eXlhUUFJcYFxQSEpSWlxYUEpITFJcWlRSVFpaXmZqYFhUXmpydHBqYFxebHJ0cG5sbm50enRsaGp2fH54dnJ2fIaIhIKGjpKQjI6SlpygpqikoJiYnKqysKSenqaqqKKgnJyepKSgoJqYmp6emJiSkIyKjJCQiIaEhISEhoSAenZ4eH5+eHBsbnJybmxoZmJgYmZmZGBaXmRoZmJcWl5eZmpsamhqbHBydHZ8fH58eHh8enx+hoqEgICEhISEhoaKjo6QkIyMio6SlpiYmJaSlpyenJ6enqCmqq6sqKCgoqaoqKiqqKSgmpqampyeoqCgnJqamJaQjoyMioqIiISAenZ2cnJycGxubmpmZmZmamxsaGZmYmZmZmhoampsbGpoZGRmZmhqbm5saGZkaGhucnBwdHJycnZ4eHp+goKAgoKAgoaGhoaOkpCQjIiEhIaGiIaIhoJ8eHp+hoaAeHJwcnZ6fHBmYF5obnR0aGZobm5qZmRiZGJkYFpYVFZaYmZoZGRkaGxubGhoaGxucHBwcG5ucHB2dnR2dnx4dnR0dHZ6fn6CgHx2dnp+gH6ChoyMhoB6eH5+goqMkIyKioiKjo6SkpiamJKOioSAgH5+gH50aGJeYmRqampoZmhmYmJkaGpwbmhmZmZoaGhmYmRmbGhoZmRoam5ucGxsamhmZmpqcHJydnp4cGxsdHx8fn6EgoaKjJCWmp6mpqqkoKKoqqyuqKSipKKcmJaanqKkoJiSlJaYnJ6cmJacnqCioJqcnqaqrK6sqKqmqKakpqCgoJyWkI6MioiIhoKAfnx4cmxsaGZmYl5aWlxcXmBaWFhaXl5gYmRmamxucGxubnJycnBycnZ2eHR0dHBwbGhueoaMjISAfoaMjIyIjp6oqKCSioqOkpCMjoyIhoiIioaKjpaepKaknJCMjpacnJqUjIiIhoB6cnBudHZybGJgXF5eYmJkYmBiYFxWVlZcYGJiYGBeWFJSVmRscnRwaGJcXmBobG5ubGpkXFhUUlJWXF5YVFBQUFJWXGJmampqamxydH6EipCUmJqgnpyanqSmqqqqqKKgmJSYnqaooqCWkIyOlJiamp6mrK6spKKkpKCampqYkIaAeHp+foKChoaIhIaEhIaKjpCQjIaAenp8eHp+fn58enJ0dnh6fn6Cfnp4cnBydHh4enp0cm5ubGxqaGxyfH54cnBubG52foqKhIBwbG50dnh2eHh4enRwcG54foqOjoyKio6UmpqamJyipqSinJycnJ6ioqKcmJKSlpiYko6QkpaSiIB+hoySlJCAfH6EgoB4dHh+kp6qoIhwYm56hIBwZF5aXF5YUE5UXmp2fHJkYFZaZnJ2cGReWlhUUExISlJcXGBaVE5MTFJWVlxaWlxgXFhWWl5mbnJ0cmxqaGxyfH6IioR4cHZ+jIx6dHR2cmhgWlRWVlhYUkxISk5WXmRkYmZudHp+goSEipCWlJSSkIyOlpqYkIiEfoKIioqIgHRyfISIioaAen6GiIyQhoB+ipaQgHJ+nr7m4MigiICCiIqKgHhycnBsYlhYYnaOqKickJCcpra8vr7CxMK0oJKKjpqqsq6gkISAgH6GjpSYnp6YkIB6en6WoqyspqCYmJ6osr7K1Nrc1tDIxMC6vL6+vLSwoJiQhoSAgIKAeHZybmpqam50eH6ChISCgoSMlp6eoJiSiIKAfHp6fHhwYlZMSk5YXmRgXFhSWlxeYGZsdHx8eHBqbnR0aFZSZn6uxsCggGhgYGZoYlpUTEA4LiAeJjZOZmxoYFJSVl5yfIaOkJCMgHBkYF5mcnx+eGhaUEpMVFhcYmRgYFhMSk5eanZ+gHhybm56jp6mrLK2tLCooJyepKy0sKCMgHJwbmheWl5mbmxgWFJSWF5scnZ2dHJ0dnp+goiQmqakoJaOjJKWnJyUjISAeHJsZGBiaGxoYlxYWmZyfH56eHp+hoySlJaapKCAUEBOftb+///IoJCEgHh6fn6AenBYQCgqPl5+rLSqmIqIkp6uvs7m9vzw0KiIgo6evMbAsKCIgHJwdH6KlpyYkIBwZGJqfo6WmJCGgH5+iI6aqK62trCooJSQkpaanpiQcGhiYGJeZGhoYlRIRk5ecnp8enx8fHx6fn6KkpaWlIqCenp6foaIgnxwamZiYFhWVlpiZGBUTEpOVl5mamhobG5ubG52fIKGhoSAfn6OlIBQMC5Wft7+6MCQdGxqbHB8hIaEgGpAMD5mlr7QyLCakJaerrrGztrk4NCogGRicn6UloyAbGBUUFJWZm56foSAcGBYXGp+jpSSjoiAdnZ8goySmp6gmpCAeHZ4foaMioByZmBcWl5iZGZqbGhiXFRUXm5+iIqIhIB+hIiGjIyQkoyCeHJudHp+hIB4cmxoaGRgYGZsbnBsaGRmbHJ6fH6ChISKjpCIgHqEjp6moJCAbnaOrs7AgCgWLn7e///wsJaYnJiAcGp2jp6ggFAoIC5efr7WyKiWlp6mpKKorr7e4MCAXFZmfp6qoJCAdGxqaGRqdoaYpqSUgGhianiKlp6cloqAgIKChIiOnqqwqJiEeHZ8foiMioBwZmBYUE5OUlpgYl5YUk5OUlpkbnh+fHp4cG5ucHaCjIqKhHRoYlhUVFZWWlRIQDo6PkpUXmhoaGRkZGRqcnp8foCAeHRsamxwfIaOlJKMiIqKjpKcnqautr7O2tTAkGBAOE5+3v/////Murq2sKy2ztzYwJBoQDA+Xn6+7OTQsqCYmqSuvtr2////0IhoXGZ+nrCkkHBgUkxOVmZ2foqMgGZSSEpWbn6Oko6EeHBqampueoqYoJyMgGJcWl5qdHh0amBUSEJAPkRKVl5oZmBYUlJWYnJ+ioSAdnZ+hoaAeHB0foiKgnJkXl5eYmBYUEhISkxOUFJUYm52dnh0dHR8foaAfHh0dHR2cnBsaGpqamxsbGhmaGpsbGxmYmRmamxwcnh2cGhgSDAgKk5+vv7/8MigjoyEgIKIhoSAdGBAMC46VnaetrionJiQlp6svsra5OTYwKCIdHR+jp6koIh0aGJmanJ8ho6WmJSIgHR2fo6erry4sq6oqKiqsLjCzM7MxLSomJKUlpyenJSIgHJoYF5eYGhudHZycmxsbnZ+jpqYiIB+ho6UkoyIgn6GioqCgHRwcnp+gHRqZGRueoaIjJKcpq60tra2uLzGyMK4qKCYmJqclpKOjIiGhoaEgHx+hIySlJCKio6WnqaqpJqKgIB4aFBAPl5+vu7+8NCgioBwbG5sZGBaVlBGQDAuOk5ufpaenJCCfH5+jJKWmJyWjIBqYExGTlZcYmBUTEREREhOUlheZm5ycGhiXFpebHR6foKAeHJsamhqamxucG5waGJYUlBSVlZaWlpYVlZWVlxgZmpwen6IiIqKipCSlJqepqigkIBwbHJ+iI6QioR4cGhcVFBOUFRaXl5eWl5mbn6KlpqenJiQjIiCgIKGhoCAcmhgXFhWWF5iaGpsamZmZmhobHJ2en5+gH5+fnhybmhkYmRkYGBmdoqetr66qJiIgHZwaGRgXl5cXl5eYmZueH6Wpq6ytri4uLq+vLq6tqqinJiQhoB8eHZ2eHJuaGhoaGpsbnB0eHx+hIaGiIyMkJacnqKkpKCgop6cmpaWlJKSkIyGgHp0cnRycHBubnBqamxucHJ0eHp+jJKYnJyYkIqKio6YmJyenJiSiIB0cGpkYmBeWFhWWlxeZnJ8ho6anqKioJ6cmpqYlJKSjoiCgHh2dnp8enx8fHx8fHh6fHx+fn5+fn5+fnx6eHh2cnR0dHR0cnB2fo6ksry4sKCQhIBwZGBcWlxeYGBgXFpeXmZwfoaOlpiYlJSUlJSWmJaUlJKQioiChIKEhIiEhISAfnx6eHh6fHx8foCAfnp8fH5+goSGhoaEhIaGhISGiIiGiIaEhISAgH5+fHh2dHBwbmxsampucHBydHZ8fnp2cHJyeoSKkpiWlJCIgHx4dGZoaGpqaGhkYmZmZmxudHZ2eHh2dnRwbGxsbGxucHBsamhsam5wcnJ0dHJwbmpoZmZmZmRkZGRkZGRiYmRiZGZmaGZmZmhoampsaGRcVlRWXmhucnBsaGReWFJQTk5OUFZYWl5eXFpeYGRobm5ycnR0eHh4eHh4eHp6foCAgICAgoaMkJCSlJiYmpycnJ6cnqCenqKgoJycmpiUlJKWlpaSlJKQkI6QjIiGiISEhIKAfnx4dHJybm5wbm5sbGpubGpsamhoam5sbGxwbG5ucHJwcnJwcnJycnZ0dHJydHR2enx6en58fn6CgoSGhoiKiIqKiIqGiIiIioiGhoiGhoiKjIqQkpSUlpqcnJ6enqCgnJycnp6cnp6eoKCiop6gmpqYnqKoqKqmpJyYlpSQkI6MjI6QkJKUkpKQlJiSkpKOjIqKioqIiIiEgoB+enx8fnh2dnh2dnZ4dnZ4eHp8fn5+gICAfoJ+fnx6eHZ4cnRycG5wcHJydHR2dnhydHZ2eHZ2dnZ0dnh2fH5+fn58eHh4dnh0cnRwcHJycG5saGhkZmRkYmBeXF5eXFpcXFhYWlxcWmBeXFxcXF5gYmBgYGBgYGJkZGJiYmRkZGZoZGZmaGhqbG5ucHBycnJ0dHJ0dHZ2dnx4enp8fnp+foCAgoKEhoiIiIiGhoiGhoSChICAfn5+fHp6eHh4enZ2cnZ2dHJ0cnJydG5wcHBucHBuamxqamZoZmZoaGhmamRmZmhoZmZoaGhmaGZmaGhoampqbGpubG5wcG5wcHR0cnZ2eHR0cnJycnB0cHJycHBubmxucnR0dnZ8en5+foKChoiIjI6SlpSampqcnpygoqSkpKSkpKSkpqKmpKaoqqikpqiopqaoqKqqrKiqqqqqqqyusKyqqJCMhoaIhIKEgoCAfH58fnx+foSEhISGhoSEhoSEhIKEgn58eHRwcG5qaGpoaGRkYmBeYF5gYGJmZGRmamxsbnB0dnp+foKEhoiMlJiYmpqYmJycnpyampiYmpaUkpKUkpCOjIqIhIB+fHx6dnZ2cnJycnRwcHJydHZ6eHh4eHh6enx8fH58enZ2dnZ2dnh4eHZ0dHJycnBwcnBwcG5uamxsaGhmZmRiZmZoZGZkYmJiZGJgYmRgYF5eXl5gXmBiYmRmaGpqaGpubnJydnh6enx6fH5+fnx6fHx8foCAfHp6fn6CgoCAgIB8fn5+fHp6eHh2dnZ0cnBwcHJwcHBwcnBsbG5ubnBucHBwbm5sbGxsbGZoZGRiYmJgYl5iYmZoZmRmamxubm5ydHZ6enp8fHx8fn5+foKEgoSChIaIiIiKioyMjpCMjo6SlJSUkpSWmpyamJSSjoqOjIyOjI6MioqGiIqOkJKQkpaSkJKOkI6OjpCMioyKioqIhoSEhIB+fHx8eHZycHJydHBubm5qbGxsaGhqamhmaGZoamhkZmhoaGhqaGpsbGxsbGxscHZ2fHh4fn6AgoaIhoaKioqKjIyMkJCSlJSUlpqamJSQko6MjIyOjIqKioiIiIiIiIaGiISGhISEhoSIiIqKioqKioiGiIaIiI6OkI6OjIqMjIyMjIqIhoaIiIqIiIKChoiKioyOjoyMjI6Ojo6MioqIiIaEgIKGhoaChISChISGiIiKioiIioyIiIyOjIyOjIiIhoqIhIKEgH5+fn58fHh0dnZ4eHZ2dnRydnh4eH58eHh2eHh4eHp8fn6Aenh4eHZydHRycHBwbmxqaGZkZGhqamhoYmJeYmJiYmBgXlxaWFhcWFpaWFhaXFpaWlpaWFpcXmBiYmJiYmRkYmJkaGZmamhqampqamhoaGpsbGxqbGxsaGhqbGpqampqaGZmZmhqampsaGZsbGxwbm5wcnJycHR0dHR0dnh4dnZ4dnZ0dHR2cnR0dHZ0dHJ0dHR2dnR4dnR0dHZ2eHh6fHx6enh4dnZ8enp8fHx6fHx6fH6AgoaGioyOkpSUmJqcnqakpqqssLCsqqikoqSkoqKkpKCgnp6enJycnp6enpyampqanJycnJycmpqanp6koqSkpKampqamqqyurq6srKyqqKimpqSmpqSkpKKgnJ6enpyalpSSko6MiIaEgoKCgoCAfn58dHZ0eHZ2eHh2dnZ2dnZ0cnJycnJ2dHR0cG5sbGxsbGpsbGxqbGxoaGZqbG5ubmxsbnBwcnJwcHJ2dHR2dnh4eHZ6fHp+fn5+enp4enx4dnZ4dHBwbGpoampqaGZoZmRiZGZoamxoam5ucG5ucHJycnJwbm5saGZmaGZmZGRkYmJkYmBiYmJkYmJkZmJkYGJkZGZqZmhqbGpoampqbG5ubm5qampoaGxsamxsbGxsbmxucG5wcHR4eHh6fHh6fnx4dnZ6enp2eHh2dnZydnZ0cnJycnRydHR0dnh4eHp6enx+gICChIaIio6OkJCSkJCSlpiampiWlpaWlJKSlJSQkI6QjIqKhoaChoSAgoCAfn6AgIB+fn6AgoSGiIaMjI6Ojo6QkJKQkI6Qjo6KjIqKjo6QlpaWmJacmpyenp6ipKKgnpycnJiamJaUlpSUlJSUkJKSkJCQjpCOioqKjIyMjIyOjo6Ojo6MjIqKiIiEhoSCgoaEgoKCgIB+fnx8enZ2dHRycHBsbGpubnJwbG5ucHBucHBydHJydHRycnBsampqbGxmamZiYmJiYGBcXF5eYFxcXl5cXmJkZGZmZmZoZmxqbGxucHBycnJwdHR2eHh4eHh6enh6eHh4enp6fH6ChIaIioyQkJKUlJSUlpSUlpiYlJSUkpCOjIqIhISCgoSEhISGhoaIiIiKioqKio6MkJKSkJCSkpCSjo6MjIqKiIiCgIB6enp4dnRycGpqbmxqaGRkYmJiYmRmZmZkYmZkZmZoaGhubm5wbm5wcHJydHZ2enp6fHx8fn5+fn5+gISGiIiKkJKSlJaYmJqamJiWlpSUko6MhIKAfHh4dHBsaGZkZGJiZGJkZGhoaGhoaGpsbHBycHBwcG5wcnRycnBycnBubGpsbG5ubm5sbGxqbG5sbm5wcHB0dHh2eHZ0cnR0dHRycHJ0cnBwcHBwcnJycnJ0eHRydnh4enx8fHx8fHp+fn5+goKEhoqMjpCSkpCUlpqampqcnJygnqCgoJ6eoKCeoKCgoKCgoqCioKCinqCenJ6enp6enpycmpqenJyYlpSSjoyMhIaEgICAfHp6eHZ4dnh0eHh6eHh4enh4eHp4eHh4dnR2dnR0dHZ2dnZ2eHh6enh4enp8enx4eHp6eHp6dnR0dnZ2dHR4enx+gICAgoaGgoaIiIiGiIiIiIiIioaKiIyMjJCOkpKUlpSUkJCQkJCOjoyKioiIhoaCgH5+fHp6enh2dHJycnh6eHh4dnZ0cnR0dnh6fHp6fHp6fn6AgH5+enh2dnZ2eHJ2cnJycHBubGhoZmZmZGJeXlpaWlxYXFpaWlpeXGBeXlxaXl5kZGZmaGZsbGpqbnBydnZ2dnZ8gIKEhoaIjo6OkJSWmJSWlJaWlpiUmJaUkpKSkpCSkJCQjIyMioaGhICAfn58fHp4dnZ2dHJudHJwcnJycG5ucGxsbG5qaGhoYmZkZGRkYmRiZmRkZmpoZmZoaGhqamxsbG5wdHZ4eHx+fHx6en58fn6Afn5+goKChISAfn5+fn58enh4fnx4dnZ0cnR4eHh6fHyAgIKGiIqMjJCUlpaYmpqYmpqcmpiWlpqampycnKCenJqanJygnpyYlpaampqWlJKQjpCKioiEgoKCgIKCgH58fHp4dnZ4eHh2eHh0dHR2eHx8fH58fn5+foSEhoaIiISIiIiKioqKioqIiIaCgICAgICAgoKAgoCAfn5+fnp6dnp6fHx8enh6enh2dnR0dnR0dG52cm5ucHBubmxoZmpqam5sbnBubm5ubnJydHJycnJycnJ0dnZ2dHZ2eHR0dHh0dnh4dnJ0dHR2eHh6enx8fn6ChoqKjpKWlpaYnJycmpqanpqampiYlJSUlJKSkJKQmJCQkpCQlJSSkIyMjIyKjo6KjIqIiIiGiIiEhICAgoB8enp4dnRycm5ubmxoaGhiYmJiXl5eYGBkZmpqaGZmaGhqbm5wcG5udHJubnBubGhoampsZmhmaGhkZmZkYmZoZmhscHB0dnh6fn5+fn6CgoaGiIiIjIyIioqKjI6Ojo6OjpCQkpSUlpaYmJianJ6enp6gnqCcmJqYmJSSkpCQkIqGiIB8eHh2dHJsZmhqaGZmZmZmZmxmaGpsamxsbGxubmxwbm5ubGxscHBqbGhoampqampoaGhmaGhmaGhkZmRkZGZoaGhqbGxwbnJycnZ2eHp+gIJ+foKAfn5+gH5+gICCgoaIhoqQkpSYmpqanp6goqSkpqiqrKyqqqqoqKikoKCamJKMioiEgoKAen58enh6eHJydHR4enZ4dnh8enp8fHx6fn58fHyAgH6AgoCEhIiEgoKChoSEgoSGhoiKioqIiIyOkpKSjo6Ojo6SkpKQjIqOjIyIiIiKiIqKjIyOjo6QjpCQjo6OkJCOkJCQkI6QjIqIiIqIjIyOjIiIioqMioaEhISGhIKAgoCAgIKCgIKCgICAfoCAfHx+fn5+gHx+fn58fHx4eHZ2dnRycHBubGhoZGRmaGhqZmpqampqaGZmZGZoZmRkZGJgYGBeXF5eXlxcXFxYWlpYWlpcXFpaXFxcYF5gYmRkYmJkaGhoZmhsbG5sam5ubmxubnBwcnRycHJucnBwdnR0dHJudHZ6fn6GjI6QjpKUkpSWmJqanJqYlpqYlJCMiIiIhIKCfnx8eHh4eHp6fn58hIaKjpSYmJqenqKmoqamrKqqqqioqKagnJycnpycmJSSjoqIhIKCfn6AgHp6dnJsaGRmZGRiYmJiYmBeYGBgYGJgYmJkYmZkZGRoaGxsbnJ0dnh4eHyChoiOkpSYmp6kpqyurrS0tLKytLS0tLa2srK0tLCwrKigoKCeoKCcmJKUlJSOkpKWlpSYmJiamp6coKCgoqKinpqanJyYmJiUko6MjoqKiISEgoB+fHx6fHZ4cnBwcGxsbGpmZmRmYmBiZGJgYF5eXFxgXFxWWFhYVFRUVFZYWFZSUFBQTk5OTlJUUlJUUlBQUlRSVlZYWFhaXF5eXl5gYGJiYmJiYmRmaGpmZmpoaGhqampucnR0dnh6enx8fHp8enp6fHp8fHp+fH5+foKCgoiKioqKjIyOjIqOkJCWlpaUkpSYlJCQkJCSkpKUkpaWlpiWlpiYmJiYlpaUkpSUko6OjoqIioqMjoyKioqKiIiKio6QkI6OkI6QkJCUjo6QkpKWlJaWlpaSlpaWlpSWlpaWlJSSlJKQkpKWlpaWkpKQkJCSkpCOioqKiIaKiIiGhoqIhoaIiIaGhoKChICAgoKEgoaGhoaGhIiIiIiGhoaGhIKGiISAgoKEgoKEiISGhoaGhISEgH6CgIB8enh4enh2cm5ubnBubGpoaGhmZmZkZGZkZGRkYGBgYF5gYmRgYGBeWlhYWFhWVlZaWl5cXFpeXmBiZmpmZmZmamZmamhqbGxqampoaGZmaGRkZGRgYGBgYmJkYmBiYmhoaGpqamhsbnJ2dn5+fn6AgoKEhoqOlJSYlJSUlJianqKkpKSkoqCopKioqqqqqKikqKiopqigoKCenJiWkpCOjoyMiISCgnx6eHh2dnZycnR0dHR2dHRydHRycnR0cnJubnBydnZycnR6eHp8fHp6enp4eHh4eHh4eHh2dHh4dnZ8foSEhIaGhoaGhoSEgICAfICCgIKChICEgn5+fH6AgH5+hIaGjIqKjpKUlpqenp6ipqqsrq6usLCwrKympJ6enJiUko6OjIaCgHx4dnR0cG5uampoaGJgYGJiYmRkaGRkZGRiZmZmZmhoaGhoZGRmaGRmZmZmZGZoaGxudHR4enx8fHx+fn6AgoKGiIiKjI6QjIyMjIyKiISCgn6Efnx8fHx8fHx8fHx4eHZ0cHBycnJycnJwcnJudHZ2enh4cnJ2dnZ4eHh2eHh4dnx8fn5+gH6AgoB+gICChIaGiIiKiIiIiIiGiIiIhoSEgoB8enh2dnZ2dnh4eHh4dnZ4enx+foaMjpKSlpianqKkpqioqq6usLCusLCwrqywsKysrKqoqKioqKSkoKKgmpiWlJSSjpCQkJKUkI6KiISEgn5+fn56dnZycHBubnBwbnBybGxubGxubnBycnRycm5wbHJycnZ0cmxqaGpubGxsbGhoZmZkYmBgYmJiYGBgYGBiYmJgYGBgaGJmZGhobGxqampoaGZoaGZmZmJiZmZoZGJiYmJgYF5aWlhWWFpYWFpcWlhaXF5gYGBeXmJiYmBiZGRkZGZmaGhoZmZmamxucnZ2dnp8foCGiIqOjpSUlJaampygoKKmqKqqqq6ysLa2trSytLSysrKwsK6urKqmqKimpqSkpqSmpKaoqKiipqSgoqKgoKCenJiYmJSQjIiEhoaGgIKCgIB8fnp6eHh4eHR0dHZ2dnR0dnp6eHh4fnx8enp4dnRybm5ubnJycm5qaGZkZmZkZGBiYmBgYmRkYmRmYmZoaGpucnRyeHh4eHp+foKGhoqMjo6QlJqamqCipqiorKywsrK0tLSytLKysrCurKqoqKakop6coJyYmJaWlJSUlJSUlJSUkI6OioaGiIaEhICAfnx4eHZ2cnBubGpoZGBcWFZaVlZUUE5KSkpKSkxOTk5OUFJSVFZWWlxcXl5eYmJiZGZqampqamxqaGpqbGxubGxsbmxsaGhqbGxsbGxsbm5ubm5ubnRwbm5qaGZoZmZobG5wbnJycnZ4eHh8fH5+hoaIio6OkJaYmpqYmpaYmJiYlpaYlpaYmJiYmpiWlJKQkIyOjoqOjpCSkpaUlJaYlJKOjoyQlJaYkpSQkJCWlJSWlpiSmJqcmp6cnpyanpycmpiYmJaUlJSQjpCQjpCQkJCQkIyOjo6QkpaQjo6MjIyOjIyOioiIioiIiIaIhICAgICEhoaGhoSEgICCfoCChIaGhoaCgH5+fnp4dnRycnBwcG5saGRiYGBiYmRkYmJiYmJiYmRiYmRkaGhqaGZmZmRmamxqaGZmYmJiZGRqamxmZGJgYF5cWFxcXmBeXl5gYGBiYGRkZGRiZGRkZmZqaGpsbGpsbGxsbG5ucnJ0dHR2eHh4fHx8eH58fHp6fIB6foCAfoaChIaGhoiKjI6QkJKQkIyMio6OkpKUkpKOkJCQkJSSmJiYmpqampycmJycnJiWlpiWmpaWkpKUkJCKiIR+enp6enp2dnBwcHBwcnJuaGZoaGhqbGxsbm5oampscG5sbGxoamhqbG5ucHJ0dHBydHJycm5ydHp8fHx6fn6AgoaIjo6OjoyIioqKioqOjo6OkpKSkpKSkpaWlpaYmpycnKCioqKiopycnpqcnJqWlJKQjoyIhIaGhIKEiIqMjI6MjI6MiIqMjJCQjI6Mjo6QkI6MjIqMjpCSkpKOjoyOjpCOjo6KioyMjpCQkJCIhoaGhoKAgoKCgoKAgHx6dnh4dnp4dnZ2dHJycnBsbG5sampqaGhqbGxsam5ucHJ0cnJ0dHRybnBwbG5samZqZGRiYmBeXl5eXF5gXl5gYGBgYGBiYGBeYmJiYmJkYmRkZGZmaGpubGxubm5wbm5wcnJucG5sbGxqamxsbG5ucGxubm5ubGxucnJ0cnZ2enx8enx8fn5+fn6AgICAgICAgoKCgH5+gH5+hIKGhoSChISGhICAgIB8fHZwbmxqaGhmZmRgYmJgYGBiYmBiZGJiZmhqbnJ0dHZ6enx+goSEhoyMjpKUlJiYmJqanJqcmpqanJqcnJycnpqeoqampqimqKKiqq6wtLK0tLa0srCuqqiqrK6upqakpKKgnp6ampqamJaSkpCOioiEhISEhIaEgoSEgoCAgICCgoKAfHx+fHp6eHh2dnh4eHp8fHh6eHh4dnZ0dnZ4dnZ2eHZ2dnZ2dnZ0cHBsbGhmZmZkZmZkZGJiZGJgXlxcXl5gYmJkZGZmamxwcnZ4enp+foSGiIyKjo6OkJKQkpKOkIqOjo6KiIaCgoKGhIKCgHx6enx4eHh4eHh4enh6enx6eHx8enZ2eHh2dnZ0dnZ4dnZ0cnR0dHJwcnR2eHZ2eHZ2dnh2dnp8enx4dnZ2enx8fn5+fn6Afn5+fnx6fHp8enh0eHZ0cnJ0dHh4fHp6en58enh2eHZ2eHh4dnZ0dnZ2dHR2dHRwbmxoZGZmZGRmampqamxsamxucnZ4eHp8fHx8fH5+foCCgoKAgoSEhIaMjI6SlJSUlpiSkpKOkpKWlpSWlpiampyampqcmp6cnJiWmpyeoJ6cnJ6enJqanJ6coKKgoJ6inpygnJqYmpaYko6OiIaGgoB8enh0cm5ubGhqamhoYmZoZmpoZGZobGxsamxoaGhoaGpqamhmaGhkZGZoaGhmZGJiYmBgYF5eXlxcWl5gYmBiYl5gZGJgYGJkZGZmampoaGhoaGpqamhoZmhoamxucHJ0dnR2eHZ4enx8foKCgoKIjI6Ojo6MkIqMioqMioqGhICAfn58fHx+fHh0dnZ4enx+gICEhIaIioyMjo6SkpSUkpKQjpCOjIiIjo6OkJCMjoyMjIyKjIyKiIaGhISGhoaKjo6Qjo6OkJKSlpiYmpiYmJaWlJSWlJaWlpSQjI6OjIiGhoaGhoiGhoaGhISGhoiKiISEhoaIiISCgIKCgICAgIB+foCEgoKEgoaGioqKjo6QlJaWlpiYlpiYmJqYmpqYmJaWmJSSkpSQko6OjIyGhoSCgoKCgoCCgIKGiIiKhoSAfnx8fH6AgIB+fHh4eHp4eHZ0dHR2dHJwbm5samZkZGJiYGBeXFZWVlhUUlJOUFBQUFBSUlRUUlRQTE5OTlBOTk5MTk5QTlBOUlRSUlJYVlpcWl5iYmZmbGxwcnR0dHZ2eHh6eHh2eHZ2dnZ6enp6fn58fnyAgoaIioiIioyOkI6QkI6OkJCOjIqGgoKAfnx8fHp6fHh2eHR0cnBydnZ4dnZ6enp6enx8fn6EgIKChISEhoaIio6MioyIhISGhoyMjo6OkpaWlJSSlpiampyenJyanJyeoqKipKSgoJyalpSUlpianp6cmpiUlJaYmpianp6cmpiYmJqcnKCgnJyampiUlJKYmJSSjIyGhoSEgHx6eHR2dHBubmhoaGZkYF5cXFxeYGJiZGZmZGJkaGhoamhoamxwbm5ubGpubnBwdHR4fH5+gHx+foCEioyOkI6MjIqOkJCSkpCSkpKQkJKUlJSSkJCKiIaCgICAgHx6enp4dHRycnR2dnh2dnZ2dnR2eHp6fn58eHh2dnBwcm5samhkYmBeXFhaXl5gYGRmZmhmZmZqbnR4enx+fn6ChoiKjpKUlpSUlJSUlJaWmJiYlpSUlJaUlJKWlpaSkJCQkIyMjI6OkJCKhoSCgoSEhICAfHp6dHBwcG5ycG5sbGZmZmRmZGhoampqam5ubnRycnZ0dnZ4dnZ2dnRydHBwbGxoaGZqamxqam5oZmRkZGZmZmpqbGxubmxsbm5wcHJ0eHZ4eHZ6enp4eHp+fn6ChIaEhoqMioqMioqKioqKjpaYmpycnJqamJiYmJiUlJKQjo6OjoyIhoSEgIB+fHx6eHh4dnh4dHR0cHBwcHBydnRybnBwcGxoaGRiYGBgXl5cXF5eXmBkZGJgYmRkZmZoaGpwbm5sbm5ydnZ6enx+fnp6enx8fn5+hIaGhoaGiI6OjpKSlJKWlJicnp6gnp6cnJ6enJqanJ6gpKKioJ6eoKKkpKampqKgnpyamJaWmJqamJaWmJiYnJqWlpaUkJCOioiIiIiEiIaGhIKAfn5+foB8en58fn5+hISEiIqMio6OkpKWmpqampyYlpaWlpiWlJSSkpCMioaAgHx+fHh2dnR0dnx6dnZ2dHh2dnZ2eHh0cnJydHJ2eHZ2dHh2dnRwcnJydHBwbm5samxqampmZGJiYmJiZGZkZmZqbGxubm5ubm5wbm5uam5wbmxqampqZmZmYmJkZGRmZmxoampsbG5ubmxubnBycHJwcHJubGZobGpqamhoZmZmZGZoaGZmaGJiYmRoaGxucHBwcHJydnp6fH58fHx8enx+fn6CgoKCgH5+foCAfoB8foCAfHx8enZ2dnZ4dnZ2eHp8fHx8fHp4enp6fH58enp6fIB+foB+fn6ChIaGiIiKioiEhIaIiIqKiIiGiIiChIaIiIyOjI6OjpCQjoyMjI6Qjo6Ojo6OjpCQkIyOkJKWmpyeoJ6goKKkoKKkpKKinp6goqampKKioKCenJiWlpaYmJaWmJianJiUlJSUkpSUko6MjIaGiISChoaEgHp4dHRycnRwbnRwcnJycnJycHZ2dnRwcGxqaGpsbGxqbG5sbG5samxubG5ycnJwcHBubm5scHBycHBycnBwcG5sbGxqampoampqamxsbGpqamxqampoaG5wcHJycnR2dnh4enx8fn6EhoiKjJCQkpSUkI6MjIyKioiGhoSAenZ4eHZ2dHJycG5sbGxoampqam5ubHBydHZ2eHp8foSEiIiKioyMjI6OjoyOjoyOjIyMkI6OkJKUkpKUkpSSkpKQkJSUlpaWlJCQjIiGhoSCgHp2cHBqbGpoaGZkZmZmaGhoaGpsbG5ycHJ0cnh6fn5+goaIiIiIiIqMjJCQkI6MioyKiIaKjIqGhISEgIKChICCiIaGhoiEhIKAgISGhoCAfnx6fHh2dHRwbmxsbGpsbGhoaGRiYmJkaGhqbGpsbm5qam5ydHR0dHR0dnh4dHR2eHh6dnR0dnZ0eHZ0dHp8fHp6enx8enx8eHp+hIiGhoKAfn6AhISGiIiGgoKCgICAfH58fHp6enx+fn58enx6enp6eHh8fH5+foCAfoKEhIiGhoaIioaGhIaEgH5+fnx6dnh2dHR2dHJycnJycG5sbGxsbnBydHR4enh4eHZ4enx+fn58fHp4en5+gH6ChISEhoaIioyQkpaWlpiWlpiWmpqanJycnJyYmJaWlpiWlpSUjpCOlJiWlpaYmJyYmJaWlJaWmJiWlpaWlJSWlJaSko6KjIiGhoiIhoKEgIB6dnZycmxqampqaGRiXFxcWlxcWlpaWlpaWlhYWlxgYF5eXGBkYmJiYmBiYmZoam5ucHR2enx+goSGiIqKjI6SlJSWnJ6cnJ6enJ6ipKSkoqSgmJaSjIqIhoSEhISEgoCAfH6CgoSCgoCAfHp6eHh4eHh2dG5wbGpsbGxuamhkYF5cXl5eXGBgZGJkZGZqbGpsbm5ycnZ0dHZ4eHh4enx8enp4dHJycnRycnR0cnJycHJycnBwcHJwcGxsbG5ucHBwcnJ0dnZ4en6AhIiMjI6QkpCOlJaampqYmJaanpyamJaYmpyeoKSkpqSgoJ6enJ6cnKCalpSQhoaEgIKCgH5+fHx6fHp6enx8fHx6fHx+fn6EhIiIiIqMjpCOlJaUlpSUlJKUlJSWlpSUkpKQkI6MjIiKiISEgoKAenp2dHRycGxoZmBeXmBeXl5eXlxcXFxaXGBkZmpsampqbGpsbG5wcHJ0dHZ4enp8foCAfn6AgIB+fHh6eHh6enh2dHJycnBycnJwcnJucG5ucHB2eHh4fH58fn6ChIaGhoiIipCMioqUlJSWlJSUlpaUkpKSkpSWmJiWnJycnJqYmp6cnJqYmJKQjoyMioqIiIaGgoB+fHx6eHZ2dnJydHJydHRydHRycG5ucHBubnBoaGZoaGhoZGZmamhoYmBgYGBeXmBeXmBiZGZmZmZoaGhqam5wcHB0dnZ6fHx8fH6CgoSEioqIhoaEhoaGhoKEhoSGgoSEiIiMjJCUlpiYmJyYmpiampqamp6eoJ6eoKCenp6enqCgoJ6gnJyYlpaYlpKSkpKQjoqIiIaGiISGgoB8fHp4dnZ2dHBwamhmZGRkaGZmZGBgYF5iYmRoZmZqamxubm5ubnBwcnZ0dHRycHBubm5sbmxsbG5sbmxucnJ0dHR0dHZ2dnZ6eHh4eHh4enx+foKCgIB+fn5+foCAgH5+fHx8fn6AfHx+fHh4dHJwbm5sbm5ubnBubnBwcnJydHh4eHZ4eHp4fHp8fHx6fH58fH5+gH6AgoSChIiIio6OkpSWlpSUlpaWmpycoJ6enqSipKCgoJqamJaWlJKSko6MjIyOkJCSkpSUlpqampycnJqcmJiWlpiYmJSUkpCQjoyOjIyOioiGhoSEgIR+hISGgoB+fnx6dnZ6fHp6eHh2dnZ0cnJwbnBycHJwdHR0dHR2dHZ2eHh2eHh0dHR0cHB0eHh2dnh4dHZ4enp6eHp6fHh4dnZ2cHJubHBubGpoaGZmaGZoZGJkZGJmZmRkZmhoZGZkZGJkZGRmZmJgYGBeXlxeXl5gYmJoampsbGxucnRydHh4enx+gH6CgoKChISEhIaGhoiMjIqKioiIioqIiIaIhoaEhoSGhoaIiIqMjIyOjoyMjI6MioyMjIqKiIqOjpCSlJKUkJKQkJCQjpCMioyMioqIhIKEhIKChISCgH56eHRubGhoZmhoaGZmZmJkZGRkaGpsbnJwcHJ0eHh6en5+fn5+gIKGiIyMkJCSlpaYmJqanp6goJ6cnJqYmJaYmpyenJyanJqampiYmpqampqYnJiYmpiWlpSQkJCOkpCQjI6Ojo6IiIaGhICAgHx6enZ4dHJycnBsbmpoZmpoampsaGpqbm5ubm5sbm5ucHJycnJwcnR0dnp+fn5+gH6AgoCAgIKAgoSEgoKAfnp6fHh4dHR0cnJycnBwbm5sbmxsampqbGpsbGxoaGhqaGZmZGJiZGRkZmRmaGZkZGRmZmZmZmZmaGZoamhmZmRiYmZkYmJkZGZmamxubnB0eHp+foSEhoiIjI6QkI6QkpaUlJKSkIyOjoyMjo6OkJKQkJCSlJSSkpSQkJCOjIyOjpKQkI6OkJCQkJCQkpCQjo6MioyIhIKCgIB+fnx4dnZ0dnZ0dHBwcG5sam5sbGxsbGxsampsaGZmZmJiZGBaWlhYWlxaXFpcXFxeYGBiZmhqbnJwdHp+foKGjJCUmp6gpKakqKqusra4ur7EwsLExsTGxsTCwsTExsbIxsjGxsbGxsjIwsLCwL66uLaysKyopqimpKKgnJiYlJSQjoyMiIaEgn58fHx2dHRwcm5ubGpoaGhqZmhkYmBeYGBeXlxaXF5gXF5eXl5eXlxgXl5gYF5gYmJkYmBgXl5gYmJkZGZiZGJmampqampsam5sbGxubmxwbm5ycnJ2dHZ2eHp6en5+gIKEhIaGioqKjIqKiIiEhoSEgoKCgoCCgoCAfn6Afn6AfHx+enp4enp4eHZ0dHh4eHh2enh4en56enx+fHh2fHx8fn6AgoKGhoaGioqIioyMioqMioiKjIqEhISEgoKAgHx8enh0cnRwcHJydHR0dHJ2dHR0dnp4fH58fHx6fHx8enp+foCAfHp2dnR2dHRycnJydHJycnJybmxscG5ubG5ubnBwamxoaGpqampqamxubnBycHRwcnBwdHRydnRydHZ0eHh6fHx+goaKio6OkJKWmJqeoKKipKSkpKSkoqKkoKKioqCgoqKmoKCcmJiWmJiYmJiWlJCQkI6MjoyMioyIioqKiIqIiIiGhoSCgoB+fHp4eHJybnBwbm5sampqbGxwbnBwbnJ0cnR0cHBwcnRycnJwcHBwcHJ0cHBubmxubm5ucHBwcHBwcnR0eHp6fn58fnh6enh+foKEhISGhoiGioyMjJCQjpCOjIqMjJCOjpCQlJaYmJaWlJiYmJianp6goKCgnpycmJiSlJSQjoqGhIB+fnx8eHZ0dHZ4dnZ4dnZ2enp+foCAgoaIiISEhISGhoiIhoiGhoaGhISCgoB+fn58fHp6eHRwbmxsamxsaGhsampmZmZoaGZoZmRoZmhmaGRmZmZsam5ucHBydHR0dnZ4dnh6fHp+fHx+fn6AgoKEgIKAgn5+fnx2bmxqaGZkYmJkYFxcWlxaXl5gYGJiZmRmZmpqampucHJ0dnZ6fH6CgoaIjI6QkJSWlpSUlpiYmJaYnKCipKSmqKqqrKyqqqainpiWkJCMioaGgH56eHh0dHJwbGpoamZkYmBgYmJiZmhoaGhobG5ubnBubm5wbm5wbnBucHJ0dnZ0dnZ4eHZycG5ubmxwbm5wcHJ0dHR2fHx4eHZ2eHx+fH5+goSChISCgoSGhoaIiISEgoKAgICAgIKGiIiKioiKjo6QkpCSkpKUlpiWlpqclpaYkpKQkpSSkJKQjoyIioyKioqKjIqKioiIiIaKioiGhoSEgoSEhIaGhISGhIKAgICAfn58enp4enx6fn6AgoaKiIyOkpaampycnp6goKKioqKgpKCgnJiWko6MioaGhoKGgoB+enZwcG5ubGpmZmRiYmRkYmRkYg=='
const list = ['NextCloud', 'Dropbox', 'GoogleDrive', 'pCloud', 'Serveur_perso']
const lAlist = {
pCloud: { explik: 'Copier le lien fourni par pCloud<br> de la forme <i>https://e.pcloud.link/publink/show?code.....</i><br>dans la zone de texte URL ci-dessous' },
GoogleDrive: { explik: 'Copier le lien fourni par Google Drive<br> de la forme <i>https://drive.google.com/file/d/...../view</i><br>dans la zone de texte URL ci-dessous' },
Serveur_perso: { explik: 'Si vous possédez un serveur, <br>vous pouvez y déposer votre fichier, puis renseigner ci-dessous l\'URL d\'accès.<br><br>du type <b>https://adresse-serveur/chemin/nom-du-fichier</b>' },
NextCloud: { explik: 'Il faut utiliser le "<b>lien direct</b>" fourni par les Cloud de type NextCloud. <br> Pour le fichier , choisir Détails, partage, lien public. <br>Le "<b>lien direct</b>" s\'obtient en utilisant le lien public. ( <i>il finit par <b>/download</b> </i>). <br><br> <b>Il faut copier ce lien dans la zone de texte URL ci-dessous.</b>' },
Dropbox: { explik: 'Les liens fournis par DropBox quand vous sélectionnez <b>Partager la sélection</b> sont de la forme:<br><i> https://www.dropbox.com/scl/fi/plein-de-chiffres-et-de-lettres/powered_by.png?rlkey=plein-de-chiffres-et-de-lettres&dl=<b>0</b> </i><br><br> <b>Il faut copier ce lien dans la zone de texte URL ci-dessous <u>en remplaçant le 0 final par 1</u></b>.', adresse: 'https://www.dropbox.com' }
}
export function j3pPaletteMathquill2 (container, input, options) {
const liste2 = {
abs: '$\\left|x\\right|$',
Un: '$u_n$',
racine: '$\\sqrt{x}$',
barre: '$\\overline{A}$',
vecteur: '$\\vecteur{AB}$',
prosca: '$\\cdot$',
fraction: '$\\frac{a}{b}$',
pi: '$\\pi$',
exp: '$e^x$',
puissance: '$x^y$',
inf: '$\\infty$',
inter: '$\\cap$',
union: '$\\cup$',
vide: '$\\varnothing$',
ℕ: 'ℕ',
ℝ: 'ℝ',
ℚ: 'ℚ',
ℤ: 'ℤ',
setminus: '$\\setminus$',
infegal: '$\\le$',
supegal: '$\\ge$',
equivaut: '$\\Leftrightarrow$',
indice: '$A_x$',
conj: '$\\overline{z}$',
sigma: '$\\sigma$',
k_parmi_n: '$\\binom{k}{n}$',
ln: '$\\ln$',
log: '$\\log$',
sin: '$sin$',
cos: '$cos$',
tan: '$tan$',
integ: '$\\integ{f(x)}{x}{a}{b}$',
bracket: '$\\bracket{x}$',
prim: '$\\prim{f(x)}{a}{b}$',
'\\neq': '$\\neq$'
}
container = j3pEnsureHtmlElement(container)
// liste des boutons connus, avec la fct pour l’ajouter
// pour ajouter un bouton il faut
// - construire un png
// - ajouter la classe dans css/j3pboutons.css
// - ajouter la fct j3pAjouteMqXxx
// Création d’un div BarreBoutonsMQ dans le container
// j3pPaletteMathquill(this.zones.IG,"reponse1",{liste:["racine","fraction","puissance","pi","exp"]})
// Possibilité de spécifier un id plutôt que la création auto de BarreBoutonsMQ...
// j3pPaletteMathquill(this.zones.IG,"reponse1",{liste:["racine","fraction","puissance","pi","exp"],nomdiv:"MepBarreBoutonsMQ2"})
if (typeof options !== 'object') options = {}
const props = {}
// style
if (typeof options.style === 'object') {
props.style = j3pClone(options.style)
} else {
props.style = {}
}
// position
const pos = options.position
const oldBehaviour = (typeof pos === 'object' && hasProp(pos, 'top') && hasProp(pos, 'left'))
if (oldBehaviour) {
console.warn('le paramètre position est obsolète pour j3pPaletteMathquill, le supprimer devrait suffire dans la plupart des cas, sinon passer par style.position, style.top et style.left')
props.style.position = 'absolute'
props.style.top = pos.top
props.style.left = pos.left
} else {
// il faut forcer le positionnement du conteneur de la palette, car les boutons sont positionnés (par mathquill)
// on impose relative, sauf si on a exigé autre chose
if (!props.style.position) props.style.position = 'relative'
// et on positionne le parent s’il ne l’est pas
if (!container.style.position) container.style.position = 'relative'
}
// conteneur de la palette div#BarreBoutonsMQ
const newId = j3pGetNewId('BarreBoutonsMQ')
props.id = newId
const div = j3pAddElt(container, 'div', '', props)
// si on fourni pas de liste on met seulement ces 3 boutons (avant le 26/01/2020 c'était tous)
const liste = (Array.isArray(options.liste) && options.liste.length)
? options.liste
: ['fraction', 'puissance', 'racine']
for (const buttonName of liste) {
const isKnown = Boolean(mqCommandes[buttonName])
// une ou deux classes css (toujours mqButton)
const cb = isKnown
? mqCommandes[buttonName].bind(null, input)
: mqAjoute.bind(null, buttonName, input)
// des espaces pour les buttonName connus (sauf cette liste), sinon le buttonName
const bouton = j3pAddElt(div, 'button', { style: { cursor: 'pointer', margin: '2px', border: '1px solid black', borderRadius: '1px', background: '#fff', width: '35px', height: '35px', textAlign: 'center', verticalAlign: 'middle' } })
bouton.addEventListener('mouseover', () => {
bouton.style.background = '#e39e9e'
})
bouton.addEventListener('mouseout', () => {
bouton.style.background = '#ffffff'
})
bouton.addEventListener('click', cb)
if (options.big) {
bouton.style.height = '52px'
bouton.style.width = '85px'
}
j3pAffiche(bouton, null, liste2[buttonName])
}
return div
} // j3pPaletteMathquill
export function estNomdroite (lenom, options) {
const long = lenom.length
// test parenthes autour
if (lenom[0] !== '(') { return { good: false, adire: "Les noms des droites s'écrivent entre parenthèses !" } }
if (lenom[long - 1] !== ')') { return { good: false, adire: "Les noms des droites s'écrivent entre parenthèses !" } }
// test si dedans y’a 2 maj ou 1maj une min ou 2 min ou 1min
if (long === 3) {
if ('ABCDEFGHIJKLMNOPQRTUVWXYZ'.indexOf(lenom[1]) !== -1) {
return {
good: false,
adire: 'Il faut deux points pour nommer une droite !'
}
}
} else if (long > 4) {
return { good: false, adire: 'Pas plus de deux points pour nommer une droite !' }
}
// test si toutes les lettres utilisees existent
if (options.pointspossibles !== undefined) {
for (let i = 0; i < long - 2; i++) {
if (options.pointspossibles.indexOf(lenom[i + 1]) === -1) {
return {
good: false,
adire: 'Tu utilises une lettre qui n’est pas dans la figure !'
}
}
}
}
return { good: true, adire: '' }
}
export function estNompoint (lenom, options) {
if (lenom.length > 1) {
return { good: false, adire: "Le nom d’un point s'écrit avec un seule lettre en majuscule !" }
}
if ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'.indexOf(lenom) === -1) {
return {
good: false,
adire: "Le nom d’un point s'écrit avec un seule lettre en majuscule !"
}
}
if (options.pointspossibles !== undefined) {
if (options.pointspossibles.indexOf(lenom) === -1) {
return {
good: false,
adire: 'Tu utilises une lettre qui n’est pas dans la figure !'
}
}
}
return { good: true, adire: '' }
}
export function estMesureangle (lenom) {
if (lenom.indexOf('°') !== lenom.length - 1) {
return { good: false, adire: 'Une mesure d’angle se termine par ° !' }
}
const ret = parseFloat(lenom.replace('°', ''))
if ((ret < 0) || (ret > 360)) {
return { good: false, adire: 'Une mesure d’angle est comprise entre $0$° et $360$° !' }
}
return { good: true, adire: '', val: ret }
}
/**
* Idem j3pNombreBienEcrit où les espaces sont remplacées par des \text{ }
* @param nb
* @return {string}
*/
export function ecrisBienMathquill (nb) {
if (typeof nb === 'string') nb = Number(nb)
return j3pNombreBienEcrit(nb, { strict: true }).replace(/ /g, '\\text{ }')
}
export function estNomTriangle (n, att) {
let ok = true
if (n.length !== 3 || n.indexOf(')') !== -1 || n.indexOf('(') !== -1 || n.indexOf('[') !== -1 || n.indexOf(']') !== -1) {
return { good: false, err: ' Il faut trois lettres pour nommer un triangle ! ' }
}
ok = ok && (att.indexOf(n[0]) !== -1)
ok = ok && (att.indexOf(n[1]) !== -1)
ok = ok && (att.indexOf(n[2]) !== -1)
ok = ok && (n.indexOf(att[0]) !== -1)
ok = ok && (n.indexOf(att[1]) !== -1)
ok = ok && (n.indexOf(att[2]) !== -1)
if (ok) { return { good: true } } else { return { good: false, err: 'Ce n’est pas le bon triangle !' } }
}
/**
* Affiche un angle dans un span en mettant la classe css .zsmAngle sur conteneur
* @param {HTMLElement|string} conteneur
* @param {string} nomAngle
*/
export function affNomAngle (conteneur, nomAngle) {
if (typeof conteneur === 'string') conteneur = j3pElement(conteneur)
conteneur.className = 'zsmAngle'
const span = j3pAddElt(conteneur, 'span')
j3pAffiche(span, '', '$' + nomAngle + '$')
span.style.fontSize = '90%'
}
/**
* Affiche un angle avec la commande latex \widehat
* @param {HTMLElement|string} conteneur
* @param {string} nomAngle
*/
/*
export function affNomAngleWideHat (conteneur, nomAngle) {
if (typeof conteneur === 'string') conteneur = j3pElement(conteneur)
const span = j3pAddElt(conteneur, 'span', '', { style: { margin: '10px 1ch 0 1ch' } })
j3pAffiche(span, '', '$\\widehat' + nomAngle + '$')
span.style.fontSize = '80%'
}
*/
export function barreZone (elt) {
if (typeof elt === 'string') {
elt = j3pElement(elt)
}
if (!elt) return console.error(Error('Élément invalide'))
elt.setAttribute('data-barre', 'yes') // pour j3pDesactive
const long1 = elt.offsetWidth
const larg1 = elt.offsetHeight
const parent = elt
// on cherche le premier parent div ou span avec id
// si le parent, par rapport auquel sera calculée la position de la barre n’a pas de position,
// le positionnement de la barre ne fonctionnera pas
if (!parent.style.position) parent.style.position = 'relative'
let props = {
style: {
position: 'absolute',
left: 0,
top: 2,
boxShadow: '0 0 0'
}
}
// id inutile, mais c'était là avant, donc on le laisse au cas où certains l’utiliseraient
const div = j3pAjouteDiv(parent, null, '', props)
const svg = j3pCreeSVG(div, {
width: long1,
height: larg1,
style: {
position: 'relative'
}
})
props = {
x1: 0,
y1: 0,
x2: long1,
y2: larg1,
couleur: '#000000',
epaisseur: 3,
opacite: 0.6
}
j3pCreeSegment(svg, props)
// Ceci va empêcher tout modif du contenu de elt (y compris dans les outils de développement du navigo)
// Ajouté le 18/06/2021 (Rémi)
return div
}
function momod (tab) {
for (let i = 0; i < tab.length; i++) {
for (let j = 0; j < tab[i].length; j++) {
tab[i][j].style.padding = 0
}
}
}
export function afficheFrac (where) {
const aret2 = addTable(where, { nbLignes: 3, nbColonnes: 1, className: 'frac' })
const aret = getCells(aret2)
const traits = j3pAddElt(aret[1][0], 'div')
traits.classList.add('fracTrait')
aret[0][0].classList.add('fracNumerateur')
aret[2][0].classList.add('pouFrac2Bas')
const tb = j3pAddElt(aret[2][0], 'div')
tb.style.margin = 0
tb.style.display = 'inline-block'
tb.style.verticalAlign = 'top'
const th = j3pAddElt(aret[0][0], 'div')
th.style.margin = 0
th.style.display = 'inline-block'
th.style.verticalAlign = 'bottom'
const th2 = j3pAddElt(th, 'div')
th2.style.margin = 0
th2.style.padding = 0
th2.style.display = 'inline'
th2.style.verticalAlign = 'bottom'
return [th2, aret[1][0], tb]
}
export function affichefois (where) {
const tt = addDefaultTable(where, 1, 3)
momod(tt)
j3pAffiche(tt[0][1], null, '$\\times$')
return tt[0]
}
export function affichepuis (where) {
const aret = addDefaultTableDetailed(where, 4, 2)
for (let i = 0; i < 4; i++) {
for (let j = 0; j < 2; j++) {
aret.cells[i][j].style.padding = 0
}
}
j3pDetruit(aret.cells[1][1])
j3pDetruit(aret.cells[2][0])
j3pDetruit(aret.cells[3][1])
aret.cells[0][0].style.height = '10px'
aret.cells[1][0].style.height = '50%'
aret.cells[3][0].style.height = '10px'
aret.cells[0][1].setAttribute('rowspan', 2)
aret.cells[1][0].setAttribute('rowspan', 2)
aret.cells[2][1].setAttribute('rowspan', 2)
aret.cells[0][1].style.verticalAlign = 'top'
aret.cells[0][1].style.fontSize = '65%'
return [aret.cells[1][0], aret.cells[0][1], aret.cells[0][1]]
}
export function afficheplus (where) {
const tt = addDefaultTable(where, 1, 3)
momod(tt)
j3pAffiche(tt[0][1], null, '$+$')
return tt[0]
}
export function afficheplusPar (where) {
const tt = addDefaultTable(where, 1, 5)
momod(tt)
j3pAffiche(tt[0][2], null, '$+$')
const ret = [tt[0][1], tt[0][2], tt[0][3]]
tt[0][0].classList.add('parentheseOuvrante')
tt[0][4].classList.add('parentheseFermante')
return ret
}
export function affichemoins (where) {
const tt = addDefaultTable(where, 1, 3)
momod(tt)
j3pAffiche(tt[0][1], null, '$-$')
return tt[0]
}
export function affichemoinsPar (where) {
const tt = addDefaultTable(where, 1, 5)
momod(tt)
j3pAffiche(tt[0][2], null, '$-$')
const ret = [tt[0][1], tt[0][2], tt[0][3]]
tt[0][0].classList.add('parentheseOuvrante')
tt[0][4].classList.add('parentheseFermante')
return ret
}
export function BoutonRadio (container, name, value) {
container = j3pEnsureHtmlElement(container)
const inputProps = {
type: 'radio',
value,
name
}
inputProps.style = { marginRight: '1ch' }
const input = j3pAddElt(container, 'input', inputProps)
const labelElt = j3pAddElt(container, 'label')
return { input, label: labelElt }
}
export function faitAreaFacile (divEn, elem, editorConsigne, container, ml, foncAtcu) {
const maxLength = ml || 80
const tab1 = addDefaultTable(divEn, 3, 1)
const consigneG = j3pAddElt(tab1[1][0], 'textarea', '', {
value: elem[editorConsigne].replace(/<br>/g, '\r\n').replace(/<BR>/g, '\r\n'),
cols: 40,
rows: 2,
maxLength
})
const lamodaleG = j3pAddElt(tab1[1][0], 'div')
const sortie = j3pAddElt(tab1[2][0], 'div')
sortie.style.border = '1px solid black'
sortie.style.borderRadius = '5px'
sortie.style.minWidth = '200px'
sortie.style.minHeight = '40px'
sortie.style.background = '#b2afaf'
sortie.style.padding = '5px'
sortie.style.verticalAlign = 'middle'
sortie.style.textAlign = 'center'
sortie.style.fontSize = '20px'
sortie.style.fontFamily = 'Roboto, "Noto Emoji", sans-serif'
consigneG.style.resize = 'none'
consigneG.addEventListener('input', () => {
elem[editorConsigne] = consigneG.value
j3pEmpty(sortie)
j3pAffiche(sortie, null, consigneG.value)
})
consigneG.addEventListener('change', () => {
elem[editorConsigne] = consigneG.value
j3pEmpty(sortie)
j3pAffiche(sortie, null, consigneG.value)
})
j3pAffiche(sortie, null, consigneG.value)
const boutonIG = j3pAddElt(tab1[0][0], 'button')
boutonIG.addEventListener('click', faitItalG)
boutonIG.entree = consigneG
boutonIG.sortie = sortie
boutonIG.editorConsigne = editorConsigne
boutonIG.elem = elem
boutonIG.fonc = foncAtcu
j3pAddElt(boutonIG, 'em', ' I ')
const boutonGG = j3pAddElt(tab1[0][0], 'button')
boutonGG.addEventListener('click', faitBoldG)
boutonGG.entree = consigneG
boutonGG.sortie = sortie
boutonGG.editorConsigne = editorConsigne
boutonGG.elem = elem
boutonGG.fonc = foncAtcu
j3pAddElt(boutonGG, 'strong', ' G ')
const boutonUG = j3pAddElt(tab1[0][0], 'button')
boutonUG.addEventListener('click', faitUnderG)
boutonUG.entree = consigneG
boutonUG.sortie = sortie
boutonUG.editorConsigne = editorConsigne
boutonUG.elem = elem
boutonUG.fonc = foncAtcu
j3pAddElt(boutonUG, 'u', ' U ')
j3pAddContent(tab1[1][0], ' ')
const boutonSS = j3pAddElt(tab1[0][0], 'button')
boutonSS.addEventListener('click', faitSupG)
boutonSS.entree = consigneG
boutonSS.sortie = sortie
boutonSS.editorConsigne = editorConsigne
boutonSS.elem = elem
boutonSS.fonc = foncAtcu
j3pAddContent(boutonSS, ' Supprimer la mise en forme ')
j3pAddContent(tab1[1][0], ' ')
const boutonFonc = j3pAddElt(tab1[0][0], 'button')
boutonFonc.addEventListener('click', faitFonc)
boutonFonc.entree = consigneG
boutonFonc.sortie = sortie
boutonFonc.lamodale = lamodaleG
boutonFonc.exp = 'edit' + editorConsigne
boutonFonc.acache = tab1[0][0]
boutonFonc.editorConsigne = editorConsigne
boutonFonc.elem = elem
boutonFonc.container = container
boutonFonc.fonc = foncAtcu
lamodaleG.style.display = 'none'
j3pAddContent(boutonFonc, ' Formule ')
consigneG.sortie = sortie
return consigneG
}
function faitFonc () {
const liste = ['racine', 'fraction', 'pi', 'puissance', 'infegal', 'supegal', '\\neq']
const liste2 = [
'vecteur', 'prosca', 'abs', 'Un', 'sigma'
]
const liste3 = [
'inf', 'equivaut', 'indice', 'conj', 'bracket'
]
const liste4 = [
'inter', 'union', 'vide', 'barre', 'ℕ', 'ℝ', 'ℚ', 'ℤ'
]
const liste5 = [
'ln', 'log', 'sin', 'cos', 'tan', 'exp'
]
const liste6 = [
'integ', 'prim', 'k_parmi_n'
]
this.acache.style.visibility = 'hidden'
const rememberIndex = this.entree.selectionStart
this.lamodale.style.display = ''
this.lamodale.style.width = '400px'
this.entree.style.display = 'none'
const exp = j3pGetNewId(this.exp)
j3pEmpty(this.lamodale)
const divCont = j3pAddElt(this.lamodale, 'div')
divCont.style.border = '1px solid black'
divCont.style.borderRadius = '5px'
divCont.style.background = '#a49999'
divCont.style.padding = '5px'
const tabCont = addDefaultTable(divCont, 5, 1)
tabCont[1][0].style.height = '30px'
const tabBas = addDefaultTable(tabCont[3][0], 1, 3)
tabBas[0][1].style.width = '100%'
j3pAjouteBouton(tabBas[0][2], makeFaisAnnuleFormule(this.entree, this.lamodale, this.acache), { value: 'Annuler' })
const dernLigne = addDefaultTable(tabCont[2][0], 1, 2)
j3pAddContent(dernLigne[0][0], 'Formule: ')
const whereAF = j3pAddElt(dernLigne[0][1], 'div')
whereAF.style.background = '#fff'
whereAF.classList.add('pourFitContent')
const laf = j3pAffiche(whereAF, exp, '&1&', { inputmq1: {} })
mqRestriction(exp + 'inputmq1', '0123456789^,.+-*/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{}= ', {
commandes: [],
boundingContainer: this.container
})
const bbout = j3pAddElt(tabCont[1][0], 'div', '', { id: exp + 'boutonsmathquill' })
j3pPaletteMathquill2(bbout, exp + 'inputmq1', { liste })
j3pPaletteMathquill2(bbout, exp + 'inputmq1', { liste: liste2 })
j3pPaletteMathquill2(bbout, exp + 'inputmq1', { liste: liste3 })
j3pPaletteMathquill2(bbout, exp + 'inputmq1', { liste: liste4 })
j3pPaletteMathquill2(bbout, exp + 'inputmq1', { liste: liste5 })
j3pPaletteMathquill2(bbout, exp + 'inputmq1', { liste: liste6, big: true })
j3pAjouteBouton(tabBas[0][0], makeFaisOKFormule(laf, this.entree, this.sortie, rememberIndex, this.lamodale, this.acache, this.editorConsigne, this.elem, this.fonc), { value: 'OK' })
j3pFocus(exp + 'inputmq1')
}
function makeFaisOKFormule (zone, entree, sortie, index, modale, acache, editorConsigne, elem, fonc) {
return () => {
if (j3pValeurde(zone.inputmqList[0]).length > 0) {
const startSelection = entree.value.substring(0, index)
const endSelection = entree.value.substring(index)
entree.value = startSelection + '$' + j3pValeurde(zone.inputmqList[0]) + '$' + endSelection
elem[editorConsigne] = entree.value
}
modale.style.display = 'none'
entree.style.display = ''
acache.style.visibility = 'visible'
j3pEmpty(sortie)
j3pAffiche(sortie, null, entree.value)
if (typeof fonc === 'function') fonc()
}
}
function makeFaisAnnuleFormule (ent, mod, acache) {
return () => {
ent.style.display = ''
mod.style.display = 'none'
acache.style.visibility = 'visible'
}
}
export function faitSupG () {
const field = this.entree
field.value = field.value.replace(/<strong>/g, '')
field.value = field.value.replace(/<\/strong>/g, '')
field.value = field.value.replace(/<em>/g, '')
field.value = field.value.replace(/<\/em>/g, '')
field.value = field.value.replace(/<u>/g, '')
field.value = field.value.replace(/<\/u>/g, '')
field.value = field.value.replace(/<i>/g, '')
field.value = field.value.replace(/<\/i>/g, '')
field.value = field.value.replace(/<b>/g, '')
field.value = field.value.replace(/<\/b>/g, '')
this.elem[this.editorConsigne] = field.value
j3pEmpty(this.sortie)
j3pAffiche(this.sortie, null, field.value)
if (typeof this.fonc === 'function') this.fonc()
}
export function faitItalG () {
insertTag(this.entree, 'em', this.sortie, this.editorConsigne, this.elem, this.fonc)
}
export function faitBoldG () {
insertTag(this.entree, 'strong', this.sortie, this.editorConsigne, this.elem, this.fonc)
}
export function faitUnderG () {
insertTag(this.entree, 'u', this.sortie, this.editorConsigne, this.elem, this.fonc)
}
function insertTag (textareaId, tagType, sortie, editorConsigne, elem, actFonc) {
const field = textareaId
field.focus() // On remet le focus sur la zone de texte, suivant les navigateurs, on perd le focus en appelant la fonction.
const startSelection = field.value.substring(0, field.selectionStart)
const currentSelection = field.value.substring(field.selectionStart, field.selectionEnd)
const endSelection = field.value.substring(field.selectionEnd)
field.value = startSelection + '<' + tagType + '>' + currentSelection + '</' + tagType + '>' + endSelection
field.focus() // On remet le focus sur la zone de texte
elem[editorConsigne] = textareaId.value
j3pEmpty(sortie)
j3pAffiche(sortie, null, field.value)
if (typeof actFonc === 'function') actFonc()
}
export function faitSon (ou, el, editor, nomOb) {
j3pEmpty(ou)
const tbIm1 = addDefaultTable(ou, 5, 1)
ou.style.border = '1px solid black'
ou.style.padding = '5px'
el[nomOb] = el[nomOb] || genSon
const uiCont = j3pAddElt(tbIm1[0][0], 'div')
const ui = j3pAddElt(uiCont, 'div')
const ui2 = j3pAddElt(uiCont, 'div')
uiCont.style.border = '1px solid black'
uiCont.style.borderRadius = '5px'
uiCont.style.padding = '5px'
uiCont.style.paddingTop = '0px'
uiCont.style.background = '#aeef59'
uiCont.style.textAlign = 'center'
let RulView = el[nomOb].indexOf('base64') === -1
const tbIm2 = addDefaultTable(tbIm1[2][0], 4, 5)
const ptitab = addDefaultTable(tbIm2[3][0], 1, 2)
const tbImUrl = addDefaultTable(tbIm2[2][0], 2, 3)
j3pAddContent(tbImUrl[0][0], 'URL: ')
j3pAjouteBouton(tbImUrl[0][2], faitUrlSon, { value: 'OK' })
const inputURL = j3pAddElt(tbImUrl[0][1], 'input', { size: 12, value: (RulView) ? el[nomOb] : 'Entrez ici une URL' })
j3pAjouteBouton(ptitab[0][0], () => {
protocoleCloud(inputURL, faitUrlSon)
}, { value: 'Utiliser un fichier local' })
const boutSauv = j3pAjouteBouton(tbIm2[1][0], () => {
const a = document.createElement('a')
document.body.appendChild(a)
a.style = 'display: none'
a.href = el[nomOb]
a.download = 'Enregistrement.wav'
a.click()
j3pEmpty(tbIm2[0][0])
tbIm2[0][0].style.color = '#3360a8'
j3pAddContent(tbIm2[0][0], 'Ciquer sur "Utiliser un fichier local"\npour déposer ce fichier sur un dépot,\npuis renseignez son URL')
boutSauv.style.display = 'none'
window.URL.revokeObjectURL(el[nomOb])
el[nomOb] = ''
}, { value: 'Sauvegarder l’enregistrement' })
boutSauv.style.display = 'none'
let tTime
const pp1 = j3pAjouteBouton(ui, () => {
j3pEmpty(ptitab[0][1])
if (editor.snd) editor.snd.pause()
editor.snd = new Audio(el[nomOb])
editor.snd.addEventListener('error', (event) => {
j3pEmpty(tbIm2[0][0])
tbIm2[0][0].style.color = '#a83368'
j3pAddContent(tbIm2[0][0], 'URL non valide')
})
editor.snd.addEventListener('canplaythrough', (event) => {
editor.snd.play()
pp3.disabled = true
j3pEmpty(ui2)
j3pAddContent(ui2, 'Encours')
tTime = setInterval(() => {
j3pEmpty(ui2)
ui2.style.color = '#000000'
const recupe = editor.snd.paused
if (!recupe) {
j3pAddContent(ui2, 'En cours')
} else {
clearInterval(tTime)
pp3.disabled = false
}
}, 2)
})
}, { value: '►' })
j3pAddContent(ui, ' ')
const pp2 = j3pAjouteBouton(ui, () => {
j3pEmpty(ptitab[0][1])
if (editor.snd) editor.snd.pause()
pp3.disabled = false
j3pEmpty(ui2)
clearInterval(tTime)
}, { value: '▮' })
j3pAddContent(ui, ' ')
const sp1 = j3pAddElt(ui, 'span')
const sp2 = j3pAddElt(ui, 'span')
sp2.style.display = 'none'
const pp3 = j3pAjouteBouton(sp1, () => {
j3pEmpty(ptitab[0][1])
startRecordingButton()
sp1.style.display = 'none'
sp2.style.display = ''
pp1.style.visibility = 'hidden'
pp2.style.visibility = 'hidden'
tTime = setInterval(() => {
j3pEmpty(ui2)
const recupe = recupeTaille() * 6
j3pAddContent(ui2, recupe)
}, 2)
j3pEmpty(tbIm2[0][0])
tbIm2[0][0].style.color = '#3360a8'
j3pAddContent(tbIm2[0][0], 'Enregistrement')
}, { value: '⏺' })
j3pAjouteBouton(sp2, () => {
stopRecordingButton(mafoncBack)
clearInterval(tTime)
j3pEmpty(ptitab[0][1])
sp2.style.display = 'none'
sp1.style.display = ''
pp1.style.visibility = ''
pp2.style.visibility = ''
RulView = false
boutSauv.style.display = ''
tbIm2[0][0].style.color = '#ab2c1d'
}, { value: '▮' })
j3pAddContent(ui, ' ')
function mafoncBack (e) {
el[nomOb] = e
}
function faitUrlSon () {
tbIm2[0][0].style.color = '#ab0a0a'
boutSauv.style.display = 'none'
j3pEmpty(tbIm2[0][0])
j3pAddContent(tbIm2[0][0], 'URL: ' + inputURL.value)
el[nomOb] = inputURL.value
editor.snd = new Audio(el[nomOb])
editor.snd.addEventListener('canplaythrough', (event) => {
tbIm2[0][0].style.color = '#258f06'
})
}
}
export function placeJouerSon (divSon, el, stor, nomOb) {
const tabSon = addDefaultTable(divSon, 1, 5)
tabSon[0][2].style.padding = '0px'
tabSon[0][2].style.margin = '0px'
tabSon[0][4].style.padding = '0px'
tabSon[0][4].style.margin = '0px'
j3pAjouteBouton(tabSon[0][2], () => {
if (stor.snd) stor.snd.pause()
stor.snd = new Audio(el[nomOb])
stor.snd.play()
}, { value: '►' })
j3pAjouteBouton(tabSon[0][4], () => { if (stor.snd) stor.snd.pause() }, { value: '▮' })
j3pAddContent(tabSon[0][1], ' ')
j3pAddContent(tabSon[0][3], ' ')
const immm = j3pAddElt(tabSon[0][0], 'img', '', { src: ecouteImg, width: 30, height: 20 })
immm.style.width = '30px'
immm.style.height = '20px'
}
export function placeJouerSonFormule (divSon, el, stor, nomOb) {
const immm = j3pAddElt(divSon, 'img', '', { src: ecouteImg, width: 60, height: 50 })
immm.style.width = '60px'
immm.style.height = '50px'
const ui = j3pAddElt(divSon.lecteur, 'div')
ui.style.border = '1px solid black'
ui.style.borderRadius = '5px'
ui.style.padding = '5px'
ui.style.paddingTop = '0px'
ui.style.background = '#aeef59'
ui.style.textAlign = 'center'
j3pAjouteBouton(ui, () => {
if (stor.snd) stor.snd.pause()
stor.snd = new Audio(el[nomOb])
stor.snd.play()
}, { value: '►' })
j3pAddContent(ui, ' ')
j3pAjouteBouton(ui, () => {
if (stor.snd) stor.snd.pause()
}, { value: '▮' })
}
export function placeJouerSonEtiquettes (divSon, el, stor, nomOb, j) {
const ui2 = addDefaultTable(divSon, 1, 3)
ui2[0][0].style.paddingTop = '0px'
ui2[0][1].style.paddingTop = '0px'
ui2[0][2].style.paddingTop = '0px'
const limm = j3pAddElt(ui2[0][0], 'img', '', { src: ecouteImg, width: '20', height: '20' })
limm.style.width = '20px'
limm.style.height = '20px'
j3pAddContent(ui2[0][1], j + '. ')
const ui = j3pAddElt(ui2[0][2], 'div')
ui.style.border = '1px solid black'
ui.style.borderRadius = '5px'
ui.style.padding = '5px'
ui.style.paddingTop = '0px'
ui.style.background = '#aeef59'
ui.style.textAlign = 'center'
j3pAjouteBouton(ui, () => {
if (stor.snd) stor.snd.pause()
stor.snd = new Audio(el[nomOb])
stor.snd.play()
}, { value: '►' })
j3pAddContent(ui, ' ')
j3pAjouteBouton(ui, () => {
if (stor.snd) stor.snd.pause()
}, { value: '▮' })
}
export function importImage (dou1, el, nomObj, nomWidth, nomHeight, cacheLarg, editor, force, callBack) {
dou1.style.border = '1px solid black'
dou1.style.padding = '3px'
const tbIm1 = addDefaultTable(dou1, 5, 1)
tbIm1[2][0].style.padding = '0px'
const tab2 = addDefaultTable(tbIm1[2][0], 1, 2)
// tab2[0][0].style.padding = '0px'
tab2[0][1].style.padding = '0px'
const RulView = el[nomObj].indexOf('base64') === -1
const immm = j3pAddElt(tbIm1[0][0], 'img', '', { src: el[nomObj], width: el[nomWidth], height: el[nomHeight] })
if (force) {
immm.style.width = el[nomWidth] + 'px'
immm.style.height = el[nomHeight] + 'px'
}
const tbIm2 = addDefaultTable(tbIm1[3][0], 2, 3)
const tbImUrl = addDefaultTable(tbIm2[0][0], 2, 3)
j3pAddContent(tbImUrl[0][0], 'URL: ')
j3pAjouteBouton(tbImUrl[0][2], faitUrlIm, { value: 'OK' })
const inputURL = j3pAddElt(tbImUrl[0][1], 'input', { size: 12, value: (RulView) ? el[nomObj] : 'Entrez ici une URL' })
j3pAjouteBouton(tbIm2[1][0], () => {
protocoleCloud(inputURL, faitUrlIm)
}, { value: 'Utiliser un fichier local' })
if (!cacheLarg) {
const min1 = addDefaultTable(tbIm2[0][1], 1, 2)
j3pAddContent(min1[0][0], ' largeur: ')
j3pAddContent(tbIm2[1][1], ' ( entre 50 et 400 )')
const min2 = addDefaultTable(tbIm2[0][2], 1, 2)
j3pAddContent(min2[0][0], ' hauteur: ')
j3pAddContent(tbIm2[1][2], ' ( entre 50 et 300 )')
const inputLarg = j3pAddElt(min1[0][1], 'input', '', {
type: 'number',
value: el[nomWidth],
size: 5,
min: '50',
max: '400'
})
inputLarg.addEventListener('change', () => {
const averif = inputLarg.value
if (averif === '' || isNaN(averif) || (averif < 50) || (averif > 400)) inputLarg.value = '50'
el[nomWidth] = Number(inputLarg.value)
immm.style.width = el[nomWidth] + 'px'
})
const inputHaut = j3pAddElt(min2[0][1], 'input', '', {
type: 'number',
value: el[nomHeight],
size: 5,
min: '50',
max: '300'
})
inputHaut.addEventListener('change', () => {
const averif = inputHaut.value
if (averif === '' || isNaN(averif) || (averif < 50) || (averif > 300)) inputHaut.value = '50'
el[nomHeight] = Number(inputHaut.value)
immm.style.height = el[nomHeight] + 'px'
})
}
tab2[0][0].style.verticalAlign = 'top'
async function faitUrlIm () {
tbIm1[1][0].style.color = '#b90021'
j3pEmpty(tbIm1[1][0])
try {
immm.src = await checkImgUrl(inputURL.value)
j3pAddContent(tbIm1[1][0], 'URL: ' + immm.src)
el[nomObj] = immm.src
if (typeof callBack === 'function') callBack()
} catch (error) {
// @todo mettre plutôt error.message en rouge à coté de l’input
j3pAddContent(tbIm1[1][0], error.message)
}
}
immm.onload = () => {
tbIm1[1][0].style.color = '#258f06'
}
j3pAddContent(tab2[0][0], ' ')
}
function protocoleCloud (inputURL, faitUrlIm) {
const yy = j3pModale2({})
j3pEmpty(yy)
const tabYY = addDefaultTable(yy, 3, 1)
j3pAddContent(tabYY[0][0], '<b><u>Choisir un dépot</u></b>')
tabYY[0][0].style.textAlign = 'center'
j3pAddContent(tabYY[1][0], '\n')
tabYY[1][0].style.border = '1px solid black'
tabYY[1][0].style.borderRadius = '3px'
tabYY[1][0].style.backgrounf = '#fff'
tabYY[1][0].style.padding = '5px'
const dixExplikCloud = j3pAddElt(tabYY[2][0], 'div')
for (let i = 0; i < list.length; i++) {
j3pAjouteBouton(tabYY[1][0], () => { envoieCloud(tabYY[1][0], list[i], dixExplikCloud, divEx) }, { value: list[i] })
j3pAddContent(tabYY[1][0], ' ')
if ((i + 1) % 4 === 0) j3pAddContent(tabYY[1][0], '\n\n')
}
dixExplikCloud.style.border = '1px solid Black'
dixExplikCloud.style.background = '#7aefcc'
dixExplikCloud.style.color = '#445029'
dixExplikCloud.style.padding = '5px'
dixExplikCloud.style.display = 'none'
const divEx = j3pAddElt(tabYY[2][0], 'div')
divEx.style.border = '1px solid Black'
divEx.style.background = '#7aefcc'
divEx.style.color = '#445029'
divEx.style.padding = '5px'
j3pAddContent(divEx, '<b>1. Cliquer sur un dépot pour vous rendre sur leur site.</b>.')
j3pAddContent(divEx, '\n')
j3pAddContent(divEx, '<b>2. Déposer votre fichier sur le site.</b>.')
j3pAddContent(divEx, '\n')
j3pAddContent(divEx, '<b>3. Récupérer l’URL pour accéder à votre fichier.</b>.')
j3pAddContent(divEx, '\n')
j3pAddContent(divEx, '<b>4. Copier/coller l’URL dans la zone de texte.</b>.')
const divEx2 = j3pAddElt(tabYY[2][0], 'div')
divEx2.style.border = '1px solid Black'
divEx2.style.marginTop = '5px'
divEx2.style.background = '#fcda86'
divEx2.style.padding = '5px'
const tbImUrl = addDefaultTable(divEx2, 2, 3)
j3pAddContent(tbImUrl[0][0], 'URL: ')
const inputURL2 = j3pAddElt(tbImUrl[0][1], 'input', { size: 30, value: 'Entrez ici l’URL obtenue' })
j3pAjouteBouton(tbImUrl[0][2], () => {
const aCons = inputURL2.value
j3pDetruit('modale2')
j3pDetruit('j3pmasque2')
inputURL.value = aCons
faitUrlIm()
}, { value: 'OK' })
j3pAddContent(tabYY[2][0], '\n')
j3pAjouteBouton(tabYY[2][0], () => {
j3pDetruit('modale2')
j3pDetruit('j3pmasque2')
}, { value: 'Annuler' })
}
function envoieCloud (yy, ki, dixExplikCloud, divEx) {
j3pEmpty(dixExplikCloud)
dixExplikCloud.style.display = ''
divEx.style.display = 'none'
j3pAddContent(dixExplikCloud, lAlist[ki].explik + '\n\n')
if (lAlist[ki].adresse) {
j3pAddElt(dixExplikCloud, 'a', 'Ouvrir dans une nouvelle fenêtre / nouvel onglet', {
href: lAlist[ki].adresse,
target: '_blank'
})
}
}
export function importVideo (dou1, el, nomObj, nomWidth, cacheLarg, mtgAppLecteur) {
dou1.style.border = '1px solid black'
dou1.style.padding = '3px'
const tbIm1 = addDefaultTable(dou1, 6, 1)
tbIm1[2][0].style.padding = '0px'
const tab2 = addDefaultTable(tbIm1[5][0], 1, 2)
tab2[0][1].style.padding = '0px'
const immm = j3pAddElt(tbIm1[3][0], 'video', '', { preload: 'auto', poster: onLoad, src: el[nomObj], width: el[nomWidth] })
const bouPlay = j3pAjouteBouton(tbIm1[1][0], () => {
if (immm.paused) {
immm.play()
bouPlay.value = '䷁'
} else {
immm.pause()
bouPlay.value = '►'
}
}, { value: '►' })
function stopMedia () {
immm.pause()
immm.currentTime = 0
bouPlay.value = '►'
}
j3pAddContent(tbIm1[1][0], ' ')
j3pAjouteBouton(tbIm1[1][0], stopMedia, { value: '▮' })
j3pAddContent(tbIm1[1][0], ' ')
const spTime2 = j3pAddElt(tbIm1[1][0], 'span')
j3pAddContent(tbIm1[1][0], ' ')
const spTime = j3pAddElt(tbIm1[1][0], 'span')
const cursor = InitSlider(spTime2, 0, 100, aff, mtgAppLecteur)
function aff (val) {
immm.currentTime = immm.duration * val / 100
}
function setTime () {
const minutes = Math.floor(immm.currentTime / 60)
const seconds = Math.floor(immm.currentTime - minutes * 60)
let minuteValue
let secondValue
if (minutes < 10) {
minuteValue = '0' + minutes
} else {
minuteValue = minutes
}
if (seconds < 10) {
secondValue = '0' + seconds
} else {
secondValue = seconds
}
const minutes2 = Math.floor(immm.duration / 60)
const seconds2 = Math.floor(immm.duration - minutes2 * 60)
let minuteValue2
let secondValue2
if (minutes2 < 10) {
minuteValue2 = '0' + minutes2
} else {
minuteValue2 = minutes2
}
if (seconds2 < 10) {
secondValue2 = '0' + seconds2
} else {
secondValue2 = seconds2
}
const mediaTime = minuteValue + ':' + secondValue + ' / ' + minuteValue2 + ':' + secondValue2
spTime.textContent = mediaTime
cursor.setValue(immm.currentTime / immm.duration * 100)
}
tbIm1[1][0].style.visibility = 'hidden'
immm.addEventListener('ended', stopMedia)
immm.addEventListener('timeupdate', setTime)
let first = false
immm.addEventListener('canplaythrough', () => {
if (!first) {
tbIm1[1][0].style.visibility = 'visible'
immm.currentTime = 0
first = true
}
})
immm.addEventListener('stalled', () => {
immm.src = inputURL.value
first = false
tbIm1[1][0].style.visibility = 'hidden'
})
immm.setAttribute('disablePictureInPicture', true)
const tbIm2 = addDefaultTable(tbIm1[0][0], 1, 3)
if (!cacheLarg) {
j3pAddContent(tbIm2[0][0], 'largeur: ')
InitSlider(tbIm2[0][1], (el[nomWidth] - 200) / 400 * 100, 100, affLarg, mtgAppLecteur)
function affLarg (val) {
el[nomWidth] = 200 + val * 400 / 100
immm.style.width = el[nomWidth] + 'px'
}
}
const tbImUrl = addDefaultTable(tbIm1[4][0], 2, 3)
j3pAddContent(tbImUrl[0][0], 'URL: ')
const inputURL = j3pAddElt(tbImUrl[0][1], 'input', { size: 80, value: el[nomObj] })
inputURL.addEventListener('input', faitUrlIm)
function faitUrlIm () {
el[nomObj] = inputURL.value
immm.src = inputURL.value
tbIm1[1][0].style.visibility = 'hidden'
first = false
bouPlay.value = '►'
}
}
export function placeJouerVideo (divSon, el, nomObj, nomWidth, mtgAppLecteur) {
const tbIm1 = j3pAddElt(divSon, 'div')
tbIm1.style.background = '#aaa'
tbIm1.style.padding = '5px'
const immm = j3pAddElt(tbIm1, 'video', '', { preload: 'auto', poster: onLoad, src: el[nomObj], width: el[nomWidth] })
const tbIm2 = j3pAddElt(divSon, 'div')
j3pAddContent(tbIm2, ' ')
const bouPlay = j3pAddElt(tbIm2, 'button')
bouPlay.addEventListener('click', () => {
if (immm.paused) {
immm.play()
j3pEmpty(bouPlay)
j3pAddContent(bouPlay, '䷁')
} else {
immm.pause()
j3pEmpty(bouPlay)
j3pAddContent(bouPlay, '►')
}
})
j3pAddContent(bouPlay, '►')
tbIm2.style.paddingBottom = '5px'
bouPlay.style.marginTop = '-10px'
j3pAddContent(tbIm2, ' ')
const bouStop = j3pAddElt(tbIm2, 'button')
bouStop.style.marginTop = '-10px'
j3pAddContent(bouStop, '▮')
bouStop.addEventListener('click', () => {
immm.pause()
immm.currentTime = 0
j3pEmpty(bouPlay)
j3pAddContent(bouPlay, '►')
})
j3pAddContent(tbIm2, ' ')
j3pAddContent(tbIm2, ' ')
const spTime2 = j3pAddElt(tbIm2, 'span')
j3pAddContent(tbIm2, ' ')
const spTime = j3pAddElt(tbIm2, 'span')
const cursor = InitSlider(spTime2, 0, 100, aff, mtgAppLecteur)
function aff (val) {
immm.currentTime = immm.duration * val / 100
}
function setTime () {
const minutes = Math.floor(immm.currentTime / 60)
const seconds = Math.floor(immm.currentTime - minutes * 60)
let minuteValue
let secondValue
if (minutes < 10) {
minuteValue = '0' + minutes
} else {
minuteValue = minutes
}
if (seconds < 10) {
secondValue = '0' + seconds
} else {
secondValue = seconds
}
const minutes2 = Math.floor(immm.duration / 60)
const seconds2 = Math.floor(immm.duration - minutes2 * 60)
let minuteValue2
let secondValue2
if (minutes2 < 10) {
minuteValue2 = '0' + minutes2
} else {
minuteValue2 = minutes2
}
if (seconds2 < 10) {
secondValue2 = '0' + seconds2
} else {
secondValue2 = seconds2
}
const mediaTime = minuteValue + ':' + secondValue + ' / ' + minuteValue2 + ':' + secondValue2
spTime.textContent = mediaTime
cursor.setValue(immm.currentTime / immm.duration * 100)
}
tbIm2.style.visibility = 'hidden'
immm.addEventListener('ended', () => {
immm.pause()
immm.currentTime = 0
j3pEmpty(bouPlay)
j3pAddContent(bouPlay, '►')
})
let first = false
immm.addEventListener('canplaythrough', () => {
if (!first) {
tbIm2.style.visibility = 'visible'
immm.currentTime = 0
first = true
}
})
immm.addEventListener('timeupdate', setTime)
immm.setAttribute('disablePictureInPicture', true)
tbIm2.style.display = 'none'
setTimeout(() => {
tbIm2.style.display = ''
tbIm2.style.background = '#aaa'
}, 1000)
}
/*
function afficheExplik (ou, txt) {
const tomuch = addDefaultTable(ou, 1, 2)
j3pAjouteBouton(tomuch[0][0], () => { faiv(tomuch[0][1]) }, { value: ' ? ' })
tomuch[0][1].style.color = '#850593'
tomuch[0][1].style.background = '#b0ee7f'
tomuch[0][1].style.padding = '5px'
tomuch[0][1].style.border = '1px solid black'
j3pAddContent(tomuch[0][1], txt)
tomuch[0][1].style.display = 'none'
j3pAddContent(ou, '\n')
}
function faiv (el) {
el.style.display = (el.style.display === '') ? 'none' : ''
}
*/
export function j3pModale2 (options) {
function close () {
$(masque, modale).fadeOut(function () {
j3pDetruit(masque, modale)
if (typeof options.onClose === 'function') {
options.onClose()
}
})
}
let container = options.divparent || document.body
if (typeof container === 'string') container = j3pElement(container)
if (!j3pIsHtmlElement(container, true)) return
// Y’a eu une époque où on le prenait en param mais
// - tous passaient 'modale'
// - on ne peut pas gérer plus d’une modale
// => on l’impose
const id = 'modale2'
// on vérifie d’abord qu’il n’y a pas de modale déjà ouverte
let modale = document.getElementById(id)
if (modale) {
console.error(Error('Il y avait déjà une modale ouverte, on la vire d’abord'))
j3pDetruit(modale, 'j3pmasque')
}
// masque
const masque = j3pAddElt(container, 'div', '', {
id: 'j3pmasque2',
className: 'masqueModale2'
})
modale = j3pAddElt(container, 'div', '', {
id,
// className: 'modale',
style: {
display: '',
position: 'fixed'
}
})
modale.style.left = '200px'
modale.style.top = '200px'
modale.style.zIndex = '102'
modale.style.padding = '30px'
modale.style.background = '#aaa'
modale.style.border = '20px solid navy'
modale.style.borderRadius = '10px'
// croix pour fermer
const croix = j3pAddElt(modale, 'div', '', {
className: 'croix'
})
// titre
j3pAddElt(modale, 'div', options.titre, {
id: id + 'titre',
style: {
fontSize: '24px',
marginTop: '-15px',
borderBottom: '1px solid #000'
}
})
// contenu
j3pAddElt(modale, 'div', options.contenu, {
id: id + 'contenu',
style: {
fontSize: '18px',
whiteSpace: 'pre',
marginTop: '10px'
}
})
croix.addEventListener('click', close)
setTimeout(() => {
modale.style.left = '200px'
modale.style.top = '200px'
$(masque).fadeIn(500)
$(modale).fadeIn()
}, 100)
modale.masque = masque
return modale
} // j3pModale
export function isRepOkConst (stor, progConst, ds) {
progConst.lesReconstruits = []
progConst.leslongCoConst = []
stor.errPresk = []
stor.errOubli = false
stor.errOubliList = []
stor.errPontille = false
stor.errPontilleList = []
stor.errLong = false
stor.errLongList = []
stor.errApp = false
stor.errAppListe = []
stor.errCentre = false
stor.errCentreList = []
stor.errRayon = false
stor.errRayonList = []
stor.errDtePass = false
stor.errDtePasseList = []
stor.errDtePente = false
stor.errDtePenteList = []
stor.errCustom = false
stor.errCustomList = []
stor.errAngl = false
stor.errAnglList = []
stor.errAngl2 = false
stor.errAnglList2 = []
stor.errOub = false
stor.errOubList = []
stor.errTrait = false
stor.errPlaceSur = false
stor.errPlaceSurList = []
stor.yaerrType = false
stor.yaerrTypeList = []
let ok, bufnom, pt1, pt2, dista, pt3, pt4, aver, ff1, ff2, yaoubli, yaerrType
let ptAt = 0
let segAt = 0
let dteAt = 0
let cerAt = 0
let DdteAt = 0
const pourVerif = []
const condop = []
yaoubli = false
yaerrType = false
// test existence tout elem
for (let i = 0; i < stor.existeVerif.length; i++) {
bufnom = stor.existeVerif[i].nom
ok = false
const okpresk = []
if (stor.existeVerif[i].type === 'point') {
ok = progConst.nomspris.includes(bufnom)
ptAt++
if (!ok) {
stor.errOubli = true
yaoubli = true
stor.errOubliList.push({ type: stor.existeVerif[i].type, nom: bufnom, etape: stor.existeVerif[i].etape })
} else if (!progConst.retrouvePoint(bufnom)) {
yaerrType = true
stor.yaerrType = true
stor.yaerrTypeList.push(bufnom + ' existe mais ce n\'est pas un point ! ( etape ' + stor.existeVerif[i].etape + ' ) ')
}
}
if (stor.existeVerif[i].type === 'segment') {
segAt++
pt1 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(stor.existeVerif[i].nom[1]))
pt2 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(stor.existeVerif[i].nom[2]))
const ret = progConst.yaseg(pt1, pt2, stor.existeVerif[i].exa, stor.existeVerif[i].pointille)
if (!ret) {
yaoubli = true
if (stor.existeVerif[i].errOub !== undefined) {
stor.errOub = true
stor.errOubList.push(progConst.recupe(stor.existeVerif[i].errOub))
} else {
stor.errOubli = true
stor.errOubliList.push({ type: stor.existeVerif[i].type, nom: bufnom, etape: stor.existeVerif[i].etape })
}
}
if (ret === 'pointille') {
yaoubli = true
stor.errPontille = true
stor.errPontilleList.push({ type: stor.existeVerif[i].type, nom: bufnom, etape: stor.existeVerif[i].etape, pointille: stor.existeVerif[i].pointille })
}
}
if (stor.existeVerif[i].type === 'cercle' || stor.existeVerif[i].type === 'droite') {
if (stor.existeVerif[i].type === 'droite') {
dteAt++
} else {
cerAt++
}
for (let j = 0; j < progConst.nomspris.length; j++) {
const m1 = progConst.nomspris[j].replace(')', '').replace('(', '')
const m2 = bufnom.replace(/\$/g, '').replace(')', '').replace('(', '')
if (m1 === m2 && progConst.typeDe(progConst.nomspris[j]) === stor.existeVerif[i].type && progConst.nomspris[j] !== bufnom.replace(/\$/g, '')) {
okpresk.push({ trouve: progConst.nomspris[j], att: bufnom.replace(/\$/g, '') })
}
if (progConst.nomspris[j] === bufnom.replace(/\$/g, '') && progConst.typeDe(progConst.nomspris[j]) === stor.existeVerif[i].type) {
pourVerif.push({ nom: progConst.nomspris[j], num: j })
ok = true
}
}
if (stor.existeVerif[i].type === 'droite' && stor.existeVerif[i].exa) {
pt1 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(stor.existeVerif[i].nom[1]))
pt2 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(stor.existeVerif[i].nom[2]))
ok = ok || progConst.yadroite(pt1, pt2)
}
if (!ok) {
if (okpresk.length > 0) stor.errPresk.push(okpresk[0])
yaoubli = true
if (stor.existeVerif[i].errOub !== undefined) {
stor.errOub = true
stor.errOubList.push(progConst.recupe(stor.existeVerif[i].errOub))
} else {
stor.errOubli = true
stor.errOubliList.push({ type: stor.existeVerif[i].type, nom: bufnom, etape: stor.existeVerif[i].etape })
}
}
}
if (stor.existeVerif[i].type === 'demi-droite' || stor.existeVerif[i].type === 'demidroite') {
DdteAt++
pt1 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(stor.existeVerif[i].nom[1]))
pt2 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(stor.existeVerif[i].nom[2]))
ok = progConst.yademid(pt1, pt2, stor.existeVerif[i].exa)
if (!ok) {
yaoubli = true
if (stor.existeVerif[i].errOub !== undefined) {
stor.errOub = true
stor.errOubList.push(progConst.recupe(stor.existeVerif[i].errOub))
} else {
stor.errOubli = true
stor.errOubliList.push({ type: stor.existeVerif[i].type, nom: bufnom, etape: stor.existeVerif[i].etape })
}
}
}
}
if (yaoubli || yaerrType) {
return false
}
progConst.faisLongCo()
ok = true
for (let i = 0; i < stor.condVerif.length; i++) {
if (!stor.condVerif[i].noneed) {
if (stor.condVerif[i].t === 'long') {
// verif longueur
let lalaval = stor.condVerif[i].cb.replace('cm', '')
lalaval = j3pArrondi(parseFloat(lalaval), 1)
if (stor.condVerif[i].affiche === 'formule') {
/// faut calculer lalaval
aver = stor.condVerif[i].formule
if (aver.includes('\\frac{')) {
ff1 = aver.substring(6, aver.indexOf('}{'))
ff2 = aver.substring(aver.indexOf('}{') + 2, aver.length - 1)
} else {
ff2 = '1'
ff1 = aver
}
for (let j = progConst.nomprisProg.length - 1; j > -1; j--) {
const regex = new RegExp(progConst.nomprisProg[j].ki, 'g')
ff1 = ff1.replace(regex, progConst.nomprisProg[j].com)
ff2 = ff2.replace(regex, progConst.nomprisProg[j].com)
}
for (let j = 0; j < progConst.leslongCo.length; j++) {
let regex = new RegExp(progConst.leslongCo[j].nom1, 'g')
ff1 = ff1.replace(regex, progConst.leslongCo[j].long)
ff2 = ff2.replace(regex, progConst.leslongCo[j].long)
regex = new RegExp(progConst.leslongCo[j].nom2, 'g')
ff1 = ff1.replace(regex, progConst.leslongCo[j].long)
ff2 = ff2.replace(regex, progConst.leslongCo[j].long)
}
while (ff1.includes('\\times')) {
ff1 = ff1.replace('\\times', '*')
}
while (ff2.includes('\\times')) {
ff2 = ff2.replace('\\times', '*')
}
ff1 = progConst.calcule(ff1)
if (ff1.includes('/')) {
ff1 = String(j3pArrondi(parseInt(ff1.substring(0, ff1.indexOf('/'))) / parseInt(ff1.substring(ff1.indexOf('/') + 1)), 1))
}
ff2 = progConst.calcule(ff2)
if (ff2.includes('/')) {
ff2 = String(j3pArrondi(parseInt(ff2.substring(0, ff2.indexOf('/'))) / parseInt(ff2.substring(ff2.indexOf('/') + 1)), 1))
}
ff1 = j3pArrondi(parseFloat(ff1), 1)
ff2 = j3pArrondi(parseFloat(ff2), 1)
lalaval = ff1 / ff2
}
let p1 = stor.condVerif[i].co1
let p2 = stor.condVerif[i].cop
if (p1.includes('Hz')) p1 = progConst.corres(p1)
if (p2.includes('Hz')) p2 = progConst.corres(p2)
pt1 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(p1))
pt2 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(p2))
dista = progConst.dist(pt1, pt2) / progConst.unite
if (!((dista > lalaval - ds.Precis_long / 10) && (dista < lalaval + ds.Precis_long / 10))) {
if (stor.condVerif[i].err === undefined) {
stor.errLong = true
stor.errLongList.push({ ki: p1 + p2, att: lalaval, eu: j3pArrondi(dista, 1), etape: stor.condVerif[i].etape })
} else {
stor.errCustom = true
stor.errCustomList.push(progConst.recupe(stor.condVerif[i].err))
}
condop.push(stor.condVerif[i].pour)
ok = false
}
}
if (stor.condVerif[i].t === 'ap') {
const nomPt = progConst.retrouveTag(stor.condVerif[i].pour)[0]
switch (stor.condVerif[i].ki.type) {
case 'segment': {
let nomvF = progConst.retrouveTruc(progConst.recupe(stor.condVerif[i].ki.nom))
if (nomvF === undefined) {
nomvF = progConst.reconstruit(progConst.recupe(stor.condVerif[i].ki.nom))
} else {
nomvF = nomvF.tab[0]
}
dista = progConst.distPtSeg(nomvF, nomPt, progConst.recupe(stor.condVerif[i].ki.nom))
if (dista > ds.Precis_long / 10) {
if (stor.condVerif[i].err === undefined) {
stor.errApp = true
stor.errAppListe.push({ akoi: stor.condVerif[i].ki, ki: progConst.recupe(stor.condVerif[i].pour) })
} else {
stor.errCustom = true
stor.errCustomList.push(progConst.recupe(stor.condVerif[i].err))
}
ok = false
condop.push(stor.condVerif[i].pour)
}
break
}
case 'droite': {
let nomvF = progConst.retrouveTruc(progConst.recupe(stor.condVerif[i].ki.nom))
if (nomvF === undefined) {
nomvF = progConst.reconstruit(progConst.recupe(stor.condVerif[i].ki.nom))
} else {
nomvF = nomvF.tab[0]
}
dista = progConst.distPtDteTag(nomPt, nomvF)
// progConst.setVisible2(progConst.svgId, nomvF, true, true)
if (dista > ds.Precis_long / 10) {
if (stor.condVerif[i].err === undefined) {
stor.errApp = true
stor.errAppListe.push({ akoi: stor.condVerif[i].ki, ki: progConst.recupe(stor.condVerif[i].pour) })
} else {
stor.errCustom = true
stor.errCustomList.push(progConst.recupe(stor.condVerif[i].err))
}
ok = false
condop.push(stor.condVerif[i].pour)
}
}
break
case 'cercle' : {
const nomvF = progConst.retrouveCentreRayon(progConst.recupe(stor.condVerif[i].ki.nom))
const dista = progConst.dist(nomvF.centre, progConst.getPointPosition2(progConst.svgId, nomPt)) / progConst.unite
if (Math.abs(dista - nomvF.rayon) > ds.Precis_long / 10) {
if (stor.condVerif[i].err === undefined) {
stor.errApp = true
stor.errAppListe.push({ akoi: stor.condVerif[i].ki, ki: progConst.recupe(stor.condVerif[i].pour) })
} else {
stor.errCustom = true
stor.errCustomList.push(progConst.recupe(stor.condVerif[i].err))
}
ok = false
condop.push(stor.condVerif[i].pour)
}
}
break
case 'demi-droite':
case 'demidroite': {
let nomvF = progConst.retrouveTruc(progConst.recupe(stor.condVerif[i].ki.nom))
if (nomvF === undefined) {
nomvF = progConst.reconstruit(progConst.recupe(stor.condVerif[i].ki.nom))
} else {
nomvF = nomvF.tab[0]
}
try {
dista = progConst.distPtDDteTag(nomPt, nomvF, progConst.recupe(stor.condVerif[i].ki.nom))
} catch (e) {
j3pNotify('pour tom ', {
nomPt,
nomvF,
unNom: progConst.recupe(stor.condVerif[i].ki.nom),
condVerif: stor.condVerif[i]
})
}
if (dista > ds.Precis_long / 10) {
if (stor.condVerif[i].err === undefined) {
stor.errApp = true
stor.errAppListe.push({ akoi: stor.condVerif[i].ki, ki: progConst.recupe(stor.condVerif[i].pour) })
} else {
stor.errCustom = true
stor.errCustomList.push(progConst.recupe(stor.condVerif[i].err))
}
ok = false
condop.push(stor.condVerif[i].pour)
}
}
}
}
if (stor.condVerif[i].t === 'coo') {
if (condop.indexOf(stor.condVerif[i].pour) === -1) {
pt1 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(stor.condVerif[i].pour))
pt2 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(stor.condVerif[i].ki))
if (progConst.dist(pt1, pt2) > ds.Precis_long / 10 * progConst.unite) {
stor.errCustom = true
ok = false
stor.errCustomList.push(progConst.recupe(stor.condVerif[i].err))
}
}
}
if (stor.condVerif[i].t === 'cercle') {
pt1 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(progConst.recupe(stor.condVerif[i].centre)))
bufnom = bufnom.replace('£0£', '$' + stor.condVerif[i].rayon + '$')
dista = progConst.calculFormule(stor.condVerif[i].rayon, true)
// fais avec celui que y’a le nom... KEWAAA ?? mettre ici un commentaire que l’on pourrait comprendre ;-)
for (let j = 0; j < pourVerif.length; j++) {
if (pourVerif[j].nom === stor.condVerif[i].nom.replace(/\$/g, '')) {
pt4 = progConst.centreDe(pourVerif[j].nom)
break
}
}
// FIXME on fait quoi si on est jamais passé dans le if précédent ?
let repTT
// on cherche quoi ici ?
// pt4 = null // vaudrait mieux reset ce point ou lui donner un autre nom, pour éviter de garder sa valeur précédente
for (let j = 0; j < progConst.listeArcPris.length; j++) {
if (progConst.listeArcPris[j].centre === pt4) {
const arcPris = progConst.listeArcPris[j]
pt2 = progConst.getPointPosition2(progConst.svgId, arcPris.centre)
pt3 = progConst.getPointPosition2(progConst.svgId, arcPris.p1)
repTT = progConst.cercleok(pt1, pt2, pt3, dista)
break
}
}
if (repTT !== true) {
ok = false
condop.push(stor.condVerif[i].pour)
if (repTT === 'centre') {
stor.errCentre = true
stor.errCentreList.push({ nom: stor.condVerif[i].nom, centre: stor.condVerif[i].centre })
} else {
stor.errRayon = true
stor.errRayonList.push({ nom: stor.condVerif[i].nom })
}
}
}
if (stor.condVerif[i].t === 'droite') {
let lapProx = progConst.retrouveTag(progConst.recupe(stor.condVerif[i].pass))
if (lapProx === undefined) {
lapProx = progConst.reconstruit(progConst.recupe(stor.condVerif[i].pass))
} else {
lapProx = lapProx[0]
}
pt1 = progConst.getPointPosition2(progConst.svgId, lapProx)
switch (stor.condVerif[i].condd) {
case 'parallèle':
case 'perpendiculaire': {
let pourComp = progConst.retrouveDroite(progConst.recupe(stor.condVerif[i].odt))
if (pourComp === undefined) {
// ca veut dire qu'elle a pas de nom
const ptx = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(progConst.recupe(stor.condVerif[i].odt)[1]))
const pty = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(progConst.recupe(stor.condVerif[i].odt)[2]))
pourComp = progConst.yasegRenv(ptx, pty)
}
// TODO si odt existe pas ( parce que pas exigée ) , faut la créer puis l'effacer
aver = progConst.penteDe(pourComp)
}
break
default: {
let lapProx2 = progConst.retrouveTag(progConst.recupe(stor.condVerif[i].pass2))
if (lapProx2 === undefined) {
lapProx2 = progConst.reconstruit(progConst.recupe(stor.condVerif[i].pass2))
} else {
lapProx2 = lapProx2[0]
}
pt2 = progConst.getPointPosition2(progConst.svgId, lapProx2)
aver = Math.atan2(pt2.x - pt1.x, pt1.y - pt2.y) * 180 / Math.PI
if (aver < 0) aver += 180
}
}
// cherche dans seg droite demid
// fait avec ceui que ya le nom
for (let j = 0; j < pourVerif.length; j++) {
if (pourVerif[j].nom === stor.condVerif[i].nom.replace(/\$/g, '')) {
pt4 = progConst.point1De(pourVerif[j].nom)
break
}
}
// ff2 = null // ce serait plus prudent de réinitialiser ou prendre un autre nom
for (let j = 0; j < progConst.listeDtePris.length; j++) {
if (progConst.listeDtePris[j].point1 === pt4) {
const listeDtePris = progConst.listeDtePris[j]
pt2 = progConst.getPointPosition2(progConst.svgId, listeDtePris.point1)
pt3 = progConst.getPointPosition2(progConst.svgId, listeDtePris.point2)
ff2 = progConst.distPtDtebis(pt2, pt1, pt3) < ds.Precis_long / 10
break
}
}
if (!ff2) {
if (stor.condVerif[i].err === undefined) {
stor.errDtePass = true
stor.errDtePasseList.push({ nom: stor.condVerif[i].nom, pt: progConst.recupe(stor.condVerif[i].pass) })
} else {
stor.errCustom = true
stor.errCustomList.push(progConst.recupe(stor.condVerif[i].err))
}
ok = false
condop.push(stor.condVerif[i].pour)
}
if (stor.condVerif[i].condd === 'parallèle' || stor.condVerif[i].condd === 'perpendiculaire') {
dista = progConst.penteDe(progConst.retrouveDroite(progConst.recupe(stor.condVerif[i].nom)))
if (stor.condVerif[i].condd === 'perpendiculaire') {
if (dista + 90 > 180) {
dista = dista - 90
} else {
dista += 90
}
}
if (pasProcheD0ou180(dista, aver, ds.Precis_ang)) {
stor.errDtePente = true
condop.push(stor.condVerif[i].pour)
stor.errDtePenteList.push({ nom: stor.condVerif[i].nom, odt: stor.condVerif[i].odt, condd: stor.condVerif[i].condd })
ok = false
}
} else {
let lapProx2 = progConst.retrouveTag(progConst.recupe(stor.condVerif[i].pass2))
if (lapProx2 === undefined) {
lapProx2 = progConst.reconstruit(progConst.recupe(stor.condVerif[i].pass2))
} else {
lapProx2 = lapProx2[0]
}
pt1 = progConst.getPointPosition2(progConst.svgId, lapProx2)
ff2 = progConst.distPtDtebis(pt2, pt1, pt3) < ds.Precis_long / 10
if (!ff2) {
if (stor.condVerif[i].err === undefined) {
stor.errDtePass = true
stor.errDtePasseList.push({ nom: stor.condVerif[i].nom, pt: progConst.recupe(stor.condVerif[i].pass2) })
} else {
stor.errCustom = true
stor.errCustomList.push(progConst.recupe(stor.condVerif[i].err))
}
condop.push(stor.condVerif[i].pour)
ok = false
}
}
}
if (stor.condVerif[i].t === 'ang') {
pt1 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(stor.condVerif[i].co1))
pt2 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(progConst.recupe(stor.condVerif[i].cop)))
pt3 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(progConst.recupe(stor.condVerif[i].cop2)))
aver = progConst.lang(pt1, pt2, pt3)
if (stor.condVerif[i].cb !== undefined) {
ff1 = parseFloat(progConst.calcule(stor.condVerif[i].cb).replace(',', '.'))
} else {
j3pShowError('A faire angle pas dans cb')
}
if (Math.abs(ff1 - aver) > ds.Precis_ang) {
if (stor.condVerif[i].err === undefined) {
stor.errAngl = true
stor.errAnglList.push(
'L’angle ' + ' $\\widehat{' + progConst.recupe(stor.condVerif[i].co1 + stor.condVerif[i].cop + stor.condVerif[i].cop2) + '}$ mesure $' + j3pArrondi(aver, 1) + '$° (au lieu de $' + j3pArrondi(ff1, 1) + '$° , étape ' + (stor.condVerif[i].etape + 1) + ').'
)
} else {
stor.errCustom = true
stor.errCustomList.push(progConst.recupe(stor.condVerif[i].err))
}
ok = false
} else {
if (stor.condVerif[i].sens !== undefined) {
aver = progConst.slang(pt1, pt2, pt3)
if (aver !== (stor.condVerif[i].sens === 'direct')) {
stor.errAngl2 = true
stor.errAnglList2.push(
'L’angle ' + ' $\\widehat{' + progConst.recupe(stor.condVerif[i].co1 + stor.condVerif[i].cop + stor.condVerif[i].cop2) + '}$' + ' n’est pas tracé dans le bon sens !'
)
ok = false
}
}
}
}
if (stor.condVerif[i].t === 'sur') {
pt1 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(stor.condVerif[i].pour))
pt2 = progConst.getPointPosition2(progConst.svgId, progConst.htmlPoint(progConst.recupe(stor.condVerif[i].cop)))
dista = progConst.dist(pt1, pt2) / progConst.unite
if (!((dista > -ds.Precis_long / 10) && (dista < ds.Precis_long / 10))) {
if (stor.condVerif[i].err === undefined) {
stor.errPlaceSur = true
stor.errPlaceSurList.push({ ki: stor.condVerif[i].pour, etape: stor.condVerif[i].etape })
} else {
stor.errCustom = true
stor.errCustomList.push(progConst.recupe(stor.condVerif[i].err))
}
condop.push(stor.condVerif[i].pour)
ok = false
}
}
}
}
if (ok) {
if (progConst.nbAt) {
const nbseg = progConst.listeSegPris.length - progConst.ConsSegnb
const nbDte = progConst.listeDtePris.length - progConst.ConsDtenb
const nbDDte = progConst.listeDemiDPris.length - progConst.ConsDemiDnb
const nbCerc = progConst.listeArcPris.length - progConst.ConsArcnb
const nbPoint = progConst.listePointPris.length - progConst.ConsPtnb
if (nbseg > segAt || nbDte > dteAt || nbDDte > DdteAt || nbCerc > cerAt || nbPoint > ptAt) {
stor.errTrait = true
return false
}
}
}
if (!ok) return false
// verif angle
// verif para perp ?
stor.lesdiv.explications.classList.remove('explique')
if (stor.lesdiv.solution) stor.lesdiv.solution.classList.remove('correction')
return true
}
export function affCorrectionConst (bool, stor, progConst) {
let buf, elem, comp
progConst.faisFond(false)
if (stor.errOub) {
buf = ''
for (let i = 0; i < stor.errOubList.length; i++) {
buf += stor.errOubList[i] + '<br>'
}
j3pAffiche(stor.lesdiv.explications, null, buf)
}
if (stor.errOubli) {
if (stor.errOubliList.length > 1) {
buf = 'Il manque ces éléments:'
for (let i = 0; i < stor.errOubliList.length; i++) {
switch (stor.errOubliList[i].type) {
case 'point':
buf += '<br> - Le point ' + stor.errOubliList[i].nom + ' (étape $' + (stor.errOubliList[i].etape + 1) + '$)'
break
case 'segment':
buf += '<br> - Le segment ' + stor.errOubliList[i].nom + ' (étape $' + (stor.errOubliList[i].etape + 1) + '$)'
break
case 'droite':
buf += '<br> - La droite ' + stor.errOubliList[i].nom + ' ou son nom (étape $' + (stor.errOubliList[i].etape + 1) + '$)'
break
case 'demi-droite':
buf += '<br> - La demi-droite ' + stor.errOubliList[i].nom + ' (étape $' + (stor.errOubliList[i].etape + 1) + '$)'
break
case 'cercle':
buf += '<br> - le cercle ' + stor.errOubliList[i].nom.replace('Cercle', 'cercle') + ' ou son nom (étape $' + (stor.errOubliList[i].etape + 1) + '$)'
break
case 'arc':
buf += '<br> - L’arc de cercle ' + stor.errOubliList[i].nom + ' (étape $' + (stor.errOubliList[i].etape + 1) + '$)'
break
}
}
} else {
buf = 'Il manque '
switch (stor.errOubliList[0].type) {
case 'point':
buf += 'le point ' + stor.errOubliList[0].nom + ' (étape $' + (stor.errOubliList[0].etape + 1) + '$)'
break
case 'segment':
buf += 'le segment ' + stor.errOubliList[0].nom + ' (étape $' + (stor.errOubliList[0].etape + 1) + '$)'
break
case 'droite':
buf += 'la droite ' + stor.errOubliList[0].nom + ' ou son nom (étape $' + (stor.errOubliList[0].etape + 1) + '$)'
break
case 'demidroite':
case 'demi-droite':
buf += 'la demi-droite ' + stor.errOubliList[0].nom + ' (étape $' + (stor.errOubliList[0].etape + 1) + '$)'
break
case 'cercle':
buf += 'le cercle ' + stor.errOubliList[0].nom.replace('Cercle', 'cercle') + ' ou son nom (étape $' + (stor.errOubliList[0].etape + 1) + '$)'
break
case 'arc':
buf += 'l’arc de cercle ' + stor.errOubliList[0].nom + ' (étape $' + stor.errOubliList[0].etape + '$)'
break
}
}
j3pAffiche(stor.lesdiv.explications, null, buf)
}
if (stor.errPontille) {
buf = ''
for (let i = 0; i < stor.errPontilleList.length; i++) {
switch (stor.errPontilleList[i].type) {
case 'point':
buf += '<br> - Le point ' + stor.errPontilleList[i].nom
break
case 'segment':
buf += '<br> - Le segment ' + stor.errPontilleList[i].nom
break
case 'droite':
buf += '<br> - La droite ' + stor.errPontilleList[i].nom
break
case 'demi-droite':
buf += '<br> - La demi-droite ' + stor.errPontilleList[i].nom
break
case 'cercle':
buf += '<br> - le cercle ' + stor.errPontilleList[i].nom.replace('Cercle', 'cercle')
break
case 'arc':
buf += '<br> - L’arc de cercle ' + stor.errPontilleList[i].nom
break
}
buf += (stor.errPontilleList[i].pointille) ? ' devrait être en pointillés !' : ' ne doit pas être en pointillés !'
}
j3pAffiche(stor.lesdiv.explications, null, buf)
}
if (stor.errPresk.length > 0) {
for (let i = 0; i < stor.errPresk.length; i++) {
j3pAffiche(stor.lesdiv.explications, null, '<i>(Les noms ' + stor.errPresk[i].att + ' et ' + stor.errPresk[i].trouve + ' sont très proches.)</i> \n')
}
}
if (stor.errRayon) {
buf = ''
for (let i = 0; i < stor.errRayonList.length; i++) {
buf += 'Le rayon du cercle ' + stor.errRayonList[i].nom + ' ne convient pas ! <br>'
}
j3pAffiche(stor.lesdiv.explications, null, buf)
}
if (stor.errTrait) {
j3pAffiche(stor.lesdiv.explications, null, 'Il faut effacer tous les traits de construction !<br> ')
}
if (stor.errCentre) {
buf = ''
for (let i = 0; i < stor.errCentreList.length; i++) {
buf += 'Le centre du cercle ' + stor.errCentreList[i].nom + ' ne convient pas ! <br>'
}
j3pAffiche(stor.lesdiv.explications, null, buf)
}
if (stor.errLong) {
if (stor.errLongList.length > 1) {
buf = 'Des longueurs ne sont pas correctes:'
for (let i = 0; i < stor.errLongList.length; i++) {
buf += '<br> - La longueur $' + stor.errLongList[i].ki + '$ mesure $' + stor.errLongList[i].eu + '$ cm (au lieu de $' + stor.errLongList[i].att + '$ cm , étape $' + stor.errLongList[i].etape + '$)'
}
} else {
buf = 'La longueur ' + stor.errLongList[0].ki + ' mesure $' + stor.errLongList[0].eu + '$ cm (au lieu de $' + stor.errLongList[0].att + '$ cm , étape $' + (stor.errLongList[0].etape + 1) + '$)'
}
j3pAffiche(stor.lesdiv.explications, null, buf + '\n')
}
if (stor.errPlaceSur) {
if (stor.errPlaceSurList.length > 1) {
buf = 'Des points sont mal placés:'
for (let i = 0; i < stor.errPlaceSurList.length; i++) {
buf += '<br> - le point $' + stor.errPlaceSurList[i].ki + ' ( à l’étape $' + stor.errPlaceSurList[i].etape + '$)'
}
} else {
buf = 'Le point ' + stor.errPlaceSurList[0].ki + ' est mal placé ( à l’étape $' + (stor.errPlaceSurList[0].etape + 1) + '$)'
}
j3pAffiche(stor.lesdiv.explications, null, buf + '\n')
}
if (stor.errApp) {
buf = ''
for (let i = 0; i < stor.errAppListe.length; i++) {
switch (stor.errAppListe[i].akoi.type) {
case 'segment':
elem = ' au segment '
break
case 'droite':
elem = ' à la droite '
break
case 'demi-droite':
elem = ' à la demi-droite '
break
case 'arc':
elem = ' à l’arc '
break
case 'cercle':
elem = ' au cercle '
break
}
buf += 'Le point ' + stor.errAppListe[i].ki + ' doit appartenir ' + elem + progConst.recupe(stor.errAppListe[i].akoi.nom) + ' !<br>'
}
j3pAffiche(stor.lesdiv.explications, null, buf)
}
if (stor.yaerrType) {
buf = ''
for (let i = 0; i < stor.yaerrTypeList.length; i++) {
buf += stor.yaerrTypeList[i] + '<br>'
}
j3pAffiche(stor.lesdiv.explications, null, buf)
}
if (stor.errCustom) {
comp = []
buf = ''
for (let i = 0; i < stor.errCustomList.length; i++) {
if (comp.indexOf(stor.errCustomList[i]) === -1) {
buf += stor.errCustomList[i] + '<br>'
comp.push(stor.errCustomList[i])
}
}
j3pAffiche(stor.lesdiv.explications, null, buf)
}
if (stor.errAngl) {
buf = ''
for (let i = 0; i < stor.errAnglList.length; i++) {
buf += stor.errAnglList[i] + '<br>'
}
j3pAffiche(stor.lesdiv.explications, null, buf)
}
if (stor.errAngl2) {
buf = ''
for (let i = 0; i < stor.errAnglList2.length; i++) {
buf += stor.errAnglList2[i] + '<br>'
}
j3pAffiche(stor.lesdiv.explications, null, buf)
}
if (stor.errDtePente) {
buf = ''
for (let i = 0; i < stor.errDtePenteList.length; i++) {
buf += 'La droite ' + stor.errDtePenteList[i].nom + ' doit être ' + stor.errDtePenteList[i].condd + ' à la droite ' + stor.errDtePenteList[i].odt + ' ! <br>'
}
j3pAffiche(stor.lesdiv.explications, null, buf)
}
if (stor.errDtePass) {
buf = ''
for (let i = 0; i < stor.errDtePasseList.length; i++) {
buf += 'La droite ' + stor.errDtePasseList[i].nom + ' ne passe pas par le point ' + stor.errDtePasseList[i].pt + '! <br>'
}
j3pAffiche(stor.lesdiv.explications, null, buf)
}
if (bool) {
progConst.desactivezone()
progConst.colorTout(false)
j3pEmpty(stor.lesdiv.coboot)
j3pAjouteBouton(stor.lesdiv.coboot, function () {
const bx = 757.5
const ix = -54
for (let i = 3; i < progConst.polyhaut.length; i++) {
progConst.setVisible2(progConst.svgId, progConst.polyhaut[i], false, true)
if (i < stor.nbh) {
progConst.mtgAppLecteur.setPointPosition(progConst.svgId, progConst.tabh[i].pt, bx + ix * i, 3, true)
progConst.setVisible2(progConst.svgId, progConst.tabh[i].im, true, true)
progConst.mtgAppLecteur.addEventListener(progConst.svgId, progConst.tabh[i].im, 'mouseover', progConst.makeFoncOver(i, 0, progConst.tabh[i].k))
progConst.mtgAppLecteur.addEventListener(progConst.svgId, progConst.tabh[i].im, 'mouseout', progConst.makeFoncOut(i, 0, progConst.tabh[i].k))
progConst.mtgAppLecteur.addEventListener(progConst.svgId, progConst.tabh[i].im, 'click', progConst.tabh[i].func)
// associe image et place dans le bon cadre
// cree les fonction over down click out sur image
}
}
stor.onco = true
progConst.debutAnimeRepere()
}, { className: 'MepBoutons', value: 'Voir une correction' })
const bx = 757.5
const ix = -54
for (let i = 3; i < progConst.polyhaut.length; i++) {
progConst.setVisible2(progConst.svgId, progConst.polyhaut[i], false, true)
if (i < stor.nbh) {
progConst.mtgAppLecteur.setPointPosition(progConst.svgId, progConst.tabh[i].pt, bx + ix * i, 3, true)
progConst.setVisible2(progConst.svgId, progConst.tabh[i].im, true, true)
progConst.mtgAppLecteur.addEventListener(progConst.svgId, progConst.tabh[i].im, 'mouseover', progConst.makeFoncOver(i, 0, progConst.tabh[i].k))
progConst.mtgAppLecteur.addEventListener(progConst.svgId, progConst.tabh[i].im, 'mouseout', progConst.makeFoncOut(i, 0, progConst.tabh[i].k))
progConst.mtgAppLecteur.addEventListener(progConst.svgId, progConst.tabh[i].im, 'click', progConst.tabh[i].func)
// associe image et place dans le bon cadre
// cree les fonction over down click out sur image
}
}
const pt = progConst.mtgAppLecteur.getPointPosition({ a: 'ptcentrot' })
progConst.mtgAppLecteur.setPointPosition(progConst.svgId, '#ptbougrot', pt.x, pt.y - 50, true)
progConst.faiszomm(true, true)
progConst.rottout()
progConst.recentre()
}
}
function pasProcheD0ou180 (a1, a2, precis) {
if (Math.abs(a1 - a2) < Math.abs(precis)) return false
if (Math.abs(180 - a1 + a2) < Math.abs(precis)) return false
return true
}