From cc52e69f451540494bc2623a0ba661c8725e68cd Mon Sep 17 00:00:00 2001 From: Comfortably_Dumb1979 Date: Sun, 7 Sep 2025 08:55:56 -0400 Subject: [PATCH] Uploaded from CMSource --- .../AppDeployToolkitBanner.png | Bin 0 -> 11447 bytes .../AppDeployToolkitConfig.xml | 1300 ++ .../AppDeployToolkitExtensions.ps1 | 81 + .../AppDeployToolkit/AppDeployToolkitHelp.ps1 | 161 + .../AppDeployToolkit/AppDeployToolkitLogo.ico | Bin 0 -> 7358 bytes .../AppDeployToolkit/AppDeployToolkitLogo.png | Bin 0 -> 606823 bytes .../AppDeployToolkit/AppDeployToolkitMain.cs | 804 + .../AppDeployToolkit/AppDeployToolkitMain.ps1 | 16385 ++++++++++++++++ .../PS_Deployment/AppDeployToolkit/Thumbs.db | Bin 0 -> 6656 bytes .../PS_Deployment/Deploy-Application.exe | Bin 0 -> 274944 bytes .../Deploy-Application.exe.config | 7 + .../PS_Deployment/Deploy-Application.ps1 | 358 + 12 files changed, 19096 insertions(+) create mode 100644 Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitBanner.png create mode 100644 Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitConfig.xml create mode 100644 Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitExtensions.ps1 create mode 100644 Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitHelp.ps1 create mode 100644 Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitLogo.ico create mode 100644 Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitLogo.png create mode 100644 Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitMain.cs create mode 100644 Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitMain.ps1 create mode 100644 Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/Thumbs.db create mode 100644 Adobe Creative Cloud/6.4.0/PS_Deployment/Deploy-Application.exe create mode 100644 Adobe Creative Cloud/6.4.0/PS_Deployment/Deploy-Application.exe.config create mode 100644 Adobe Creative Cloud/6.4.0/PS_Deployment/Deploy-Application.ps1 diff --git a/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitBanner.png b/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitBanner.png new file mode 100644 index 0000000000000000000000000000000000000000..222bca440c7adfa3b217f13e99a47591980b0db2 GIT binary patch literal 11447 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 l#|#}_yRZtT239^UtruN^ + + + + + 3.9.3 + 02/05/2023 + + + + + True + + $envTemp + + HKLM:\SOFTWARE + + $envWinDir\Logs\Software + + $envTemp + + HKCU:\SOFTWARE + + $envProgramData\Logs\Software + + False + + CMTrace + + False + + 10 + + True + + + + + + + True + PSAppDeployToolkit + + + + + + AppDeployToolkitLogo.ico + + AppDeployToolkitLogo.png + + AppDeployToolkitBanner.png + + 150 + + + + + + + /L*v + + $envWinDir\Logs\Software + + $envProgramData\Logs\Software + + REBOOT=ReallySuppress /QB-! + + REBOOT=ReallySuppress /QN + + REBOOT=ReallySuppress /QN + + 600 + + + + + + + + + True + + 6900 + + 1618 + + 60012 + + 60 + + 600 + + 120 + + True + + + + + 2 + + + + + + + + You do not have enough disk space to complete the installation of: + {0} + + Space required: {1}MB + Space available: {2}MB + + Please free up enough disk space in order to proceed with the installation. + Continue + + Only select "Continue" after closing the above listed application(s). + + Close Programs + + Defer + + The following programs must be closed before the installation can proceed. + + Please save your work, close the programs, and then continue. + Alternatively, save your work and click "Close Programs". + + NOTE: The program(s) will be automatically closed in: + + The following application is about to be installed: + + You can choose to defer the installation until the deferral expires: + + Once the deferral has expired, you will no longer have the option to defer. + + Remaining Deferrals: + + Deadline: + + + The {0} will automatically continue in: + + + + + Installation + + Uninstallation + + Repairing + + + + started. + + complete. + + complete. A reboot is required. + + failed. + + not complete. + + + Installation in progress. Please wait... + + Uninstallation in progress. Please wait... + + Repair in progress. Please wait... + + Launching this application has been temporarily blocked so that an installation operation can complete. + + Restart Required + + In order for the installation to complete, you must restart your computer. + Please save your work and restart within the allotted time. + Your computer will be automatically restarted at the end of the countdown. + + Time remaining: + Minimize + Restart Now + + + + + Du har ikke plads nok til at færdiggøre installationen af: + {0} + + Plads krævet: {1}MB + Plads tilgængelig: {2}MB + + Vær venlig at frigøre nok diskplads før du fortsætter installationen. + Fortsæt + Vælg kun "Fortsæt" efter at du har afsluttet de ovenfor nævnte programmer. + Luk Programmer + Udsæt + Følgende programmer skal lukkes før installationen kan fortsætte. + + Gem dit arbejde, luk programmerne og fortsæt. + Alternativt kan du gemme dit arbejde og trykke på "Luk Programmer". + BEMÆRK: Programmet/Programmerne vil automatisk blive lukket om: + Følgende applikation vil nu blive installeret: + Du kan vælge at udsætte installationen indtil udsættelsesperioden udløber: + Når udsættelsesperioden udløber kan du ikke længere udsætte installationen. + Udsættelser tilbage: + Deadline: + + The {0} will automatically continue in: + + + Installation + Afinstallation + Reparere + + startet. + færdig. + færdig. En genstart er nødvendig. + fejlet. + ikke færdig. + Installation i gang. Vent venligst... + Afinstallation i gang. Vent venligst... + Reparere i gang. Vent venligst... + Opstart af denne applikation er midlertidigt blokeret da en installationsproces er under afvikling. + Genstart Nødvendig + For at færdiggøre installationen skal du genstarte din computer. + Du bør venligst gemme dit arbejde og genstarte indenfor det givne tidsrum. + Din computer vil automatisk blive genstartet når nedtællingen er færdig. + Tid tilbage: + Minimere + Genstart Nu + + + + + Vous n’avez pas assez d’espace sur le disque pour compléter l’installation de: + {0} + + Espace requis: {1}MB + Espace disponible: {2}MB + + Merci de vous assurez d’avoir assez d’espace libre pour pouvoir continuer l’installation. + Poursuivre + Veuillez cliquer sur « Poursuivre » uniquement après avoir fermé la ou les application(s) ci-dessus. + Fermer Programmes + Reporter l'installation + Les programmes suivants doivent être fermés afin que l'installation s'initialise. + + Merci de sauvegarder votre travail, fermer tous les programmes, et continuer. + Vous pouvez aussi sauvegarder votre travail puis cliquez sur « Fermer Programmes ». + REMARQUE: Les programmes seront automatiquement fermés dans: + L'application suivante est sur le point d'être installée: + Vous pouvez choisir de reporter l'installation: + Quand le temps aura expiré, vous n'aurez plus la possibilité de reporter. + Nombre(s) de report restant(s): + Temps limite: + + Le {0} va continuer automatiquement: + + + Installation + Désinstallation + Réparation + en cours. + réussie. + réussie. Un redémarrage est requis. + en échec. + incomplète. + Installation en cours, merci de patienter... + Désinstallation en cours, merci de patienter... + Réparation en cours, merci de patienter... + Le lancement de cette application a été temporairement bloqué afin qu'une autre installation puisse se terminer. + Redémarrage Requis + Pour que l'installation soit compléte, vous devez redémarrer votre ordinateur. + Merci de sauvegarder votre travail et de redémarrer avant que le temps spécifié ne soit écoulé. + Votre ordinateur sera automatiquement redémarré à la fin du décompte. + Temps restant: + Minimiser + Redémarrer Maintenant + + + + + Sie haben nicht genug freien Speicherplatz um die Installation abzuschließen: + {0} + + Platzbedarf: {1}MB + Freier Speicherplatz: {2}MB + + Bitte geben Sie ausreichend Speicherplatz frei, um mit der Installation fortzufahren. + Weiter + Klicken Sie erst auf „Weiter“, nachdem Sie die obigen Anwendung(en) geschlossen haben. + Programme Schließen + Aufschieben + Die folgenden Programme müssen geschlossen werden, bevor die Installation fortgesetzt werden kann. + + Bitte speichern Sie Ihre Arbeit, schließen Sie die Programme und fahren Sie dann fort. + Alternativ können Sie Ihre Arbeit speichern und dann auf „Programme Schließen“ klicken. + HINWEIS: Diese Programme werden automatisch geschlossen: + Die folgende Anwendung soll installiert werden: + Sie können die Installation verzögern, bis die Rückstellung abläuft: + Sobald die Rückstellung abgelaufen ist, werden Sie keine Möglichkeit mehr haben die Installation zu verschieben. + Verbleibende Rückstellungen: + Termin: + + Die {0} wird automatisch fortgesetzt in: + + + Installation + Deinstallation + Reparatur + gestartet. + abgeschlossen. + abgeschlossen. Ein Neustart ist erforderlich. + ist fehlgeschlagen. + nicht abgeschlossen werden. + Installation wird durchgeführt. Bitte warten... + Deinstallation wird durchgeführt. Bitte warten... + Reparatur wird durchgeführt. Bitte warten... + Das Starten dieser Anwendung(en) wurde vorübergehend blockiert, damit der Installationsvorgang erfolgreich durchgeführt werden kann. + Neustart Erforderlich + Zum Abschluss der Installation müssen Sie Ihren Computer neu starten. + Bitte speichern Sie Ihre Arbeit und starten Sie den Computer innerhalb der vorgegebenen Zeit neu. + Am Ende des Countdowns wird Ihr Computer automatisch neu gestartet. + Verbleibende Zeit: + Minimieren + Jetzt Neustarten + + + + + Non si dispone di spazio su disco sufficiente per completare l' installazione di: + {0} + + Spazio necessario: {1}MB + Spazio disponibile: {2}MB + + Si prega di spazio libero su disco sufficiente per procedere con l'installazione. + Continua + Seleziona "Continua" solo dopo la chiusura della(e) applicazione(i) elencate sopra. + Chiudi Programmi + Rimanda + I seguenti programmi devono essere chiusi prima che l'installazione possa procedere. + + Salvare il lavoro , chiudere i programmi, e poi continuare. + In alternativa, salvare il lavoro e fare clic su "Chiudi Programmi". + NOTA: il programma(s) sarà chiuso automaticamente in: + La seguente applicazione sta per essere installata: + Si può decidere di posticipare l'installazione fino alla prossima richiesta automatica: + Una volta che le richieste rimanenti saranno scadute, non sarà più possibile posticipare l'installazione. + Posticipi rimanenti: + Scadenza: + + The {0} will automatically continue in: + + + Installazione + Disinstallazione + Riparazione + Iniziata. + Completata. + Completata. È necessario riavviare il computer. + Fallita. + Non completata. + Installazione in corso. Attendere prego... + Disinstallazione in corso. Attendere prego... + Riparazione in corso. Attendere prego... + L'esecuzione di questa applicazione è stata temporaneamente bloccata in modo che l'operazione di installazione possa essere completata. + Riavvio Richiesto + Per completare l'installazione, è necessario riavviare il computer. + Salvare il lavoro e riavviare entro il tempo assegnato. + Il computer verrà riavviato automaticamente al termine del conto alla rovescia. + Tempo rimanente: + Minimizzare + Riavvia Ora + + + + + ディスクの空き容量が不足しているため、インストールを完了できません: + {0} + + 必要な容量: {1}MB + 現在の空き容量: {2}MB + + インストールを実行するために、容量を確保してください + 続行 + 上記に記載されているアプリケーションを終了してから「続ける」を選択してください。 + プログラムを強制終了 + 後で + インストールを実行するために、下記のプログラムを閉じる必要があります。 + + 実行中のアプリケーションを保存し、閉じてから続行してください。 + または、実行中のアプリケーションを保存し、プログラムを強制終了ボタンをクリックしてくだい + 注意: これらのプログラムは自動的に閉じられます: + このアプリケーションはこれからインストールされます。 + 再試行可能回数が0になるまでは、都合の良い時にインストール可能です。 + 再試行可能回数が0になった場合、システムで強制インストールをします。 + 再試行可能回数: + デッドライン: + + The {0} will automatically continue in: + + + インストール + アンインストール + 修復 + 開始 + 完了です + 完了。再起動が必要です。 + 失敗。 + 未完了。 + インストール中です。 少々お待ちください。 + アンインストール中です。 少々お待ちください。 + 修復中です。 少々お待ちください。 + アプリケーションインストールが完了するまで、このアプリケーションの起動を一時的にブロックしています。 + 再起動が必要です + インストールを完了するために、再起動が必要です。 + 実行中のアプリケーションを保存し、再起動してください。 + カウントダウン後にコンピュータが再起動します。 + 残時間: + 最小 化 + 今すぐ再起動 + + + + + Du har ikke nok diskplass for å fullføre installasjonen av: + {0} + + Ledig plass påkrevd: {1}MB + Ledig plass tilgjengelig: {2}MB + + Frigjør diskplass for å fortsette installasjonen. + Fortsett + Velg kun "Fortsett" etter du har lukket applikasjonen(e) oppført over. + Lukk Programmer + Utsett + Følgende programmer må lukkes før installasjonen kan fortsette. + + Lagre arbeidet, lukk programmene og velg "Fortsett" + Eller velg "Lukk Programmer" uten å lagre. + OBS: Programmet vil automatisk lukkes om: + Følgende program vil bli installert: + Du kan velge å utsette installasjonen et begrenset antall ganger inntil fristen utløper: + Når fristen har utløpt kan du ikke lenger utsette installasjonen. + Gjenstående utsettelser: + Frist: + + The {0} will automatically continue in: + + + Installasjon + Avinstallasjon + Reparasjon + startet. + fullført. + ferdig. En omstart er nødvendig. + mislyktes. + ikke fullført. + Programvareinstallasjon pågår. Vennligst vent.. + ProgramvareAvinstallasjon pågår. Vennligst vent.. + ProgramvareReparasjon pågår. Vennligst vent.. + Start av dette programmet er midlertidig blokkert til programvareinstallasjon er ferdig. + Omstart Kreves + En omstart av pcen er nødvendig for å fullføre installasjonen. + Lagre arbeidet ditt og gjør en omstart av pc innen fristen. + Pcen vil automatisk starte på nytt, når nedtellingen er slutt. + Tid som gjenstår: + Minimere + Omstart Nå + + + + + Er is onvoldoende schijfruimte voor de installatie van: + {0} + + Ruimte nodig: {1}MB + Ruimte beschikbaar: {2}MB + + Gelieve voldoende schijfruimte vrij te maken om de installatie te starten. + Doorgaan + Selecteer alleen 'Doorgaan' na het sluiten van de bovenstaande toepassing(en). + Sluit Applicaties + Uitstel + De volgende applicaties moeten afgesloten worden om de installatie te voltooien. + + Sla je werk op, sluit de applicaties, en ga verder. + Of, sla je werk op en klik op 'Sluit Applicaties'. + LET OP: De applicatie(s) worden afgesloten over: + De volgende applicatie wordt zometeen geïnstalleerd: + Je kan de installatie uitstellen tot de maximale uitsteltermijn is verstreken: + Na verstrijken van de uitsteltermijn is deze optie niet langer beschikbaar. + Aantal keer uitstellen: + Deadline: + + De {0} gaat automatisch door over: + + + Installatie + Verwijderen + Reparatie + gestart + voltooid + voltooid. Een herstart is nodig + gefaald + onvolledig + Installatie bezig. Even geduld... + Verwijderen bezig. Even geduld... + Reparatie bezig. Even geduld... + Het opstarten van deze applicatie werd tijdelijk geblokkeerd om een installatie uit te voeren. + Herstart nodig + Om de installatie te voltooien is een herstart nodig. + Gelieve je werk op te slaan en binnen de toegestane termijn de computer herstarten + De computer zal herstarten als de teller op nul staat + Resterende tijd: + Minimaliseren + Herstart Nu + + + + + Brak miejsca na dysku: + {0} + + Potrzeba: {1}MB + Obecnie wolnego miejsca: {2}MB + + Proszę zwiększyć ilość miejsca usuwając zbędne pliki. + Kontynuuj + Tylko wybrać „Kontynuuj” po zamknięciu wyżej wymienione aplikacje. + Zamknij Programy + Odłóż + Następujące programy muszą zostać zamknięte przed rozpoczęciem instalacji. + + Proszę zapisać wszystkie dokumenty i zamknąć programy, a następnie kliknąć przycisk „Kontynuuj”. + Alternatywnie zapisz wszystkie dokumenty i kliknij przycisk „Zamknij Programy”. + UWAGA: Programy zostaną automatycznie zamknięte za: + Zostanie zainstalowana następująca aplikacja: + Instalacja może zostać przełożona na późniejszy termin. + Jeżeli zostanie przekroczona możliwa ilość przełożeń, opcja „Odłóż” będzie niedostępna. + Pozostała ilość przełożeń instalacji: + Ostateczny termin instalacji: + + The {0} will automatically continue in: + + + Instalacja + Deinstalacja + Naprawa + rozpoczęta. + zakończona. + zakończona. Wymagany jest restart komputera. + nie powiodła się. + nieukończona. + Trwa instalacja. Proszę czekać... + Trwa deinstalacja. Proszę czekać... + Trwa naprawa. Proszę czekać... + Uruchomienie tej aplikacji zostało zablokowane na okres instalacji. + Wymagany Restart + Aby instalacja została poprawnie ukończona wymagany jest restart komputera. + Proszę zapisać wszystkie dokumenty i zrestartować komputer w wyznaczonym czasie. + Komputer zostanie automatycznie zrestartowany po upływie wyznaczonego czasu. + Pozostały czas do restartu automatycznego: + Zminimalizować + Restartuj Teraz + + + + + Você não tem espaço em disco suficiente para concluir a instalação de: + {0} + + Espaço necessário: {1}MB + Espaço disponível: {2}MB + + Por favor, espaço livre em disco suficiente, a fim de prosseguir com a instalação. + Continuar + Selecione "Continuar" somente após fechar a(s) aplicação(ões) listada(s) abaixo. + Fechar Programas + Adiar + Programas de seguir devem ser fechados antes que a instalação possa prosseguir. + + Por favor, guarde o seu trabalho, feche os programas e em seguida continuar. + Como alternativa, salve seu trabalho e clique em "Fechar Programas". + NOTA: O programa será fechado automaticamente em: + O seguinte aplicativo está prestes a ser instalado: + Você pode optar por adiar a instalação até que expire o diferimento: + Uma vez que o diferimento expirou, você já não terá a opção de adiar a. + Restantes diferimentos: + Prazo: + + The {0} will automatically continue in: + + + Instalação + Desinstalação + Reparação + começou a. + completo. + completa. Uma reinicialização é necessária. + falhou. + não completar. + Instalação em andamento. Por favor aguarde... + Desinstalação em andamento. Por favor aguarde... + Reparação em andamento. Por favor aguarde... + Lançar este aplicativo está temporariamente bloqueado para que possa concluir uma operação de instalação. + Reinicialização Necessária + Em ordem para completar a instalação, você deve reiniciar seu computador. + Por favor, salve o trabalho e reiniciar no tempo alocado. + Seu computador será reiniciado automaticamente no final da contagem regressiva. + Tempo restante: + Minimizar + Reinicie Agora + + + + + Você não tem espaço em disco suficiente para concluir a instalação de: + {0} + + Espaço necessário: {1}MB + Espaço disponível: {2}MB + + Libere espaço em disco suficiente para prosseguir com a instalação. + Continuar + Apenas selecione "Continuar" depois de fechar aplicativo(s) acima. + Fechar Programas + Adiar + Os seguintes programas precisam ser fechados antes que a instalação possa prosseguir. + + Salve seu trabalho, feche os programas e depois continue. + Como alternativa, salve seu trabalho e clique em "Fechar Programas". + OBSERVAÇÃO: O(s) programa(s) será(ão) automaticamente fechado(s) em: + O seguinte aplicativo está prestes a ser instalado: + Você pode optar por adiar a instalação até que o adiamento expire: + Depois que o adiamento expirar, você não terá mais a opção de adiar. + Adiamentos Restantes: + Prazo: + + The {0} will automatically continue in: + + + Instalação + Desinstalação + Reparação + iniciada. + concluída. + concluída. É necessário reiniciar. + falhou. + não concluída. + Instalação em andamento. Aguarde... + Desinstalação em andamento. Aguarde... + Reparação em andamento. Aguarde... + A execução deste aplicativo foi temporariamente bloqueada para que uma operação de instalação seja concluída. + Reinicialização Necessária + Para que a instalação seja concluída, é necessário reiniciar o computador. + Salve seu trabalho e reinicie dentro do prazo estipulado. + Seu computador será reiniciado automaticamente no final da contagem regressiva. + Tempo restante: + Minimizar + Reiniciar Agora + + + + + Usted no tiene suficiente espacio en disco para completar la instalación de: + {0} + + Espacio requerido: {1}MB + Espacio disponible: {2}MB + + Por favor, espacio en disco libre suficiente para proceder con la instalación. + Continuar + Seleccione "Continuar" después de cerrar la(s) aplicacion(es) de la lista arriba. + Cerrar Programas + Aplazar + Los siguientes programas deben cerrarse antes de la instalación puede proceder. + + Por favor, guarde el trabajo, cerrar los programas y luego continuar. + Alternativamente, guarde su trabajo y haga clic en "Cerrar Programas". + NOTA: El programa se cerrará automáticamente en: + La siguiente aplicación está a punto de instalarse: + Puede decidir aplazar la instalación hasta que expire el aplazamiento: + Una vez vencido el aplazamiento, ya no tendrá la opción de aplazar. + Restante aplazamientos: + Plazo: + + The {0} will automatically continue in: + + + Instalación + Desinstalación + Reparación + comenzó a. + completa. + completa. Se requiere un reinicio. + failed. + no. + Instalación en curso. Por favor, espere... + Desinstalación en curso. Por favor, espere... + Reparación en curso. Por favor, espere... + Lanzar esta aplicación ha sido bloqueado temporalmente para que pueda completar una operación de instalación. + Reiniciar Requerido + En orden para completar la instalación, debe reiniciar su computadora. + Por favor guarde su trabajo y reinicie dentro del tiempo asignado. + El ordenador se reiniciará automáticamente al final de la cuenta regresiva de. + Tiempo restante: + Minimizar + Reiniciar Ahora + + + + + Du har inte tillräckligt med ledigt diskutrymme för att kunna installera: + {0} + + Diskutrymme som krävs: {1}MB + Ledigt diskutrymme: {2}MB + + Frigör utrymme på hårddisken och försök igen. + Fortsätt + Välj "Fortsätt" endast efter att ha stängt applikation(er) i ovanstående lista. + Stäng Program + Skjut upp + Följande program måste stängas innan installationen kan fortsätta. + + Se till att spara ditt arbete, stäng de öppna programmen och klicka sen på "Fortsätt". + Alternativt, spara ditt arbete och klicka på "Stäng Program". + OBS: Programmen kommer automatiskt att avslutas om: + Följande applikation kommer att installeras: + Du kan välja att fördröja installationen ett begränsat antal gånger under en begränsad tid: + När antalet fördröjningar är slut eller deadlinen inträffar är detta alternativ inte längre tillgängligt. + Antal återstående fördröjningar: + Deadline: + + The {0} will automatically continue in: + + + Installation + Avinstallation + Reparation + startad. + slutförd. + slutförd. En omstart av datorn är nödvändig. + misslyckades. + ej slutförd. + Installation pågår. Var god vänta... + Avinstallation pågår. Var god vänta... + Reparation pågår. Var god vänta... + Den här applikationen har temporärt blockerats så att installationen kan slutföras. + Omstart Krävs + För att installationen ska kunna slutföras måste din dator startas om. + Se till att spara ditt arbete innan tiden går ut och en automatisk omstart sker. + Din dator kommer automatiskt att starta om när nedräkningen är slut. + Återstående tid: + Minimera + Starta Om Nu + + + + + ليس لديك مساحة كافية في القرص لإتمام عملية تثبيت: + {0} + + المساحة اللازمة: {1} م ب + المساحة المتاحة: {2} م ب + + يرجى تحرير مساحة قرص كافية كي تتم متابعة عملية التثبيت. + متابعة + قم باختيار "متابعة" فقط بعد إغلاق التطبيق/التطبيقات المدرجة أعلاه. + إغلاق البرامج + تأجيل + يجب إغلاق البرامج التالية قبل التمكن من متابعة عملية التثبيت. + + يرجى حفظ عملك، وإغلاق البرامج، ومن ثم المتابعة. + يمكنك بدلا من ذلك، حفظ عملك والنقر فوق "إغلاق البرامج". + ملاحظة: سيتم إغلاق البرنامج/البرامج بشكل تلقائي خلال: + التطبيق التالي على وشك التثبيت: + بإمكانك اختيار تأجيل التثبيت إلى حين انتهاء صلاحية التأجيل: + بمجرد انتهاء صلاحية التأجيل، لن يكون لديك خيار التأجيل بعد الآن. + التأجيلات المتبقية: + الموعد النهائي: + + The {0} will automatically continue in: + + + تثبيت + إزالة التثبيت + إصلاح + بدأ. + تم. + تم. يجب إعادة تشغيل النظام. + فشل. + غير مكتمل. + جاري التثبيت. يرجى الانتظار... + جارٍ إزالة التثبيت. يرجى الانتظار... + جارٍ إصلاح. يرجى الانتظار... + تم تعطيل تشغيل هذا التطبيق مؤقتًا بحيث يمكن إكمال عملية التثبيت. + مطلوب إعادة التشغيل + كي تكتمل عملية التثبيت، يجب عليك إعادة تشغيل حاسوبك. + يرجى حفظ عملك وإعادة التشغيل خلال الوقت المخصص. + ستتم إعادة تشغيل حاسوبك بشكل تلقائي عند نهاية العد التنازلي. + الزمن المتبقي: + تقليل + إعادة التشغيل الآن + + + + + :אין לך מספיק מקום בכונן כדי להשלים את ההתקנה של: + {0} + + מקום נדרש: {1}מ"ב + מקום זמין: {2}מ"ב + + אנא שחרר מספיק מקום בכונן כדי להתחיל בהתקנה. + המשך + בחר "המשך" רק לאחר שסגרת את היישום(ים) הרשומים לעיל. + סגור תכניות + דחה + יש לסגור את התכנות הבאות בטרם ההתקנה תוכל להתחיל. + + אנא שמור על העבודה שלך, סגור את התכניות, ואז המשך. + לחילופין, שמור על העבודה שלך והקלק על "סגור תכניות". + שים לב: התכנית(ות) תסגרנה באופן אוטומטי תוך: + היישום הבא עומד להיות מותקן: + אתה יכול לבחור לדחות את ההתקנה עד שמשך זמן הדחיה יפוג. + לאחר שמשך זמן הדחיה יפוג, לא תהיה לך עוד אפשרות לדחות. + מספר הדחיות שנותרו: + תאריך יעד: + + The {0} will automatically continue in: + + + התקנה + הסרה + תיקון + התחילה. + הושלמה. + הושלמה. נדרש אתחול המחשב. + נכשלה. + לא הושלמה. + מבצע התקנה. נא להמתין. + מבצע הסרה. נא להמתין. + מבצע תיקון. נא להמתין. + הרצת היישום הזה נחסמה זמנית כדי שפעולת התקנה תוכל להסתיים. + נדרש אתחול המחשב + כדי להשלים את ההתקנה, עליך לאתחל את המחשב שלך מחדש. + אנא שמור על העבודה שלך ואתחל במסגרת הזמן המוקצב. + המחשב שלך יאותחל באופן אוטומטי בסיום הספירה לאחור. + הזמן הנותר: + מזער את + אתחל עכשיו + + + + + 다음의 설치 완료를 위해 필요한 디스크 공간이 충분하지 않습니다: + {0} + + 필요한 공간: {1}MB + 사용 가능한 공간: {2}MB + + 설치를 계속하려면 디스크 공간을 충분하게 확보하세요. + 계속 + 위에 표시된 응용 프로그램을 종료한 후에만 "계속"을 선택하세요. + 프로그램 종료 + 연기 + 설치를 계속하려면 다음의 프로그램을 종료해야 합니다. + + 사용자 작업을 저장하고 프로그램을 종료한 후 계속하세요. + 다른 방법으로는 사용자 작업을 저장하고 "프로그램 종료"를 클릭하세요. + 참고: 프로그램이 자동으로 종료되는 경우: + 다음의 응용 프로그램을 설치합니다: + 지연 기간이 만료될 때까지 설치를 연기할 수 있습니다: + 일단 지연 기간이 만료되면 더 이상 연기할 수 있는 옵션은 없습니다. + 남은 지연 기간: + 마감: + + The {0} will automatically continue in: + + + 설치 + 제거 + 수리 + 시작되었습니다. + 완료되었습니다. + 완료되었습니다. 재부팅이 필요합니다. + 실패했습니다. + 완료되지 않았습니다. + 설치 중입니다. 기다리세요... + 제거 중입니다. 기다리세요... + 수리 중입니다. 기다리세요... + 설치 작업을 완료할 수 있도록 응용 프로그램의 시작을 잠시 차단했습니다. + 다시 시작해야 합니다 + 설치를 완료하려면 컴퓨터를 다시 시작해야 합니다. + 사용자 작업을 저장하고 지정된 시간 이내에 다시 시작하세요. + 카운트다운이 종료되면 컴퓨터는 자동으로 다시 시작합니다. + 남은 시간: + 최소화 + 지금 다시 시작 + + + + + У вас недостаточно пространства на диске для выполнения установки: + {0} + + Необходимое пространство на диске: {1}МБ + Доступное пространство на диске: {2}МБ + + Для продолжения установки, пожалуйста, освободите достаточно пространства на диске. + Продолжить + Выберите "Продолжить" только после закрытия вышеперечисленных приложений. + Закрыть программы + Отложить + Перед продолжением установки необходимо закрыть следующие программы. + + Пожалуйста, сохраните вашу работу и закройте программы, а затем продолжите установку. + Также вы можете сохранить вашу работу и нажать "Закрыть программы". + ПРИМЕЧАНИЕ: Эти программы будут автоматически закрыты через: + Планируется установка следующего приложения: + Вы можете отложить установку приложения до тех пор, пока не истечет срок действия этой отсрочки: + После истечения срока действия отсрочки вы больше не сможете отложить установку. + Оставшиеся отсрочки: + Дата истечения: + + {0} начнется автоматически через: + + + Установка + Удаление + Восстановление + начата(о). + выполнена(о). + выполнена(о). Требуется перезагрузка. + не выполнена(о). + не завершена(о). + Идет установка. Пожалуйста, подождите... + Идет удаление. Пожалуйста, подождите... + Идет ремонт. Пожалуйста, подождите... + Запуск этого приложения временно заблокирован для завершения процесса установки. + Требуется перезагрузка + Для завершения установки необходимо перезагрузить ваш компьютер. + Пожалуйста, сохраните вашу работу и выполните перезагрузку в отведенное время. + Ваш компьютер будет автоматически перезагружен по завершению обратного отсчета. + Оставшееся время: + Минимизировать + Перезагрузить сейчас + + + + + 没有足够的磁盘空间来完成下列安装: + {0} + + 所需空间:{1}MB + 可用空间:{2}MB + + 请释放足够的磁盘空间以继续安装。 + 继续 + 在关闭上列应用程式后才选择"继续"。 + 关闭程序 + 延迟 + 为继续安装,必须关闭下列程序。 + + 请保存您的工作,关闭程序,然后继续。 + 或者保存您的工作,点击"关闭程序"。 + 注:下列程序将自动关闭: + 即将安装下列应用程式: + 在延期失效前,可选择延迟安装: + 延期失效后,再也无法延迟安装。 + 所剩延期: + 最后期限: + + The {0} will automatically continue in: + + + 安装 + 卸载 + 修复 + 已启动。 + 完成。 + 完成。必须重新启动。 + 失败。 + 未完成。 + 安装中。请稍等。。。 + 卸载中。请稍等。。。 + 修复中。请稍等。。。 + 为完成安装过程,暂时禁止启动这款应用程式。 + 需重启 + 为完成安装过程,需重启计算机。 + 请保存您的工作,并在容许时间重启计算机。 + 倒计时结束后,计算机将自动重启。 + 剩余时间: + 最小化 + 现在重启 + + + + + 沒有足夠的磁盤空間來完成下列安裝: + {0} + + 所需空間: {1}MB + 可用空間: {2}MB + + 請釋放足夠的磁盤空間以繼續安裝。 + 繼續 + 關閉上列應用程式後才選擇"繼續"。 + 關閉程序 + 延遲 + 在繼續安裝前必須關閉下列程序。 + + 請保存您的工作,關閉程序,然後繼續。 + 或者保存您的工作,然後點擊"關閉程序"。 + 注:下列程序將自動關閉: + 即將安裝下列應用程式: + 在延期失效前,可選擇延遲安裝: + 延期失效後,再也無法延遲安裝。 + 所剩延期: + 最後期限: + + The {0} will automatically continue in: + + + 安裝 + 卸載 + 修復 + 已啟動。 + 完成。 + 完成。需重啟。 + 失敗。 + 未完成。 + 安裝中。請稍等。。。 + 卸載中。請稍等。。。 + 修復中。請稍等。。。 + 為完成安裝過程,暫時禁止啟動本款應用程式。 + 需重啟 + 未完成安裝過程,需重啟計算機。 + 請保存您的工作,然後在容許時間重啟計算機。 + 倒計時結束後,計算機將自動重啟。 + 剩餘時間: + 最小化 + 現在重啟 + + + + + Nemáte dostatok voľného miesta na dokončenie inštalácie: + {0} + + Potrebné miesto: {1}MB + Voľné miesto: {2}MB + + Prosím, uvoľnite dostatok miesta pre pokračovanie inštalácie. + Pokračovať + Kliknite na "Pokračovať", keď zavriete vyššie uvedené aplikácie. + Ukončiť programy + Oddialiť + Nasledujúce programy musia byť zatvorené, než bude inštalácia pokračovať. + + Prosím, uložte svoju prácu, zatvorte dané programy a potom kliknite na pokračovať. + Prípadne môžete uložiť svoju prácu a potom kliknite na tlačidlo "Ukončiť programy". + Poznámka: Programy budú automaticky ukončené za: + Nasledujúca aplikácia bude nainštalovaná: + Inštaláciu môžete niekoľkokrát odložiť: + Akonáhle odklady uplynú, už nebudete mať možnosť odložiť inštaláciu. + Zostávajúce odklady: + Termín: + + {0} bude automaticky pokračovať za: + + + Inštalácia + Odinštalácia + Oprava + spustená. + ukončená. + ukončená. Je nutný reštart. + sa nepodarila. + nedokončená. + Inštalácia sa vykonáva. Prosím čakajte... + Prebieha odinštalácia. Prosím čakajte... + Vykonáva sa oprava. Prosím čakajte... + Spustenie tejto aplikácie bolo dočasne zablokované, aby mohla byť inštalácia dokončená úspešne. + Je nutný reštart. + Na dokončenie inštalácie musíte váš počítač reštartovať. + Prosím, uložte si prácu a reštartujte počítač v stanovenej lehote. + Na konci odpočítavania, bude váš počítač automaticky reštartovaný. + Zostávajúci čas: + Minimalizovať + Reštartovať Teraz + + + + + Nemáte dostatek volného místa na instalaci aplikace: + {0} + + Potřebné místo na disku: {1}MB + Dostupné místo na disku: {2}MB + + Uvolněte prosím dostatek místa k pokračovaní instalace. + Pokračovat + Klikněte na "Pokračovat", až budete mít výše uvedené aplikace zavřené. + Ukončit programy + Odložit + Následující programy musí být zavřené, aby instalace mohla pokračovat. + + Prosím, uložte svou práci, zavřete program a potom klikněte na "Pokračovat". + Případně můžete svou práci uložit a kliknout na tlačítko "Ukončit programy". + Upozornění: Programy budou automaticky zavřené za: + Nasledující aplikace bude nainstalována: + Instalaci můžete několikrát odložit: + Jakmile vyčerpáte všechna odložení, už nebudete mít šanci odložit instalaci. + Zbývající počet odložení: + Termín: + + {0} bude automaticky pokračovat za: + + + Instalace + Odinstalace + Oprava + zahájena. + dokončena. + dokončena. Je nutné restartovat počítač. + se nepodařila. + nedokončena. + Instalace právě probíhá. Prosím čekejte... + Probíhá odinstalace. Prosím čekejte... + Oprava právě probíhá. Prosím čekejte... + Spuštění této aplikace bylo dočasně zakázáno, aby mohla proběhnout instalace. + Je nutné restartovat počítač. + Pro dokončení instalace musíte váš počítač restartovat. + Prosím, uložte si práci a restartujte počítač ve stanoveném čase. + Na konci odpočítávání, bude váš počítač automaticky restartovaný. + Zbývající čas: + Minimalizovat + Restartovat nyní + + + + + Nincs elég lemezterület a telepítés végrehajtásához: + {0} + Szükséges lemezterület: {1}MB + Szabad lemezterület: {2}MB + Kérem szabadítson fel elegendő lemezterületet a telepítés végrehajtásához. + Tovább + Csak azután kattintson a „Tovább”-ra, ha a fentebb látható alkalmazás(oka)t bezárta. + Alkalmazások bezárása + Elhalaszt + Az alábbi programokat szíveskedjen bezárni, mielőtt a telepítés elkezdődik. + + Kérjük mentse munkáját és a folytatáshoz zárja be a futó alkalmazásokat. + Vagy + Kérjük mentse munkáját és kattintson a „Programok bezárása”-ra. + Megjegyzés: a programok automatikusan bezárásra kerülnek,: + A következő alkalmazások telepítésre kerülnek: + A telepítést elhalaszthatja amíg a rendelkezésre álló idő lejár: + Amennyiben a rendelkezésre álló idő letelik, nem lesz lehetősége a telepítés elhalasztására. + Fennmaradó halasztás: + Időpont: + + A(z) {0} automatikusan folytatódik: + + + Telepítés + Eltávolítás + Javítás + elindult. + elkészült. + elkészült.Újraindítás szükséges. + sikertelen. + nem lehet befejezni. + Telepítés folyamatban. Kérem várjon... + Eltávolítás folyamatban. Kérem várjon... + Javítás folyamatban. Kérem várjon... + A következő alkalmazások blokkolva lesznek, annak érdekében hogy a telepítés problémamentesen végrehajtódjon. + Újraindítás szükséges + A telepítés befejezéséhez a számítógépet újraindítása szükséges. + Kérem mentse munkáját, és a megadott időn belül indítsa újra.. + A hátralévő idő leteltével a számítógép újraindul. + Hátralévő idő: + Minimalizál + Újraindítás most + + + + + + Kiintolevyllä ei ole riittävästi tilaa asennusta varten: + {0} + + Vaadittu levytila: {1}MB + Levytilaa käytettävissä: {2}MB + + Vapauta levytilaa, jotta asennus voi jatkua. + Jatka + + Valitse jatka, kun olet sulkenut ohjelmat. + + Sulje ohjelmat + + Myöhemmin + + Seuraavat ohjelmat on suljettava ennen asennusta + + Tallenna työsi ja jatka. + Vaihtoehtoisesti voit tallentaa työsi ja valita "Sulje ohjelmat". + + + HUOMIO: Ohjelma(t) suljetaan automaattisesti: + + Ohjelma joka asennetaan seuraavaksi: + + Voit siirtää asennusta myöhemmäksi: + + Tietyn ajan kuluessa et voi enää siirtää asennusta myöhemmäksi. + + Jäljellä olevia siirtoja myöhempään ajankohtaan: + + Määräaika: + + + {0} jatkaa automaattisesti: + + + + + Asennus + + Ohjelmiston poisto + + + + alkoi. + + valmis. + + valmis. Tietokone on käynnistettävä uudelleen. + + epäonnistui. + + ei ole valmis. + + + Asentaa. Odota... + + Ohjelmistoa poistetaan. Odota... + + Ohjelmiston käynnistäminen on tilapäisesti estetty, jotta ohjelmisto voi onnistuneesti asentua. + + Tietokone on käynnistettävä uudelleen + + Tietokone on käynnistettävä uudelleen, ennen kuin ohjelmiston asennus on valmis. + Tallenna työsi ja käynnistä tietokone uudelleen aikarajan sisällä. + Tietokone käynnistyy uudelleen, kun laskuri on saavuttanut nollan. + + Aikaa jäljellä: + Käynnistä uudelleen myöhemmin + Käynnistä uudelleen heti + + + + diff --git a/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitExtensions.ps1 b/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitExtensions.ps1 new file mode 100644 index 0000000..7dc5a5a --- /dev/null +++ b/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitExtensions.ps1 @@ -0,0 +1,81 @@ +<# +.SYNOPSIS + +PSAppDeployToolkit - Provides the ability to extend and customise the toolkit by adding your own functions that can be re-used. + +.DESCRIPTION + +This script is a template that allows you to extend the toolkit with your own custom functions. + +This script is dot-sourced by the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application. + +PSApppDeployToolkit is licensed under the GNU LGPLv3 License - (C) 2023 PSAppDeployToolkit Team (Sean Lillis, Dan Cunningham and Muhammad Mashwani). + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the +Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . + +.EXAMPLE + +powershell.exe -File .\AppDeployToolkitHelp.ps1 + +.INPUTS + +None + +You cannot pipe objects to this script. + +.OUTPUTS + +None + +This script does not generate any output. + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + + +[CmdletBinding()] +Param ( +) + +##*=============================================== +##* VARIABLE DECLARATION +##*=============================================== + +# Variables: Script +[string]$appDeployToolkitExtName = 'PSAppDeployToolkitExt' +[string]$appDeployExtScriptFriendlyName = 'App Deploy Toolkit Extensions' +[version]$appDeployExtScriptVersion = [version]'3.9.3' +[string]$appDeployExtScriptDate = '02/05/2023' +[hashtable]$appDeployExtScriptParameters = $PSBoundParameters + +##*=============================================== +##* FUNCTION LISTINGS +##*=============================================== + +# + +##*=============================================== +##* END FUNCTION LISTINGS +##*=============================================== + +##*=============================================== +##* SCRIPT BODY +##*=============================================== + +If ($scriptParentPath) { + Write-Log -Message "Script [$($MyInvocation.MyCommand.Definition)] dot-source invoked by [$(((Get-Variable -Name MyInvocation).Value).ScriptName)]" -Source $appDeployToolkitExtName +} +Else { + Write-Log -Message "Script [$($MyInvocation.MyCommand.Definition)] invoked directly" -Source $appDeployToolkitExtName +} + +##*=============================================== +##* END SCRIPT BODY +##*=============================================== diff --git a/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitHelp.ps1 b/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitHelp.ps1 new file mode 100644 index 0000000..9a2db86 --- /dev/null +++ b/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitHelp.ps1 @@ -0,0 +1,161 @@ +<# +.SYNOPSIS + +PSApppDeployToolkit - Displays a graphical console to browse the help for the App Deployment Toolkit functions. + +.DESCRIPTION + +Displays a graphical console to browse the help for the App Deployment Toolkit functions + +The script dot-sources the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application. + +PSApppDeployToolkit is licensed under the GNU LGPLv3 License - (C) 2023 PSAppDeployToolkit Team (Sean Lillis, Dan Cunningham and Muhammad Mashwani). + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the +Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . + +.EXAMPLE + +powershell.exe -File .\AppDeployToolkitHelp.ps1 + +.INPUTS + +None + +You cannot pipe objects to this script. + +.OUTPUTS + +None + +This script does not generate any output. + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + + +##*=============================================== +##* VARIABLE DECLARATION +##*=============================================== + +## Variables: Script +[string]$appDeployToolkitHelpName = 'PSAppDeployToolkitHelp' +[string]$appDeployHelpScriptFriendlyName = 'App Deploy Toolkit Help' +[version]$appDeployHelpScriptVersion = [version]'3.9.3' +[string]$appDeployHelpScriptDate = '02/05/2023' + +## Variables: Environment +[string]$scriptDirectory = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent +# Dot source the App Deploy Toolkit Functions +. "$scriptDirectory\AppDeployToolkitMain.ps1" -DisableLogging +. "$scriptDirectory\AppDeployToolkitExtensions.ps1" +##*=============================================== +##* END VARIABLE DECLARATION +##*=============================================== + +##*=============================================== +##* FUNCTION LISTINGS +##*=============================================== + +Function Show-HelpConsole { + ## Import the Assemblies + Add-Type -AssemblyName 'System.Windows.Forms' -ErrorAction 'Stop' + Add-Type -AssemblyName System.Drawing -ErrorAction 'Stop' + + ## Get the default font to use in the user interface + [System.Drawing.Font]$defaultFont = [System.Drawing.SystemFonts]::DefaultFont + + ## Form Objects + $HelpForm = New-Object -TypeName 'System.Windows.Forms.Form' + $HelpListBox = New-Object -TypeName 'System.Windows.Forms.ListBox' + $HelpTextBox = New-Object -TypeName 'System.Windows.Forms.RichTextBox' + $InitialFormWindowState = New-Object -TypeName 'System.Windows.Forms.FormWindowState' + + ## Form Code + $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' + $System_Drawing_Size.Height = 665 + $System_Drawing_Size.Width = 957 + $HelpForm.ClientSize = $System_Drawing_Size + $HelpForm.DataBindings.DefaultDataSourceUpdateMode = 0 + $HelpForm.Name = 'HelpForm' + $HelpForm.Text = 'PowerShell App Deployment Toolkit Help Console' + $HelpForm.WindowState = 'Normal' + $HelpForm.ShowInTaskbar = $true + $HelpForm.FormBorderStyle = 'Fixed3D' + $HelpForm.MaximizeBox = $false + $HelpForm.AutoSize = $true + $HelpForm.AutoScaleMode = 'Font' + $HelpForm.AutoScaleDimensions = New-Object System.Drawing.SizeF(6, 13) #Set as if using 96 DPI + $HelpForm.Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList $AppDeployLogoIcon + $HelpListBox.Anchor = 7 + $HelpListBox.BorderStyle = 1 + $HelpListBox.DataBindings.DefaultDataSourceUpdateMode = 0 + $HelpListBox.Font = "$($defaultFont.Name), $($defaultFont.Size + 1), style=Regular" + $HelpListBox.FormattingEnabled = $true + $HelpListBox.ItemHeight = 16 + $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' + $System_Drawing_Point.X = 0 + $System_Drawing_Point.Y = 0 + $HelpListBox.Location = $System_Drawing_Point + $HelpListBox.Name = 'HelpListBox' + $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' + $System_Drawing_Size.Height = 658 + $System_Drawing_Size.Width = 271 + $HelpListBox.Size = $System_Drawing_Size + $HelpListBox.Sorted = $true + $HelpListBox.TabIndex = 2 + $HelpListBox.add_SelectedIndexChanged({ $HelpTextBox.Text = Get-Help -Name $HelpListBox.SelectedItem -Full | Out-String }) + $helpFunctions = Get-Command -CommandType 'Function' | Where-Object { ($_.HelpUri -match 'psappdeploytoolkit') -and ($_.Definition -notmatch 'internal script function') } | Select-Object -ExpandProperty Name + $null = $HelpListBox.Items.AddRange($helpFunctions) + $HelpForm.Controls.Add($HelpListBox) + $HelpTextBox.Anchor = 11 + $HelpTextBox.BorderStyle = 1 + $HelpTextBox.DataBindings.DefaultDataSourceUpdateMode = 0 + $HelpTextBox.Font = "$($defaultFont.Name), $($defaultFont.Size), style=Regular" + $HelpTextBox.ForeColor = [System.Drawing.Color]::FromArgb(255, 0, 0, 0) + $System_Drawing_Point = New-Object -TypeName System.Drawing.Point + $System_Drawing_Point.X = 277 + $System_Drawing_Point.Y = 0 + $HelpTextBox.Location = $System_Drawing_Point + $HelpTextBox.Name = 'HelpTextBox' + $HelpTextBox.ReadOnly = $True + $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' + $System_Drawing_Size.Height = 658 + $System_Drawing_Size.Width = 680 + $HelpTextBox.Size = $System_Drawing_Size + $HelpTextBox.TabIndex = 1 + $HelpTextBox.Text = '' + $HelpForm.Controls.Add($HelpTextBox) + + ## Save the initial state of the form + $InitialFormWindowState = $HelpForm.WindowState + ## Init the OnLoad event to correct the initial state of the form + $HelpForm.add_Load($OnLoadForm_StateCorrection) + ## Show the Form + $null = $HelpForm.ShowDialog() +} + +##*=============================================== +##* END FUNCTION LISTINGS +##*=============================================== + +##*=============================================== +##* SCRIPT BODY +##*=============================================== + +Write-Log -Message "Load [$appDeployHelpScriptFriendlyName] console..." -Source $appDeployToolkitHelpName + +## Show the help console +Show-HelpConsole + +Write-Log -Message "[$appDeployHelpScriptFriendlyName] console closed." -Source $appDeployToolkitHelpName + +##*=============================================== +##* END SCRIPT BODY +##*=============================================== diff --git a/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitLogo.ico b/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitLogo.ico new file mode 100644 index 0000000000000000000000000000000000000000..21eed7237a458586591dd7576587c27c204ee858 GIT binary patch literal 7358 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 literal 0 HcmV?d00001 diff --git a/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitLogo.png b/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..0d4f426ca80fe46262f41c71711a716e06f90217 GIT binary patch literal 606823 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
TU1rTVA<60A2 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 z

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 z%0D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
    -&pgT&!++@(TKW&>P+b<9DXJ0ggeGVO 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�wu3G!b`7U8-)QIVSu z`OSFduN8iB-(v_8vP*XM{{4QGi%Un~JIg^{o~>%8@3Wxb!x(&|b5v?CTO+$5z2_~A z2L6%Chvul6u}#(u^4uI{+%*((amkYa@or+F_b|blYe0dhkhE6y+uCRXvJ$LPd7TEU zHiYL`MK~9Eq3PR~0-rx!N$tb&`n+%Uxs>AS^Y@UMiZb6lU|Z{HREounn0{L|AXaSy zyqZTeqLZ8z=Dfd}Yo2DkL)0_!>|sqqi3PLC%VZ$qhqBZ+3@>&~R}iU1~ZNE5ot zHm>O-v!KA%i=G`5xtX0Wq&;;nTovt!I=_zgP;AC9DK;M7m!Wm@Xy}k6F?S@dd8wKO zy!e5hAh%TvhTlu!mhDxgV)YKQ5R;!U!H;=N7k23HxNOAY0Fy+!Ya#VNQQwyaMXPCw zKQ@DkopnOM&9kxh;}86WNuNGr>rDv!8o2nN`?cg7XWf`yi!u0c=~?ZyIbnFk0l&2l zfC1pB1(;R0Qx2|c5Vn;!acax&b9+=ITeUuCU|Jaz2`b;!8<}6&|Lej`1kesccA!tO z|CQbi^r>9dTsJJb)%rU-e|nql4nC!|(@xR_=54FWi313`A(~Z7hJrRI8wijg9Ctlw zbJ12t1+BVHuOhf3cnEe5owf&QWMWoax)~d=2>g1%6_;c2!uBVbz0pe`+AQeO8u?(q zN$D~Mhdnfm;*e6y%zl^EL2)OIlsc@0RX`JzB?vIHQ~4pP_RN{sn9QO7uea>c8LBCF1L}0ABBtyI7YwCbx2;!j(}%jfAliB;&PF>e3XnVsVPo`nAby(= zhT9K`h{Wyd-^i&6o2n@~vEOG?W6~#468~WNocH0Nn3qm?Lp-}P%P8Nd+Ms&)ceN)^ z6E9*PHN;EG4wc)YJTl0Z)Rfr)A~gM>YX@gX=rFH?4{62r*ML3ro0QI?F^ zW=<|Gqbh93fj^EQ)8p`D1;>C@s(ycmT-!G#u0f7Oa+*ZiRL98C?W8aENL`ZryOllW zsx+5}$mfWlD+D;K%a)3G`u3Q<)ESXES9Pg)&qlVd|tw8S&S66SPU-g_7eY+?h%!M`wR-N6d5Z%K7n zsyqOG39ES8ThaXbhX3(sG=lMVr95@NQWe`Wu+Dpg5gI?Rb-GbRho~{3E0AC< z3A6sYd#J`0Qsa#-cp@fkyFB)thFHL&o~nX_;AZFah&{O5sVk54$6qx4B(1(vzbXV9vy-4i1iSpXJJ6omBcs1+S?!RgC6s(M1LVPc;{;P?cq{Vd79@}8cAs3@o zAs5rIQUuSguoik~GVZ#&?+BwRa|k#K;l;gA2lVM2fx##G6WLbL=L%n`I%CYMecPhv z9@DD|B6PIP67F;DsK3&gzY?;$!+CCG-jAe5C!P9x%ypr4Bc#BrK(|!RbP`X>&V>#h zXpW(NTaFylV~UCCJ#U(HaaAu}^Hk!e@m@8rl|-e<6;0H_KadK$_I^1fgiam_yyj7v zh%q`FDrO}+iZJMJb_xhGf2R05^Z~WiR*OD;U>wGrSFEo|2U%KK_%$o)wh$@%&Kdb= ztil=jS?ogX4+U?EbPhsIfs4VHr`*b#(-C9n;di!smDv(s-#65dJ-z|YegM?z6j2O+ zJ?JJvS|!`GY^ln!B?0jWe}`lJ)T8p(>50{!pyHn0- ztyb%G9CI@>^5?q0HXql4S<=9YAmDK~x140-P=o8ZPIAN8mhdYN(m9}X+)l(3cvIl2 z5O3>Kczr&g#>DRe?{?;n?5>4`?x;)h=ERT!3a(R*ets7HU1tEs*46X1otK}(ClF0w zy++OBO+wkUcm?!9Wz(DI@pvN}Gs3e|*@ub^#Lm_g8|0*rpe7Ry zf;zWVZQX&(m6!GOD3)}Q9`cjiGg)iZ5K+qU2B9M=u3q`A0|yjQeQ25m&t9c8Pz2#K zrmGVJ1)k@5@{Tc9sWcy}gbv9vBS0ui)XM1^H6FH?&b;`5<{lvSiq;m0RLU6~6^5uuo4+Q-kzL`p$ z9tm5NZ!Znm7=wzAG#JvxOq-9d>za@7+Iz=hQPpXIz=@0J0(c}|$X%x&e6V$aQgqW) z0s8x_7ckg`Zz%HPNdHh*1&EP-@Gpi~A2W^!0d8ay3(hA62vgDYIkh{-*h-{w7o#qq zHS7GJiu*j{3s4HRx48JyGq?fUam4@|<@*o?lJ&=Dx6MCPucJRI1TspheKUMJN6c`i zC_76jw?4;vUh629-Cy4xEx%2FlS5fYuPP$Q%sD|lIY5g2Fve+ll^I<(SGk$?p&Ua3 z$hu51*$=OsNv@#ERaS_8v3vQLzfs?Lk-lm`lW}=3W3VOU_^0v^@l|3g@{NltCX zb~o{(cuZZ6L?tH&%Kpxs8k9S24sBF+feT)-|wfo^IYtAaa;e`)h@h`0lH zvp+eS)Dcr>0|Zms^=4V0%bWE*2MhiAe|IrlNrX`Zp@_3zBLF!zhmpGS)qgJk;g`e8%c7nr6oHd2Sr-j$fqlu^_X%KcVOE`~oS{MC0L!i4W# z>&lkjUJ&TVS*Su>d9Uee;`@y(1 z^P$RI4AnmO<(4DI3R&#ut+QTF5k{9&1)Od4nAsJDov`JLAO1e5ukw<#uuSX&kA*!0Hb)pCICI}Vo2_03ME`)# zV*8I}8PRs>xfYeC&PrtD;syQB#PC(b-Ye1qfsGl4Rt05>PCV&-08P@5aBTG|(JUkT z_O6L)qAsWY1-S;u7(uD{TWlrP>HKyuqo!lk_VyotGTy5+9?`=(YgHz%f{P#8m(mJ> zPmzrd{H%9t9wq;%=_(s1dg68Th}K)@COt19*G@*hC2B!=>vbM7GsI%wm`>bKo}~mT zR+skiqrcSB0`9xt5mVNp=x9jdedV8-pG8HIXAYBI?tZI`fCw(+n^5b;I+Hno1f~xK zWNL>JHK8RzA^9)8qxM34JUR{(JzN##hXMwTh$r_Z*#k*BvLcvfUr3QfXq6aASkGv6 z!L)I36rmPPSkrrM-~SlqN{`9(4W!k8Z0w;acKX#?!rbiH>*_9ViG;m7bH6H^Avhf> z!eEgM@22jU;Vwdf*97j!m95G>l=(CsfH@<=ZIk@!#u0967yk%)bMF{Qz_v*ssvrxr zlsIVvv+LqU>I=Nj2)R$t5sSx58kjnHVSi|8waY zOs5Y%W|;}#Z*KL&vg<#|@n8^S#aC_H%5b0Yr!3S7kU1-fkvGO`$eoV{fm85p_L+dp zNV;ml>PzLt9QccO9t}<0kX+F-OJ>f*KigBO)~i*YJ0>?FUt<-VP>AQJGEmI$YTRUX+-?gur_9$Krf8Afww z3c|E+e=(#W&KrP2fivd05``wfCHgdm(^Ah{f5g3LZPRR(-gw&?+WMSgmA*);LL6S9 zB3zMBnGw1G4HMfot;;?dzS3cqpR1`}l~QL^80n@k*wg}RZ`+o2azu0ZJI#G;Q(ynB z38;bl!iwP4t35F`P(S&OEzcOc^pPNN5^y8{=qTngAnSzt?BYKaJ-~n7yzZ$8-S-7g z;!$FF@GTUCBZIF!%FeH=i1UnO=7KHxID<`egQ?9~MR2~+*daeu#Lcmt6-C>KH~Ba@ z{DX&Kq{Kn)+S?&iG!~v@(wQ`p3hMOG++hcVKD0fMERsM7FOG+&hf)eb6GDlVc-(U( zs7>{91|iUE7K&PcvOwqdA?Mn%{JVAo8edEmwk>OLwGB6NB0t85FCxB4@>niPV=OO) zfO%v4IM14*;shFF(z*dtY4(a}$iXw?Lb^_2R$4`qrv)EGl3MBdS;cy_fAu`>XXJH8 zTh-;Miltai<#1G|N?6(T&g%waD_ta%AO;gGHXJD{V2!xx&>7 z;@%+lUnw=(M{#Cv6Dr3Mc9hwbraABMaa8Og@4WXO7#tiUhuuTZ(63YBP%uB@`NRRR zaAbHN=9*TGrS))UPol)IlqwAoH|Sl!C+dShr)8H_x0zxU!ba}XhJGw@ToST@>T(x$pk+rtyY?%MTT43N$-J} zwD9yg?%cc`Q(g5H;tm3q&zqU~YKZvcGbgkzfC(xv>wNe zFW5ZlbuwaExl-31nM6@e_M}~ThZ3@SIXku@Y znY^FiC{n=6nYJ$k84~o)IMj~&wy$2evrGNpz00B5TbRl4QD|H?MAyj1R8|~H-;wLbk@&2jv3x5`lC7a4^WxPm zY-x{1J6(7+amx46ef}{XQ;ej38!cjK_vWIu*P2pcfsOCaVZg@rBU_rckE7&Xv=@Bl zb+P~&Ipjt?QBlvCzWDbscPx-g7xcmHtY+)2!;1?!5a?ivr+7Ho-Oc_9*Wm=Ro*H(N z$5YUXyLKJCcy5ZTj611&TX8X`d%F!!3jAzpYBKvQ1xwbu!4<_{h__LI9 z*u7@{;3K>U8F7K)<(T8Um7r)ve}IKE)`Zig@kaw&D%%QX9VlxQ^WosKeCNaD`Oyo&6r7LetOkn-cd9N-!1=9c`(nUwEZGYie34YvTL|wwHI(K<>^=%;) zOMm@6^aIZon@}dsGBb)MiBQDu6X(YkbMs#yy^X1jfc+%E0Oi0-flE9$P63cDLWXOL z1hp>#*+aOuic`sDVoSFGF5K+quJ{NXV+oFj4Nog% z2ndtEY*pk-5tXi{S?kX!sHE%)BXBBb1a1pQg;GUemxhtQf z&eq|qIHY02vQ@_{6mjzTfO_lJs3KAw%XbHe;X94%JoV`6NuX`c4`75=}$%@@yq z%|29I^WGm#>67z!_R)Fyx-7HV$zIbyvFFwHp2Mf0^cQqpk)JNl3T?C|ncUxh;kdi< zT2l^%udoR*=j@U7)Ig7d1hFw}kCEzMi3K$_OTxc1Hrg=QY;*KPMr zw?BJ-xzNoE9Uas$p~P3=8XP%y7~W%<-nze&6}jzT7^$0+N3tPAY#}CM8#)jsg<}2! zP|S9JM9t|EM3v-p>mMi0K|XfH#|AGxvhsI6G>v71AeA91VRiADbgCUZdL1UD>--bX z?pZ(fc8(d1Jf`uuRF<^~KoX^P2B=olH8A{><9Mc;gGe;?&dQ~wH48oz>)KWwm6mcG zvPu|s9q2KwVzTl6w7~AJSFR8VCL%H+YooSBe}wz62J3r-WH?QS#xJ0o@D0m+Uz^w+ zNO}sYW&4EaE5ky4=11hD8Yr%|sHkpFebuMIA)D6YX#W~PiuPz;;%RQW$9bZjD7Vu2 z(6^xo>s%;FmK|jEpMiQRZZU`QCE{;9wgim+>afU6hTyr6{}FwO=KQyg3s?JgVzw9W zw*$X>k>mS{`M8RZXuL&8w_uM6#QTKvG(v=&FvB+ZQyu_uW~V&P_$(}#4djwT{;6rZ!oUp~1gl#X3u1KdyO}Z`|JMNX*Tzz=6M3-vNUi4l zg0GtklT*#zr()xZsWS+{^AAOy#m*j;gp^;kU3CWK5RQ`?mLX}6p>@ub)ee7Z;>C+oA^qMU#IgIpBjaUoJ#i81iD93)R)-7GhYr$n zJ-$x#DA#%OUkJlBn+eg-SJT57nec5kBHS0GtC0#+lJj5I?Z?6H%I;KDMr2`ggF<$8 zrIMY5249n6sSVKvdI1JG=ATeyX~e=@loxBk`UbADr}#$OW2DNLwO~k{O>r|`UbC>m z$wq)ac{|uC4(pg4^OP9k?q{v}3)zl}K#NYI=uX1>8Z=0R?vs?8EmkLL{&p#R>UeUg zb>^+pd*dFWVB&SRj4EgFajV@-3w^nt&6xoe!N-OdaSs^Gl2b4++hy`8Z)wNLAaOx5 z`|J1*v+BYZ=t>-qy(y%Hq=d@MLpqr!5*<6%?;k&|&>dTvTYL*@evy`oKWw4U3^7!4SIm1iArf zmYs%>VD}tvTJ|eV-0^?xN9h8EhC9~fX$X2=>VG?YS^=M98V*PZr!{_hmvW!Xa5>BxVGujOgZi^H1XpeA4`TgOc|PJ{+xEl65)y;;HA_~;jf=gZsx{g23j{D zsOiNamC&{7S^wjM-^hNW$tgifbIB(4!E+fpQS50t?<~~})qqDlj<_!@asI~JuYbIV zalU@5*Ta@lB&AW;*e8CBm~W$+Yg_u{FFqXV{5Wu?syX6NdUnHOD_o~kK8@;P zWdGii^}Zrk5f!Wh8|Oj2aJEy;uMgC^-jv(trBaot&C>cT^{1dgT8*^_ zJEy-U^|KU*;v(Cr=N*Xjcqoo@Y&I5pyh(w%I&OWXvb+@`k9;V%nbktve+6#POgMOZ zd}za745z$Cy~q>E*-bD%(dxoK7HbFpHcJlqa2Zn!nY+q&w6r0!MVdvNxAzT#Ik(9q z!#)ZBrN*tje^SJ5-aP}*&GMIWi~yn;`w0=N@AF{zRmTrBG^d z@jHO^$8D?l@XDz#WHPpB@=@t%kA@T!>;xDXv)zh0gB3{28j(f3jI<;Y*S*``h5Ld& z`yj~Gb82{XP-`9i%YolqWxf%}@g({>i4f@bpto7&(u#x^W5BVf^QiN3DN#0N(eMe%- z6gTHxh3+k@w!2x{wO!?#!^c=c3(Z@Tgd429gIE!ea3tW31C7P@P?83TDDCuHL^z*0 z_vlGd?44W_II!qi)kEpuD*Iz{H)7wN<>nkQfV~Ad=fG!0y-XtV`v_`D60p;sQ=NRy z1VgRu*X@=8{iBpPqc$nB&xrA-8WfCm;VyL5@>@won{S1}TT_rFYfmFyNLSNLOaKy& z11ui>AgkYu9scM1p#Cm>F@7GFtQcFW(TYUP#Jz49kG61tKPl8>=XUmYZm<}8H_99lIy=_@SUPng!FUgD1pf=2#aKXmrMJEbRx9A1qS*` zbYQh$Gqocj2-qmYKI}`Q5T9^XDS1t|wG`jT#|;OT%pb~pbWUwRqf2ih(`TNHmVYJF z^mQ=SJsA|Z&v$o0<30Tbe(@6-WfG@Wp?Z&e@=&?xSi9?mNVMw3;L%6#lsNPo)ySj; zEt`SZjko55e}K;=lD-iXt&#SlX5if0%5Qbg?UrsRSDX4QG$1txhA^vEk}q_xycZTY znohiovpCqKfp@MXl09j1Vf5Stx_`?&9nWhwi6LFV4A@G=2)Ut8Lo>!#%IZ@3N4&ZJ z2=|}cn3<{$olu=Fn8JvpMgVT4;D~=p|4uD`Lu!e2YgOa74YD1v%=B>cP8BjVyMx!% zem2&gC?Vc!%@(j?@t9%~+E1`=DZo7M7)Nx@f%<>lz7GNJ(W>q%Wf0H`M4!?HYoY2C zikvretkrA!H{@w^rk6Dod;NgC69dMh2bkt9*FLn~9K+l1j^R4Liit{?|I`8UZCNeg zY%Vn4z1(ZK-2mV1REeIx!Fguf=_h98f>T6)D#!wM#+p#J3^=c8oymxq28>DEQE4)z zy0m`&d$5!fWGz<#!R9qCtl|wGMd}%S(ULvzYAy=Ur zQwK8@@mc5356TT5)Jm$|o5o%9ClI_kRrd%I-8AD-9bhQhW_C{d7Vj{yWdq!)_+U=s z25_c0f}ert-BevIH$Z6mVLgQ2_#yTE$`zb+h$FFP3GU^EDJXXqO%OhHb^lcWwIfKx z#NF}cuRNo6JRt-*|9lZYJZ)~H+-DSZSu@FpPw_uR;+A29I6|a-4;M%+hWA{`NzWb$ z+A;k@2dz-K_z@Tv1NvX81(zR<+Dn%s-NWU*c$(*Bze?bS-xlMj!(c}7m_?S#4FoQ;!lqe-T`Phi$3Y!C~ds4eiFP{m-zAr$@%4~a>+r+Nv+!x>faP!5f62g28Hee zE^~Fq?=X>UGVcB6Z{0PXVwmM!0*!gJ#n?cVNIHpFL67@U1~sEg_X<)pvhRvNB5g^B zv8@)RK>NO%p?~o>nCBSy24&>rKHoMomj~$F&WK#mB=fjC-^)lYs9sX~ELGadsdRzv zCNteFEa{#r&+r{;DhK(gH6jeJs1Z)FAwR}fe!sZ{sUD>~)<5?#r6X%33uZhnUe$Sz zj?Ll4OwLPpA?Uv!@Mk~k(w0pl?nA7rvYs1=dWWsVoG?9HQAv^j2yA^;JKC!paYX|iI{JffwjOpgUA6%X#MmV|4v|%`St12}a z*vUr6`A8>(SQfo!6UJQ{V;#tF95La-Jr4er+qz*2FREFILZesyR=zH0@?+)U#s~o* zv5Dlm(>xhg)*K9-LqbbRozKF$Oiu#Copu}0-i~*4LrS$mM87!+7OM^GwG0u&XT6F*G2@ z_)i>f7R9$!`g8E>SXW8@Ex*c;C<`S^Z&}+4qG;V+HV@Q}8UcTR;4R%~JbL zf>TnujypQMH-jhj3#rFJkZ%4KfW0qBbsA~>`?vFMf`t5T)2D^Pg-o4gZ45{RVvJB z^>5iBjC=GE_Kz6mPoo%5xO?I|;@Du1;r~O^Sq3!y#chA1MuVV&v`UI}=Rj0IQd$rO zqLid`Zh#6(cb7B>LurYDC@9?^EiJW?gXOdT{oMEKy*>M#bH3-gKA$5L(h9XoA{VF? z$Z~-QNkd4*b3&sO=;OE4$Vp`z_CfdJ03p%p&@sS}yq-hEb#0Hi= ztWJ2Rbl4|zOQW&5K8J43Mb?14BAwA^tTiKUVTRqswjzXe?fTsfw;_j&uA0yyns-Op z8dN*i*~47-&Zk*A7TR-f=m1uhduk!i)NDrXJ#&B=>NEDxExyj&OffK)aDF+XMgemCf6#P>|6;0HP z)3156|5`hKc8f$|Geq&)Pt9NJcgeOrEyYCz-Sy>ZzS_{ICr`{4GAWe@U5u?%)O)UM zQ&Lj{-H$$G?$$EQh97b;mfXf}7*V;C6;!bv)&kC7I9QEe9# zM2wqWEhAbhkplXC2rLp&RC?G6gPvX@a1#%VM&0KAFqV=km7ll}ur}Xzc*ue|RMq zTcyVyX`J>)d~^*s^JaJ6OXQ0*$Gt}>W8Tn~HtL-xzT#AU?R$@DG{{_z#$F0BoUDL8 zeO(G*q7@cVsptgFa>i?_0A9Nme6-d*0g0%UVHSa(83X}`+3MDR&`dQrF*~q`h9)sR zKJvv)okD6DfH^53Y1&?$cVX~q<><%0FpYTduGVJGFxMZ8KR@d9p*sSSf2k4biN9a| z{q#}*!zx{q920DFOFz*k|5|0?=#{dYk!~yHxk|otGP(-QB`ecU;d?{-+MC+IvDz`$ z^mu3BjVg^dh}Oaucbk00w{{%fg6jdRrw6md9;+$CTjzQs%xx3rJ-qXv_vWw2H9Bfd z-v>5VoY4;WjNRrGXRyhquur`lveUwK&b>_Jy4t$@(fHq;cDEIJC=Xf|mt#VrJqt-T zabUjM^7W51+c$W-e#WxKM+SIBkX0xbGTG;Uzs3_r=gu{~h!uH16!D#=tgI_;vT+feH`!b z;c3Q)@aj*e$By_V0W;TgiR>bx!on-KHqcG}vCp{E=GRXn*BQ!)9jh^SZ2g?B@@8dWck` zdson@yp^(4C?%075)5><|ZI-;PPtTpb_Bn-;z8dU7VDmu)F z`yZDFJAn8n5_=qc5tbM?^`c0n@YlT~&)i5iVEZ+D$=+AJH#w59udm+ALj5ka#a)wj zJk`_}&MMWEPk!wfyr@0vRb`v%S(g`!Y--fT9A;ZOGEaxYHUjppB_8iHUL53f724RO z66kt**c$iVL(y#jM!$MJCm{JIBPbZTtf6w`E(A&MCwbHGxK>T=2oH33hteoh*}~#xUFe37;eW7 zfY*DzR?7|+ClY7Dh!K9GfO*mKmm=VctWTWA<$&o;+FzM^HJy3@*C!|h&7Y99M{_*( zMlzIlOA>cZag%q!dXnTzMzEOywbM#R@JBx`db%fqKv)+#W)UB%mT+r)5FNsrK?HaP zFTQX*NAaFc?G-;Dj8GVF*AOg3E|Xn+LmQ7vfq(CNKUs{;p7}kO*2MEyqo#1MC|0)T z8`jjZ4$_A!<%@kE- z1OR%Q7chyd*!H@IACUmElL`JK^|z>A)&79M**-w~O`D;LcpH9VqcS!w@QjodFnVwz z5wcViMXZH)Tgw3!V)D&Syy!oM9<|4OV(f%P#F2{aT_lifj`?B}?-ja)Dct3~J?%m@ zNhFT{i;1HB-(h_b(LR)Jy7E5_9bs1+d{6NRnTNQ_yOJPoAyk+BrVPRsJz7Z<%&M>s z0c#+V=Q=LXi@5JCp4^=n%GE#&+iFZ~4SDlDD4j3!G+gKNtgc_nCJEc{W{gUyXl z)O3kYFmb4^M~XzXu+<%EA70D8zVc<7k5|~lNMSExHk1b|1p%>=SCnzZQ%HE(@PBiC z@K)yg%=5@G;EVX*{X==tR~pPH|9@&vK_`rjQ6;HrunV8_9XqO?T&J4$XTGy$&5Kxe zIaowY?z6m4joQWCqW_qZ$0QTHgQm-`${8B89bu#|nDS8VN%H5I4HhqPrrGPWcMd@M zO+2^9UOW$E8B6_AR*ViN(il_{SoOOPqEk(k>o3_5r(V0QM>tX05vH0`wZ1P@X3q*1 zTyJbtDYHaD!iH$nnUv_&+vJ~fC9%O;fnJ*izxk>C34hh@jsb|;+OyZ(Bgljk@6xjZ zv(8jrJFz11)S4|DbaKn7cEb~eSJ$(DZTuFBf5q=3OnWBSMLbzNtJ@93BMxX@?HlGm<2%To za-mxlq_UZ@c9vHH43J8%iBFXet(BFJIEt;RZhUn+ZL^JRW{v~jIr5rSB);}Y$?r0( zlTt6R>nxc=X2<;yWzR^oi}3tS^df9~t(-SQu+2yd3H0@v7awQ- z{sVKZ&=i`Uf5iLGK)-{MT(l3129J254Lg>SUGMIKGcGrTHQZVVCD**)V`4IfI}lNq zVx9Pye&Al(0vYDHCXuAFtr;Z%2nHm8DU|Ef*+VfL(`2_8qkZdI5#g-zIE=G+^@!~Q zLYl?uo!;NGv1wu`@%`DV`g>{RHRk72A#_ACy8m19MaIL(@wN2F|9U7i4!>rOpmj*r zThi=vwcCButJF6PpOr*i8@{01rz;B>rCc(4VdCA5M6+^ZJvjw3gUYVV z88b7%1bYK4)oC9Cf+@ihn%=d(8l(SNtALtvtkCwT+ zt^aR})TRA!Qg%jtP~c|}4Xl|p`-SmMq^rC2WWW1Mi-)kl%iu__q$$f4Xg! zxE7^{TyM(W?E`~A_B#Ovx6i#``Q8sdMV>xgF0vRV%f2ZIXD9QZil#9}R_*;*3UQ>M zaak^A7~jzw&lC6@U;0vmp~o1-cU-^9)DbE0RxnPe$W&p~+?b4dyQ@`;L+( zKk|Vu)Qk*fco!)Dx{rr3tno8+I`Xt!Uf>rf^SLeUOD@fm=GZ3d{Z!*bw;yEfwaU(W z?s0t-E(!!Uw!0|#rCRuFkYB5wiCJu!-3!zwJWL3mS!5HrwH3emOF8YXg;nMk`0B=^ zac=HT^vw0W!MmfMeJh8C|f4};SR~zq|PuYN$Hrw+WX7m|=UOlzrCsGlb4>6UbpE%U^kfa2H zh4$p2@!CEd5n)$`&D1d`La(x*N?o{8`i#qgr_irVmpfD^lpOz8I6u8%Ld)DjtayN_ zQ0V%-+wrQg;AWy2IgYr3#ILl9agy|=oIeBTlSzd{+e2a-!>xZ?2N2IUWXWT}_B+C8@8_8a%9^wi%BKI%wWKOY!)sA+4Jo=2d&$s;vf8=0zZL2X?!ehAn zXG&XEid5=;U#6)M>$wYcnG?`?G1fIZFsQKW-PH|z?OG9AGG861io2}l%$t%mA|(85 zb+OHe?YR~k^f$B}XLpziWmIeyxde%Xo2FP6djdi?R`$?QMAQCPBK zSUvr_?7iL3dbcN8qlv4eh1ptbM(WL0W5SwTIa3Mk(cv=`R*}T|^;b~Q7^sD>&SBp+ zR8q_;66$#KN8`~_KPf24NU>)0SW}1C>b3(PV?!|+5oZ~j=OBd7tJ90n+Qtkl3AU5n z1!VwCkjVHh&xOrNa5z$H z2c~ipu@9(-9E<}1p8v^}$(C*1$tSp4$%&UKX6!ykLL%L)s1I^DNNtZXZN0~W?( zgUPHtf`doJJy-!%1fgT`sU+mL9}xgs`i7Z8)2t=7DSKL!kr}D#hm+=x4T^pSRPxnI zO^pBIl6awGf#?6zYdcxg^Q>5IT=O~1g536@ieuKpfboPM!DpOJ)NSV>?PKc{Nf8Ro zxn!|-kmen!N5gb)KD17SRXOyJg|wA+e`maXKqfixb-MJS}CP(S~?hd+OUlN}EKDxdr!xwjI3K z7owM{R$f`B7bpsxl)OCnL#>81e^_bv%s(YtF54{y4JV+9xdc3t08&|aEnOK{a}&zV ztwyxj9j+umq>F-k0Ep(*$l!P@dxeT#uAW;I-5)x{y82wRDYFyQ$JPmCQLN0ju2kM% z2lH9Ea5m%t*!5o1rrZw=V>EavW|1VYS(PPCHM~gdS9$d@OtF9}7Xmaz2U=4b>Tw2SdK^;?pQzNdR?w1h6fxozPdndXZg zxN!o|RT_`tZyI}a=AhZb(z&;sg@9hH=Wl5IB^o3ibTP;V_>12|X&ZMPXjX*NOz8f; z--FpW2$r}R!7me$NL%>^C^fUQ+8c4iw&`o`G>25GUihEHJ??@uS3GI-KC9$=4)m_V zt30u7d)9EJ{cXEzmEeu=&tT&^jk#=?s5D>FQP8n=ItmCv+;wHB z4wvGZl_vmBG4A{PbHxM+t8w*Gmg&iC?$ zcD@@igX(i-VSlk>mv5Uc;HJYX^>mRazb+nG)uFbTvX6I-(Y)9n**;lask>h-4~$gLY?u~Y8$0e=5f`S-6%Im5?OQmC!sUP_fV*kLzbelKH?IU#PLy+jW`XNtjCGps)iYs4DRC7mEVd=I~L{;*RxSUd}FW~5rr+n&( zi~aZKTVzSPp!thZ)gY{q4awAug!U_rzoy)YYY-#K6ZeD^L4Hh5bU-JyWVb@+Nn=p(jH0;=?9m{Y1nqH) zpaq)^QfsU#>zw88)B;4-na=^iS{n|Ll+SSv2v^hqH!MiD9Jk>tel9RJ@$ zI~4f(QjY?`I|(h#Y@QEQ!}|b(FJ#q-jWZs2p4F=G2`V`kqlro8gwMg)O^=vZ#krIJqZ+(t5K8=Vh0v2M#DqPYm zB*`nV9LJMPwmf557y*dV^uy45`YE!Z_%})S*KFUq&SK6|$ljFo-f8l|MGD_1+1vKt zcQY+|(tS)#Jbrm@9Omupz5P6*!-ox1q~&j}M%U>R3zQx7L`J*>8C^C!iPQTvWA~^R zv}P)&Pq(=?#2eEc80)vcJfaaa`?14SJF`@ttIdB`>vi_jgIdMw6@2U)lh1*f$osH- z2Zq;xuxulOy6cT!BvSkNK&&e_^k5cA#Db3(5qJq=WsGS;`0b^0IMT?C(fjWyaWHBW z{$=9jXDBF={BlhB(kz7C&vF zSndB9iDx(k4hvP>_LkK>@l-5pCW z0NEO$xi8)daPbb(JLxX2NA|ux1og?NGp62stOW1H_J;#E<}*9%^}jk}6A#}i%~|(T zUJk@0fo|Xk<($0AkH?zDn};`SSf7ZR(0_dMcs_UTLRhq8q%bmaO9uFPm0IB^X+^Rq_&s7SlPZ2cWs)PE^z9?5f_R91qeU;otN7diL>HOx6v~SK zk7gTF)5x+S-(bJNFz7P_c}0f%4ZadeiZ~dEIB40r7>n7~V5TkoFBZ|5-Q0)p)tyJX zg19Qhyjv9a!!EYIWa4`^8XHxMVqnc@)!FUIUFHsvmS)A|=Tawc!_>Y2_6-T7yjSU!?)Z%Fgvz??gu&Vmr3 zBxJ1vin;FLv0+V9SyTJyCWoZ1oA@x}N?_Atn5?k*+EWCuoIZSRUrZOlWDV3kF!Few zP35|mtnkR@dWy#fPz)^Hj!;_}<)f+2${G=47GZx$z0@}63Sf8DR9`x=!joy~lEqrz z3SRYrY#VfB52Kde`2XRx=^>8roGJ>gpWq6hXb=>SxQZ;gyd=3Sef}yyPZfw>_3hia zwYSfU*4>p4a#~jNgJFe)O|)3q6}eqw(?9fmq56bYvxD9PdJ$FD(XPM@!npAG6lI0* zz3H8eOHI%|{dUhL-{OfaGt`Y)lAUIqKGN!Wp6XM+N!Mk0<%LEu0Y#3o_wa%gVE;?k zEYr*D)TW>*51q71``F6~=yrZXc+7h2!#GYu79kD+%)9rC>yV@Z3EFMO$#$nl`f;`r zr-hkAQ1Q7>OT2-fX*bWGdnD}Su$^PfY>(BY#C5Ui$KN_X>vXMT1^#p~SZ{Ilj<<9Z zK0Dd(KGeiwl`;3ht(}}PF$)&9a~b_Bk3tu^e7Wxfyi93Qv)TjyiEd2~jfGG1@)L*3 z|6s{+TI)%rn5Kq+P2PKx@-OB9E{4Qd?Va%DMIz%}7%grrg$+l+EGGhmK>??AHQ3q# zqVZK$Y^gTB`Vh=TVX_%crSV_5A%ErwvZ{3gNB+m?sm*c&+%JY0kIS(>H zsN;(M)n}Msp}=4MM~qaF_YGOeE3r zkILGsDZ~O~C?szxVrTS<(u^fOEiOtw=~hDdz_SQU?8E8Xlm*O5((gteHVQrw)aCW! zNIT>@p2N!Ak|@3vtNwef46DQLX*X?4g`kOsxnD_^sED-Mb44ivd0qVL@@ z8>t!+?>N}C>E5y-w9>Jz<<`$M5z?H~X;585CLw(MyCQpAiWNqr;@6t#`vFpPrL*@M zfxhkDtd-zhV1iNF(7`@AF{Wo>Xmk((Mt}1*K@u{^ZoR z6ufg~g=PXg_e?buAkA1y#sdEi9Zka6`m6nrTvL&ZO;m2lpH_7o}?j2o1p;JJxN(S z1>)lPe{JxsS4U#fmz=Gu&gnYe?o5R~$w3ZU?NT(90KN%j@FUEyiL zirzrvF81ZyHZ_0XkJ%x1>+OnTIwnF1ppTPRE8YTBB@+hGeCG6V0@VKej;QCq*8%Rr zD8r~Zo*sIKJ^b``TEgP>wPxUj-57t@cqyJOD+AiKR|#xFYn1_2#{mS*i>>UxA<`%( zEi$L;S#PsKZ<+XJ$9!7MFJ(k`bq7lW*d2wPcU!H={SE#&jUm|XNsS3_gPNNMuG?pA zp1`H4G-g_Jq#j*`;9H4DOoaDO2qHK0SdNoaPkuQQR#vg0i2rJFYWAu9+f2nst*Li& zlRqUcUpKX*toLqChfwh4pE%HJjM)ABn?k9w7MNTRaQ-}|r+phBzK`^mn{nI>cx zJlaf2-*;Gni!lyaSA3<-))tQzBGx0g z!iIJ}TVg|Qlb3XV+ZXS%0YsKPV)RW7C?jgM3{Taga#?9FOkqGN7ZD0_(f|<$>0{e0 zn9R|ZazuMtt0iy1d^0U-D|;grOk+fhPSYSocLs3PzTmo5GMtohrw;MoN74FhlAWj^ z{~w4qEIAYJL6-q-f&woWJCNNrLu>DRURaaU5`30cV@NV0U00)K{2VyE!UURJ>uth) zc2BUE&Ex;bJo%amhk$#>GwGLR&N{S&4PN49llw2+L{fy`X*WsOqMeyESfsTehw7K1 zBn|)r-pZY>J^$O*26&E*#AXMqV#DL#hrbfA(tT6vqHXxXt^A%kOoB&P$STGZbi0$~ zbJH1l14L~fdCxFZP!v@(=c`gWj*+t&-=+}yu*5wk;7}whrQ?bS zq`rIgb%d%!o;S9twh`pRPyuSwSpKfQ&*gK?SvZDMMtmU3CCkZrL~pYQ|A0d9J$Y!C zyEfBN*-x&QHGSJP5M|iT?#Q)fojh&bGSjG_phf)c~L|lAc+x< zWI@lc%>a2eTWvNqB3#UV(>gTSX7Xj>)quP=*Umr#z7jAOfm@{*reuv&B#fylR9Hq^ssch|yz);4+)~e;Rtz`Z zHck0a);%8gp{LKCr$<=X_$%`fgr^qR#?{xo@aD&Zj~*hC2td5^Fo|8h)ZpQa#jl=CAcMxX|C?xe(B=?uI`-NSs`>)4P*dW6#$J&p#I4js74dzNEb( zt!DI}okC_NIAf3$RHnRIwBOr$KMliSHXirV@8(rCfgL&ec^>!_wcuh|IVe#VOvy=i zL1{Fw%T3toq$UPl0SNiQ+b*b4@vH~I%@DLVEz*c)%7E57=L78hZP@cZ{io}lyNr7X zDJPtLXY2O1$b&YcE&YjGa~x!$PzGZ(WY@5LE7L}{&Q>7}q`!JK$^obC1hCV>>S zlOx=wSx9>iG|%@&Gcg7;^H_l-0_#F+XE99`p*J;YKFr4$3{sHJMwPD0Hh=u0F#jQX z{wX(r#a9dGbeqTnHpu2RoBZ7Oa0XXKD|+8Qk+n_7mOb|QP#+XWWh=K5wxt0+WH9=u-o{sa#iEA5I^+0?8HUt0KH3#s-QmOoQ$vH=w? z%-{85Fg@qJk*2wTFYfkwls<@n>yEw?d@Tdm&P49=YJ3N4B=~(HSIxDq(N=4Nk3P*- zh7dS%CE8tQoTvbes7=$N;B6ufdi9$3vKfNVW9qaZ%bB^!2GGa>+`dsZB!M8s3A@kh zykJVOSB)>ovXfxWMU*)s4vM^xS~P`9rk5Jt0s^seFA z6m4nh;y3UjhUDHk*nD~bcX2}Q4VQ_uC+FOq*yE^(m&HUA@A&Zg-B>Q}FZZU~79y&U z=(?%>gVofLw_}DQa`BxNi=#c;#xy%Uan)o-!0>k#g?n)$a|-vi`w6wxN>B3lmpNp2 z4*wvO#8~-4iBUZp8ekDvkPFkfvhR$Cz1>;R;g3jvUi!KAiA{r+)*bHTP*nArl+7yN zh6Q3-`CQ)VrZmQleL*i2&$!>xR>Gg=Qj!O-b$YdbgUUU)vx7D z#J}b(bk|w^RdOK_I!$mm_2P68J*n0uaYhTSjE~dgd4!6n{*}{6oofo)NrW2`Q6r<6DBI1>>J~1 z=%rFSf_Yj`8L@RaAg`LRuR@94RXIn&*&2ugQq$DcKIljF1o;0ccz5VEpOw*qVNmCy zm9W#1PWSOCGQt%aN<@>c`8yrykUkC)6PkCg)>$O)+jftS5A!J7JTh&!$Y_2>5b$?u zH;%Ah9rD3oUMI&b!W)xyk zWqK5;Crvk93gb(_=cGQMA8+DFInQU`v7Q{)MIMemGOP?-fyhnrgu|0fLhcHFTJhQp zpV6yw7Sk%b_Q}U&BOH$8s4}Yc2l&RWJTuw)(A3%7?JYF+L#yalkVHyXykyrB1#QN( z@5_%*wKO&e#l)zbnb7LGM>&>SB3ix-;QOi2_RU8#>ea#I{r#*)s^`PRe+V2Re0L6d z3Q?V$Hfu#;Mj{@!*w(6{N|V$ve-NjEgwfE%DGGq2zwgAk-!UCg*+aZd{#<2g1K~9i zY(i~znnQb;hgYwB4=`kU%DgN`DV$A75lTSONgm%1p#QtMz9N#3eAVt|x4k=)NR|JU zK=||J`1ISPMH0%U|ApN+_HB$5Md9eqjRn?j+M2PA_L>4vbk9BUV=su596Z55CnGW; z6vj>e1$`I&d#QEdSCV!`Pl${V8S|^u#xTYA?*!YyQ7N}QFbVq&b+SAyny71^wA-72 z3vXDe@5<-2dt?yH(*iaG-I2)X#nmJ~w2SG->)C-aM z&Q?A^4F5k~XXAUo!IG8?P;w$S1OpvVS&`~G^ziC%Bl(n3C%8NdJ{yc&514u;?a9^H z1tWClV~3Mqew>3h%X^rf?Hr8i)`U8jHWtWS$7iTvP!X9+VZJ?=dY!wDfU{*~*Qwm) z@2R7=7k-sT6PACppNg;1Qv!WfwP%!U#Th3_-xV&Ni#2<8Em8~o*P*ofkDM4TphA#t zn3!6VA+4KXE@63LS|O&vNmh9uvD@g=H21>+_PlLj-BX#lp{e?O?({;mi%0VZ(^|IU zfxD&Y}I@vZD6 zV*Pie*$GjUi1)%>^ci0<(D1y&AY>ocFno>r_l^dY6WD!PfQ&SPg+nuAq=9y49;&w9 zVnAyVMP7lcbT@1SvIdvus+gFBR|G#<+lP?pHbdw5sKG#`Yqo4_!t2?rJ=uoZ5&1>> z4qj86ZNSgr&_DWJ1}j;6Y(2Me`U3HDLzLC*5T``-GimpW1{FZl*yLwNvV|%liU{)02?>3+ zk1D@r;BIQyc5%&_VV+*+pJFJ~#QEm+b)i2Vz=XQmph-3=Wik(`nIs3J-^c6yqM4b6 zHi>feqoFk=`OZz`t536@{VHxxVJO+7m+&MZshILfNoap~=yC_S8K?JA3w|?R-7|pr zM@n&9;^>sTY|Nh}5DaYkIuX+aO{YfO8>tZX#ue`RnEt9%Tu#G>}XkWf1)o(f=YD;+^>0#IpO!qopl*L~=B^QqdBc3>x_Ov>nrx{c*TYry(cW{| zd{pN)eEnSg=y)77ee!xN^rlwlEZgAAaH?Gkw?nWt_sUFk7N7Et1c?`C}>*~a< zEci0*uhN=I`1^##+z_#nc;Kj+bL zCc^F*{%93TKoD*29fmx9^%uzqHH%d0s>PA!z;n=w^<<(0<#R)8Z4v1JU>q=eYd2?VSrDqJXOIvI2Y2+G()1RNu(z)x} zY*_nCo@3tBC8Px7ZP(Y#&yY6aeVsgRkIlMX)!+O|I}x3rkQT~Lf*s9Qg#?(d9%EOB zY6mA8>ZFsNZR)HylF(0M+Su)ui^PxNU9}r{zX{jw1M|QFofCvk%@9>6Ye;C>z=FD`cuEW7G@-S&K zvn^hFGD^~^2|h{~CGEo|G0>2Qq_pUxb@&?Ozjw0J3pgWD_K1uSoPx0lZ)Qp-`R9mL zMIl%S4552!z6TE=(EVynA~(!3v4NhWp!;>Lp6R#vZZoWn-oB5y5gtr^jgbTJUm3W8 zQDk!tE^~mtak*bqSY2~L81ykmLH`q+qQh6wwpY1xo!j`K$Al+tZ)r|?&aYs^D(V95 z@@PnG=8kLT+Q#?&-!gii?`=NS!rN39(3;rScaLMD z^V=M&(1xr2Jxd(omj%|mz8Ol!6C?T>A%(`v$n%urKPc@w+{)O}B%F)vP3dNJbB4f> zDVSjzrdcE~6M1e~eCMbgK4nK7tc6z!zHmPlz-GsM1t61dqKIy}S|k9hu*!{338ZI6 zH1slX_uIZ#=fC~#qkX&jNew{Y^4q@NtQt_QpYc8iS^3HdNAC? zEh*vZ$HpbAMH>I*fC~TGHK<ogd1?WnLh8vG<#dxYwg$1XI%bi@ zz|ZBvQ_5-^f9ca}_TE-Rm;60QT^bfp{tfIb>wjp&qMjATSADotrKFwS{nJVOFh}8G z>XoqyJIheA=Am(_(#x11+q~y#2W;*t`L|jH;+@4zs|vjXZvTzg+;@YBuMwwtv1=dP z32eWKhew^OvbbIf04qH2yr)IIoFHlrl>|=qMYzz76ez(Qfv$d-tir2y98*3`8USmP z&2*uia7&{!d@Y9(=hd!6X@(++1xX_cS(5Qc7UjjnhC(j$3Oy0IwDck_fY7T@#Q8gA zoR+QG9vne3>XAkG-%D7rY)En>{--Z8*t?Wi$i$0#459|RcbHZGm+vO|mT@63s*>lp z(#}dr@$2V-y3X|*@cGU?bNDw*xkPyN69R-reBbWI^wvh%k^_ub{}swo43#%d?EKbb z&zr3N;X_aNS;sMu-@D5OnkLtJ5^^5MkNb+Xd87BtQhX{3#l6uQSXY0Y#kul)FVBv- z>1P}mhEL5S`{gBC)Z2#`Uju8*j@g8VU>kXZ%vUe+_+LKfJd{uH7fcTJ-A}5%7E|2u zp)8#6e?SQXLmwsE~eD`+20*`M-^V?ar50(o4pOuFoIk)H*rrBYQu_YD2aiDLF9O8lA0@a zourmpfL~(ZL`+^?xr1GK4}@fFdrrqVj+E&ti#h8dXHvaVTRl}H2HpP5yK4=2Z2%j2 zr*K~%hP=~_3d!isOX!v%e}2ANc4iv%yS1r%tjvul8@KcCWO0Q5cx7Si=xVj3;x&Dn zsk;BV^O%P&wLZmCAGCqxtCv=+LgevHAFLEK`OI;+z;!)4H1b(5@;-a55UA=@!`ZCO zR=3#v8B(M6-^SvzMdugKJ03ip1z#k8Z_;S@sD5Htcid;er_^pcE$Mw&_{?)g$c(mZ z&$1(4JsT@Dl=8*+bTjE&DI?34;7)lB#W&b<+lU#*uSebAJSCpoGy_NHQfoSik zd2TGjU1hzL@kAwJPHjfyM`tSky;p#V;}$henCjC)560#MyYqG*sK1q4w+lp`u|;AC0xKeE*4(H zZDasV@tt5_uo^ye^>HUY-J>D+bJ1PTjJ3QXz@xoEtTBMMlHB`}hM7xbcN@rJh#NNR zlcS~{1~@enLE|z`WJ(*bsDA)d_a8;v0x2vlfHhUVJ}#TaRDDlRpDR8xyL>*%H|2-0 zw=0VaMFJT6g<0wzz3wP*H8KI5zD&VQRa@qB;cEQ~*Egsi!@8LslN5(}b5J_e zkx{c!-do<+-N9HdUjL|X&UT32sEFz?!WT-^ys9>Lp>aG_PLO7&cTBtKg%lx%K^t< zt2wxpJZheDD%Um_^-rpV>Qk0zDa!vZ9;gJg{a`yFu_hutYb0=T#G>o-UL2`(Im1N= zKevRQV;>wA1gZnmXuc5&+O^6L0J`$%-Iwyk zV%*7r(w?7|9sgN_o{ll$?_c#he)G88eIP~QeEarMyHuS!sb5TQ(x67?0C^?(+;j+X z(w+NM32T&v+KBi}H@K@kC$Lr^CBZKCLHvC+1^h&7kAniNY$mTu!i;sKs@t&NVwdiOL$uRf zx1X*T-I<`GV2>h;d-VO{58}L)Fgqq;(qcq@KvE`T{M`m9j0;o}i#!=M zj$TUeA24>GN7?$=id}oaw5p0-tSR6siwQ@JU6;c{UQ}81Jk`OgB_J~tNnY{l7ChBa z-{G)qyV)NnE7c)2`R&qbLS8vV9|$mFOxg?rM<{dT1%xdhN9n+bf8>Cj`Bdnxvgbah zs%yhDPUfKXHz{DXY#%@5+q0X>Fo=ZhGr*9p>l-qQzMeOYJn_t{u$JDpKJVjK z$zR8CUi=KKn4gAtO{XecG^!%Ny_q5iP5cU`ro%&srb#p=S!!aF{ujW{-avk6}o z3Gmp9k1Y{)x%ETdDtuKBrIrwrkRRpyK>P~&6J$tF5YdpItylrA8AbwvMm$v00N_AY->5Pa_KrX&!^=_}45ocP{`#nsc!ykaS zeVo~EuuDsQZ*aHYDx2y5e^%@MrDd7IVLpqGu0!K6&Lp4~Es(2CttBfvu$)#h7=iM+#(%WxQSW|>8 zx7!BRdP|5AP=%SFAF{o1G4(*=BfcJfo$2!h*;&rjSr=x zT=5#@*f%e=$qb!tO8Q`U96);%)B6vtquzYnQ-27!Iy3e-^WLITKW+$>CGIZsikV7)45#DYy+FTq>h%_Qn7Uuh ze)BpzxZmVs37^$?RoLn9YIpsiuY5#q`?7Z)0Dmfa9{F+Sr`1R0ShO~>kRxvkbEgVl zRPo-FlJ~==K4wE zxNuMfFL{-}TQRAFqdDp2&lm&U7Dkak|86z^kEOE=Yx<45_{Qj#?hphO>CU03fRfS; zBHi6=hzdw5NW)NCP*6(A(cK`;=Bti+j zAZ<5{jLevcsRna|ZsB<^w8R2X&rEN0=`!{~Ec8E$aH?lt{F~ikd>>1z@)Y)2b}vq( z*ybfxS1$(aojYR4(tdrr84w;SFC(&(DNVIYXatvdy1(N8rg4n)chR_r)R;IxT8`0H zxcuS|w&lYEIBh8>%`8wwdOM=_IHUnZLl1DXk)&FAJgvM(XLvO$V7)}b2PlZUN9F#K zhItP=&77}3p|5YfU-d>z3h7#=mPsvT6iD)ko~o3DL7Cqunj7JC8-^6knW+=`#sQkN_^$cqU;R$NZY@S>#BEoA)apHV!11)JpUgU6M*Ib&?8P84PEPy!6!yG z(nzL*l-wZyY$%kO7m@ zKbrM&wMn1V{X4Ag8q185*I#ZJ{$t;_IIupMt|;+&=8Se1Dt_)sBawHYGnFpr&q3UV#h*iAXr;rd+4#2#oJi zWTmcjF4fZ;_9SHwt3w1U?tJBSl>5Rl&v58v?{Yb3>1)n(GAfvY#?`;TG8)F*CUyM^ ztM?4}LDF}`Uf@59{ZpE9Ku@J}P#qGOjLS0vtW?oOXzUet??NyUvNTXb#2zPJ&8&l% z?KBGW;|_Wiyx3Pp_SLx~rq0l3qPR1US+vE?MJd=L8yNb7k^qmomZkz=r5{lOh*1A@ zMIpC?hxSFUAl&p{t1lY>!qDYXf6{Hr|BYFmJY#1YtMgj<{fXNAu{ZL1l?D=QPTJ>U zN7=mdz2ax1-)-j7RC{FGzk-%9s0ty6F|#h{IezQuw&Y zJNS`kGHRi}2~)yP=0CW2AC9HaTvrkUto*6W1Ok5fi0Yk+dH`I_0dlR$1P6_B510L3 zB9aIy(F-;WxOB!@j(G$tK=P2J64+NG;?7gm^FWH@-wLZ1(S;elK;j+0@Af~$D?>0` zP&4syEyYlr&T!SXR=&EfBo*A=3k>i!$!Z#+bM=W0+@{&aM;6W};@Qoy{C!Eqd4V*7NCC~Sb^_!)Cm zmOH_$;<+t(fpQbEDi>ARoVNUnNka>O7>_E}vE#SBJwql8N<{(K4ixeX8Y`ij!rcQD z43kqE=P;BNm)NOt-Y_FMVRk)aCGG?}go}K9kJ-wqh{$A>jO^3&pj_`aDc9>WIi`;O zd_4{Ae%<55H@LNy?Ek#``%%P8b3Uwl&@oL#^oAyB&A~SxR|!zkz*n2Qqn<{B`o>J} zf8iUL_7%RVw{!4(^Kn<;tl3*1?iQ@S#T`C7!_};Qv6o)wji6mrAV|fi&8#Qa6oW;+LIm1WPOt~odCg$m=Nq)2faBSQY*!Ro1X?F_P06rHm zO^gwR5k~htE7T8YPHM;SbC-66lUm?EnbhXp*TcMA*Q}R%(hoO(KRlVSf#Mtrm%|4e z!UuQXrx@1Za*)ezPp6+u6A8}trM*`h;*kK)RO>9nt&iTrC{%)(dc|oKQrOq}JmuX4 z{4-PnyzP_K?){m1HbZnB|BWhBVb~0+0t~M~nAkpY`w|Y!v~eNS1J{q@{w?D|l9}Lh z?T~$zu&H*)n1_~->kli*yG?OFy--7kqLJr>Yo;AN<-~G*1 zAy9aix$wT}*k#THO(=n2~ZezPb1kMUU~}BoV2lCIUm%F z_+KU^+MfnzZtXscOlMJ{zQ>^ZLL5Eu&v2a=c>!;Jc#u06zi@VaI79`MQ~hJJt&nak zcwyV7sUlXo@X>sqO5mAw#O}AF#j{Vm2v2U7!l}=%$+Y`V8Rm8ezeq&AaWJ=7eA0u0 z&YKhjFP_E;Jr}C#p{`7rPI@NA#x8YYGdUFUWN)Tpf!0P)9&gO;Q&;)sif1PI9}_Z9dF70lJe&!W~Y9(SSu4wUY@%B z3y3f|zTPhDR07}%w96zJ1i1F+qP(PG?DVP<)c19O_uBS^7X50$u|ZyDd?u+kB`QB@ zpTK{rQ1HnWvimFly>#W%%?qX6erpzFy=mdPipthgr}iy^ zp&;p3dV^>D=)^fm)>3=8-w8=w*zP9nA%|}4#oLQRPTh)qYfraHB@^VxpT7D+>R}kc z-h`G+f_RM|d1%!gr+?k>^1p*qE#&X+NU(tTr?MR8@kOoNZRkt8a~kNUi#Exdbh4|P zySEVB-CNwyI!zqG9FOkJF)@g$QzWHLb zIm1EN^7SirT7RF2C=o70;n45L7!NP1`S* zzQAYp*}+QzHUteJ;I(mTlt*IgP^YCTG#U(0*>itOJTXkOrgU&uF=R7z9mAcLJ-rD9 zCWEYnDjl zXdu4KU3Dr1uh_cc;n?(v!KanRjE*%yysd-J5oLTvWIHmsX_&M94XfZ>qv!J4_cCc%#u458Ax>47d2iM1 zxg4?kXUq|*z))p9U%}wDz)UGsT=f=_l*AAj@6J+E3HijH?hkDt`q*V=#Y4-@dtqzp zvLVyv2h{KlrjHW{QIk6P-4|J| z_Jws^Qu3FGitZfKbt?>a4KK^%!%WpDxtnu=eyqxYx46)+v$_s`KWfXxl{GxD+(p+2 zY{RZ(va)lPtes@lucX@G>;kM-IL2gh3t6QZ*IZYoxqTXjC#9p$|Jy@$aT%6OrF;&X4d1-xWZJ!1j zjsij(lAbXTdepUb&mc99L)-Py_-?{V)&N&}lF9zU*nPswDi^7KduDGE0%kF;U=KBf zZB3u40JHCKV)_UWM?YFtpc zPKDLkd@VKC>1;}0*HizbK>SOdM0=b1*VnA{x0IJF@zz5bEoX1=`I=7fm!gW=HqPM~ zKJ35G*rP&_Dkn7mZa#1;cE;l-tl0xq7erpE#s^=M^#i2g*{a!&o{j*Q~Lw>Vrc<&n&^#TvAS)7HT z`(e#4bA88_TniZ~3%B1Va&ZACh=GOjPM?)9s^-y&59b6Yu$Nr+i^Q+TKSa^K>vE*> zE$imiRRZw7F4BEVFIsWGPKSoUneEh0<5MB=!X$EDjuo<7!wi znvPksuiU26)aXl0Nl6(L5PbjQQLOwwdq_J=r1}qLhIuYko&sCYCQT9}YPYoDMssxB z59#9OWAxuPdM9b7$ooUVHNMWpDIY9F9kCQg!qC+g|m-glRYOO?aIvYd*LF>2a9IH3Mjle(q~3pMBUm^K5t0?q`8QE$QcVwU54O&m-&}4r^n+ ztZ1@3!|Nkz$cRS7HN3N(#4kI-x0_>rD!5Baud&9MB9% zxi055Grm@dnPQ?k^+7ZN?%So>5(K-y-D`rMSFmx-!veW0tN}L`F%O#@P9VqQqmP8P zI|D4A-5xHKuiy}!%gRCR1oo&Vg5OMQQeN!|Bo~&_Af;1oQhK;Zj?LAblPH?-mFt0H zp(E!6P67pb=;9WMf0a)e4>a0c-WZN6#GXU2qoNOnp!A#T>poWg<85_M!KtpzK zBxtX!9-~!Uc1m&LwD#Pd(6mA`lCVUWr|P@nRjPG88nAD9|Dq4{k5=_m+Ex?uBQ=ul zC8(T_jUfQzd1{p6-l9FSZ!2GN%!PIsqXMqFtg+&W62U%fly{Ha!#%&AF#uDw!?i4i zdm>YS5rqmitklH5>`noU2j8^iZqJSLP~E~_QC*~PGK1G0Z(@;bykowy_s8*fT$d>- zd>?^ivsc7jo*w^ymO(>|qAVqcx#^0tkzsj1r)KmYr=x4;anf$`XvO2^a}miDkt;cO zM1K7`VbihpM*VSOC)inq@H^2893PW7!?H#szFK+U^pG8oj>p9Bv}fOG z-_(<~`d0hhDQ5KCKUv&XF%dvZ>{9>NGo0pjga6(Tu=&L#-~3Mt0haTov?}Dypm}Kp z9H*d)vdypRe2Imo`YKq*7# zRKim1)#K{Y=|S;`C3lS1Wx=B8@I1woF)Xxt@t;A@(4X2!!oDr$v5Rv{lvc0#0`jy@J`a-u4Ira1fwVOS=iNhuElY`<2$hk?2i)sRO_9Yx{q+_g8Ss zO)KB8(QM%nqf5j{Ge&FST%WI=N6i+r`<8q&?}62Fr#R+UI4(5mxB-G{0Gnk3Y-C*4 zfCgZ$)Q6s19q-Aj-3S>3;CBDXoRCHi?&DVwuwx=X?j!^6Dy$LXxS?1zsU`;(4t?Jn zZ34)x8C2V}w`rc~TL~%9s~*urK|NX@r*6<2$F*+JpBK|ORnqx5%2n5?xX~xrKdUfk zx9xtL0)H*}o9&G?D>oWP{=0mM`R4=cd`a7@dL5}S+;I$>D?h zLwjgVWgAil=&>s%lLLG28B?HYDMv-XUAND+Jwyq$F?r5GzRCs^2}YDQaS!D4G89dpmyEA_L9?=)|7C-95`E zh@GN)F#av;uY<63K{F?xkx&uU95#H*#e!)npn9fQBq&BkWb0yTbGLxA(Vy$yk8*=1 zHT(CAo7>y7)T zM38U1c@wDh^V2pZv*jn;JEkF$tZ7c(Uaq7u7_AB3i9eU zNEExV%hAOiEy6;&6bSL0?>w$q>>OEzW%M35Mc-UBWA3Mi5o0$O8*T?z@Vi0HMq4F~ z;0pKjep@u8{x;c)MvgifCpoG#>GE1wzj5U)MJ5@~%%j_FKS^1};YmWQI_I5Xl8gy2 zdhAD_9leYlJ=Zv|<~rl^xy0|@>fU%tD^*qarcekwyxSqe>YvwTh6zF-iYM0qHR|xQ z6JRQM)b32baf8q>lOB=MM)iLUPOthElB8<3$97r0P3>+U_v*Y0o#z+Y*G?8=d}ssI z+@A&);T(^vuIK%K58IrrBx_1SXXrdllI0U0<@FHuxnb;HA)3=qx2NjtmcISepR9WF z*>uyz(tTbxwTunN54pqe*u6dGxf&5}YJ#moGrP)wp2TD-abAX2p*((OlMxd?mZ|&h zFswv!lU|Du+PeJMp7{4H=(aUK^T-U7?E~(4*y!Qryc=7xdES*Pc*fGY}P+oGwXY+1=-J?GIvoiBz zG&2r<``s#nvyGJysagnKRM05bX$nxXOIyxc>8j*CIWEuJRcGMI9rrLs_x?5 zCm|ymWrJY?Eh3${9YeP`YQNN_rn(exmCZ9nq;a_M8+!19ebFB(%qPztd++Sf7L#VP z#rvvzv9n?h--N9aqaWJeOJmBu>uM8H0_aiGFz4ZTdI(X@!GRxs#tpJ;WOwCjd%x{> zw7`542lBkcVluP(|x;`*6N4q$}~cEe;4~27*bTQz4k%f)K#hO8)W72D+%e z5kSi{Lz=~8p(pna>9iI>ABH2TXY@Srj%g=64QX%s&0|@GGJw*riAD`8wW!xxWCff;a#y;kNkW-77hb9riN|DVKh;Ji2w9|CRSD)~w$3VT)#Hjr&Bd(R zWoc#Y^fqqxaDyk zAV2X)EjpGRx;)Q6N)Ncrd9q^V7{?rwr=zYE;FJToz8W2>E$V4I;J_r3U8n`#IL&qa zJ!DI1k5C%D!Ui&gMar)G#6VIEky%V2>HWF$VhDe&-ZugcZ0<{vPB4dd(W6izG#f8>XI4@=KH zntN2I#Qp1cW_F#RdxwpMD*mKD`%c|*=dlPyS~!7&1;qGTG+uc*o5<`8hgT7SxOE6R z*@+?Pz-UYXecmstggfs|zK81+gWJT^Dt{5ri4?)=-2NEwLp7HP2Q|9p4&DRKiFks- zd69oNCbOD z1rgT)#%9Dpnr%nYM6U(kjn5Olirf(9T)q+VuEoBb0NU+p*5Bjpm;HRQlC9wW*gVx)J~yx~kA5xy?R{35m!GWU`} z&()4p?f3w-A_RK-pzV2+?(Y?XU-` zYvy*LRfkezwcl!%<^|5L zdW9`4SdU}_{Dz1ZUQ_OTZM&}pWu`r9n`^JcS7_ChMWec(+_9A-dOFUO!emLwSjKuq zA}Km1J6OWyMCsjG!}R!0?1%f7+8In+C!_ksZ68Ypbc_C@k_ zl{~_Tj!?obh$z@EP8yRxF+Xo5{Q**`X8!wrmN>D$;X!Uc`@|apalQ8K7YQZ;YPTUy zG1l^}u2~r@^v-9s;C@+2^1UHCnCbW01_2T)cBemH4GZ`l4bF3UTR+YOWRU~h0>gPb zl{by0LbuIixe+hZ$gRlqgZZ~1DexA{=hGJrQu7#df!EhWw##VVsBm4r)6@+FE9h*z zKFDw+(Tvs>)`C92#9~l2YViB8#}Rk-s;6x7Sx-tyxPk$*tFUg8z#Ee-@<71-nWmuQ zbfv{D7{oHUlUmWe8H?QS{s}X}QP8XIL9XVU?C(gNGC@*UfoW6sPyyVkn?oKQHa4@h zTlf<{pV(~gotoF&Vfq2(;F$9fMXz=(sBg>78gtuyS6rD4j#om%(!{LxggYI5O!zbJ zLx2?M->}=Tf-HAjt_VccbEBP9a)r(7iM@M1-1>f-OH}pK} z&g=x_z}nEZ?3|j9ADH^@RA9J)O%yjyF_1c~cMpxG#%oa{RqegYC>v*-T9{A#^!VHe z4554ZoaUjjNk90{Q?D1Oj^IUUS_0Ut3IJhNW+R zKtX+%$nCtxka+(cA`Ctm z&8G-nNmu>XECdbbFOZ;qma2;XzqLp|O(eUQCss0wy)xQlHXv*F5x~f9#ay%5RDZ{r z%C3|xDZVN!ct2dG_xxjG6JY*M!(@vbbz<1~*=9FpV`&7Ll# zAI=zu{uDQ)iE>WJnYDc8Mn9A!v%;}XBfqI z{kF24?q>Ak`yE3kQcv*J!j3iseV?(l6kmeA1S5lzahrerP-x{jF#tBZvqV}JfB1j= z^^PciRE$S)2Zzan(e5xeMQf^Z_Y$Agy7UeZ=m z^&yhw!6HVY$UkB)%SKr1EjQGtqBeI9YX3g|%76y=rcF z{^u!#H1MsNo(BpOIY^l)K>%MUFnJ8qh*#!M(QFmijjAZ^ETCw-A`ghLf&YAwW4P46 z@XKw1Eb;Yqayw7|E{Ipa@$oRocq41@OlcBhnz?m4R_xIeqddB)p5yof^tMqOHVL)L zU&7okJr*n-#8>)q&~sX0{5Z3%n9fZ5h0eOXNqf{B8RYUnQbVz-L9=z^DbDRjN-@9U z6;4QI`x0sI za6-fYswp%%IlgZQ6{~RnDo&->Jv&4=8`=>^q9BHlnaT}qpsxW1qCXjwYY$(y{; z)z@;5Q-Y(BA}M%&-W8WIr=S6^&l!Wx?McFkoxzlI(O@a=c;hoKEh79+4`IE3jV9RG z{(;SvhYtb761lF);Jc=;yx=y=VGDs?S{9g)<%3g*8UN)I0>t(;cwESb<>nkOJ>V@& z{+U!hwn)65s#AZ>Y(nfHaz}vZB{seYB2^BCfnYV0;8tvxpvs+)OtOb4*j=}r=Bp{{ zgP3UnbltmQ5kO8gS#rV3N*!ouc%wfbYj!q@XE`AMHK??BJ2_NR1QkiLqn_-xlIJ_`-==@r;P=gN+0^BWFJ)#o?Vj?VFyTi!0H=37 z(P19cm>=#B1WTKdCB5(-h z2^$W&Ed9xujaD>|CVo3`;|+Zz_HbNmO6C(vUNpO2|51v;(l=O3zO|=omGdLe;4)KI z54!bhgWy!KzA?qf!Zmr56xZjEkp|2f>yu$DIe}w>^~GG2K(ca8gC;FF?h{zgxGP!b zHdJ}v>zWe+mnz+Vqc;+4~dZad1WfXTga~!8WK#>gS4W3M46Mc9J5G=s8lPV3IIx)um zd{maA(|0OTEge}?{V+mf?Q-#5TNJdK?7!s^n_@`Dx=1smA0RFC53nL^987?n$Y`y- zoUV%e@^J&#M1F&F&YDVop%A$P%>lo9vy3&7M_VvAd#Rld1h;HJtc0Nf122OF9AcUQ zJa2@w!<|=&^$Ez#V>eTozJ~zg^x6saXK~M)30HFbQZ0Mscj_Sw6JZ|@0bfZ_b8|MY z$;)aH_tx@aFa;z9FE0Dpx{JrsWsd7~tW~5gKRi-SSG2D+NN;o#(Hzj0f+a6iG?DyC zgIsJ@Ofw4Gc(KRs3wRx8#1*O~OLka-O-N$xIaz9?=xc>6od@??FnqO}8avb1J`-H@ zNS+MfKgi$8R_njV)fMUk_iF*PTf+><-w!r-9ZD_|Q|f+h(dWOo2*vW~0z%2nL9PIv7jq3BW19MnEo6#N%qr`%dtq7stA%?71V|@3ZScmVh+TPAnkB;e z-pWjnSgcc11ZY8ypFLna$+iu+#h~hs8pgHrG!f7m3)p7oOwwxp-m6BE+V0<2qg1B) zm*!ymY&&|A?bVu}4IWOijCE<+a=nkigd-Jptwz=2C|*xq6VuZW?5hL!T4ab+@u9%M zr#77DX0F_PvJvV{qOLE-{xvkw_#tpdigQzpzD!I%6xa_I%n|aWCC`cyuSk>nixO*- zBDjkqH?My~v3#)l^m&}qsQh;B^*r`!?o&w{-(Yj<2idS!=gDN_5#B5}A8I9I7LeCE zxZg~G7yyog*@InGj5tbjAmeDM%>b3$Ts@Db;CzGuU(MRHqEn}}S)%d&FX&8MF3@{O zyf>kFn7dTy9C*0glGAe2`QMNq-vDEgkKRM06g8$L~ve#SBQG zC2i%psYkrUzBN~|HrthrjVogWx#sd^TG>T*D|C@_m;w*ni@Ju*vBYohQyL*Yl#2mf zlH}$pLt?RCCT}ZeBT&QM)2L;@dKAgC&=xV(QJy>?>PeucSy#1bL1G(S+`6rYl>TXu z+%{pMc77|OCF@SXd_QxeXAAL(XjPQ;+3`$d_;|ea1s}7ecROM|#8Ue+qd&tKk29?O zDUf_cr%NtrL8K8S~|~ zowML@C-8FoNa8ZVH=32`4d(d(ML~NBz^;sP@2&`l;E-FaU`5;fG~z_(hghAvYkLE` zHNQ8RwZQx5Z@+0{9?iFYNSD_wN2YUFRNo#xEX=M_O6w~XYaExzS9k8lJTGcoxSr2Q4x{9ZGn5Z~UawWhS2-ubp2r--;6 zIsV`K!mA0+&e6~U&s>kdWdcWT854n_;^EN-&~?R`g;7s?*HWAeuKw!u`$MPqS#yQ} zr?WDaO!H7D_eIWT+qB0(C@;^hDYN=7YL-%4a8luN>BC!f4Re6~{5*}4wH1Y}SLyLK z>z~n|+RaH*(88_eTOYK;aL+n&&)73DrTD_GL0glZ0K-<0O(>`K%~N>x>Z==@-p6Aj zcHVlVni!bkZ>vWbo^R^$%BtVRx4^89?OV&(+C|bSfmDLWVt+jZkQ(U<^;I!fsTuXn zUDO>*=$$7Ns^#_t%S0T`Seq!0KE&ySwb{x#`7o~NdBg)40klek!0*pLzOPMpM~8MP zmq~P<>9*tKi(}QKh>;7sKGMnyXq!u{EWshJQOmm$*;f47eJT&AdEH>5p8fOZBfZ|@ z+bwQY-^8#XDes%nkR7I|9u1=iBI5SwgZJtKZ{#*{$rh#9u}T3|tX1f4F?T2)wRh1= z?WmQAgGLh)3zv}b8tiBjAe{3ZjCI4NmlDEU(yVAhgBO8%)A zi7bkbUZ`|v33v)c#}$r$Jj*+c97DhOk@4NAYP7rbHBl08R=qY!0cOOOQMy-Zb*1h_ zenkG2T!5v?A1d10qH@002ihtkVO0oPnk5T{AT@F@pPjB0`{?iFn7YcIcFwM#$~}Tt z1N4&)C6qb){NZ_N%#M;h^?mtfd3Jgzf=Q{lbmrO@>C!zo3K~Zkvs&;f-a_2*m?JfA{-0^(%5flb_9f-dG1U>P1QhukYn^XTahern@c((Tc zpM2v88xE|`N0UX(BtP~}Vr_ZTQuA$1xT(aP*&xz#xac6G@*C-z(ZEr$<5TMf^0On3@4k!y= zy;unEgGNgbqpckPf36;nOs+kR;Dig?r2|tQ*MR;yXZ~_KrfwFfX03R>lXshVsj!)| zz##x-oCqil^jt}sPT<^F;EY`=75IL`R@)@;=b&NprD{4IfO?YDYmn7ZvqXH7i$_)w z6`dv%wWrm@%vs@?y#?;&fvR{KkCwgwjZ=qo$XtRly@WJQV~)7sPjmPus6CeWn2Tk3 zC|;cy|4t^uC#)l!_nrUjk29i87_y`&2U@DIb56T7k;lH4Du(72nDvDa#k!1(Ee_yx44I zK(#TD8cXfEM_IqW=*1&Bq4;sipT0l`z}Z&5$=jO)JJT{JVT18C!7s(he z;8Cnf#7}l68$X)Fsy9517wmp&l-rVy~$l1NZ+V!!CCmuAzR3IBFi05MxEcj94p(64Mj?^B3sGQp4sBW7e6x^ztn6!xn56_irgL-w5VB06_zuFS+C_XNaRa!;Pw4-RV1Akt$&#$y;{BASm#~uH=9Giec zmiLW)Wlm^%9;K2{?s39%*djsLL*-9yB)B-T>RJ^2iI*d2aAdu0aecd|$f9w*ZQ~Fh z_#wuxHEzVVG^ZPYp}cLZlM5#gyNgLSZo*+vL{pMfl-S!oM}ogp;H%>tRl|6Z19P$^GocU(;aX%w9vwj#O7 zotW@tpT70oZ)ICg6Lpo5JB4P4IMev;f`v&zfVy1)|xipf;z?<&{tA@6Ag@gOK7HXv)pYUE8+khkrM znUwJCl1J(p(Mtg#g|*_)C8^iXY7mqYD~#$7E!nhQ^M&Nh0iAA`P4pkL%H>}1 zC5l4j1puHA5R@10kXtjbq{qz_4tgodjls)qu8usaPl}QS=9KV8(y+)gLC6{6za0X# zdG}tp`)Jx_$aM-|KB>COCHXAsJvUM44l$|~s>bfUi5Yi48%NGJ*fVVPKAFZbuhCZP zFfQXZHqBt)UT&Yuzt-w5ieUQ)e1nJWCR9_Kge@r33yXw63K0)t!3=a zR+&M=rNtW=aO+RVSGJU9{&3OTB0`8PI3>#wl%SpRQ-Jyu=maF4Sc z0&KPk+meLcIyxJjMm!nBV^TCRON6Rr5*}Fbyqc%nVX16kT(>BhD6+-DKnRzhI1xNQ z4hNjM@BIZLW&n(|$)j!?bqR4(Ax2gX8x-Mu+nUceTybGn2d8t%#n|t&(NtUN3y z{>)S;F8*KP=O@;C7aM|j4h*``=hON5t5kfrv_o4vx_TX)R;O>t(~=$G-jMiYlZ zN({Mwrn)0HUak&XpO=G&of7Q%P8+1mE)mio*IZMYjStY;dKc!h=RtnLF(W8Qq)d)e zlH|WyzI!XqLZE^v*+&@jc?F}%lm`0^#kW-eUge4_+|-r9SUOxhk&|nF>5N1}CB^#iRl96^`tyHFD5la()hx#+31qGdMKOt1fZEOXyZ zi>|5^JWypdPyKsKIxcPRy+>9-#19jYoFrU8+WUe14Yb;gnnpP3(FzXrf`Ws9@vHgY zPf05fh7(*?a+@v_)&i6z)dW3^(vr6EB#ouglzUha*X0BA3?TW6c=7EHj{vCS#K8Xc z{rq{KQnQ#Us}6`HuY8^3i(Pef?e7ZJ{-FH}?)N{ez%t{+eOf@3wwtwhNKO{u(dtG- z*FeiXQ203r{z|L$DoRb{^3C*XV!7@7u%lBi2xk;n$Xa0XLd#AwTt-QzRDhv z)P*0XL_~mMO2;zhwtjJ`HFNo8y|EXWDV@kZ|GDj`L#xQO<6aSBD@OD%eldmBt|F?9 zvn6Hi858NSCwU4oe(Qu}9w(ES@u>|<)!CghK+T9getSsp65l?EYQt&E;^S!1XlgM% zoxrQ3TbqyG(~y_*5RP8|ss>b$HbErh=@P6M)qDsmK9^9=tJrB;0%sP2^^aplwqQ|z zD$r^HH-fu!&rrJ0jETGQQA)9hYHpYSwnjbhBE?gU{ojn15&o~jIaar#2 z*G+Qp;w6X^Z6~#Ey+f&O?@nv}g1#<7KgWd{wk%>m(%^Pz=b`pk2cCy&5?O{0ycn+}m z>0x_)G|JG}Q|-NG;PN$lk-u|8%!BgVyOVOe_}BRDqBM1n3ruEzIh@Avs2CX%7L22> z3+Q0TKuS!okh2`}!8dU~{!w2=d}iDD`ad+CWmuDc-1axRK@n+&qM%534@4@l^x#3O8rt)4u%f&ud01v^6maO-R|Mi$ih~lxKMKCj%s{q(2a(r2_-8V_?h}@;ViFVx_Rq zh_l^RAiO)%lL_obJ!#W@QyFn$d-wTUKRjV{@wgUW!eLDL>6a*kuvQ&9Fc^_Tf!{ZH zP43Zk!_r4wZ%9*jNXOm-NN{M~bij)XEO&K zQ0itzN1YYM+@ne*YIAuVrB3lPM{8F%W1yH{&@;_xYF@$ej@B#_{XOb?K_IujC3t7f zS3Kp5vXSz?7FjN+d@CT~on5bhgdjZE#qN*$^x zH=97b9fOoCJy3Ddl3;H89xt&Qdm8RJ| zh4jL&;2~?TZ)Qcx)^5hmXn%H~OEW9o-_mdnw2*fzjcWk=xtk-Ra4UWNiDuXoSd_Gd zTDYKFL6nR%vc{uO!$BbS&q+%;pl?ypYj>axX?+v*M}Z0o>%nIY9Q8G*z7E9#xtB<$ zr`mstSKT2H8=JN$+w|wgk(AA{xJHQ~=g&?1kWBj6B%DI^`Dc9Wb5UgWz9O}~aEJPS z8#5Y*oq%)YSFZ(8GE*h#h2P}Vz4mNes#?|C3~N`(dVlM1T>mOdm=kKHE!I{U$B+AR zZC`UAcrKkALnOUoP3Q?7VWRDdAt%SJbP`Dhee#in?zL120kI?S8)Mu~^9&`Ju^s)D z;1S7vT@gniH{fCK2zw5*D6}BRxAm+*5CcymM|r1Z<}pSbhH}At7^or+YB@MP3iuZ$ zpy|vtl58IADsv=sK!^6X_;a(}-1LVy;4r~N(q|)rTZy=HE#eK!V>Lg2V(7P=F{7Y( zOI_>E#Z%CXjxISt_87=G#c?(NyXZRz~#ER#tkhaB2vD-H$=qyM{sksL0M_ zb>|9ti)7tayNXQxY`otR!wVh1C4E0n(ZGV+@|qwdIOL~p(M5wt3jseuox8EYcz@ke zC352Whs*O-)XXK$uXH3x6oE<>NP9Jk#buu>lJ7|l7*b5`oaV_(Vp?$0t{ zmi*8To57Vk?h8+RaCz=8_vOEMTkD&xzVDEH@c$ot>*tujK~kd<7B=)LQ9l(RM=gET zznz$o>Pz1DD!)OOHx|D-+_!;sg2Qr49Z&5IE7h|Mp@B@{>`DR2n)QB_#jA}dIMO%f zczCl_KX^jfvsKhIo(THN?_sxwYM++VogbB1{(ws6aZgQ=rB5S0649ZbDfS)+lT)QA zP0F~65q;gc@%*X45p8eRoFo}ip6e~JPv-qyM&r1KIEV(#(hVh0)qo0G=rLba&|D%4 z3{q5yhm(M{f<7;kLA(1eRLznlLRg^b>{Rw1nUkWGqdB5px%*#G1ZLILCGs^Gy{XDY z`vmS+Yc?77<|<5$ABxSlY)c)6)BDanZyw6QN0z>PqkXM2zQ^w2eLh+4#VV8j1e2D| zFQ2M^z6-`#b^)BudG1=>Z{INvtdJ3YFuU&ZXI(>@q2)7*zw|c^W08_~j zyrj?7z^LCzn>0O$=1td;(hdYdXHRbf+=gZ!wQAgWGw?+LZa>%*n*n)EeN~~y7V>~% z5&-X+_yywAX#~I>>rsrp%m4)Qy+%V$X7O6IE6F*f-UGk~*Y4MlRFA$CptHH=#ucC9 z=!CIV&~3jJ_QYzT$$g1kKJ0-kITg1e(BVc?PwLrWwGn~|Mrp8H$fRy7OK!eYNH&Ri zch~)4>Htry4+=!&s$$L}m(m0;lt~~dw^qO};!2;`&-{{xTGL8h)|ADyw&RGGnCjF; zf!%zZF&F#Y}d^%tZ3oDtpm5Q0v z%3X51S?Ad7gwCAynGtXZVno8M(+_^DD<*~Dh4v_NPQ)UjwQTv7zj=?k!pmYVC(Csh z`vt=`_!Sm!j}JU7&WmA@HJd)L3Z#-c+62iGztbl;P#8KauN$IB46j{$A;FBQ!196O zZ%)N=)0z`v`n^p>;XZPATstKB|L;{;g?{}Z^B12_a7gCeEI!HaYc#@JT66eNm8}V%4Q z`^(DCWZfi>I29rp4O#B3JqJbn@%;0ki1LFFXluA3SHY!miSmPq#x4s%gBm1eX!z@m z_A@Q5;6W`%_l?Ky_Ee9YJ|#*p-o4kj-8<*6f?q{kGQ@lO5faI(Zo_BlQ<7@pZz?kr zXU{NkISy8&MhffBQ!dfMpY9dEhMZf1+}w}8yyY85vlAswn2#`ueWlElp`jkUj@F02 z7gl?50zv+8=xuP_RjZI1-)seAAypwr3k;BqA;2Iru)Bv)mcHKRK)*K3=dW0p363-| z1{SZwNHKkfSM2W7U)GO-x4H$mWK+DYO!Kruj7%)%1{7BTXb-$&^32>HZy93TDqNc2 zP|IDal1J|$v3t0SKU1v-0Zd`jO;B+l(blOv;mH7};+%d~K|Gskj^&5H48AS@vlpb3 zqxQEJM;^?Qzjzq1Hl{$*`J-s+#>HHhs$H(|tJxQhP&wSgk5#6G%@%66_nV$6tap5OczweXnA<XZH9ZxgQRrQd$0$g7K|D&K8MEfKflz!jP9tg+~gEs3EX*VWnw2>AU{q0 z{F1kqtK=jSy*TLo|48jc5~C0CPgy1&qyVvvM}w=!QJ{H3xi!CAup=}6IuAtM#S(2` z7NsVYK%=;!bXY2v`SrDUX%hrWg#As{cpZ^HioBe!fwhKZVF8(U)Bb>O@6mZfCQ(oC z1{vL29pKewC3Gz`*xDN(!x2=q?t$P3t7(A$6lt|>I#ymY+_ZE1zg+qI*{V;`^8mH71%~cIUD|k|jT+yYNlM zgb8DZ_qpj zaw#IqPkU=bwqYi* zsgce~6mo>I2aN^=-o>ubLUaIUZ*>u^WU>MG)G>~2tEAPDGjV&+gLVbNK&oy~M&O%6 zy);T{nwG499yq>o zBR~syug5_jpx|2}>=aqGgl|8&N?-p}r=aZhvgfesyM_t90w- zrN+q*>U)yU&xFQkM-JN6UzA_ElxI)gcWc!Uh&brrf(470uO1y{c@6oEQA^HO<9+|S zA{%Ga0j4eMRMhu*S`O$4J+NU_Id~0w zwfc7v_83QnmVO^U*znX0F>%kYvZmkV8npL;!f;7Mk_32j@N}x4Qp4?izUE^ z7LKWnFC8HIfkO!Rn)qzvIKkC*R;)=xYV>mS7(7CG+7aN|!7Ud>U>E`6B?hKV@ADY) z@*%9a_e8E~@CeJtudqvdrUh~j`1{hzo>4)=h;iv8R;UUM_`+!*&Kd!EW1tP&)gXKJ z&Ap!}RnF*WDJb!^#n&$Z1!D)w8n)L1+ixiNecZCiC{nv~MRRyik&QlxwPh(Zzp3W8ejwJ1Au=_KCoXPAfW_WO&T}ND{wYK0T8{I4;X~@XG=p& z`Tgq9%+LK`I?d0TE)peKXYMRTNsb>>o}U@-oE8Sj(MDYyVMQqKb2{JB608Yk{F=6Y zs9lnS0Rma z%bBVW){+%MfRoO9^(`v&F(sm+aHZvawJ885ae=C9$Su5}@=VXlSGaGEvT( zr4cG6qrTG;2)wn?pwCFnrrnW-zP|z>v_Mq)&|--6rF{Q28ivJ#n_8^Uf348486HI- zl{GgIZJxFOzDLfL)~Q%q-!?IGg69jt&mDp{9I(iTHZ5F8%#3iZkhBTC;-iM5_Q?)~ z4_n-Kk5>v0HDxvF2D#zcyTw0k(gJ;}ORY`!hEyOInS@fUGxnN6%yDhs5By`T!=L^* z>&sGWP zSTOd^5Z(-97JG{S=0`zX7AcG;0zz5p_s~0IA*bx}%FZcaQ>l znHFB@5h&;xr&Alw_C&Dz6P6zVGChH7Ppf}hx}y*fEMym$XGTmj>8cvT*5Qou=@YsEXH?GO6t@&iK+&<{$6l*|^Ukad}!}HIEAv1yD zU-NFSG26+0$BX4Orymn%dX>H;>m_avrKWuX6BII~t4I>-#Z-i;xgJO}f3)7WmP`W# zEh=ZyH1SsGWos7obS6n;KFnVsm&phUT)X{#7Nb;t{h-ywO=viFdr9sbH_b31%W81aisXhy#(9HL0n$WXk%o9VL`JR7PqwYY!rtx%iku5``{wv(H7V8 zLJ)YzOUKD&r{7&;Z{+os#7#zc>4JjHkxn7N(G_SwAHsjiIaE=;S?Y-zHpB%YyGifE17R>T!j2;Qw$y4ec z8LKiiK0z*GFIlV^&4Y|DNr^kRGKBF9cT_LK*_8m(Q!Om?S3YR8PIpOC6(TT`>QMX! zCr=|S3Wa5+KwW6QjxTP-|Ejz|_TbwDeKmJgdfk`Wg4#bl*;V#C7@)X7LGVW+-T0eV z868ASpxf!5hoV4y5cbh@gA1ekDUUhkga5@DatF&cJqEEMh=QTlc=9swd6HVdZF%yJ zGtP;98uCJ7+2-#5e-+{kdBc2DPUe0-l`3+z{j1t|jlYaoJOwzUFV$u3^F+DhF)lfXe)X=$pL?{`SyM<8NMz3ZT>Fc!&TIZdpMD;$ z(hW#{=_&g}R2T)dAW^&`-Ez7_KUpeDB5`%4Vh`{s3N?i&%Kmdbo?N?uk0L2aWRr3S)o3}t>I>Ru)iQv0>!~IXPaM} z#FLg`a2$clb#R9Z?2GT!sj45M;fVGtjXc7~XFkdgny)T>Vxbm&RWU%lO<4(`5Cjn4Bt)0QF+cm7`^Y2>(2qM_jO%jPgbq=m z0t5qQ`g8E7-zD?P842qrn(HsG?UU@8nb>=^fy7^h{2vkum51*Q{X4>!yZ+jLEa=x; zb+31o-PF8%ibDU$r@@in-#wYTuSLP;lD%d2DEScNZ$;*~qGcQVhttJlMZXcBC)38p zPpbKU*lT0%4LMLlw345d1G z3h-Y_88I7gNc=m5YTJ0Jbv^m>UXZ$*?YSB05L?`_E`K{7{Tl@vvuU2T_MFNyX)7j_U6%PCT_F*!kzb)?{{jzfKW9*?j3;u z0ydoouHyMkQ&5pleU&XR3b`*985h|cF@dHOh5DvFY`on>50E$LjI6*)?LJ@snpVSr z-rE52!_>?p4~m+b&B%+E)1lR|5Fohh?XkR1SBH6J((QNr5V7FI#;=0EGEl3O*{1vm z54~r{4&D!pv&QD~emUK_^^5<-Ti%(L7BC5Ds~4M(hu?wLz3nf}uk;%iDH&wtToF^0 z_q*1iBd-+&TaEa&w8NB>Z@3D7VM=R(G7KVvIkKGjY@k{6+aSp?1+QqS8q1!qyScP= zTco2wB^6Dyvn%EywNuGI2YDM7!FboJl-ikJKGoL%p)4Cajy(2H0SDTh~ut)F?Zy2WP9YMfpEp6I9j^T5e zOdIR3C!bPVyqjefrfH+^aOw;Oz{S30GVsaC?%D?raTC7Xgt=m}WA+#UQ7R*MO>&d+ zP@uP`&BU2x9xRh&OpkKfJpTj$Mi(Gv2MkA^^ZG^sdxFURP~2g*M+dpDmG^|9l^5+c zRk&*ev;df^cg6Mdi_lS{ZC)nHJRY2Qi_QJ)Airyh^Sa((vxzR0&twAr@}^=t`Q^}w zm4y^><_G);3i+aR&x$la{Q20@BP8A34`(AG3qp_kKDcHzvc1_OQKxKrKyt^XU%6hr zDAapEun@(=p%g|X;1k%RZCW^B;K|V$IxEcWlJr7zXzU``A_tx8Osr`CkV)}j7S z+Rkd?|9u_EW+oxEqxP)N;5O!!)w4K327!IS6Jo<6-YqkLk5v}tcPCt$PT>Jj4RFEh zm^MYdnm5=e+ae+-`?=bo`G!}(L0L7&)?iR!AUopwoeYI>L#n^uv>lI#iMbIl=sPvc z(`S4g)aB;zqn4yv3Vc+ zzD4X@=duRb9a4WjmM`eRy<}i7YLprN#fj99_{ zwyto~ux<8}7NHfTsi>Kc5plc{iEEVm0io7y4f~1&*u$k+yO|iMZi9u$$_*NXHojT` zSw2IUxNaHdaSRf|uTDvSa~DxiPyAB)c2*i{T1Mdfl(&;HJX@=;^yi^gHQg9r6$@`C z@MAsgcjD3+fWZ;%&O2RZ!daVxQ0wYm9uY!GVa{W=&~5qEmXs;DYC0oi^Y`F;0I)Cm z!O?%(o1pcm6=ug67ku4Kg*O}6L~{Br-Y2}X_!Ln3trowIQom6osg*jy$Jpz~*J`u= z6ZM=c`r&iz0#%JWFVyr3wImMw5?p)UP^omyyKFO5|Dh6HYIxwJV36UQdFJkv6|Z$y z{hIbCU&gQv&pq?^T?G@usjP>NZwup`Sgg&AqS`KoeR5-T(JXB9EL>mhX=PZTrZWyej&2?V ziw-h%h0WaDHfEam0^&en{)y;UG9)Kd)3ji;2k>mKIj_YfA*B`F+yt3Bpw-+5#elJ& z-UdKojPr5xM%6A;l{NLrpAI+C)BW&(^Cm9$eI9S?;aG115-+R+#@OmHML|sT8g7|| z4xeU_SkAm3n2-eaTTpsHrDTlR>`mvfS`7b-z`5*G&bRbjmu0nLHg7Gj6HmPrFRgeI zt+Ri%iDi;r2EF@gsP3gNx}(T4f&LLn2NX$6{wYJPykq2*FzkJ=jF$cEg!38*rMQyU z0f!esN>N}o0Lj-V@mCc(N#CE+Db?Tj?dEK_T`||6} z_6;*Y#N^SIBeI^)#rv%>p#O7sBTIB@Fw&EJ|5NX}^z;{}Y}@j)ee!c@#cyK`h5~|! zqv;LO$Pe__?}oFdV#u_XuI|+Aey`L47M)4wJ!&FUbaM&$)z7dG9XY^if4&kZtd~>y zBTRlCM8lS_C~kS^qHs*}_O00!+x?F=KwMF0kagEh$T#@NTAmL1 zf;r_m7!h-&>GI|Tga-#nRwS`LLS#{0lHI6q{beTPy)^JCe^0C?mc}_LcUION;(tnu z#Ac;5e32gQkWe-kGJcCXtJKT=3OhCA2Y9?4cUpeF$v1It*yy!7IMNFdYFa&RY__MT z6U@Pf9XjPUCldM8YmJeFoJ!&Y!+88XGD($`XMf650XNP!g}#sPLfcnvoO67Z&Ik;$%Wv0S`#GYN|5r1wA>zm<`8UP z93R8ka-1?*PvBN#WMkN|_+RHaBOFeJ){$OMI!-ZvePVB(2OzaS7K{UOz||t`}ucORH4`xZR|YZ*-Fw`(anpn#r$rfA4)f z6BB#Ic)NbSnj5?js|69N}E$Xuyg+1!4%U=}t+?>dMoVX*%MCqtQpNZGG zDVK7@=cxnmWOB*V|0Ux7hClo-YvjNeU#A?L#_XA9q3Lbe+nR5Fv58=`sZ{`RxHUX+$4 z{1f+CZ}PK7XsU99TbOpSw<|i0wH@#|NSq-Kf8<|8QGx_b@xxB*_0Y7 zdhSd9I&&stv?f9kV(Dk2=ZEosXmo;uS4&{P)>|^vX=)o@NLbmztyrPIBZVA=tOX~j zx{2ue_S@EMp^ny0cGpG=*FPCsx2zbs5xXYz0ArNe2+`Gniy1e-E-t(M?MI#~%tbQ+ zIp^(BZTi~;SdkU2rZIx!u6E`T4?>cpzL1$upRTS6 zSlrv-&fF!Zx(aLu8{!czuLM8+n!$XZ1xx-4!#%_>_JTJJ5n!P!2X4Z$^8ne}Ae!6 zY+n=>xXTE*l^g9CEI8-);rFC%ZuEYW&MFG@xBmoRj?K!$Nvze=c|>2JUO@VEE4Q zgo;8r`nCu1!PvT~QAY6X(+|5y-g90<)tZsbE=u~|@5cVxw*I%;Fnr%xG3h;hCPId< ztm(yyi{-VuqN)G-n~^NQuoy0Tl_!>TA7%<+Rqte{3XM3GqPY6t4RW;3^4db1=vBRUc@-|IoZu=L|97YZ{~Pz{oUNL)j}PO}z)Qo2*(7iF@Q84! zYQ108a?&@IO#9D8c;?Ch6}yvuU-Sz06jz1kE@+p+#;U%--}|{K`0Z{w1uvg7*-)S# z(h%jQL2(F1@@ZCl`Z$y&QZ9j9*0T0+-S8>c$R;ENHdzTC$0bTDrU4a6Op}b_pDF&T zqR!m(iS2$Wm04W883^Fs!7{I@)YcHdHI)I@Iu2s_HwJM_>*V|Qqu=dZZ~5useWW$3 zE^}1ct?Fwn8F#Fsc%0{)4CQS~Cv>ayXDu2D_brAV#eTrHH3jLD42<(%Zl?`-EqI#h z9@_K?_6@l~pDrm>nK{(D{2fd(p%M6Tm`+dUrXSMM1L72QM86TD4OM9U(*(fDucrp+ z*sVtbbvt0__6CoIO$EF|L(@~>?zK|WI4k07L)1G3VzLrkhapa!UHZ!E$tI1Z7h)9J zE4j}$m;)CfxL+)@98qirphVk*P)w2jJ#-ub*s?0kBnv&lGMuUU<(e~=IuXYG;h~}i zioAYQ>wMSoWn<16+L|CO3~sOBLmkqD?}%rFVMytT%-AP-5EMwgS5#UblHt?W*(F%;pczwRFw0AEF85SJ6uZX^g3f*rH z+_;s^)~|-^XK!q0d_et9N+|7w>ejW5ga5{q>m`Tx#Eyhu9rxsX>HJi5~ryJ z362YI-U;&ZXF|cY`4I4HDTelht3CYfbSkUk5sGYGy6RyC9>%ZYo~N zpui))E>5Mx5v2}Z+qFI&777(-kPHy_KfSRVQMGBOsI;_6wmUo_5Yyr2wKkRF^|UU9 z@tcvc39a$a#WhyWo-!0HP_cL)E<^Xq`{#YS4gS??C$cmg){MQF)EC>&eC3~cI>b92 znI&a)J_xeO32&5hr*|Pv<0q_#Y_3z3im*_z)mrR6n>3((5c`UBFV}CJ3Jwl}#no-eWk z{F@AXxL|Y?sCK7_RzjRcB|~~d6u)nyw8Nf0-ny+I)Ov&=oJ@JAry!LGR1X3=&bGHV z4F8O?fWiyw_(<^+rf=>9mluNkLTR&Le8HI$*ZA(kAPZ~T#9bs4;Q0D20`M;of<8P9 zKYn)T+D85MBu2bt@NY|wE8Y|XaN=rKlSCWX(H&_aon+*XNQ6fgy!1n z`Qvy9|2YC$9qz9kT4l@a$=p;&>xhc!Nie7REv7WndvP`;j*V?tZo95_Qwhl?o`2+{ zS!%d{<=~E^`cK;-#r5vOh05k9!9Ykg*W)7)iixxFh&38`-~6_~4V(3#TFe8a2#T@+ z^p?S0I0uADrGiPZk1O$>;`j;tC}t=dD~$kAqj&k_sa6i5hYMav`F9!8wJsqgn6XOB z=6pF4Tw@SV*>(Rh_V$pm2lB-f5hQ$4sb3z_hrDu}=anEoy6gmd4)xA{cK=ar^PirI z-v8YDJfr}l5Py=w8;q;%7f{~lxNna*!FM{D-Rp(Vq4Qo{KlQu5Y<206c-VMjPCR+iZi&4FxsVvrRJl18OEZbzRkmC=y*n5&-vc1FixVbyFXlnv;`9kCuGsEWI31pC z;*Q3M(GZpHZ|@H`bFk`|n-Gn2#<1@?3@x%(Ji_;dc#MtoK6FVMsKd{AUlVVwU_e<; zxkChh<3XXK!24;BF2km;zbECiUw1efHUv4`$(to*T4+;NtVf}c6N({4^u(CLq1f5J zTDuvOFFwz`q^*Ll7XVZ6W+1v)Gt3&_;wS`s^S^2Q+#S zW=f_{j6maxHuOoqyDbb5aCy+m-bg+`B(>69sj|phO*5~s2HabU;P5ayS`5C;g$P>< zFj?V^x+aIDN84}2b|tgNcPi8ulYfF=pFdRM_-L;dYvxoiReD7U1^wmi!3AT<<@j89n>Y(N~ z6pWWb|8o;(LTb)8K>@emgI}v33+=eynR3bq7xJ85{~e#G zh|k?&pEYFDS3&Wvwq^AD{UDS_K4Ky?46Q2TFWn@WS3X~A84D8yK9paw>TY#DJalr{ z8xK3seun6jD(b6hc%McB)GlLbt$dnz`fL7vQh$w$n9P$@Qa7{6%_%N1z~~@g4Pv-E z=~H}7_oHYA*meEsrP!bH-RhtJP&~Vm&1j0Mv>u8{%l#BXZsVuFE%z-N*) zCfAet?ep?CR#P71GLI@)C0PEm)%&l|5f93q2Kh|ZByHf(2h6(Z`>99N0U_nnuk`bR57tlQA9}vtUCnlMUKu(MdaP5`!2fYZ z%dKS|F6sphdmn}$;eL~$*_QvifeM=Nc}#+k{PIaOQcvh`|Krl+(=R{|4Z9P)Jo>lW zK!x+jXQ+NFbk+>QIKcnAOTRhjD@A_UV$1bh(G51yoER8(`S66JdUi>fg~n0)5>Zdq z^#Sw?0`OFCxp~NGBlAlGK7Bx|Ryhm)^rp7#M+T`7*YkF`w6MiiPFQkCu03G1(@3ya zG&*vi+(TGgmTm366?W!vHBLwHjWkkL8MThDT72~l&-0TYwywrYrF-Wvn6Qa;QddBd zyYMvrS97wQ$f&CNwen3ic&8|M2lr&OUwi;q8E%9Rr<48MR~%!^H_miFRDEUr&eWC& zHMN|2ia7JMJ^kqrr?@Erun?Sy9q2jsCphW zaaU~)?e~WSy(u!k3N~`by($_+z;A&}mV|%-5Fld^a^33#DZeXViay1 zg#*-3;Ms5N*bf=C+V}og?Bk+DhvH;X8#Y4=aPMy+|6#}Zl2*dw&u|{7g31(lxa}T7GCgG0yPJ_6X4zxAXFt zW}pSW#U=OA;^QOz@H1uQgiHF_>3mI9N2+?u!a1@+5m8ZrMpd@Zvj9e(&Y;fTi=l_R z%>+I{NZV~uSj*k_=tHYg=c_Q81<}m_v-jhsR#6mRwG0;x&ReyWq0an)bg1_kqk%LO zg^b;8Oal@SwZ~MAQ&!W*bNzyNaP@nlx6ST~WD^ET`IiZecwuk*-y5vqh_!WrmE7k; zdSc~JkQ+aVryBu;IKAV`EpPSHzQH@+PzG&+9Z#Msy-Xn0$lkm+G3PJH*}eV7QbSo0RbTn+=_GVXy4#k zNo(qAg3mtjUVr2~p0+8rQkZIK3`6&^wkbR)1zo}vC!^7WrMHTXnk0d>F3eO7mO>*_ zNi)Ny%yebXhrljo1KKRx*J#y+*=Ggn#V6HcO0AgxqJv?$T5bQ+XvxJZK=Eu_pr)1~ zSZ+sD`*0kyP>BacRoAF{?Ofk?C)hg`Z@=JdJP!kFM6^ShZ4)np#PhI{1%c`&frg;#+-g0kiZSN$=~kP{Uv`D zAA`QFeS-e$+64Q(c7J*fEc+o+YL3{#mi^v~s()n;bZ7N$sT-)UDlQ{=om`szgdJzq zRB^FHt_iyc!V$o^xHgG5$CR}$TZ4%P(&7fThiiX~wq0ES7#Ua!?$-ojcE?x87BDg0OimMU``u{iMHoZXOsZIAiM+w(xL`%k!Z4R;4^ zU<491+mgxwb(gBPY+t$Hf3!d$VQ%%(YHpVi)ti^=4Q_Kh4CCl%W+h<;hDb~<6^R}# zz~&*qu8#PF$d=~!n~ea;2ZXTpY!+ToC3R~B#t!4fmj=O9X%?6zW+3+2QjRKqM2&=_ zhy|sx#Q`*W@w?WeuSwC@GNcmJDE9^SJ$h@^9;m7UzZ1cu_wn{~n*OE~(T37$Dz95( z;-{1HI-PHn@=VQrw(>Egto0maX_V~5qE5zky9oi3>qx)Gr6W94jrudyuyJa{RtzxH zbJ)qr*+%ZD(F#9O-u1gZ9LIJpgD78&rUbLG+?MX`gZJ-p-VG{W#4a?#EN!4VcGgU%fL~saKHr|5uI`Y$iR51^wxPklgI;#ij$wUh|tZ65m}lwZ<^7@baOXuw=FE09KJ4vPshtDbH){2nCn+g^~zK|B{k3R%>Ehe zIm<@+qoMNgZwc z&1GdMEA|#vnh{7&g=O|GD+;7?Ga{`n9jN3~plf|~%ipMh8nk46wSFx(?4Jg#uD1j< z?UQgKyTX?qT_2#VmqN)}z z?ul<_`PamC_F*}LtdR>)n`#BZ5mJpO$n;{^!Hite)eJD zCUsm(PTdQM8BM~EiRscL_tf|C$%Q?7K|JNwYIcMNkpm8qhkRVrfB{HZZw}KS@8_fh zFxNlGXr2OHw=*|Pcilx1ngL?#Ur&=2-l%rw zYla z00%nj=42}ga*sg((qTJTL`uuF>7~Wx4e|}1@xg(+Zgaof6l3#Si_gP1oujN=vDd*s zYzLsm4cp}>Ci*-rME8WPPe#vi%N1*fs+on{QP8{dLi(ylCvb)Sd4z0{J^uvr1DbYj zxrZGY^b`08o4cHOr*C42`bd>%qc$bd$25i#Zd}QTPlfltv^xnt_DMe_jc$kgB}X4k z0r#dNZ=>_A{_<@#uy8BNXWOUi1ap@nR;Qt9z42y<{IjTTvD_}IVKEvN;$LKkaKp_A zBCN9dAHD0UOJR4Q<8GK*Vxyc3pyCNrQR^7%u=?p`ahdz0$Bv3`U3t=!9zRyx*%j|! zLgf8WgOX6$S7#`Sto!i%!xWUgD6Kcy{4=An_$tSro7iovN{ihyt7deTN=f5fXci+q zRPP|l(bRl!8!w+(D%B){#0+0-vQei$5bX`fO1a|(;6HtQ9u|3;%Pv`>03{zb zHWS(et#gS{C0qBs&_3Qf_*+u#@Zq5WReTh5FQXq1k$Z$Ac*{tV#duHwvRL4#y*G~` zDIJsBeE2hi(!+_;mZ(?;?vG16qq5K~I5;?m=zfr+(QR*db-~~f_2Z{|<0S(^w)JPB z_1rbJnGNYd4s3*H!XXg|EjAOncfXOEQMl{l46QqKOfZWv8N1`avu z73@$R@~;`HlX5>fA6BN_4_e13i$N6hC>0+pDL*|TgmG5FEddw?A+#Nx0bkgHeLDUl zky{B^Z+@uOa%3Z90aWM&?UmCAc)t&6UNj}HcF8bI2T>gzt~zA+7Q(Zi6xvl1?C<-2 zy7d&XwH2qgZnMy2VFF&Ta=&W5-;49DBE`avqa0d}@eC&a;l>Mka#@h+V6e)K&Vt~9 zu!)cUJu%wrUOm*-Jg=Jd;`o+n0W9{1u(hpuck|qB7%=#I05nK!AFrXz2vc!diV||B zQCVNyJk}bIU$cz?M70;J&moMuT9#Z`qor{LD;8xPB)n&n%H*OX^mc~g8*X?W)pw0UUNQ4I@OnILR6$$q3qOKC5gLfDR0k6b8gi{TlZ%bS0Ejert9lu1u(pG2&}h2seaD{-{GgEq z{h+TRAe%Zf-j9uIh4}5O{LT^eZu~gNtt0Z@z+5@+rnzF187-@+Qj9S_J(r=5)YJ^B zLQ26FzFSs1NC8g-7)zr-iREa8(*O{E0!}b8Ai%rWf#b#yqwvV2HrtAyXgmfq(2Rq& zy#)P>0s1G2bv}=wd>8qUY}CHEij~9>68;D@K@O9m5Tg$1AbKvqpA$TgsJE3WTg{#ez+VYnsZ;vlHCM7Pm2O2$#)LAhJu6= zQHWH55X@9--VAvzZ3Kt^lT1SNDP!Bwmm>ag_FL;V00r27`osudLbRbJp9ZKTK5C~8 zKJvLBug;TJ^r2Ft2hh%u1~EVRD0f0Rw>e=^K%R@sm3|$5<{Clk#pQiC7(Y5bo&WFd z?F499W@>hBMo4bfbAyN0F^#J={Dpaw*%Ae|)y;c!7mg#P#7iHrcHIADg$j0DojU#> zO=tbr0|Fu)1L+3okPSglx(AGu?ijs# z=J)e@{(}8-zwTZ4b)DyNsK-UANT+ikN{$5!9?oJez%Q>_ca%!>GKE0H6Sp8IaRYzB zVHbUlVu_6;+_M*HEfm>mMo=u!zk_I%F6NZ@PAKNZr9B|SitF5VR7(iCE}_NC<6iY~ zHp?7|yAc5c5hO=}Kzz?K_}S)3DunjPV&H2{yd<|Sz$zhB;7bg|3YI@cQ|n$!L{)mu zNc^L@;y-mEl+VEr%?qBYbyR#WpCV&ep1x zpEqG_lq;#(L=={DlYbw6Mb6`L(t#EI=_U2;n*r`#2AAZlHp!OjgumfV0N8)dA4?i?1}u7$e!Syf>14xwz!e^`8dT=?TTtjx#Lb`^2y6vQ*BGp z8M4Qi5S|4Y@XtwpcukmjNoSnzQ)H3xX?iYD1`o(9xZBS@hh;}yw?+;*F`z>IUqK~yut zRjjvgjA&>}Jx2rI)MwlEE6d!Fv&|~P45qVx2RJsdZijj+M`tUl>zWpYugFL;Qocn>m~jZQ*2oPN;Mk~ z7uj#B1>nxNPha%;f$MWU@XY7<8HS72{R!OtNnWL| zAK{1qr$5Uu0k^B4%m<<@kdv}DOqmhks&$S;ineOvArf;Q<3TPZ?(`T0oMaaDJC zx`UYRea5vz-4Mq|=9z222|k85Z@@fe$}h(0K&pws4&#SC{}jb%{NGXif6{04R+@5&1d z)iK{{4#;n`B?uN^cjN%2(GP!4yZr1d zYUF*Fo74SERv*{+ZC%>rNe`X;P;~GN7%;1vpzzfl$y7B%KuX} zVlb=++7GmZLK|Z;NoEWM2PcZG#Pgfv9EyoAeG-Nj!P@)pGeSOO0DOobSQ~5Js}jE{ zmg}*X%82Mj!mOZOD_=Wk4MxY6)L|2Owf>FDmr)l`DMLpUhf&fx2`j%CzeoCe{N%hq zmS8=kj}ASW@11B#--!mlotz)j@z`Dj4B9q(N%pmS6bvmuE4Be1ERd!|}+r5cfqBc&W3vQ=^4(`tGa^v50wULyN6n zTbjbox=hVm-jJgwa3$Gy1O9n!dt<68h`c1Gd*^?wQr{@fN-;r|aA?_o)oV`X>T|27 zUs)WU88^!0nnhM1AkQYE1An&JMVLlXSkVtfo!@-rNj0H(;hf_tYElX8On9DR91t`> zU-_`i{F?^kqu}z=%ExShDmt%O4marn1kxVY$TRs{PpxS7+5j5rGvIwQNR?C`ytfl` zQ{;v!d01H#3frFf2(+L4AiY2E-c44$iIS@nJ-13TKTu6QmTHnfGgW zGL`fA$IxosX6&exP21;^fE#{G9s2KFX@)%Z`kU|jYkik&gcoIqPV`YW9N&d^Dg$uW z);x=e2k1)!OAV7SRI_8H4C8ARjqI(%|H_>;oz03QS&GSfXQ=lKmptr`45v<8!-$p8 z2l~1`a~q{+gis*CJYoyyd$JMm6yE zZ$A3Az`Td&Oz^OWda<7f+(J0~eDOUejut_{2SH#Awu_gr)BTtO7bQvM_<-)tFJwb6 z2dl}a{&pa(`v=75YY7g@asm+KuyijEdCuiIF!bt8TVwVQVdjZU4-!Mph)%gjQaOpo zk~21pdOIwOTpK~@dMAH){N&c!Fo}PU=jI|8TBnf2`>a`l&GpcaM1bEgTDJ1_Vi17vjfxDnl%Xi84lApgjK{ct;G2&FhtPWKGu5Z+dp} ze}-E*u6ww(ZWj)dfHTPA-w{~-5P=9X@mpkD-m0i>+hLeT!6SaVeI97bS%Xsy){_=v zP@;3wV}R#!l|n9yad!CDYS{+2l(H{Ok3s1o+CtwOJgj$QXMT732vs&7sJkz}ybny5 zq6DQ!i!SF|xqT@bSyoata@pOt>hhx4A(5GVHQpIAB&Unsp6D)rwS0APQ5XLONzqw* zpZhQB;>!KIl&*v-w^2pNirr|@D9GdnZt_&nG?dYfk8r2?l}2IceqJWO$DFLbH^YJO zA9o9yViU8`@6XjB-0?meD^U&$xj6UQ|h*L?*d=VgB~vIYXk zn8sa`PU55Z?#pc!hCgRTs%=<6d%@chb}}i$9sr7JVO{76O00z+@o&g6w%Dmzi?x74 z28mWz@uwe!hxUo8#OIw!!JWjt<0W#}4fG;rnACMCS$;eCcGLrf7*(=A3mV9c80$~1 ze;oS^y8?wXU>}jG#W{~eC%9a?6sHAS1xt$LD-Jy71Gh4JeagYB9-qB^Vn=Lt zq^nZ`^t^lo0p5vYR#gUuKK;zU?t1kmI3iZMcmep`Q6;w|Y<3o=Xh2K|CaA%q!u;sS zCO~$FxRCczNnM1_2uwPUFQN;sgO?vBE)Xf+Qh_cO!^9PE$tTaR3B)6q#o{>8UL`o! z3cXGOcDe!L_KsoAG;97r*L}MNpIzJu;Uk+pNyrM;aGnLt8)o9nL}TX-S(&>c;bfI3d!+9Y z;!neJ$;H_>I1Vbi@1^S`CoE~%D5O13KJi1G%5|KhpG8!gy4icpI zn%>_v=1+fmbn`DkC(Wa1I%C9>LIs-58;gCu00-Upda{!e9EF<$mtgAPSh%>HWz`8_WEw@R;d2NX|3XMeo!#0Oq( zy@#+Lz&FLnZ;M#VjaI3?j+*{S`8k>`+e*hZLu6Kr`4jaImSP36HwyA(J*xb_&oihvtXUa4rk3;0*rS1VR(lz@5HDH(;7D7VA+-Ea^s%C-FC%(1Yx0KKX#Zzb zfTi3~)wI1OfnpG7i={t~RntThs!`0deE889a0hRPqInGtOZX%Yl$Ty^ zxY<2zvDqCI6-?1Wv=>M2FC0c*43V$(xMh*tSxU=^y`Qj?G#!OXz|AD&v`ilWLShlD z-CWqWP)>NsN6pyjikcgbQC=gEL(CeIlJPBYb{}sd0NE}oOPXtM(tO5;O8d~50 zXTa~Vrfa4?2sUoDZipb+$3gOV$Kc}=;xq2Ww@xG~rJlbuh1j{NpsuB7T((uD0nag$ zUbxx+^7bFyzj1Y*s9YU5{Vt=~g^4TUe+>s;#wbhnh(T4hU7@a3+L4F@|M&D*NJBUx z*BShM=9{3XR!=K&_e0FwdTm9Sfg~bQYnlgKrs_UT)P|&@57@{eeQtW)Uv^Y`H}O`d zN3!hkZxwEB*}F~EF6?$OHuQ!PH@GE1BH92v^^WKd$JAz=^j(XS*AA9+@)Ca!>nkGE zm4akv$jwic1Ir1CT{+ecv^8 zOZoM!aD$e_dm25O3dMf1|M^RJT5P!Tx5vi3KB-saj6(H5Kr2aSN9W^orw4hzM)*lG zc$fyvv#$c_>HJ-T{8*h`2hYmsPu;D=?ub1aIN0f9KMTmnfZEVqXDfilo!P$?f41^P`I0Llmcg~3X`*|=cz^^j%~3+r(vPfpOlkRap9x=~nP~)}&s{Md ze-P`TE^~(K3huaF>kgv)g!I#0RkgI4I#yR5rlm~73%8Vj=4M~00+SX=NC;laO^x8` zFh+iwSe{dlSR+h+_$$9vulf!)wR61a5D+!V17+!`%WD&A_Iy1cR3)MD& zR_$35(kzD9%fF7=kUq+zD*PL&)J9U`eQ4Ph8u>7-ijZ#f>-b?Ad}7*%C0&nfo&j+} z6c*k{fk1|b@#)1N>^iYn{_USut$(ZwE+ax@s`|6Fr3EIfL2Z;%ldWdB>G|ULM zxsSh8*13pKP^Bk=W~+%ZQ-unvm?1c^-td8j@?V3~x3)_qvx%~lhC0`i?I<{`l3oQZ zt>S-b47;98NJ$tqR)6zl+%gnz_^}(_WoD_gwJ3%)UG*%{uJz_p_~nHz=9PB+B^ar) z$#gsidS*i!vK^yJRq4u6`+zZTp-Y|Y5HJiVefAX zJie;oGVGC^^jGf6IL*A=ANH>I+zc%;ZMvT+kv66Xs|MExut?oIVB`48+v|#3kK@(y z`r>98GIX1DW{M27-{3Wl1n#u8<^R`QwmE;+ASx3leNpB`cv6A*D?7&~znyOLrPC`v zUvAMOxSCR^Y{aYRwyg5rbu9wsCDUP?|SEa%w z22Hddx6n^WG=kHNe4Ecd1=5gUjSNfbJO?LLg&qirs5(3}e7ZR*O(!vQC@B7}>TuqI zX*q=`kFWVxPm_z9^NmH{C)Z9atjm7&aK!%d7)&@`)w#A6gSv(3K`{i@^YDX=Z&bAt z%_37|mUeWBuQ85wq0qzRX2}zj0n@M+`YbZ#(qLQlh2CARwNNEigO7OAkSX!w;dKq< zNTJUNgL4HOWU~~GJ3|uHrFnZn=OTe}qS{Lb4Ery3Qi`sxGP|0k&=NjV6owHbaodaI zyjTZ{y|-%1BYRv5*Q*}UZA_~AeT#%Y5x~MtTKswkH1L4U#aH#@@-Wacb4Ue4u^h;g zb-U-*TU`bn91WA59XWvL;OuoLjE1vDaT1QFBg;xYm{B?fg&Glul3V}FUU|F`DcW?% zFrk1u--IahAB|)`Pr9zZn+m%wgFW1EGYGq_gNISe5<;7D;aYEQTwa9PEYder(cxcZ z`Cw=TUVl;Uvlci#p6hr8!Z$wl{niR4pOfy0;UabDT#6=S%Bhl{X&GSN@S0f=|m6!ty)Z&m_tFre#|U{}svj3*Mm9pzc%C$q+m+q9{3B^noKf%dQW7s3MjJ%^RdnCD8^TN-snK4J z$gd}#!x{6ImSfrilzwcz8aGJm^0FYMN^pvc9{u)ZF1M;GQWXAF`2Fm4n+dFqCy^|w zs)xygaQi7=QjhqutfF3*ikt1Oq8XcJ_>WCIW~Ce4LVM7Ospi(_JWtYInhH}6Ds1zl zF=2N5Z;v}2HntXFzAD4jxcw=*2Ms6o(;}4^OpbH^+t)Zf*#JveD0XT zw}p4*Y#D6Noz$xvjR|NGr)~Z0|1hA%l5g9_MAb1`U8c7N?Z6 zJFPH)8BYA?UHeFh`ncw+)obDjQuHU_0WmeQU6&ByIWySO1Fux-9)=G2^nJ2!bE zCgoO8g8u_CdXQ$7a#l)drfeXjDlF^bZ^DS9!@r_uU&P@>Br#+*UoutcX>DKOYi=~K zOyG92qDia~po`+KX+@ik`1=<3oUik3+lhoTA*2zRYa*|j$^4$^fIzA;)?e(bhni4h zMHuoEr^h>#_W_+C&ZTqlzCJ+Z=ji!Xn9kMixjQ2ta?T`C4r$Xlf*ozhK}zSFxT1!) zwRVSS^~3UXt+SqKnj14jmpxPr;%3amN<{tqBr4sDFv)DLTq?OS&x|Pw6b^8= zeWWeRxt2vdl>JIGxt_fHppV;CXlYy$>BDx9XhWYa= zojHK-3CTSKvmm5{ESF{n^E8J^?V~jFAHsGmjNT*T%i5~iQac6FeR%mEl69`^tCG%Z z6Gf!QDTE%i)`ViyAk2rp56C%aS?}^CDsN3kS!idCG{3e|o2wVbhE`l)y*eMKXEQ~GV-;E_?&AqgyPl$AQp zypOd>U-~)j!FjErrfqcglTGrEkej?Nx86jwjNJcV;k5v*^Ho2uaid3k29Br@7vYUz zj#;X&7+rONFq4-xx+p&Gj%M4C^_1q6Q;!3BL&PRe-_r=>%jeBYjkIyQrCq&a*1Ar; zg~d72BR|YXc7tyuIX94V*SGNVljMSvCX_F#hP#klUKSN|r5pPJBNNYKpoEedx__|e zA2^!Crdndo0)@eh-3MHzHDd=1q9f3Je@LY4oL93+vQO^4a!{7LlMKK*_ZB)mZ;kXsdN0 z&f@P#5V1nRc3DpasJN^r7Ye?I0o8W>vclHMLMbcfKlioS$EP_kaecI(I3~^y6f7t1 za{`7)<;Uij%`DAUFbW1Po-9za^;g@zny~zqa|~HHL98Z__cHmEZ>I| zd05IxDTFr!au@YIRo|7Ut}@P&v&eR=7uW7>dV$pV9a7v>@!rN-sUmgct38#qZ#4Ni z<#%*5N6ol{RC%V{->>{W0&>kC&>Bq34K|COelLpArnoPtTCnZc={%8CjUR@9yB9{9Vih<_{F z#2CH;h<}0D(A7^U^YhE2{d;pg`zUr;4SBaqOmZdf~Uo zqasOO?07i?p!R+*x8I$X<=IipI(o?=X7XuiSPViWs~zZ%KACs?MJ}FI2QU1d{T_2) z;-KROw zpJoh4KB{Qw?TwKsg5&VS9pq7zTdT2UIQQwr+UqSb#q=ut3<|D*T`dUP*$n<|f)7g| zkOKUXpxy{hCk67By9k>TSTK=W3ge)Z<)=J|K{SxkzqX_}@!TBICk(FGy7JYYE}`WT z2!03jga=#|xOQ1U7^eAhZ{OB+^SWLZ7=yoqOQUMkBJ_P>$tAAKiJVUsZRJ6L-O(X` zX)DRB;2H67)1-U1``WV&J;@)Ac@vX8NxWQkipIPe*!|S*YxMqPHKBL8+;rViL*B`+ z7YWCowd*ULnWSQUFgIVY5H0m{o4G@hlufY^iILz>$phXdSdTcdu1}b7m%(wYJmaK> zY+ULP`R{LLzNFh7Ty&K24p5MUT_Pv0RUANQbWHdt3l)me3y_oDAU{!O{fh8BXrukY zllE4WF{_?10+lCu0O4v-4NJH_yBUBOK}{jvjTN>?Zsx9Y|*}m=%-i8lTrL%&l=Zp9jsPcf3jkq+65X1Z*3Rmi9 zR9Z1kcRESa%b?{43FI4(PpVN@Y-s4;d*RgQ@gI66wBkOAE``>3o4F1dpUjtA;p)5~ zl%ZW2G=;g>RpF@z4khxuOSk=Cg08d-XO}QZAM%jSj7JAToWl5%0{tH^F6xJEkpc*~ zFgM;=LR%Ef230%zDHc+a1LA$2{VM^#m7sj^Hy;j=Dujmge*3vPf0AQ#Jfv_9l! zKsRIT0Xf@?V`sDMs-&x)Mt?he5Lgq2v`UrJcXfTK^BNN|;Oh^oK3r1DZ)aH97p zrptH6{(VSCrM0T};m8OpHZ0TOv;4c66|fK5WgJoy+|yizcSJBFRKCAiBGV5azFkV( zDd$suqh4l7;G)GZP;q-yx7`vZ-q<7lcViEt?`)$x5DdF;u_6-K2VaRYiJ&aU?jv8s z^l^plu?b}R{xs#A+eSql`Iwx*g*bFGmA#=Y4UGK&f>tP}du`O=9^PwVAB&wSD8-u#!p;}`LcOfCzc)#@ z)oE9Ft+|K}HClHF)Cw*&Qi^aj-Dal~9W$HR0IS!YvnycRN%RGm38TvI@1+syO^D_p zJV3GK5cns0=;!0A+_%$Yj3QV*%`=O>yO~iBXK#U&(>{?dS=@HbWgvBA=w&wCZu%MG z%P6uAl}9^Fg(%tiGGziUa9hKhwy@1*GT|>5h2eKw?yDvEYs2^$(SL zwT+{q_$FG{R`Q?Uj>%$oXzXM%Jv~&43i>xvJP^7!oEYyh0i0Z-#%TG%C!P$$a79-K z6i>@yl&bq&Wq0XGrSC%TDbx>e6KSox?jWLrk55kOd2*7}XG~h4xGII8%qp|t&-&c6 zN+!4wKY;%XcdN37{LmlTPKTxkn!gv+aSH9Up3|76twQH1L00X}zCa{&0SvnjvBKOJ z2Zy-DL!5!!;_JI8tU@in3h@rdcQC&>JFVh%mL}kp;dsTSu&^31D03t^L4@Pr-u;)D zPR_Q5QR)}M??u1{?CEYcp)X{}u;|yR9?91_p-oo?w9q;z%1^?W*x zShc)}TF(hy+zyN})|Y>~+Cve`M<50jU7UhMH&;$;py4}3`0DEs(oa zB?&C6{4Xxz96geT&##QVn%sAj6htF^EzoKef1Q_?l$Bxce)7dZ+DPT_XY%$i*= z)|+dPlgF-7eO|R^o=7C;Wd2#L;%D{i=y0y7M;?$64d*a;`+kct%eeQnQ$yPw4OyqK zUs_aJ9)I23=W0lD3lpT&k|tjFAJxJ0f0$4l<{)=G9wtNZjiYhX49_ zF|gxvCf^f5c7*M*q={8)qR^P_N|4yY0DrON384~On?|c}h4aiKAsudyJ`Bqt3?!9! z^i?GZ7B<0>qBZS~XYa`;1rY2@m%T6uQ8FCx5CgD#Vdjbw+7G65G0vrVA9IKb;S|ZE zJzc^rEIGjdgwVc!AB2ct+X5@nYeYk&>Y%?!nJyC5CXdh{{($<$7Yc4H+vp@nuH}3 zlW~KQqjBm^Qf zO6;HQlxL#1316vXIGy)Mnx^3LUoN%;R|WiQ%ppw~cpznE-3_!(d%}X$CmAc@PtM8djyVY6WzmuwrF?&o`?&zn;dZO zp7wzB*mIn}OIQ2Z`g7xn@E?ynfObXhkv;nda+|GQQWg%H;Gd)&&TYJ~$tE=dWj<#j zs-dK4gnjP3w^;Pq)yZd36vMTK61+;9?>bx;^MpF%Rsyo4kI5^|TNm|%q}G&|AkYo8 zoNVg4y`baJNbsoc$mW`9r(i-nNttA@1No)I2^iivEC@N*B*VJeT#nvJu5?J{v%*ewcA1AIJlP(0G{kwP$`gRdd@-tFOcc&^zalypN|OzR90G_)YbX+km>0?&q*8!N--!_^ug8g1$UoRl%ta>@9&mI zlFFOe4rE!tQ>D3dvj-M!wiy8W>odg+@~GtPb_CGE#>XkDcr9 z|33R=LZI5`d~hf{MzY-d#}28i*BOyJIt_QZ(_ySUv_qmJlq>SW-Qm$sT`jSs( zN!*35NB8I}avi5^LC@(|?^?5$1>zV#%%WE=+)pnCP@mkhu3NmqjV7?xT((b; zw`8oi=334#Qk$m+gpPklkdL+ALzs5|6c(hPvl1s4xSt}gi z${WP^CCnHHrmbV(Vpt$R$7Cik)Tb2os@p-3>_|$NaP_YxUgbiVK~h!?I+$FC6>aYi z?q?;?jYXwFmP+m*QrAIBVvFo{4+iea8&}P1*R8=x?-yA)$KXm&p*E4%*d9=2wI28M ziS&6vh1uZo+~?!aRq8X}PWa_88u=20t%sbC;JbejF(V|U8bP{3(+=Np{OKKbmflz7 zu%rL0`tC{qxh_{-##;zno&sr~Qa4mD6(veW|M<3JOuc|q8d-L-zfe^33Uu~QG(99p z_#5;O_fJJ6QO>#~@48_hcB2U}>>pV8#6QQRmz>G{FnWslF|h57e9MH&?nUBYurh$O zFslZdxW}IS;UoxZ#veA87A8o)WHr|mX&)MGx(`D$+XD9167B=`h+l=VIAvn>7qN(s z7*NR{D%!8S9=WQUv_aiy^&a>Muv30{BtLtY zT>&rW+{JmT>xTFH2M{#Rvhgz$pB4>M`*gvt;TkcUk*|CRuC9YyPtkGlpa~-^$Y5UwQG<7uU#j%#R z`Q7}mVpWe5FOx z!qn|r?ei=xl&=e0@1LQ1`TEyQ^ZDawmJT~nf9T!LUH6_}W21UviQDf|che8n8Bsh> zxEiZ440ghXdCs8pNW+4d+ijG^)vQc!^)fO-R(z=bhA+-cHY;lmI&HcT8TkJuW%$(u zF%;@eu}*$;5xj_7V9j*vYC3`B?MfWGP{oPGybwqh}a%R zO9RiH_SUN~jtZ*NPwkHmorpJ(hPoZd431@4{MGX_SO$6J8A7)jg#SfsFJgti5RS_X zrsxWW716qFEAQB!;OlaTilHBLtXO}Wb*;C8+&{}5K@t{O`DE$1W#Sj7|Np)?^CBAr z73V(nnVj#b93^D{_q0>SS+ZNdzb(M^5Qly~PrN*DEhm#$McSDxVOMJ;n7RUSDFlFv zvAn)nz^$_M5x<{KrPNc_R)%h9;4?}#=tP7|#|q!8kuI(79Ca(Z$0({V!IhVWCy@a$ zT?HDu0U|qD=VTJ6`=4Fe1V#kWA&cYvE&r=ANRGUzGrbw%_q4&Wmfh*LZ*w47QOlMC z2@jN?%!%#rp?$1yM=(b;k z>p&J$^75s&!GkqrQYKurt2>YJ9x-+o{mZZ+=}LieCzDZ+SE8 zIOTFZ+DeuQq$$`iCFzOxCSfa4caB~D5Msi>hN&#&LLH8Gtj@N*gPz^>OLSM)5-|76 zi$90b(XDMl<)=G$D19lb0A9tuGcHY7&>#iIzI6Kin+U`4a%3d5|AT~Dhve-UMb)nM z;j8{T>aWCHyPp|*in1ay?{vDofEF4T1CftCPX`P_-jF;faF`5}Wo53eN5jWnr?Glf z?}0}qvS$0hSIlYA=^&E|fy~|AhhB5sQ*}3wf4o^|SyUrF=8~Q)^8$#gO&G)y_)`5! zlywGE2M~h+3VR%>886bQ4AUuDs@Iv8_YB?`K;>)c@P#4D8CuTc_Q^qFqx0F5>#dg3 zwLebVMejm>Gij16mIUs5U0X}%OOa&%i76)IktG<|qBaQMmI$~dcrxFjh+uFdgnTPJ z;4EU|+93HcVXVp>D{^cwNQ%7i9|dH?(9dlgmz|&hD9qpluFcB;=QoxHm{AaR2ndfp zj|{ga%1MaX>lZ}KktWBhH(&ph6KwEfn&ACKd@DV1oX)T@!@!9O_U(U(t>?Ui0OEnN zK3PS(`y5ZUSN{fPinW*%_xky$^v>5iw{$bupf&bx&O=kp>-?S|Zepj*Gnyg<%(_>y z|Lo<L_r3-(35sd0^8noz|b9 zqT=uV*S@dk4U~0_#nEw#sWWO;8b@(=6KJ_4i-vY^xyFqS1}GBp(UO_lw52KM1-6(v z;7ha5^Zv_I4Ucr-I=o%0o7d;ZF5_}>?<<{QNY8}`gS(bxjdUKfY>8*?N1gmXGuno~ z-hcMNfA_u#Pxl&Mf!f^eK`qZvfVwkAW-Qra6Knk`{|EwwR3NZSS(FZAc>K~ zD0c_to}l?hos(TpWnCkJd^TH%e9X#u*26%&!WtyxzR2(;&y3ibD2Q!KQcI-hU11Z7 zT+Hb99I%@Kzs$e|*)B>u=ur6ot;xMxQDch9VUC;B-#7n4Wp%u@AS?FgVPlaZW?yrr z2tSO_ywUy*e|1AhCHmqk2c2w~JZS-tno*-ud^s%;)d@Tp4bZ3)k#-d4zO=$SA}9sddCNX3<#bjBg;#k_?5AQNEsbG zyJn2%iCaMI9Q-^!Tj#DcNsk^kHIv<+XnvH%r-YULC05{7w?^@`c*EB~VVa7}O;Ze{ zet(Hym*ij9w>kJXO~JRl`S68>{(E~%3Ke5JMf$0&5?=VV`O}#;4L(BMI=BwO z75`|lSA390L}@lNOY(23_JSUNtWmWjk0XBNOW|lg7GUD?LHP^I_js7!qYj#%oiIJh z*E;Z%Os@>tC?5jLDi!l!@Rrh95<~Wu-NKVZDIIPSlX5mK^AMiG&HZ^6H-@WDTj(z) z2xAk?AnE_b@T#C$>};NOF%K?imJxMmn!Noa4$@mkA%9Uz_;cho zGEcU%cL@EFHmeMte`Wg}bD=E+VSH4jtc1qI*Q+$|zn|W=eSqB!0#drEn2lUkUxQJE zx_uSfECcF~t8q{ep1sz#*HY2{J)~m@%rq32K!oR5?VPssDS68@LXxm)cfa3NGrN-e z1A#^=yZnIwFAJ*FSJ(9@!MZ02SBu0aH|YN)%}Y&Dn>yxcFU#Q880oqz7kv>zzeZe| zbx?*PCJB6%B=CI=uDewdV#6QLlLdKo^KzsdZQ(QmTdzGJ&2_W6>1PwsnISnUO=2b~ zX0~2;y;vR^r26Y+@lBWh5uZsikL>tHJ*y*_j={2jCBh3K$kYYYI%{~Mr+=Gv>tez+ zHMBgz_pY*O|Jw)YxpE%z?cmLbSwT{}z134MoqZ(>gKKhUs-BlmbvO+_TmnJ{l+*z4 z`bW39pSHeKxBS)V#+QRCU3_CE8tELTxuB%H(FO8)*DB69cmBvVgRXOfzTBAXne9_q zi}Co;Ox?op0`_Y^oJ?cQ=&U!>Q*!KB(KF$%47Y96P#nLS{l=+`->w&<5K~DpG-+s06_*6`P zNbvnoT!A{W$eP8yEjwsO5=2&l^<3~}IgljYTm27^Zvhb9Op?d9EmgPd==gW8N!rrq zJFY6mfI53*8yIikBJ5fI+nW~eGo^&xUwCOV%f(dkNc5aT+}(>E)bBGs$3b393+j!R z^E0*H`AX91t#33gdB$B9^j0Mn_0`su?JzJ=;cniQh$-d*2fGTc#iA2_21N}4#oD&M z!TzC0g0J(u|FX^K$Q`9dk)O7w-Sg~OzYdPv4EBbs(Ad6SAz@Ig{UMJ?GKjgG8%b9# z5A|ip@#a*mUa%`ay2)!GpUk@RGQH$}f1j+kmw12j%c^JYyVxXzqPC0-f_L(Jt)x@B zFh!f6yD0Hl&m`_la0L)vSwh~j3e-Pn+64;Uo9}wS3Z)>DP}lna`#2?(;$YgWn1kP1_uy`QZyC$!b<7a_Cg#%Gxq5x%tt;5+kUZKmBj-FB7P*&AVJ~a zL1gbR7TTqfuuB|)$%xos7-%>)O67ft;=15C-Wko%LGMIoGR}=M^cZ>5TSQauOM;iP z&-p(PV6%Vv%+uB$;@(if?A1v5#S%oNbK`!^tdK6$x+Etk^8vPCcmi&VR_w@GTN2nC zr2RcYUk>`1QL8_{|5ri%8}iZf6y!r>T`i6ruK7X9^)rodUt#{%z%3T@tFh)29bF($ zl=*p@?sY5`wxA{fWHMsHy_YYob-t_rZ9(y3Kr#hbMq6Q9ugsojPp|vM@Y~%niVS=w zSBOsA>0ph3b%K|CFUOJ4vM$?9HmlvA{S{2y8SGAfpqgt2kMMOjdJpKHd`QXE2{0mC zlzeU+LdO}Q^3rQ_R&sITsUSmeYPxHY29r^iCe#nY=^kdRcvv1wA0e3XIJG}OE_&NA zM=rEgW7eLV|Joy)WEBuB0@l&dvcjDWoZleI9oefd7Z?zo5n*Z_7zQDE2GiG-v}0Z6 zGSK4`AsU1L*}}od;vuh*K+Q)9YAELwovA6<%Sug9LHl5T_EyE}H}7={=NWMY5>jb3 zR{m#|e>{t_f8`0`XiszWeS*&&`Z{-B>;Fd)^Y@;i6(nEg>9i-$#*Y*>hj7ipYv97Y zlMQ3%hqTr2?iw59u1cO9m5tf1NLnd{Bt6_?u1re>|Jt_W49JhxZ}pi1s{jqL=!yA!o89{@HoN)u{z2-v)LobAKOk~LP>`7QQ z;L_FVYCUX&ktqH9Xcm=0sb%R8N^idXBFK~(0|~lxIeUm8M*kz%k~GOL#fg))?^47? zyweZL_MrX0P5<>l1ae>B`3lp*&juj2?KNX;ntzhook3 zje@B{h1bU=`j}_(Z`5DyF;7q3dLH=0IHSr;&5BEHj+~zRk5pzO%^;=Vqo-zkp&#jO zyFvxE_vg)PtNpBy295y0UdN{hnN^iCm$;i zt)ot782T<}I+8xYSLwU3eCsEA_IFKWEbO(!CW3vA)`gxVSk96D9NT@$wOAB&+%HC$#C6t_ca(X_UqVAX!;GrX5z3#c=_%K@q&x6B**rsX%(nqF z3tbD89Mqze9po3!E9ZjzjpGM=UkYdchtxt}^*8djWsq=;Zv=aPx@r0c`jY5D zFr72_c~62%y#xQ%b~Byl_xMrHd*ym%rsb;#t*rv@;s%%WCw<-i z1lkBGkOxp>m8{PNMoU)(K0+3Q5>bz^pq71=n8^ zoL|)eWsUF)>Hg}xa}R2jbq!%D%MN1 zV|Xu{OC0=&27aWH(M*^S{m~QL7s=I>j1BvJ9QG0OVxGfAAE&H?YEGUxG%*|YXjg2C zRbc7kL(7{`-J0Ul0`!D(YLfnb77n!;f>UtO@9ocJU;XzWIq&JU>E60nO@1|65&mHF z@K_?h4AfFrX5Tnu;89QYK@PA{%7<+IxOwH!mbUu>MdrtO`S7q|&FPhI*nuTnc32zG3 zyyfq7J%bR#>t5-r8?X;e@}#ND7#G8?6=WZ2ow+P3#9g0Wff#xHZ}%Sp!TZ)^{YcKG3HXRz_WeEH)7XXT@?7p-fk~16wofmV z4vQSoY-0L~iK(LuXICZbbq`Yg%a@?XVA5tg%;J69t_e^5v#U~6*I3QpQLT99oPin} zs0k<^q;$T)>NVT~7_e&IpAbyUp?Ihch4YzhPLi+fzx=f9eh7}!^Y9<`m%lL`#7hjU z1V!pP4UxWQoha8+n~c`pvms9?AHg=3eFot~xj%>lWxFdjUT!8_cb;*ObpE|ra~XUX zifs3G2K-S563=BJkj+2xG2N8dJ8Ul#ng~DG8+{M@e@}jqcGf28(yT*R^Z^!1jE<=eh55&d1&ObC&=l z^lMlMKKRWp$(({}ez)WCh)a#fTJH*i1Hc8FF>6mdTXn@z?W96(;W$JI(9Hj%G5b-3 zCO`7abN2~o|6mcGU>W%#d((V2qVOtm8Dobx9M7S-Hoqpw9S)-JTX)G+8bX?rfAo0{ z10p2rU4Td{Tu1k6i#kG3P-*lws`1?X%$Bnb=flFd-(55JlP3mqv#skWlxHs0(^N-{ zKYdILeXo`Rj?3@O&?d_ggH_UsN~7y-M**HC!`t$X)fw%NZb?2mip>AQLZhQ#n+k=B zj8DLN9E5%<@ z>?){pL1Pk~MV|Qh{oM3K>+rGI4cJ+uR`QbPLSiN;=h-7~Ggx=RwqV`)Bje1(d zyw}!71)%NW<~PW1em%x|E-uDV&;}%!Ol@hJOYjlXgP=C=(ZgoK)TH&-3mk|_1RM3( zc<+erO1uV0n3Bns*tX60Dln>q5*>^$t{TandaFH^rI*w{%nKEDa*lzKT-GHzH&mI_k08G+nx89sUyudCFF*DHrH_fVuO zFi1}N23(`-_SMG5Xv6h``eB(!qO^IuQw}adnix+r-+OZe&z*(Yz4~}1`#J@>6_6Kn z?O2C@O1w<4WZQ62XDnXkHejiXp}}464Thr%7;6~_Q@>zh;6GB+!b6@<@R$&@A|ku& znt8B$UFR~+{1iVw+je=-xr==f5UM@0jkhB#h1{AePxU=w>Y(QJ_UG01{le7yD}BDN zc;h-!CB<~#hiR^pcxe<>mQZyRzHob5?9QLvwp3Vl&+71l@tQE(wEMvv>y+++nDBJUpHUj#6~Q?@NK~ zlxM8Y*sJ>cC*fSvIWz>wFwyV$Z?l66(zr&|BW@@@dxWp;gp;ZA98y?HxC71#w0` zZ@K?N{o%#ddDVqvW9EK&K6~d%_d^wNq=9sCzKsT)q#f}luSFiJ8*sHolQ%+nQ^rsW zK!-SL3rvzWIrIdtM&9d0bf7Mwz8|la5L2zkN<0=RR3gJE7tx_+ez)juF^q zDCz-epY@a8_vlZ}Z!_Bo-%)`vDo`5Myk4dGwvCabKc2Rsr9Y4{FlzwxyX%EXRem&X zQ9(lq2V&OEQAF>;FB)(&czgs1vqC&=woc=Nt;iTuD_lvki&Q{1TDRK8t>x7kQ^+zdtiwjZkx^> z_a?Yz(}(ft5{?xAu!Qb29TjZ!&PRH?1!rr_aF$S-7iY}`dX#oH{D+WZ>bYJSFi%0d zRLc#V=+7f6+?nSBx}N^I@U|>pr*O>s!-vT$$h3yX z-;Yu~(8Q^QDT@=cn|jzSufmh<)oY84S_8v-6KMeJzgfHN3qpV5^PX+E0vkse`Hvro zI+~m$f2W;YmEX>kNLf{!{vww$Ol4p;a9hFcDe*VQ&N$$ zJia^&GZb3+6GG%4Vpr|SmLA~i{oH=)TRLdxw;W0V?`{D-b;<>hzHVJX;BTOKaN8=a zyZ>r(xFE@IBNg9VfEMG2@smS8_)QHV6@WOi>qXM#JwYzR_e6rzreAUzlPPmx2G(w#Oa{bv(wW;wB*1yY#^; z#DZwE(#w2zluYvmVjyf7PK0}W!H-(3+O9^B8c;fLAq@@WcW*>usn` z6&p_fOwWRJjBC6;XLS=#(Er=q=vhZW?5sZ>PW90fU~`Yr0(4fo`WLmgX7=+(>s^P| zgmRaR;U6myP8`!GupHqR%r)sU=EXK3LYt*N%j1G(o0sh^N~mx@>6ms8CYmaXLgu21 zZ>3$n0<{r^uP9jYd6Hfa*iQ!?A`xpl-Q~UF0($>=%(!46o?z_TO(1`gqBY$_C1Yj+ zuP3BOz7pz191hRn?ylclb=3PMxttGjDsyLM zOwf&nSEzW!xMZFJvR@j|LUVuR;^1O|3Z^LkmtzZ?8Ehp30pb@EUV7xmyi?%l?TO;y zdGepsliXHmvr}S3_xHb6`De0G9pBGeMo`|$uhi8sXt~re6eH(`Op)b%kY7(9a{#;M zr`MmmznB-0@^e$w;IT&%XVGD&(A<5Jg?3yDSvPe>Np8Un7}{8SM()3F%gb_gYdZih z1)&8(kwF4kCYg9|h{@eu*q+UwZpE=6R5peNJ9FdyxN9dNQNHc(@67kvWd+R^-+p7v zC;*_c8vqX5h~B88ArU2#tk|?12DVFzMg>+M<#J%WeV+6#zQttU>hJ)_>e!mLTf%FI z6DL)!cwSZrR)Sx$;>Weg<}$lay^&%4pTc#(htC(ADnQgyt`FT6zRYM};2)YBWSJ`&G2NG%55qog(o1W8_OMWgZF}ATZi#eeb9 zXRW31{yVKl>a+5)lzg>5%7*f=YWNHj)+MBxTXmu>eIs*D#+z-?X);Z5#?^z%c82et?W}sa4fp&8J-v#aH zl1aYda0~;~qR&wPLhnWhF*t&`wDZHv40PG2lYJj-9Ht~F^7TI$ctMV`Tlj1YLZ$c; z;~hnWsV}xB;v&RVZhz5R3Lsy)T1I`;z%`cbX2xQTi%#o!PGs`$rGLtJ5`0k>E@bgY z6_A4*-a;T&yIJzeg!J7@u*w7mPvwMX8mqAaE~3MC4rycU6dmT zb>UW3d8gsj!f69~XU6W{RCMKQU%Cm$^GxQpkd>7Ig`E@ZOGKkSNgkq=E-XAQWgRayX8zO@2NGZWy#p(eAN^LV>H26iP)T#a;BQH7u6FH1`#~3{L9+UV zmN{WyOHHibc5>CzZ^|LxDqIGw=-j_bDXUMbd%&N#{J6z#ojBv9!30m)&>YJV&L;;* z?y=rhAMa?)l+Gp9@s|$AU>?XfRZ`Y&`#R1K*+slj&D?a@;kja@MQn@w(h%X#co@II zVtWCWdC29!+!);|Y_)oE%r)-Ns;2hA*gLc4>@&ggW^xD-yPFHdIPxDS-amIh(r&Diz_a`D_2MC(M?8RR`dqEc4el)G*y)zKOiaB+su*^QQPvVdFQVH-VL-+jy#nvO#&%4aZBCS6DRu zxGr<=jZCjMjbv&3#K%oZEfmfB?)N8QQ<|Ilqm>1F2Xxx7e`znowL2aO$C`3d?SU%K z%f*T5f@J_nY$8aC6_T_K3sxe;bp;}@s|q_`g(X6=NAxWLT)z^ zGhh5oPLHcO1pnqi;#*N8ah7utcWsXK*CuMS-ffY&H+A?XQOU!?2(79D>&_&?zWxe~ z>&0IcSHW@Dh`jG=@wsI<)en$7UX5i6{R`0BYh*!cAzqY{qQAuj_*RsfYD{K3-kB)j z(EW;Z%%83$R+kjpzXjpN*C^nr)t&=!Y7K!mv*J|85b))korAc3J3L^=%n_QAtBFgI z%U{Ng>k^hu@KS85(F?2wC;2j=^>fd1KoVd)cm7E)_&-yy5u08|TgF{mX2A=Lp0v;l z#o{!K089A)4+hbs@wKw*C*LB9* zjcNFi;2VeT9L>cOJQNL^65;4#%Ncaf!rg}Px&%GH@-VlN0CX9zFQ8riCsADA>&Z!| zP+r+tbX6ShMBTP6U17yYc(t})LGgU&D0PYkK(Y`cfJ}qSQCN8#&u(gzKGt=8POGh! zS-3A;C1*m6%wnZ^v8~Rvlf_(n4^)?;YGx5JK zAh|BhmBc;Mp|Et7koqU&+xu3IZb(a9uC@0U4A{&8@cj4|Kf*5OFAE^I=`87dl^z=x z_Kp-z)>OQueZ+0-`S?v9{Ec(WGnKCXKSvH-M-$MH*C<-;h6>;+5Ye(@v>@y;t+mG5 zO#35In&^XoO2J<#iWt6&%c{R7lp%EpM>jsAKvXz!Stw2LoLv+!b#mr(Qu;$rNkUoA zQMUdtg?5CBYaV+7^~GDnn%;heC1CF&W|Te6^*-$uWz*=njyXQBE7kMjn%NLPX^eYAY4+arR*^eGjqHjRM|mZO}$-A^ebrfEpwKH2WLi zSmaL$z>TRJK`dhx<+3F*l9Za5u(P;%Nb@(*JHB3YbK@RIqmzue*SQMnVZk6Qjm6sp5DL-*N2mT+u%d9-8T0VndWsc zAXMWvG_nBff7sg?9xx?Vq)K=`aF?$2jyE9Lr>|!Z4@7hvq{-;A-$fHJnQ~~Oc0D>= zsUMXSD6eya!a;?VoC-sm#=ILmS6tcv)gb`A1ur1`XXIS|?Ob<{K^OXU_@Ki^bpm^e zO_cK;Ilu^SMhj>)%{3|uDa*mR|6YwuUs$6&lvDI&#YI#y{RFSNMt?&XR74_FYvR)2SE#XEpF2A@ zgb1&N7ScFq_@F&0d=fuWzQxQ&nwV<>yBBRaRfO#!<||CO<7V(RTKbr?(RFND#pr@q zMJdlBi)!*(pt1;>!#rXw&ov=-O#k67(0iaJtYdkc(@9~g8RS4w0Oy8HJyTa)Gwn{B zRlDI$nAzO?7%hMioBDp?xjo9<0X4qm+Q}{(Akp?LKq>ZVNOMrmgp)fq-R)jmq4e54 z<)Tx;MVaauEtaG_swFvRz)J`Cb-t%gx#Y0BgRrUn%ut`gYJ1I#Y^sUSoQ36>rZ2HQ9d#`GFNyR{1yVUN9YYaZMb`kH}~`K+u6gp$RdqY za#R{4G&quqlNXFMIwwHZ8C1=kX3ojSn!aGJy5VbD}ebOdye@c!64*6Vd?dZ|ysn0MtFNv|7rk3R3to8#Bh%xxrW#4rh;#3ev_t%2SEwbc!+bdzt| z!hJRxg3Iy^AcHejH2_e>X%{gcQeMNuou*0@nI|DZQTS(Y&wRx1O67HL$hoI?mi*o6Cu)1T zd6;G(%zzgUDl76x`D(_k{Du0!CuLYvtv$=sC*G(L-!+4A;10N=EL^5_-nS(DPbk0^MsgNEwO+%(7Uw){6YELvprr++4elcyu zpkYBlZgduKbnX{86#F#LTF_v)oup(}QR;p;VJAEU~Lzt!xig;_~_ zl;DM6{58w{T^k*s2*s@^fiUd#TRXS&i7baHevQ^}&Q0^Psh;=Yp(cbjxIu*1 zay$MXhHX8lZ96EG07_Yc--M=?l-FW8S{92DSwlhxG3DO*%Xrb?l8SAL!{ zdp$bZ3xHc?Z-;&d0`jWZfOMxwb26+kCoVP)NQqX)U9GDn&11^XK|@p~*jY(Ij6pwq z9^<0Wa+*>_gCxf;1s%1{h-t=`-TWi%e$FwT1Y%3);qp1AyYOYRc)WAsXa7*$`%6)a z{0D@wj-&7a`IK^SBPkc}+5iCNIz23dP!vF2j3^vsy%WcwbMa`nkun8XVdG0}rSn4? zqPq2Y$~)j`*##Ah0otCgV^T~&HdirT!e?j7VBG;a(ffrArjVd}$MQtr>oNW>GqMKa_)VPq)aMC#q0yqg0!YQ71XXmbclF38k5mMNSXBhcv04k+&~%2GC7cG$4oUm**(QH6`ytNWll~Q&0>sIiAZe zBSF1rmX&1MN+nBUg%1DFU-m~LR6nG;Oqa4Q-E76*SR$f~f3(iNxU>$`EcdkLn+G4Y zObpdsi`uXABoy0?Nw@Ayzgxwh;Ge61fL`n2clFvfh1}7Il0!0EK7e4UZrP5S z!zndG&aTm$jg`qt_m-0${GkYb6CSLj6zg#{HvH}o2gygDL%({{FDZ%x3W3mIZ^!&$ zk%upVgl?uk2JP_cvRRfsGb#KT>5W`T1r%6vgbsop9ffc&oHtJ)_*hZL@sy5f`g>A} z*rW)Ifhqv|4VBoa7VJOOhA_eX0m={1@rP|B29n~bPU~pQQ1rAwztiFc%!dZTQ0J(V zS|r(v21#6p7NLRJD*o;Urva$0n64n+!%}Ailbx-VrYpHSyD+-KWE1j9gxjV8Jz4Pg z8hR!JmFVcN&2f1+YieelT1E+g!5403tJJKcUnvRxQ~orOO2oFHw#S_S3pwJK7q}`b z(^lhY=w{p3e%~TzyfFIcE`UwEn)GVa9;rDgEuY$cB`u0I9{4MT^94X9CD#1a!ruj; zNqubNCfP*Ni9IwCD)8bX4h%1!3Lu>d_ld{VNr&vXY!AP9_YXiS;7g2`)oI55#EAM9 zfHwLdpf7rYg8dA+P_UV8f@VzMzyjy)Nsva~u&WpvF7k4xO%~N<^Vp_0v}vI%Ti(CO z;@UkeyoZ?j4oo)6x>sd-I2QVmF(jd~S=O$tRJpWL2- zF1yL+vF60EI&x2)o3+(}BwA2r1p!w?qF_K}k*zk2(psNT{8yy%;_Op9OP(!F0`WV0 zBB%K`RGvW>uE)btQAs>HHlWOGu$z9TVhlD0Di_}M9;U=D;oBtYUX<%ay0p*hmo~vg`=093K)$x%w0HQCO^I+KR)*cRqvh7e(%rNWfB=x`576-e1T2n> zW$2;|2rwY4KUTE@I=?#e2^rGIgCDOTCdwwk!$;@4lj37`V4thvQBd&llV;O8XazL~ z&Y<@v|B}7t;!G}q8fSw`&qb%3BXPGnLX1j5f|GpM}&0_0XYF25q$MzY#51KxO+Nvp&yoE~+|QxI)ZjA>H8 zA>&RDgTF}qbDHt#cAs|K!dDjZCw>Ed$>M%Pv840r8jUnQ#cd;X6uSdRvvbO7wcH(S zdZ*Ka6oaF;ue4vQ4a{7QB6YiJXvX>%UXdWFeU9dR{kdGT)=uW!>~bdB&;Ntc1U#O; z=k%>jC#`;LvDAH*aH0y>XX~;iql`%LM!zY7GEL-#AZ7F-(yxE)Z1pk*BWB7kFU zvy4eZn9_YEbAPZ;e;>kI5ESIjsZyo5Y+S*SF{$EP6W%|K{*-Z^n}G%tVg+}s(XS_m z$nz*yoUv9?MDJoCfK1>$Z?c!140kbgUIJNZFG2e@RC_-;*x3xyp7g+C_^jWE@AbyImC#fVDbD-u?Le2(&&>FKB>zywC09uk}SN z6-%Rg@H#u>Y7~zK!*S{Vk-ViIPPcU_b);Hxrv_nn)S*Y@&|`8$fiKRYI?h0L(TGyU z_>8HqxvZ^7%at-b_Q?u2;r>TIbT=d?3$sf<5BOSCOq~np?*Zc(W;rl~3#V5Q)bH3a z!266jp^n1CHGq)UCCFN+GG!K)IxXlTyavaKz#lsnZsy5(bbh&7bR7O|D`v8fIj0=Iy#u;=a2VnFG`7;o`^SyH zR-0t9+}KP?1W}swg3aBv+d`ywo7Nq9HWP4URM=r8scDBpXxB$Vt?u(=G-sn)Rq~UIF%WG`U7D zGa6wp{$l{lnel~l7RwV?RtLd)8{6yG%I_E_9Pt6hMAQ0q)2?j20x3@Rn6z(&>y}xf z8)a}Ax$bC3I>z5mW-{0%fn(~=UM}b@)-%>_NQ|_mw97gV>-n2Mc(j+YWhea^P3G9O z7#RlCqkXYX+{;3m7^{9PCUqowN91en_foBi5KpSb=g)>#rsAtux<2Kyn3Q=pN<1@# z_!KGbDAkWo0U3 zxl(Q&|37uVG#iSX4V4I?BzG+*x&ohy;Qqk<2?33A_MnoR{dJ$yA%f4VqfV)W2Ij>6 zEeDv;?lSLNlyns|;nN11z(2mw8+}TBFME`3KngeC0oV6BE(V+3&e^O3$OasCr8)zYe@O7U&HTyG#F(5`*_d27Ntsv!)|;VAGi!o1i{j8;NK8Io}ftWF)UB*H&9>vb(nf^o+RLXxR?ri%fLD9=1UHB+{+;8vD!vMq;i+e$aHEQkfF4QJZ<|V zR31W7saZ|^^}ER}22Q)5WUdi-p<`a)nA-VJT5Ul`6gQA5oO;~rT zt9M8mV1;w%nwFDJM##f)?5aK|z+U_XTgGsIo<9c+>Or?Pi8@*3U)CVpEvb(Gc^nZI zDhq`p0P2TU0yUbza(Uu+7f>$%JDld~f{iAO%KLrl@O0WL;j6LGV$B^ zQwVPGW^~qkg<1aL@xL>1;YTRYtit8Ou?ui4g0P$#M(x*!QiWfz_OAN_p-=Ni_4 zknItR%2bc^cfqyJUj=^2##X57S8*>F?R%S|duQTuiqWKbd>zc)v-{)C;LvJ3%5jd* zu=mHG5X?#MEFEV0Z!Tdu%SnS_9&>MpV`c#O>mfh(1ck%j5h9HniRi>rqh{#EsU9uH z@u&mF7=y}CK(WmXG)G zh6;<&!|l*Rb&;0iPS8_~>yr*Ru3qD0G-{;42`sp5fNI!8Yo`ISsy6U_@4A#OpTA8p zB;zSepysV!4C8te?R08V6rLwA(QF47jwAEKFpnx#0mlsQhWzm%(vs}v1p1TxrIj;i z5D6jst+gV$r$J{$PCM}8{?r4AMu3)l__?vWd$}pz3jF5WF@0^Ps(rE}vh@@D0?YA5 z=w8G8-7xk@bF>=xigk>_K46+!wuf8n^ASxy*RZ?-U?6R+d1$wWq}sAJ z`ySQ+H%2d4_0Wz(0jH~>i&z%pQ_6=^s3OSR_*;2Gd67x;0~^YwRGN zo9i4?SOQ1up7`61FF)Rpw3lOFp9AMI!LZVlt+HdfwMWk+OK+ZaaEnHUb@+HPg%ZZa zQn$7HyVDpWGq&#+5n5vD=yAqpgUV!lM_Z-xN73@ec(UP2C_!GFuGsQcCfGj9_}r#( z5`IJCl$3k5owh(5_wG(1aB6l&20@e}!K)PZ=KCN2I{}vn z4C&UkwT9Lc;2{LR55?vp{MTbqjWtcGX80L~<*g2y$FWtA2`%v^2?tM4b60lpxx(-7>mCG;PkJl;0?i0&Rv?_r>3-1R|Jt@+wf9FC#45dTSz0d+y40ha3Yo-&xpFDZWs5VN zrSvkj1g@z9v`~8<+@iA=XOf|bmAC@&?k^M~9#kWqPve5S4Bpg>0qfsTKK=t0jCo&S z|9zjW82EL}hgXBe!C?BCCz|UxISqhFc62J&VEO3Amn*}? zE#z*qOzpeagIB&|Xu=BO z9@-0KCg)q)(IMOG{F(hzy|$4>w>}3%-`L zfbebp!DlwT?QmA5@}Eg*O?Q%?JfJ?z(%Jdg>2Qxhk0Uwyh8Vz5WqF*=v$V9L_wxe? zL&~Bn-A*rs6$qG>K>)r}>W?EgwoUi}4rCJ&M3N(AWf>8FZAVKGym=E5^2S%?qqEM2 zJtI4LO{y?4z+yRKW8JDnIUShH%Fp8zGY>UlnhLu4lSfs3z#u<}lRLTnC(1CC(+Ll3TDSNk4V!nJ7d6p4qDiSJXeT7``BfVN7 z2m7x#gzh)s5{Wu*j|kX4YM&}x;Ig;TN5}t4+CUrzaAbM+wD0~kp5bK1x6@ zE~d@kWk2{U^F;Lh37I3VtBBkGREiE1Rbu|$MOFXwu*$$^uv^Mk1K`aq_9RlHj*PHs z`eh2(lzd|eRvJOK`O-{b2fy4to`oT?eYw=Zw_|RH4jX052-ZAhB@#rM(c=#t+fR-7 z+W!G_y9n{6a4%N-3K_x#a0Md8{Vo$uklbm5x3V7#qGuWHU;ZA32VBCB+HM?3um54H z8VlZ#_*~2E9~vD-Xjc7X@_B(v>Vgyg&Z9y9m)p0g>G<|e-zRBz%$g3^n;hdg5ht83 zOP6}Qc>7cQJxgsS;X0a2oIcw_kc+Y=5^9zJRZhHF&&jQNjVrlncIHydc2pgTlv!)4 zU{WuIl3Bkb4`&^7Cx0k_)jrUjlHC*wlY`wnjEEF>)yM@nBq+;tC-QnekWeWB--qg= zNnu6x7-Zq>Lz!(Q)NBC)_OWIvvJ`6&`kh|=igE6R`c%L;=TeEn{kiTB;`)RllKiSr#aG zhSQFvkBDFT;#gafr?xs69-=^@UV`97B(P9F^Pw{CWMQX%LD|jb^4`6u8t{K>ip4Ap ze7TNRPnE?gYs}j>5`!s^U`gH>zHSLu{}))`vXGcW*CagS-j!*<5EuNKS`SiYkpZ${Ve)>zQK`JOP54ZrAPNsiwIZ4sv-=7UxP9rZ+Y zAJ*5q`>7#G&|XWph0a&{p{mBZ?LISJUBf_6fmV{MN}v7VMt!ybl0C)i23Nk)!Q$B5 zG32NHK%z=U9`wcB|+vuyNt9 z;t(wr6Rc^1%Y@B~JRqiqOhr;18siPXkznqz9;E?ElXd@9T|n1j375$_$PM9BcHf|F zja0bWykrSu4d!yVyqAf|RSgfJ{r^VxAsvh;JC<`3lcCwLU&@0c*sXVX(ad{0zEFFlBd1|Ixc*u~ z4_|o+@)5~{((X2g;|GPChe%ZC_KpbBTe8+%lwxrb{Hhr&i&3?LK><+2o=5|NFxc2u z5+$s1g1?ZzS-5_cUASm`b07W8nO>|>a7Tp0yl&c(u*(BK0)2tj|L*fBg)c|VLj`LT zMt9>A6ORO+gLT=!JquEbjP2Nm6=BE#HJQSF-<>*uAopO|y6DCxiL8s8_veKOjKj9b z9R~ni@^uA(ndcyrDW8l4NXM??lIJB5&*fw=%e9-~77sz8?fX zEL%@OO9cE=1%JG#kU~xV4Kf&Lm zPpf(pT{0h&PAJ(uY~2|>`|yFXS_pGpg};VkDvz!!@c>KTCDuIHUvEH$hXeU;ZBF^r zTnO-S%gTkK0?p7f=2D4AE7~|x$#@N*lrQ7M7}z#87Jee5i%AEcIokM7o0zp87m0-I zej?J(wG3ru5;&)xj_Rnt&QcD!4s|6o5bG}CS0d<@^#QwB)S~z3KXW=c{;CUvJI4Ag z2W&IuJx^yy7)otoU-EEBLtb6PBceY|Por6}Ntg$Hc>=c>=XPjB#Y{FnBIGr2t27=; z-Q#T%lkdCzWxKt7nzrNc)x)`NH|o`B5$vmBgL$+4U&1S(fT5;kqkgzJ5y9nEgio~z zEd7gv?>rYV41!95cuj5y-HmddYwt^O%xckYyspbQ_r}eyZY>Y5W*wbFsjBdSwA0X7 zVlqIjDZ9&C(BuOE>UHcjyi2 z2Vz{8ITCbs;IAx?QJ`A^F^!}GkB!gRimpdVy#J%T0x>&Ez?GNCM1N2U3}&+(cik7M zU?9F~RDxGg%NG5afhJt4XX#?$TZ=&WGrbV9;y+w6?tj#4W8fr7eydi) zqaiz6-S~K|D{_@A(OVt~Z})9r{$KTxvmdGE0?OP@WPzbcJIyRM@#IGI2WA|$t*A$$ z6`G5GlZC!dKN|+V%I>E#eJylAgc?z_{oqRdu|+s3o%-XMM9l8W-sJ{6#kEFS?`A&NL&0Yvl7X%%4u{rCi zB+Y~2vm#!|77a4mw{#zy9;twD$ojqm8=v})PEY@|1Jsh_vD&Jtk1ny^JJbtx*K{C# zlw8n81MI_=w9zu1`wml>gns*cL+#{H{3MHh<*55kD1ERN{DAx(aR?g^I(Z&wd1)V4 z^SE}C>;ZQvrsilO;p~$TfIJ1NsM_`=7gfC3<(dh;AuJ%dsILgs(8kwQadgxx4N@RU z(!3}710+i41k8FqM-yShGQ0|TRsRx8#n>*%*tTieW-q(~X}FST#;3L(*o&FoIaXb( za+&;Pnk_M=w_h?mONeBwp53`@1`ym^Ppi`ni*WLv1XpJFiLUHAg&2Rd5Q<0bFILJD z@u=3L5U>^BE=bqej>nRq|2Lo{^#ay@il2=Xv=2>8-rWlg4K=n=S7NWbog=)y`tTSY zyIReJAx@=e4=tm1-)cVoC|=U_ltU6=ko-i%UOvX?Bm<-!{%-RFX0Qjg}*sM=~7jeojOAx&71#*w?m&qO6#&`S#D*i=f93*BUh)L@F~0alzh>4bcdn! zzjo_13HnF0Or=VnYQ^~GWuv@I{=1z|&O31H1kMqptC>-3B!`=tAE{rtH6*0{u=gyQ zO=0ouhyJ54-f+D88%zB+fnR=y793KnI3oj{8Q&&OG?;bIc2QRMjsW@(!Nrv9?=(e< zh-@H!L!VZ;4*~9%4~A~h4W5j3h#r=H?R=FFnO;UVI*aW1$brp9M(@ROm6o+yS}6&> z^l>F$8qixGA{-<1PHUZVL{qDaDoo%P*VKu9i3`l9U+r+=bD(9_M{} z?4EVJ3W z9y$K|R@LT`&#d*<3I1Q#yYaQV=N(LW!JAf(<5B&aSr^XnK&2lyJyri!IoneIS3D== zTq=zfeTni+DyTB;ddxl?w~zl3%oFNQS?i#WZP`{D<-s?p8Tt@m!7G_Ds=JtK1DR--W>J25+cMEL4s%3>0=d^be*&m8H9KP}x{#%Bt7&4u^j6-)1>dEj5jBnw>z&JAkW zedei39EG*^{tNEtRgvA_JH5kv%zuRElr#8@(~alx9t{?h)}L&};7` zoh!t!&i(6ayA*^*}_Y20S zQjabsWdu3_7+fX!%eyn@yL-4qBmv?P_ayjjl{b^X*060-mr7pw2Z168sni;0o39=JnmTybe*nn?)Iaktj{3=dSy4C_S+59as83Y%e_CM$Ope zy||j*#r8(J*dU6E|D(*z?Y6n^WEtVU(L{OVu`nU~LGI0Mn)Y6X{aN2PZ`6+UXy@!1 zni|Qp&9xw8Jb&4dS*Hof^zrZZI%Z=MC&-+1Po8#h1NS@$`O(L3vI2ANRn!D2tt6BF zT2o{oLFwF=gqhfk6xd~Od$JKTZ5C}h&<`~~RiAH4I7RG03i~f!s5?7f@FZ$-Bo}`$ zdKg z+LP;Hm}ce$eW?hQs_kjVnuM$l|Ut~_-<{8snFJ9dUn3wINEffHXMy+i`Ph04Y=`i0Iom{GYs4FOuogBr>zJ02^J zsZraTEkD!Yi-kPGT28;CSLD(V=VXCPKM`q=`J73s$}Exc={76UIrz+J!jM6|SatxW{PI$jxOrJ?IV_>5HJ9(bb2e?Fu|MQ?O=@wQO^SZH-g++rh(* zOD$L1UebFS{c@oB4<+G;#<~Z9gteh%<^3sT{i6n#I;7q_@poX}!c9@21!0RHO@uGJ zXY1;*HIyzFhW7y;&6p7uK;Z*mxsZ*24R=0|2x+`nE^E88B{)~~If4T(a5XDbY%);= zgXkD6Ex_YXa1WBw+=Gtc^pLS?M}j6{wtm6rFcep&T!fnb^4Vtpb+qG=NYe2mo0HD~ z{8SoQxE)!0s+AXI>@vNxj=wzU)0gq;^T(+H%52n`p7ur=lNGO< z`JZK$VykEbx>H?OZMs#xI~}|MuJ3s_>5wj5>6`0=LNOw*6;Po`16W z4g(s{@MjpZtIH+MKeK3dT%-D8OmPySL;s;-n7_&<`) z`l0Ff?cy6L{Sl;7N$GAFh)PR?fRuE1$3}}vNjFHhbT`s1-O}A-)V61SpP%**-0yqW zeVx}irxUw@y*}HmVnA9xF5}+gJTZ1u(up_yM*CsI~ z?;N=$zKVYAe;EXACTj33!Y@-jFxF{bYCwB&!*QS~0Prr_$9j(Sqr4cI?nnAWAR=4x z==ZrtQ|N^*cK6fwHLOHMUVZoxfjh3vu4&dCc3pKEM_wuJXYM7mcNKYEGyfq;7TX6>ze1CpL;7ZCZUbt7Ne zVF%BK`Dh#%COnQlf8SZ&cnmdw73*D;+dVnGF$FA)qJJUK3P~jIZh4RtEudSqF7~5b zoh0-Sm>P8T5(uy1PM+K>Ardt6|LuEcJ1b}HV4;Qn?O2BXaA9@!4)|1=IV1A^TRN9T z`r1-X;FpGufO1eEIv3aomgJf3blKz;3I0f8(0O#=T#{eX2ZG+kx}CKib2FAyh>TB| zG(BmRg5z%|?Yznek=j=#7@8HiCX<1Vc7axAVT>Vmad^*^k@Ww%F?c~PO;HGanpV>!40#HZ3# z&|K|R2j2wSw8@XN93IudLCWPsnS{{%+;B8ORT&nXS7x%G%%*&#h+r$I1gw+8o-23t z7LlK15PQ8Y4DmYZN@GrW`3AWZP`5!zlCqu(K)(R*flPanxiXiLX|G?h{`kGYa)rd1 zPJj#`N+qhX;A@u+){jSlqdIkNeo}p#YY*{s4bJ2xo1+!mymQN7I;DD#`@MjeuQ{Vm zzM^AC$DBSavx`()OZUkswD|*{wP;~9=Mz{2JyLOK2%^KkgVr*)xSe(aqUq&@t5-Eh z6(qE4-HiQ4r|c|uBkRBnespx>sp+YJHyAj90bvacCUU*_X!-$S2Nb7r86-r9GVdK# zZZvJXLj#JV2%81he|L8>8po7F+?7Z3CEn-i;VJdwpmDv(XSoEmR5*@%tm>F&Vz`Hj1w zcm4|$8MaZTMr!RnW4()%PKDO=N}C}MfNvDxb)NZ? zLdWcFZ>t-`=v$q zpK|0XL7)stkk{UuuoH{87~?+o2MzX78x`2!X7wNGphBOOnC;0kcP;4Tq*XOhCg6?v zD~HEYK1}fe9KA^d?*arIK1AM)I&|fr%SuFTzsZYc3G;V!L3d`OkN={YRAf#*&PN>A zX4iLi?WNm~ZO8zjMuu#RGKEOLvlYZrOZlUDPue3x6HyNuAjCcx5jnfJv5hlBBJ{}Kp*sxfMke#e8o8WMSr3Z;bdu*Mjv3t+ zHSOZK+X&Atyu(wA_+u%vo5A}^;Od=o2@CqF-YVLoUDTtbWUM`)gn&Ur;*Jht!KvvA z3cbRwEkXY%bXrg2ZTl_*0NwMO1hNxd%1@<_s+~5jPRM0et-HS>VRcuEskLRCTpYlM zJ}eSP;r)uCzMm`*^qi zXh@fG4-1W%Mba{2iYeH4RhdZbALRH|7=5WRx|V>Zh9Et$F^dU$w!_O)kOTGNE?6OsmrZ4c=Vo}_p{0laRhFTnjVd!%t{R)H z7^%KmeEu|YiYVW1zjCm|w?^;O5?z^emvKHTCGHqI*G+(Kr zWspbvjxgCz>c}lIBM%D=rHuEoF>wR_UyCipXpLn=G-xPWuP#2vyZ2PUM*C2bw%AIjhqz+bwU^g>20^qNDu6Cnag83fcOn^gjJRw!UKi>% ze!GD-+1(Tx(4V!MBO@p)ZkJiXGEkcNH?)=}xsmVF5IU5o=*uIY3_PDp5|Jr`nh*uK z!yD_G(l%SfSvc|2Tv8P#@Gl(U3`>zX{h2BN&JHxN(PW`NnMqHV5(3)kbeUp1lYlZO zcvRXUQN)OP!S3-TYM)Y$QOcXorOGz^Fo7bm5QTR=HR* zv7&k8N47>Ndv2}R-K#F1ExJ~6Cb+Cp&;U*x8iqBm;wfT)N@OlcAT@v2O~40F9aIc; zX=0)N@e_XKr)f|>%_HkHd1<_pu(BGGyWcvGI1>adwoIwlvJRM{4Nl$k3UDFNuUO8tM1YV`bnubnFMi3XImz&upbL=} zzwr}@@9BZ)`5=WeO*q>m*(Tc^eneix{dcXC=zx$veSF;8VojItnm>d#CI7KeT$sJ1 zc_Ekcvt7ICJtKvVbd$nJEcp?A-FhAJD8qMo3;%-l+-H!d>rmC%k6!1(nSE;lf2yDi zr<>a>CWYMi%!n%+d#_vaCIUFkw3ZYc7Les%du%BR(1v8q^NPiU9NJnCie3W^u(w<* zzW1vP(UZ|-Qhgni)4$H`VJM~P&+6&V4bq%7-%mnS4-P~rKb@wW!fBuS%E8`Q4)Eb% zu)}rn%HvDaz`Kvq%QJ62G9j+5rLQSHXGKyPex?T*7=3!ECPb=SRd1R|!OQ8teB*9a zQ04n51!sNGrvzTyRI?P{%Df#XdxOR>BSDF_Fp=ZhxsH<2KR@%Q|M%h}ZjCK<)6vPo z{Wgw|(1DuFA;9-3;Ct3l`QHu*;4SHsp_T1u*LFA372=E0p8Fa^y?u&{h{YTHO?kM8 zbuhTy=&y|bJ--{QM&BA2!91#IXaQiZQ2~4`xhvuNuO{TX8$8{ofK=Za?TSjtfa!|> zaOQgqO$xP4|GeY-{miRzXnY>6rZM&UZcVD!qkA{*hyD7>^TGB%4^n^l0Aq-u(x3x@ zGu!yQ{V7=IkLsE@d57uus`;J;X~fTfr>mfEx5?S_2j#OS@$%eGC3p{S$c`jt%fZ=) z)K@X5fcW=@7C$))9LyVEwWfPfT^&7&rkZMmD}f@r0%Muw)-Rl|w_2&xcF$4bUKLjRe1Cyah45zm#PL@rY`dPT{S5Uc zY#^aG1b&!H&cE(IUwAK{{Dbwik1n*y-N|sq>|2}UQi#6kg1Z00_09{P#}}!8(Q_LO z*03f=zf|6oIObqug)dFZg&V_hrgC+2nwHAnHB=&rE3?4BewcXqw)Bdf`n5I|=G9Qw z&Pp!IDpvnt!PTVj>FmzsR6-r; z*1f3yf$U}auL;VEiS%oSt@~R;Z>k;3AYBSi)6P~f)JLGI25nV%N{UdNL+Cu5dthB# ze`<0x!~HiT%k}~P{Q%|Aa!ytrmd0?b*>`Q|?IB2%2oqGe|BoA=OpaZL{or}|>3gp^ zVz3lWqJjN0_D2lQbjJ&8oVVv!C(X5uQW9V1pH50d2a^N_47n4Ul8s0R2MNMn2WO`W z^JQgWsmZ)qYYHJS!Es~npY4NssE(gW@9LRpvZOA5PKorHm9h2WXH~%71F?}G$u5fu zwoz%a)9y%P53hnNFe9xG;|C|+b%<#rvL@15k!RMe969BVITF$K{CLK0O4psDD1yK0!hX5!5F3tompIpd^1y zWa=?DaM}1CtMx8tq3WAPb{cbkB1q^nB+Kyp(Iun_yX3BkkInJvE}=sI&4iyKor*b~ zLa*;H;72O(5bb|%A8U9oyz==(jm|0{VUKFEyw8UAW3*X&rSM4hCvo~d_m@_Ah?yl3 z4+lMa>Rd3%0vgMV1_7$tuSUuNcSZ`lhtD-HI0@8Nu6igLnAY=;Kob9*u~&nCon{*o zvEM9mPcbdo`gg0t6j$ysr4XErm>6B7*W>m%o^~`eTqbwSE>zdLVPt%cW~o^W0}DLL zkMQ$^!RknD9p@Jbg)M;vo;F^eAlR^I8pcw@yAhS>5&BU3t-x_0q!6^6OhITTr93$Kds1p0F zl3!YFX~%PRwTqQ#sq9Pr9p@|u6P>lPl5_Y6vLaJ@LFkXn?CHgSyXtKz+g|s)P<&u$ z@mq+vRH8f3p=~mz{Gn>Jbt4UtEK&@%?XYvDW8XyHZ10z~zlbr`c>pw2H7O0=ZZm zrqIsFK)K!BUgd_q2`>(BLNMCb)V~=rW~;$Vr|EiujkI`zwA~=R2!I6M8)R9uboXvg z54&G!I$Av~P#tDhrS41AKx@A@cWB~%A+qFzMdF_^O9w;=?tEy%4twTruHxhCVQC`9 z7{Amo?hDCo75IF4n{By0tF?rRT@C&D_jN|k2Dk<#H?Au4mt@7JK4fTLVeBo_C++nk zY-io(o^6_S?%j^};zg!RA0IVIZIrZ1`u*U(a|h?+msw9!jQITxc?E}8qg3-q`Z%h+ zld;M3du{@&8F>i_TG+K;lr-N(E(8rdaE3Of^xS7*Z(`WC0&VPPv2B2LJ)X6BZp`Iy z(RZI4{kWAc!g)GJTNdJ!+9;v|(|j@3jWvn!UzJKFp-Cd&qR|;3hOb;n(zA3=$A1o{ z?B>xe4h-2AQojj>ak+rKbpN`{$e+o6`{1abG-5ikt!Xk zen@Q=pX^bsXdNl3X+U|LbQZg0J(Z3MM;m2GPZM7D%$H6~Z(6TTiN3`$VzuXqx)R_L z+t7C6Wp_)&AVV|UafRHyq2--4m9|l{(gP&*sE5v;2kzGJ`0y>r??+ z01{afa0kbpyDJo0yi$O2FomjuOc^upDVtfW4^=q)i@txc8?2sxv?Js-<9LHDOe$lL zEq&=8S}!!|hRpSQ63M`xqe(4u0z1Bb?v4=AS%c@+Z5Q6r2x4M|_w|Zb&ElHA(UU+E zy8ar1snc6+_~@w>2WzUxI1372p6OEi(IsTYOD_#D55Otg9f7g-k!dS_ zskHCojif8xpEr`_(FL9_6y4F<+B@g^CdFt57k#n{%{lvR#`#tE2;2m|~3UjJ!gDEi-tija@_8MO$50RYzc3m;Si2&Kk1w@hoG+$ISCd zFKB+Um8AnkjGXilZD_YzL7^P32HhvM5&!P|H)c zbns+Y&kjkeeZrrHVxNXqlvdBjA&b|~N`tvCUOaJFi=~ABB4|Ftupz%P#BJO2q%qPT z$xg%FmqSkJQtvwDa}a`oyJMX-xkN^mh&JS@G ze$k@L@t4j77DnvMb1Fp~jeXotza}won?iuUm-hZ3F zk%Rpp+Q89pd%W_q>tuq_&d!i-K-0qT*fDTxA1~kiqx9&WfZ}P$?XRao*00kOf;X%WIF+y2u&{++N-c#qx%mnga|yFKSvh{yI3UI{o~`+A9uBTd2Cs@1K1D9CWa z*6zm^x9O(RFn=O}PQgV*zR>SuzE{Sl{+RT#!TV1buF+BhP~~^mz-$(pjQ@YbdjZw+ zs@-0%HOFus*S|#%2io5i-{Y@~Eq=#}rlRo#H$JGWjBsrB+X z4TAE5M+LzB1I*FJ3z&^C88P@_^0Y;MJU^Xill*Ee1vR>4dE&`pBL8(~VHhKwTMvsG z(BU>Y|IjJlczf$Q*Ps3<2~(Nngc9|j^(El$jv`V|`*t+bqfu&hGlIMJAHPdn>Wj8FB;^X=C{JL70nt|5Il=T#lR^ppcu|8`9wW8q!R z3GnY~=rw`5l!i}@brC_XC>b+eJvQaIaKLmF9mE-{dlg_aDmVxREE%{tWCauXRWXS@k?0D2fn1dUI<+Z zeiFQ2(b*;eGzG(z2q;(Qn0!j`!MdKaxy#G6H0w zUD?%{=zMc(crwhBw&-!K5~k**x;s2QDVcJ^uhX6>%2;9j8C0&E5`7Z%As1*Wc;jjE z_Uy&Y^e!!Z6350XzwguFAM0}N+na}fzMpj{nI7%@*qY&@ug}^SlO$(pwZjTYla=gS zhBj0gf8b_Wz}qM3`-;ic zHk(~fLrwQuERgA+z9~Ycyfz-HB_DuL6kk=%l!VCVrrJ-puhIZ%U?HlTw{R`#F8BYF^qK&8sIcaT_)yG6I*!CZDMUiV*s$9XJ z_CY+a$TMt7|8U13rovb+iQ2FmxuSha@B4jo~+GT^W=5&RpVgNU+n?>^yY|MS_Vhw3doPm}v#BR4$O-aZZuWnj<7V0w8xq1OjsYy&$^1!`f=#Th$3RKK|swE2I$h zH8n8@BM9AL5P(_9u}16?G25ALWb?!B?DPrWnkFnF7)DMrPkJ?8n$rQ->Iy6Kxc?Go zS8SYy6&?S|)`nTz(0stOI>GbNz^z~sUHjEWGBu=i5GW!$Q+NCDj`LtgqrH^|-?<~C zRSwzuk*iPDe4+t(`w8nEiSxkl4QKe%QeHu!3|hAQJ^1gtt4t9%vGZs?U;>#(Gmp!n zEPBHQoI8*#p9pzaWq8QCn+4|YdK?CK+KOmN z?g^p57<*VCT!48%cA}|`P7uR}EeGr2IocBk!6GiN>wCe-ugCZ8bYmmmGpLbZYs1REa1NwDH46iqGt8Jo9+F@^4i$9oazy z3A}5^!2Ws%NXz{l+xSbpJGMEzTzt)UKkE|JfxJG6Ji{VT;GNUCs}5zf_{ zb#X*G_^G6Tbo(tWUlw|I;|Hh7KjM;*%m2XWo7;4-Ni+=$R~73a}0uKj_Z7^2zq2cS$d4ddHCR}ZFE``Rx^j#8>xq)MET zt_-qr=n5~f74O9A-)X|#^vxR>7EYG?h4k9h3Y>iR6r1DY`9}+6H*Fm&zhew{%sv?R zAkEdX$74I%+0*9mvnBmwoZAnZR7h`Sg8BQtNoypPX*HM;$-27P>qANu`(Dyp>#ci% zfnI8^KH+0lO_MU?yp`3WM!K8?tL~zw2?Nz7@}3~wEQAm%n8RrqsO3OlBaMALfvMd@ z?D5IYqw>?6N`h)>Aj%*?66x0&id=Ri>G|0GVzeZo-VjtFQ!ePp4*`#ntZU8oF4u<-h7X~zvqPByis=wa8nAe#r2*%KE3_c)( z2cf^mn8}WJU+w6W#cQcB)}(W-SmHfvP5~=+{2SWMr)_Q~Gq>AKV*Qb> zBepRdl_-1WwuYt7{B+S+Z4l0VX-y-F|AewqACmge^hNp zNrA7f2;c|c#RtPk|9d=p8MbBFOS_$Nnq1*wglfau%H`CM9? z2RzDmYf~#jDM~!^|Kn8lnVY{4lZBQE7YY>lYlNc}pn-Ka!Kgrqt62DAtkDBGqSr(n z6;oYeh;b+WwpWZUb`$iwka-S?x!k(#1AdK|she)!Y@Py^bNwxmYyv_ZEopW3gb6|% z_g7Y|3^<$6Q+@AuayjOh2;UF{6tEup<#E$esFXVnceSuGZJ^(o^o~Ryc*H(F(rTV0 zSEGMPZ0-OW2)M}W(=xt!2yhQ7k^6FG^U}kn)$)(&`&NC*|DGF`-M(X%u+82~k8BT* zX#IXKAavKrTjbW!!*+Ny7Kj+aHiShLuZ%n?)L%@o%tG`TvSY+HT?0PqjNkVJG^YO`%tj%Y?%AnOn zi}TKwZ~<4|*P2Ay`ynH7yxU=;YWfZ zfaFc7x8ZYw&_My6J=|;qiALk3FRYF47_LfxfY%<>L>ZhiB6t<#1heoz&Ogvy8E1gUNlKHS(4 zB4~E(+l40T{(z)-X71d%4?#EeY4eMnJky_z;d3qYLh_KJ+iI9lwD`T&FsKpsr(OG~ z+BMJ~^ye8{U_Cc6xQ$!BzR>SRuTJeTsndYtLa&Z6x_HxM`yV>)jw(P`QIF`Y*vv_P zAIc9LqD9p36M1BSDh%i3b&Ri>qLsksVqnpK6adrz5^!_=Fr4L9XFItlqCeTIqdpUq zar^3Y196(tf%04jnWPPwoZ3>YUPaB5MYHs_sxv}lhWqweQKfB^>$@1M2wB`fY zK|Nfx7sGLC?e){l;@n;ue*0XgBvDTaqauvYDEI(N${KBqv3gtoC7LDPYa>Y65I}e= z&Z#Cge{ib*p{WKW1z^zK)>0 zy&Sul{G3$n!^>Ts%S2y@M~~pMy*E$})5)k@N(PF+mbtPpqpXYP90CBDtL{w9`JmDj z%K0aqcycaBC=*086*Kqvx|ys$X;=vFLS-DcA{C9P=UMmDoW*PvJCE<8n}fy$zTwwf*l4eLVM-YdTTZ-o>7pDyq%=k)j8-l`jOaiEn zcwO1>L+(sViouEdZ#ZO)ZfB5zcbWwL|KiLiLY3jHo<%F@TkoA~nreWs=DPb=YP+Xp6}O~1SH zugU+GHHu-kcfgjU{)09P`y~Xm&k_4j@;RtFri#twPwVZ^C)wg;&=rCC>eBA@hPZti0oHJ__~a<`+Okhhk( zLoMxV%ZYddar~ux6SB{iZR0(%a)bossAb6jjRkHN2crQVRHDVYqwNd?_Hz#fDZ-7$@=C#4m;^t+LL#UCgECaNzz z7xv6g%y8x44ZjQB!_7m*r(-Y39=Yjn zQ)z``Kc~RGXvdWo$vNwKsG#qA*7daORyQ*XsWvYETOfcsZa~1S*UIJ?=akY?#K7?NtL?A_3e3{e z8389Q`9s5m+Tiz#PX~(2WX2CODbgEb>LZg)_s0&0BnN{9v#Jb7Ngzvd5@$4ob~h)h zV&`(FfC!Fja;ogx_P=<=s5E{f9-0l zdb+JFM$|DM+Z2K%l@uwwzY~?olEbPso~ZG)h--V{OzmR)wGOX&gW19$26e7gAT@-8 zM%(Ke9{spHb9_8S=wU2=k%f+5K2pgJkBIe#0DJit@t z0mfK$45044j9QSY#-mbeSv{h%>MBusjm=s30(^TSmb*FLnuIK#lziXidyVbs?BFkt zk756zylmb1hy7GP{$>jw1m8%+FndLK_W+d{k*6^7z`DjZd@d@Xs3*i=F2zY`2ebq|x1rx2sGiR?=8pbdE zq9k3RDebEI-0`tJ>cerV4QZdpt}hV9FW<%?ivOyl=GCa0{Glj;QUAbh_O1$T9+eqb znF4g(R5vtzy_OZlBAt21+5IrUd~;iJKXGt%6C~{$(HK6eJjJ=^TNP*=g68omA&c`VoIeoveN;jMoUkKv}%gP&N0%2)0Nl7##G1%aHX5zh6K`n!Wn+iLE$+nh zPx}sh2U+J)&S}2?Vl9l8Ag^(q7S_sUlK0niy-MLOJY)wG2M65}O}9yTIY8qOF|^#A zR0culskJL{vpi@I#J z_eH)I_x9ob#G&mn$6LK@n&W%o>bLO-&Y%Nt@vR)4nf7{lIiXE){_Z2nGz%Cw9;6t+ zrw%N%c;`6Sdo)`;ZRoveYW*KuiP1$c9&jF43)H)aVqO-wb;Fc^z(r<85x?1@xy9k6&N;8I$(lh9kZh z@PdJdBV*-bH8o+Q?AMB{*BX(8O-49O1NNiJWJifMDV^*|V94dksW!)NQ_hH8U_JUX z9^i86{7d0@DgX3FOw2EUoiapq5uoaUhy;+&iSFOoM@eChRdH?Z3{a4aZ|xp3F4 zDfobI=k#zpO#th&L{}n95cet3MKu-ihXj7kU9m}D!Vyx~84u>u%6w2+wn>;A%O%fD z(Ark)*ZvI^?oV?$U;9BLa|kW>5LBav%YE9-#<3Xr6i<52GJ=C7mluF4-kKXQ2|ZKN z$yO6tbwO`rU~K08<#{MDhsa=HM?l!feU?RjoReYm&bkX7uXs^z0J@jZ< z0wUM6hp$)v<@oubGil19l4unzT{?3Xyy>hH?d0Q?PpAJFJnt7w{G>_0s9$%~Eh|$!EE<;iN?F z9C^5I;yCHNW#{7Sm&Z`J_I&R;iCh!{WVNJI#2kGN%gf*z{xrAh z$u`UNY+Bw^xkv2MH&ZQ=M^W&zYL2ypS6q_C;Tpx!WJU^7@HW%Hp;#}zPETCMm#!RI z{_Q1!EXxfp+YR1-wAuH*W+^}ru}08*BmGTYokpw@i^v)#4_M&)jWV~~l}KoQmG5ZZ z!$Xq1ygi^Du=L^V3GD|M8?J!^dkz_qv7_G~e(Yk>dRu5|yePz=f>z>vMGo>z-tS&) z9OVEt~q^%a)j7m%SA7qTtiMdE;t5VKJd+WjmZfiATlVM zTjfPu@@ftJQHgI)X%5}oc4x9)cW0qq1K9II4*h;Yzv)Z~Z#7S3KL!toP zhq_1oHIt4z@?n&wptEHn)5TAsT}$sOQ-^&`})W@32tT^w~b9kMl6>|?Vs(lzG{4g2~?P2O}T>Hw)k43a6|Vj)rxbw#4UM-E6KgnmrL<{P%`#$h?X`|qMb>f zeN|CktHm{pyX0JoUajyO4#iktO(~56Bucyzjj~{-am(b#*8aPS!SS&7g5jLUZ==<* zpS7LL_!(o`AfUGPhu39L&1DW|DR3454|c zTlwQ4h!^8jZ1&0B=-Id-6Ot&tvNF6RCAAS${A~w0kb%0sIaFrnFp@m~5E8}0C^$0H z2j0joVb8Po;)`?SCLb|Z|MWVsT!07yQzg^@#6cR)2p#aoVAhNoelX4ohKmA%%ir?9 zFBIFoBRMQ5Q{;yD{0)MCW+6o}ElKB}bFDCo@_2;=fY*|y6Zfn5vQ+zTvoIrsS%TN%e!7%s?_SgJ$Su@~-zFFD3);)FC;Lq+T z{Xvy6H^VS2xe-@o=PlgQe5|-;vb5@L=gZu;rwPNd^`z0i=f{}>X5zB}uD+dFE)6-h z9gEXzgT=yy1-A`ubW&m}R-?clCprYJLPixlpK5cyp3-*6qIaWP(*q8l(Z6fNaI*!+ zkh{{}4K_$jX_dDAj$H0qz_Wwyz}jLz#Aj9~yv<%C0d1v5$?%g;Stp3k%TcoXF1Q!A zK<=HgdTbvpH#%cI9;IQM&Zmh?aNGyaHL@eP-Oqwtleyc`c+$JJ#=cBu#L=vC`m$k} z;iD^mCdz{hJoh^DLa;+clE8ChK6B;9mbOWMH+`2IvdJN+c0Lr^A_2elEIa*>l!+*; zGI(e{M~&u(5&zn=BpF`@GML*N@0KLvcxYyTF%f=Mne!-ZH2a^5dM&YWKapbW`kNG4 z`Zn;j!xd*}&z=%16dw`k7K?c$54_;=T>2uQ)EbLEEFXNrEIwE-2GeEH;a4ueW#pp; zT$6VDVC}C>1K|h(to*& zoIMxLcIRW;C~vUu8PN)}lj#K1vHJ_R-!l1WQDal(VuUnJw=e*11d>VEvXrsrGff;kHoU^V<1W zrAEWB>it`3Jx4^;=TRw;iLYe-ut3J@x30PM|7uM+K(;GLv1?P!2bW1;prXMXjG2b) z$h~|}TdTH-L=OuB_)^^t)+KqLTt|!hUsdXAaDGWgla*f9^TyOtIn4zLbxeWZu8dPQVjEi6#I6J+9Yqef7Mvh)=TYqT|7B0SM=ur zCI({*7@>=w_XEKBDI1G1*q(Mv4kDXAVm06&N?ro=Q{gwZImU~EQ9uQk?c)#fh1VKy zN%I(`YRBgUab}Pd&)Dz11t5GazbVgI=a8<+-P4T^TB^V~EElW3%-Q`uMro!q_IKV> zP9LD!%V(QwBd<+YwnYEaRqRwehT9N(T2dS|&~x!f!940x@_szZC9T&i#!y)fJ6M&qrPW276C z&o=l_*+l%<4;2QnYfW2ZMPb+Z*YK${y7L9VSpw_89Rg0eBk!3h=r%b=@!L%>Eq`#y zqkT>pnH?I^9HhCpfe%`jcv^|%$^ZX}oS5P^8ONp-3)0*Na?3y}vTk)f=pm1y_|3Yi z`#V}$tX)#X+*e3%$j^9qP~|Az9IDE>-YLz^bfZhmIhhOG41pN~-7_6VBSx*>pVpGM z==H2($S-ZXT|XAfl2XJo1#_BsE}#=B`l82b86*87#uev&`FP6PkuuHfEsNGFxB^7~ zvMtdL1tEmTr{p|0f5heGhEhQv^yQlWRbACBk*7nuH8E7|dXci_aF1xjJT^;19Y6Ac zYH;qn4hur`7ni5<@mFQ`=yysP+L-%_@DX#ZW3|k(^g(T4=X&aqie>g=sqcCX0iaAGm&w8MPZYw z`^JG{sOMQt>5N&e!RI6ZFHHENHY^qpxJhvHS%* z53l!}B)Y3QtHNd*;Ll}ykdk_B^hSCIYLw`mXJ4X7gb{rc0Q1c}U89Rr;NO5rngg+1 zR)DWVO3Lin%fIB<2VUA!mBikvS_P}Py&BnKi`VvAJ>FAv>`?Af6A3NTGs6uE^tu!Y za$B+42ZB5QP6hHJY(JtS_>ce}5dZ18Mg02O#38bzdtgsgVtgGs^3x7MOZ98#?f@Sr_mp;QcniJO6ild>@& zfmFH|hmGs3=WQD?^-xltA4qxnd{_rEG+^&?a4BOGdFnJQm{H_#7eQV zKEF^Wi8pM}x7hNBKBceuJMhOw$Y3Iznw;e&7s3eZ>t^XRpM)B4Mhh{4D+9nV=!fn=kCW5w^>V-ZD0o0Ex4xkvW{9xhR!!^_!Ht@#Md`bc_6ZP2XH z4!#<=2UT-mEck7 z=6(9gQAIQDveFtss`smDE9rn;dNQ$T+8db6G z=2u8F*zvJv&5AM4!l+krR;{E~O`#y#5j#dYxpd6$xY%} z5~Xb{gtpan0q{qBGVx%doNJZyR-uk zMnoK-)uZR{U)A`4wMAP|Og%RRfT2+@Jm|vU!CIZmg1r}ys@QYUsAg{g60iq zkuY^|%fo5K7fsp{y7V2N=ITIK+FGG#x1KB3<%7S;O;)41_3oQC4_{mW)z1H{a~ zJ@`^MTxKJ(nD!>WjHCn=Zr9~v#Om_^V+-gb5E=T{rj^ox%7ycDjsl02TO&V0UNy5* zbZuhtJR3#|tG8kNA4g{y*L2&4;f<6Kln`lHRyD7cF6+z_+cGI(8SXy{~F^H|pRJYR}xGe?wxutw6$mBuI#IbVZcjN^Jbt=H#5%wjgk{%Sb*^Z*`mGF>Wp zM{)r%dV<7zYI-#EH8H&<-ML#w=7ekbRb4F1SG}UI0)Z%vVlfM+mVA6*xjo!ZZt2PS zxrr;y6e1r)X8eG8w1%a}B&5}*-KK@oJ&a0Ke?qt>oJ8KS`JaS?f{@6;^s*;5wN z%{>{JSto?BS%Y3gz#N?h$At|&Oo~78J|5Rc#gjo;^Gt?%y5;ztPWHk~g zMMIA&y#$-~?KWnN94P|A^@*$;egaCgylxoVW6EM=TnPe<9z~ntj7^ZP;%tx-h8VU; ztfZS*Gk5DRqKWJKIl9soJMg}77j~N0@n#&5;q1M#)*5!6dDNbfVHm8WiWBgmxBa|r zi4$s6Frc6M>nMo9Dq)MM{eY$7zPOD_(k4y6F!(kUHDLZE4M?7Ltua*NeeoGSCp zt|w#&6KZoHD2Ovk-ws`(U1Xun&$kZ4o4v82TNAw{7-N-~^%(Aj8)m&-;Ok504*ht% zW}XUguw|J`3QRT+YVbSdN1s|5Su+2DPPK*}DGW z^;oiv8EkDa{`>$hWz<58;_1i_L<6v;U{}IyN?9vtDmgA`;Y_8=MDwkU4W0%mCBE`# z-kP3`+TvS^+?*(}EXLGAbr+6-IZ$digUg6(-Z;-|`f)ktg+M{3$4-;dm0rJeqB6+G z-$?=E7VF0^8j8qO=nb>~z8mmmX zBR&!UTu{x#qjv;L1+RdmAONnu!aBW$2uFNKzkDtDqoS|T#Q|E;);r#Wa^+GPKfdirSpK`$o3-1mIDEzsFV&$OtjVvOM#OlwuFT3Q zS$(aclNTJqo0Lv7Un6Rl2rHsN-okT9%rUEzS~u;4vaT2Aw>((o()UV?32k1)_Gh_N z6Z&=())%h>A%6%!-AZK4TK9vFjz224dF_L3yP)jbNlE?~#i|de;ha^DWD^Bv7nk@1 z0c^Sa%O%W;4E zF8J|r;3pW&7tU`19ps;VtBabSMjjVkX)aKndy;lE} zgsyIh&bB%9g>8*W4;fnip?)})5^RJzkZf3;3AKe+gt$2pO zXJQnCb*cMFYwHlplruId{*Xmx!t$87U&vdBa<6ZntEeEp(BIE67n`b3 z1vuN~m5*9>Pz;L{G7b!Py~pX)3Ig;qd>Bk&)Dcs{>UYmuRp<^nk5dj+*?8#_?Sy|g zCOsate$G}W-^nV`#%GpPy8C6yK0QK%E@xuvVq9>zdIMRO~x+oOtU0^yHnc(1`a*qEc5?KD3N8L}~K%G86uzzj#cR z56<)xi|(d=biIn80JdAtT)FW~enGcvLl$e)5E=ojKmo0mUJ5yu&< zNF(6&$l|Aw;`GWE$r==QiQXY}(x5xAFzDiLM>-~5sDm`fRdGT}bz zbm8%ZIX8Ki`9a|Rim@=B=EPG6DV(WphW;0ac-2%}$`6pgcPDC3`><8woKm!X&<5wX zr17e(tCuZ3gR&j1t1*_bUv0hAhjA}EGcoHyY=J4(DBBej$@_3Fu;)2V^to`Z^2U7K zo%UD^6!-i{N8_Xo6J$;N88n1nziB%7k9trhW8!rqrq>Li>&1bhp_n zQs|X<(z$rWP~79cQ74-VTO|Tywd3LwNt^5sc3)*wKOG{OQh{v^HdmH4$d7OX+^H&g zH;6ue{?VK8hm=Hh)Yytrg;0yG-7CQ<*0S$|Xt3kR;**=#vIs{D(Kkk4UCNBe#t>ti z#;2NCN~^*H*CG#Ap67QRnZHIG7oix$Gw>CvmErQa5dh zx!X_wUh#v#BQLd-x<=m*40#@>TF!yu~igRLG>b>UcHATF*0i z06S$xNaexrhrR6#Ks6Ed#Y{+`zntfa;+$`G4O0s3(L?LYCUPKIcw{wKrPkdJb9(hES5(ql%uT=Y=F zM0Nedx&5OhA47^R0}DfnZ5G+R-{*Koo$tmg6c~2MkMDn_Jm0Iacr-;QTEUMIs^$$q zZZhj@zDmasEvrq`JPZ_rXvlOTz;+~ZcyMfSDjGMisYnYmZuiFpr8tzqm3{QHn|n7J zZR0&Hvkm$t2VkGW)lospUPPI6&UXi z_LOtDN`}B0;NmRJ35b9$J_y5l@p;nuyxywQXpg&Bq`!_~Z=t+zjYd;EyJSs3|DQ4b z*7^^to6QDJ*~9r(`L9L{RF$}4gXzU3E~8TtORsa1`m2>FC;HPQ1?Ec%>$XLckh)zN zla^|-gwkLoFN_2W6PNLI#Y<)3k*=D2?UT*HrMEc`b)!_2!;Wxp? z!&nbw5uH7NIILswW1(xU{i7qjGHw&RnQ_ zczl>pr~Sgvv!r6?;tP4W$hJ*(+(HWf(h2SwwjJ!R&>M?$O=QM~qSlR+t;K!08!vTx z$O*VYz=8k?KGsY(B1b#_ym2ePIA6P17;H9mfyB25DQSZoiti3Z7%ukJb&jhQh$spe19IgFjy`{)HFD*jNt ziR~}j!(W6+)9LW6pAYhjwW%LW|F^I&Zj-#rOJD*W(gXZ-QTm(^9L&cLpsIU)u1THU zY9;SX?jgVj*r9d-OnMjF?=+o|{LFv58Ueeh1mhys`><%*JObU@*+|+Io#_!}MobA2 z#Lq2o(0JusM^q9F+k2k$>LUZJX;)Zzu^yE2QBjW9;RLGI$q(x+0Y{#W`fnD-t z69i$Jir17RwR5I(&_|C2!)E_ex~}X=L>%{u6ge1kq=osKb`a_{G$K;|ZR>d8{)+nM zH+<>?jl>sUGT1G+93}|B^^ru$JbQ9bPbuM4YiP@~5Z)vz_rWQNjpPf_Rl8Tta)EIk zR;H~1q~da8S6$TYosy-$7RqcO6TZZEnaQK~D9PB|z~`+VdxC3< zn4@KGXnWG@pQkTvUTtj2J_Rkkha!hswtbQqYV-78#OUK=;P>U^WqfYSDb6CgaD??w z^Gf#!&l;|m&_-(W<`U_G9MD%CSsxL+X|$FiSqzHv51025m(wEXV#3_%UiUlf`8}Ws zUnd@KOTPwJSh+!97*LwMB+%01*=LKuM9Yv{G=U_LmalX%^V0XPIaZDPXdlF@|FC%V z^e&~W4gPvj^BZkMZ2zOdRp+)-Kl+i;dyWdw%v>x@Ir*V6Lgk-12dbo^3I}`f z8~|V)5XQMdr5oVm8Z663$9!0g^%y#pWge)uPnXc~cHwWh(jj*aHfjhvt(?Uw@5@4xcA4q>{HUrHtj3kFz>Z6`qCm6l$<2}G{+^M5D~Oip zWmNn>TTAH$$6r3=_L=E{h^Z9d!|Av;4AK6s-=04%VNL3)+TGh~f%3JlGXOa`+1a*o zS8&kVJ>Vo z+kNfUP`_PHMVe;m1RgMISO7(haf) zp7qAkKe^7t8sTL8xW7z3pigc5S_n zTpV$Juv>h(K@AJihMMMY;%JQ?SSwGmdRC=w>DQ(U%KrctS$3A7xI;<=*|&Y9IBc0* z0#wA8l(X09*-x2BaKB5|T{l{~zidt)9?HRFe<8(DBCRQ=Pmp_F7rZTEivC-^)&@E1 z#lpo;dUch}y^%sLm_EXIiiS&2NzC-F(n8GlcE`9wXE5VUEwsX8NrgokQ^wA`i2PGF z`ubq>WJ|p_PZ>RZ5eUTi^1U=h^zAD`r1z--aZ_9n(2G|e~QU5M94X;=X>>{OHUAxcflrv|b zhwUogS6%}v$&Eut;599g~S7Qnyx$9q`l?dUeQ9PFI`9T2x94x=L-EqN{J_V1bm@r@X8F;KMj#T|1t zX|Y&Xr3!f#_b&{2K*}g%mLk3HHF;&=GY>#MwAq?1JPgkonjA;Xo>aY)SDr+t|uJZ09^G<73o+V=-5g6uTemr1#&vfRfR zhIzCpQZjaY$I$8iTtP;A!=q9@Mu@tw$epHQrQLyVubIjj??r=Vmz`S0vEFDd;|rVe zg;5%F`9*~|Ik3^!JCC=ROg2edJOlaGf6OQI;~bdzp4ExF8A!2m?dsoP|BB}8ySw7M zwmV5JTQD6Ja@H$q-ezZO-8`lg5%YH>Lqe#Dv9)xgEM6vY=dh(la!DI7x}%sUxu_j; zf5-Fd))3gVGHWg|Ym1#w8;$DXJ`3Kesf${k_4yjQ# zo4&UZXAiAIh472jv_m{?W!xT;>|+=9fuH}Iz-;`#;AR?Ym1j=2vlWxtAzTxwp9&zp zn_k4;-+7o>_~OqU25$YSkZdRl!rSLHn8!ZwXXCQDOh0xPH+cWe7k0Q}Aw-hq1G@qH z3q2{~(K#&-r}(jN!9me?gPNXOYr1^qxOpFS(T3UkmL+A?UYSSO(^SO4@}=LMHpLd=mUtMO z#q0xhtovSdZF8&*Yext^7gBh#PiL1#QUBOzDg1GAwZ=$acB~+Hl+dTpTF)Uob3Fdt z1Hv%}I-GspY|iS$=N}3}xIlsA4POMZJZe(qSP9TBcjc>zSL;UdZNZ;$r~XizTNAVc z%`LNa^RX^X5&y_1!g3lUTT>>aawZo9?~|PeTN{s8bv9K`#$csu-lX^?~C z72b?cNfGH3fOAgk;4cGWoT*(V%|VZMOX957C7NTZ;+44rvr@PoZeS`KocFZ<9GN}Fx^d8m>(liwie>oVQ3v* z^Nt|kJ`R^Z@zhn3TkMIRjJpo5yb=~lqq6{$B1*_B(0u_0 z-s4b%YmWI9rT86WEZ-G(n+LakKu_mkersW~g5FDRiq(d|d;8JRZL<``1P2f9@{xk8 z@C8g60e5ZcOx`PCkLa0bfv6UO8-x9lTmF|`$srk9-gv1uK6juFgS8-x!t21x2XH4B z|3!xZ#Z9pR#hqV*P(LGD;I?HEbDSm6VPJDkd=c`cuHH(P;^!{gIm6)7O_!#Xq?3Tx zg${U=i{~TfOyS#Xj9oC46FJf-v`#~&1S&b_C0x@6I7)LZxos-_(OHb;0j zcABMU1)!={Y1*VC9=Dqfe{sS>8)HKG{#$LrA32DJvr=kABU#`}ECX6%;-8kW?|mO+ z&+pr49L?@IWecxOIcALcLomQD%QjyrSwM*PV*1 z`^#o*iA#U`(eIah?3hH=$8yV`8btBm0rYnuf)4@+0cj4PV#`(lX2p+iuGNKeHnTnH ztJ6Z|!u{5lWpo|)BZXLQ-%+k-5N z=T5CQ5=F9gqFSl>P!B@DNrBXM)Z+~sLSQAMiWK9-KH=7q=!*K7oSA<((+4M#4rGiH z-Oub{FS;D*&&6pXM|m&X+P+1KQovVl0{S#bA=sYoYHOEAFadz`Lq`RG4sa5|h%*(| zZuaj|?PBi=Ov-&#H1i$UnwXl+KzogZF0djA!_)zZcRW>cVB)Qu4cJ5g>P0Mge$cEi z+nnQU$6GGg?=}v{v!!S@t*xT1uK@X6v7@zOTR2+z{IPy2&OwPe7#4W!Kt4?#oK^N^ zb^6}cdxyphsh%PJk=aP5kr3=)nS5z%QhZjX7siAgrs{T@4`>L$tldgtRt`ChN)F_9 zya&9qv>pO@)bX`_hn0j|x&FJK2>gG#*qF^+@am7+O)Z5dk0q8_B&O@x>7Gr7`M)~( zaCrywH-T_l#!G~1M6}F%&T?QyJZqG_^#>K$xG`@dYA84_e{b{R0=T^R*;u(MDx86E zckwC9Em}(^I+w$N^yT(q4bX{%0n#tDY{cYk;fiNrkk{ikvdIDYe4SK#o#zD&KV&cu z|8(&%E{iYAC{+SVM&;209VT?|J2;o-3-K@&>-Y>M=U5|oIKA}F*YW;%*d!ovIfbyf zBgNt%c96mnugKSEUFYUq4$=2-*Q?KjEb7JXH2Q@9S(BfXHGgsTbxnS?4Yk`o5#4|W z{)J%FF@MTXd3#TOEI&7PLW3{rKq}m~FvO*2+kNZ}CBr5Disz`G+ABgF@F_YRC-$wPl3Qw_P;w#p3yVgf^%bG4gIL5!YRN!}c?|PB|peyZ8`L-LhE_;*SsK z5hD>;40^?jXV|a|T4R>R=*Py?rJWJ~g&nobHZ0spmB+^{5uZj5uR~*UB$}tv3l((D z)!Y9Z%8g1nTN&qx0+zC}GTQ_N0RkU;`g{xYyWCSkGuas~Sa>6>nxI&XbF}F9Ivz0S zg2ZgIbnJ^M7E9}hqm z^VpmN(>VEf0>YZz&J5A@CLhalZrioTG!{S$G(EwdTZAy=$+uA*G9h~LR_$W zg1tevatqVrvl2hXI$u{?F4)NPRAD6TV)0l{Q_=QbLoE~+jDKuz zB-j*YUh@+BFGu%`Yh~T5BP5|L8PDvE9CwR+se&mQ2q4dIu6YYCo)eMDPGQE?2Obm? zW9GOMtQXU4u|q^=qq#QL``A#mLQzhgD^NH7cI!!9shPp_zVb)F?si)D zu}x9eHbC(yAY zcezNm$>;4qLS@pE>9Pr7nt0c8k7qj^vulS&SlG^$gq@`?9B82r7wMxFnI?KK1mPLZ zOXp)hqLDjKKnD$5BH$roBh+?^-wv`V*3M*)S?Tby&-sPgAW12T+V?K=rvRRt*4F2RqFQI#i^Ip8{6&F~!4%xv)>cfyynKBg3v;wbco*%2VjSm3M*qTfq z29F#_Y3!25Bh`2GU?GPuBu>g62l~sB#mcA-lS5MR9(fVF_JhwE1sbMSP{d(7om3DL z;A;+#ubFGo;Ld2=tYl?mKS+#tjHfQ|AVZi z|GRX{RH4aJ^Upr#fq=J0$d46kK?W~Jc3(t+Z1OEDB_>*=g`QfS?5S?|-sFn*HGA2m ztvgja=ecc4|C;Qq8?Dr5KCAy5>l`X;c0w{j#+zqkCT#GUohIP8?(FL-0&M#7zgOh_ zWODNs2WY?anE1`8y=W^X1ZQPr6BJFi%82uc22gXWh@1n;#Wa#Yl=o#uJ_6B=)Y;3E zyA3~|G3s-+H|nL6FC$i^QTJX!Ri((LVGuT;Jz3faj=PCpxZ=T;gTI*bj%AK2vcKg{ ziQ$I*TZ{L03tZU zgO0Mu1zrT2#;eRz+kpGcHW_f8y<&x7!#MhAv2C`?ED97w%4qQY!4P0jn**bck7R3e zviO2mCvl=VvG4Q|Z>iS~kAdr<`2ZU(dh;n|-b{y^ThjUBTS?GForA$|W=$jAS*Zr6 z9?{L9;k5JOwTHLE6I+f3%XQP%mWgFG*8-#Z+uE+?DwT)cZT3v;e}Ye|KV== zam9;H&Q$1h)#32DK714PZYSJT7kLJ_P$ybg#6MGCwv87YJhOZ=_S~8lW4xI zh0~0kZEnyKf$G+N^*;+E``rW=#cqvySAEzMRmsYa>Y8{pUYjR|jbwE6X;Y_L^IZF_ zAe4@-NL^vNRJPXFX?!H+Oy+WZ6;m%`s4Ejdh?y2`gTGU&o<8S-K?=Ac;>m6zSq&?m z&11iArBZlPZ))(IZ>8io1&A|zEhzjJabgz_7C44k-C#z!Kgl#^EP zVia&S%Dr*l)Y+xSS3te-XUyH5YLnFL}X|a9@@j$mT@iy&8C3n=q+NO+v+*j8f4=Nc#CuPu!4WSs3JuNA4=}#g}&me1!;x}dm zx5OvY2wAB`p7zCq!Zf@Bl?(4|JIx53HC2184tM9#c0#~u#$!TzB>tZ9igOp}zTuxg zmV+h0vp0KuHzj@fou{JG2{j;-$vwlpj|G5B9HQR7DnCWRmQPm)buP3-?2;a*6Jo9m)VjfK+=ZrKK1dNL4y;%?M!lrIdQh&q@RxO z2REy4v&%7lyNHZGDS1rUMKv!WIl@~M99*Zgk3`y8u|IAJ!R@uD$AE2xWnaAbzcS7O z58P$Wg^JOW?T_SE%3F^Y>?}@x{Ivi2BN}a}@5w|_BdPO6>!N~X>}_4c(E{*wCPg6Q za>B&;SnGwHxjhWaLocc|+UvP9G4e~%&HwWlG=H=y;M7M-TGXqde7Q|!A#F4kcn%Fb zCzA9XU9R>rc5kl$M4N47dh^`04Lcr^TL`K1&0ni<6=C;}Qrrv~bTtI%Gf~Jiej@Tk zc4IdJQW&CMSy2&9P!_gYaO(WWxm-*aij(s&J3CaB&b$L-<#kt~3HjowC(s6Te#bIZ zJ1doOH%l>%k0oCwt5ZovIMobwIH1wwGo6 ziLgY65$GQBd5N=ZfK!g!In*@(6Gw32+Wht@{|3yL!^n`s%(fYQe9@V4fj4k{Jy|w( z9@DX~FILH;gzeZ~xn%=pd-L($d*^B*1a8VL#&+iYWyBp3Z1!_VOQVP3iZ&|MMEt25 zU*bbS(T&fp5dx#OII<(-2+V&gKbK%tkOU;W4ny%}5mbzcp_Jm^F0w0$N^=%?o(Bo< zuLXdc^iEwKX9{L702`N~W+23zrQ7IcN=utE>Z*0&o=x3z2)kYH4Kz$2CPNRCt#-7a zbjn+QFOum>!mjz7PZg?$y@}92d2cTFe)-?OsGo)QYQO6=3I=jX_27X;DL=PrJb0?(f zK7Wfoiye0x#-4B43~%iFu{8u&_C|95K)vl?yO;v)?5tTcp}g&w|1djwu}W1wy`exP;R{cj^YpYFXWa$qb3=;vLth3IoJo$K{<`74qK*l5 zzaaKu14WDGJ_^zt@VBcAW`**})=2KWmE`S?G+ypp?$4^ViSiqGprlDoJHXI^d>0Ow zx_w^~MJQ(zVHfYLHrj-UYn?k0M<}gy#^w6ECt668nLOibeIsiN4akta;PTe3!9cb| zj4lA9#OUoV=B9Gxk+K&p5=`0xeJXewjy2X5#Al9%?pOLd6$G_q zfCjy%99+S&>Uur+wikpsd}f{#V*dBD=XCL# z;EbM({7eMH1Iy;G%(!IB2;yS;A+P?L&G~thU18jV7Y*BMUq*1+(r>a{f6C9N*op^y z`BeO=Sx5Fs4C!~g5ux{Hgi!1x0Hbr~YFeg_}l_FyK>X2suE2ypoZ{{uPz= zEP83=BL>=xaS8jYm&S-R77x4=4kr4K3ce^~jUztUesq7eTZ+o50B>{?T~w1_1)#Ls zuNF8E1c;iKEqdz6NSorNc$a=#h#A;_FTs^=xPdc;@#%2R|zjg#X-$1habek zdY`F0%fOv;(9i|X;*6OVo;q&gZYXf>w4`CM2Umz91+mV5Vgw#Uy7&F~K{07L4 z(#Q6Z5B0!UL5x%@EI=+uR0;WqC2=S&kkb(z^Xp*OHWi)Meq7P+oxIzW;AxVPvFbMJ zW&Mdk|3q^raw)nuv8w##??(Z;M`sJZjq5np=D<)|1=Zua9?waN-%M<3GK5y;2#k}U zwC)>?xW({GC`BR>zSU{!=F3|7JllAQHM{l)eb%^d_~!G3u7q46r|}82QX+KIu&g`99HT^S~(8PqIgpdcGMnv0T8s;Pk?Ub^*sJ z^}2mgq|@k7 zwr`|EAvjxBGu#p`;hWUjjXE2qVSnCE@I=|}(-CQFO%_GH=)5{@Sl2&M)RHpN`I)Rk zdbY8^eWUm~L;AuhjXf&VFp0*|xp2}}bM;4B?ntQg1oQUau=tMp+O71XRpGV|J1N~| z3LoPrF3CJ8p&wHwlRImzsb-(#WL?D$*ujt*5xW7qEXgDqdJbAG*Fgds)6KRJ6L#QL=y;b;hZDCrx-2;*%Al zgiHjwj=!ZDwjIe}T|S2i0AuS^qu<`C16ny;s$`y%LTK&fp{RynaPm>r;+3&PJ!~Ik>xgYZD+vG0GFz~pT(Q}2qWxuY~9V(%CeQD51Y9_GR_JgaM^^LmU?{4|@OIj8s%9DcU z3JsV>;bl~Fb?PvANWBdvy%jqxH-ysHe%|GIlHkxRvy{p2f z|LOOMp2F6}f;PpRy`{kSB_6WLd&c;`>>#&5SFBkiv=AU>j8;J;Ore@0iy`3Ra}Pr? zRT?v&_4j%K58g=f)fDhJ6ibxn;T@o{_Ox@@$la7L)PI@0MvxFw^V_5X_55Cs;Yq#QSee_luPTa4Wis?ZyAnN zj>+E7kD^mEI;0~M3*KYzI5M-cyqyFBjSqyq0hhfp=HJ0o?IUYG0ir#|6B-8GE-&xJ z7n1hqE+k8T7F72p*74wSOcYi%9xa`u1AaJ|AKo>L)yoyQMe0Vf_x%F&rAIct$@f)C=;8b6!4WRCFqqzE&{(3}A;I%uSTgBlpXQPcS5PyZgiBpiEbx*}Z-ta-&go>DqDUN65o_U_jrA9D*?#^xiZ+LG!3 zNM)UXcD-f&=}!H{mm+50ZzpZnO!*%niPBruw7Tb*9Ajrs_??z6T7vyz{S$-{x6-&l z`;(YX?2n9eO4-ad{nIsd)$4X@(x)pZ{gs^eMW_~q29u5y?D-qWV`R9YKNqz1k8;Kd zE87bc!PmyZt!M9#o*ZArq#2A>NUs}{>P4cBR3N4(mh7Nsa~tZ^e0pX5A~RYsN>Q@_ z?~*D#JzAnFK$!lvn~T{VO-``?3va*G_aPpw(vQ zCtiy%w`LO8D>kOwvnRry@vlw%!9f7pxsRGAoFz#3~AQA zeMn`d3iand(v)l9;2pM(3%-o?$FXpu5egqOoKD4H$9##3p}dW)O|5yhs`X-5s;40C z4E2@;p=;BYubgKA7r)XavQ_w&F1kfLbCWdKRL{~TYfXrZ>K_QlXO%B_jEvR@<5#mv zDrRc^3EU^#`iA{rS(oKQj&hrCC*_$Dk2uMx#c$wonhm ztfNxE(X%$$-Kh$rno_Uhg)3v2{r%zZ&PUBw4AHb8g9e+7$)MkV77Ut(mkm^&mAxrg%DSy57wBo2{lp1>_#V^;x#w%MFyQHh#(gn`n)d+G2I9WzCt`%r8_bqs1A;+2 zk^*xH@=sNT*BvSdYq|jWXomfcZxyIrcibLaJzJc4me5eckat)ma=nLYM1^Pt)rFia zk0UF7eLn&7VSv(?Ln=KZo8OOOJd?CF(OIRw5{%b)S&<73#I*?uztSzXc{6ww-cYD^ z+jH^0XDyKTWCxmTP`QyH!(rENxd2yXdJnYh{oldT=;zo9ygR}u*A#F`Qob#QVE#jC zU%QTLQig5^qCXX)EWp4qUNV5Z83VvQ0o-5r{w`}Y&3E3|8UscLV6WanQdTVrn5|8W z!RF`=CcEl8E=Fnn8D8wUy7U>I!_GY1d4>}Nu&F>W@Hk)3G2feBRGEBRkLUvT%5muO8o zKA{YAQ;)NDL)Nb9)gt~^&cnlZ*ugeOaXPs4{=+bA_wVd-$q94ma1HR$>Y#FFHSFQ7 zUeoJ}+ZQm#pS4CSG~YQ}4;$bCFM?MC92pB6eZeobW!|%HuOA-VhzqOCn2L%Jrx?|) z^UTseti8I%=aymB>@9O%vFmbPy*=#l7)m0cJ+shf<~)cI;Wu~iX?JF5MA&_Dv}BMp zI~V^d@ZmmaW1ou@c`u}Kn;g2w!Gu4S3~wfM;l}|)ev5gu;311u4N`~xXi5kZkFQjh z&GB=PvZ=a?ZlV## zfuSiOf^>+mmn#$ZkWeFl&yzx;U+|>ir0Rk71+xd*k3;sUVC*SooLaLYv!4j+cSA$` zx=S)s>fqX~aoz>14f9J(5?e6oMpBOP>u#ZTa+B$mOVs{qt3CMRp{PoXrYS$mN$SPc ztCVnk+n+2%V!3J_aB;XN=!Rx33Um(YEYxW~z#!*GgAji@uY!PBnPt~C6h;FHO6zE5 zeAtHr>A7YS)&syj5sXX8aFYm293R75>D>&En_`(r!FD>oA3&Bi&1Il;xE$IFbdUNA z{@#a4f)8a&nHF&tbyu$_Vn55$aU+@c7 z0l&Q-ejQ4!nT%=F#>=QHIm=Fh6F9&3vKLFgB$NxU{x^L2YL)UB7JSxCc(rX;u6ERz zNz;K_VVEE7ec+?o8Li@7Zf@CY-ur=X^(U}Eu+pKWoed9|8l!d^+xzTH&5p08Gx!eG ztxbxCSFI8$56C?fjB7>Kz`FEXgJOcgV*h3-o-~sM%98K(U`iVbt@J+*90NAVhN;?( z+d;)Un9pgK9jy-8AgAFNg6h57`d5p-wJEj)oAsb|&E-$*2HB0o#i^hL4}v)Yd=;-7 zBmHtJs`~V0{J3;|T*4iCUI8f4V?2C+M`?+;_UCuSes92r-ve&gSgquKR;<_E=e?iA z=N2vLG-*@2mrmT!9BvCN1+b_{Bh1=r$sf6Sm6Of9eRyBM2I4dg>ax6e@A!VcS@w)N z<{R$e($0(|rF4zMFV$`xHaX-QdV_*0U4X(NGCdnm#4d{5Mz)=`;h6c*suZ{cU8G+l zQ$ZKDXo=83Tm-`wT-e^CbsTyBFQ3E#B75rr8SMnN)?x$Nzpu#KM-6{R+F}3%NJnf{ zLLj@Q3UfExW`=`fgbte5|5NGM_JHIaA@YdRq5~6fwgCFF_ozwWCpM?5)D7@C?I1+? zZGImE+w!(Hxk|?FCgj0AUdd(g2KR?tHDFpC&c-`r^Z$(wA-kBuwGz-JEjH#hN*|0S zuK9Qc0cLEGG?ww5;WNx%{v@MPKm3$vd!LN?=sS-@F@_Obzr-e+RLh*eoUg{iv(lz+6%nc^Ld;^^ZI-4*QgOkkMxG-vaIaI?T-tzqHM1Z zeki?A@OLy2;!aX2NEKXMh?X+PdoR_0M6NbWR;Ab3EjImuS1XKL08)|ea1TWkb+xoc zGn>9&mW7o>6HHy_*rjCf?cZ3PHbqj~C&ucUtv|u}iKl&Um$CRKM3Sr}n`QS(DoA;A zJkDXy+URlEpS(!Mmd~9cCw3-|WOP&EX2old&b!Zg*T)G@V1L;LxRrI)g$npF{bEm% zheujrOe}tt!>|yC7C4r+G{tjMXUo}2Y4|2cXrAz5`NCoN%y)wb21Nf})%^ggSP<>r z`-9V*ISp`=gfx+Udp#t8cj~>0qP~m7rTYN^U8@|r*gMlRU3gx5kuEKs1>1XSoX>Bj zZR3V!5(|*>xROvsA>lDqYzkFrfFVr)Y06#qKgedZK-cb4zg1qcuqU_0H2rINB2MOl z445`kmoC2+dt9o2^;`48}l=_uS=X9a4CNr8uLA_OUBzG>#U=+yqrtbEn?MrNY6$pK&uBJu__C^} z4d6w15(|(vka9l~VlSyUrtHYO^w^NeCBhqn3GLP0%^eecVpY43-?46lV6eaK+i_2T z?G7xO-(L-u!T3+M-wGN)XkPwuCqQG73rnZu%8$``X1LB*+ZR&!Xt4s-Gz5B~(61>B zkY2q?_CJ!&JD%$QedF(Qj=g2iqk+l}DeD|0DngXKD`ZvnJjWLw z0a;~BTR48-t%%-eZF1tzf~`(i6)DJ#n&XJ$mF+cBGMOKQZaEJq#r+J#*g1UW0M4&W z6F&Q{4B$?>rgG}fZ;&iDglonHG~QQ_2Jfu7&KQzu3hubRDVK82TmHnG83QH5CFX2b zglmSoc6?6jw*Gj|nQouG7LmQ~0M$;ttDV8b8GuY)(fOAOgncL80+=IY zrh-1S^tVTj_Gnu&e4074i<{y-r7O$TsRDwhVxAX48JF%UuZYuB$ZEv83TQfX$U%Qj zKn{T@mi`ULS7Hfl?5_;?LN#@`E-{HYPI1J$-Ly7DcC6+LU%g#2?Dfi}huuZCv1;hy zznu4$k}?xg>?{MFrx!fbHIA=o(w5A%N3!|i6KM)A8eYU*NWN<_d8z8VNxARXc=mQ6KG4zAS_oydF4&NzvsmjdC6f#YEIo&h}gr}%Bj^~P zWX#OKj`kShfA+X`!gb!?O{7nHGae_ua91~c`TgQC3|o^=FPY4Ppf`X<@)O@#j zSktEztdW7NNHyBfJv-cj%Rfu&0msjRpI>8YanI!LKZthiCh=t*IjP)-RjPQN=PU>! z>qFU)g2nc*8;^R7W!NMmFL9=c%7+nkT?z}I$lapvYdWfC3E{MEj(IVJ41DZ*()yc$ z>2LW#@eFlxo~B;0Bs!Xyxs%zy+#I?0ua|l`*nN73-cA3ZZp4w=N9oLiiy&;X`9Q|4 zgkqmsLo}0DDDE(F@hM*Zr)Th>)ag2D;i-d^6QF*1QY z*kgHT`E2p2_)MdK*tTZcAz39uJNpZ!tdyQDsp_j}^UHJXpKLx{89-UIwta2&U=Rzl zVS%fw?($WD$2jsd>gODSZY0B?i7n-?-_#1~Y6f!!D$do|j*zALn;p8i?^R}CPUS7L z@j;=+Wz#G5<`ci_sEPR_P^~T8D$m$@aJ>hP2!md<~7^A5KWuOTF0vBCWX8q_JmEC zL#O*n)z+k7$bMVx^+0!@UArf0^C9PCN1A}mqv%He2$h*fHy|#5_m#us-u!saDvxz1 zjRPft4iIBv!N_^7e)M;;V#2=-J4tY4FIzs$2;A9rcF_hZJl(8I#fYx|@v%ri;)>%0`R z^M+xMpYZpa2z`2}awh+-dR|%C@S9WFryDdW%Ms4u3ACIj&Bv?GT|JxIwC{R5v5(B!8sSUgNGryiWWLvln=3Q1I4RhLeJnN2W1p4; z)3z{30Np+4mHZ)jN-1GD;X4hEy{v}s1z`Zj+E7S-YjU^kBQapHBUMwC`}Ojq#`E*k z>-Z^B40$@i5ldB8j|m6PK35a?Sx3&!9ztGl$>0Tl%{5y$S3R{@5f>hssyY8CU1lz> z1vb@Y;XLggekQpw_DT|60DQg{-xXIgoTRjv?EllfE)JH~=^Qf1D0fSm;~mX$XCqPd z=>*qrK9|xCEA?B9=YQYa@g$a8hJc9ukFi9F>)?t=2+f2j9^MGuWe?Fs8chwi0&h*>qW5-wy>0Sq=AuxnW!;*n&%R z2B(onc~y)e{nQIy&PQ`7=^6K}zP0I^5ym@#X{qBk4?k6RyPek{-=9(cQLgQMb=9q4 ztM*3=8yk}Gt`AnPX0(%vlP}}FkE6tBNO#Kh>_NI*@ecn^L86q-YJST?%}sr?Fz4>$ zw_B~(H=)?x@+udk>K!%E}FQ{BqL?9|@SVl(4_LMpi-v%tZOiLMM(aa8#W$86HrvASrw) z;xiLj`#@$6Q%yKmcRz8?p;o$vdKEoeH9IS8_~eN!1?WDCFfEfwc5M)0W$2W9v8c0~ zZSVW$D(}-%!&fxRE1q&NRRF_(p@ilp^;isSL|{9d%E{-F3e@n7t>~GL09z9)Rhil? zu50Kplw4Rv&<_n#$Kd0UZ^T-}ekE%2TwH7YGt$GSKMY+AxE6$U+1!HF353PqSeCaIQ>Jsi ziH^S~R$i0;YnHEC(j86&J1tlaqKJv5bKrlNWE5#P3PF5GGsm>6LD3#rH|wxwZ=~Wd zsw$5zg@YQ_&wu8CI!r)|Gd5SSo5OA#kSBR^`+uj34kVgWL4N9hdv%r6trXQW%7bj% ziV#u{PH96_%3!HwBB{vc!>n%Asi%@p2EUNL6z@15rC3x@)Ed#|v0>m|pkgkK`J!&w z%}PpVGx-PVj4}hP%&g#iX;)F2zh^sfAJ8Z@d_PtRG7e-|BE4Cslm^pa>-jy0hkb5j3wK(Cesph34n{WhLEqn4 zoa4RyX0%T+^$yWz|=?GIV` zl5j=o$^r&iX&7B|`)3XJNEM}!;DWZWJG^k|N5J)x&pYPS2XX#?LUyL}59O2ja@MSr zk_U<=-ftPRh6rSa9!?9g#0-ocy^SuR?|a+_3i-`wN{xp2ywd--xT`Srr=1N205kv+V=<2nmIU*tW66)SlJ7@a1z6&uaS7v&1bU z15QJGD1VRNFshackYD1_Xt!%;OmCN9lb|ITM;B+IJmZj|o3Z^_ncyYoIks9|=)@I~ z>H@k~e(D-ocIEyKh3e2}Queq5?d*Fa>Ic3n&#F!tkO$YYYH^B-aW7Of8*p-#4r+$7 z`U8>$aTv>P{8g%fs0p0OIcGz!iW+-l%H>7=DXDKdSOyIAAgJFVq`<2oH&xmwQKI9M z1DIvbf^T*aeyA7eYJgrJX19JX;E+rV$QzOVs{Jmw9^&=7O_?r0_er3&Kb0+3bQhkF zA=G0CFdCw&lNuhr<2g|RU)P++QF}XOBOAm}+^4u#z=QDvWGNtc7-7z>u;nidCpk@_ z)Tvu%ST60cqo2ffqTI-=2I{9@^%NcrJ-@0+-$dN+t=vUZIGGQBt5BY01o_V#E*OmP zbBo}TcA>~O58^4Caq*>(jprT}mN)TAIuyHKxm4;=_wRMKZVE-fxk56qs%ip+@Jf#W ztF1<%E!0(gbC{k>w%_0cO`N>@_+9s$LFcAMgK~s;AN$K2TbVnB4PIxyY?;Iplj-kW z8S7E;s|DS*)grqREwp_>!MI=fmG>0@IbVcfcE=eDoqXNvr;an>MhyHLc9g9(q1l(4 zrIpG(T=Bc#YIoRFjaD2mz#vgkde4xWg?^$|lSy~Hf)B=;RiHieokobe$5B3UMYWr> zE7w+oNyX|P3{fjq+ihvd+oV4A>z_~SgX$bY)`|6lg#D2p-E;VhIO$sYL3Emi`nZj2 z^>pVZD3HS;WVm-_W05aS{<94q^xUpq8MUu_ZSD3hyeQAcXJ=ItU>4LpQV*l!i4=fr ze0@q}>N16PJapRDguF5lQqlo=hbYO2u8 z{*%nwB{EcJmm0+a9aNJuh*pJNA9i1l1DKn`5N8-9K2n>B2qmlj=Hs0n4g*RUpQD2g^%%Tg26-a_UaJyUF?K| z@%lF|CyEA^^3fP(mi?nFBbEC|PVT?0L#puJJI2;xiC;N8p=1^^B?&ggl^*}13fzx> zTZQLgz=H%MddGV`VlP**r_rfie{RyYOuGow`Rr1}(W5ICv=D51)m-Sz^!nQIILlDk zxJrCg@$5bJxXtw+CF=XWaXoCu{b96xQ$rI?rm*hLs(><2dadr3AM2)?a z&AOS&AY)&7Sv1+QAv=3BePH3*OUo|QN*2n{B~XCkN^2I=rD|9NaCo@NnNbM?i<^$X zqJY`I8#;a~)z$(h7I9NMg_jlD8Ot%JRWE)5YRD84_w&?wdfimHy+i_Qe8}45V)5ny zIP!y)$~K|@dVIMZ-Z0>|9(z5#~9g0$8EuL(?h^P#e5iwk4F7U37fgAl?Pjs7i0z(|uf+ z9Fp(*>Ny9Vu3{zrihkgG`qaWIV{x-e6PRXrud@ifjGX?Pthap~p0Ak2IE!XFZ(pdr z{!u>G16z^#z%oIY7W4N_I3tT5u<%+)NUET(IyUs8x3fd*S0im#ahxJHFZ{e-AX6!! z%M}!JlP4iUiTL;@I4@WP>Fbu$03tBcbzN#J|01+G#^y4|5UARp19rb{9|I&G|5Pyl z*^0fXiAes}?`^F!MC{w}tRtUoOsX;o zha4IOQ$SF!afD_Z;dK8SftK&^Kpcj;p6CT>&DM&VYh)$|ArYpI*mq+25zZj%18GKP zU;2yJK13vB1d*~96gz*^yuh3jt6CacGeJHqS24LOopsEr!72iC`+CjCK(8|1htZa| zJ5BtkkeP-zedus<7dIbm!D1<_=7FSxWR;G`+8$QJ3PT8LbA98m#Rp5HZJwN~XGsXT z*zz&a1;zux>wT8gI|M||_(B$A=Buwlk?h{@>(!VSb z_M&2p2FYJosdCYd&$de~&Zfy7!DK##bO0FvuJOLD5$JPKM}7T!f z7jV;z6^5e~im>VHTDOjQ=8M~^j_4j5$3n}V=&7b5#z&2TpHzUyyyxiHxj==(Zs;YLOjbb(`y4*SjleOD5{~Z)$2^U~OT_e`m5I z;#(>HBQrRLEwVg*?r9QGZ~e zx@-|rC?{iAld!zEUao7y9TZm@XcpUYD1Fit6m-SxpBX&N7wz?ptoZnWdFuJx-y66i z)7>Mm9}ArxQXIEBD8_)q6}S^K%Ec^Z$&nGL;01(t`_+HVL;P={V#x;Flq#$XabYc~ zBtjwZ;vAY9RB;aoR)sS{R4J!RLKHWrEGen;xBp{XkaPjC%Vo5L=%zx+ofg?>6q&c2 zQrN_PwSpSxhFr$5Hx1}a-uGYUZWfjL@4IV2dF~``oVsEq&tAgI8@H8t9DB#2M1R0Z zt2&eX0OBCEzoG*Vf4aN#7!RibJ@U?)0kB05p*B0FLGCM13A zijCJ4S?Qslv85L^Pl!so|L12;L6%!2j!tQ#*`%khH|5DL8xkMI#(kW&wqJ)cO_trr zYG;c>?Ek#r{xDB=D}Ge4{uwy@2Oe*$V!?MmFx29S9RpEIQ!yp^@7JxQm~88AWxHF3 zDg$nb8{)p>1`@}}RGiU#bitTm(Vs=E<%>3W%KuYqYO!(Qvi zrS@eWB5kz_+#3zG;!)=zX zjm)#{jopIus`qi}v*gPnFOo!;x*5G1?U!fO zjwfSV_IV7d_c?A6ACLHoMg5H*i8wDsz4z0&bJA{1$O5*pR-pXy!Q+xKhOyMR#RtlnG53-bxyRiBl79anvU;a>LPKr3%^8sr?-2Gip1$&^P#EW;D z6J{q$;o*~&p&wFFU^;dYKoc`CkH(1k%B1(vuG(xOS_kcnGPevWeDd{va2=%I|9qou z5L`$LL)F`$LAyDOAd%+`AI2ICP-N;a;O`xrC!=M^P|eBNe^QKS0OevVam`4rm}_`2 z^xQuj7Uw;zFSvxs?Sw_3wV?>4C@F^5h3) zGKi?u_;BCS;~c{`J#w<_{0bw+p)KUf0+PO4=%|d`VTb6jHfu z*gH+`k)pn4$1{hx6-24ErCQZjt@W`d+$i}FAKtt?(dPV{3dZ&J5r4ulrp;K%BemN` zHm=)no%Nc{#3B2bvyuGq9Xi<%MZ zl~Oj~Ce};`3`&CpGknJ5-o9JgAF{?$cS5G+BBr~Lo&g+jm-t^T%p9-^=n}TiJNDes1nZYy`taO?~(1*e5U|9SZ|j+oF)%cqG{n z^5mgfw>#56uE){tP#9+Hyk9ZvwabEHuESQG!8AU@;{gn=ac1}QYuJ~bO{d0ufcpC1 z+}F%}onW&@Ry)`XDScdRWBc^k`~B5L*Ut+q-0?A-^&EST30$@4g61gR=_c>{xgMX> z#+HEitCu_J(@G~iw4IbI7RY+%W-{+x!ShV78Xpc zv4ujWPO_LE{@CG$Jc!azwuGn>HoxchoufpYpqtZsD9z-9yEpH;pZPT`e!91)tGPW~ z>DV1?6&(vU?)OOO_^vD(w8X`b<6HZ&_;*-d)>|?iwiG3%>XJe4`Yyv=q07hm)Kl$n z2snGva>5)e?RMHcZzo3?i74GI*?Xt8N@dOXqpe>cb7jKECuq zHVn32dpjD}AQBLNOq60Fy#6vvwKB>xMqz2ItR=}?7KlFNF zF@)LUQ?Q@$@n}!b>JnES$K;)`-vVKs%IF(stRl@(Zdn&1Gf}m7CNkcz9b9}{SJ-5I zw*Wq*ud}N6M~>8WJII>R1Y#EQ_Br!IKX1rOp=aOLAB0KMv5Bc{VW}Rzw+py)e@>xj zhI*jmY&5~($DM$`-(`WJXNld^>wp&j&TmhIZ~X_Wyu#tV#GUi;WUg9_6N*mgy<^Vb#vwru1pztJ7qg-n<{w#yw7)F&KW$06w*Ep11sT#%4{?dDdxuhyj#exWWsclOxOW$ z1=N!i0o}~-4`Uc6;zF;+!H!Ehbt@;`3{6LW)r|i5C*X+$9wWhfgG0H|Ki$~ZgPc0R zFsD0w%70b@HGjXgKatQEOQirAhc8db5-4pifClyid$9MX^K%|~y=vK$M zJY~GAT)NcVr`4Q^r1N_^?$fSw!FNTBPGTy9b^>-Akfm(-ryiK*xNO88+L<{{$zAc# zE{ANgiN3|7a-QjEYvimO-hhcg?3PlgTX9A*+YtV`=bgewm~2{)vd{vp#O>h&x3}KI z`=+@Ct|v2hk*_R{>eOlzcs?|_Y|^Swik7(nF@M9|9d%H!GdY(|;;?=zl=L^2>pGN? z-vrQbo0J)25^3q)S2rtFJqFU=!6LQ8&3L1Q>UwTi(Nz{19X*@jqQS>zznNYzkZj$! zb#V9LOW=q-q75ROV)n!hausj=a(+saj>Aq0SwNE!5m+8PRGT%`gIs#EA6N}DP`n2` zhS1_QP4d6=Hz;}>f}9P_0~c3XSj7v<@W|w%tmy>wBseyV4+=MN;n+uUcTM zjRVH0*zO1UOeQ|xMjiB4FcZDb_TbfFmF%+TShC@41QP;|&Bq z$R5q14kKA9F!a~7Up5j#+Ru0e(2!5`3)_8cyr)u#;LO$5YET;xNdo#+514ewxN#>V z1#lj;T48Ptu&{d3pYLp-^LtRw&Yu z!_qGe^4)pYPyNgGn-X1f*d|VaT~D7}RaDXj{v{OT`zdUqf_-zJ{P$5PkL>p8q=`Bs z-F55q9K=K4`%{-pevbR?1rJc}5k?0(%)Xhx50)g6?z*CBy<)zpOA-2O4aFJHCNF;< zqYb|;h#W}#QTRtu#C)2MGw&B%a{|da;a(khc@B}^ef~_FZ~kjP@9*F8K3hIpddGdI zIbzc~50~i|rJ7<*Us;mWbRR^-2dYxwAD7cVV-#kR8S=BM9a8Er+?HW|WIp1T zK$WPD%gf)G`gE00YZBf&m9z^#RkuU&L|9-IU2BXum#DMNLT`DMcI}R4xEhUA;C1D| zx+69gbdSG2IxB#N+-ZUxu@38Y8F2a~#aWl#Z2!apbwEjPxK&X8+gaUAFCTI}+m#Dv z7mq}W_at}DWVEQW-O?%L+EA3ra~V0+CX!MoGN4+wt+m^tdQ zaCELY_4%`>k41sw&H4`Jj6@h3M3KtDBXDmTOPcQ9%)dpbwF`FaZkrf?vfG~rt_4z& zVbOTt3mmelpnrfHKGFqWevpC?2^+TH+24{yOwe|{vnEu%%Tr-jW-M8dge$MyLC`+l zUccv1d!Gg*PfH=xPK6irj`jb0zid=o*nuWJW2nRavQHSA;77?Y`ji|w9fVdn+TD<4 z!de{*qlgrpfY=7FSOXnq;#N3NwH2FaX-2fghp7-QD76<||eGn}bv#kn(MOl%-? z`UagWZe&curH|ci@ny45$7i{e_`K`fDXsOGjhWqP;QL{+?>qCt>FX0i1?)L5gP7%y zSOrZ*@GJ_O)CCMwVjNwF0m*n*B)soZMu{~xL7yOj*t$LCwG2(-CwKYzwN?W~VZbPDi}&g7 zvz}PrVu|Q+Je2$GIal-19#_JjcOrp#rd43kKT``Wx+}LmjZ10YN43pwmRr?aj}$h& zT+(qNOW5Y8pRFWRayMIMFsHdT?aK+(pp`(CRPC`Jb=413DRCXXbCKvrJGZ&z!(wa0 ze6$H>A5=dTzt$QDeo{OWJjSlFxtAApMPow2x z=IQ=Lo4xhA>h?t>SB0~mUU&{S^DQ55E0*ZKjxOG0-gy40IJc$&LjHnL_1;v}It#MU zllO~f4wo%~eqOx+=)z8ygirAtE;0Yg6kP7ysi`S+@1q6<4|noI*YnBm!rUP%9ru?ZXJ4f%nNpZJy@>1pT1{U645v!7L|)8#?hP3L z@Gas2O#FzG8jOC(`hiNIzPyRXR@$kG0?E_gx>0FlbPXSKHG>hkYmB*~ds32XKc46R z4F9WXd1sbGD;rs&anOld!oKqX{}5;Cra^@>2ET76(J2lSG!IELQKoawl{)08n zU4vkdZ@^0y!MM(o^*L1@41W4R@6b4vX>LJjeGs+1gQKE(ECJLiwDJS8&dL45f^=~% zoDeh>(=A03s}h=G>i3n#5?>yJ`A(SuuUUkY6@(F?R#P`#F4D>2R~obd9<#dVDhBiz; z=fI-kGJf^{bQ8+!`1w(eC2mE=co&iA8-~*t2{I<>qlqG#QSRgY3FYopzKIxPkMviq zVu6i4H=1p-=1w&j$NVl#B$y6F(bL{OPa8@9*HRyLKo)8>fW)D0vqH98z(+Xeo4Y!u z27GBOY~J8KwOz)-VkI zwLYl9nUW!@M|3S1Aihkkok#jHw?y$PS_M!sPl)%rP~U#oTRKSQ!f%v#|3lwCE)SpJ zAMn&?Gt_A5+A1EWrHt4rsaaOC`q({>aKJDdjkw4(r9mYSA<}PgKlfZ{!kpa@0|ssr zQ@?!7yG!^*6C+rS`2q>d(C3$p>qyI4b(~B?FGf~tP@h};*6Q8(q5w#Lvtc49vRRRo z^+z0wJEaXs)@*uJFL--;HC)h|hQA&f#(4Sbu3_Q|ulVW>wNm86X4`4cR>c6N@bcgH z;*~?GZ)?%u75k0dtIXd>_!kakWip|rt@f}Ug^Xn$vW<L#R6w8q)Ztt~S2D#{euYYFFD+zG)a;?c0P$9h?w8Lk3tTCy9-uURG> zrs!FPGL*UF{KIL?rV$=fvjd$+$MR~c)9uR~g_=AwuUG2lmYYWAO1R&vz(;DdMvgD0 zm7)dn@><5;{sPD);g4IR56Q_MN@N)#f{R%;qJ zCN5uJ?uA4iMxSRw7W6lLi0xC-c|`ZjF49MeKFx3?cd1_PLGJv{KF~(@h8th!(C9Gn zMaw>qHEhN;XzujdX+eXmNLNK5s+fyf15K!c-Z206&Bf(eQY3qY?euS_)-odtFR5kp zpioSc&@vkAN0ARu#03O-K}lA`ua!A3(P>U?>IJ0~_cUH3$n(sTklln4Yxo9EX@O;>EpAslfMgJGf@Xv;WB^qEd_rw-852bXZ8vy$|HTN{wngcf@b7g>#;w#+OTiim-Ro!K(v(VUQ5ehW1Gg$~twKU;nX=IR7~ohN%tfAPChp1Iw7z?>isf{#obMbjemU zDw;+`Dc}AO`K0~a1=O*^H7Oo$HocKw-g!HnjyNKR|M4De;pn&UR4dnh8&%SUkh5i( zv}M~^tmAh=BIGDB^@n`(=-i)6>nE%!&iS6Y}xNt@+;iPQl^UARjiXl zMnW#gv?WsHeEIrkF~K@PG}Ty#J9Z1Av5B#&h8?PGVd1G@x*OGv2D^~Mcy6I@=3bIY zu0cs-k7xN@#e_!QO_eYVH4AW#U*({(Rvohfnkzf$O|lOjOdNa zQoeDiMIuBZz3cl>kn9X{Zv{&! z`QyfNrR`(uVhdXH2mRQ_aO49MA+E>q|1YE@QPM}rcQp07xAWY{QTk;41sRoizm|gx zvrFACw|0mbSg$<-4kR1YPa;Y&!Xj8(7fJ*`gKEO7*Fz#%bkzw;mM76m#8mHiNwQoY zoq1T(kGYqhU#)++!uW+LFz4ph>&%(=IRl&ay_kk2-NA+-e*>d6uK~ z+Ku-4@XGefdnzkeXmkTircYWl8wT5Kb>d$ll$+QUID|Tq${!r>1-)AaD`|uGuUN^W zTxtDfn*7rg!RN#^4sO-hpL(0r-a8MwpMV&$)Btrjh$}Srwo55-4FDYynv2IsePxE!y z)sd#==mm>8TS1?eeDY$r7ds%hujMcXtofa=4R(a**4s;=>+DnSy6fKfB&QFLu4b{< zPng@CeblC$`L&%ZnjM)Oom*KXxft3Zzal}uwhbLhAq=5YM4f!Bva+)ss2L5Nzl{ZA znsO}dN7Uy(p3Z^IJ0UU=D4GRmRU;kQ4nq1FL)IFfn$CCKYmS;5|9wpaP>et^p6SfI z0b02M?t3DbYj(|A4p>yLPV9g7C$*EmUL6`qj49%@pd_#VK{`(Ihyfp^6~*#m4)J)` zQ;v4-c-j-rL@XDjAro)X5Mic!Ec+ z*kf0oX3~}?HoJ)p^|L3aISwi>75XAEnW^PLFnPr}DZl5DzINaAZBHKO%p5tLAk=k9 z`aJy40NPx|e5<^f*tO5!LS81a=_MUl2kk58{`HuVUY;quymfx-R&&$R6}xvca*wG7 zZ@}=itUWpBxi_Tl~&^Y3TKhSPM&|i z2;1RK!XYBk%>U+%y3aaE!`@mD&_LZwGkcdU?34*@`ZJ}2B~UWczN~HBGQ%Xh(CeVj+{UZm8XYZ6Bl9pGyMxmEt_sf)#G$&ud&=s=aWdQjRc=fJ|^aeJ-QxeU5* zw-IMhxySnIBcX-|mKZa$6_v<~Ho{wEs0jk4>l5Kib?LB^w{l1RzPUYbd1A~PmW%yV zPCfD^(m^VpRbWKaKStZSBek7?{-YG))(3&TYNb-F&Y@qaI?N}gYlk0os>MuJ$^*i_ z&_e_lbp-NACpZF0k!DR&Qr0vw#MM>LXXb)PH#93=+~75r<{{VaAk0mz#ACL;OYMRusBs^pwZ#G+>p^qBgE z?1YjAT5?(V2qTJJ5^0Dv zBfhYvVeJjq&XrO_?aH1B3bRRV_;uNbE9&13Mf?w1pn44Q{O4hMjOQL?yZ{wc4@WKk zy^8N2xlS)x@VUGoy5tm$=tq5w;o0rKbVBoH2F-U!t4qW4>oQUY_TAT9TI5o-O3|rm z&aerZ+ZK?ql`)FS3P>V1+;L+5- zk>r8X27xfT%bRqOZIN{Lop$|wZ`%?(8AQ@Mw8UvkE9v8iOxUKoyC?0e^`t?NxyL9P;Mqoa*Xkf)He{Q3;X(~hta4{l_Yk1m`N zpfnO6hz@<96+hG#1Y2)xd2H1FH=ALA#T6R$(JtgSY|{@Koq6(Ea_UmDt+lUcCczYO zt#<|dujm8(V}XLLLwnR#G1^D{ZNzU$h|tDPG(El8MNnnVX*iU2)9@l$#W^;b%rs!# zYUg7x&5nL>LYdxhPQxgyO%?cIHwO)Vya>Y8gZ;srchc?on9x9P5QGwMrW~v_?z9NJ z1ppEi`rC;kMB{IafM=7@nN#fR69LyT2S^3Q?&K1rJkaZK#|g32*}&lW@WAtvwRgNs zC`5Jt=fxk0Q*m%{S7mmOGwZZ*YuE?BdA9CymGh;8#8m_BZ^Wsk28KMy3&4 z`hL?sRA*~cbuQPZr{DKCiGN;TIrS#gH(+6n=ifg>ePSl+IQ8wJmL=bFj{BdLsZscD zzt(sIHR^JKN1PVBZHB5TTu3NI-)z%do<3ot5utDq&qc~)6$wu}F*YO_XG^+Ha@iCn z!4)sGga=id#x+buc8RuXY_2N?whU2@>AzQ<$DqDF=O>*jJhAp+^Mn$fTZa+m(^@ekLRLKpW6eW~|d@y4E*C&&G1Ae{UUPA>iCdDESr zG#E2`F&2*rCZ|V}GuA@ULAt=_6RrQM@;r^$(t^G-{2VuzeLfWqd;1WuI&n zQMA>9au>`Md_}o~VPrmnll< zMb`60`(KWcM@LLOw8gINP}pyE+|&Y*iFf)65R?}KmjpyCRD?xj?_Y>xBR_73y)7U= z8#1^W2QYWkUfY17154ls1xeHlKUK?Gi_)T8(<3t5luWW;zJImBIcnD~*7#4A+c0`G zECqj0LN2r??Ahe__LIL~6gxAP@%{Cll{Z?I+sLiK>Q_1a`Og+5U86s-pLPjSN^p}K zLt&)2JCCy?wMVlqPs`_W-JAj;!DLjtBAKaVs{p}zCeC;(lIRIL>+~cDNZ~1z2%bEU zf>rPO7-H4m)(D|^Dk-evFXZ;WAhV}`gc*!8TeA*Q0fKuA-St)}B%WQ?{|JiLCfB`+4>-Pw7P#;z~af{OtATyowa^K47PTb_E^1-|pAbmfcLIS zAy0&DT6O#G1qcq+vr}O!|_pn_*%Bk!T4=cHW`Nz5!4_z%Nv>Hbo=X!48+Swt%3(0 z2C+w8G`}wLM*G?dD?Zp|6-Kf-icZH5)6)FAVowD& z{WTJKQrVbA4^fMgs)Oa%`xTC1-l#>kQszf1N=XA`rrl3>%J?lNdW+cRv$P4_7aj5t zLAN){P6d(Cce`NP)4cmqcVpd_xSF_1mH6#^$+|z_t3UDBXtRw}8u)K(k)y&g4PM8A zw{7$H{a4#%?F)&84HhwU-WGC2YzE23wUvU7%t|h7)sEklUyA-7CGwyNmS4nZjww5v zod!9w!L?Uv2>Sxovhs1~>9GuU@)IzX%GE|9*6t*m5&F9!{CFNPq>2MN0S)Ul%RosR`2( zpejH>|M%9FXGB(f-MN$VxTqhBE)P8__NO434|<>O9$1_68gi4uaA4mDddlt`+{Tq!!`~7bT@-H z<2!Q|9AlN)C+xs_+wh-hI#+(59FM{E&tBa{_S@Rj7Sb%G*DW4fnigSw2nDA%59{2T z3pXMaKL;EVDfp!c0ra~KpX>C%*Nj2@?xx9Dn2Bw_hKcE;h$hr~Bd3g?^(BkUeAB5 zFydu2(c^nhEvvVNXk5R~h$EIEH#RR0uYZYn{y@lA&89!%KrWA;DOryGLyspibYK{; zS}fKft#zqgIBKj1vowId1Vra0!(vz=>{-y<3%U*vL!jcfitFw&;Ik_^Za7caWi4tG z-|M5L#%D>xc=s4uA2U{pF?m#YK7z53i8cNr8ni?=c9B|a)*WoJ`saXj&$|{$rwYT3gHEqcxJGQT0b}yh9+hjdPCkuX*hQnSs|5!e4hA{0b#5 zpDAsru~%)D?Ps zlfTqtPYNmx5egD;C^f=hIu1oO5OEclh!rb3whdKjJ!yD)bD*1URSLix=$%QOfh~hK zGl-zpFstHakxR43!#;yVd3>#^uW|IgHbEx1>8RB6$%hs??o9uA`d=!PBL(GAq+kiV zFUU?fwP{Xrv{SAW`X#3_4B2KTggKOnQY6Q_{r@@Z^z%ERbBzht=5}mTn&J*}{=B;p zf#Rm&blH8&<9mGSv?sO4Yws`sv+DX~lj|_CIQIs);`L&g?+&{Cu9e-uu#nnOMaUgE1n4I4Z-r3s%Jx zT_OC8$>O+5okmH~9!l9#T_@O1e)P@zkZ)gc@vuUOp1OTL-r&Qr>G|5T*>1H*7Xt?~ z(vfygl*brWnYXm6&&`=Ph<8Kp@_B;+?oLP<@v1>|v)U`kCc9!7&E&J9{zp{07X2~H z@*81^lWhLx|3}hUhBe`~QG6RQ8WfN&m2N>AHb6xQNtJG-L+RWA5fKRqL0UjUx=Ywl z1SA|K4Wqkzz_xe(->>_&UAvy=x$kq%@5r~(YRl147(g4yhmfAcTk*&mP)N4zOjrX| zB2RaK%ATYZmfDBBm!XbEzqE&{Dg|X^a?(YmiAvRO8oLthKvZ#DrIP_X!d=`bMt^55O37UJ1Ge&%A zb6*$H-Dq~3U z7XS_%V>gSEsz1qOwIoVj_q*%8F}bm(MmwwFDNA`1`SD3#^q&7WJL;UUy}L@+sp3dV z{+!=~m>QpjacY#(mD0Tn*dB&y<>9%4(L2ZKz*i)Cp$buwN^0J1<&KY^&~q{wWvS&a zRXzRN>Q$-*V73tDD!SV7Lr$Ob+{Px8TvDP#4)I{GFC^d4Fjf}l(R^G1nBq+$4W(ku z8zGrT?Pw>Dnc+{jxJa^TDQu^_)JX)-7V7Nq6yJDNZ@!09DoK}rc`Ur5@u+Vhi6dFz z%^g*4JN0eSukUP4O(Sm!N7teO4>0K@8#%&@NO};@V_o->=H(0%P@n})(m+P@eb1vn z${J>ehV~@G#NF+W;cnoq1yR}V2Z29GCZE@~nlOJW6cg@gwZ4ync+e48cR94stZX^=Zz94o3_i=p*6{);frMaq{NI0M z8N_by$2++~zVQkN#jFdz63A0@RtQ_2qxUoyX@;I0)5UJQ)fMJN6BD~LTm6Gy{fkx` z569AGeA>Y~ZPWeZfVPdbl>XC*xU>W#l$Afbj{E1zav)jB5%IF*ZtF20x<9Fa zYW?Q`Rx&M(!!r%xmz8_Gti2XSwdbSV5h$FKM*<)CFrRvjLD7QIfh$@@H zd!xR%VmNm8KFhbeBsAPqP;1=(DFK~Ky_4}3&}HIRW^a6F?d%hmB+=Mggei03KF!#R z%0t;Jm~tp|x|@zQpb(bl#c@DSc0KuHhmWq3s<)Cl#F%@Lb9@<>_|5HY0>+z|nzMJP zd)BAtJta6!+4>IkHwhWaXt~brYVPONF=9SyZV%*C*1{$lvM|GEOsb81kDJgOSe>>*WPCiOm%C}m)+K40heedYe@twR6u2MRC6ATBUV z)s`jTFzNiTkyldX$d)toOle<(la|YW=c49UT?;=C&y$(1wamlm`JQ`KatmnPKcslX z?}h15Y(F|oX72pX^@x5L)sZB@WvewE#6A^`#xt&?T@lGI``Kp?s@U~b288C-nzN$f{g<4y( zYs~Dgw%eJ?gY1}yQFjX8zgi*X(sfU87YbVp*W3tFVS0Tej(GY5Jkznk+hfw)7>u- zcHkwK98}=VUkFpKyvWc+`n*Ty(LS0$*o)jS=hBEUMT4O?L@I`>ci~=!Ljho6a?3n5 zutZS#>WdkYUn%2OEN;?MV5?(5`1|*}P-q=TX+j~`su%T+Et3uY$J%^kA%R)0&u1w#ck86(M{+suY>z`OLkbZDpQ@Z`UqKU)6ivJZWXj`*k`JHNnkTG1ZiN26` z_?O(;2(2-`rj>a&vI@27urFL|GLtv)ljjiRk(AJ2^DUIGY-_uG2u`zJKzq+-kMbFh zhM|HQL*A3f2YI(&tVh6TE_xPnRV5-_3_8;yeP3nU9DRr%#G^YAAvaf-A4qfkr8d|~ zV1w+t3 zF|O8^Kihvkkf-1F!0IgGj@5bz{vX)AdWT#-p|2xx9`nb)RsxQHo6nr2K!bxVGKGcr z|M>6m$RW)mvf1|0HY*h6HRn6=iza)pb#h=k!?p4w8gf|xxjZ94D18L48t+y|Ye!mf zR=q92$?#@;X+XWtZecwstquJgdC<6f$=M>!YT}}nD_RDXZd2$`6H7-# z0dVSAPIo`3T!PtndD&S7Xm8EbO8h)`JmC0Ml`0ZCa9VKp{$ANaU(cgRL<3f&{_&Mt z#A%rO7w^llCjlF0W;ZXQ3+I19Em1iN55Hkxoa*W-PTE(goL1n!(dq2MQ?CN7t4)d8 zew)8CqE%S@Wsh)D;V__yBnh z^!ERqh^++Ye8?aWRERvI?!zw{{A!wijIlP+T?x9{#PGKnMIf!#B0g`z8rl zeSBB{=mq1_hZvYKTlHlOZl(!s1Os3G4tuv}V1EZ>18}_Fyx5e+D^AIys zS6D95^H*xLZ5`u>c4d$GTb^eGOLXI2=x@dtqLzyx;wt#A3yb(xDN(G15k3sEY`NDW znEH2p9=j+QPr3plFdrmJgn>{$M!nH6;TdC6_}-s(WhRMADU+5P4(Y#m(AW5xn@{WcLcyWyo*KAy|`~scD6=Zz9l8SaIQW+y*u>i)$1X-I) zWxo)WcZh3Sb!AI*(B=EGk2#bH0WWOxG%hc>5_MfN?z*wIHK>5y@$MC-TtcW8s|6KS z=lVLj&K~*_-?qG7S?9L{F^fZA^D$gvtyGP?1k9HcmUG1uEqx6tOvZOyv%tAzu}`6v zN4riPJ2c#@vjgZ5?75;W2zb4=t@{MP?Q4AH*@3rRLTTWXu_vQ9FkHJv@Y-lXTrvTN z>cB4(jHLpRYpdezCkBhB!x~)F!fy$Sn)g~i=KRq*T$e-98+Ke*>E~S73y9whQ4n0R z=*c6zuh4(=fsyimiyNo>Kj#qM?|ZG=UF-OwOpo^kIJpHb-a43@5=&Hf*`IZoS&$&> zZVU8&+UfpG->Zx=ceJ1K=*-`o;*NP$Vt{v#EnBw51kHG*=etqQZ)ho+UbTpqb=&yD z?FL&CO<`GbF)lD_&7KKF#d)uZ}ow`OD;_w zQ93=bL@ZXh%vl(6K(RS}I z`~c|nI|6_EWlEbOx}Wiv;7(}H=ETuDXW(Dw->|w1R=V7J5{P>?AbK;FA|IxxcPs$9 zA41NqL%m0li?S%$3n6~ugETrQS=}?};(^Jfe%y$ba^vS$8YJ0Qk&~OV|z0mWOH`dsukMr<{k`=+{aB5Z~L9 zj9MZYjkOkdpU+9$C&g*sWV&xR8xOX1BS?J`@C)>;s*jp_qe2QQGw)zn(#9TB*6MYA zw4%HeZc{0mRPj%36B>9|)1)#J>TD-b?>gzVQ47LBlqj#62JxPZaM&~y(}6kDI)PDM zFvapk9*Fh9@cgEMMK%ruZ-v;%^KKR08Gip`pH{xGi?w~oSFGm|`$nA!LgTtg>5D~x zy!&^`3&cVMvg;nT%SNvk1a231g0T&~$!3T%ue4-1m ze+S*?LS^F-e`#KTILUdGD0fh}MQA!}WT~G&kRXj&gw9E?omCWQxuUmk zDQZUS@KpkaLEDbJB zWD9G!QHZ;E*zb2_1jO$UI6qbiLt3nO#^+L@JyI%0!+0LBztqA0JIcRm$R|!dFkw69 zX)N{&5uUV>vEJ_fZW=+u=uHvYts46Q7w;~HO7|&lo);T@A5+%Lt>P{1>>aUqEe0*_01CXYV z{$BO`r}-Mzh^p+xqR9ard}cGA!GHnwQ*o}f}lCn90vR`>q65O5^jnntYT z-cw^(-~+lxjAXWpakQ?im+BQWdTV)H-fsPhxYq)&DL z1W`;ct=KpuVY*MneCH%Cc7}$EtHl)ZQF)#AAF^lu`$UghQ z{ulAkN;p25WsXc+%bGn$9>X4XNomz>Se#>L7`Rff^}I;g(fu+9v#9v)+>mCF0$M-2 zwXb_$6LA{GEHa`}@(c;pWAYVr1P&pen)81sxV*^Vyy6eT7gmymtyobnIeGwA#G{ml z?6B!aeM5yD_XNOu+^&^mX;U5#Nfag z#m5P!l;M#_b}(xyP=w+{qOFIb%+vj>c#e;D_OKEOESvM)*JNyR=vJmL}Txp$6>{-+LSnZ?MiI z;pGh>c8LY?)wg{bKs|YF?%$Sj?BErJ&w5|(Nvx@E174%8zUg26J{Cq%R~xr|I=(?D zyvtuZ4}jm3eHJ2_e%A0gnBLpbC4OZToPjfN0Vv`GR%i5KRyg+TutkRZGCe8j0`j^_ zp%DaM-&V^yRif~P|7WVqp9y3^(z)R;wQI@aa8(61(F@LlJaYASh;_L3Rf%~m;nhN> z{L!$^+K#3g7C5K1Bi^fK%70y$L~*YG zh#JM@C%9ZpvNfJZ8&Jx|HpCtZO#ckH7J95fX)f?v^u`j;?PF&$4p*rOof1{CHwUNG zKWc%J5M$pkKA9<}pEWYiI!Ztxp2g2yNZ6de{N+(ATnn!{o)6Qv(2$aHcIQPQvn z-;ckdR3KTo6M2;an~oy-B<>)3D}3yHpPiEXkY^aLN&>uc1L`3mjC%VH3*V3b*zH29 z&vIc9!t2mT`tncJ$vHu-do+%NTr5N;?HA#9uB^_YksbIn%b?OMKw{6wD8MHFSHuf! zj@Q3?*`JT_Dy&PtSZx7n_nA$I0IEfBWrY8|<3*|!CbeLdeB(dXsB@-&!*JTZGy4PU#4BR9=^Pi&r&|q&p>1s&I?mh08>eb4(||2+ zYz~Fr?wQ%1Z^u?q0|z3@(;W;)J?7a*)kI($_H3@BNI>IZ7*6IPQAcnjml&BBYq+S; z)OYua8^lNwDr&ixbR5OR(8_c&HN`}^m}{Q?yO;g%BX4q1Cy-Sya=s|lQX9oRk?z#$ zAr73XqM^lOCC`55KdEC8cZw{Ozm|@g&ao1@JE5FyJHB~Zu%h)<7LDFg+ zl6;0g*WQsHvHb`M(rYf{`&F6+^@UIasBYK5!$Z$Ve6~$@d-h)0OzbIITbW>cql1*J zGh)I{tc-c6NXI|Nk500UP3BG|Z(NNubWWyPhu5q5%X>+epFGI)ybZcxU9A_pL-s(m z$urqd<+Oz6Q<`{pHCn6GfxT^R8Dtmn;b zr*Y=ty{#b!X{Kw$y7K-GqgI7S) zbKlV*d<+zRyxT+xBv3!gl?C7k`L%t*KvLZX4Y)Y4iN8dt!9PagBrkN|=Qg)}Wj~J& z#r>|V+eDb#kHYp>{z-Tt?*S8nAdvix_YjP!K5JaLlFOT|v#57#?*HL%|ADCh3p>1X z`RTRAqiY)67Nj`#*{DHWf9x`?=J$5~;h%o(DFDlG+%SK>^RLXB-8$o=GI<5AZ`d)OU{Z+V_Yh^wsHIFKelzI_9S70Pkr;$p=2H@E_gV3-w*$9iU!QL}XfppFb6i{}b_uKIT) zl2~fYL$6tufv#$gBn+)h@s*$AF#~{AyG8_blN-UifyzlgG1C%qVp-;V&3_)#RjX=g zd*{gttiyNhsebW$9@h%T$E?{j7~T)jD9`Ui8&pZa>8o*R>uw^W<1C}lSwUsUsYzk_ zX~_=~SCJe|Z$&Rw!ZE$z!$@PC6Y1e}*EgLrkpe9U5lHEeI9y7j8yw>tTBXy$2%X*) zUIvjj@#iHz?b?`mk*`o_!6uodaKk5y$1=&DQpgpD!n$&G%M(IJIBWm}CCdeqjb*BX zU1f(u93)Vc2_zr-JIKmdI>g1whtiP2Q#)Kjz5f1i5xT^wpBZ6B{t+T?-d%t~k^ma` zbD7w2t3IZ@4iqx?m;kO4{CT`nhaye?H^>l-T`bp3zo?Z7U8}WK!tk8g6a2<-!8QMK z|1`dq|AV~Oa-3}K-woq8fDzKRxYs)+(%);UmzMB|f5kOa1Zht$STJHUs1G?9fvc%v z247zxIOSij7?xw2UQ0iVwo<8L9E3e(xmf#N`nqkyO{ndO_Z)10lzk|t|4)NRx|a8- zFOxmHy|yKVZsvxL=}mw(+?k9n{s|e};`7tem#5a$v&pHyIJ5jBNYHgX^BfX3n}w?h zM;@0}7;2n>8Ru-ruT{|m@>t_evA!_(h6*MLx|y9ga+``>fJsaAv{WB65tY$OqxlS1 zUV8!8boWzh=vci8TS?v@MBN(Rh6o>@K7Ex}fa@~kCvfFJcM0y~ReOed`=S%SPRmz2 zmTn&p+k4^*rJFgsnG1v?^&j3^0g;uuHf#3L?pb&uxyJ582{xMHaL!$RwWw6~WsS;B ztIvlGJt9Nn&m^of@N`0BH@KjoH%ODooHST=_Nk}%XXE&wbXOaELfGpM!7HegPvj?# zHGp>+Y@Dw@3*C^Ge+PLN23uX!nE+|boQq%x9?szn;5HAN<{zkg4%2Cm-18ww`zM>N zjL#k5X7IXXmn|?~u!3KeqUMaGOc81d3Z*G>C=2CzMla~X_3=b3;x6e(joU!4DKPw0 zlG-RPkgjgdj-7bJQhJ@*BBkK(9?4IN z@~d2;CUVnBW7qy0oVBzGN1#YCHLDfPLBxb*uqf`#6MseTYF@zNqM^}VhkpV`An~aV`J42kfm6P>9FMxQP^Ll6! zaXXteFEvF~Ie(W)=_g#5fkaa1m!TXR@{UnLhs*|vojihmzbF7n*~F^NY{pk3V1R$7 z-Z`N?k2c0E`*zsRP}V|ZDC5rB6Xwxh_lFt7t{gVMn0zx-N}+!E-fWXjo^yly0n5-d z_>3~)gWaWa5~Tt+OQ#|_g#hfU@{f8A+l6T=*~Ga+Wh@uf^jL5 zX`MQ=EjPt!GWuLdhNmzY)n?Tr*Mj@<@Ye_x@oCubwblMh{I%mWF7zrn54(1ZLbqhq zrwn3DoO1y|ALO7ShcuVUmxyLSwQG1AQ#CjII5`kzzMQW4|DY2+s}in7W`r7{;S7?a&zm} z-i6#Kl7}XDUjYJ8@3zH_YM!Rw+4(O8SLp66d(U)4)j%reJM@Yi@K2~ah#}0-sDCn_ zY|6E|L9^IO`gY2_5Y8Rfo7axX=Qv(jlFH&fo#Eqs@G39tr9zt}671|slPw>bHM(X_ z8QwBZ4CaV7oj-nMXF`(C9P9)|@B1mv7riyq=E1x(?fU3{@ha}7?0xYc>FQcUqaO3> z4jPN_(B1{=5cd2nGFK2>+kZ*%2Ja+oI8_Ogj2!p5UnY0- zrsBB+yG<=>zPKxz__}Sk?!fj2$Xbl_R_Gl3FTE~=NcMVow;Fc&PUR4~FHPt&j9L@;Rt7AP$Kp$klyo{dYzRZpo5 zcR$ZYRopVNhwjC5htvX)1AiBN**PpS-I1;J_b+bLx#&RuW_~$)($0J>@L+S$dRf+J zGCEAH;MDB#ZreI*>2Ex9uhds*61JiE4O(fnY)OTr{N0DkB2M-5sW9*87bZv|=szHQ(=ECyGZOo{Cmn#7;|FGM@S(A1;_lPKq1eMP zjCiCgW>E7+0(ilJ>VneC--~wW!Ol8rbThbP?*{;g%}OJ}en#P)WeBBr?9~ZG_(T7* zD@fqc3gM2l#i2f4RdD{>RxcfS{pL;U^_0Ona>4wtEB78Q@9!cN(U_+bF*v^=I0Uxl5n!nWL&#~EP)d+Uqr zkqDCkmTN8rA2Q1_!N^M$_mOf>qCD?TJUgqQyJx|DFuNo5C7*D#&cx-tmci1-b-13Q>*ePB3Dekb6haX}kb`?YY#>+d;xww`LQ%icO-3%^|bI z$lI4%ApqW&hT{of20agh1m!qSrXCD+{E$|SG9w=#-APS^<_EJK*%#6ndEV@i=)Q`+^TvFg18Pfl~f z^*^1T{3-qs`!MMAT6qAkZaq8_OJd~sBCHYlK^zb&$eQUeG~w`guB$bO7rH+xd0u^k z@q^4QBWfbskZ%iJ({BoYS8YGdc&a(yeV4US3xsoY!J)Bx{@(R4;0n!w&QEdl;7vf! zR@oxEG)zpux*t$*N17!>N>uR%_W*v*0q|`fzmWmM{rLoNJM&!CU=n~kV`{pA)(99A zF+6qgF&4PjkJGMX8WNvS{seTz|8w`RY1QNY5lIhv_3@Y>Oo|Gjg2NAJz1uO|Q!Acw z2QRl_)k5Px`>N;SGb-ez{pv@-#MX(iJ>}m2l;B;>excWANg`unWDB|zIQ%4`pfq*$ z>wyL@{`SNfKM>9z*23+IODo*uX5E#y4i>8@y>0V~znH7q~3{lNYnVpn&l$Y@;kms}AO;F;Sv{Gx`#Kl&kY11+bV7`e?-)#i&; z)lU36@pWvUuTix+2mTy#A`rTFruYhmm(Cn5aJ|CzDnk|3ZHzyUM)#8R&fIsXa2e>d zlm3>6YzK%SEiZnOmpp2s^Ku2EswSTESq~w@D8|mmRJfEca%%*@ijNPVsqBZH`%l)Sc0KcXz!;D%` z+AAnM``brc!qu`oNsQ66)=ONk`z3EtLlTve+?*+X+ujk#Gfp?{k1EPmcz+4NOjG)C z@raO^AAFsw2n?%wt+;axQ*p)7?vmmOucloBzt_Zv+D~oaI{*8FwZEzF0?28_dW(c?ub179Z0INaLiN28za8K?e{=gO?A zNuwct>be_<^(D#W;s2?;D|gcSHe^}EcPW^?^10b94bK^U*98x4SV!zwqo73E`OlLd zI;VlGjB|?-m_u)d%yM=^XFs?bO+$hlF$ZUQ(AW$nVm9x}Qj7ptRVG{5- z52`5TW#k$5*=zO|QK<4aUF_vBG0p8KK=(+h7vJ0-=7SF;c(x>uZrd-YfpE)>h8IQP zi|C-Yp}mO$zXOoDiioIqjRx_X59qpresIFvbkae=`{Cn z!P=1eBb@Rj(I$O{e0saTg!dE1ZUgBD51x3e)iBwG+@r)*Uj!5e0Ih$38R-gt9A;17 zFq{|QE_i9n;aw66g|lk_uXBu=O_+KK3@bDF1uh~d(yKL3lqG-)XQ4h%jIaBKX`GLD~sS386k zp>DPUFESV3%dX6mbTrTOTd@!HFuV+a@@+Uc*@f{Yn_AKDrsX#n+mw+s2 z+Q#m*jwNzT#J-xd^Q^i*`t*AP1f{F7r>cQqiK8%B3VXy={@?=Wlgz&i4D+`8ul zMsxw+h^mKndzsUD+~-w%iKTCbDf1&p=`_xrT}wbQ z?+&awGpg5mz?J3kAn$5dfoW@!lO$^rV8Ud&Wjy7BcA=@)54gDoWycEe->G+bOamUr z({j_^Yz0JI-DjqS-xmYik!O^nD$hqzCXzE#NhO)OP(6AjeFX$jM{n8@z1DH-`PGw) zIiUxM4CShJHphsSf8r}`S#IWRj)!!A`*hCJL;OkSN%qzxJKN8j7Wd+4BJ5m=dZm*l z$cBH8QLG@_ga3GQRWEh|UeyZ0i5sc)?lc?!-ndeT*n4X$)gnXRLp~l5hU;b7q@&>` zF>zD8x&2Hy-6=^lU_+NvCJAKo@yK}0Y;EA6VG)plClEf{5hVAKx#_dPRdZ+vb`_n! zn^vGiJv+md@iNp$79^aOaFGnr4!fRz=}58wA{X421hF3+7Y`rYdkq3;Y!S%oF;)k8 zF!n<$jhj6Ld$WWzL6=*(dQyNo_el9-r5EIS3uE1o}A9fx} zixjoOu$Io7Cj6*t_RZI6qJdj}70PEG+DpBi_a(#aSUz0rRt>cuHH|8xV*IGOO!PYALlg`>|mqof8o~ysWxTCf7 zn^?v{thv$Z($g;f)(dOt^N<0<0gt%jyog8_62P1kv)cW8*4riaqZv!p<2vig!kD2e z$BO}VvF(L1k&)Au+qH-0W>WAB>j2eQ?o@i5;2jHky3gz*8~Nb}i85+rLS=L#ESkHg z?(5goAzh-cR3r$wx?=M2PhG7Zzn}u1l1|X2vS^&$T%6^9uwA;3oG`C zBf4Bn>rJNKznpB70eYWt^9v9@VPZ=3p}_oQ!=D^35vVULV17CvT{nA=L z)976LwC4hob%O7>L409upMbtFw6*0TkuVJfkjUBMi{1N1fprN6v$BZcbKJ%_S;MYN z_QHV8+~(-p4h=+Y9w6_AQx}uDc-ea`vJ?0pslP$*I4WXfiYe>A`)o!z#uFa8LP82` zh98z0sK@(YR5(vuUoM$_svVB>yp!vCQjrQ^UQ@#1>sWM9i;O5S18*0sJDYsvFH}>b zTf06@*nZL$UuzrAt$$52FhdTwMoFaKX#!vVtcL3Khj-3V4j~bZclH1xWO@+L zeIkG~PxPVs-5O%^V-$k%+Lb8MIRPvos#0i&MOJV~e?nRc{210xbwQjy)g!Q+YbN%E zN_l=E*DSfv+jaTvA2Z7}sM7sr>(P}l-I`1l5f%E+>AoGISKL-YpA_k<6olT&Kjl?! z`$O9#q2|S4tY{+H3rKk1TQ)0v@EPm3NTbFnvQFPnDGt!XobtJ!2)>mS=gb2?0To8q z@kP)DTwo<~T(17y!&r<6GRLO)_jMbW8`5xmrX&<5?E^7#KOn|>%CzsnLJWy0RsIIz z?f#dS9zQ(M%jQt0giBX*l96Fp{;+H{S0~4JRR-HGv65N@8(wV=?qy+-wJ%HBOq&z_?oO}%ipSDUmS;R}^v@?-Nj?vmQdDuCYZ1MRnxb z!C^4>Z#&Q3&pr_1L!NCNF%Vtv?nUnJ12>-Txb-`$l9f{>?O`aF2UOlKMXwVP{+8k_8Jf3>ssh%(Jc~h-I#RhqX7A_a%BBa8 zju!5fg?s8TJnDRb`aLG6kWIZyt1e^~2*FIM9}KxSF%056V!1-T|AyD4TzA)iaGrQp z%wZ77_#<|X(Pv$L$ut-k^!7ao^f-?5ImJK)Q{>URe3PbG#yNWKo|k^0Kd zbfZK(Jly}o_Nntgh7)Drtsm6%T6FdjY;YFWnFWtsK3^aeO~JXs=17)*c{21 zm8RO0`Q5&>7N$r%B!dJ;;LyOtcV7c&&&s%VOArS&`?%X%h;V zykzFFw@lG8R%9B|!%A1t288*k14=wVplSJq+~Y37(hSIcm_HS|$mT#74*aSiS6y*_gSye|yTA?Hu z*G6#Q*?$&7S`~4^#)CWlVG0O@0)jZ3maZTXjmyNgT^Oe&d1yIgS}16JPT+zNJO#RK z$o9y20&ptwJ5<(rH(1oSsD-j?-vyS5T+GAHJeNtBFb@YIwPxT0H$hH!6p5u%b3%et zj2`DtDDot&Ciq3Pbl!0445~Lcd~i^OQQ#~XmPQJ}Y$j=G@L2_V5F3)~6}A9c0CPmd z*q7N(&QCqRfz>Ki*Wq+?;Esu3bePH*n2=#lbKM}{x*$sG=14|+M8 z-p{-_VdD6Ck9}MMlXVzpNBd*2DU@-xz*2jQg9IqhOH!`SH0eJl&;6BjFTwMC1__ae zesWox3x7-WSHmi_xnAil9WoO5evQ)tT_#4(L$`3xVMNkXI9a`92!K?ldK<689roa| z$);YWoj`}gucU+n?Mmc3kd_#;zng5J3_*yg0qRKUE(ho-`D&|?#DKUqfN3Ix ziI|WbFTmDq5)yBA2t0wtqIpGiEx%zkf*U1Z3kE{G%na}&TH=h4_7Qm8%UPu@$Q90P zW2Mx?`bR2}y+D9IHUm8oCB8LY~(Ch7u%)iUN2y zbXKiNlhm&R+-3pX!GmGBMQ~ivYwz#_vCdyc)1=d{z;g3lR{ZH1h3zrpv(gSxA4$O8 zd%4dtrabz+uNK_tx$kNLF11IO)+j0mwqtgR`E0C!y(Cloyr+^PA4ns zN6B}%#r$V1(0Q4jZIKPzRAbH#3+arQ9Zv`|L)v_EQI);%b|l>7ZXd@0LAGT<`Y3%nuK2eJ3uB=wT8(Vsih z>z6|UVh_s!QxYMm#DC>&@-wK^=MI&Cp%mtBg9-wqk6#`S%^s%PnMmYK`!F5z)Q|j- zhNup=P37JVdcgDai!oxrv9t0cqKPMa&F-9U?dw_FqceUhs5bYK2GHh%)c7k+)rf6& zx-iK($~Fz=eA0ScqzZvrmHS;K`ebl}$x=)x1CI}rz4#||5fk25DnxsuR686#-kPjf zpR|*7Z3#ns3Z!)#&R?Pd(p0$`$b@s(U#?B)-eO3c0WYgM9Th*sBp^a&x$3pfdwamI z$6)0emo;lv7fJ;D6ro6slIS7`h$Bp^*hvJTl^`bRYW?FKjV_AtgloI7`O`}OMOxef z?Pb71w8{z3(gxn`4CSM=!IgQ<#Dm=E#P>!ScPv%5rT^cdZ1Uuv_{Ez%Yj8QpwQPkW z)GtHQP?-jnh>}=3ctV278vvt`LO>R!QB#~nM`PSPyN$Z8CtHO@M6~>m2>I{9Eg|im z1?#ZU$+P8-(yCB=(RBa$YuDF_tu>;8#J;Xsl_v4($&I2}c|?q~bka(O4;Q|?QwQ%4 z$A@-v4$cw}bt=mMAR+kDFn@(>B1WiO6+z{ zZVGCi6d9})TxSPdFe~9sXMV$6vsyn2D0~aroY`vyd*Cl+^?7jCH_q?p&0A-lL44bugAQ!^vzcBMFvYqFHzvFT*XN)V=$ZHty)gC%mLZX~voQBuLtyj0f5@eyY-J zfg85Ms_I)m);cYA2>`ZIROammyO0`88TQe=>X61;iqaDsaI&un5-2b0Wp z)KPZb5$(+dyw2%=zj(ie7aoZdOM-lTZ7^X=^!Sr^24M+|=2A+}9VR2l|9`|lB3TO% zCbAEen~w8@<|%|XClPG)GIr<-0o_8FP`61g_RZRb?hS9??r2=EBl^YKJ_K_9YeHk8 zJ;pGN!u&|Aa|vb5jtja3$~Ti44H?JyWjC=Z4=e)_hm#z5>k_Pi|=hd785pEZ@nBb>P{2#HjV>>dZ^Yu1Id0>EzTUD<7v zv`JYmyrGS(`8k)t0tC2FgkA3!FERuchE-vklzI`~D|k@fo!n6TFzA{$Pt;w7P~zft zrpvyPaP?D?CMWE2bJ$$w;T7ttp|&aVALWGzuL{JyW`i7r(~?!}<8k}zcGx!pkvJ{! zcB6Xi_ZRkYcu(A#r)CRbvAH*;a`RHs>|b!Vur8Z$O;0^(7IdQ23W6>1hb@^symx(P zb-gKHjelx2%`Z@YaXA4J#tpr4dD;fuWk+uN_%%p9!*S;|BR=6}4jU>4REdcQ{wRmy zi%H(0Uf)LY+pk;X)neS8w^XDv&AgD+6>-F#90wX4S#;y}?uhX6_Ys+Ka=c*z-nP4cShfdZ+v9lnMRj>|5TK!3Bi341>;v*m9C0%(XFY8f z6S|9P%Tgj8){(g<#Q`22;d45GvR_vUYcd$(Z0H6d>g%aC517E^+IrQXR4ReyiAiD+ z`k`hL^U^WKGEmg6*bkfPLfne|N4zkZJr}H}NZ2>(oxf%$g0YiTS#{w-Uz%{14juG& z2LbDJ(-654cs70Q^;;j8T~rupLG=9yaaFATc*-`Y7ga4&lKf`r3DIMT@s_`_e*L}y zAD}lM6DAntz6G_IbObZql!C!}#i4D6pMUJZnFzb$bY1ND*GCGa{^hSZZiEg`J#fp3 zn^oyLuNU~mJ;O}1cMe<&fF?R8NkRYm5gHplzzQq|vQiwE58MXv6%PrEm#FE@qx0KD zHZsNMy;mYs%w^M%pmZpL=(w8H+RIZFDCKnC4B$M4Y}LHYZ8(VuBPOoj7xS5v#r?Pq z(7y64!e5bIM9F}!yj6b@3Y>dh;zGu({0P6AO4I3p6zTz*fTY(>Gk;BgTWK!f>m4?7#h<^y~kzbk<=_zwh7P#^@AK8b*jncL|IX z5D*k;Bn0V_l-vjfK}u4P6eXog5jH+5Asx~s-3=S8p85Sf|MJ%kj`wk2_kCTj>pb5I z`SWInzC0dz=UaCtaqoY@=JSGo07?CRI9)K}N`&W3+A@tL8%>8e;Xu4-){BOk$w&LP zyae#6wuL=A{8hwhgu-+kVO*k-7Ea0(FF)`@az*sE#Xw;zUkxPF_6lhK>d;q&WT{p# zI8+TUsO_`Q8?Ch@Pt{7h7tuD`siQ_ZdMfe1EmmWtrTN-w4^JPf(tJzF5c;i$iiB}q z=+QPc<#tbgd1vg{K|PcLHIVpxt>-k6TDw+B|K3~y@e%d(p8lK4;-n zPkVS7M7L7;4ZGZg&e4?LV?$i_0;a|r@-ryH>FXms8ocdZkx;riX^BXHvtTS{v!!vP z*&{!_W*c&;nx9Kd9=ocz;mCsOvJR$u0*841bK!l;5#Q3_NtPgZyY}Lqx|Ttm%r=xz zjvw2H!)Q*qGS5OLE|2EBbY2>3!a4UxG#Z+HuDElJPaEGLp3)Ob^$D>U)AWVU26`WS zyTTmV*Z~42O{ul_MnI$zzP&how#zHs0G5>oVlp}ZplKF5@vMn3DRDJC2Wz!^IbgE{ zQdo{?q9#Ryg@}<+mXy(pY5P>-1_#%2%9t;UCyopK<9fIAfA8Pr^k#Ac5nhT`RE zzd2IrHutioo-n40BaI0BVDsnGa7T6gLUu6l@~hKmTSt-$cT?p_zDVGVnP6Ls$iZs( z7bD9p4fnT3;S{EkA8*}pjgA5Qped@d(ZJ@v)aezdN+KaI?V7N_uHHA-|C*Uj{0HVT zLu^rpH$`Nvf7L7{sXY^(0Ab-Qor$+j6%X4j8aBv(_%V~9&Ph<+8Ozu_nl$WM*I{r7 zc8L|8gC?+h)iGMcMsTf4lO-m9v5)0dHdmz|qfMuCbCWmy_=SS8_%R7u1GoGm(_ZD8 z9L1I}!98Ypo+ZP=pa+SXIL|kWKBqG}gL-gwYXB?#%$!KJoh|?LMa~&jKlgk+J zeEO69k9U}QWE_%XVk~k2b+s9~)WG*ek#+In+3rZcFg-8DcZLHw9IzC#pP(gUrVu#s z!l?w>4pI45fT1*d$1r_Rawkv(*V3EM#{%`c@Y0=tB5!^YhR^0xkBNaMqpQ5)wjv7*G536 zCn@(1)1-A2CCehhZ{Fyfx(xq!;B|$#TY1|(djO%b(SehNToI{$UmGjxuw29e-76j< z%w;KRBg+DBch{e}x}k8Izl}^t0vhqf3S=1Fb9YqD%r#$q1>z8#QCv)(G2gsKtj)H_ zdlunclzqO8ZtMP5tdivicC&$>pKmtH<=BIXi*#AvVV~w5iw(p?!A!Kw+vP7lnUB{H(R^;}a>mOBW&kjn!Fah3I zWj~cWp&EZ-LWmqY&M5STfPnQYA#SUn<~0nBLt=ikH7)!lPqD`Z*C^%vV0i&((|e~RI}xh zmG8}hOXd$z#R?Dzi8Vy!y%c%ElF3`ft^H6Ar2P3#P5Ln@BH{gs@~y67fb2uCd1)Ru z!=zN|A0bpp^-kp>M+}LR#L%VngYWTon^3FkISN@D5P+F6V!t|4jdf=^I_+Jy(GGd7hn8M4` z%C{1^wSTwP@RoZL%LnbybnV5*-2RN_CPkl0R5`7~Xl%D`Q*rI`&<{Pu7d zS1oaJ@`wia6^h#0c7iOAWLQ!+RK;Iz+L|6lw)n zgcAV;rEqX0OAbs63E{<}4@cGMPmVZ3r#x1iWZf%#u$C9H=+dKbD{Hq;n?@*MF3SgUF;-6|KbpU}PA68w! zNt=H3k)OK-N?&iXLvnORM%bJdpcB{O|24BdmiZ#wd#T@Jd5fW$UND%6%;pJArTeEG z6M3J=v^#lvDIz=1YXJGrK1_)`GW;?rG5Gzn&$f+{Hp3;7QW;@Z`SfyX0P^j5sO49ppnC>V_u5{X8kLTc*%gRX{?9hue$vY<gmVgoGWx%_aid;ID=xI9P{1_M-_} zO7j$3^tH!fu9)HM`y=5}V8uH?&(F{v$_O(Di1f|+(HN)d*4GJxb+2yfu`|er#I*19TWY_SB;PgH^W3{Rs#IVpayB!DwuJm$vZPmU|glCn>@0c&_IjHpA{TUn}nL@dPY zWcXb-=J(y65PXR2-`A#`P8u~@x|>>Q_P{BYBhu7lDxt_As!-tdgMu$YLeAvR1??ih zf3{!>XxK>j(iw4tWUNVh+?y9Tc5UD{NQXUhb)|$1e&WXo_>O+%p2psLB7===Vo#{R z@8}^TlV~O9PNK?bvAz1>nm5Lw=_8@H)J6ReHhIkMO51$_)Rz&{+8Z2`vW^CxjzD zrQF2)7F0ce@&Ce9k-ZbdEsUng8I0DPT|l5ke?3Z?=VEo!fk@sEi8}DKXHtNlKKwxs zL;qO*PV{3Epc`CaJP2|X2n1dr>ilLIR(G2hUjEb}gkN$&-Kom(a|0z{0gzue6^5Ai%dJ-UBFF1fL5CkCi0^~T)@ z!FqNC?9cu8MDWka7iG3~`eJ%Pp)`EH351dv+;lrk+!o$aQcCv3Im#xDgmO7(qtj@l z=zA}#;t{&-D7Kuty$B4t=f|_}(2-^ViP%ZGcXC;ZYtzI1lTdnbSGlM#0I$+E) zW8ht*+#wsTKg|K>QBW2QTD)q#{Y?Ql>4nzuHrCJs=>hcV!aD%eT)G|j;%`nNqggF! z#*C$qfHdVO&IhAc8*24wj?d$N-1u{&mrRTI-lG+6_SBV;gc}XxbY*7lsUE;$F_DIJ z+ZC;pMkZl;9xZET6j_iI6<_e>_eV;* zym$o3y2ldW>PF4R&~%Zo{cq26>hW(*Ng)&uPe~Y)OT({)gcS0a+ZcFb{o0P(gl<;y z2;U`XG^P5oFxtmLL(4eVuESGm;ZL%chPI5I|CKO8cngOSaZ|Dc9>QfCV#tNy>_PyJ zTO|#LvVE7aRPe@4F6R#6zxYhHef!(%>(w5Fi~^l@7OUqRO_de3VEH{yy5Ufw#+2=H zOaivDQdHOQMvahl%BWp0M;#yz zd7jt^`|4X?nZ^-iKi@FP6q0?cm{o*`0*QBm? zVD1ykrQe*8&)*$h^YyuC0CZ=%VQ0ShA)6%TE2ySFxt~cUtm(-I5|Xa$1z_;gWm3s4 zj}iqS%IILo8)aBGB35*@Bv3K)6D980V_Rq^Tu|wM)!hiP3DGxNHdVzvjQmR#UA(p2 zZOC3t#--tAL2_I&7C2+P^DT{?e;ER6-VplFh!8|#{7AwJT#>EOcVHHEQx5e}J6(6O z8&4HQW8z}7-)j6-C6?F~wcy`9KH=e#N}PIs*5%)8vC~=?agz<4wA1lw++uX3>sX85 z)uhPM;U>kR7mqY0|YQ^@+G2Yc`w9R_XYEh5cg5!P%gkCNFxOTz5tm_12!a5 zXx7VOz|+4)eEmCR8?0%Co$G_k=;dGYdDUa2%jovs(@W8@mb0Uq-p`lG3i4N|I~cBt zG;l+7ajy4N7{cpug@6`jNf(}hZt%ZLd*s-Mrh7Y?^BnQ{5Afd zW|sCTL~Rj*{I2}+SdPBTHR4V+_;*(2{D8xUbdxUv|2_Y2N0vS=@sTXVL1ioRTA#_= z*{Y^KFbECDj>D{Z(d9EkedLvdU>>g%E={`8%6O0C^b0W6mVsyQURt zAjq+2ih$W=C}zj$k8^6}f*UASa1L7b5l|vG!D3HfK9;C0k5It)E&vo~h&7c&_0V{` z^Ca1qd6@{RxB4i76S5}YPKj*EXO~ABgi#Rw#fr=4N6lA^>qiwHc<+RZ;LON;3cySd zl2{FiTf9XNL97s+=!?jw0T`A8!oLRKk-xPlU|2FJ?~jXj%b#jpM_gR%`EkJ6;h7REU$5NdI`CiY~mill#1* z=D#Xaig(Ppxh?%tdBV&grv{69cnZSOm`ax7WfbD_F28ix0{W@dG% zx|`=#f~4l6WlK%m8%=nB2^=@3X)|3SAFcRSRcAE5-9G<9+qZer5c4zk0kg>hkINpE z+Dho;ArSxZ=qqj8Y6ag7p0@hkkpsCAkF;jqUy7Byyxre?{)AguXtxX&Gkl+H;GyHW zyF%a@O1!iuLR0GDuzlE3_t~Yc*?c${Moy^xbO*zn=3Ug?MbR~AyVMPYmG@aRvj`3~xTdFDuqe!kLGLVqw(Dm=D49?TQTp zi%iBU8g=HpfZ!D`8>%m}K)~kbMm8+!D*y18#CZ*ahY3v~j|uXmb8J4R^a^ZTS%&C*dEa7A+t*fd3N!EKTy%Hy7w zm`M2mfB&(>914MyM?FpXx<(zZnKenD3v8;r|EOFk%kRZaGoy^2l2`V;Nxrv~o2ORs zM7zV27A#Z_*z(YZoC&6CBz|L>P*Xi^IePX=(qaDoQ-K(l`Zu|8WWfQA9no#Z-1NNH zD2q55JmImue`jV8w#4apQj4BdI*Y=Uvt)8NqeEzv zMU6oEeQ&rfDOA-4OCQYn6#PqTB4)mf60xPhTbp#lu-3tZU2|TIRoVZWus?uyNugK= zHSL7;`_y~dAJSrIVgQ=>dGsDiNQ~V|G6LO=99zqxbU!;e;&>9wvaFg&tK7j*r0nh8krFoxzWCHIrP>a>L@juaZ>Q`rz&JEw0L zL6wpSKX1|uvxS?Lck@5z5NeZjKmD2XolkJjvZ(}tw@A*VKEA{=$LWS9DuL@$sv>R= zs7y)=GmN$}ruE2EI9R`^I51;;|FggyL&@=Yf>4``UwS!Wvox{x;kv)*B@z2mRLFIF zG)ZN<^k!@rQ0soklY6Rb?vwR(j750}X z)K-|zn#2Yh`pnm2&Tk#IH1J-NTn*h#KW?P3D3Ax6I&T6A>0%|QivNDwtL3;L>%Euw ze-zZNUP?zIpU7)|0=>KC`2q~NlLVA}*$Kj0>}QzU-LF24Nk9D`u~M(rLg)G|0b4{k z`#5bIFockhT^0tvSe%1TR4WN0HKLC=!#d{X%nl)e!{+$`uOLJsev!e~VOwQ#Z&(JP zjHmjkw{PiM8pk9OXg>%F>h zK1;ybA1{S>-JP@$2^5O}_S{r|Fd5}dZB)qvx4#%xPN2&Df#BhU(aBF8vaI~~%8%M4 zCyMi22#`FNN<2_>`Xq0O;fi^`s*_TSK$3Wo?CMID>Mt2kq@!zBocJpBVloM5Sd?cr z#ENO=Y1VRVx7|(1_M=FV&H$=u63us((r<$UOH-5YKtqkyNci`>*;jp9ARM~|z8cQI z{&agX4{p%tnkG$0+fw-iZp^#6x>}Q&o%=NJ_ahye)f{)eQaEZcW@+C`oc`5ZQj&vi zxek`|xqp*trP<^^wvV4xbM~!LaIMmzuPCmJ^vJ)D$5N4U#ee1WCLdJs&~90mba(Hp-jnLi%Kiu zRL8y|h$OpB*h4(?m#5hM(ig>8dwhMRbXVA7RU zKw?<#si)OqCs8%rKXv4hLT~y(u+U~5qQ0bV9b5YD`wIFaeYa_<+B0>}1pM!6k_{DT z_md)=1aVsk|NJB78|Z_Df2I|%ncd`RDnUlI+M{3YW#Qvf#T}{{^TQAc9}v~mpE#nA z76==me#iLSWQB*w9N)H}Czr#pG{j`36WiFI2X2JNKAKPjm3?IYkKEb2vx5Wfez5jB zPdhr`CnEw#V9=y1VzzZLt`SIhoqLx=2pyk5^eQ7+`??XNCd`SkuVw2|(Z4dl6z}Ob zDKkrZ^Yh`q9Vfd>I#G|rwJqH62kU1O7$ftC(1`PKgC85+H9S4Uwqe68RK!c5UWR9F@alQ0Lf&ItBowx_=Yu1X5?6F_ zCk?RRhqb@nol?g%exo3apqhPp+ zCl-8jTilRul*|(GDO0^y+i|#h%6QeLbB%p?t~lt8Iqg3uPWYZhv{-|_PfEL1jSUBt zpSF%EaYXov-22lbZ-ja8hNAa)G-`iOFK=S=eR5^Y?PUdnDi4D`WflK+{*7L_x!m9K z5hU%m=<@^zGwt_;C33Gyoq@$aH8J*Qv_NKSAN-Of$TBpDdKBmX<^QXE7ry_RPB^<~*U(`vdC5KU`ux zJ|B?($xJK;B+v{R+*Dt6vameetY57-G^+i z{>0?t24+gtd~J7wymki#-o~pY{X|GxNZt^oiHay%y_v3*Mx9*|M9SK@gSe?+$d2pv z+N2jB^AoUbS%1^)WEKz)TIV2c40yVcy_H;^ff8PTOqxo!|@8fye_4B{<&}BoXD&oOHD2M5*wcS3u zBB1}7CS#&yV`15V<0Z#turL_TOq3YO;(^Tra_0`wS9(b1ZF+1wlnGoP3RS12n9)YZ zGaru(+$;f1q_4yg0allqO7-?&K(iZxsKkSZtp^43Dn~4$d=R7ejtGuOc2H6 ziP3~N6kw`c*JT*DNXb=gNGG*#*VSf%DYB?$;Vz^I703xmb5c(K8qu?+ey^$v|(0dxK8`YPWrbW+B5lNPwF_X^oKjcwOQIFzn#uGmERZjKV<}r70X4RJ^?9T^iI1IQe`T zZWr=taKx6|zd(kI;5|hj*%?c5XS1vf>5G>7)9_qxz>Iq9d2ybFtBe%I8GzUiaQi&T?XTE1_cUf9=BqUkZH6$UNFcVs%<9%I)( zOjDs%ev=YPjGKvCH{@>(ox2jwcr<~8ReFTx$3*t#hcUbFcQZYXkYMi50(Ed#(pw#B z-13seJjGUkwmeL4L!_{GkhM@A>}!|wXl*Z=mOT})u>fkUU3mahtTZM#q@#2?YR9nT zl+t<;$wN5(;pb`6FJ5>2BClVg3qttzUcAVUTe}W;`#Z-7oaDQra97Y1snOC+PF<*H zW-hbY-}3jQQuw$<|L+{;nwx}r^-hccEuY@#?=PY%kZ)MtQ(oDnS{C1prw-;+okB?N z*LQ6=WRw`Zub%+R+uRR|?SxjR$W6oqwVj`LgDHziXA5d>H}ac61iyJmkNHDJ1RkEb zL~Q45ss$FqT7fHm?|YGiKD)Y2173p zG|2?|-em=jdtKOqEzALd4nvCk2aB$-1{_{7zAMXe1kaTsm<-w#8cBA&RRrt8pqg$A z9!tTbeOz{s(~M|x5`zB%vG&@({7ZUEMRJBm>7`6;)Fp~smEEM7pmwX~;Eut`+r4|< z|No@R{^2RGawOqRFwAb2o<6x|j`$uQCZc8xajZ)hD3UNKw+*xZ{(_akI*-sg>@ zj@ALwcFTg9Gh{sl_lb#H`n+Ju7sJk`vhjpPP%6I5GP0cHFwaJ#Vbm)Q0uvpJpXk0Rf9BlTB-+j=k=Oa|YiV zcN0w3cNQM?J;mWWe(Jxk=Oix(jp_JKvjvcRpYHF^#(mQ#Uy3mAPdA*ZB>GIABxL}QMYj{x*KjW6v zSAXb`cV`66ilpn~c3I2rOz-+-5~%TlvBWJh0#OZ4;zWk7xe9^8@L$T!+^E0j_)SDE z8B6B2?JdQQZTs2r>`SPtSo$G|`P8wHl_MWesI%nN*;&yQuIUz`d86Z25i9y^nPVA! ze+6MkUG4w6h42nVEaKs!d9acfC%;$>MztoLsIAT<#EBxPq<5P$4NhMA$k?tCst?3~ ztKsfRNXpUA@OGl)BOQl#(%;zG*~BaP{*N(km-6p})OY~D(bTMPCrYWlE;lkqC7bWg zu|yH4+iPf&fHmkk3)%_-Tq-#20itGcy#zE*5jGrlboA6hU_7L~-r7jIUlf%qbqb^AIu*OX49bX|iU#XPA~LkN#N zTGz{>H~Cv7!|i;x*A^}u=Ld}Qyx42;87e*3kn&~kZ*snpinmKqx);Glg)X{roSJ$q z0>1K-$w>1jU#f_h)j*v41#!wyX-RTeJFP40XttFit*|HvZ_ZK)?k2Z8Y6|T zg6T#ou6u?QUMDkyxZbT!C!n`;Pw$W_IndZkNaUrb0-evA{;f-a0itOkF&m%aiE>0F zAFc<6I>IlW@ICEH5d*%v3Afgr<2n0vWOL~mewzv??><@%_acj#2ZIA-4^$Vu-Ng&A zU*8OK@^*g+Zf%je2%l&#s2p|7NOPW0{Sbh-&U8Ow%u`&l^mVP`{tSCc;Q*0{W_|BV zTR_O@ghqc`uNc-I;|hH+a$nO_UymZrgyhzx)B6pdTZ^B8p542DJpYylz4v-Q&pIdn zSs;#W{|=c9MJ@MAD{&`~S4aY6nGZxh}Q_9YPY>_MsDO;i%@a8vq}_^#Me#Q)Mi z>A>`{mc0;w)lwZlbcY9##lfNi>Yr>laf=)Y285$;xZswYp+K2}Jc;7QwWus{3ttf812b!D(6+B|C^2kU1lQFd^bMq9YT9^5h^@CzT)ZhkPX ziQpXfPxkAJ(-gJ4`ZcMaC;{%DF8&aj|3~_pn)K+bYL<_ej@oCsJc9u#{>SRo;m8uy zcYb?;xx)a^8j^DLiG3KMb&MZH_ayvMMA>YMPm_L}cTw+Qm9~x$N{6wQWY)Zm$M%xL zXs9b0|B24alsqpK=DqXupw6=5wI-xpq$3T;7|Il^8``sTgHiLreF{u}1+!R8ZFxAq zWI}t?k>deFSli(AkBYe2%ZydlekhVa+|COq^oANMm|i5c*6qQvvSC6C0i zPGgSe?@rNJ!Qf%hV}ctUq0~M<`TdV_*-v+kcEYm+K`W4P2Ed8e(Z9}lR&IT2=%CZw zPxfjY>o6NS$5nOD%8zd%_Xpb_0Q_9dx!nB4a#!TH{Ive8!fk5v z=zS>xr1Ve>uN?OI^fYWwfZ#M|>PaqYH$kbd6|We!DklCXb~4hOiKfKnTl`AOy_M&c z7dS>0%K#5diTPg6xXF|T2h6c6W@mqHG)tGUILqWcTj2D|vIfs-pRf0BB(tR{+!tT@ zG46a^)QSjLj{Hj?Z1H409X0%2Obfrq98Ne_NGfsVFp@wU4eF3TK+BwqIk4wcG~Fvv z(vXL^89s$(Qahcb7!T$pGqIoDOA8niM@Si(%aUlO&_JGj22b7B+imKt<el^v(Gw!q~h9cvzVjh4(oNrO%<9r zpG#GzIUD+1oUzmYK9loV>0POp?&Y>ZLpp)BUW^NhA}Ttmj~%T_&SMo%Q%1~=_;by{ z#=(ZVf9j+Z6kq^qDTg`0Mu$e^t5p$2OM>2U7pdksH~Tmy7~6k3YTqUK7EJIsqjwMY zND&9S9T|s59rZ6iwF_f>h~NKEbsAqIUN?RU?lZfFu0TfTvDFzGhguiQ0$A!x{CBl4 z-sddx1gs7QxNTZs{SdSlCa#Zfv5UJl7$;C1`)bFu{`n7k7u|+&cRWk=R>a=h$TW3J zDNf03kpH)$Y8`j|@lx>g^M!3Yu@SJ*I3Vt+4ocHZY)GjTCdFDrDiJ?h_XqUtvNr(a z>8HnvI;C{ee*luD z0d_cNj=vz#Nr;(nqI?+vG4kLUqj48+te1O+`IfB2?S+a>2D3h>2Kdl&?;RLfq0QoA z?K8NkDC_$#v>-6I@WoCa&0F;~WGXNOGFU^P>i2OSiQPbwF+|qW;f17KJ$*HZkO)8iQvk0yIp&5Eo5oS+8_M)zWx!9w2x2ZO! zfp>gDgBLTE{OfcxEvY_7Z8PA)GKG}6cU+6>2S;^cGgOB!X<}S|5xxI4$&${Sq`C1F zUKZZ{F02NJnm?j7Uo284GjIsm*e6c>0~KvXzm z3MgZQ4V#bJM-T^7TJ4BFNtnF(4trSz-q`(tY2JA3?Jv3{rq)?uIM)o&o#Ql1XGQSO z;0(cRvMT3QlU`yjb8dg(tBg7m#3&^>>jtAA{TqPW<-vS!OSM37IGHJ&xKD$p2zbcU zg}->N1-Wf zw_n*^Ek*%7bYz7WL#Yk)dP4-e#Delzn>g2k<-Jn43QR6#Af33Bdkp*>t4LdO%Cq>^ z5jjG%zy{`s@X~W8WZ5sfN!1!FemEbaba)Fw0v2~@xqE)5gg|9v&zgckw zqsY>k7Zlh&JlBWOc@o2#P38E~!(~f7Xg@EZX4uXRX+`m>?!A>Ia&(XxG%QNL`{-`O z3y7XBj5A#7o|vInk+M*kOl%<5*Nhozvo?`my+^0ZljwYOx@x zGg)Mc-@sC}b>Q&X$@OS~GqlIB?|fHeBY~%IN~V*ZY+yBZJJ9{NYCBdy?KGsEki7FW zwIH~G+Y5Nk)9Li#2cqb@vgjK5uh{1}*DtY;TKFAw;w=8+X9VzX6geW`5p`nfk z%-&s&FuW#PSI?WtlWmZD1Av>d-v%-QM+H`(28j8`p@<-&iAv3t0-NObWuY(jJy>x8 z>6hSanH`dG=A_;}60UffOgf+6{H4ofB7i&t(KSLei2I=|{NBxyf*`KrMX#i})Z5Hp z^cZvmI6~^ufd12mnRy9oQc|y0F8$F~-1qVH8?*z70w8NA4kuoU^V}AvX)cU2K^4=& z&)1wF4RjD5_{Kx;<^75fH8kYUf`pk9vW^SF*SkcZVtd89M%k-r>`zAsT?9&^Q4Ut@AGQjE~Rf-l(8Y*b{# zfKni>0*Y}7fb^#*AD85vvaMimehwz-D`aosk#0Inm?W%QaA}B_>_TmR=Em&;L(308 zq1qtA%928-d1Hn;>3X%Ao$AV6X^L8Y`+7D1933xZ6^f4^zvgUMWr-r{>iJ1BgH48u zgFapM6!N<8dEY&MWZRxD9<&wiognau)2;24Wsl|wd!Mt$_WgSp`TFZ?rFJ!m`Y6YD z0fsSwZKWmn;I|oA{z)EAyvC`7)tvn#e&@u#?9L}t(AC=h{gx}=%nFaYzwYF+R0`nU zbw_%x6wZ+Z&>!D6!09ue*M_VtV>lqkMfty>0(cWlQMud=e(?DmY`>xR*7Mv+Zf}up z=ppIfoCaDRL&+R4CD4>4lRCgC*LS?KNF=AO@-;S~co{KHJnk|-pBL+AP$D%x^R+Zk zcJs&_*Uk5E$12@ABV8%jbc<1D=LF_Ova9^zvrT>tGF&MVZLg~P^v1ZZ+c`o1MBg}U z+>_Dqc&o&pO2~)nCqp!SU;x~@Ps@AIY|nte*;A{P12iCnNV)13Gc0*I! zvX(!@b$WB8S#`@~9eb&paAfNzld60s@(qyPmL4j+WfOk+I|`S*9;RuIO1(X4uN(z& zY#@GQVvR@lY)G-yyVys)ed)$f5gd2Hr$fOOak}d=OApt|j=)x+fUPoRgw}aCpzVPPXDmipX3a z;dt4&W<_j z&cwtu7|fb{)(}#r^+|<$=Uy>q>TQH}Y~dyM*rUSk5#)ibOK4KdlBJzI9i4qVSIgeh zb@1qG>8v8`mV#eMpO49~sdmy;Y`{20TqgBA>Jm#Ta{`>n-DfEQg0)8f}bxu2^q z%Z0|Z!^OKVZ(m}fCr!!@V}JfK)>mVEhFHvxfze**x~t+<`hw>G)*Z7b8{g*~Ft7O+ zPit`{Mat^3p)0;I4ToiTFK%_<X{F*F>V-bm_HVWiv{_{G%-NtB#?+$ux$ zVi%|PMHURLrBMVeNA}uX4M(CXGi_`NyJTMfPSap%LUAcVa-K$h+{au--ll8UKc~9E zaP-xtE8wbE=djbpbC3~tpO|cZ00_${Xi~)_vpv^)F`V-WZDm$Gv&tcQ@B|x+6AlzF z!Q?IQR>h=(#F`!6t&9NXle87Kj^;|eeHudnw{ZaM*qoZ_o2b`i$xOOuN>%Rg7K2jL z6W_*uWGhYksm$cPp>0z%+0PVp6U}6%H#j~8J@D(g0SPOnFc$&5YQWJ`wjT`>KK(*6 z%c-Ua6wy~8XY)Lt?7Ne(H_Wm0ZYvdUJa&(nJM0TbVKFvAO5?k}t&_s&Tc@2In?sRy zEv1kbOAH1jjJv5HN{$Xc-pE_g^<7jy;IHf8nSXVvoSeL1w;6)+@pWNgoS6F*bQcYE zRYe<*@8=g?4Z7O-U;MFH_I`2DX7~*1+xU%IL&ckLpv{X z-FtnPQf>1PzfKIYO{+9x;spf-2%it>n})LY0d7dnQ zPW-Ax*NRE!jxn4Jpo-^rl$PQF0Pxp2g8a#`3R$+mGshz&r^G6v) z4E#d#-!1X>hY`d-ff?Pc|%t!@&f7pgsolJ!pn{B+J=n8hdSz2dH6 z9v+X0M)_Lht$EeS9;ub(wraJmnyw&stM^*Zuhc4GkjfWoCxw54V`f#vd_Yf3ao{5u&t*dN0?6vooj^fwKg9FmoslcTsjz%kgIymdiA&H z+P+Nb)Gfn^gEi4gw5H_PPy#{{*|K&=k7hoGxrLyfCZV)YRC(rFx5hi)W7-5rvp>tU zll&Snk(maYnd0_t909(*JLpJ|o>Aj--0`-O_nM=6jd>QVZu#HMP3vg>oVSN*8_+3DL> zUeAOi9{-L1Y1LTaY;%o${C1JUrq%44yOPp@4jnt&n54f;8FI$;Aah$uVu_ZXojxl% z_ZT1Tv?|)O6f$Ut{_i?m)mZpO@ zymxj5laM26oso;3e^ogt@k5)0cYAdRJa=4!%paIH@XuxEG)#&Qd1ShpnzVhK>PcRH zN#8*b8?Z-q+yDgxtd=7S1fq$LnIK{!v5K&}$OGFvu$Ke6VNwxbe9K+ItLak*x~tK6 zwLrS9zJyZk<9}7%W9i;uyVmp*HxWaTM|84)<8Y#UcE{ct)^aa+-_2NgM?l+MlMOfy zV*mjNebmSFm56+Uz>muE|M%AZ{qL=v6J}2Uwn!S85PEr@4L@5J%$5Ed^Xj##b>7cF zO)wDthH{Iz%BYxZ6Fw-_E6FXUvdA|{tFqi9&`&N>>;098s%>2nL;WlHb>*jO&Ko%` zuQ4Q)5X|L45`7?}gQ@$qi5k7=bhJHa$jo7pWYkFim04&{w%lZEkiZ+`d;lis!1^=W zUsz81-Jqv?*S&47Zv3JXJxqCC9u10oCGb z5X3>@%<+AaGcaL19Xu=pC-MSqEQWT97AdhjdV6OMg?O!O)}ET{qV7Gekj2PpgC)Pe zpX{%$mzS_a;TC~^$L2)`taleh>jHoPU352npODS7P5!KD^Ua|7T|`PUrz1RHZ}XFe ztLB*Iut^rmckReX_J$}BWY@T;DqSL4_ z<}>gz;Jg$(yQRdg@vYN4dOeyAs(sgy_AbuCG+L8EPuI(1Ui!0_bmkwY?&HtzNTqr} zOIoht3>5N|cueu!c9uyWFvdmrMqpiVpl`Bs4sIh93@dEUhD^O!EZN_>RD$?sWj>=a zL2Xf9TU95+-6Ayi=Q0LX(R(KC$+_eFpME@>cGW77{PReG}o=+0##`c{pxOYU5e|67xx{k$gn{}uh;oh zNTDNTYpSl%|91~{FwFl_Sl%ouw%6NJWDJI@4-Ka9(->t4`l*Hxmmn41P>gz}K=EiY z(crvE_T0nhf`?vhwHALFB#r!x-d%dmzTxeyVILPzG8j~nwM*3-ya@f*2_2qDtfm0+ z6%4Tp4*jedAQ21oHY_vh-u~9uJE;`tW2oe`$1yKhCZ!&laY?hd)fjI3=MM2t`PnV* z+aa?Td)HN6#zl3RTu$WwsXF-Evt`$-6SGzplacSjL_o%m1-pSGF=)V7#Efn;l*l6S>cp7%Zs ztDTk&7LVQW`r&(d&IZq?RG$Fnfz&h9Z{x@yW}guSRSK1p~DM0L$aN-Wwf z8>=&CUrKjesKXWqGP^1HYeDe*`HPsDKz8caid0T(%TPDzK_|MkUAY;#)XK4t$APg~ zB@|~J7DC^?w=QOhdexOS6Vxo{E@H9Qq&i8S8x|0xDa!?J<%U-|K^rW zE<(|_9;ye0pfs$k(CIJvvi4RwNn?3L9|Wl_Uj8qQPFoW_erzbuj|6G60JWc*;-+&g zktr^pdcP5ZPvPrgj94>kP7kcM7eH=HI*51E!Fvv!(M`W>kAd9Cq%izrfN7vKAicm; zX_;Gabgt(WFi`rDnyDx_P9hcXKfcLUG^CX4xbV>!QuHbBl-G?f=H(I-^FhF#{(X98kR|GWR4{=5G*k8YBu3Jt*k3QDV%dvVBQ{Kr*EEtO&WRmOLkS+}Gyzk`499)Tb(@$atX(;j|&sl3uIw-~SzT%q#ffw>;Vdr84_rhxoc6yr<&GZz9& ziYe*voxZCNcKXnT-z_MbF7b1CTrqVK(W3s`Q{SI%M3udF_a z<>{9!xAb1)3XnX2`b+fvL$ur+-iZHdoxIrlNHZTS-11%gU$KtTzLf%T=Yc_`eN)PIO{+&mTHLxv0l*o zOLHisF-kCgXtyY%G*E<>iFm8-YS<)|6Ae*+=)SI!-*Jl}vobzo^M$dY@EvgDoi7hF z84bRz+R%bkra(u#6|jxGPsuR69G!xen!^x8r9)Uf5-*S@70o!4UTHEF80#f2oxvN> zOA&?7#^Y>Pbpi#i-v8LNDCSTb`QsJEVL;k$?}=m7vGX}q<@vHqjB;!Y(IWv zhF!}O!@OI$s~Stw&%4l2+;6i#JUbQ4ICvaPM7{v~;r=McXB>7{kZ z7}=)_rVg?n^?88Y0!G5&iXE1R*aH=;(ni2vW8z#XecH<2>4$pg^G@Jga_V}u%`9Ze zCX!Si7H%$>ga0-Q%OQf!$F}muWJhp4f_L0W_mWw6MC-Xq{}X_A)D-zIvAGfLk^;%^ zrPSrnt*_~?R1sm!py|p^INtivyZ<{FeK^Nn{Ce?#E@n1@Xhz;12q5pC%B>r|2#4sf zJx=}=o?*8B`MO7+XmM1x*|6(>2YYRmb;DuSdvW-GRT#pz8E9|Z^hg#?1X_z?rEw@M zegj4l`|oJ9mK}f1RJx>q2`{Cs-v3VRV;2R1^U|V>)9*eND^Nw=Lf6)d0ye&Ahq?OQ z)&g&bP^rr3cCc$YxXBI#Ol%dexHhL;bqaP!XA@tm>bA;sDKm zx$(uf?~LKxifHq#30Xs)wlzDZ+K8Fsut|8YHnZP|#fQex@v{c&w}+8n^|w29I$?g2 zIXB_L%-!|uM`M$UADyK}!!=&go`9G?F6qcAM90#S)|u4buW0#cA%{v|H~mQb1=^A;?>j2k2{kPxp5m-7!WX8Pa3Vy3RhzG0 z8ew{Is{S(PNXR0w;EX8?4#uVscY431;oD#;`l(^1q&r>+dDMX(_`MIBg({P}k(5@& zL19?iN1BiO14X2{FIkxo?S2@<0swrPs7ZiT+-tO54_HmqZuB_xAAhXl>suw4{*-98MRy_?RoyU{TiKP`maUU{EfTi#+w1$z* zCeAd4@e;u$;!LmJ(tt>9+j!2ygB=UMuw|>jmuz{r4? zoAeh4jR)CTckg7dYe|@Lu5^eFS4(qpFVLAV7c%4L?)V?*BpPo7I|gL*^f`G6Ei z2U&Zyd8sf)wOQyDbk3U3K5)8KuyZFgU%6-bYO9ywlj01vHt(<5YJHU}gwGQ@Fag=1 zraYOec+EXnIH?Vk*{+p~g8oK)uj(cR7KdHx`KNuzgc$Z7eRClwu+#}ByXYPPkEiAl zM4lJ4qty6T2HNjAV6|c@giYJ#DL^utI^<(LkLRbWj!b|zt5$qC$vtRZiQDb%?h?wP zh182p{JE`zfSjCWDBz8v2bepAmfxj;4w<3{4RPrMqUr>sZ&%Ks@XG%&=RwScTR;3Z zzlr2|^!DAPr@tcu0(SKU^Fe}ck14uV_%QM%|KyxCqP8T={+VZ5)^WLKek40@o7`=5 zlJg!tIs_wjSZSH{1a05$Tz3HtjB1sx7146^#+}b^sA6h+RnKZRUO8Za-@o?0S4Rn} z-8AZ$a?UaKqnWShS9*GNp#IYLs)t$RZxq7cb+WpDzg*0rL^+SznKx$nxUzIOyrp@H?545-jwA7W2k zJ(U1|`wKD)+!|?qMX|fkb}(dvZJ5GukqLT+MW_- zFlmUGG-%KTG{9lFD%G3I`=M)g&tpQ3m4frXefmZ!Gqw@SaC8pt@~r!w(Bz^>0%Cn{ z(?qzj%Nn+)7vo&Ai_~b$uh{4)a7yO`$Su8PbEXE0lx~`zcEM*1wg!o7AK*}jGbn=M zr61q=G(Dxx9!R2Jmq?upv$^>;HKr!$(>ddN_(afcmtghtTj%bDb5m7eui<`XBQf&0 zsphkmZFbJc(Mje~0b6}GbD{4ZIqfjbZ;~^^j)7Ca)BB&?K|>N}g@?H^4-XZo*TD9a zZ8Ss{c5qlG>pNa_(oaJ;mQMY? z1$+RrI|J4Z^Dw4AtjeUQUg*6_)BXIKz-h;m+&~IKZ79x<0pq{@t+-Lie_u=Jy3;iX z-RTBStx5m*2~)?KgnRfZ^82L6CcOxJt4bHXWfgofWzTkTKo>x-y!?juJ4Q@2zr}HSoPcuretMdHP3#rs4ly%=b6F=c+p74Q@Pc< zZjlu)$$_?mHnL4h@=}f_Y7+$$LF!0EQd?XSD;znc@VarJh}yiqR#y2h3D?S(_tLd= zYPA0-0A=3vX|8N`^;klz>h&0ev*%doDlmOCBXicM-#65}j5Gtm_I zc3;${eaTD>mZ5#85Qx(N`#c==(#sIJ!JN>x-!g^$=4qZOo;{GX5kRJp7A}%(g7@-- z4v`OUCrsa-fX6Pod3JyKaGjAB{nWw(eQb$5wS+$SaA@gyZLVLg9m9mIi{=w!x{!kj zl21}iD$>2Dr8>{t&bTMO410MVe|NVa&038!W;mvB)$XYjk}l+lkMD#}TP%!-JJp&a zXf$bCVTz}9gdRM-8B&g&C4Z2S^Q3VLhRRj>O-YHX6Av6;48KnygxmC&=oO}*Fr@w$ zyP7|4){41#pQIYqL1{V><+(Mqg7kZ> zpeKhNkOj2iX5+)Tuk$MJZhl+-L`ePfv#-t-<_Gz7_bui{AYFk#%1NDQ+TBP`bI#aA zCf%q9S3bg=N`+ent+Y=%VRLqOZXU1xx^!Q?I}%KyIi-$<+mHHkr=OJC1Zm!8lJduO zy!7Q>f(BBd;4ZIDPOvt{=jLz2Nt2ZYv+(DfYSOlO5YBl?H`-f}{5Kb4I|Vg2sE9Rr z5UwDGPNWsLd+U~PhQW~j8tgB}5-G*#(c>BL$)+St zx7aWsA`r`=1wm!54JjR@{Kvk}d;DOi>wf1Q$~7wVt?Q1MSYgcN4Ijq@;VJV>2#b2Y z?%bT}={JM+-H&&MVn&e+**;W_UUu&K$UoH2-8TLIdJ-(HEGamGtIylT# zCF^9W6To(K2m8XRT8XyD^x;Iu)t|zlvPB(h7xr+YohM^Y_&hA_m%0}V!o4EPp>m4w{0@`IW~=Vw)Pc{@t0Y=Y5m*ntI~**ge?OWc{s%b+mGn!gCI1?x zGZ<6%sJfEWb*?TsG4In&*eQjkhiy*531lKq7yalAa+&mg9i`&`y9tI%JSmvX@-&V( zy+b(6*hXTv`j?(nfj!*y)?hE@LQ}WpF6|12QkIM*b75-bh__0Cn1~_cYzU%zs1Ba2 zNxa8n+7J?~Q7XWn)7?~q`8B|-I7pYk#xQ}Yi<(tKs&fvV}Wia^Ap zvGyEI<0N%G>w!_zJC3{AZxp-pZcWjzu~55+BI2X%tp2D6ZSDWewc(oLu}z!E=C9ln z^S6$OTHCX_`#Y-oj8B)qx%1d!u~5MKq<>NI!5)cgIH2bz>BN9km;?uWgn-vC>ug+! zpgz!|eisuzZy^*rq_j2$TYa-)`}!gEJ|T}Hl!FC;|GdZ}un&@(ZldBNN>vA$4u`P- zmMu}ofOI$nYm$Q7`;ok9q?c&8X5$Y7ne`T+p^1}EM#{UP12-lN)USc+J9<_2J>PvE zw+KKYm&zySO`d! z4!yRc+>{kD-NKQDs|B({_9kvUDo@G5x)d~|Yff{WH^Iv#O z2A6E~va;~Xm{q17V5Yumx&>PubgFJB!bWR@$#GNc8t1ggqXQ=Ri(4DVuiNUMB~d;} zePVnb+HvjH;1Ve}_&~o5^YmWDYyzJ5x01rH&3EsEj&>xz)P^uJMe0SD4I)jsWKjl_ z>MHwm-`?rbyd&7d)7Y0_c=D>)G6x&ip$8NGLcCvA2QmEYW-Z)?YQvuF*EEqcfA3!1 zAb%qG&Qw4A+24WjekhAJ9>2sAnk^YlI%XFIkm55 zx>UBzWuN?+Ln;nET;ke^)R}+_ai>?%VL0?mkUGQ#PRuLP;vbvGgB)Ag=WiZWph@ha z@J(ZEV23v5(24!;WZQhadu33O?pl7#~9q`IW)Y2$|kEmP_nb!tC- z&v>#U=uiR+!fou(!Sy|WcO2YvQXtOG1HJ!weiZeEf#?iZH)dx^+3JzePY~Icw%O9( zq^}{IK~52uU?|u)#_kg0H^UM-o92=Uni<26$`)6MTjod>o!F3a9<5|#tMXY6nuY(@ z*>doM2jRwRVPMBy1fbo#5dyk(FzaGzR%;5j*HsU~+V`p)0y{#>`pSlxQddZ6UmZ7g zf{rz|tYcqCGlVoxt zN*I1bj980)MUqX_S+e1wem^s1={~6UMhSu)av$jGJb&+$KhMZ@7~hG4zuV{i?Wk2t zt>3dkDbKN7LC8!~H;#VeCz-gxfcd(?vMC4j);S|Y{iegj?n!^~P?#-e)fn1tjjB9&rB7w`W_f7Nr3W(Ey!ZMZi;1NK9pCk1`s1lTfuhaXgSRv~ZN0?BD8hG3 znMIY~TP5bXv{YGNDwjMNq%9{1l)Zk}yuvz->6Fi^te;MVRr>cIOJW=({gy>{3#6}V z>=#cTfJb?Y((JogTf+c>|=9Iurid7por zd^$EdGdKnE?3_n>F;B8NMSsKfZd-URq>G|hs$!z=VxPu3a4+RCX8!Tfdet>MSP!Bh zik!gyv-RRs^&u#MqN~}Pv)z*tBbRhwiY>Mj5rrgjBd;q93&57*Q$}Lvb8&B3OPd@3 zQf6e4AP+xH6Gg`^HmNDtZX^u?W0`iG5Um`w?aL2Jq0wQhCdSkp@q>uVP~x&Z($?R$ zLOcw~Aq0$ZF12lEBdhdxcqlgRCRWGzgp_1UyL@yE-0?CEKf>nr6gq~s+(H{#m=quM zN=N+|IW4O+*XF4R?p5Y8-q>1{^h7#ZnG-8O?eeZH8rtm76WFaf-lWwWMFd}V?O|WC zq0G6|&B|#QVxMHFl8HLaAu~V0LuErGO$7V_+kysCXR>@#K@+gIF^>?U?7onQ6`ckl zPC{F8rx)!%R4>>-DCre;>h8j*n0K|b3Y{hr9JfjpcTBd`$m_@c@C-WoI?%@U@P1?MIO z(W@b;NPdJg*lX38KFP`J%um(!^4vNTYNg;o`WAv)o?17$hz(QLbZu}yBl2G>j?cl2 ziT=COpf-5Nsv#-U%Maud=GE*#NQM&Nab+7Enkrn5z<;Df4^l?_G)J z59X-H+Psb$-^8;c%)?iGPX=aX>q75SALJ@q!$O`$EQK6$&AEK!Lf%8R1>(j4}feRUy@*TPg{YSUj!ub6Kz+Jy; z1FTr0v6%ifnvVS^PtVRsdj}yR@IZT)Vy{)1&o^8T+8qvZBtw6esh&3=33ChA?%C^n z<9GFA36J`)WsCYEFQbnG#kFTGBh+Nnv-p&BB5LcWyh+vHRgW| zJ-Q{X<0^-n!gZv#Dl)}%7!A;n;sxH@DE9@iKb+U|31x`KRexGFCx8BWu5WN^)g5l3 zNKI2HQs0;aOG)?8St$&v3&Nyu+nFfkgnKpjGQNAO__1TCG}O=N>$Bc#msbarBlmX5 z2KXO+Cz$>18^agimjKBt*Mi7@rnr8p)D#Ymf9-hJ@A}ala~OSs7D7cWMf#^pqH(H=vnP{(&1Z)Xd=1>E2m~U;BCd zi+bRc^DnxH)r0#kbNt{aJ3={mMPP8zX!QOfA}pFh`p2$2Cfota7zTy%uYaourZ;Q!LAw91^bJC zpCnGQJ}%t7Y+DB>g;~iJ-;@7Eu^f1s*039pSYD(-0vgIWPuM;Wm`DAN*q%sgD_mK zrbBzmPxRvB?)KVV<_ParLzQXb&eoC%Wsq$S{L*4YGP36$ELd%6s2J)92ME`=LIi~)NyeGlhhLH``UXn7e zGC;FS+dolLM$JH@uJf~a3`{->f-{#YuS>`OS>fl%_lXxR zgx*%Qa6}mFo9$>|7h5iK2f3^*rTWezI<<7V7>ESSu3 zY=m1TCl|um5z6>wro6AejlTNw1EW!#quq*{GJs1`61aqV2pB7*FIKQHRg`^5t_%cc z+ zaxMODR_>h40mVPmib?K-TRbJb2Qr^Zr1LInjGEb`ol?9AEq)*y8s}cO zU0jg%??J!+4u=PfQh7)%#r>>j&pQildb={MLava3qPfL) z*k@VV!!VE<#XOFL6P$nm&vFxKn3J*K^5G+QVV2tgz3{mbp}e>!cWpYu95TUFSnrIE za%|zo-2t2J2Ih%!1g}#6GHYbB=k5N-s~RGP!X-ljz!xeho&5JjkR(m2B9YIT)D@|V zoMK~7fE+YswCsGq_QO_&WcH<7kWcGRq|nc~>tw7i)yg>}jFbtiOou=pUpk5nkDfi7{B-uV&Fd?$SLsG6?xGV1L zU;^#y(~Ec53>qKM?h9uAIyNrlkUi}R6TNYcR=qWjCcDC!+({L>lOMjtj!hSgJz_eW zu{}T;WUrtoux`6SBH^vEl~J?EX2Yav9}xd8V%0|Rx60)G3KrUk2G-AFUyqiw`LlgSb%W-W33PkJ zMEVn^(868=&i{Y+rU*lUXwiE{>33t`KKW|#B3tloAqWFd2q9W}Q@zvEzeaUUSVl;% z()n|;w(?&V3M0fxak5X+wzeX;OI2fKK4_<+ul0u~qsnH)6{eZragW|*L`e&HUwe^l zU9u3~37@RX_5Fh;ETG%xDjt4{z(soV=}n?fX}$BU+PxjFca zN=Hmjg&C(&&-q&7LrsK6G|U}vAzaN>x>3Hr)5-geJt@6jJ?j%*(Pw41(>mnNsv1@N z93LAs`#*dHSW4+1WQW5kZDV;~*G_uTP?>6c-#eRg4zp2%0> zJLt$1wo9vjd)x44XYlVbjx?->oT01Q{ordIVib~zdYPPZkNLE;ySt}NI+Gul9#i69 zzULpiDkJyUog~-^zjk~8oEuPt6YO*U>7PP(fVX2p?J@foH5`zl;GCU?(e9{1Y|S}Ot`Mhzem*M3tpRwy5#zUhmqug zU?tTPx5D8W;_V47vIBJ2Ihm6yIopIv@i)Pwsc2VViyywDom3u+J#>h@Iu1n@w{( z?jf5k8>$~));Ci)U&D$at1M+gi)BewB#+bI)5i|S?>-((`A+fm5hjKm^vtP^ilIPr zNH0lK9AUsK z(yt$ewjQ&NXWch1%bAcOTHbWamCnU3M;%qh+qsWN&MzcY+<|9E5CC35hNW zraOZ+iNv#3UL#c=kl@eNOqLI0%kOd9OK z#a+}K_)TE>n8d%$oo{OvbT*s_;W1y!eL6;4{51gYKYHP%*uxrq%O^m=h;jet+OE1U zbtrM+{M~nD`En~nvq8b}hJA|qfdt(d9}5(7GH>Nb3=4KUk^C|t@<>pic`RJ~(%kB- zUjDNe`tbI)7YW8yDZiB5kHgJRl^eJZX1I9=Czsv*7-A z2398A(O{jt7au&oa$?OUAQi3Y`09y00Wtyi-hEjW6g35>G1IU>4-llvtTF!|20r)? z1{xi@e0^0b+ME0DR@WsufbB|#+Xi#Bcxfz+p*KPckm=?1e}+&1ve#_e z6Z+h2849FTWL3L zqy5efw*Gy%o_RZwEjm*>#b`-qU}v=YT71CY-khJAd~^r0jRk5qR*gKpdkkuFqRIC% zVLk7ng#+IyfyPd@o1wTjH$LYfgXmIj%|`Iq)pzsYMSH%^Af8ho8j0KSKyOYwAQ3Il zJ5bL5AIcytlQrsvst4#|Ba`jCUlFMw?!By{b)(;9{ zAbAfn@f$kiq`<n{mUs5ZN2PD3XLmZExeLi{+tSlKj#NZCl|rB;Ivh_vpBeTS0TOnbiwjr&E12( zdXUCuqVYcOM_xjLjZkeB-6#Fd-G6;G^!?xZM2ij}#zZPkxz zk+@qur($O-JqxBFPviopnD$1jtaA+xxTd$bT!}WSkB&&+$s2J=VwKJI>2(((^0)Zg zz0RkMQpu9C&r&XsebJEppw9*f_&N!7X@GAbf)f8m(s&FJPdN2}rA>DPJ>m;8kb*dy z?*q3S;g1@GRT%)}wuE)gC~RaO@|9vHLQvyaIvhTjr3QD2O9Gu(>JUP0)H3X!qj(sJ z2~4wTTQdgv|0n3BQ2j?+udk-vY|Lr_np`hs=P%_`Wda@+k!7SZ2xg)Bol& zGeA)}O8(bwBW_g|&{n@3=F|PK!)nU>COx@2rvfW-=zLhSqQ>|3V-{) z5K=$>FRMLc5V~z7Ir4V3QIbZ`bDMZVTYc$96?mttk2~4@iW+-jgIds7YsjbmqgV-d zD=V^(aX(W(CZ<)=G_}SVS#{IJ6_=K(OS2&W5lDe`d@p}*$a#L^x8V@Zh0P)|x(dAq2z%H%O=%>mtkjMbSvR37$COf`!CnNpK^V0oTDi%(FYDYKB*eKTP@(1 zleQuQY#QVjyg)oRydB&v$oKEZLEvz3*xk^o6bL^^?QodTe8AX(5ri`9J_nd>hoK1F z<5P!8pCSC^UAa}ux|<}~@Dvy%fimPp=dbWjr#wfFSs~unoB%s+H_YCj0SyskZ>l*M zG_$24W%JHuya}Nr;^6l?eDp?+>uh+)`p%hY4)=|8_d(n3U(uC3wQbVpireI@LFC^% zsFw*Nbq5&76E=yv^#itr5#85!;u(v4_r!eOmT3p=iL-z?u#zb(W4I$@tq<~D_wiwe zt8Y%QGH)Lp^Xuo%^*$u#9cOPmJ4&qzarCDcv%Ehl>fz^yQ!LUMeY0DiywZ$-6R(D& zYIyX&@K4?(ez#Wq4Ig%apB7(?s7f<{z@&S#Ooq9WOj2|a$H;`niGhSb=Clkgbygjx z5||iA9K~FH$DepgAsj!Dbb@Yre0*IO9yJF0tp!YKdYo_wTu>kOUcI!Df5x;-YfP%? z(TG?ozEYnElgvpJ`(>sv=oQ z__f}C#xI-02oC&D4&?byI)|6m{A4mV%y%nG*hlZL7hH&`<85K9CT>UgwBYz|LV5he z6vG%>2>`#DdaUPoU&{?uA`5qs*U&-j{U@epNG!-^h@9b zP9qeh#|iq^Ic0I)$@3hkmTyn$<^;~&xq?1;_Iw3XOF=W{{z-V>c-MN;{K2FnwZpXJ zScyC>b!=4?IOwvN++n2DPKB6)pwKL|GQ5NcZ%4n~Gsw2Lst)!cjoR-p5HPAacC4ws z5oT`2!%UP6zQ~)=fJGiXbvp))&dqu&tGmcKriz-DY-$~>KM=8>+FKhZBP9$xrxcT zTlZGDuHHVdx`J~|e*#uf>8>0Je~#%hi!E=XCTgm`8y}4Kv(v^kAK6#IyxzVt)E0ex zqcv0sh7jnNf4Uxu)3p;nhwppm1wW=BwYheDZG~MYQR2UB$`iJWc(wxb5Z z-U6ZDsCV9DXBFM0sKcp<(nD8HxSiGDS{Av~q?p4WH4y3M6YOFm z@9On2O_12nh%^{Xw}|RvR)zdMRM2%$F#cO4>ckSuMqWB3VYjr(YYw&R9)?j<*ew6= z#|bhROFxtTHN@(&cS_MPU5+t}(w1i2qw}Cg4jReP}Ev9@214rk;~4B$36>=crC z=Ot-gyPJJJ0V^oZ(b=&|39q__@bsR);(QR#mcUo!J#slh?#Onju=uWR(l0gc=fLIr zY*G>+>n~v-W;=d~^?0lSX$zKi0%c%rwOa#pOX7-r z#K(&B{d@RPNQX+fJnYv%wW18~C(Z17MR{l6KN=-kOO@9PXvW&)P#a91k69OuC^-WP z`r9}PkAu*ZO*f`$78c%AKAY+=o4#e9P>&JY-|qjz6f{eB5pXj61^u?xYTIiCR&A4A z0kZ;CZ+TYh)+j6&dJOcVuL*XNex}=mUA&fNeiWT03)%A4%;rVzk8%|oU2u5!nFGqb zZO&8yvEkM-fb=Q6ct74a8~bSt$-a2HygMudtUL3#a9KM5Xl_K<^u`LOE6E%RVUj-> zCz@=>djm()A~QO_VdKOaronJ6M*eXqMBwHH^*@BHx-EqrE#!uoTqyB4Z@55L!*ljA z0yzcHByW@cPfkuHhhH!@7MpWs73TRxX~HGfl%qre`{hw_Kuaz2JmMbpjSF#Q+W`Cu z6itrx5B{l>3C}##WWHv|N;^`hYii22&cToJSIhj!odDR+LY@Cky2*p}lKt})fH?K9 z7$iQOq|uA$PpVXB`v%;BDDeD_tn=k}qj@$lI#=U(ahvfBZ`dJ?slJIW!oa0Y#do~n z<$FrP-1ly{CNUPdAH?65745z4&-_4fp#J+u)z)qCE?jqSNQX(afI6-80~yvOmo346 z_&WIh7yBf6BkCS|zQs08tn7#-T&mc9o{{mS468~5VmgmKap9>pM7_qHPy>g5+t*mK z--W}i5+eEK_v**^u)#=7@J8`Z(iayu1SRVd9A4F}gwf%ctx6y_8TRUY3qcskhT*S9 z+x-!GOLPz!9^jFGWgWTF*~iE}De04Tj(z4W=NRszK6!D$@W% z5&JVf@I$IIV`s~%>_!8von7_|3pF8eiltQN@bb;Z=tYCZa7OlHYB@{`L}Yp6jljt} zgl*iZLj|KzBI7KqK)F6-c$aA#J=N6ZeV0X@qF{xl%NEy+i~|0-DUmIo*@Qvfk@$7* zFU+3ojdjJ?1Cp!wkd+f^@+j#UN`AgpIDi5Ciav?n)(m!f!h|~LqPT`mYpZmkooycFO_gWCK@=lg1C!7iHxNDqhV~#Ek$w`V2MucxN8~x zHQo9ur&Y{vJ&^t5{6D246t@4Fwo)?4Z98F)Y7UglKl1{bv9vd(r|a$vE7yG;%arL% zeFx~gbEh+W#JWVbC;Yq#g&_7LAR!0CON*jgB&wZZ`S-FS`FkLAhYG?Uz>m$J(E#Vn6@1WM^Nv z*x+W-_}$_5r7!H0!@Ud~v#h49A+z{&ha0`YgmikI2s$zL_F}j(B?72Lsa+y>2ZRhV zjTq#SqxZMKBPBg3LFmP=FSlA&lWeGIrJggYk$}BLm0A)KpZjZZf%Z`D{l$wJ^01}j z*(@~TE#-g}`-_wF;mZ2`sAJXGDL#sptAbRY3%nSV69}TR1@A)I$J5omduG%ff=-o2 ztS!dl% zCNipQ!7f#(Y?BM?WMc zmVid)$YW%LI5q5}4Y&ukx0)Q;gC>y_*5L^W&TfB%$xbu)a4xhfwq7{=1ZLqh>U356 z&56!Vrq1E;nS+GZH`t`i;mL4^{!*SW6}A+$I@(40ryiFj|DW4Me~VgNUlrIdzKmN2 z9@fS@aLS`PJor1Yz514xDfzmvN_P__nDL7IWxAL0W&r;+)NheI@ex2LDfArTWFWr` zahwaWF`Mdr1_{Ecsr#h!i`u_+P?ucLf5wLv~C~0qQ%wTemYTCX+sv+ zrY2EvSJ=4=KJ?=DQd(#M-B zOfQajB4%og-e4GE0Kc@=-iGgP2?~T-VO@a znTvxxjtl!I=IDq2al6^w>le~IJc28_VY^sML;a2P!XeMzMm0-1 zjSs-VKi6n@-JhG5yw@0T+nL?5el9yLi(AUWa6VWZeQ$rCSux5Q+q}bM>K=F?NUeES ztIu=&OHAaempTQVCAw-+=p7p|kr!{`DxvlQcP_O=M0`jKKk17(O9)~EYY<{7NyA}h zb>Gem46xqZRgND==U_SK|Kt(MIj<}d6@~tF=NzkLQk7g7?41u6;@U&}zHjUf&pv%f zq9wKn^PfxZycwCf80OlRd=As{V5MI|+p9#n_mCB~Xb-r@SurLigiI(jF}Ge`vbj!* zQASlQieD47<2|W^;p)uBN={(34`iOO7Lqzyw}sB*72Hk+^ZqXe1+DivykY;qg)RIc z1y1XCu?dK*fZWD<3lSgYT@`_NLEA zMrP(~2_2x(Zdz|(7GE~}xqHZ^MLL+62l~FkkqD{|Hw?F*1=2(e+4v{lW?2)v2b)ji*+cdo7Rgym?yAIV8Vu zM2)hi`~mmiQ|OdN1Ue(K%C-Z{J{~9PSdX85N=JJiN^$HZNG#$Rf8!3i1kEE8Ov>V+ zY?3;tB|8Wymxipk&9`aq6MvvtX4)RsuBgsyIg}D-=<|(m!)LhI=M@0OE5hcdX4QwJ zhb8TcY#E@0ciWE98nTW{?)>uX@5FLstgSkGC#50aCtDPo>AS~fw?;W>Bpu_2Lc@wJ znJ)>biDET!avi-kf)4B}dpSlL?4&6>_8}u*7g|&<9>7EYSpCEFV;+~RjSjou!8ntU zJm0<8o}|=V?oHD(^oaKswrXdpGH-|2H#d03wl;10k(%VZzvwVZY*9Eh+G_bUGy>Bu z?=j?ZXB?TbBYyq>F$}phLJi!$s18dZX2}9W?lYd!qlUdQvwbc%QB~dGU4pVu^SM@@M?XKWC?-gpR$`V6;kVk=5|uH%ue%gl^2{eENqX0#X`Ub*m_lKmK1!Bn~nSJKcwmRfpMf8{u_eTiA08k-w&4*xq zs|+=O!gb}G-Y#qiM#7Ue6gIMtiFellFZmD(9`TZ@V+nA@sRDf07PKSG@8in5gMjD2 z$7ChS{Kx$4=7RU3eRa-rvVn{azhi1_L-lY^Qx*0vo(oYb9XEop@9}SFp4uMeS#^Q% zFihZZ^be%{@c~baGv%XHGfa*yg1q4A$LNRk2A}*5N9vxDiLH46MD_XIbmN1Y>YSP5 zPmV2B{-9ueMo(BQ?i;|dV^AWwze!!wGBGZ=1BdTc5c-{XAVU zLWPF0_p%LkIIl~1F3#Y~7?3j;I|>2V;vCqU>$JPt#VVhu4df0!X6^p}OIC(#s3PQb zG3R^Ct#PRt@e{~0U0eehn0>^^k%in((kmW}G?RRMUfdaA+rQL0y{ycCKnWr>+fpnv z&eESD02$nomM=@`k8iW7DbB(1-;QBg5athzwl$#>()_=GbIO1p+>3_}xsXE_Z6+_) z7LQ+<09_7O+QT(Di857Hb|Lqh3aVze$-%n!G-m0HZy}u9E~Nd+*0eodBTNxL$+rL7 zG2a7toM`b-lenFJ)t}WmDWlE~t3p`kvr+gmolWy!bo=2O=$*D@iMpKAxYirGg>oeO z_yaX<=cI6-L`F{L^r4EuaM}K%Ty$Fxidqdu)2E=4x*{~RERO)c>pqcKK0SBy;1!C8 zof^STtNqD&2of{_xJQ8TYG0#8peq)deiNC9jlVjS3Z<9I%<2Z8l1@%+RG+6DML)Vx zWlg&1jOCKO!>Yy>HM9nf0Vk@S3+Fdwl_MMu?6{}*I`;ThsE+99jy!gJLTT<@llc0& zgGQwbm{HU~NIq7u8CFVUkfD4Rk=)g#@{3u-5ONrLHA*7(ue>DFcxZ5-n1;tekRZLd zuKmW#$iZ7{!RDa{Tac-q>0>ee4m$Z;{q40)fezFRM9D`>@TS;5fA8k4=(bAt7FsCP z*J1pH);)$;ypg5#V!mU+9;slaeqkeY_L48Kuv zr;#3i+yM{;d@=;}Jh#~%5E>F`Fwr(nJZi~+1_PM^7J|{LSU4#c`5Mp}kRBFoo0d3?YE&?lsatu zc~{2&T96I@OeJ&#Nc~H*lVaMZB4{nnfvWa13keQC|MNHC+@-(7B3iC!Uud$t@T*JfwOmwc*k2 z{eDiP#a88x^45J{T-ml|T2n`~ubcT))qLgg)Ko=j^67-5M1NbUGMt<{<{IPJ!Oo}G zl$O_Y-`BT2Il6IvaL5F>Ik4_fERI%V$BSVEQyA$pN9cSZfjZmxaj)xaUJRHq^Bb7d zE@eyg*I5|#rbDVjZpcz5TpR)+NL@w2RtQ(dxmz7|KK z-cBxj<^!%3;v>bHXPr!#2~&{B?K$5w}tGS&ZlJy zc-c<-{@njQsB=fqIl@Ico2T{@=*?k^Tbf{s%PHgdqAF`w8kTo@&(KFKQNK3WHmltq zocP(3MF~o8{x!dTIL<=h{?B^9JU91*=Q^*Kkk$9!7&2oTYvuaRZ-id$L*k7xugP7< zL~}MVAML#v>3n@t0^(m)u!GUNp6YK;4j`>b!UNNrYwUG<1$xBM$48g7oL<^s-#vkw z@1`o~gG-K>K3iksfDIq42(L$8n_B~hX5<5zYcUMAzGLPQs6r6L_*J<`TCH&iDP9r8uIX3>9(Cx4YRVpBYffXYyQa0gYTYDjNH@lpKhqyD;RGBHMZz1tV?un3+FBJK~ z?}brhq_mmdaUVY6`TjID!snwH8;BJp_&Sf3HffN;f*@>OAFd@JbDw^d@Y7u@`QMBD z7a(59D>GECQS;H9N`Qcur2O|)=|G<)-^b4>>n7ceKTgze9yc|7A9+NH{d`|BWQvKG?*pcXwrn5*<5O{@}gM}teJn2IQu}ALqmWuXw7HOp{2v+8pt;O zo6O(q=fuivoWzb2F(&cGWD=RnC;L;#4(3W)nUYS2Fj?=cO=AL~c>IFg3ecyV;K zl*sW-%?;f7n^~mu+~&FV|6}Pq9I5*MKYs4LX7?{kS((>}%HAS-?`yB?-rw!>{rwZ?yxy(rvadFOi? z$IhN4pKb2(Ak9n%`TKse<`dC10 zs%=;hD8!jshty7wctLYaAAWg){O_&L)RMO+^KWf&koj#lzW&V#pIiStBV{rm-BI|$+R}+_Xn-l` z@#kr%iDAfY^}2%QhN!N_8MLVRa;ov=;rG=nE;gZp3VzKAnCeBT;q_`f`+D$1;jW^p ze$dnrgMlHA?OWo8PW^(14z)ZL&dO2#Nv>EKgGH`b6VV#c8R$5>@WG575K30oeXcqs zXBV5?dps*|6M=jVOyyY-d!`^e8Cu0Qn~rk+je<(}jm;!B=y_*7{f<&GQk#!3UjD#A z;q?8auJ>O*!ejHsyv3X>A|`DUzQnMg?yZq_L&DPyk(ARx6K}5Y>vx$o?@E*}qjeggAgY`%J{%G-|12}S?P&$*TyDl;V*`iZ$TGOy!9A%qi=y+QtamsHpufr;QhbKVas3wlumxF z1v})vmA9Nk=s_%}Z#yC5)6{`H;}28tMo%%4t6nYk}W54HZ@+aNN z3KQVSRJ}88$d5)0D6C`nQEh(~;Z#dMN3vR=ol!S`L3dBRD2o6Y=E@K2&tfY?P)wan zA1hC^;C(O5!|o~;;VTi?U^kqffKzK+0@ofWkN8=WcX5$3^&$0iOKag;mfpdpMjTsO zD$$DIp`%gg^(YnMtZDw*VskpBMFGH-{1}?6(%oy_kaKKxGEJYe_`zS{u!?my-g@UQ zXP%-e^A?h~H+^UpFtAq>$LvM*6;Y)+e+Xk|5x%=JYeB7E5f}VZPOxE=Z1p_mqf1Gz z)imnp>&3{&vcq=cR?C~gv+syE-jI*%)3&i%!k1xJKgR!TM~7YQTz0+?B7mY9uR`2j z4puZ$x$0HGYl=Kq9xP@OVCz*5kJGf2YH_o7^R>KxD^##~F*LzTQO)nra9`ZS?}E2b zmxPIK+9NnmehCJzQn&zRTKG^ao*k{sgEDao4Wm3;G?Z(boC|G<;P$}FdZW%&s_EAN z4y{H|f%_Tdw-D;L_m>o><*j(B@gwe~!yVkyd7+^wLty1L%5W1*5(eA`#6LOwHyak! zJirHiTd#B`xgh!0DGRHSC3JgU zOtALFioIqZ)0iSMGW$d-Nq{k3we$;}t#UN}s}C$m(}ug>a4qb>u<}TBBY!InG8yxW z4nHY5BB!DCZL!}v7+kk$KQsF7Yq8~T%N)3PHEZ2gW-!t8Cei$?nUN$_xi!dO!7}^! zTo8Kkt1TG6r@qXnOe4;W3K0idbxwcVWusm#UcG-VW$d-E&X(|?^WHB4AowBf%0!IH8@wPmv2yaog@19Xk8OQ@ z1NhU|H1(5LW2Z8pN@ddflw3;`+YH})0|kE7f!aG)4AgUyLg#Kh-;|}Hxw2_|*mcHv z3vS*F4X2cgYQ@YshLOS-Y6e@n~1U+n(P6>T%WhtXn_(LZN4tgN<) zpBtxMzT|3EPtG`Pbd^WxhW9QDbC6$hLTbY**B`O$c}&yX339uQMhxRUCgUoPG~*v% zYMQ&&;nd!z&c1#7;ZkBPV(@49_t9x#WSgJ3_Duw*v{5xDk_A(LckF=$tc^mPMUC}+ z_lLK;3?evXqHzQs0Xr$_Y{Q@H<0%Oi9|~E)cWWEnx!=fs@_lnD@rur#4}t@(y`9CD znD}uvw}8yx>UJ^v}!cF{jZutD1K;i!$GGMRzQ_GYvdVZ&B)cA@Xc->TIwz4hb~ z@xq^phCh>pb=2_EoTrOz#>xt@hK=H`cz`tc-q} z#CL()k-!~F;L>#FECe68={G{pY_WV2f5XH4^$p%O_!e}K$G@h%^_~*cUut$B8qc%P z0%eq?8n9~6J}Tz`(|hIqtYvu$xo5k11rkFte~s#t)Fjq9lMMF*-oI`)j81yn{*`Pn zWY60W53S4{?R|__+*&-&UJQYxVq3iHci{6L+JC*9P`jLY%#932y1y7oF8w{Ld=z3` z@CW8_@HfW6JnNJf_Y!7eBbwLcRL2HqVQ|mMNRC8tiA==$`!1DdGOPhg&*3)fzb))3 zgxeyYocjJbdBBjy&{%iai1n8{-W!>`{WO;oY_J|ys3pU}>vKIy13XY<4$c@qh1*X& zV)>zaY@RE~@E1bXO_2E1bJE<}zD;3ENMS9FF)kf5I@1QhvK14?%>?{#tWC96cCN3Q zi;+Y;8Nkz)si*klk!Xk?-U#Sy87=D5FFOgFwY~y}zU8{;siOg&6UE3<;KMp3 zPbCiibW2PB{|}b6I0iW9C}h%Qa;8d-$|Vd#EEHx6=n-yJ)`ioiz^i$!o|iSr?6v-(*ZzEYGa$Qnu0hk)qN=m~(8 zBsKyAfg`fF^)^Uo0`R{*<*m0K!Mr+1Cirk*V8U;XI1_7uZpq*xTEf5_SQ z{pzzyb}GEmam<}1#ow(dBh42<&FYKw)od@jVuI&sUA1zRNZ+xeAt|;lyPoN2Bo@&d z;bdB$8N;4fs1Gd^MibDpyh%_68!=Q%TQw+9e`Y7Sd$d-u)ppLn#5Lq`Qx+(xBX6>a z<>%<_c{(0iPGdFZrkRX8%%sc`FI0;ncC15xEYwy>!{B0~oR%Y8V4 z3}vN2<5J0O@UxoTyq zkj0aKbi(U6ik zyN;r_93+H#TYQ3j-zw_Do`IGMNl55^p1xB+22o-MaTm~iJ-QPGmqkzA9VN)lY_S$` zV(X9*Lt#~@txD<}O<%26eblL<&Hg`>q}b7YO##t5$C2Fi<-R=#U9FgrRwW9(vNdn& zrj^F}mz0B7I<}}08tWY_6e&`J!5bKnx5$FvoXwU1BOT!8lxfi^&OBvk(B+NOLKbc4u{>Oe-8%0*{itvm>-RS3oa))+tsHve zPuBpe%g$$EWF+&bvX5jIcCWKFl5Moz18{sX(td|?`Z*L2hR&ml<@dv;$`hN*GKZcMXO?R*ijUwyu6F{#?U1H z-8>&hDypDU%ks%vLAOo~pymy{1@x8LUdvy?A8a%#-JR&zcKq0csxT68-r;n*GH zn`fW3Fb`9~IbT_KI}&0~67o4u9-Pc;D zMuyX4tOQ}}>OK)lRR*%5z}7=PWZx!Fz&nIa)&wI`ZMz`d3WbMHcRC-oO`k;>%+{|Y zDPzZb8(ctc=HzIwJb(qE52BR0X!6Bu=CdJ>i|@12!G;pUHZdVw^w^CA?8X{ia6nN3 zYk2Sq!KslmXg3oRLlCfmOI`1y>}xJQ1!^!3Wwxc+$L$o72S})TPdoFPT@QxuZf0^pYuv%E$tZ_-1oc z)4oc?T0?}BfCj^4HQie$LI~>SGfeW%+`9xeV8*ID-$A{Q`pzc_O9xf=_|jiA8yOyI zW?Z+noNls3j&6Ts>LsI(R}_gO#HS?AK1qbQWF(n=@kX1x&AUUj(y?P=D(wk`cT@_Z?^^wA88XsV2ddkf9X3-={uWljN*; zH4F_au?8Orsvg87B_qmd@b8JzU9B-5XOWRT&cH#%ZPD86s2bcCkC4xT;4xC0$^=0- z?5w=G%7wvy%7WC1qD_rUl+M%UhtfZ_l3zEkDUgNn)_w7MsYZl?iwA>{^eCNdn@3ul z4k+2lr?>Ik$z#6`Qo)FS4CvV?*fyQvPUWC$A3ad_T|aAQv~i=P5}%4xNf+2-7MwqB z>YrvYqr$5-xGYB(7>7Z|tn+y!;rFOXzQe^x$q1=w&AQ0L_N9=go-4LF8Z#P!Jw;cL zp~(eb%kTEvc!_lHp~Pp8N3HrZHR6U$1;dhS*vCnH*(Wa*U6=-*kTHDhGhw?s`FNtzc3CFD>3%gzwl@sC5@`8APBRru|BPS+G%LR+4^#e3HG`sMD#t7E~qy&5V~n9X02PXYb4`#1PdrwVE0ORg)R5%EF;cL|59F7KR*_$?j0x z_->NA#1wxbrY%VMJZc(oGfhL^(k)J!=bq04IlJrie&D@k6Sc3h>Dx)JS^ollZqw51 zdY?TjXDP`?$c4{sDc+reKS)WYn^ww@|>z+_3 zx{g}r2$^1)HS?Xz7=3tEe>RsRL1tNUEr`aM)=~HP5|@D81c1M5OBReBsh3j9nKNHQ zKsBnVnL4zK_iV`OS`)jJ(E0kX3nC(>hipCTd(E$CkOXBs8bKa~sJ|Z=Dnq5zc`~=E zE@{-9)s@zDK<6AZ5Vi&oHDn7$ef5t)#YN9!`sXpTsq6Hoa#v%ngj|{nbMwLB5%B#7 zdXzU2DQ{vyOTk}8B-$%0iKp8CR5vX@Q1lgpC$gAI9x6)Rzo)hL0+s2|_L2U^LB3N| zG~}L8rF>mM@BD1Izq%xhlbTD{A&}iiTm*D1rTvntK5Pp-A%3geP|QrJ)}0@*AO4_B zWcTb^J*d0(-C*~w?lLLK={Y*JLuqGyI0MCoW;#fklS{+o1vQr6H@U+7Hf;sh;sUcr z|GHs6x;T^08`ulc2=%z8shsN<8 zwZ<)^C*%o`9ELyQR}8-T*KLF6=_rNWQ-oFWjVWrtvYhtoqKOCINeldpq^B=!#>H~Q zGksgwQatcXx^TYugg(Cn%3wdnFqr4mx2nZyFqa|u+{84Nlp_#zDfo*$-M;e5b)oCt zp#yo8n#gMSLzp*731x(_x)0zCs=>EJlXlR&Kl(QS*~t@?3-}=BX`Yab5mdtGNs#RK zTYX_;dGm#T!`%l30{?uidP4d6=UbMQD|_G82K6i}P7A_HD&lj_#$v}(ftM4t?v{a~ z-*|L?H}n_ZF7&zpVR2iI5^!b|bUa|@cY0?06}Tl@sWkVo)=9_$0J-2B_EDqqv=iyF z`efD)VZfRdE@#^efY)W{^7*LoIedw_bE2QfniK#l8I z?%bN^yTXpnbYSM-W4+K1KwtDMsg-`FXqDjY3`&e^3{j~4V2(@WOTN$jrjTL>8n0;C z*gF>@Mt@-HD)=S^YI|Avm%Z9%)B{aa55s<_*r~mtZ!sde_VAE=)-{Xx3H))WnzoD4 zvOr-6SLwgRET9naf(xbMvaUj!pqPwM)4(BXHqvKrxcA{-E{(RTM6SOZ)$lg9j;Q~9 zw~`J2sc}~qyNMp`Ht?a8_3g{bpZh$2yPD|iBaRncY@YD$0^Qso#BNpAw!oE$n(yWh z9TsHECd9--&N4GJ?p$dUCOFSwZC`yX!~Jw!;Pl4(D`cSr;LWVV-7qT7W2iQ=CVj{r ze}oN;^F7j{x6CU^=ZS`tKdkiQK3})*zEg<3kUCxa8=md_U$)!jez?ma2#va51=gqw z-U5+d6K}l)uATBi{LF2Two$iH1lTkJYWqWGD`HYjpaw8Au-kqlJJoRtL_jdxwL(;} zq!Ba`CIdgPy9x=H0q3o;!*1Fw(wsc>j2|JG}KSFdmgxB-3ymK9B}%uJjX zgi$nxJn^5a_!4#a1Eh0S);Qswps#_1o3~1ZAZ0X-;!3@v$IR{#kndg{PSi$TOsq2N zrp9d!`kw7>AMO7TSeQTUZP<0%M&rR~>%-)X;5%KqB)Q^L)FU*Mg;hoW=k0J>Y zPvqsR+~L`fok)-P^#N+Wp%XF4xEy~x>e-6R>}U3UIZ zsYh#dL#JPAuO!KSxtzKuW$Asslg4) zKNdM>m>P``Ov_^J2$r_2vk422$Xx{A`T9xaRnK%g8@ATPvVbz0jx=AL=!Qt&qBR_E zelGhBjTdx5ko9Xd3kh5dLbz$d&1Mz`&-1aGsqT5)md-6@0>7^}QvV)dFd)la) z?)EpnU)bAtj6yC{{M6RebwpFUY5j(sKFj|5vzs%v605~EiIcj52M<&6vA7uJPZ>n& zYXT2UsBqjp)TZv7aZZ|~Qm+yQu0H&s?qud#iX7Y|=r_4yK6@$);!@CC4tRkDQh!dh z!0XF6V!6L-(sLkhNbhBc{QBwPIPg}~hTZ$>F&q8@IB+xw#W|j*qu-^FqX)O6@8yW! zYuoC#ok_aK0GsxiKJGJjXKfg0Q1uzi92!A2wk7wK^O6hY*UJ?&^E|V%DN%SvbzFT8 ziWzyw-~ijRkv}*aBK!M9_Y-Pm>ji1_$3+Yq*@F$h=y#ODN?qjCiGEwE87$b;km!6Q zi7QAn!U}h~m$F7|!bLK|`Me#~bUgDwHI9euE^d!hsr}`da)Pq78_xx9iLs63z%Lu( zT|;Q5cd^SSjmp_F`F_K?Yu$5}W^h#oR{-+W<>)NLE?p4lr1Fxaj zgUADkz`ZqJ^k&%gcbbqV>oJ14BoEo#Sz%CY3CQzbfrx4_t6A$G%)JN}gY6r;jx`k9 zB=Q(tynG6$PW#vyXYKdLk)n@Lt@A)*Qymj%r~dz&yfecr5+w1n-@3Pm?-BuwI>=;d z2I?(e&l}N4V?+RiN*D+R8*N3+Yl1hrC~BdJfM8y5_4Kh?trs3FZrsQ(woVZ*xu4Ik zk|00FAYBr{0j5D>82FKVD2xW@N0c%?oZ%*5v-{@Tl2c#D9&^)(ii^yA0sBd5{ zA5#i~U5Haxr2O}7zA(chvgh^OjCtcU+EV2VzV%#T*uzDjjH=M`BgzitHMD_*F6-F+( z$Fh6cFhSpbzh{T!%PqZjC6T(7*He&Q!AA%{We{jGV^j?@uyxaiZy~>}=vjH-h(FO; zAm`VrpS)aj(*){uB08V2AM~inxs_N)?{MEoX)#*X98HGqP7Y`^3}2d`OOfa!KU({$ zk=%G*%>W}-WH*Vc0+z}DI4-J9n%%x@{Z5pc$TD0Ju$XHL9w0KJD=TZHXf=&_V z*$be}_nREsckAm@578^Ec;=9j;MzENt7SP(a_F-wO=6RrDZ>jH_|pv@(yoTW*0R5} zf!rq3bh2~~g_P0pz%ShAorxx7=S(JSb{&lEMe5 zg2#qAXR1BsRp0Xcd#Ucoo$HtC#1h{HWtz_sITmR_U%AVz0pzQ08Vb;h6lma69*DRB z*~RTG3%|2M+dkv#*xc4z`Sp}F@gR8AlkOr%_Yth)MR)pbg6fR%_1@Cv{1IdD^0^*{}H%ftv_qs5a;k1@l=t z-|>%9rkNaMGgci=5(*n4D*nyJQ}yZT<+ z8^4tSe?#J1LKaEn>4Wi+C&U*1UXeR*xSDI+Rt#ZHXLfb1uUll^ySc_=% z1efzZk3u9~Le6Kh!VQTMzG+`uYJOBVi_}^DUlzOdmdgkb00_!4r;}FSca#FjBCv}D zX1iB~Yf^VzCCm4w z98B4oOWnbp@k3d35;x&{d87fm9XBRJlJ>fj+U5kGh^-Vpw@#}NVC*iey57ngZm;_; z?(wJAEhPnWwOszxHXef8LJl&_rC#3RMjklb!5d!E!*Cxi4UN?Hmjx~){JQ$?ji9<$ z|MI;ldz^42piuavO>sYbR%Hi6bJBUb$VmVLKY?%&-e}0b=ha0nhvw9?Yb5OFDPe~A zz=Ej0aR2H8Y9dW2n7h<}KG7Ibe0BXTR7rh8`ITn1?^#R{hDJQ6HZ$cu3>$v_+wokLJRl)eE^ik>;`Z85j_J(bbwk+tv?h!FD95!7~i zK6E12LOKyBw)YAhn0jS(XW`=S>-dcLI7>#hz(Teo*N^y^q4o8a={|t|F@<7EQ+`%s zLhCo>HLZAQMX7V`h}yGy@2yJxoB%gaQ|wzH3y(lr_8KAjl!_ly#+%bq#;<-4yqdgY z!)BLzSM~f1IX2%%VKQxqPVkC`N9l0&9eQHRK7Sp#TK9joz-fR>Ua=m>s+>oe^SI%v z7^*xGQm4cl)wTWq8^|_8_3+DJl%eCWB(M}jCd*g3rEOI8jRd4fnk|xh|2UH|<@BFt z-Vv=v3H;?%=6V+b;oHS`#0_yEFb9p=g6~jw-q9P8f<$*{plog8HPj{{vGn0&R}zSe zUVrS81a?V5XBthFdr`qatm2JS3cE{C?onzgu2lg=o1OKkYTh?7skn)sdpskD##WQ--L9M?TX(4e=NgE^?KbhhG z;Vo^WH(88@3+cH)eV&yuQbD$B^}~Nr#nMx%o=_JGsUAgeN7xv9@LJHo2Y8K32&e}^ ztz5&fW;puCDNl^tg00cNIw(t80rS7Ep?$k)wm*8C@SHa-PtBIxm8JGT1VFM2L5VQ3 zbSY+clnq8pn!nTHpkAVr(){dxEZDNceZJN5k;mv#&gX6BXr!|UZYZ?Rb;$48E-6uT z7N5(IebJnfZVwHQCy}t-ldis8%!(i`)c3f2v!Vrk6uoXDn67L^PcXFIw)(@vby^~qApbXX_qye`SBPwykreceBX55ji>8X(}ro%akbE^^vxj>>X}eNkw= zwK+vjz{wWFuj9}u?J0JuM!ukw5*@{i)DdyD_*vHnnx_gjG=`$sxUd}(m=2fypvk5& zHkd;a+HQI}FlXm_myCZ7Znz)tVAS7afagJ_9m4#HBC3Re`krK@ZM%t$WzP4pg&>n4 z?(;5?+kC|dGM;qkV><+ z8L%4m)C6ATK`M)@qRU`grQe`)jC?pI`teQN^{hWKL z?u!OGeZfr917~N2-PK9=Ql$AGW_fIRKZOVtF2r0iL7HOgZAUX#a%?@wE5pU)e+j0x zc*@PjRRf@g>^V7tY-y1M6)kqL_=07lekrj&?r~?j^C*#g4vhv*2ZLB5OD-50Ak`-P zDO`;E6UWnFKH(2w_V-afLp!ev0zKCyu16$x@e&<0nTm!az5Kfxfs?Bi)uq1D248OTu*p}Y*2UvbejI?zL|s3A!a~d=UDuNQjv6-Txf})2SpCn)#GoXxrtad zHuD1e=i0P!l>zloB!%xOF`zC6K#speo@Qs?Lx|B0T$dc;gX3!eS>j6Z9rk?QVS>5H zk!#i$4Yujs0g`r$01C>IefZ*&d$2vVf(;om^2vP+2iFJ*&l{%9VR&R7@G$Uh8;5rO zYO5|j^m<7q-mvg~?5oA&mOLO_iw*?~2=!co)g6zGZg;3V(pw)==dvh@T?ADoZAtK` z{PHh1F}uH*liF$s^YJC#|B*LLtWI+h8#AU<C$<2eAF&6Qq4fxmJa<-bVF5uJ*Ccn_+=i}mN|=fq%ToZ z#9^Nay~V3&7dIdeS5@xn{t7u7{$1J*{YXWhq7-L-cL}8$;)Pl#`la;C{!``+TTw9P zBl*;|Mm90yyJvav7c!=!JD_C5xH0k>S0PS5J%TtWftm%@3mD+~M%!K?Zg3`+L}qT? z%E_1z7n>A$DyX;c{}Wb|3q~a5K2?MXfxI+&N3yi&mv6f_S06Y(G)f2*-Pv2+M`~DE zZ9|FYq6Oc3s(UjC4nG!o1Sp-%?e~4%rVHn(J~dySS4&6b4!-6i==XZkuf^Ls%w=Fyx6Fq(cJR0^muzoPK%a4EI7nl%uvRB;8YGi+5%kw2_u zn&CR->L;!QO0>D)@%sSVG03ObmDO9Q=)x8Y8RY~JiAaD6xMsrB4+q5NC7~Kd?_3yQ z*8%CR3PH<>MoX8+UyNBvpSrp~q9`1D&CHinO5ypUEFN^g9_B~0M>h>#&+(u8DBg_j zh%F_p6jh_MnfI_}nt|_=wiFAU#3uVga+Xf4NSM^wd5nbud>Gh)}6?q4mw+`Q)=M&ILTTvBO3s{sZ*60wVt&2lQ(Sz zpVMkP{v@#rHY29d>Ukg6^*~`NPFnee!n1;D>yF*=B!$13doI9K1=VQrv?3qT^C%>M zi!Y2F>ysK~6$=-T@oW|*s8AT*Zhv((uT$mpr%2?k<^b! zMiBCg?*)hU^QZ>GhfLv!M4<8_3Xh5i`NhY4yedlGNcm40k~QKlr_TaVeKkQf&4{n# zwL==#KxVKMsXZ7Un2#hiK~p)Y3=sh5J?cx1+g~-B_tN7V^RviE0k%MXG?jEd9+aqs z`f>?TI!|#TVGeP&?;-M%q`CKn7YNAxqRg6~2Ck;T^Z%Kba(nfRXH&?TraG2DWidty zR;1;VI_??l)&eRV;Fw;%pBgJ_Ezmn+Dbp3t_eDyB%?eze5~T2=&Zo3y1kMzT${h!L z>s>5oUgr)ruKeyh!0;f17W)1GSnGo~rcWIftTkQ^8{}=_1ayvL5z~9I88?ixghEh@ zpCYQNImMH;U*r9y<_j88Y3GXqTB3e9rUX(UdJ9aV#)+CDRgaCgH&4+r=Q3-SnkVqa z(~jY;UK=5a*qh8H`S@#14%n=j8Ux9znhLM3(L1eV#7v(6Vauj87*Q*;^F5h^sV1@D2LCYvLiD8WBR~f8K0m5rJTn=2&pI%VM;0UvTh?d z1Hty0+jVWY@ZKOlx`GlXi5Okv#CYPVSxQ(E;}KLnM17TWJF3QD=!*EfrxCO|CDHA+ zzpJ}VV~O}@5u7GYn?^j9tN;J|(_WiQNC@ZO(t8A5p;NH?=dtgJt}-nB%)={@MP-vH zwuNce3inECZL(KHSzs>6KY5p>!6!oC13{(uwJt5#l7c^m&FzX+lSF&+;cqHm%kdl9 zv52(e;z(i)3GDuNF)>LSNSqss$WRBqw&>Gjapb)e1_#EXpg|G2kw}y6Fy#t--CF9+ zEs2PvwZk`+E>WATqcAumP z4Y)lrn5|Qy2H-l8`xP>nKK1(nDYTpY5MqV|^2az4Q+HCrv4GT*1yduGLp+{+*L?(6zm6^R=)MD|oGE8FLa2gIiub8nd0Et{ zXVWP?!VQtu7ircC|BfG5S3S<)5<|dUj(=2OwCHV6>d@7+;$}!HPj5V#M7%tD=l!Pd zs)86qj@925a$9(z-OD;;e!TN+I&CJU^{VUTeda2OB+fF|lIAUZB@O3C3U05M##E0y z@^3+ol84DAV@dZSs}^v0ux^0g8neV`JGG|S@i3 zzCtI1x9nqS-ByY5@98#Yjx%=4LYCqgzvUW5GS^5w;lsKF_v<`eV(VrnQJG1YkPvgj z()2?nQJjfdSm7?>NJ6GwYA)0wXCY3T3*-z2D1dUog(#tCcn5We#xeosf6`!hwg3f^ z*nbO@{M`60gMB>`p^X_-KGF-=h^)8DX;v^7^n=={_xP?+SN5zeQ_-qmcsL}n)B@Ba zukgJ(6l8o;M4uULMOR390>n(hK$Q9M+B&cQ(9|;sK22E8LR?qiPAp!uoJ=G{g$AHD z!ep`ek;n~4+nAbpTznFKFZBrPxIJ8X_p(_OSEks#aG~mC)BWq)!iaQTtHrGW4z{ z3$lx58nR)ZNt`KwOi!z;hpD160FxB`&m>!ec4yxr;a9VGRqgitdAD5r2m#>iHYUTJ z+Hhv&*b296q+y(6o-W!BeOS0f(8nJH<0dccks<6C(4sXo84zu0{KED*Q%0@t24R(J zYV_FLNz2eObr)|-*jQb8kk%y!B$hK|~tc#9GWliQd;d^FWh@Z5BHMkKz z7J#Pu1#O4k|G~6)USoYXcTxV){fOh{nd7;~JkgrifRF&F*Rrl)P`2f+CgT zAXa2|Jy`gz!2%l~PpXJ%RAw9XzFqtvg=OlxlT`3fZJTnIs9LOlo&bA3dfMI>wd=!8 z^-%{mzQ*ZFC{Igt-ZKqG;hK*IV&haDws5taA4oBV|DDnye0WeJT-hs!Q3>uq72Lbx zz6Sb|1kM6!0&h?f0&e)&pt8V=2$F~~;L2rDoOI*!6OZH@C~@l3I*`<>@6o7^j%oU; zOk(PV4uV*kBbc6HS0Y=P3?!DB7eu{pVb2U*6*m07u$JwCjex9hQ#eb}Qji;T9i)+{dO(c<2p?;Ly5bIyF@HxsG` zo&KntW60q*#lGL!^uk{vM%H5SsRF~jR0EcKQ3!7-Cp#jcl0#1B5vpI15N$>;m0fJ< zo4&P%U;;+14v7)(^I{Y#kTK6<#s@*R^R6VqYQ`e`2H+|`-x->Gd21o6iycsMzl97_ zf%0Lwvk4yrm1%O+yaA-ieY#|Fxoe}2t;4h~DK}7rG{6$I0O4j61Png2>>%62+iH8G zWaxYWOy>@=l^CX7C|!UpF9JDxml^VBGg|r#8)QNXm*sljXnG?Bk}_KS^T|bpVQ^dI z*6L43tMA6@u(Gy_|3h*w=Zf&mx2krX zxX3qme8KJ?DK%C=Pes75=r0-uysPGjRNy9NFnf8FvTdfax#sasQSU;RNRm(d6RPyI7+NAC^?1mmRGh%c_6}m{s-5^HVM2s{=u%YAjQ1H#NVdOPl?J43M zCBvBlM)fSU4_rG{QWw*-}BEEM!VH>u|{qQpbW6|n)L zCQb1w9GQYNiX!$mc@TZ zWeVb?#VOEHWqQ}TGZrHkkfG|uDo%Upx3yxX6=nO`qiqx2pQ+9!Z!=d~vk#J-IjtgV zOz9Mx7nAGN(BDD%mqQ3SARXthJbo(^hpSR$+xhu@>knrQz2 zfqWB`jMsCi<=V~fL8Y7HBT4bznaw(H%91UdBq@q7zO4pj4ajTb8GLqzt#jTDYWZXJ zckt7l1F{ba+JN?XmzcU9DR($8^vGIuD)Q%ZRpn zP5Uo#=V3=Y4?$}O!z0fT{h8kOzb%NnCUaOtJZ9COvsbeJmNOYNQm}7tgF*$q-0Gd& z?Nu?OeMa8?O(gJxSj)CQfI%$Lp;uHV_3LI&)un;BjOI(aEz@RgF6_Y_2w&Dx%*Q<$>+?f%CpZ2bYAt`{MS>-TiAlCE5UM z);7vz#>5(w-#eegyvLy#6fR=i**+)~i1v9#Hhg{8>sr=GrCuucg9Ykj@z{;L} z0~Olv7xZ*-w5NvHMcr%*Acc);DB{RMcBB9QRSMzy?-v^>5-QFM3Rp*sh}8zLxwT?D zbg1I(c?@F@7@h$}`@EwbZlR^TI#(tki~^u^pJcfvowoPkZ@3F7J$F8dpv>aTzI&&< zD50nl`x|=~St`$f0_Ook1SDg|mL^H2C{T|b7p-#s@%C|elFa1#1n8$D5M(~*d%`I? zWcg@9k(&J$U06XgzBPVkuZo4y{#UXT->*ieC2d~I1=e3HVV);+2r{3ikA5O8pvSD8fYs$po^nN+P3k8P=G3|`Yvw- zfG(b$Xne}e?SWhMl6L*Ec6rKJiyISU3I|xWHaTguxEv#%K!YP;zoUhC(2}{WQl8p= zoF*p)<`I|}6Ssd`fG_t{50k>IhC!am4zzq9?n}}n{GBFOFOdBPxKnjdSLX;&Xc;>> zH6;97t`$`cgHj2EhCzjA;8K0)Ja+{@Y8M>vmW1S#;U*|F1FCo{^n{&jw$?F@@L)jb zZ%^bs^?5c}Sn~yUZB;I=fIC{@eNsfZ%2UDfvuDO<{|gcjd*aE8{n0Txkw-nd zOfkrpH*n2+z7?*ea~VIwCV-}a6;D2gHK0)&FpJ7qNS)^U<63Z^gp^?HMv9D4XT&=S zFUb=PZR&CR2Au<+0yPUOseJIsU2O&OMAW1ynK$zD*T$_SeppI9>E=g8NbD_>Ce!2b zyIX4-n?^De>9v96Qc^{t)^pNa%CN7;bs3;j{TbEQl2e8AJ!6Xr6wc3~kMY2O*1Y*GT|~ejuE6_}f9*#b z5QKDE*LI6d)?oW6QzfE->mx7L7E&9a+0lRthS1$N*9oGsSb+c=0vE&qMoqTPH`MrX z2MLH^cqfG%%o0I#FLWbAMs0E~0q8`G&vT*uegJCL%jmrn; zHpD~EtQ?1BI14B#tMsBdS*>#MUz3b#=PQsGA_-rhDM(my{pm+gxIGt$YgP%LU}q6! z8R;PSEIf5}|H)Gsqa#O461wOUn!5f!rV3HZrBBCZ&}L662dOzEucgav?A^5jD*ov= z`o5Ez?Fh-0hJKp?Gb`Qs2i`#aG zyW=Fbtg_d}>s@{Cwb)sW)pqTTO>fk7TzH*jj5Fpq+fyy()^`r+xfg*+zv1C{6dw2H z-`cbDVb#zF7}4%UvwwXBPFdA+IEfwZmvmWnlGerBD{AcLBs#zlXm(vB1H9mS;CDQb z4FIHz-*lX(^lT4sMVFRBcF(COtBZQ-;kXczn_p-M?p~j2FSIW)y!)&tm69(fm~{Mq7+5NLg$Xm1MS23( zwdZ>Cutdw9zbgV~? z^Pi+gw)g4lS8dg|*skvz9aUtmprlFl-aZT8P!^JF)!Pf#!6jWq79~ouQZ&fQ-L{mi z3oix-oQrqa9p7gC;O6>5Am5@mOt(TBej-d)8xoXqZrbko0_@W@4|d1Ze_5pnLeDnF zHaafb4aa3(Xv6O<2AQjm3F1QvUI1t=wQ-U@acx+ZEl_Vp(4c`f^RNWgCmnXz>G3+} z^`?l^J1s6t967FhF*kqn@uks&cWTzQ&1}8_{0Ga!4~wJZSKKFLk}dxVbK&~5)30dM z$s9<~p5c2o3ujesr1R*^tla-yjxvPH5#^G|jGS#HKO-fPw%>D5I3lp}AUOaP%d1fa z=8s@zK*ANR^#n-CJ_AsaI%x7lN&1MrfLV%q&xrE+&+#x%npb28SzLv9_GIr3`Xpb` z1?Ab+3)oEo0yhL&$T4+@nmW%!=Gn>WO&(Ky9dmtbU+5fLr z=NlZ`hG%}Ek$zbIC*;2FQAb8B3zG{yi_!328zC^ z(r$P72Dcr&V;NYj5z`r5W$2=fiuk6}6?5|Wk)MY8$6asNs|S6ic7%Ft$MRV)He$rG z85?PvK|XKH0fPpiwX4BWKTCHNJ@BJJ&5d`?FFCG#HJ%x+p8p8G<3;d*o>!n>?0!8q zX!_(#J?GE)L0J;!A+ZW*y?RotiHN+N+Dhq)Wex_t!RHN`m84O}OvcFbG(+uAY2%8f zf148l))XQmV0f~Hh)dR}D_#pcVIJdVnWbg~ivMS#q>UoDT@l0In7fvk>vg0S8=ExB zL23;cx!7+i_vnZo0DnENPx8E`mLsre8q)#R&R_C|y)o~xHz@DW0mUg{>oiWc_;~?x z_CQ)y+Hd?7K|A>#BEper_NqMO#H!IGimG~g3ua4f%$NjXITWFndd?xKq!QUE44gT$ z{PU^uD+E{%Zlh>O<>P-u@arx)opYsz?NwaAJDctZdq;$CJXpWFZu`ou?06eEqbwG- zLMe8&2gmIx6S_HPOta^DL50u+bLv!P*)9MHQbg46;_NkDNqD^pn_FYQ+MeSQt-8vv89Z0?R|G7J** z01b9u#??+BjYY39Js-cU7Ig(gW-z~l5p@5D`on@J%FFJ5Ht&lH+prc6QKQbEK6s?8 zYvKmj&JzNv*1&)NEe$r(Z{Se?bDrv*jHg5Ybq)^Q=YQEtdSkdj^DnTlEJ94RgKt21 z%;D)OON5jOPnb&yXWpLbJKBY_rQ*%N@F#xP!y~F*oCdvV;S@9tAa&S6>52Y7(k?+K z3t6uGM%s(=rqEwKye7}*)vk3Cz?E#0Zt{?--slwuFq1wN!OW#$t)**#{A3z2bb8Q^ z=7A`(q@XzhH6x6u#9;0;-~7I%p~hAEyxQu>mqES-9&;kI3O;}qfNBm(xEzBgrwLf2 zMhmkirGh^Xffs4a4ysybER@!An-q37vG5nV_@tjNmc`hW1yr}LB>VB=~BHwcGJBbVZ(;X^XAUIavb)uIZ(?DQllQdv6 z(!!o!*x~n})Co-P#YZv1e^Gz8RIDs7eg~3lf_6EjfgE`^dwc8(qgHLAPJkA#dahn9 z8X*`{JtM}qA3D53FdUepb5uJcRcOv|%RIb=3n9o*MCU2ybew04^=NvNRa~^TJvXpw zptTKKR1c%;!f785@$452Si?*Dlt=?+X{iGAh9BH1&f4pACh4+mPUHfkzXs$42X+#D`9IOza%g@|JB2^j5{GMTxZw`_Kj62s<-FO&=MtDG?KKJMUH^#D$CY3v3JhX5~um}AyboF`)IfAVbf zzuA%YQQ~6$ec`sTBxXLts0O6>YyoFl2y z*p?V%;UrJt3yR_Sc-WTvrRWp%+3>gg)B}&zqQn?5g`OscIT%0J9sS0<>Sc zcX2cH6g?RK5{%dTNQGPm9YPxMa!{;CM3=GVVti0}Er7*^R{#*twBTSE#PjS@oCIV$ zo%fz-X{A^W3Lr-P3cT|O0LQl6z_>vHPnd=9@2|zANdf6`Q#|&pM)KatuJ}zI19a5d zbOm-k0B}-#nNV!v0g_vnGBd{Wc0&o}Ui`94K>}o8x;RpX63=B;I#;W;sS zg#trxB*7L%DI!}{!1c^Tpyh&rz>PB`bNV(`7gf{dOVI3=Q5HRnOaR zkzn&u(ZD}~hr7Xv%!pLvyBLrPAd{dN<&ArP(#C5Tb3to%U3jVpvrDHO51IMA4&gyt z2c2XVQ{CLy{1?XZ7VWxdsV@Ytv5h;IxORo2Ud^H7a=X@rPQlmZU{_UUn1MlfnrHmP z;}RJq<-2n1hPt*wygT|EES(?U1=O4!|9ddJ;5kAGEPLv>&Lg_{8r1~ zG_Lp~Qq?%9%Mzgnr4FU*50$%k&cwT49K889{Ti}=9AUXwypXvD|L~=IPmdr7I69OUUZ+20_sSMe;tm$t z_K3J0I+v%Au^g{VhGC9^0CyH4%BJm)lw(~lx>T?`G6liGingPj_jDx#Fe7Q0k<=yX zSdw9A`m01>RG$TCh+X58c?N>`EcLc$HTAn3^EOX|$9wVV{nMZLd{*t}r7bp_G!S8Z zf3EaNym_zU{>?+0iGg9y+&jG-S0f34OVNG9RUS_A-jkam6QK4aj>AICxhgD=ID;JXg%F!@Cs=jqGn;Y5W(Rfy=j+pQK=KY~^;mbWp3Ht|+9`y19 zXN|u>>(Dw{1A_g_eM`05mIrhq3!H4R=5L$55W5R;Ut%{Gy-SHz znRxGvgtjx6;s7}OrY9~|t%(vy_)>lWDY8XZ7aggNzAxF4-B5p&A$%E6buOI5famTd zW%V*5?tY#jgZ0%SDFLYpUx~rKc40%$FN^L-umk)ZXJb!DPq`QXeu7&5P$FnGMwsr# zJE+d)bH%d~NZUQc6%9l`1g*?&uHdq?7<$-H2C_f)kz>Q2yrjclvdnywp0 z#NNt1d|EooHf2UyE0a$PTIrh;4H#8X1c@}>nkWu7Gt6$*JVUHA-1?{8qdsK%1NT*H zTlc}6lyVSNrBH9rjfsssuP#*9l|bd5rt2%eej*3nn`{jql_L<3*_gIqppq_*qeYzk zCAdh-MNlzhp4dey!|6#2lE-`F)%F3Nz^Zt$aD_>(Puzh>r~%!QVO$Qib$6+q{0)ubB>XC4_9SYJXHDVYECZ=E4! z)!WS=7UBiwA)0uZrvP7tyu%9b_q{x8W9pdJw#5LBFz?G_J7*p;;4%m>Y|k$zcon$! z|7Cb3!cQnG&p@T$-^ECpL^UdlC+S>YtlQ$>T5QLAj_#{0fvy+kaCA+5bE)}qqUm=T z502QH7SEpfXj`T~MAtUXaV53EwgG{7G06O_@Cz$KDTn#Vg39UJ@q*KG!WAIq|7NkY zB9+uM0J%)YZ*N|rP@!f5+KL9QN_+~SkgK@;w5ma?)8Qj?Z_~+M7)0l_VXEg7t9w^G zyTY|tVb#WWGWe$IBI9hw-$%ghB1zQagv4zv@W-S(YmCL08kd(My?E2KkgWOZHI@M$ z3oIjj34_*CTG(-Ol`=KJ?rvl__-8!t6@0&GlqpP!z>uMtwSy|plWajQXPomI&lZpK zRaaYA3>sEWiDjcb$>RaWccM(zWypwtqq7meQevcWu4r7ZA7$RN8N1 z9ea^D?x(D*E$iJ~zK0uo#9Qy_O`;D}Z^J?JlfAg~sqR}OiLtQA@Qe*9@Lr~oVqYf3 zW>!PoNvs7HJrFCZgV(<@d&);l4HEhOH->uZzeM;$aUy*#OrI%ti!CQxuXG@~uH_@k z3n`0ITm^giv^ff>g*tsR^bO6Vl)-^rJ;`NUEnMK(X6%6Zf|g)Vsq6<+UJZ8$FN6Q9D*Pg-3g)#l zPT4xm`pM(F+lrLV2w7cnJ+St%_1R%ZsN5(C-M7JLWOG+q54K! zMt0GUQ5P1Qlt`@A%0>==1Kuz{l(PA<=ijjM`dZL3i2l|Q;a@eN|Ib)j3_)4G8jk*& z9!{ilz_@I$wwtJ;{QNe$wADptn?-B>kamMZK}Ciz`qe4QPDKdno##&Lr%>87Uq~t( z&?)Ek;)__iw>4Ry2X1zqgclE+;?oa$P#b2k0tU?t%_Af*`mmhyni4iZn{=#qjZpXr zq@^iS)V>V`3Y);=UWc)IXwif_gqklT~R zM`_$zR-`jmNx$*=w=wt`tC2W%O!d|Y+k3Zngj@eEnc9HtB`XZ&8*}sZEkGEM*WLO1 zylOd_3UEU6NP^+BF+k!c|CgD~UI$B~M$*wMDM;(BOLrtHHmiD7rVEQt-aH zzeL-wYn97C3lD24ucpA^2IG)wh|Jo5a!BI zXosra;lqome^Ots--G{8gjaI8b~UaMWI$i18E#Jjye^>ZT!1(2g6+|d0nBtjGvXkc z_Yl=l%ISyCEZ*G$n1OCX_=!cbqeG5mKG+EbnphcJy|jHjdm?kcRrbvgDrcVuK+|i_ zTrvg(2UVlu6*Vux)xbj;uQfm+p5xJq-b3;W1a zP+L&=_5xrwpDbi)1fX-X4dB;>l`2>fTGsC+(k%-?S9OE0iAso;aHSWty@rOsYP2ws z>S*j+nyK2%bvWQ(?@Km=ksR7hf{^8#hz1Mhen|*5yhCFGJ)gD$J@5TveM)Gz(1#>M z^XdSgMHL6y|JukKlpoy#rh^Ey1(^bn>&prV@#aQo6prNTiDh&WP^^YWj&pItJ zM_fSi^uz31nyZ*3Rmz&iE=NI_>kVF{Rw@t=;RlxFKZ`!z9YQ$@5JZ8OnMSy^h zPJ`p<-J>_X9oLg3SW*7J>m0rM^bqFH}k? zy%+M=i`VSFDMUd(fQ;~}Gm}cd_mc7Mk>11}z#rYO1$Bt!Fp%oEz@ct=v^fLOI_EUD zv^#E_!=(rn;6g1xWO;#CNqOh>f5B_ok^dZ2<{9yhRZl=Sq6h^g^l1?5DG0s8LM=Hj zHc+4CaO`dF{PE#@3uWqn#XOYIY`jgRq)Ro*&sE!L{iW(Ptz|IB>295CmywUG6cj+M z93p_12QLk$Io=3dCre zZ5J8O34rF3Rs37)yosn;yF zLC0E~fDOug^W)@VyGH>*JkJ@)^btut!hqOjKvef{lEXM316TesyuY2nYr*tEr3dL^ z#HzPt?<*+LL;p^TB@L&Bu0dHnPVs|c5%jkdd^uj~`8g!3@1{uT7;~j-STSiEb)PTYGqXG}Et=!opm-4Qq=1 z-qfpQVt4qz4&z?`(mw036}dbB;c z8|k7(D;*2W)}p-?XBPgmNiw!I?w7TX{o`l2ryr-z2?Z1%UuEWdie}h7B8Ym((erWV z$A2CYC?%BJTk6cq_$ugim6#F3eyC9NWs`kX_a|Rs=0Bu=KlOsuv`vKqf+1W|e71Vy8N9PM0D{+aEo1^)1KgF<0UDP(69#{rF}X>FuvJ)n9m?rO6fp$dSh`I`ySpNd57dNucp_S#V1R1qT%1N znrIT$6M}~xX;=@%?gduh?z$R0Bws$CvkTXU33mDxzYr^Wz#~u&+nj?2O7#v?y1CwM zNDveAiamW;gz=SNhV=IO0r6iUuezi^jfoUqMR4<6N!sbZrTRGXt8Ctn*YBK$`f~a3 zciX+nayv}ZYVDCg{)*!+9JqI|2E#{!~v`m&*>t1mFGdINFsCAE}bgiek(RQA_3id<0f6 z2E4d65kZJ$7f(*IR8W~L#?b-_^eGvhY4*`))Nt{yn?N?yIbaNObv*e1mq<`cL@kDe zG?LJ=a}S{S=xfMi>TE%9jkc!-*<~gnv5()VAv9ateE)gg56^~>F+M^QSO1pO^-Erx zUJb`R{3a{t45_Vu?EflL>D~ImI`_;oaO?fev;mVt`Od9RN%I5;(>XH;9|$@2biHoA z65H)*Mi2Y9%!4a&zjWDb6s|w?6Dz1rf&`Wp;Bq_w{%D2>A!^Z>yw=J6IC2pY-6^+w z5tqzl_p6zr_tm$>7~I5flKml|S>|1;1__}tHKbIAF8~LayN3w`n7~G&pYv#NTi|wd zIeWSMAJ%%lfyU6Kz^~rH6HJOJE`T^SsuH8Q>$P!xwi?3$ZD&*MGn->*8wzFGS!fw9 z7EyP;47Y!=D;BYaviEMj+~XlCooSVHrzE0Kyw{3doBb`hZqhJcRJvgi z8k?h*YsJd$xqIgm?=;D+_8@)Cm+ZXgfV0(p`L7A{|Jq!5B;>)Q~VOF zxb6i1ft+)z_pe8_xhc;UoGQXI+4O_~7BnRvd0*cY4{@*Z|8acV(3*?Lk@xW(n4halnc%h|5VqShIM5Oai0Z?tu^I{v` z2r9dVl8@am&UQI?E2Fm#j`ux8-;>^A%4c2)@#_5}|_&yphdyDkbjcB0?rr`5F;c{GfO$xIjmcAwdfC4WQ%Bhbgrp)pdqqC2-*e&&L%` zO(;q+zxsH8>5z*j-(Ur@Qc;lwPhRmx#g(u|=aM#a+AByoaZNTD(b6j^sQX1(Tvx}? z6_-QUz-p!1_yY$gXH39wdSui7e%+&Gi2g zKr$a74_d|aZ~CJkTMF9#e%ss!iE~JWw*EtHsG)G@O9wnQ@h4~J>6l{5g&pFXSXPSz zxZN>ebapsB(8h5_!O2C$U6Z_9q4y)tlb3PF2rAHI>>&41wL>zQ3?z~)?07_4`rM(8 z;uXK6O6x;LA>m!{$5HHq{u^s{Xmu|sxtp8p%2gUwEe}02Utpx@7sO0`=O1_!jDV%X z`LV3~=b`rQyxW*E%-!$xBLd^d#JitVHxNEaii0goJWQS)tQ^=2o zB$ckiJjILs@0IA}<^ee224# zUF_+K6q_6JF3`Q=-vRQyT+~y!&3g@#S80;-c++I4CXW8{E{E`+iof_(594djrJU>1 z%T~!xEyYcc!q-y0DR`Z|Hvi|Cq?^2^M)%A^?>Rkw8{LO!u?*L)EBrb`UIzV)U;KRP zGY@COli|D!ixwlJ0?C0d~d-LK($gpM}NSO9MJ#;Z1ucJsz6rTWqW({k`XVOU2=T5qnDULf%c-zdY|B!Vf+SY}OmHNX~=ku`J4RS=hTh&pvX!Iy>ib8f4Fw69?@7 zjmL$q^UQ;d9(>>%^GU9^fpoa5g!dS^F*6q@+c=$9XfsH8Vo6eo?F zf3#lg?fjvx8*;WrwaoQg#pTZF6UNFD1`1Zu^g=}4(6 zyFVI~m=R5R2U>czK6F0nBB){Ah$}*D7@1NjszI}b>p=U#oS)NF>7=FY6@QONb%Y@m z4s$zkriCn>1;SMw_2o~uK81F;akbrHxn&s$-w{L{zsc<)?t_b!bktWX(m!CMDZA=y z>fr=5y5}XwJZtHHNB8&-E7c1Vy7S-1d0SUs%~qrPq3VEBUfnx{ z6AxM_cCnub&;aEDA-58Clh;fJ=zB5SR3>@=8qI=)kEc~LUtu5h>|?j{E?j&veL3 z48bep#<0o;(z;?#HGd-NQiWdLxH3h?dt9&sA-ZkEO?jrY?vw2Lt}~Ho;CojL^spGK z^EiBS?B2s*tZj~i>|#W?mAl8HFxxoad{5>3`hyv}^%Tb5#s{9GovlyX>lndD5kE@X z1vh;}?g^KD>I$431P$SXRx)XxJz&Kb9|!#YzJ7J*7H+n3L!%MwMRx#ZKe<@Y_ieo* z>z`?TK3w8aTbQ%VM7E3jg`@-73sn`cDmX7J=Mhe-LXWjE`QKY!FVuY}5`ZQ%#vIeo z&Qy_WD*=2aCFDEMe(ytFj=xQTvSyY1t`Y))P;rCGAlMXr5h`id@r(%?{NC3B@a=@m zuju&x218O$LT;M7nP^JAuDsyk#*spb?E9j;T3N;xDW}t&>Zw$!4uGLRFBef#n5_cR zg5oF@ZK7y4qgK!Lfw`rh9>xv$T{NorD0)NeA2&D1d>btTnS?In(eN6;xKOJlp;N8k z#~Nr6`jc|@;ePrDfa_q=y5GpXQDu1ivtgw>G&U^E4H)wkg|ozYg%&AHaeez{{@#aU zyf*8$-&6uX(tbabt*7zs>Fi0O6H{Cl{+7%v^<+alJ=A7X>tPZ_j?+K`8!KPF^NrVA zSmS5XjoB2GXigQTW7wZW{WAI%dJ{`CjW5-TBn^y z80Op`UYRbh^u8++-AGdJg7j6`0sgWF3AqzuQ!lyiC#4!e@xQu9r$qXD_niC^`n~W zI#Qc%(taAC8N8nWccX&!^R6LC@Jv^pPG?a@!~3b7nhR9)VTR+5$0853Qx#Z{qK9wwOUpaB7QN6wkQK ze4UG%Z_Y`yD1Q_=4;;K{^-*Wsn>2sEbQ05@jFgsrIhFGjKM5Wq{CG0t%F}6J12y(! zrZcP;o=mn8)ezIa6T+?p*JRV^{c>qUb;ybaQ-bKPmG`HgnrsPu?Vb-bhFlA*x4Hw! zb_S&9@0)hIPFTB$SpzspLtZ`BMq2PUXdZ2UStBd?$fEY2#VCR;2KbKem$veDv$rT# zMb83fL50a&iIhy|sm2!UhMekdqw@oq9u0o-zdRVim!khsb${XsX-@d1g6yu98LgO` zgv6e^qEHY;r^^|>Cyez}gD176zvY$qoiYcw_}HR&Mq@(>P2do;f&sNRpyY%;aK)P> z7|IGL05s6Fvt@hI9pMxFB9fxwLC&8U7$9%kjQJA>%>lP|qQ20NhurI6ZRBI{$YXOl zZ4-HalbY|z?K`I>PhXV1qdMnsL}amZEq)l9(YY_ZL1C&fY?43AU!Fx-pnTK5IyOt5 zQkT?A8}Os7yU9V^^wm^BLRj%r)&_}0!thCrj^w$F)Q6sFL(dL`8E+7yZ1F`tNc2+o zixI2npv2;d7x3IgV)w=y$(nG1)rfej(iRZ9tz11$w3lIyq>PKx@4h$M>*CfPX>?~@M@aacUR;MaJhP)fe`cQ+UqPrUACZOHyk&Mzy9tr==a>f>91R;Z29|u zrMgpd#h3sx)0|Q>hTGoC04d&WjRd`K3Vu!7oI9BKEV{mO1E#`8f+ejIfA}(D^W~=+ zu1>J1Q&nrgF_wxu+l6Z@(?2uTFq2N=IsNY#O$_eSKa+|ggI9{&4a5qWCiH6ef4 zAr@CS{^_9Hw-n+(mv)T{|H6((UKj;Q<3a^G{Uh}Mkf9w0NKGYdxT#`aLwYquwi=$1 z@41A~m!6Sz)`1xL3eb*-`$sR4U$hw)deMiDP?;~LYWY6|pEPpdH77M@1g^)4UGeMm zzP1Il?L$_!!A=>rq(g*PMq*E9E|Oj|Nz}0cqNIupT;q8JYm5%)3O!ih>y%RY)g+-K zTDD^VfDn6yQN8`wf0PpeJ04drpegul&3;Inr+ktoV1LtJ^XvybY4Z5f3~Nr2zsBDw z2w|k0fslhNj={@QhRAyPx8l5V_+7XeHzB=e{U>xaQ}hm)X2nnD;^NUm*8HF)anWs@ zw=+*+6Fu3~Yr{p^DrKxcBq7IE3b(k?E=TX??hs;|R!9Dwyf>?OwCh4HtDCa;d0D)+ z1a1%8!?A`3v)wN`>DRN(~8~Rke&JBLeuz5mSS-GF`{i+h8fh`mV_XZ+7BL5 zorLl{GQ9%3L$-#FSs|EClb7gLRc!8YTKU)qpSddtX3w*33p*}}d&WDPjK6-BTXJEH zZssUyW^3)2&}yNYCo6;Q(~{;}9k|di1kSU$CANNWQ zQ^e)$-BlCIW_NsC2(Ka|$+F2N^7ZcR^JVj}`+Zt1{f++2e$hZxFoV3HXsE*lZ5ro2${s7vR5i zD}Kta&MQkOT0^jsMA$kCee_B{9%Hzw9};t2Yvz;66R#-2cBZptL0JKy#C1_r*Y%%5 zzn|jUBzR|pq{v^G$sI$fqld8e;eaBoHmYSERR|2JW6#O@c?8ZE@@QskQmT3jtWX~B znRY;Vq57aA8CU|0oV-@uiE;E=TW;rRxJmG}=Rc1( zqB{5Fs^^q3Vp4PWc=sDn;~kZP`_NiG&!K`~rY`*r>_U%zp3VcU!M zm14~+-qkAEX$zzcvqtQ-MeNBgURu5Uy9BC%LNN7g*Y^@x4d2~c>k&=CYZ9A`I$30; zIGB7@DLaObAW^58;w2jRAL(AvWyaLJQO?MY0)V)Et(t*Fqdc<)y2>~0m}h$+z_vOb zg7F=LV;A7mg>ydGZ^)PJid5p5pO;n2iHXKba84jAUJrQ3i9S*#S&y?kMKPDY^y3hm zO+3=ue$;`;e*0+cHNgzMjd&N}@strkpGU29dY#hXNs$fof|(fA*%m7ch<%Qgc!8Q5 z6_SZd)>yD-khtt_L6T)GwRLUWYr`(n;+EZZWp^MOf~;duzu+IE_!q%n_n^(mEXpq8 z54$>b^JSA?Ehq*e44YGccHiF<+q;>}>tZG@k?kq5L!2TGN_&@XpJ1KrGSttEV*cdZ zYef|7-`d4*BXLUtZ1`#CZmdnuhE2rkEEGG7)Y?E$zf8j9{?hY#@>sd(L-6s80(YhF zmp`!n`{FM`wqOPRrqfUfs&@>L7Yl{{wX6*0-pn56Q~0K_bGz621&$TnP5K;jD*Fh6V;1=GxTE#$ z5R^Ydr$ABXhU)65I@OZqLmCM0oe=#I{mFjo`O)ct16fm*Uqsb3FcDsQ+KuCxF&yTf zOv=iY-SMOB(jz#Y~hc>z#$lkqaz090YoFj@qld?dQ93mD+LWuvb8(?I2X}U1jV3 zMrn+71!uy8 zcYThMn64Gpm0UIY7(j|+a%ozhiaRl|yqqs*eT_ZdV)#vDE4Kka{)V`yxMKotH18-p zLjXJ-zxqgeQefkA%mC9l*n4%rVBU!QmJohW$x#!TjW;G(%&LCS^UA1(zI3z%9CRvx zeoVj#FOifj>OuKeNTS#M*;cmlOMbr%4xW$OI+5*1JXXkm zr4C!a{Cxl5K|Cnx)+I~9jm@Cc9o6U$SO_N9U$Ig$4twwT0vxJqG+%RoJQ)?UGrbuX zoz6ZSn!F0mQ>4e= zSw0lB5%=xlYC{1SAVEswYr>grI8i@~98Ni2YUk%@PWjhLh2JC?<_%ZBOuAQc8%fu> zE3{`4{7PIM?dMSRj0qN(BHu7|hQf73j@C5w}|<*rDT=sJ+k4?eI!*_Z~sS4Ki> z`$cZ3jtHpSCfb*IVM5U`0CTtKDbouYx%bxsS*DXrwbA z4cc||6#zeU;)lQX&Qw)k@Ap}QNAkp+)&#BNjyT*@@54Z&nCup&-Z99fQFGbM@DV=I zGjtNLffu2Nt~?`P3`74p3UP^wGZ%wn8N5|{{?!Mkq1!Py<_zpaPV29L?`C4ElULbP zSO>*tysb_jn9TGZ%TaYP#Ch~L=WaARl};7M$k(NOwOF&ZedC*ROuG<^io2lDCzvg>cKNNKZ7ghL64=zh{3B)SI)I=`wbkP%(8 zi|y3IxO9S2$ZIY;SD~J)bIsp@9S#hqudPZ0E_2LFvNZpwD6(z;{LaHI<05+NPOOBf zQq%U0*9i&KwwuO&jxhrm+>iU0vhu!vZ%|PT9MgR>uK}~&#B5DM@1B!(a|^TaJNhiQ z^O<&-L4AW_tK4;d@U?Wi=K(GZIs?B*P+Rc9sy7oDg@@egyB{Gne8qnYL&z(ATvc?>^i5I&b2b^-Dy{FT(H6&*!3P z%Y0RLNDn!C=Z3ezmi;`9@LhMT)%n$;ieHU9Yj5*2eBFhl&Llj`DL=04x({X*1E#664RM5J*qwNnKdga=}66HE8q651%S4=OUfsC8Uwye}|=w@F(xk&++ z$;@rwd~r7Fgdy@4m37JpRL@0h3_ABo48By&{^mSSv5*@jyBl7+cSaC5o5Y5Xk5n6} zQ=5vCu=jps2QSUsN4FQF<)v_icijCPtFG%6KoNwu%dfC~cZzwyq?|~ls84*$vxTbf z(N|}GClgTp9o@@_=CzvuZ{sB|q6wjnVZMoq>EKw?8e$6T-iT zT*#o|2heL{{0{PV6&WWGigA;bv<;!4J=t$TI6;2V z4?SmB6uylOJwwdjMwKY+xVJ0r>g^O{=}oR+A5l<6<(1*1MW((X7EPAKdT8v7LJj{7 zaBRs037lJmim$98sD8>*&~?P~C9s)Ov*sqFM@9dqgDLNq^W~VveuPgjn?2D4`AZe_ zamUh6)8)h^t+n&`a!p_%bxHnm1zDa}FDh&t6=s6(4KXlcXNPc7v^xo5=PlIa6uYB`VQ))y8j?G ztq)EDSHqL)5XndH8n^JkY?n4#-On)FeI2D{ilHw z#H>+LlbhdwbhX5yzY@b1Apg!nyP!Tw+ap(eQ31pIPMmf-at)tmNp0UH<%4LqP1++C zoh3hIp{;vYh0S)l?h78r%%8-2UP^7;?YY7S>P<#ORzt&cacNN8IR0uFBtYsxSs?r~ zJ=WD&@qh|z)*-X!0!j+(iiy8YHH$R2Ub^!l#({n#kZ&yS6nvW+7QjBI`2C9I9C61l zE9JD8lWFYNTabQLkc*8uI=7t0!AKMTI8K^qmPVrbPF$XEGphPBZAI+85xHlqB2rJc z|36E!;0h4$v1*x+<7v4R*^hXwfh3)>nJsWOd4(R#oGoPu%|S>cmjC9e`&<_?ynYWI zG+r*$TA+Y<^_SMRK8)}U{f-X~zVCUL+Pa|UgCA_w9gqh=pt}*FH3fjvF+C@@c=F}h z5Is{Y0RZES?Y|J(FA3n@nd@W)*Z?&NT@m)2B---$=rK05eP+Jhdo_M?nm zv2cbzGH(5H`0CnYG;UG8PXZb=>U`vz_4SJ;3uMg8yMO67@kQs_TeWp3JiASAia^7O zl4BWu&=>cT4PS=K!~rUwZEZwBom~x_U3=d<@NEo<7k%(ndK$FyI)JJyUV~8+jVgd9 z#C>CfjDe)@8C`m;HIHq+1`^h4KSxsdvq?Ec9(?!nkDcq-PPF$brJR83 zi@ei$Y&MVM3j8Z^a?e|fKJ~luOQxMLRMw4UH0vULZ`0{Sz$L-izB!El480h~?fxUH zAjMFO6=Z)=jcHk8*j(CNtTEx!hGTOUWvgX3X|MI+&M^)+)t>3h?*j0Zci)%Hi*32D z&Jlj_x@gh zNG-!n_wtyct#l1o6*^{LVMu94lmhED2rrR;FA{CSU)mdvegQc;)=$+eiByNFtljbd zGUpl}M_tm&DMKC$W6P56vulpm7ZOaSA3t+5b*FULeAoK%;iG`B#^D^PvS9&maI0-h z5#+aoB;+-qPn7X((_=WH$u`rDcO_LjM{qcB_9Ct67gpFHB4m6d3IAE3nCCglak(L80bgUbp>Q7$RiQQ5?CahIy02071g(zx2TUaDwd@g*6VH|7~m0WAFpDWOLz(#`@TCZFZ_aexI_yO&%3@Rn`E1IGI20 zt;TX6Zh3I=gyWuapKq_sRT_(}m2*G4=-J)bn5%?-k6kfEA(mNc`|zRX9M|xFJ>DnJ znk)YwQ*Zsyg!_MgZ!}7Ww3IZ$5F|znq?ATLy5&VlH#i0c9ioKN(jY0FqfwCV91@Q1 z-q`N({(OJ9{{*&iUC--0&v_ggjoodUshQ-Vs%zUe&jlHy(6nRtobGdmIlG-Y)BOq zuUx_nZUT**`51R%>(E%~$WB{PYT*S%R^> z>czF5hTL_uT%VpZ!>R&%5vn2;ZY90{L~!dHcQQbYd5gnwWBZSB89wS!8ZziDMMB$G zqOlTeQa%1Y&haDSjqw`!tN36aG3oQha-nI)XBlCe9fUPUG-*|UApAXYE;JKX1+`0StNI0WDE05U+ zCEX33h!<0YxpmfYtJKqEn?SdmX`oG#4EUgIe}78z$G*JiY2d(^7yEnhu#s6YR)BA} z73L%jHhtHX(Kx+nZR!sKoMq_n)n`T42d;+epIJ^uRs>KbtUbrwH>lPXeKJ&jHp~Js z@G4Xc47oA-7Qbrk_oofv+`)L8_gfvm2R!BeXW-`V4Di6`gREIKTdbR%yhk+l(`~D{k%-jhBWu*Yq1__8ubmUNk2~g|4kUO?n|(wu#O?1$sPCA` ztsI5keP~Cg8})BFa6O*qA62cz_}Ok{t2>vQdXlQ>trTP|0;}{Dsr_vn#5R5g*dQsH zwe6Rm#eMkZMESq+%Tiw!2yzz?bbc=Br%TaDm*yx1^t3#3qN8$q17M9oSC0PsDhqrg zi`%P0zpC&^lPxh-s|y+|haU2UuJLso%XX~GTAkqFBge6Mrxw_d3gX-4zCxY~3^$K)a>(<6e0}BnO0gH_b=aTo#SJw3 z$qk%pTE2765K7hm8$7>--wmF^z5L2=N2jRAPreHYNVcp6(w#H6-r{AbCx|4!IBasA z7psT`ahy4^0)6}SZC;6p3K>SeQ@u$UHAk|4`I<(#fmr}glX^P);aP-)eKPjB_ls2V z(RE3GNM=BpGXe4b?vUwWuHWJ4g}SXYK(`_%>s^IIOVz$*Sw9wq+l2!ewx3Kx8R%;% zZh>|%)yekHO=;KW(p2cTMXM5@@N-qK26@YxtW&86oB|b>)$6VM)r3&RPF!(cTv+G4 z6EV6^1btbn*j8e1^^2f>Vde=q#2i`O>k=K*-kkTQ%w}zA}DV|hM-)v@A6Tdf1L7Qe<*_i_EQYD?C0%9^W!(^tcyLIe@lV7&|6$odvGT%P-hvzvq`4Z z-Vg%YzpKGQ947>z&7dCc8LYxSyd$|1=`SU3>@9_)(`ALW1UFstc26}IfTO&!ea(3#(zJvA;l-{ z;!#9KPH1T5|Jut67Vic%6jY9^UeBhUn#PNq)EZ;|A`*U9G&k9D)dNxljbB1_8zjyLQ(}dUS$$O_;uf?BY zPt4pw`ns%i7Wn;eSs}AWzDJ*JMXnqV%^cCRmhOHX`NyLzBv;MH9s_(Qlqp{kdeLGS zO{e$MM>*~-+eQAjf=X)1a{o}1BJE2#r0C{+_oy~>gM3uxk`Le(+hDbvCoW6 zk}@>SX^h%dmIY9uIf?-iEkKv^^pf$^uH)9iNS(>wz`v$Pt;|@)5Z*sqqw!PZ9r70< zRF8RGw9+FJ=v6jAte5f?_U9u39j6VB^1G(kp*{v{v@r~WgkjWoebAzt5=7&eM)>VM zc4Ii`{4_Mi*y0ig!ao3TXOteGJKBa zHb7N;tHJ9eQ`&Rl*Q?wU&7WJ~sf4K`g9d=61ZW~gY7im-I6fr8Cu3Wot)ISe|8>Qu z>X?e#0?A8&U!zfo+WB~xP_z&+Ta*KaLxb=;JQ}g0fINz~lE$03(#8FFK6sWtqM>{e zp+~3~mKW89VEW>_P@$oyzRqTG&A90?&OLzZ*>)>SYLzEQb3r;E?EqdOWSJ?oXoJ4f zsyQp3h_!nm(c2{;LCAGQ6S4E-J_iXH1ZWGH_H)Dp~TAo=f+0Z1{oYpa78_fNyF zA$CtcPS`cv&xuom->y*OKC4Yu=Wfe~UOp6Li-K!3_iKaP^~&WI7~>W6-#tdaOpw%z z7w(32(A<+mujo1UU4awpcx)+ifnM~Yc!`>-Eaf1&S?qqT!^bFIPfl%fU45^-L>1b; zPGFbJ?BpSmDh0;>-G?!vkffLZ|B;^b2Zt73sQRC;T+87hxlh8EXc>13)H+jFGrBJd zfQIX2_;9)7Xx%z{`=+GU$1@+1ev4kwS0fo|As2OA?d*1P^Z^8OPiw#e9E_=kq+x`s zIv;Qqr)?X^9WVs@Gp&8E6m~6&-K?roySQIwzq-2{oG3y`8+A78vFkRSbY{IHd-DCx z6mC`H?-bGpucv8D9*J=En!8L1=pY!N+gBM0qY7uJtCV^Bz9}blvE9!x%n)ndy3tHA z^b)53CBNQa!Erm27_)DCy($2ZglEIqq&85C9b-s-cl7SYoZ5(^uZHKubil7ldSY7G zQ1|u8!Bb0$8QUP}zl)WhnB(<iLhx4d66G6sVuU&#BO`icRlOCPqx9@!> zE1jE{SZC+Mo80h9^>cF(1KJ^R6<#>A;IbP8-2*|VFEF7Er2|+l)g-m>$;MHx62Chk z^A|k=D*p~e>tQS3r9A17JtFGi|GYeMi$i*0NcXG6Oqj-Pa}5rR?SvI9jP&A6uZ~Mv zBYNw|D4`z4ju<2?;|(%Z%dj7TSFp!@>>917{t~xuy=CmEm!J3hAZLd^uHvt?K|R14 zgvG>V*cwZwzomSd7cPwoneAZkehJcEcxOV^QIVq58~yA2rtT|!e|P8is5P)q$l!+* z`}II+U|`N!dl;!+7NEcLQ=aU&)z(T}y>* z;#?fwR35hc#qCdE2J$Nbx44qCD+KD?8hajKq>K*Ok+kNge9sExBuG^svdl&U&|Jzi83}#1a-ozW%m|RQM)z~{hKsJxYq{@e0oB1xY z1$|M!Zk&4>a~9w%UG4p1AG*)oDp^ zTe_|A{AYM)DOJfE=$XjS%naGeqY=~fnyY#H>YJiKu=))*M^4&^|2_#jPQhhHDB#>Q zGuI}Kj%~;RCb+gF(%;unGJv&5#!?VJBAWxT_~!b2sQnIB!7_G>q)SE0 zt;zhUUBc3&JIZM1MW6lzE531zl`P)gDQ77Y?Dim<8>&hjM%M2fbJ~9vEVBT5} z@$&(ne(ju?Nh%Gui+(R3Uf-eQOLkREIw)7rmoA|HFaOz-u;F>6FE*voV1Lr-CTW}7 zRwuxdu{CUp(&NYN(|LdW{hT1QcG=>g!Qg{>80%b}!AkSan0cvSB&%=spq(%q5n^;q z=HD9P-DFV(@13x6rg|r=@C4h#_io~W-Cvyw_!G-~$UI3vm25mrD7DSP+Wl!DQEBij z1%m@N9gwC$utuQB_=zrTM~iIh4EfJt%v+77)r(m;KAFy(Pi>4 z0RM`Lp9Ut_ag6d&k1f_?JU^G=-*!-%ABKC*iH^i<)%FV0rBh z!)jv8VwZW$^!N3}9cw;W>r7e8U_W}pRIp;NLBicK=2K(e#2dKdY*gu}Ti-kP#PhAO zFPO!#y4W%5yk}jza+gjO9VNQ2Zg*uFm0Kpkak+_W19_}LdUURKQq!FFRy{epo3rgh z$!+DR&DoN>5sO$-=gm@#F>z;5llocX8x26ZUhW5=5$`84)WA`szfK{56|XNo^pfeD zK^Szk+y)^{yMro$veT}+usuQuS)V?&KAo$=>{Nxujj$VqUij@+G-6(~uZT8%UpW|U zdeCFS`02pVzGFcZ{P-z1n>eQ{KsEPZnu}_Y;99H zvb%BLdq{KD!+jEd!JxcF)_-*lud)OWNc33TO2PWu@Virn%ZuPnruDSlUET#>R@m#x za0d|8T?%sFFNi@ny*%**oWMvP&x5iyoYa z;(usr(f7;FWYqtmGtM=-Ndza0g|dq_Ag=~_R&4c5wn5Vrl&I|XSM5wf2YcyDPJPvi z>|s!Hkw7Wit>80+#=5OV;2A89vnDXK`2AlP;K4Xd>H_KhO-aq5-M>~+zT(#^GxsYl zD*N(;W=H!uVrNx1>vI_?NowWzrF3q^H(@_#2s*>LJ zxwD$5YO_gBi*#7Ynl~3a_|k+s9zG-=1PS~VLNa=T=J5O2sA8rlt(bj0x!+#6IR-FF z*so-fcdm@u)D55>lFxn==iI@&3Os6<7AJaer@l@EtjQUzn_SChJllr%1NdFlbbMGf zu12}B<41|5iqhfE1E^|Z&zYn{_Jy5$|A@8NL{A-O!~TvkuCsIg4u)UedW4CkBvW)> zH>(lr!#;Rihe%qyJ??8@CC)P5jJhlk3mjZ1ed^Nk|NAj~$}c|l?~?Unj_qFo{?sW= zQ)JeR(kd%Y>m8vYni|0&e{>VirLyEQB54&J+W!+JG>QKq#yaZMwo=N=KG|QkJ1kS; zv!CSzJ_w2OyFJ2@n(C7eW7PKAsC5m9(?{%+##@F+L87P9L%$C;mDH|F8TTS(xD&iX z(Wx_Cw&m~Hl3?Z*@5Bb$yRWJeau9kd*$J)24CX-zFyUps1us%OSUb1kHa^Y?K^-_d;S$g0BJC_gY%x0pcu7Q9BFFE8SLd5B=shCfIlPPVLl?E z@Fh&TZV!zrsZCL`+41guc`76}HEtTIL%rsq{d#ZG6^@kUeO!CyV1+XoVVIr3OxA z&xc?r>ZZ7AVi{ZUb7eSUSkQIkqHHFE{YuTn&pTLfE`J#cig#-x;hl72E#58*t*dV8 z6!>DKo;LCB<%u+1r+$VlwFJE3^6%YEw^M)H=AQf41lSq2CazK10mxa7TLt!nn6Wec zulLk>0f^*J+3%A&V(4WoGHacGs|SR`o~(;BSpq<6STrzqg^}Ge&d@Qnm1nePYrfmX+Rtbs89ipi>wxzM%4 zo(mtUFRQu9;h4*@Xw3Pp01`IP!Np<|h+0I1E<>(}v8z44V_rBjv4H?+^j6fNr+lnQ zCFO`}y3t}K_Y6VAbU%+dWMeWeM5;QN*;D*xnZudrnc)Lb*B00@+D#1bAVO~OlV-Uu zV4Bh~l&Z8&$ptITX@|_l?akoBQHlK!RFZgkL;N(ou?1&W_1p+^VaUn|yGU2GUkeMZ zH&?^wk6z#DChIGUsq0<4N%fHPAqI!zVZc}9b^2<|p8tJZ7U~855bqSET-AEiVqSA% z;laofGVw-FkoY~snk>}2Gvgpikg$onb7W`|7~_h!6*AD;h~(McGdG+m1y$p}wuy~_ zfP4B`@r2(8FX1=p32@7CdrF2NE5M9p8Ch1(O`-WO8#_;$RvAzUl!bxzds~^ zoq2UV9P&4T>qnhZ2P8qwv4qJmNVy-rIxUlaEEwLo$=LVi4YzT++~x2l)6q{?nNR)atu1H)}=>lHlW3FfiiI&{pJ1py#_XF1w$M zn#85yiF1|Ji`&)E7kMIK0ZWg0a&_2ScglV|#3lr^t-E!Ra=bS~+S$jwa>o1MHz=}X zU3Ob}9>MK&?~gjwrR-qnnty8?cJ<2Ho(ua_1C?X6fIAHz|9t53F72o62_$lJxa4vQ zDBh-=3{oRoY@>Mzc-GMoSMc~AR_Qd5Z_v!*P1ggxNBVI9u1J;J^=pHj(foE)cB|Vv z7$eaJbv}m(bBzI9zqSz}-NQ&MCWd<41%G~9%<8Ds$M~@0CG3)A`I;g!6OJnnCYe0P z%+0|$4H=kt(tq9Dq}~I33?)^POo*8kw!_4{9S6sFFP_7^L*&W2-!2Y&5d1Y^#PK|1R^?~F68 z2G2tMG~Qm|DlN{RVo$6wLyglEE4Uu!V~R}h^33&n2T#HNGZEIOmN@IbOcZ&wP&b72 zdvF(LKMeI7Hhl%7l)#b7)WGSKSspC zmWfFxj}vwSK@K3nf-}lFH6lo7b?!b@*TZ)+YHxX0h(^CYw;T9sxE?urt1PE&1{qmqjYrj@5Gr4=7{yX&^5@Q?PEuMnp+ zpZ>6%X$!c{M5%6=rriTFR*evW{)=A8StS_@;gb(rQ>(ow_0ITb((PrI%e1{Agz)Tw8%VSSj< zINde57+7-QcKR|?n|rhRtP+>C?cQ|H~C-Z_UZ@us_0j^ zqI+IG`a?!ecAxCtsE`$57yLzYuXG}vet}$08ijZdyh)rR=5{)OmN?Q9E~`paFR`8r zZjw&>yW4TFTZ97$gqwcp?V%e^xQuEG$cuK@`#Slf;X5yyf&a`g?k|kw0pc@>5hGAg zTq6j+^VY0+<~hngP(gANPZRnoU)DU&DyqMtfPGY}4(1EAurWl?Y{y2Cf?`NJZ$Pm- zk_`|?LYuA(Nx-Qmz_$>OxDeo!6Z%lz)#l=OF8X%Axu*T8MU3#WLM~;QIX}^QA86$|CeN>16lL~Ve=S(^{ z=dpnsdm|!Lb{s2{eC@iHiPNJyV6Bp~o7K*nH~1-yevu6`jRB{)R?gVHsI5gX%YyUW z_x_L<_gL_1u|>)<%>f?_bA!9z8WH8v`r(>R6F76c6^9pHLq=(c%9CWxiQ*ZE!`MA? z<#NFXRx?B3gV3w-q2T#CmYN1g;#&QPlruntLi&IH_jSZIPSUCHzY#r*KTwG27$Wt= zxqIGzmMl$~aRuyJYX9L)qJBG0}x%d>OrrrE(#0NEOb8vDy zJMuQm~(2~vIRArjLx6HLYFbdt$CO}Cj9eeTHD_0YS&Ln`tJZ7rzwY{ zs}bM#2c|I4^M_V-e>aaJ8qiptGl2~4F~9dLKRyVJ|kk8zLdJ(m1?z`l5|IRIwQ z6EChSiXDwM68z*a5QUb#&r!+8S5W!wRPJ8{REyN9zhet+#=8KYpjrav9TR z&AacH<`VxK-Y4mb)uiXV=5)GKRu!~dDLWg_5*t3h@GUWkl-pX6VX<)jwzaS!08Awc z3u9i?qt5l8p*~xf#B41EIkx%Lxu`=o$7SOL^RI%>+zU%2r-3e!Fzck&g&Guk$m-&! z>&kg$fIizQ2XC0=6JPr{RioYXfT%sT2uq5024Y(j`RK#E?Cia_?-pPZpvdYhCM@I# zA98eYS9qEuoNXQd(Fa$}f2iaCeg3}Cfc>h^+|4TuWuqD-*LcwV#!z&Ro8rcw(h-$V+GpN`m?*q}p}17-PCkUOnqh(5yK zDz5+7YDpeDgK+s}WxUk5Mm|maFqs}n6^y276f&ijQ0!R?Nt(NH7Dy6+7k$T*GmB9% zHK7S{GcWZM|-nELU32#ODPQoc~N(ZZowl&Tk@CKk-vJZ zZ4*&hl+Gl{Ny@C%SC?Z9FI^)c|K5bB#04;5dKl{)sOfIBL7vdvh?FVpP`_8F z!lfo?N!hA{mEip$B<6;kGYxjJe}T4$^_Wd1wqHu9QJ%Hm97v)by_R@Pe(}-1V#U}s z@-6Yy1LY~$freKDXTgTVe~Mn~2xn{_F2K+e^#b!||7w~vjN3t9foebMW<<-1f{yR> zQ6Vf9e#h4R!M&L2*XH99G-RHfPK&+J?)e$s5F!zI*8Kl20{a(_bhruD;Y^9jzp?`A zba1LD>A1EDz@32UKA?r?G&=bSttEg=6@193wKpm7O|fqGx2%5yI~W#MN}=coDycVM z2sX+Byo|N_`?@oV`?A%9JphIia(7|vNcyV4zUY?afrZ~8Ol_Xz4<0*O52mosOjEDP z&y()&<~lj%Ko;0SkT>9qO20&Joxy9$gpAag?>$o?7kvxBjtc}91%v(Y!es4OqhOkL z;Hit-YWA1ihjF9?SYdXn9{n8Tx44yW)1y^Hb6jQ>a&MIA@vf|nDiocP0^Z#m;_zK` zoP$wT1oY|(IOHQUPi6@SkyI?d?|dQbbwZcOH7nK+mw7iQ74+}@E?)Am?CW!+5l`p& zBgQ|SlxpQGMk(LxlIe+NPA{idOsySHPQEl$Hbx4dXD)|RjrIoYr*@|ligE4EtnX3c zAE7STFAerN6SJ$bJ8n1{riOR_^U%de506>03ieyNX!Lbkf9GEeL8JxhKh#NITQKAe zi(va|)H%{_H0rP;o8677OJ~6ubU}?){-M12LSV@Gkd_Qk=Jly80>|tob_Rod89`U3 ziI?%tCg8eR+^bIqF?0=Bw?6b`#@@Xzo2;c}L!i;(%;5*@utT$zI8EFwQfnk@nC~rY zOE7k9*C7-v72ZkXeMNoxuETurnb9JDLpFt;1?$*ONQfUG|Dc<*c%Lgpw2*m#8yIWTVV_ZT^eH)s&u2CxZ=Mc(Ub>_ARdMOXy_%#EFXzW@%pCyZXt5i41e_Ej^S)p_+E1k9meTbvSQW!p()(~a zQ_i6;j+7Uq<3CNtV7KpS+&b$Mn~bG7ST;?>giLh(8yEyE|5Vz$chI;iRHwmh#WmLO zgDCT(sUaTwL(LGtqrI&a+3VX6Wm%ZQA`b-tM5wuyf+p1vVj>lI1b4Ov+b!agFur9jDXrulw>W-&_x9WStbsH zEzIg+N1x2I4{xFvSY>9FzwdN!lUmbcWx-5JHwl$uZN0>Y;1oY-f12z+!Jh%{&JaktXsP9=@PNPIRbW`4>Zrp&zERxJXIPg|Gy)G9v8vO^kd;s9j4GXsHTY#0A_}OA?@9mJ2C;tTqS{FsUGDf#d)5{81%BR$nOVd&3*9VcdgGD?Nhq~r zzjYWDekXa96G&nmqL)ZcgE!@Gma|X)os90aKs;hLg*F3!nAyxr;^O8Yr*2G z1T+q7!b`;|vyyMbrbivgrJxV#V2(Im=1QE?xUC`AS9j{wvc`Er$7`SD1}XJ2=jUv3 z3V?*e4k+_Fb4J;RCcet>fmlBc=KZcNtBIDl^5_88IxU(dPH|;Ek+UaY3ew@fIb90W z^<0}e=gkCzfPwuWNl^NA(Vc|%U&)grD;wVvdECWap0rlZwIb@sq?$kTf%pC21y%zG z+NX_90dYm^ODC6s_1y2O&fhF7zR2*GR1~&vrZKRYi`twIra8f(5Il>z-ubPf63Gbc z=TwM*lSwj)$?)Wl7yTOBQpcFU73`EHyncF2#Or6>X1#W|8puCkfg1rGMAu{@iEHsw zDK>BCtok9s6xa|um^lFUMVbo}ML-xy~2H-;M?)lNr9FEfu7P?rdiCz==m)yrs z7;DHP4GYXL{Z_C1n-QlzKWC$s{jsiHSLNQQZt0PD5r0SSx~BZm<>}W{87M!j2Pp?D z!uLhEk=5tA4I{RDVV0;^7p!HAnk+mR*71Anz#0p^iOmgQ@g-DkP=;jIo22CyH?@b8Xycg5I2Lo$qN}_!Llv_=XJ4`-*TbB~)CR z@Td{OBfarVDwyAGe3g|(y_+_9GT|*E6J;icZJ#Bmj-TFpYF((YsUWxA7`^G z6rLvl!yDqcFj=eCv4%h5I6gV$IJW5d$cV4R2Cx4*Gb`m+?y?G`MXJXV7fS4I)Oq#SsmE=yK0G!yn;A+w(0BAyiL$m*Dt3exYL;{ zyYT6?*jkC3F#DqEL${-)9n&-H&7N675=qrgL|VPAl8T8TOkDce6s%Hh;}LVsOLMdw z5flBOalkk@&M?+S^A@u7<7n=+L6-S-k58HoTNa>Z*moqX>j&^p3oZnVOR|e2=zcs| zJ98J38YCj<*#xZ0zRUs}5_P_)j_etS^OY}<9jwQ6wV4{@T?H>;S?^u4k+u0x)c>anKsKz?dYQs)npo>Jc1r~Bna%W1 zY-Ncqj-3YCM|U;geQm9`-$C;a6WBIeXQ-5hVU+*(Yx^ui$J%+E)Vrk z9?z`DFagqlH?zxB+>y}Y4nMRq^jM(azJzV)A+*#0U=N9&N!|*<&82`kk?ZkEdjUH?$^v z?c(1L5>QO&khB2Y3QcNnx!JFy>V3G5|C-ySs4>oZkn-SF>H4Jnq#@ zT(fwi1DItVZ|q&6b!0kb*{ALhebrG{&IH_-uB07fIqUm@U*}43YKs>q;(yPOx%$I7 z!=m(m@KjZEzv1v^p-baB-G!v$dHw(hnARVRdAnTUXJbLg3rP69CSY3ds?Kj&OsbX2 zUbF8LKOan#Xm*ps51)-#u+IklqlLuiwKO>s_Mn{QE$e7=$rJLcqew_w6-|Tmg+`=L zR_T{J3vDD(Dek|Mo2mp;BhEM;DpX9fzIAoH{y2~IB#4hpFb*<{SKX%Vlv!>pyOWoi z!K)a*QsvK@5oH<6{DQVK?fd=Qgi^MggwoJ2vJ^b%=27TDMp=?)dw^t*L#60Eg<(7$ z?#}Me{V(~@JAusdY4~3N6!16^PWdiQbDAh8AT9q1{@+tvI7W56T(5^(U>1 zJ9@wU7`dE1TsalzLwZoR7>tk~ZK>cDlf?MQhyC})?sY6-STzg&=m6W(266;7gWDSk zuQ`0iPv;?a@E`b!15WgK(hxyN@-WKjketXB3cuKu+E7@jwY3z>tugYvH+4GE+A@~E z+8&>D`19?6(TI0pTgZa4d_VNh<-XRkbv9T%aH;SNJvBsSJLj&e`q06dg z^>~GIf0q3XAXkk)W!Bm(%}TW^dxWaLQaQRgqCyWJAYOA}r>`1OiL_x*t`oDRt75k& zHt1Oo_$`ifmJ(QmgO~8Y#LdzvwAhwmXIy#XcOd5~3B_x^o5S>{uhI?F;Az`&%0y28 zllOBuu$_-a9_{7jihw+XLVr{?4*T!|S^y1tv#t*HI%IrX^r&fd(^96<{E z`(#;T)^HIb*?z1o5zpduh(kZDyJ&B9uekrc)$c0 z3}F5k+|WS4Si47CCU<^=;eqr zQRZHTbHT^-(T}?yCS%s29tmc~XV!JM3TuZHaciX%?USA{yRFrE&Q1jXDWfo+a90*L zl&3ZYqs^B&nF6F7PH2)GhcM7Q)t}#aJ$EYUit26_u7QJQp7=cMnmBfh#qT`GSvdGq zc>8~=o4XLXIMdqi#l)}3A0<|QkeiUhUh`t(ZGaZ{MxQq;aIDG;5J)PyOQp%EcW-nW zcL9A$yVy+!gzQe5#NPg<&h26Y_8AbrG0keA39tWhB_-0j_mh^>3{GF)=fugz0R~ct zPld2PoxsuffOXhVHV8uPM`gs=@?9-x)oncDD!z3I;Gy6CeAj9$jB7dPM4Tbtw<(yp&zhk-Qh(hfg{e+4sof__du~wG|9)AWiPkT) z;N<`+orI+Po9%&yOX?=nz)YV`pV2;9$_39?065G)TU(^Xv3`TzXIV|?lb4~dSHK2o zC{7V6dZ=8ZY6zT3oq@w80r;kq6>=O1`r<#LGXjNY_S%>55V9;=$N)kKzjKgaA_2z~ zmReerE>MjAT@5;m)c&nKGazP+ZZ5YF2mX6??8{1fZ7=)Pcz2qpkVcE-wv@G4+(%=6 z|81t_#&}WRl_whs6L!BnNlpFATp}oBT6XGw=YO*QOIj+wv*$^Yem^!o%#d`#nM}-T zF{T;u((tTkJ;5vCQ~IGYJ@7ekb(W3Z8bQgIDLZz

    z`KeU1dH3D-($j$K3A?FvZo zu=B_lSD*<&42h-bq@TTS!Y{T${Lvp-1C4jt0w0_WK7V(wD$6ymXK0Rl!Q26uI7sw0 z(PT#y%sblQ@AL(wyKpO>PjA~)t(OLR0 z`MD#MqW)GzaUI$~rRLekp_-iS3xu@6Qb`*R7CT4xce;a!-8cY)Xah>DQgGA@U+*-B0cDg>+{5kBL z)z_6R>b(w=B?7Gt99g+73paQv!=g$7e;3COV#z}5pW+-l1B#~iF!c^^A@cOjD}ScLa zcdi;#4buPI0RV~E$8mEXL`0Bs+!Gy&no(N(_;V;!-Z9`T(=vrr0$dqTsm-0sT!_4# z5WSrs%>=Y^DTf!yp>Ft$4iC47)xTo~&Ra6EeeE+X4#Npe$W7eo3@=H-wu+5?znJXe zeVM43#t7)3tYQ2Qo~SPqGIT}BgSY-ufDtp^lt%551PgfZi*xJ)*3Jwta!>y=w6!l3 zBmn}06fCykY@_sxzj@pXF^>lO6-C4@b?&WYeZJ~0v4P4Ig3w;zno4ALBk{(c2Qra) z;gb(F=WRE5Q@_d%Q;FhB2aJSWtkCww@9g7B1lI$njf}M!!{2K5;&Jc*vZ!&kn(V-h zMPDGltXU2m$|BbuC3bkVW%n_b2D;bSVf`LvK8On;#P#>$ewFFKbczLT9w&miV>$0i z2|PA#Fac;~z~+ruuepZ=PLYP#wFn4|VNd?31fC#+LeQ>| zPxufOV;Ut`S9l7MfR}*aqTie&#s8DS9(rzAXZFs&dk{|vXAx2q`j{LRp6Oz|Dw1aD zKkvC;KRYr1B`S@{L1jF%VKKpLT$O=(;$h~9d^b_8t#vvFPB=6{Qe{XKcCVlfpl3oZ0zTXK9x6yAxTIIu;8zPxxV)aKYIOMFSJ~Okq$hW1P5n%aaBGRU9wtVR-jp--Tb`N8 z=#NA1uOkl^EF-gCtk+TC2FzQzC$DK7*clenM0OVJE|hYu{5%f&+oo+TMkr?TBOmF= zw$)i;IRU;s4o)F@pVN{HqaBAxY!C(mJprp)y<6)c-Ex^yAaMnpWj5|Scq`HB4&T7gQqiNh!PLpr#cTiFhrye(4n2K-9+x*3yR`ZM#6Zfj!mSt=P z0{lCv41j|RFHD!7dz2GM?WtZeWWl;#*{I3@x)nAgoW=vi$TGbqSL_#Ra%u^r;={R_ z;mXXc{(m^SOC?P$HmWMv2g?2c_H#}v5$+}gLXP34g^WfUo;~al#G`LpaCD*+jaPDy zUwcN5bu+1R_mOfGVpp4V?hJEloOjV>N7|dqAV=bde1PUj6<6H;3sb|6s!7sm<*F*& z^*zm@YggW&P!BUA=^VrEIYL~s-1rf`{n2wl#92{UJ3)oi@*i$>;@h&^3oeHtsgj+y`IJ>^EXXG&?av${zu8IO-{^wxd#Q9BrX5vV6 zYWAV8q9Jv3OJkx+&2ZJN7?zbkhZDrFuS8GII`_{+X2V7z9VdZ%^ zpP=$kA$t2s$ax==Nl8XKn->-`!BW;*$tKA1nGaRXZm5V z<>L_A#Q5(DE#FsUwPIL-G%CU@k&0f!Kqj=%{s5Dts#XTg#KQ=^^BzB`ejzX`$y~i=EWrE^_{yJ#X z69G0yhKxsVBPahC3hM2NsKI57DPNcOlT4MHrXRBTgO46K7!jy%&a8C^@*a{*aAy8q z?2qEs*znaKVz21WW{TNy>K4xZg6#jknJg<`FEIQgRf^5(#OE93$2R}hmtvCGr5u!x z2WoCW!QV}y!?MX`Jm}FqhCDxVWj?CFC+l#_K)$Ql08CHtdvy$~j2W8~UL?8>|L`P4 z@RX0UZ>_&c1^dX!Bvl69V5P;x|D7vrv=)tVktl!m0m6*+%67sg$&BH?;78K>AdMwJ z&87nR4;-=aHQt2?*@0iPjnG<3au+F)ImaQ})(_70kVS^Z=>aH< z8?xAEbxGNULJeM_ZVGQbXob1W9 z=i}iyQlmftzJ;zbt*?6ZAhKH_FoWx~e12xE$aC4fo6tKR64$XFH||MPOCh%KQr0s6 zpR>Z5MgLAGZN1RSxF5YER}JrmYH=2L)OUtQPe6)J zbh!Umc|mY|$t`v&QsInKj?*_!CY;_r?}8thk73t1tFWtt@e?w}d$kUDwYq1$n8Hk` z9xI>0_jQA?4$gAQC~KK>>pTaPH^r1|n%ETCy=;a$nObHO9+#zp#6U;aPQY z(qynu)G>3`SLYS+6`7ZMo?KV0CBL}V^^Jtl(1drN{%yqQ_eqF6q+{Kp>inggo8)oN zKAV=#lT0O1Z)iIz-?37sJ=&37LhZkHq%^~_zKY1rUb3$&#Wc`UM8G5K8)H-OisAiF z;sAAkL?Hih+vK_BvS^0?&pf(9-9@RW09Je!dvgk)RGS+@!42MXIY<=nV21!juGVg2mIzofN?%UJ}l-L^qln%Cucq8 z(>mk>EA0E`BJp=c*{ql8G1#eXe10V21T`<|LjED#C+R3hhTwHBzvy*GJyOMY{huP0 zd5^%<#?E59;@;ti>|vcBRj6;iCmY=?g+uIs{OQ$35?hNC48WaEaq$u`;6 z&l^W`Op}c34^9NN{9+ujFQEV~3~qJ5KgDfYpS;3v%5u&6mm%J&0BAmzt}&y4Obf~J z{O$-SAXz0LIn@Xl_D6GY%^gI4Akv&KHPU~}*1(3>qdw5H#b^1weKGG!{J(7EC4-|; z(!p4!CF8Bba7^|3G|JYV_2?uH2;UB8~<_E%v59lT%NL!z;f z8Kg|fC?8(tb)Z5bR+K*fY{F{w;CUg7rF^^qb>AGPgOSwscz5Rw7|dulZKnA(p}Q81 z-wp5V`KPM09SzUR-T*EUK}pfu>0Ty=g`eYv7DUCtYx&Qif55f&2lt=Ca)m%Shx^Dk zUy|R4EL1~dumg2Nf~|0sbHUfya9h;d4WdEWTix+0P@$FeENTiC5F`gqOpJ9hyHSts zV4)HR(^ru!%PCP<_d}!k)ORx@EMq&>Jv0&wbFl7#{ezfjRa@(?a?vPj6!q#D636qI zXPYlZqqpK>fl#iFcwd05cxwBdmS4?Y;*?s2-8@z?IOQhdW*zCF$y<2~wHrJ-_B7$3 zRn^O~tkW!FFlzl#u$$1<%x%?{jZZk=`h3#;kOf)1Fru$!glXV6L~ZJoVe8YN4wm;n z-#(>#w@)%-xZbi6gWvq5;YCd$i-0anXdF@unGcSiar3?-@|IP6`SEsNGuxWr(V|pa zrU!w^+B)JUvK2u8cGU4K4R}>Bk81Gju74Hp121qXMDwG+46?z}a|0wBL)$&P>@zcEB0B-F@1;6%8fMmsBmrRc1agoVx`f^g{9*#+b6Yqc*)_1^v z-b4<-RhTgijKzkI*Pozfb39HCg$~n z(@A!U{m^GjoV$`?Ka9WVR6#J2B37u0^A?g2$%pD z<-!^UC~-ezf7@L38rVjD6`^g?>lnzs!>aGNY4&?Cc|2rvj=`G8PsGQ|P-js>^(kR9 zzqC8ETt&2TveWEEtv4ZYvoKELLn~f>8>dNHwjJ?2?y)ml-@TREW0_wRXFPRI(XAR$ zFcF-zuMZ-pLNeazZO=TcFr8%E$5zn7U+^l2Mby8xQquzEB8p#*ZhjhgJ#%0R(`gCV z5=r`Pdi1f2TIBdY7b3Ek?lFH8I_c388|Bc7PL;$Kb`BKKB zXN@CY;`zyOoI5Yx-cW#YGUt7ika8IA)pz6n1J8vU>pBs>-Ejl1B%eJf;Jt?>s)+F#0EAlsmKAHJpp?E zYV#Spf#9Jk+pj7=5qXN`%iV9Tj1IB!8N>U2EwfP(Vt zzVWtKadbl5G*}MJWPX0pe7%(2(GUN0?1etdHt#=IGQgRw7x#^lM`_07MO56-3B2pV z?At&|mLrq)Qnxr6mqY({<+AT;B;~yiSA7gJ4`f55z+M_g-E8e-Mf;b({r7fYOPb)$ z+>P@JeCY=WMD!WUkps7~bt|-YQNkxL(>X?h-QGNn@L*FSt%^lagV=lio`~Q{6Y;Mv zv)p_SCapqgw*y5!1<}(+xON`X#hTk-XwXK;6<_=@D2sb9L_cW=>zMnO5OObp1lIm6 z-m(#IL`dKr&Qrn`!k}}JBzOPhHZs)F+3%iF`URvHtid&6wQ`Z<*eVI7L`XZLto&zNeC8`lR@))q9X zse&;ql@Ee%8KQ%|-=5J@b-{}m`yEO#C)!mL}(ye5AV#lOn{ zvA9qjQenVWKjAW2d`l#x(=>=A{1SK<%&Iy#$U|hj!EjRngHZ%$w~l zObHw~zM#V%J%LPC!KEMoOh%HnwW>?Y{Qr1c|AN`{ z;b=GQQ9gtv8E|^}03CHC-L!5|>eP!HGxdRawtKj?q#bNEK2x(KMT0jw=wj@4OiiHFDX0oO!rG=MEbB7395ku>t zBx`$*xYTF9YoE`t6^ix8+iYe*5OJIx2EX|_5%5}tQ-aHEtk}G` zJIoBH;D{^#4$v1b%3%!ivi2SIEgL@7O}q>5f*+Q2l+``7FOuE%@#BZdZ(GUPOQ`(x zAP5aI!8+|K@8H^TPS*a?qw^3nc>^yliP!`kcRso7+%C zh}L`QLtO6LG3N{Qfk&?-_%@9tt>+CeCJyplc$3fnDhou8kWPKnNP9g=g}aliJQ!?5 z_@yX)7z|?ZluY>HKA(n9b%5j1U$R(F2XJ$-;|boYZ`_G}3O^%kPa4^?hQUP?LJiaw z2Z=_!Q8z~#(3)D)M z%mW(e8mWGm>-61D!WCd@fQsw@Hq2bu5K3}^4{T|85vW_dnB@Cz#*g^qC*vU?{Y;hy z;SeZmsUxLsC7p#V$?JS*nX7W%P%L@TjJm3jDb6Q~wj#v~QpI-nmM0=YFDaHNC>rxr z=nCWNAG}<_o+xITtsGB_+{~qBCyJf6!hBp)yD0U@O=5(pnbOaE-yq@H^U11CZ{L$o zSE(3C(n-f_Rfka@)y%wMnr(Tr{>xe7P+tdD%@t%_q4!yyBf!n0n5Ll9vRRjOx^xkq zF}*)w)#)dCVky`Xl45E+l2lS%pnAy_BEBivG)=%obMHuy^xb#Y_MsZX%Geu9SWBye zr?Nq)3knvGej>$n%cNp>#_K8ZwUgNqiR9}fQy8a9ox_zZXTSPg+W8u@%R^Y76*Y;N zQQBQyu3P)`bBZq<1X;s2XpT+m{o7&fw-g@V)P(7r z)Syv77PgfX=23PA2-drNcP(o(dbZ8~J-eCFZlv#EzsXKnqht_!=v<2T60 z-|1ytXP6wWsho3Tk?sV?1%A_Bf`Qi3GtlBqmiBA{bw6KE*zI9Y2E~$&!Ef82UCnb_ zm9VNDwwh1!mu2`G45fbfvpVVRzWK6m^&&UFk`kYCA7KDg;%!AHsWa`Ag+S!gkp&~f}RispP34DCT3a6OjDz>k7rsHOMNy3NEo=9av&)*Fa zM-SyQzM2oQ8U4f(n@Zjnys!ildZbcLW6`T*q-qr6Oobq#2LsywH`fuD=?I1~T70^n zxQ3oMoQ&&MhY!j5@xb_Hd-%~?_Y}KE zuHth4P|Jao4Os`Yr0hs`V!`yE9WHT(s#1un!%XF>nQc{K{!m|~OH%dlmpqx4qLzdu zUrd;GM&+FU^c@{c(nw{V&!5F}=Jd{n=Ktg&)Yr~N5|L{02<63CVON3|t{t}&V{s0v z7`Ewswv+&~^K_5Nd+O_y-1kH@n>bAUN!s!k^niHmQ!TyIu;T5 zJh{#D+7xCzcH@9<_D0tBWKWl1??XfmR`K^Gd^t`EGh=@B1iHzM0We1U=YBVuY{lJQ zWU|iIB`?Aw&bo*}l1W9_;63wS)ud)t5XOUhJ^Q_>8!4(N|Dl#ond|B&f&FxnM}7|X{3Q85YcfMc#-(96vJae_A7)04&%&kM0zXBW2eUN54W6tm1s;#$Cw5B z+b3tRS{UH|j_v{(N{lS++!_B$P}A4;dBgW~m#X+sAiQM<{v{XoiXP%dMNv=ZLgsQ$ zoDyaBXXqd~Vc)5z#??0V22<2Dx!Nm`c)z`~=AoFXKmwHE3g-6Zbe?1&U`@CePzC|r zgwd4p3h^NnorDpN96T+Q-j}`Mur5u6Y^&6FKnylqV z)zYV;G^kzO4tp^-ln%<>s7>7AW3rTo;EBXiXXz7yzJlIXfi?Kq zx4=G(t;VEFP3OR=h`0n~ld(^w1i!n3+9NW{PQ9V$-q6b#z~Tb2rH&DZ8bv+RheE(x zJ~X&l9xM*GH*f`VFpld;rPBZ+D`=^7CNo|Wy@l&L_g$?X>>$cgz+y-EemVh&B+BI} z|5lpb2NEu~Qq@>j!HJ^pZw;*jU9#m?QP(`4&OykJ<1O|m{UBT`D|#Q+vGk@<#LoW5 zQfhpx67@u&hT`%cdAdte@k#Y$R(3lD!8_cYlz%87N+|yajVki);tf?plVCT=25R<4 zaq4mW;MS>Lf>gzpkvIZxoDGy}&Yp%(M$_)iwP>%MD>|>Ii&D12ISS>QLgfte8F3cN z(>0fPF+pUpklZLjB~kEqej|sO0wuaAoRl+y-h;Ikt0qVKS(sCBb3FNuop+aEH82riz zVHkVCR?M>9m6(N_#dAl+@g*V81kfeJUSLn{usfN7(Ib)f80kJ8;l?5!@_%`d1N7-t z6~%@rKlAUSA~8}N9H*Eo zp$+gMMpj;|RvbiN?}YPp$~rO`Q@p5(c6?Z<#I{=)b@S$hroVDBRl4h9W2jpC%~SCbwu`-(no{g^1>{@@f=dJ|8xvIfl$wEf7NSMNDr zGW~GJsseYUaLofjvt%YL_UE_QX{3T~z5c^_6 z=_GS^t6}hcJ=tDUP7rk%)o4%wMCteW`MPs0!!(fY0M!n?<+(LWlyIw5n{flx(1jiI z=2E0EEyP%$DdF7^QEzTCd+R~_M&d&}T$N%xP6&p9lbGmc3qmaS)Ee*j%@gjH5!~mE z+Oh#G}v`*%Fwja|_uTh2h%ymx7At1Vz#uGD=2+7yy zF_x4SX}eQll?Xx+5%II)J!?W_W1i-xA6a}l*iS~_R|o+e%#h+js-~FQKeXr! z@%9}B}{=sj3BV|}r^XkryB75V|PKZJQS_vpb?0V`jYDAymq0&@we z!k7R{+#lRx9{12hTT=b1X}Cn#$`8$o8O1nWe0j-OVWb@%+d76lD=yS%gK7d&KY`_yG*P3SQnt)!h`fEL*I=fFO`Hu`YPa0g(?s4m?1eHcR zGDI9$zV~}p3eZ<<2R~HxS8t6cKdt_msC`!ErGLKdi`l!@uz?$%qcg{{V>M$Pq@mdv z=QG9NgJn-vPkgw()Vz7I*F|7PvOk-OC|PiW<1LQBvzc=K2OvYubLT%G!4JEx8x2g~wr7-tLbCh1~e zrFZClOqKd`zQ?XA9||tX?PvsU#aL_6v9oj*>&d6b=kq~oEb&@&kJ9{Jhl_(}wVijE za*hKU)9|hLrJOznU!I~07T7B;|G1xhjD5wO$63*=dgh8Vc_?)CjKC%FN|d20xF)={ zU-WS1vtfm!K$p4IH%N~;4m#8SHyWt9@vLXQnxvDakAW7Vv=;00+3o)34t#l1QVA|6 zd~+e|o0_ckCIZJq>B?I?)M|tiEI3Xw6ZjRVAj!J2G_4axu*~**hnN<_SRYY{d?h&T zhJ3dIFV=)tzBHT_qyd`1pX4;J)!ZNJe=rSNzE*cGzZ`c)kINm`b;<1Uif#q&r+d#| z68_z0BfvkL10ltip;xXWSOfypPdk z&jP(*gDIgi`nrE|;~*2_N56XG{B^0;Nvs+-I)we5$dD{>;pg{TvqeTzh+zE zhzylM`HZlPg^=Dem<`EvCP3b7zZm1wwf^DAuihCnmm)}o(o+XC>;ls57gXEeyoZfF z@EnXGFM9;K^p}LOB%Y36{FPW2*pXNaQ)srC>01F20^JEP<=KFlObjGCmM9`VOdO@%KH9VY{tx0l09czVj3ZzRn{kLHtO8?>av}W zrBAay^(NwmJbbq}P~9%l``qz|@?vg9fiZ=+oW1!qNqE||p3SY{9Uo(3^LmooqB=I( z{W|I^Ejg;5$x=toMI`!0){&YKN&@vF1`8Hf<+Qx{(jp-i7o!5!*Imi|dp@h5jFP^* zY52-8p-%+60i%YgiR6R7QfRAFXMQIJ3xQE7Zg??exY_~com5#@^2W~J!uUI}EiSG2 zbUUuHZ%{MR61W~RtryN=LE0Db=dbwv820*R4ag%1n$dgApy#SXD5?{XRWsCs=+6)s zc4$8SiYf{~28lMn-NK0zpu-PSs}#D*2P}2J%8?G{LQuIlQYVW5(1ndjSuU=4H>$cb z4V$fp5`5*6rniyPE7dEl&X!d^3lVst>~MNU`U@P{k0+Sh zw>ooRRPGEiY97czQ)#Sx+1_>Z2%pJA@~g`&Yp-cJ3C~#lJxU$}dIbsM^o`T1A|7<7 zKRIRS`1pouEtos)>lym;aD8O=GNP@g0ydDMJ#v1rZ?<6{iD3YS)XWlGO%n`6MelE6 zWoHuO5w*-XZXnR3eWlCaQ*$L`cq!mD`j(5@TX8H^E9hy42~V*kg=dTxL$|Xot-S}< zSkC|8fj0xXK0s|0(PGvtd~gyhRSM|Mj%pNq=&ErP6ay7TH34u)lAp7P6&uXX3vHww zs{{5-yK_iaddv09U}}+9%a>T-ox~cauw3GWNh0zi?(Z&i;{#Pn@kSjcg*p*gs$Y+| zv^7-={B1!I(^OZxGm)72>B5*b`Q+M5Hyn$Ya|HizGJW(73T6v8zILhrsR>>iz0`rv z!qjm5NiET+0g0yo#?IQ6@VN==6FYSy#fW^7-8CoXyJt>ud>F{7iqrjy6!n_6>rPD? zzZ#)DhpRYk0>-SVN#HXMs)h!f2JRUm^=wj&Pnq(|AcJMUVsX{4Zn_UBJMMZKWJEJ(d-1UVjKzyT`r` zpa19vEOh#h0L!=5t-nw`y8ww1yW>aGugzo5}J~IVTvfQsh0ZKttr8H)L+Dq=+@$w zQEu+n*7PkG_4KQG5v5<~)$?xISFdQaM77^Qg?7GVYkjc}+f#l~h&QgYcK+9I>xHTz zSnUoOj0w3V&gU@0jP!AkY;?K982NA|8b>=j(fjwCug{RX+v50+ax zTknQUVzIQBWnuhbWvh+W7ax$Cn^H*%uIEJ=XuxMEXAPMhkfF0tGSsBy^d`o3Xiev^ ztjfqH_fNcQ6EQK`=|#_@EUjChvtE_afvva5hc{d0Oq1El`;JqWy@FQu+~+0flrfPP z$xold=5Pm=xe{fV%TAC9g!zeGgtp?mk9dnt{*M`KN*QVC?Y(Uy4R={A5s)Bw!sUm&L zgnTO3HZXH^D&Y<9=djMSajS+HMvX6pZ7S~d_laQsI^&fs8v~N5QkA*6_Hi(^UeX58 zR_Jt829?E#*^K`|M6zd5pfpZMD1VLT9Jqa#4peQe z@XGsciwEX%-DFf~u=if7mam`^D0`lR_;(G;>rmPn_r0ol7nRtk1zcIr&ev2cOlsY! zU(pUnX&TOfJj|Ffwu0@9uu$a8J$#EtAkR`NPW!fBp&oZX8vxf9a))8WL}V}t=jJz(eoCE+1S&blQ*xcHl@Oqer1 zQW4^)u2|#EH8}lA_JQ}%iORc)b5%;$7$+qF+(%5t+xszo4FAo~LzU>Cz0X?qubNUP z!|8Dz{NgQK&%e(-0h$aE%vAJCyg`_APn(6TDir_L*g0aCc}etWW`xZH8n%~ldafOl z))A=jw?dl03uMO$E-6vo$+TI&$0>@iRX25G17DSWAHu76#fJ+3HDy4yIXAR(QP#E1 zqHhk2^0 zP+@(^Y4}scRdPvCG50)xXSL-^Y|*tphJ+X!4$J{yHmtbniwnRI^?crczj&TWI2E%I zk15(!l)#Q%4o8zYIEFxZK3RLHG4~y#NX_Of$+$3i?ek@jFow5^?3~z0LMlQuI&Rl( zyQ%Hfre;a!8@H$+xw#r{oB?t~LHh?kah9yz*O&L7;!J}y-x`NGcR^+v#09NHj>xFjiE z&)7(koCd{QYJG(ZmbMug*tHmq9cC7{8BHwuuw>}OV(rEkze}P;$KD4SvY6|1VKXHI zOy@96#kczp(j)_{=O!}0T8B9ow_zv3orknZFZj0)ehST}j{C)IUslYCO&p3LWw9}A z%k`e9Smv35#cc^Tx$^Q=>Fv{?r!xD!+ZW#@g9s*0ZkZq6B7sJ2pS*6Wj?3ISU+DJq z8MbCUPT?Lqd^dIgeZ(Rx-7Kkp{{VS8Dal@Zu(9PMf!J@7A%xyvzpPq(#!?aoJN60l zE0fmCxHlq=Y-yoKeeOC348?6O{6#&E>6LNe(18>GN@)_VZ*m*-hw1k)WZtRlXHSn$ zX%&sd%0_CIYu7r^OYdWjuiOVOJDfa8EBiL5z30mRq6Mg)tg!VcEn#k}_$VK;HrPZ5 z%rT-7dUrnad{3-3IG^6OGRY%l^oxbfoUox<*Lcp{9hMkXr4@0Zv`LauQ6xXt1B@dQsV=Ef_UQ z7cg8mX(#lSXgBY9;dX=#_P4K>gB$-Py)h_gn|26u#+s?+@mE(XuFUmC{=S+MN$7d9JBsHP2g;@GZkAS<{~ zg%A}CCKZcVJN~kq9Qz#`#Iq~rn*moxc3;%GyY;{su&L{vmpl14DOH$XTsWUSfCAkP zldp0oH1x|FuFLQZ2{S+=Z}z-ZluZ9?tJ2`LJ@?`4UAI(&9Xc{KF?rAGhq{5tugisa+~ke%(k>`Gs+l-*ybzHR?@r>4VA-Lz6x0F<;yQq+l!df}ck zz}ILr9^yCtxBxKhlZ2^$hhS_p#Bz;u{FJt%Rl7vBS>tU){bV`GHgJMTt}P2qXV^Nu ziU@@8vt=1JhZbsY^PKI6S27cIBtQ8xfOmFhZDKds^K6dC*jE&n7h5hpk-7cMH!tXD z+dve|e;mG8=8gqa$nCm_NAg z>*x-c5taRHu4f5fU*sB$GJ0blwRU)^()zuRzfz=(DsqH~aA>`QU3|-bMwry}m1fCPAI&$aaM3J}r+ClQCs*S2jJ{NZ$}{Km z*Poejj?|dP=nsR7Z@-R#UF%npJkOb;uM@&aTWf9rIzt5w^Tmv^-4m*!$GAf~vT*-qx74rQVf8)s13HKNIIirA?_2fn6% z+cHJqlxdTD<(v?tjBDI1mQ9r(}db^f^G zShy6gFl&Zf^RcZBqTeVQkf(xb;u-rggk0pXmjlrS&Jz3ck2Cjv9&6rM&c4CUD5p}% z@WUQQC^0tMNfY)R@++UgBFt|Npn}r~HOP7RD(~C;Zd8Fet#7A{WC{GhiISqa`{{V( zuqQQv9k^wNUN-FyL5r^btogXdUb}mA%1skB&}AIQoBg6Wi?3jt5YgEx_mRZuO^>uB zk3k=5yrgWMCGzb4QkR>P{OW+apT>jW{O4=T{aoplEjG^}IeuQ$-{qf1aD9C_Y_Uid zPqP0Jn zJauf=91r5;v(|rqQEWK{8It_rY}o6EeJa@zYi;`OMHX>eNVP$BWDjrBo0E+@SOio} z!U^95*IBpVfzb3ffxDq9a^|wln0;%2oKE}>LQayDroNr>7kY_x(obB?n9KyH@G*!;#F}s>0!BW)Oxk!b>Z@QAs34NGi?!+LOE^0RAtY{ zY43$SVm<00UCCc2X`$2}$8pDfYcloP!Fr>&}t4tDnmL3#;=-dy|Ior1SV)XD2jCPLB2FT%hFIWmb5m;=i z)tl2m5$8LbgkG7mkjkj-gBd+K+d_<1#=f%-w7*JHT+MqD(84dm29@ErnQv0Bpg1qW zh2L$T>qmdyA`v%r!4q1OIM7H$vbFcM9~l#+kunW+$n5UJCm0;uDUD`7ansg@&SS6n{$%f6}DXu*S@jfaJcd9UL%k;7%1^0K`$+wA}Yh zfog}MCsE9p%bRa_%EhMaE=8JPDQ>#4k9vbi2H~)yU_yo+B7!5P)|Q6-*3UR57J=hK zrHf+E@maHLePxX$A9<=&`;Hv~zPGg>0bM_DTN=8Jwu;O}1BV(41NN z_8zF9r=L0H1>-%jr=a*Fem(>}uF~9Ggqg%Ggf8d>Cp#uX+B7SlDAcBEpsE^lbUu}V z*7-nQ2rFcsl!)?Nkic|mvQLwn1YgRo{p`M6*WLYz1v(ED%LpZkRd)7at!{-FXc{Ly zc2B6%4cZ@&V!DeczApqg=^QUGuw&K-RK8N*{B(S~6#MU(7$SDs?^2QDcqNWV7L}6b z;p@K@Ng{L{;Zya#)`I-@_Acm{a=xqLG!eEm(n(ae-;6v%G1F|aIe5H4hLT#?;PBFI ztc&Wm(cguoYl*h!T2pkkY}i~_;7yAB0o~(vGv`F+QIp)ZX*q*@dvft3{nCqmN$Fx{ zmt#8KwO@k$s4Ht0N`hU|BrC$6{2l zFf(ZPC*)!-E7`qe?eakk`ZI*mPwPpAr%ZmfPfzR4^4*j51kB@!@b{K7b}WSymv$t* z!8D*8Oa#Y={Q;33A{LT@;Al#KVj)C%$bF^N-O<2iZPFfYNQ$jDLK>|S$iM-N`+rV@ zetl+sppMuo|Hsr^9NZ&WJa2?YpCfJ&tMbKiU&qfxwXhAjX_GPERU2DQE98jl*Xh>vt3pW0)Bkt>u4^ZU7wTE~kH0Wc%BQ_ryX)wy5DV z!RNHfI8LZJ1bXhFf`nweplJW#;6)K(=l0OyyZzBXzH;L}2F%Ke@R|zdy zoa|J7s9rHW`Ncv-``Jhnu-kfhB1RYq;73o#kk(d^j4DRoU_Dt+c~lDd$o zH+S!mISZ&}puzFvL9q5p?>jm(as6>t z%7T5}Tq?}X=jrhUjssJ0!GuaOhREHGbZ10Fc+;T>gYPpQqsA@ zN#A@3xG4X00C9F>Z;29PeoNZ2-@xjO$=6)hk9#i1zy}+W@oK^aJjdKzlXpDft}1fhM;@JIx;qBmoeU`rkG-fwETvM_n%$P zSU^H?MiwX22Jpvjw_H??9kyP|rXJgUd%g6$-nI;`IYUtpzsU-5AxGEFNd+0%wXmK~ z?>l3q|2vW@vcEGza*%gqW~^!D!?luD`!vEVno>J=y5<+4vtL;}y5M`DQ8op8SGhj_-@rG8#D|&#L-B99?M}5j& zIPZ4R-2nw)g|=Nql$cxkK|`0fR#n^M127I7$y7ZT2{T$f3UhELt_TzcQpax^gF33S{?7a;mEm<*D@{l zH;JxqnAhsOjIF&F?^L4Li!dC?O{Q5`NY zAx!E?O1Mvsgt^jbIlK_Sp5I;l?|Ey;DGE3*hqFZ=xkuxdJu0X2?6E8)27SU2vM))H z8r|^f{c6|5m|v?V+bJh;=%_ayhFzibP(q!>vq(K0|1J3_cm!~rb~MJZU1=k3x#*;@ z3pk(ip4qhc%`XO*B>Ll$9Kr7L4uhYYElFeO$)-|u9)X4VL1hS3;Kt;(7f4y#*rEG8 zuW1!a{0;z{XWUBo(uB=4p}3q7s{7JT1}^uJ1Y^9UWrKDpD@uLz_~Gh8Gq{!1 z;L94kg@~T!TEM`mB8MDShhV=8DpEQ00X%QD$^y!rRC4waCr=R~O~|=@)|9YY@(!SU z+#kB>Vpcx6HEi*Egd}IT#c^FgBFjzvOab$2At7$EGZoFlWW|eugsn7t3g-BryKlcD zsV}=Oyuomlk@5uS3}&mOyyo(BTIB|Ib6#8X5Kzb#9+LZt>9P(*X8d-&$GfRX;Vp~cVFQSFKm?Fz*2=5>YB#ujje{{oJ&L~}!rxNA)F zW|nCHI^|SgXUUjD9S~gaN`NfDL_mkiYF70jsBoa3a&sNUqd>ob=DFNQcq0OHIWSp! zZ6Y@GK!`&?>evK2YEi#aWN~BNc?I(?MsW+Ttvr0(v&Mlho>kF1E1# zs(-Txs&$<2>tEE;?h+AfmU%Jcj=w#cBp=2r>MSF%=sgd=)#A*IJGj=`bUy$3*aD}n zaxMoW4zeN!Su^7dlepNmYD~9W*W76ANaUB<+S#*K*n4>p-T)r6^sikE5yc0$tS4*Y z5lBd^a7gemv{N_(qBl%lEN3D40-Af(<|YrKB*g6p^uIf*Bc7e7Aj1^%eHi8c8ifD7 z^Q;s9{e3~kD}&w}>ra?kIw7~RzLDBk6V3)4_mwV%x8sz!I$eQcJ_jFUo;}86rHG{? z&Ag=FQQC~0wVp*@COYhpuWYwbSx8u?;d!#e1k5A{RmCQvwtWU&w|q6|uavGR1ry!d zPH(!HE&QfebDs2!Rl2xVn^~aemDTX1&&M5nlkysr_@5jY@GVzN0&CpSlyhADWesoM zeCo{j^9}kJ1eBjH?M?8BFcb_^*hz4W{=g;|6!3^gtFisUZizD9r+p_5q`YKD4}PxI zDW@VeK-jb?S;Ur=p_cJjgo+2N3r{Ec$Apg-%(YFb5IAMdv)#mVuK zVr%~bK0T~5K?%8UJsthqKo!w!&JYsbsmaK687t@udaKsP84oiOhdc2 zJ0u>sX$9~!J4Q_7{Tq?n>!YqOLWN>6NBgUwXr|**N!ZpD{3Kt{ROv@#j1fCb%=fF5 z$=(&H#{6g_d$dFsRt@Ge)IR8jhli0XF3<%n(g{^OO(E|C+2Q}WmNe5rb&KNZ7Yr1n zE4Kv2=(t>$h)~kss@afSZu>nL!*Oy~IUSTGf6EICp6utKUTFkk4@?=P1mNE?BYDS> zknzJJd+0Z{_y2BOU^ldH5-VeGb+h7dT0nN&iqz^D6~vq7+KO z+)T8+0G}N4(9`MpallMUs*3>qg=DzxMfA~t=qHPn*VD<#3q)#Lf1$V6L5cGHb^GRX zu<^WRiub1qWH#GXw#5B#D=o6%jWd#*L4bpiM=H;s#JwqE ztg{)qZ$Hgqb0%$7bB+TuY?@X#8!!%f{O&bZ+IwqlY1xiMQI*iNFMD`kO-aK4J)5q_ z($BIZgsDxU6U!iXrP<-*nq&q;QrU73AYyQ_(YLsk8!=ZMXK1gXgZ(qp@88V-eWkA0 zg!E0NC4o?;p6yhh?IXYF2O;z$bKgr%J!VMeP&I5O8#dQB4rrQI5`a7~!?f-lupy42YJBdJm zQ1wJ>3g&$%J5%$&pYwm;$bWz1|E~|p@iFF%72XU#Bp!EyfWODeno4DlEJFStz~vzD literal 0 HcmV?d00001 diff --git a/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitMain.cs b/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitMain.cs new file mode 100644 index 0000000..dc9a186 --- /dev/null +++ b/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitMain.cs @@ -0,0 +1,804 @@ +// Date Modified: 26/01/2021 +// Version Number: 3.8.4 + +using System; +using System.Text; +using System.Collections; +using System.ComponentModel; +using System.DirectoryServices; +using System.Security.Principal; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text.RegularExpressions; +using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME; + +namespace PSADT +{ + public class Msi + { + enum LoadLibraryFlags : int + { + DONT_RESOLVE_DLL_REFERENCES = 0x00000001, + LOAD_IGNORE_CODE_AUTHZ_LEVEL = 0x00000010, + LOAD_LIBRARY_AS_DATAFILE = 0x00000002, + LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 0x00000040, + LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020, + LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008 + } + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)] + static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, LoadLibraryFlags dwFlags); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + static extern int LoadString(IntPtr hInstance, uint uID, StringBuilder lpBuffer, int nBufferMax); + + // Get MSI exit code message from msimsg.dll resource dll + public static string GetMessageFromMsiExitCode(int errCode) + { + IntPtr hModuleInstance = LoadLibraryEx("msimsg.dll", IntPtr.Zero, LoadLibraryFlags.LOAD_LIBRARY_AS_DATAFILE); + + StringBuilder sb = new StringBuilder(255); + uint u = Convert.ToUInt32(errCode); + LoadString(hModuleInstance, u, sb, sb.Capacity + 1); + + return sb.ToString(); + } + } + + public class Explorer + { + private static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff); + private const int WM_SETTINGCHANGE = 0x1a; + private const int SMTO_ABORTIFHUNG = 0x0002; + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + static extern bool SendNotifyMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + private static extern IntPtr SendMessageTimeout(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam, uint fuFlags, uint uTimeout, IntPtr lpdwResult); + + [DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = false)] + private static extern void SHChangeNotify(int eventId, uint flags, IntPtr item1, IntPtr item2); + + public static void RefreshDesktopAndEnvironmentVariables() + { + // Update desktop icons + SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero); + SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, null, SMTO_ABORTIFHUNG, 100, IntPtr.Zero); + // Update environment variables + SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, "Environment", SMTO_ABORTIFHUNG, 100, IntPtr.Zero); + } + } + + public sealed class FileVerb + { + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern int LoadString(IntPtr h, uint id, StringBuilder sb, int maxBuffer); + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern IntPtr LoadLibrary(string s); + + public static string GetPinVerb(int VerbId) + { + IntPtr hShell32 = LoadLibrary("shell32.dll"); + const int nChars = 255; + StringBuilder Buff = new StringBuilder("", nChars); + uint u = Convert.ToUInt32(VerbId); + LoadString(hShell32, u, Buff, Buff.Capacity); + return Buff.ToString(); + } + } + + public sealed class IniFile + { + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern int GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName); + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool WritePrivateProfileString(string lpAppName, string lpKeyName, StringBuilder lpString, string lpFileName); + + public static string GetIniValue(string section, string key, string filepath) + { + string sDefault = ""; + const int nChars = 1024; + StringBuilder Buff = new StringBuilder(nChars); + + GetPrivateProfileString(section, key, sDefault, Buff, Buff.Capacity, filepath); + return Buff.ToString(); + } + + public static void SetIniValue(string section, string key, StringBuilder value, string filepath) + { + WritePrivateProfileString(section, key, value, filepath); + } + } + + public class UiAutomation + { + public enum GetWindow_Cmd : int + { + GW_HWNDFIRST = 0, + GW_HWNDLAST = 1, + GW_HWNDNEXT = 2, + GW_HWNDPREV = 3, + GW_OWNER = 4, + GW_CHILD = 5, + GW_ENABLEDPOPUP = 6 + } + + public enum ShowWindowEnum + { + Hide = 0, + ShowNormal = 1, + ShowMinimized = 2, + ShowMaximized = 3, + Maximize = 3, + ShowNormalNoActivate = 4, + Show = 5, + Minimize = 6, + ShowMinNoActivate = 7, + ShowNoActivate = 8, + Restore = 9, + ShowDefault = 10, + ForceMinimized = 11 + } + + public enum UserNotificationState + { + // http://msdn.microsoft.com/en-us/library/bb762533(v=vs.85).aspx + ScreenSaverOrLockedOrFastUserSwitching =1, // A screen saver is displayed, the machine is locked, or a nonactive Fast User Switching session is in progress. + FullScreenOrPresentationModeOrLoginScreen =2, // A full-screen application is running or Presentation Settings are applied. Presentation Settings allow a user to put their machine into a state fit for an uninterrupted presentation, such as a set of PowerPoint slides, with a single click. Also returns this state if machine is at the login screen. + RunningDirect3DFullScreen =3, // A full-screen, exclusive mode, Direct3D application is running. + PresentationMode =4, // The user has activated Windows presentation settings to block notifications and pop-up messages. + AcceptsNotifications =5, // None of the other states are found, notifications can be freely sent. + QuietTime =6, // Introduced in Windows 7. The current user is in "quiet time", which is the first hour after a new user logs into his or her account for the first time. + WindowsStoreAppRunning =7 // Introduced in Windows 8. A Windows Store app is running. + } + + // Only for Vista or above + [DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = false)] + static extern int SHQueryUserNotificationState(out UserNotificationState pquns); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool EnumWindows(EnumWindowsProcD lpEnumFunc, ref IntPtr lParam); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern int GetWindowTextLength(IntPtr hWnd); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + private static extern IntPtr GetDesktopWindow(); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + private static extern IntPtr GetShellWindow(); + + public enum DeviceCap + { + HORZRES = 8, + VERTRES = 10, + DESKTOPVERTRES = 117, + DESKTOPHORZRES = 118 + } + + [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern int GetDeviceCaps(IntPtr hDC, int nIndex); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool IsWindowEnabled(IntPtr hWnd); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern bool IsWindowVisible(IntPtr hWnd); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool IsIconic(IntPtr hWnd); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool ShowWindow(IntPtr hWnd, ShowWindowEnum flags); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern IntPtr SetActiveWindow(IntPtr hwnd); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool SetForegroundWindow(IntPtr hWnd); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern IntPtr GetForegroundWindow(); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern IntPtr SetFocus(IntPtr hWnd); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern bool BringWindowToTop(IntPtr hWnd); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId); + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern int GetCurrentThreadId(); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern bool AttachThreadInput(int idAttach, int idAttachTo, bool fAttach); + + [DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto, SetLastError = false)] + public static extern IntPtr GetWindowLong32(IntPtr hWnd, int nIndex); + + [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr", CharSet = CharSet.Auto, SetLastError = false)] + public static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern IntPtr DestroyMenu(IntPtr hWnd); + + public delegate bool EnumWindowsProcD(IntPtr hWnd, ref IntPtr lItems); + + public static bool EnumWindowsProc(IntPtr hWnd, ref IntPtr lItems) + { + if (hWnd != IntPtr.Zero) + { + GCHandle hItems = GCHandle.FromIntPtr(lItems); + List items = hItems.Target as List; + items.Add(hWnd); + return true; + } + else + { + return false; + } + } + + public static List EnumWindows() + { + try + { + List items = new List(); + EnumWindowsProcD CallBackPtr = new EnumWindowsProcD(EnumWindowsProc); + GCHandle hItems = GCHandle.Alloc(items); + IntPtr lItems = GCHandle.ToIntPtr(hItems); + EnumWindows(CallBackPtr, ref lItems); + return items; + } + catch (Exception ex) + { + throw new Exception("An error occured during window enumeration: " + ex.Message); + } + } + + public static string GetWindowText(IntPtr hWnd) + { + int iTextLength = GetWindowTextLength(hWnd); + if (iTextLength > 0) + { + StringBuilder sb = new StringBuilder(iTextLength); + GetWindowText(hWnd, sb, iTextLength + 1); + return sb.ToString(); + } + else + { + return String.Empty; + } + } + + public static bool BringWindowToFront(IntPtr windowHandle) + { + bool breturn = false; + if (IsIconic(windowHandle)) + { + // Show minimized window because SetForegroundWindow does not work for minimized windows + ShowWindow(windowHandle, ShowWindowEnum.ShowMaximized); + } + + int lpdwProcessId; + int windowThreadProcessId = GetWindowThreadProcessId(GetForegroundWindow(), out lpdwProcessId); + int currentThreadId = GetCurrentThreadId(); + AttachThreadInput(windowThreadProcessId, currentThreadId, true); + + BringWindowToTop(windowHandle); + breturn = SetForegroundWindow(windowHandle); + SetActiveWindow(windowHandle); + SetFocus(windowHandle); + + AttachThreadInput(windowThreadProcessId, currentThreadId, false); + return breturn; + } + + public static int GetWindowThreadProcessId(IntPtr windowHandle) + { + int processID = 0; + GetWindowThreadProcessId(windowHandle, out processID); + return processID; + } + + public static IntPtr GetWindowLong(IntPtr hWnd, int nIndex) + { + if (IntPtr.Size == 4) + { + return GetWindowLong32(hWnd, nIndex); + } + return GetWindowLongPtr64(hWnd, nIndex); + } + + public static string GetUserNotificationState() + { + // Only works for Windows Vista or higher + UserNotificationState state; + int returnVal = SHQueryUserNotificationState(out state); + return state.ToString(); + } + } + + public class QueryUser + { + [DllImport("wtsapi32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern IntPtr WTSOpenServer(string pServerName); + + [DllImport("wtsapi32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern void WTSCloseServer(IntPtr hServer); + + [DllImport("wtsapi32.dll", CharSet = CharSet.Ansi, SetLastError = false)] + public static extern bool WTSQuerySessionInformation(IntPtr hServer, int sessionId, WTS_INFO_CLASS wtsInfoClass, out IntPtr pBuffer, out int pBytesReturned); + + [DllImport("wtsapi32.dll", CharSet = CharSet.Ansi, SetLastError = false)] + public static extern int WTSEnumerateSessions(IntPtr hServer, int Reserved, int Version, out IntPtr pSessionInfo, out int pCount); + + [DllImport("wtsapi32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern void WTSFreeMemory(IntPtr pMemory); + + [DllImport("winsta.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern int WinStationQueryInformation(IntPtr hServer, int sessionId, int information, ref WINSTATIONINFORMATIONW pBuffer, int bufferLength, ref int returnedLength); + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern int GetCurrentProcessId(); + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = false)] + public static extern bool ProcessIdToSessionId(int processId, ref int pSessionId); + + public class TerminalSessionData + { + public int SessionId; + public string ConnectionState; + public string SessionName; + public bool IsUserSession; + public TerminalSessionData(int sessionId, string connState, string sessionName, bool isUserSession) + { + SessionId = sessionId; + ConnectionState = connState; + SessionName = sessionName; + IsUserSession = isUserSession; + } + } + + public class TerminalSessionInfo + { + public string NTAccount; + public string SID; + public string UserName; + public string DomainName; + public int SessionId; + public string SessionName; + public string ConnectState; + public bool IsCurrentSession; + public bool IsConsoleSession; + public bool IsActiveUserSession; + public bool IsUserSession; + public bool IsRdpSession; + public bool IsLocalAdmin; + public DateTime? LogonTime; + public TimeSpan? IdleTime; + public DateTime? DisconnectTime; + public string ClientName; + public string ClientProtocolType; + public string ClientDirectory; + public int ClientBuildNumber; + } + + [StructLayout(LayoutKind.Sequential)] + private struct WTS_SESSION_INFO + { + public Int32 SessionId; + [MarshalAs(UnmanagedType.LPStr)] + public string SessionName; + public WTS_CONNECTSTATE_CLASS State; + } + + [StructLayout(LayoutKind.Sequential)] + public struct WINSTATIONINFORMATIONW + { + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 70)] + private byte[] Reserved1; + public int SessionId; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + private byte[] Reserved2; + public FILETIME ConnectTime; + public FILETIME DisconnectTime; + public FILETIME LastInputTime; + public FILETIME LoginTime; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1096)] + private byte[] Reserved3; + public FILETIME CurrentTime; + } + + public enum WINSTATIONINFOCLASS + { + WinStationInformation = 8 + } + + public enum WTS_CONNECTSTATE_CLASS + { + Active, + Connected, + ConnectQuery, + Shadow, + Disconnected, + Idle, + Listen, + Reset, + Down, + Init + } + + public enum WTS_INFO_CLASS + { + SessionId=4, + UserName, + SessionName, + DomainName, + ConnectState, + ClientBuildNumber, + ClientName, + ClientDirectory, + ClientProtocolType=16 + } + + private static IntPtr OpenServer(string Name) + { + IntPtr server = WTSOpenServer(Name); + return server; + } + + private static void CloseServer(IntPtr ServerHandle) + { + WTSCloseServer(ServerHandle); + } + + private static IList PtrToStructureList(IntPtr ppList, int count) where T : struct + { + List result = new List(); + long pointer = ppList.ToInt64(); + int sizeOf = Marshal.SizeOf(typeof(T)); + + for (int index = 0; index < count; index++) + { + T item = (T) Marshal.PtrToStructure(new IntPtr(pointer), typeof(T)); + result.Add(item); + pointer += sizeOf; + } + return result; + } + + public static DateTime? FileTimeToDateTime(FILETIME ft) + { + if (ft.dwHighDateTime == 0 && ft.dwLowDateTime == 0) + { + return null; + } + long hFT = (((long) ft.dwHighDateTime) << 32) + ft.dwLowDateTime; + return DateTime.FromFileTime(hFT); + } + + public static WINSTATIONINFORMATIONW GetWinStationInformation(IntPtr server, int sessionId) + { + int retLen = 0; + WINSTATIONINFORMATIONW wsInfo = new WINSTATIONINFORMATIONW(); + WinStationQueryInformation(server, sessionId, (int) WINSTATIONINFOCLASS.WinStationInformation, ref wsInfo, Marshal.SizeOf(typeof(WINSTATIONINFORMATIONW)), ref retLen); + return wsInfo; + } + + public static TerminalSessionData[] ListSessions(string ServerName) + { + IntPtr server = IntPtr.Zero; + if (ServerName == "localhost" || ServerName == String.Empty) + { + ServerName = Environment.MachineName; + } + + List results = new List(); + + try + { + server = OpenServer(ServerName); + IntPtr ppSessionInfo = IntPtr.Zero; + int count; + bool _isUserSession = false; + IList sessionsInfo; + + if (WTSEnumerateSessions(server, 0, 1, out ppSessionInfo, out count) == 0) + { + throw new Win32Exception(); + } + + try + { + sessionsInfo = PtrToStructureList(ppSessionInfo, count); + } + finally + { + WTSFreeMemory(ppSessionInfo); + } + + foreach (WTS_SESSION_INFO sessionInfo in sessionsInfo) + { + if (sessionInfo.SessionName != "Services" && sessionInfo.SessionName != "RDP-Tcp") + { + _isUserSession = true; + } + results.Add(new TerminalSessionData(sessionInfo.SessionId, sessionInfo.State.ToString(), sessionInfo.SessionName, _isUserSession)); + _isUserSession = false; + } + } + finally + { + CloseServer(server); + } + + TerminalSessionData[] returnData = results.ToArray(); + return returnData; + } + + public static TerminalSessionInfo GetSessionInfo(string ServerName, int SessionId) + { + IntPtr server = IntPtr.Zero; + IntPtr buffer = IntPtr.Zero; + int bytesReturned; + TerminalSessionInfo data = new TerminalSessionInfo(); + bool _IsCurrentSessionId = false; + bool _IsConsoleSession = false; + bool _IsUserSession = false; + int currentSessionID = 0; + string _NTAccount = String.Empty; + if (ServerName == "localhost" || ServerName == String.Empty) + { + ServerName = Environment.MachineName; + } + if (ProcessIdToSessionId(GetCurrentProcessId(), ref currentSessionID) == false) + { + currentSessionID = -1; + } + + // Get all members of the local administrators group + bool _IsLocalAdminCheckSuccess = false; + List localAdminGroupSidsList = new List(); + try + { + DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + ServerName + ",Computer"); + string localAdminGroupName = new SecurityIdentifier("S-1-5-32-544").Translate(typeof(NTAccount)).Value.Split('\\')[1]; + DirectoryEntry admGroup = localMachine.Children.Find(localAdminGroupName, "group"); + object members = admGroup.Invoke("members", null); + string validSidPattern = @"^S-\d-\d+-(\d+-){1,14}\d+$"; + foreach (object groupMember in (IEnumerable)members) + { + DirectoryEntry member = new DirectoryEntry(groupMember); + if (member.Name != String.Empty) + { + if (Regex.IsMatch(member.Name, validSidPattern)) + { + localAdminGroupSidsList.Add(member.Name); + } + else + { + localAdminGroupSidsList.Add((new NTAccount(member.Name)).Translate(typeof(SecurityIdentifier)).Value); + } + } + } + _IsLocalAdminCheckSuccess = true; + } + catch { } + + try + { + server = OpenServer(ServerName); + + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.ClientBuildNumber, out buffer, out bytesReturned) == false) + { + return data; + } + int lData = Marshal.ReadInt32(buffer); + data.ClientBuildNumber = lData; + + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.ClientDirectory, out buffer, out bytesReturned) == false) + { + return data; + } + string strData = Marshal.PtrToStringAnsi(buffer); + data.ClientDirectory = strData; + + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.ClientName, out buffer, out bytesReturned) == false) + { + return data; + } + strData = Marshal.PtrToStringAnsi(buffer); + data.ClientName = strData; + + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.ClientProtocolType, out buffer, out bytesReturned) == false) + { + return data; + } + Int16 intData = Marshal.ReadInt16(buffer); + if (intData == 2) + { + strData = "RDP"; + data.IsRdpSession = true; + } + else + { + strData = ""; + data.IsRdpSession = false; + } + data.ClientProtocolType = strData; + + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.ConnectState, out buffer, out bytesReturned) == false) + { + return data; + } + lData = Marshal.ReadInt32(buffer); + data.ConnectState = ((WTS_CONNECTSTATE_CLASS) lData).ToString(); + + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.SessionId, out buffer, out bytesReturned) == false) + { + return data; + } + lData = Marshal.ReadInt32(buffer); + data.SessionId = lData; + + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.DomainName, out buffer, out bytesReturned) == false) + { + return data; + } + strData = Marshal.PtrToStringAnsi(buffer).ToUpper(); + data.DomainName = strData; + if (strData != String.Empty) + { + _NTAccount = strData; + } + + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.UserName, out buffer, out bytesReturned) == false) + { + return data; + } + strData = Marshal.PtrToStringAnsi(buffer); + data.UserName = strData; + if (strData != String.Empty) + { + data.NTAccount = _NTAccount + "\\" + strData; + string _Sid = (new NTAccount(_NTAccount + "\\" + strData)).Translate(typeof(SecurityIdentifier)).Value; + data.SID = _Sid; + if (_IsLocalAdminCheckSuccess == true) + { + foreach (string localAdminGroupSid in localAdminGroupSidsList) + { + if (localAdminGroupSid == _Sid) + { + data.IsLocalAdmin = true; + break; + } + else + { + data.IsLocalAdmin = false; + } + } + } + } + + if (WTSQuerySessionInformation(server, SessionId, WTS_INFO_CLASS.SessionName, out buffer, out bytesReturned) == false) + { + return data; + } + strData = Marshal.PtrToStringAnsi(buffer); + data.SessionName = strData; + if (strData != "Services" && strData != "RDP-Tcp" && data.UserName != String.Empty) + { + _IsUserSession = true; + } + data.IsUserSession = _IsUserSession; + if (strData == "Console") + { + _IsConsoleSession = true; + } + data.IsConsoleSession = _IsConsoleSession; + + WINSTATIONINFORMATIONW wsInfo = GetWinStationInformation(server, SessionId); + DateTime? _loginTime = FileTimeToDateTime(wsInfo.LoginTime); + DateTime? _lastInputTime = FileTimeToDateTime(wsInfo.LastInputTime); + DateTime? _disconnectTime = FileTimeToDateTime(wsInfo.DisconnectTime); + DateTime? _currentTime = FileTimeToDateTime(wsInfo.CurrentTime); + TimeSpan? _idleTime = (_currentTime != null && _lastInputTime != null) ? _currentTime.Value - _lastInputTime.Value : TimeSpan.Zero; + data.LogonTime = _loginTime; + data.IdleTime = _idleTime; + data.DisconnectTime = _disconnectTime; + + if (currentSessionID == SessionId) + { + _IsCurrentSessionId = true; + } + data.IsCurrentSession = _IsCurrentSessionId; + } + finally + { + WTSFreeMemory(buffer); + buffer = IntPtr.Zero; + CloseServer(server); + } + return data; + } + + public static TerminalSessionInfo[] GetUserSessionInfo(string ServerName) + { + if (ServerName == "localhost" || ServerName == String.Empty) + { + ServerName = Environment.MachineName; + } + + // Find and get detailed information for all user sessions + // Also determine the active user session. If a console user exists, then that will be the active user session. + // If no console user exists but users are logged in, such as on terminal servers, then select the first logged-in non-console user that is either 'Active' or 'Connected' as the active user. + TerminalSessionData[] sessions = ListSessions(ServerName); + TerminalSessionInfo sessionInfo = new TerminalSessionInfo(); + List userSessionsInfo = new List(); + string firstActiveUserNTAccount = String.Empty; + bool IsActiveUserSessionSet = false; + foreach (TerminalSessionData session in sessions) + { + if (session.IsUserSession == true) + { + sessionInfo = GetSessionInfo(ServerName, session.SessionId); + if (sessionInfo.IsUserSession == true) + { + if ((firstActiveUserNTAccount == String.Empty) && (sessionInfo.ConnectState == "Active" || sessionInfo.ConnectState == "Connected")) + { + firstActiveUserNTAccount = sessionInfo.NTAccount; + } + + if (sessionInfo.IsConsoleSession == true) + { + sessionInfo.IsActiveUserSession = true; + IsActiveUserSessionSet = true; + } + else + { + sessionInfo.IsActiveUserSession = false; + } + + userSessionsInfo.Add(sessionInfo); + } + } + } + + TerminalSessionInfo[] userSessions = userSessionsInfo.ToArray(); + if (IsActiveUserSessionSet == false) + { + foreach (TerminalSessionInfo userSession in userSessions) + { + if (userSession.NTAccount == firstActiveUserNTAccount) + { + userSession.IsActiveUserSession = true; + break; + } + } + } + + return userSessions; + } + } +} diff --git a/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitMain.ps1 b/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitMain.ps1 new file mode 100644 index 0000000..8b7bc24 --- /dev/null +++ b/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/AppDeployToolkitMain.ps1 @@ -0,0 +1,16385 @@ +<# +.SYNOPSIS + +PSAppDeployToolkit - This script contains the PSADT core runtime and functions using by a Deploy-Application.ps1 script. + +.DESCRIPTION + +The script can be called directly to dot-source the toolkit functions for testing, but it is usually called by the Deploy-Application.ps1 script. + +The script can usually be updated to the latest version without impacting your per-application Deploy-Application scripts. Please check release notes before upgrading. + +PSAppDeployToolkit is licensed under the GNU LGPLv3 License - (C) 2023 PSAppDeployToolkit Team (Sean Lillis, Dan Cunningham and Muhammad Mashwani). + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the +Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . + +.PARAMETER CleanupBlockedApps + +Clean up the blocked applications. + +This parameter is passed to the script when it is called externally, e.g. from a scheduled task or asynchronously. + +.PARAMETER ShowBlockedAppDialog + +Display a dialog box showing that the application execution is blocked. +This parameter is passed to the script when it is called externally, e.g. from a scheduled task or asynchronously. + +.PARAMETER ReferredInstallName + +Name of the referring application that invoked the script externally. +This parameter is passed to the script when it is called externally, e.g. from a scheduled task or asynchronously. + +.PARAMETER ReferredInstallTitle + +Title of the referring application that invoked the script externally. +This parameter is passed to the script when it is called externally, e.g. from a scheduled task or asynchronously. + +.PARAMETER ReferredLogname + +Logfile name of the referring application that invoked the script externally. +This parameter is passed to the script when it is called externally, e.g. from a scheduled task or asynchronously. + +.PARAMETER AsyncToolkitLaunch + +This parameter is passed to the script when it is being called externally, e.g. from a scheduled task or asynchronously. + +.INPUTS + +None + +You cannot pipe objects to this script. + +.OUTPUTS + +None + +This script does not generate any output. + +.NOTES + +The other parameters specified for this script that are not documented in this help section are for use only by functions in this script that call themselves by running this script again asynchronously. + +.LINK + +https://psappdeploytoolkit.com +#> + + +[CmdletBinding()] +Param ( + ## Script Parameters: These parameters are passed to the script when it is called externally from a scheduled task or because of an Image File Execution Options registry setting + [Switch]$ShowInstallationPrompt = $false, + [Switch]$ShowInstallationRestartPrompt = $false, + [Switch]$CleanupBlockedApps = $false, + [Switch]$ShowBlockedAppDialog = $false, + [Switch]$DisableLogging = $false, + [String]$ReferredInstallName = '', + [String]$ReferredInstallTitle = '', + [String]$ReferredLogName = '', + [String]$Title = '', + [String]$Message = '', + [String]$MessageAlignment = '', + [String]$ButtonRightText = '', + [String]$ButtonLeftText = '', + [String]$ButtonMiddleText = '', + [String]$Icon = '', + [String]$Timeout = '', + [Switch]$ExitOnTimeout = $false, + [Boolean]$MinimizeWindows = $false, + [Switch]$PersistPrompt = $false, + [Int32]$CountdownSeconds = 60, + [Int32]$CountdownNoHideSeconds = 30, + [Switch]$NoCountdown = $false, + [Switch]$AsyncToolkitLaunch = $false, + [Boolean]$TopMost = $true +) + +##*============================================= +##* VARIABLE DECLARATION +##*============================================= +#region VariableDeclaration + +## Variables: Toolkit Name +[String]$appDeployToolkitName = 'PSAppDeployToolkit' +[String]$appDeployMainScriptFriendlyName = 'App Deploy Toolkit Main' + +## Variables: Script Info +[Version]$appDeployMainScriptVersion = [Version]'3.9.3' +[Version]$appDeployMainScriptMinimumConfigVersion = [Version]'3.9.3' +[String]$appDeployMainScriptDate = '02/05/2023' +[Hashtable]$appDeployMainScriptParameters = $PSBoundParameters + +## Variables: Datetime and Culture +[DateTime]$currentDateTime = Get-Date +[String]$currentTime = Get-Date -Date $currentDateTime -UFormat '%T' +[String]$currentDate = Get-Date -Date $currentDateTime -UFormat '%d-%m-%Y' +[Timespan]$currentTimeZoneBias = [TimeZone]::CurrentTimeZone.GetUtcOffset($currentDateTime) +[Globalization.CultureInfo]$culture = Get-Culture +[String]$currentLanguage = $culture.TwoLetterISOLanguageName.ToUpper() +[Globalization.CultureInfo]$uiculture = Get-UICulture +[String]$currentUILanguage = $uiculture.TwoLetterISOLanguageName.ToUpper() + +## Variables: Environment Variables +[PSObject]$envHost = $Host +[PSObject]$envShellFolders = Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders' -ErrorAction 'SilentlyContinue' +[String]$envAllUsersProfile = $env:ALLUSERSPROFILE +[String]$envAppData = [Environment]::GetFolderPath('ApplicationData') +[String]$envArchitecture = $env:PROCESSOR_ARCHITECTURE +[String]$envCommonDesktop = $envShellFolders | Select-Object -ExpandProperty 'Common Desktop' -ErrorAction 'SilentlyContinue' +[String]$envCommonDocuments = $envShellFolders | Select-Object -ExpandProperty 'Common Documents' -ErrorAction 'SilentlyContinue' +[String]$envCommonStartMenuPrograms = $envShellFolders | Select-Object -ExpandProperty 'Common Programs' -ErrorAction 'SilentlyContinue' +[String]$envCommonStartMenu = $envShellFolders | Select-Object -ExpandProperty 'Common Start Menu' -ErrorAction 'SilentlyContinue' +[String]$envCommonStartUp = $envShellFolders | Select-Object -ExpandProperty 'Common Startup' -ErrorAction 'SilentlyContinue' +[String]$envCommonTemplates = $envShellFolders | Select-Object -ExpandProperty 'Common Templates' -ErrorAction 'SilentlyContinue' +[String]$envComputerName = [Environment]::MachineName.ToUpper() +[String]$envHomeDrive = $env:HOMEDRIVE +[String]$envHomePath = $env:HOMEPATH +[String]$envHomeShare = $env:HOMESHARE +[String]$envLocalAppData = [Environment]::GetFolderPath('LocalApplicationData') +[String[]]$envLogicalDrives = [Environment]::GetLogicalDrives() +[String]$envProgramData = [Environment]::GetFolderPath('CommonApplicationData') +[String]$envPublic = $env:PUBLIC +[String]$envSystemDrive = $env:SYSTEMDRIVE +[String]$envSystemRoot = $env:SYSTEMROOT +[String]$envTemp = [IO.Path]::GetTempPath() +[String]$envUserCookies = [Environment]::GetFolderPath('Cookies') +[String]$envUserDesktop = [Environment]::GetFolderPath('DesktopDirectory') +[String]$envUserFavorites = [Environment]::GetFolderPath('Favorites') +[String]$envUserInternetCache = [Environment]::GetFolderPath('InternetCache') +[String]$envUserInternetHistory = [Environment]::GetFolderPath('History') +[String]$envUserMyDocuments = [Environment]::GetFolderPath('MyDocuments') +[String]$envUserName = [Environment]::UserName +[String]$envUserPictures = [Environment]::GetFolderPath('MyPictures') +[String]$envUserProfile = $env:USERPROFILE +[String]$envUserSendTo = [Environment]::GetFolderPath('SendTo') +[String]$envUserStartMenu = [Environment]::GetFolderPath('StartMenu') +[String]$envUserStartMenuPrograms = [Environment]::GetFolderPath('Programs') +[String]$envUserStartUp = [Environment]::GetFolderPath('StartUp') +[String]$envUserTemplates = [Environment]::GetFolderPath('Templates') +[String]$envSystem32Directory = [Environment]::SystemDirectory +[String]$envWinDir = $env:WINDIR + +## Variables: Domain Membership +[Boolean]$IsMachinePartOfDomain = (Get-WmiObject -Class 'Win32_ComputerSystem' -ErrorAction 'SilentlyContinue').PartOfDomain +[String]$envMachineWorkgroup = '' +[String]$envMachineADDomain = '' +[String]$envLogonServer = '' +[String]$MachineDomainController = '' +[String]$envComputerNameFQDN = $envComputerName +If ($IsMachinePartOfDomain) { + [String]$envMachineADDomain = (Get-WmiObject -Class 'Win32_ComputerSystem' -ErrorAction 'SilentlyContinue').Domain | Where-Object { $_ } | ForEach-Object { $_.ToLower() } + Try { + $envComputerNameFQDN = ([Net.Dns]::GetHostEntry('localhost')).HostName + } + Catch { + # Function GetHostEntry failed, but we can construct the FQDN in another way + $envComputerNameFQDN = $envComputerNameFQDN + '.' + $envMachineADDomain + } + + Try { + [String]$envLogonServer = $env:LOGONSERVER | Where-Object { (($_) -and (-not $_.Contains('\\MicrosoftAccount'))) } | ForEach-Object { $_.TrimStart('\') } | ForEach-Object { ([Net.Dns]::GetHostEntry($_)).HostName } + } + Catch { + } + # If running in system context or if GetHostEntry fails, fall back on the logonserver value stored in the registry + If (-not $envLogonServer) { + [String]$envLogonServer = Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\History' -ErrorAction 'SilentlyContinue' | Select-Object -ExpandProperty 'DCName' -ErrorAction 'SilentlyContinue' + } + ## Remove backslashes at the beginning + While ($envLogonServer.StartsWith('\')) { + $envLogonServer = $envLogonServer.Substring(1) + } + + Try { + [String]$MachineDomainController = [DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().FindDomainController().Name + } + Catch { + } +} +Else { + [String]$envMachineWorkgroup = (Get-WmiObject -Class 'Win32_ComputerSystem' -ErrorAction 'SilentlyContinue').Domain | Where-Object { $_ } | ForEach-Object { $_.ToUpper() } +} +[String]$envMachineDNSDomain = [Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties().DomainName | Where-Object { $_ } | ForEach-Object { $_.ToLower() } +[String]$envUserDNSDomain = $env:USERDNSDOMAIN | Where-Object { $_ } | ForEach-Object { $_.ToLower() } +Try { + [String]$envUserDomain = [Environment]::UserDomainName.ToUpper() +} +Catch { +} + +## Variables: Operating System +[PSObject]$envOS = Get-WmiObject -Class 'Win32_OperatingSystem' -ErrorAction 'SilentlyContinue' +[String]$envOSName = $envOS.Caption.Trim() +[String]$envOSServicePack = $envOS.CSDVersion +[Version]$envOSVersion = $envOS.Version +[String]$envOSVersionMajor = $envOSVersion.Major +[String]$envOSVersionMinor = $envOSVersion.Minor +[String]$envOSVersionBuild = $envOSVersion.Build +If ((Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -ErrorAction 'SilentlyContinue').PSObject.Properties.Name -contains 'UBR') { + [String]$envOSVersionRevision = (Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name 'UBR' -ErrorAction 'SilentlyContinue').UBR +} +ElseIf ((Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -ErrorAction 'SilentlyContinue').PSObject.Properties.Name -contains 'BuildLabEx') { + [String]$envOSVersionRevision = , ((Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name 'BuildLabEx' -ErrorAction 'SilentlyContinue').BuildLabEx -split '\.') | ForEach-Object { $_[1] } +} +If ($envOSVersionRevision -notmatch '^[\d\.]+$') { $envOSVersionRevision = '' } +If ($envOSVersionRevision) { [string]$envOSVersion = "$($envOSVersion.ToString()).$envOSVersionRevision" } Else { [string]$envOSVersion = "$($envOSVersion.ToString())" } +# Get the operating system type +[int32]$envOSProductType = $envOS.ProductType +[boolean]$IsServerOS = [boolean]($envOSProductType -eq 3) +[boolean]$IsDomainControllerOS = [boolean]($envOSProductType -eq 2) +[boolean]$IsWorkStationOS = [boolean]($envOSProductType -eq 1) +[boolean]$IsMultiSessionOS = [boolean]($envOSName -match '^Microsoft Windows \d+ Enterprise for Virtual Desktops$') +Switch ($envOSProductType) { + 3 { [string]$envOSProductTypeName = 'Server' } + 2 { [string]$envOSProductTypeName = 'Domain Controller' } + 1 { [string]$envOSProductTypeName = 'Workstation' } + Default { [string]$envOSProductTypeName = 'Unknown' } +} +# Get the OS Architecture +[Boolean]$Is64Bit = [Boolean]((Get-WmiObject -Class 'Win32_Processor' -ErrorAction 'SilentlyContinue' | Where-Object { $_.DeviceID -eq 'CPU0' } | Select-Object -ExpandProperty 'AddressWidth') -eq 64) +If ($Is64Bit) { + [String]$envOSArchitecture = '64-bit' +} +Else { + [String]$envOSArchitecture = '32-bit' +} + +## Variables: Current Process Architecture +[Boolean]$Is64BitProcess = [Boolean]([IntPtr]::Size -eq 8) +If ($Is64BitProcess) { + [String]$psArchitecture = 'x64' +} +Else { + [String]$psArchitecture = 'x86' +} + +## Variables: Get Normalized ProgramFiles and CommonProgramFiles Paths +[String]$envProgramFiles = '' +[String]$envProgramFilesX86 = '' +[String]$envCommonProgramFiles = '' +[String]$envCommonProgramFilesX86 = '' +If ($Is64Bit) { + If ($Is64BitProcess) { + [String]$envProgramFiles = [Environment]::GetFolderPath('ProgramFiles') + [String]$envCommonProgramFiles = [Environment]::GetFolderPath('CommonProgramFiles') + } + Else { + [String]$envProgramFiles = [Environment]::GetEnvironmentVariable('ProgramW6432') + [String]$envCommonProgramFiles = [Environment]::GetEnvironmentVariable('CommonProgramW6432') + } + ## Powershell 2 doesn't support X86 folders so need to use variables instead + Try { + [String]$envProgramFilesX86 = [Environment]::GetFolderPath('ProgramFilesX86') + [String]$envCommonProgramFilesX86 = [Environment]::GetFolderPath('CommonProgramFilesX86') + } + Catch { + [String]$envProgramFilesX86 = [Environment]::GetEnvironmentVariable('ProgramFiles(x86)') + [String]$envCommonProgramFilesX86 = [Environment]::GetEnvironmentVariable('CommonProgramFiles(x86)') + } +} +Else { + [String]$envProgramFiles = [Environment]::GetFolderPath('ProgramFiles') + [String]$envProgramFilesX86 = $envProgramFiles + [String]$envCommonProgramFiles = [Environment]::GetFolderPath('CommonProgramFiles') + [String]$envCommonProgramFilesX86 = $envCommonProgramFiles +} + +## Variables: Office C2R version, bitness and channel +If ((Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' -ErrorAction 'SilentlyContinue').PSObject.Properties.Name -contains 'VersionToReport') { + [String]$envOfficeVersion = (Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' -Name 'VersionToReport' -ErrorAction 'SilentlyContinue').VersionToReport +} +If ((Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' -ErrorAction 'SilentlyContinue').PSObject.Properties.Name -contains 'Platform') { + [String]$envOfficeBitness = (Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' -Name 'Platform' -ErrorAction 'SilentlyContinue').Platform +} +If ((Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' -ErrorAction 'SilentlyContinue').PSObject.Properties.Name -contains 'CDNBaseURL') { + [String]$envOfficeCDNBaseURL = (Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration' -Name 'CDNBaseURL' -ErrorAction 'SilentlyContinue').CDNBaseURL + Switch -regex ([String]$envofficeCDNBaseURL) { + "492350f6-3a01-4f97-b9c0-c7c6ddf67d60" {$envOfficeChannel = "monthly"} + "7ffbc6bf-bc32-4f92-8982-f9dd17fd3114" {$envOfficeChannel = "semi-annual"} + "64256afe-f5d9-4f86-8936-8840a6a4f5be" {$envOfficeChannel = "monthly targeted"} + "b8f9b850-328d-4355-9145-c59439a0c4cf" {$envOfficeChannel = "semi-annual targeted"} + } +} + +## Variables: Hardware +[Int32]$envSystemRAM = Get-WmiObject -Class 'Win32_PhysicalMemory' -ErrorAction 'SilentlyContinue' | Measure-Object -Property 'Capacity' -Sum -ErrorAction 'SilentlyContinue' | ForEach-Object { [Math]::Round(($_.Sum / 1GB), 2) } + +## Variables: PowerShell And CLR (.NET) Versions +[Hashtable]$envPSVersionTable = $PSVersionTable +# PowerShell Version +[Version]$envPSVersion = $envPSVersionTable.PSVersion +[String]$envPSVersionMajor = $envPSVersion.Major +[String]$envPSVersionMinor = $envPSVersion.Minor +[String]$envPSVersionBuild = $envPSVersion.Build +[String]$envPSVersionRevision = $envPSVersion.Revision +[String]$envPSVersion = $envPSVersion.ToString() +# CLR (.NET) Version used by PowerShell +[Version]$envCLRVersion = $envPSVersionTable.CLRVersion +[String]$envCLRVersionMajor = $envCLRVersion.Major +[String]$envCLRVersionMinor = $envCLRVersion.Minor +[String]$envCLRVersionBuild = $envCLRVersion.Build +[String]$envCLRVersionRevision = $envCLRVersion.Revision +[String]$envCLRVersion = $envCLRVersion.ToString() + +## Variables: Permissions/Accounts +[Security.Principal.WindowsIdentity]$CurrentProcessToken = [Security.Principal.WindowsIdentity]::GetCurrent() +[Security.Principal.SecurityIdentifier]$CurrentProcessSID = $CurrentProcessToken.User +[String]$ProcessNTAccount = $CurrentProcessToken.Name +[String]$ProcessNTAccountSID = $CurrentProcessSID.Value +[Boolean]$IsAdmin = [Boolean]($CurrentProcessToken.Groups -contains [Security.Principal.SecurityIdentifier]'S-1-5-32-544') +[Boolean]$IsLocalSystemAccount = $CurrentProcessSID.IsWellKnown([Security.Principal.WellKnownSidType]'LocalSystemSid') +[Boolean]$IsLocalServiceAccount = $CurrentProcessSID.IsWellKnown([Security.Principal.WellKnownSidType]'LocalServiceSid') +[Boolean]$IsNetworkServiceAccount = $CurrentProcessSID.IsWellKnown([Security.Principal.WellKnownSidType]'NetworkServiceSid') +[Boolean]$IsServiceAccount = [Boolean]($CurrentProcessToken.Groups -contains [Security.Principal.SecurityIdentifier]'S-1-5-6') +[Boolean]$IsProcessUserInteractive = [Environment]::UserInteractive +$GetAccountNameUsingSid = [ScriptBlock] { + Param ( + [String]$SecurityIdentifier = $null + ) + + Try { + Return (New-Object -TypeName 'System.Security.Principal.SecurityIdentifier' -ArgumentList ([Security.Principal.WellKnownSidType]::"$SecurityIdentifier", $null)).Translate([System.Security.Principal.NTAccount]).Value + } + Catch { + Return ($null) + } +} +[String]$LocalSystemNTAccount = & $GetAccountNameUsingSid 'LocalSystemSid' +[String]$LocalUsersGroup = & $GetAccountNameUsingSid 'BuiltinUsersSid' +# Test if the current Windows is a Home edition +Try { + If (!((Get-WmiObject -Class Win32_OperatingSystem | Select -Expand Caption) -like "*Home*")){ + [string]$LocalPowerUsersGroup = & $GetAccountNameUsingSid 'BuiltinPowerUsersSid' + } +} +Catch{} +[String]$LocalAdministratorsGroup = & $GetAccountNameUsingSid 'BuiltinAdministratorsSid' +# Check if script is running in session zero +If ($IsLocalSystemAccount -or $IsLocalServiceAccount -or $IsNetworkServiceAccount -or $IsServiceAccount) { + $SessionZero = $true +} +Else { + $SessionZero = $false +} + +## Variables: Script Name and Script Paths +[String]$scriptPath = $MyInvocation.MyCommand.Definition +[String]$scriptName = [IO.Path]::GetFileNameWithoutExtension($scriptPath) +[String]$scriptFileName = Split-Path -Path $scriptPath -Leaf +[String]$scriptRoot = Split-Path -Path $scriptPath -Parent +[String]$invokingScript = (Get-Variable -Name 'MyInvocation').Value.ScriptName +# Get the invoking script directory +If ($invokingScript) { + # If this script was invoked by another script + [String]$scriptParentPath = Split-Path -Path $invokingScript -Parent +} +Else { + # If this script was not invoked by another script, fall back to the directory one level above this script + [String]$scriptParentPath = (Get-Item -LiteralPath $scriptRoot).Parent.FullName +} + +## Variables: App Deploy Script Dependency Files +[String]$appDeployConfigFile = Join-Path -Path $scriptRoot -ChildPath 'AppDeployToolkitConfig.xml' +[String]$appDeployCustomTypesSourceCode = Join-Path -Path $scriptRoot -ChildPath 'AppDeployToolkitMain.cs' +If (-not (Test-Path -LiteralPath $appDeployConfigFile -PathType 'Leaf')) { + Throw 'App Deploy XML configuration file not found.' +} +If (-not (Test-Path -LiteralPath $appDeployCustomTypesSourceCode -PathType 'Leaf')) { + Throw 'App Deploy custom types source code file not found.' +} + +# App Deploy Optional Extensions File +[String]$appDeployToolkitDotSourceExtensions = 'AppDeployToolkitExtensions.ps1' + +## Import variables from XML configuration file +[Xml.XmlDocument]$xmlConfigFile = Get-Content -LiteralPath $AppDeployConfigFile -Encoding 'UTF8' +[Xml.XmlElement]$xmlConfig = $xmlConfigFile.AppDeployToolkit_Config +# Get Config File Details +[Xml.XmlElement]$configConfigDetails = $xmlConfig.Config_File +[String]$configConfigVersion = [Version]$configConfigDetails.Config_Version +[String]$configConfigDate = $configConfigDetails.Config_Date + +# Get Banner and Icon details +[Xml.XmlElement]$xmlBannerIconOptions = $xmlConfig.BannerIcon_Options +[String]$configBannerIconFileName = $xmlBannerIconOptions.Icon_Filename +[String]$configBannerLogoImageFileName = $xmlBannerIconOptions.LogoImage_Filename +[String]$configBannerIconBannerName = $xmlBannerIconOptions.Banner_Filename +[Int32]$appDeployLogoBannerMaxHeight = $xmlBannerIconOptions.Banner_MaxHeight + +# Get Toast Notification Options +[Xml.XmlElement]$xmlToastOptions = $xmlConfig.Toast_Options +[String]$configToastDisable = $xmlToastOptions.Toast_Disable +[String]$configToastAppName = $xmlToastOptions.Toast_AppName + +[String]$appDeployLogoIcon = Join-Path -Path $scriptRoot -ChildPath $configBannerIconFileName +[String]$appDeployLogoImage = Join-Path -Path $scriptRoot -ChildPath $configBannerLogoImageFileName +[String]$appDeployLogoBanner = Join-Path -Path $scriptRoot -ChildPath $configBannerIconBannerName +# Check that dependency files are present +If (-not (Test-Path -LiteralPath $appDeployLogoIcon -PathType 'Leaf')) { + Throw 'App Deploy logo icon file not found.' +} +If (-not (Test-Path -LiteralPath $appDeployLogoBanner -PathType 'Leaf')) { + Throw 'App Deploy logo banner file not found.' +} + +# Get Toolkit Options +[Xml.XmlElement]$xmlToolkitOptions = $xmlConfig.Toolkit_Options +[Boolean]$configToolkitRequireAdmin = [Boolean]::Parse($xmlToolkitOptions.Toolkit_RequireAdmin) +[String]$configToolkitTempPath = $ExecutionContext.InvokeCommand.ExpandString($xmlToolkitOptions.Toolkit_TempPath) +[String]$configToolkitRegPath = $xmlToolkitOptions.Toolkit_RegPath +[String]$configToolkitLogDir = $ExecutionContext.InvokeCommand.ExpandString($xmlToolkitOptions.Toolkit_LogPath) +[Boolean]$configToolkitCompressLogs = [Boolean]::Parse($xmlToolkitOptions.Toolkit_CompressLogs) +[String]$configToolkitLogStyle = $xmlToolkitOptions.Toolkit_LogStyle +[Double]$configToolkitLogMaxSize = $xmlToolkitOptions.Toolkit_LogMaxSize +[Boolean]$configToolkitLogWriteToHost = [Boolean]::Parse($xmlToolkitOptions.Toolkit_LogWriteToHost) +[Boolean]$configToolkitLogDebugMessage = [Boolean]::Parse($xmlToolkitOptions.Toolkit_LogDebugMessage) +# Get MSI Options +[Xml.XmlElement]$xmlConfigMSIOptions = $xmlConfig.MSI_Options +[String]$configMSILoggingOptions = $xmlConfigMSIOptions.MSI_LoggingOptions +[String]$configMSIInstallParams = $ExecutionContext.InvokeCommand.ExpandString($xmlConfigMSIOptions.MSI_InstallParams) +[String]$configMSISilentParams = $ExecutionContext.InvokeCommand.ExpandString($xmlConfigMSIOptions.MSI_SilentParams) +[String]$configMSIUninstallParams = $ExecutionContext.InvokeCommand.ExpandString($xmlConfigMSIOptions.MSI_UninstallParams) +[String]$configMSILogDir = $ExecutionContext.InvokeCommand.ExpandString($xmlConfigMSIOptions.MSI_LogPath) +[Int32]$configMSIMutexWaitTime = $xmlConfigMSIOptions.MSI_MutexWaitTime +# Change paths to user accessible ones if RequireAdmin is false +If ($configToolkitRequireAdmin -eq $false) { + If ($xmlToolkitOptions.Toolkit_TempPathNoAdminRights) { + [String]$configToolkitTempPath = $ExecutionContext.InvokeCommand.ExpandString($xmlToolkitOptions.Toolkit_TempPathNoAdminRights) + } + If ($xmlToolkitOptions.Toolkit_RegPathNoAdminRights) { + [String]$configToolkitRegPath = $xmlToolkitOptions.Toolkit_RegPathNoAdminRights + } + If ($xmlToolkitOptions.Toolkit_LogPathNoAdminRights) { + [String]$configToolkitLogDir = $ExecutionContext.InvokeCommand.ExpandString($xmlToolkitOptions.Toolkit_LogPathNoAdminRights) + } + If ($xmlConfigMSIOptions.MSI_LogPathNoAdminRights) { + [String]$configMSILogDir = $ExecutionContext.InvokeCommand.ExpandString($xmlConfigMSIOptions.MSI_LogPathNoAdminRights) + } +} +# Get UI Options +[Xml.XmlElement]$xmlConfigUIOptions = $xmlConfig.UI_Options +[String]$configInstallationUILanguageOverride = $xmlConfigUIOptions.InstallationUI_LanguageOverride +[Boolean]$configShowBalloonNotifications = [Boolean]::Parse($xmlConfigUIOptions.ShowBalloonNotifications) +[Int32]$configInstallationUITimeout = $xmlConfigUIOptions.InstallationUI_Timeout +[Int32]$configInstallationUIExitCode = $xmlConfigUIOptions.InstallationUI_ExitCode +[Int32]$configInstallationDeferExitCode = $xmlConfigUIOptions.InstallationDefer_ExitCode +[Int32]$configInstallationPersistInterval = $xmlConfigUIOptions.InstallationPrompt_PersistInterval +[Int32]$configInstallationRestartPersistInterval = $xmlConfigUIOptions.InstallationRestartPrompt_PersistInterval +[Int32]$configInstallationPromptToSave = $xmlConfigUIOptions.InstallationPromptToSave_Timeout +[Boolean]$configInstallationWelcomePromptDynamicRunningProcessEvaluation = [Boolean]::Parse($xmlConfigUIOptions.InstallationWelcomePrompt_DynamicRunningProcessEvaluation) +[Int32]$configInstallationWelcomePromptDynamicRunningProcessEvaluationInterval = $xmlConfigUIOptions.InstallationWelcomePrompt_DynamicRunningProcessEvaluationInterval +# Define ScriptBlock for Loading Message UI Language Options (default for English if no localization found) +[ScriptBlock]$xmlLoadLocalizedUIMessages = { + # If a user is logged on, then get primary UI language for logged on user (even if running in session 0) + If ($RunAsActiveUser) { + # Read language defined by Group Policy + If (-not $HKULanguages) { + [String[]]$HKULanguages = Get-RegistryKey -Key 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\MUI\Settings' -Value 'PreferredUILanguages' + } + If (-not $HKULanguages) { + [String[]]$HKULanguages = Get-RegistryKey -Key 'Registry::HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Control Panel\Desktop' -Value 'PreferredUILanguages' -SID $RunAsActiveUser.SID + } + # Read language for Win Vista & higher machines + If (-not $HKULanguages) { + [String[]]$HKULanguages = Get-RegistryKey -Key 'Registry::HKEY_CURRENT_USER\Control Panel\Desktop' -Value 'PreferredUILanguages' -SID $RunAsActiveUser.SID + } + If (-not $HKULanguages) { + [String[]]$HKULanguages = Get-RegistryKey -Key 'Registry::HKEY_CURRENT_USER\Control Panel\Desktop\MuiCached' -Value 'MachinePreferredUILanguages' -SID $RunAsActiveUser.SID + } + If (-not $HKULanguages) { + [String[]]$HKULanguages = Get-RegistryKey -Key 'Registry::HKEY_CURRENT_USER\Control Panel\International' -Value 'LocaleName' -SID $RunAsActiveUser.SID + } + # Read language for Win XP machines + If (-not $HKULanguages) { + [String]$HKULocale = Get-RegistryKey -Key 'Registry::HKEY_CURRENT_USER\Control Panel\International' -Value 'Locale' -SID $RunAsActiveUser.SID + If ($HKULocale) { + [Int32]$HKULocale = [Convert]::ToInt32('0x' + $HKULocale, 16) + [String[]]$HKULanguages = ([Globalization.CultureInfo]($HKULocale)).Name + } + } + If ($HKULanguages) { + [Globalization.CultureInfo]$PrimaryWindowsUILanguage = [Globalization.CultureInfo]($HKULanguages[0]) + [String]$HKUPrimaryLanguageShort = $PrimaryWindowsUILanguage.TwoLetterISOLanguageName.ToUpper() + + # If the detected language is Chinese, determine if it is simplified or traditional Chinese + If ($HKUPrimaryLanguageShort -eq 'ZH') { + If ($PrimaryWindowsUILanguage.EnglishName -match 'Simplified') { + [String]$HKUPrimaryLanguageShort = 'ZH-Hans' + } + If ($PrimaryWindowsUILanguage.EnglishName -match 'Traditional') { + [String]$HKUPrimaryLanguageShort = 'ZH-Hant' + } + } + + # If the detected language is Portuguese, determine if it is Brazilian Portuguese + If ($HKUPrimaryLanguageShort -eq 'PT') { + If ($PrimaryWindowsUILanguage.ThreeLetterWindowsLanguageName -eq 'PTB') { + [String]$HKUPrimaryLanguageShort = 'PT-BR' + } + } + } + } + + If ($HKUPrimaryLanguageShort) { + # Use the primary UI language of the logged in user + [String]$xmlUIMessageLanguage = "UI_Messages_$HKUPrimaryLanguageShort" + } + Else { + # Default to UI language of the account executing current process (even if it is the SYSTEM account) + [String]$xmlUIMessageLanguage = "UI_Messages_$currentLanguage" + } + # Default to English if the detected UI language is not available in the XMl config file + If (-not ($xmlConfig.$xmlUIMessageLanguage)) { + [String]$xmlUIMessageLanguage = 'UI_Messages_EN' + } + # Override the detected language if the override option was specified in the XML config file + If ($configInstallationUILanguageOverride) { + [String]$xmlUIMessageLanguage = "UI_Messages_$configInstallationUILanguageOverride" + } + + [Xml.XmlElement]$xmlUIMessages = $xmlConfig.$xmlUIMessageLanguage + [String]$configDiskSpaceMessage = $xmlUIMessages.DiskSpace_Message + [String]$configBalloonTextStart = $xmlUIMessages.BalloonText_Start + [String]$configBalloonTextComplete = $xmlUIMessages.BalloonText_Complete + [String]$configBalloonTextRestartRequired = $xmlUIMessages.BalloonText_RestartRequired + [String]$configBalloonTextFastRetry = $xmlUIMessages.BalloonText_FastRetry + [String]$configBalloonTextError = $xmlUIMessages.BalloonText_Error + [String]$configProgressMessageInstall = $xmlUIMessages.Progress_MessageInstall + [String]$configProgressMessageUninstall = $xmlUIMessages.Progress_MessageUninstall + [String]$configProgressMessageRepair = $xmlUIMessages.Progress_MessageRepair + [String]$configClosePromptMessage = $xmlUIMessages.ClosePrompt_Message + [String]$configClosePromptButtonClose = $xmlUIMessages.ClosePrompt_ButtonClose + [String]$configClosePromptButtonDefer = $xmlUIMessages.ClosePrompt_ButtonDefer + [String]$configClosePromptButtonContinue = $xmlUIMessages.ClosePrompt_ButtonContinue + [String]$configClosePromptButtonContinueTooltip = $xmlUIMessages.ClosePrompt_ButtonContinueTooltip + [String]$configClosePromptCountdownMessage = $xmlUIMessages.ClosePrompt_CountdownMessage + [String]$configDeferPromptWelcomeMessage = $xmlUIMessages.DeferPrompt_WelcomeMessage + [String]$configDeferPromptExpiryMessage = $xmlUIMessages.DeferPrompt_ExpiryMessage + [String]$configDeferPromptWarningMessage = $xmlUIMessages.DeferPrompt_WarningMessage + [String]$configDeferPromptRemainingDeferrals = $xmlUIMessages.DeferPrompt_RemainingDeferrals + [String]$configDeferPromptDeadline = $xmlUIMessages.DeferPrompt_Deadline + [String]$configBlockExecutionMessage = $xmlUIMessages.BlockExecution_Message + [String]$configDeploymentTypeInstall = $xmlUIMessages.DeploymentType_Install + [String]$configDeploymentTypeUnInstall = $xmlUIMessages.DeploymentType_UnInstall + [String]$configDeploymentTypeRepair = $xmlUIMessages.DeploymentType_Repair + [String]$configRestartPromptTitle = $xmlUIMessages.RestartPrompt_Title + [String]$configRestartPromptMessage = $xmlUIMessages.RestartPrompt_Message + [String]$configRestartPromptMessageTime = $xmlUIMessages.RestartPrompt_MessageTime + [String]$configRestartPromptMessageRestart = $xmlUIMessages.RestartPrompt_MessageRestart + [String]$configRestartPromptTimeRemaining = $xmlUIMessages.RestartPrompt_TimeRemaining + [String]$configRestartPromptButtonRestartLater = $xmlUIMessages.RestartPrompt_ButtonRestartLater + [String]$configRestartPromptButtonRestartNow = $xmlUIMessages.RestartPrompt_ButtonRestartNow + [String]$configWelcomePromptCountdownMessage = $xmlUIMessages.WelcomePrompt_CountdownMessage + [String]$configWelcomePromptCustomMessage = $xmlUIMessages.WelcomePrompt_CustomMessage +} + +## Variables: Script Directories +[String]$dirFiles = Join-Path -Path $scriptParentPath -ChildPath 'Files' +[String]$dirSupportFiles = Join-Path -Path $scriptParentPath -ChildPath 'SupportFiles' +[String]$dirAppDeployTemp = Join-Path -Path $configToolkitTempPath -ChildPath $appDeployToolkitName + +If (-not (Test-Path -LiteralPath $dirAppDeployTemp -PathType 'Container' -ErrorAction 'SilentlyContinue')) { + $null = New-Item -Path $dirAppDeployTemp -ItemType 'Directory' -Force -ErrorAction 'SilentlyContinue' +} + +## Set the deployment type to "Install" if it has not been specified +If (-not $deploymentType) { + [String]$deploymentType = 'Install' +} + +## Variables: Executables +[String]$exeWusa = "$envWinDir\System32\wusa.exe" # Installs Standalone Windows Updates +[String]$exeMsiexec = "$envWinDir\System32\msiexec.exe" # Installs MSI Installers +[String]$exeSchTasks = "$envWinDir\System32\schtasks.exe" # Manages Scheduled Tasks + +## Variables: RegEx Patterns +[String]$MSIProductCodeRegExPattern = '^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$' + +## Variables: Invalid FileName Characters +[Char[]]$invalidFileNameChars = [IO.Path]::GetinvalidFileNameChars() + +## Variables: Registry Keys +# Registry keys for native and WOW64 applications +[String[]]$regKeyApplications = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall' +If ($is64Bit) { + [String]$regKeyLotusNotes = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Lotus\Notes' +} +Else { + [String]$regKeyLotusNotes = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Lotus\Notes' +} +[String]$regKeyAppExecution = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options' + +## COM Objects: Initialize +[__ComObject]$Shell = New-Object -ComObject 'WScript.Shell' -ErrorAction 'SilentlyContinue' +[__ComObject]$ShellApp = New-Object -ComObject 'Shell.Application' -ErrorAction 'SilentlyContinue' + +## Variables: Reset/Remove Variables +[Boolean]$msiRebootDetected = $false +[Boolean]$BlockExecution = $false +[Boolean]$installationStarted = $false +[Boolean]$runningTaskSequence = $false +If (Test-Path -LiteralPath 'variable:welcomeTimer') { + Remove-Variable -Name 'welcomeTimer' -Scope 'Script' +} +# Reset the deferral history +If (Test-Path -LiteralPath 'variable:deferHistory') { + Remove-Variable -Name 'deferHistory' +} +If (Test-Path -LiteralPath 'variable:deferTimes') { + Remove-Variable -Name 'deferTimes' +} +If (Test-Path -LiteralPath 'variable:deferDays') { + Remove-Variable -Name 'deferDays' +} + +## Variables: System DPI Scale Factor (Requires PSADT.UiAutomation loaded) +[ScriptBlock]$GetDisplayScaleFactor = { + # If a user is logged on, then get display scale factor for logged on user (even if running in session 0) + [Boolean]$UserDisplayScaleFactor = $false + [System.Drawing.Graphics]$GraphicsObject = $null + [IntPtr]$DeviceContextHandle = [IntPtr]::Zero + [Int32]$dpiScale = 0 + [Int32]$dpiPixels = 0 + + Try { + # Get Graphics Object from the current Window Handle + [System.Drawing.Graphics]$GraphicsObject = [System.Drawing.Graphics]::FromHwnd([IntPtr]::Zero) + # Get Device Context Handle + [IntPtr]$DeviceContextHandle = $GraphicsObject.GetHdc() + # Get Logical and Physical screen height + [Int32]$LogicalScreenHeight = [PSADT.UiAutomation]::GetDeviceCaps($DeviceContextHandle, [Int32][PSADT.UiAutomation+DeviceCap]::VERTRES) + [Int32]$PhysicalScreenHeight = [PSADT.UiAutomation]::GetDeviceCaps($DeviceContextHandle, [Int32][PSADT.UiAutomation+DeviceCap]::DESKTOPVERTRES) + # Calculate dpi scale and pixels + [Int32]$dpiScale = [Math]::Round([Double]$PhysicalScreenHeight / [Double]$LogicalScreenHeight, 2) * 100 + [Int32]$dpiPixels = [Math]::Round(($dpiScale / 100) * 96, 0) + } + Catch { + [Int32]$dpiScale = 0 + [Int32]$dpiPixels = 0 + } + Finally { + # Release the device context handle and dispose of the graphics object + If ($null -ne $GraphicsObject) { + If ($DeviceContextHandle -ne [IntPtr]::Zero) { + $GraphicsObject.ReleaseHdc($DeviceContextHandle) + } + $GraphicsObject.Dispose() + } + } + # Failed to get dpi, try to read them from registry - Might not be accurate + If ($RunAsActiveUser) { + If ($dpiPixels -lt 1) { + [Int32]$dpiPixels = Get-RegistryKey -Key 'Registry::HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics' -Value 'AppliedDPI' -SID $RunAsActiveUser.SID + } + If ($dpiPixels -lt 1) { + [Int32]$dpiPixels = Get-RegistryKey -Key 'Registry::HKEY_CURRENT_USER\Control Panel\Desktop' -Value 'LogPixels' -SID $RunAsActiveUser.SID + } + [Boolean]$UserDisplayScaleFactor = $true + } + # Failed to get dpi from first two registry entries, try to read FontDPI - Usually inaccurate + If ($dpiPixels -lt 1) { + # This registry setting only exists if system scale factor has been changed at least once + [Int32]$dpiPixels = Get-RegistryKey -Key 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontDPI' -Value 'LogPixels' + [Boolean]$UserDisplayScaleFactor = $false + } + # Calculate dpi scale if its empty and we have dpi pixels + If (($dpiScale -lt 1) -and ($dpiPixels -gt 0)) { + [Int32]$dpiScale = [Math]::Round(($dpiPixels * 100) / 96) + } +} +## Variables: Resolve Parameters. For use in a pipeline +[ScriptBlock]$ResolveParameters = { + Param ( + [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] + [ValidateNotNullOrEmpty()]$Parameter + ) + + Switch ($Parameter.Value.GetType().Name) { + 'SwitchParameter' { + "-$($Parameter.Key):`$$($Parameter.Value.ToString().ToLower())" + } + 'Boolean' { + "-$($Parameter.Key):`$$($Parameter.Value.ToString().ToLower())" + } + 'Int16' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'Int32' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'Int64' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'UInt16' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'UInt32' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'UInt64' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'Single' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'Double' { + "-$($Parameter.Key):$($Parameter.Value)" + } + 'Decimal' { + "-$($Parameter.Key):$($Parameter.Value)" + } + default { + "-$($Parameter.Key):`'$($Parameter.Value)`'" + } + } +} +#endregion +##*============================================= +##* END VARIABLE DECLARATION +##*============================================= + +##*============================================= +##* FUNCTION LISTINGS +##*============================================= +#region FunctionListings + +#region Function Write-FunctionHeaderOrFooter +Function Write-FunctionHeaderOrFooter { + <# +.SYNOPSIS + +Write the function header or footer to the log upon first entering or exiting a function. + +.DESCRIPTION + +Write the "Function Start" message, the bound parameters the function was invoked with, or the "Function End" message when entering or exiting a function. + +Messages are debug messages so will only be logged if LogDebugMessage option is enabled in XML config file. + +.PARAMETER CmdletName + +The name of the function this function is invoked from. + +.PARAMETER CmdletBoundParameters + +The bound parameters of the function this function is invoked from. + +.PARAMETER Header + +Write the function header. + +.PARAMETER Footer + +Write the function footer. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + +.EXAMPLE + +Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + +.NOTES + +This is an internal script function and should typically not be called directly. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$CmdletName, + [Parameter(Mandatory = $true, ParameterSetName = 'Header')] + [AllowEmptyCollection()] + [Hashtable]$CmdletBoundParameters, + [Parameter(Mandatory = $true, ParameterSetName = 'Header')] + [Switch]$Header, + [Parameter(Mandatory = $true, ParameterSetName = 'Footer')] + [Switch]$Footer + ) + + If ($Header) { + Write-Log -Message 'Function Start' -Source ${CmdletName} -DebugMessage + + ## Get the parameters that the calling function was invoked with + [String]$CmdletBoundParameters = $CmdletBoundParameters | Format-Table -Property @{ Label = 'Parameter'; Expression = { "[-$($_.Key)]" } }, @{ Label = 'Value'; Expression = { $_.Value }; Alignment = 'Left' }, @{ Label = 'Type'; Expression = { $_.Value.GetType().Name }; Alignment = 'Left' } -AutoSize -Wrap | Out-String + If ($CmdletBoundParameters) { + Write-Log -Message "Function invoked with bound parameter(s): `r`n$CmdletBoundParameters" -Source ${CmdletName} -DebugMessage + } + Else { + Write-Log -Message 'Function invoked without any bound parameters.' -Source ${CmdletName} -DebugMessage + } + } + ElseIf ($Footer) { + Write-Log -Message 'Function End' -Source ${CmdletName} -DebugMessage + } +} +#endregion + + +#region Function Execute-MSP +Function Execute-MSP { + <# +.SYNOPSIS + +Reads SummaryInfo targeted product codes in MSP file and determines if the MSP file applies to any installed products +If a valid installed product is found, triggers the Execute-MSI function to patch the installation. +Uses default config MSI parameters. You can use -AddParameters to add additional parameters. + +.PARAMETER Path + +Path to the msp file + +.PARAMETER AddParameters + +Additional parameters + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Execute-MSP -Path 'Adobe_Reader_11.0.3_EN.msp' + +.EXAMPLE + +Execute-MSP -Path 'AcroRdr2017Upd1701130143_MUI.msp' -AddParameters 'ALLUSERS=1' + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, HelpMessage = 'Please enter the path to the MSP file')] + [ValidateScript({ ('.msp' -contains [IO.Path]::GetExtension($_)) })] + [Alias('FilePath')] + [String]$Path, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$AddParameters + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## If the MSP is in the Files directory, set the full path to the MSP + If (Test-Path -LiteralPath (Join-Path -Path $dirFiles -ChildPath $path -ErrorAction 'SilentlyContinue') -PathType 'Leaf' -ErrorAction 'SilentlyContinue') { + [String]$mspFile = Join-Path -Path $dirFiles -ChildPath $path + } + ElseIf (Test-Path -LiteralPath $Path -ErrorAction 'SilentlyContinue') { + [String]$mspFile = (Get-Item -LiteralPath $Path).FullName + } + Else { + Write-Log -Message "Failed to find MSP file [$path]." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to find MSP file [$path]." + } + Continue + } + Write-Log -Message 'Checking MSP file for valid product codes.' -Source ${CmdletName} + + [Boolean]$IsMSPNeeded = $false + + ## Create a Windows Installer object + [__ComObject]$Installer = New-Object -ComObject 'WindowsInstaller.Installer' -ErrorAction 'Stop' + + ## Define properties for how the MSI database is opened + [Int32]$msiOpenDatabaseModePatchFile = 32 + [Int32]$msiOpenDatabaseMode = $msiOpenDatabaseModePatchFile + ## Open database in read only mode + [__ComObject]$Database = Invoke-ObjectMethod -InputObject $Installer -MethodName 'OpenDatabase' -ArgumentList @($mspFile, $msiOpenDatabaseMode) + ## Get the SummaryInformation from the windows installer database + [__ComObject]$SummaryInformation = Get-ObjectProperty -InputObject $Database -PropertyName 'SummaryInformation' + [Hashtable]$SummaryInfoProperty = @{} + $AllTargetedProductCodes = (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(7)).Split(';') + ForEach ($FormattedProductCode in $AllTargetedProductCodes) { + [PSObject]$MSIInstalled = Get-InstalledApplication -ProductCode $FormattedProductCode + If ($MSIInstalled) { + [Boolean]$IsMSPNeeded = $true + } + } + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($SummaryInformation) + } + Catch { + } + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($Database) + } + Catch { + } + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($Installer) + } + Catch { + } + If ($IsMSPNeeded) { + If ($AddParameters) { + Execute-MSI -Action 'Patch' -Path $Path -AddParameters $AddParameters + } + Else { + Execute-MSI -Action 'Patch' -Path $Path + } + } + } +} +#endregion + + +#region Function Write-Log +Function Write-Log { + <# +.SYNOPSIS + +Write messages to a log file in CMTrace.exe compatible format or Legacy text file format. + +.DESCRIPTION + +Write messages to a log file in CMTrace.exe compatible format or Legacy text file format and optionally display in the console. + +.PARAMETER Message + +The message to write to the log file or output to the console. + +.PARAMETER Severity + +Defines message type. When writing to console or CMTrace.exe log format, it allows highlighting of message type. +Options: 1 = Information (default), 2 = Warning (highlighted in yellow), 3 = Error (highlighted in red) + +.PARAMETER Source + +The source of the message being logged. + +.PARAMETER ScriptSection + +The heading for the portion of the script that is being executed. Default is: $script:installPhase. + +.PARAMETER LogType + +Choose whether to write a CMTrace.exe compatible log file or a Legacy text log file. + +.PARAMETER LogFileDirectory + +Set the directory where the log file will be saved. + +.PARAMETER LogFileName + +Set the name of the log file. + +.PARAMETER MaxLogFileSizeMB + +Maximum file size limit for log file in megabytes (MB). Default is 10 MB. + +.PARAMETER WriteHost + +Write the log message to the console. + +.PARAMETER ContinueOnError + +Suppress writing log message to console on failure to write message to log file. Default is: $true. + +.PARAMETER PassThru + +Return the message that was passed to the function + +.PARAMETER DebugMessage + +Specifies that the message is a debug message. Debug messages only get logged if -LogDebugMessage is set to $true. + +.PARAMETER LogDebugMessage + +Debug messages only get logged if this parameter is set to $true in the config XML file. + +.INPUTS + +System.String + +The message to write to the log file or output to the console. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Write-Log -Message "Installing patch MS15-031" -Source 'Add-Patch' -LogType 'CMTrace' + +.EXAMPLE + +Write-Log -Message "Script is running on Windows 8" -Source 'Test-ValidOS' -LogType 'Legacy' + +.EXAMPLE + +Write-Log -Message "Log only message" -WriteHost $false + +.NOTES + +.LINK +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] + [AllowEmptyCollection()] + [Alias('Text')] + [String[]]$Message, + [Parameter(Mandatory = $false, Position = 1)] + [ValidateRange(1, 3)] + [Int16]$Severity = 1, + [Parameter(Mandatory = $false, Position = 2)] + [ValidateNotNull()] + [String]$Source = $([String]$parentFunctionName = [IO.Path]::GetFileNameWithoutExtension((Get-Variable -Name 'MyInvocation' -Scope 1 -ErrorAction 'SilentlyContinue').Value.MyCommand.Name); If ($parentFunctionName) { + $parentFunctionName + } + Else { + 'Unknown' + }), + [Parameter(Mandatory = $false, Position = 3)] + [ValidateNotNullorEmpty()] + [String]$ScriptSection = $script:installPhase, + [Parameter(Mandatory = $false, Position = 4)] + [ValidateSet('CMTrace', 'Legacy')] + [String]$LogType = $configToolkitLogStyle, + [Parameter(Mandatory = $false, Position = 5)] + [ValidateNotNullorEmpty()] + [String]$LogFileDirectory = $(If ($configToolkitCompressLogs) { + $logTempFolder + } + Else { + $configToolkitLogDir + }), + [Parameter(Mandatory = $false, Position = 6)] + [ValidateNotNullorEmpty()] + [String]$LogFileName = $logName, + [Parameter(Mandatory = $false, Position = 7)] + [ValidateNotNullorEmpty()] + [Decimal]$MaxLogFileSizeMB = $configToolkitLogMaxSize, + [Parameter(Mandatory = $false, Position = 8)] + [ValidateNotNullorEmpty()] + [Boolean]$WriteHost = $configToolkitLogWriteToHost, + [Parameter(Mandatory = $false, Position = 9)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true, + [Parameter(Mandatory = $false, Position = 10)] + [Switch]$PassThru = $false, + [Parameter(Mandatory = $false, Position = 11)] + [Switch]$DebugMessage = $false, + [Parameter(Mandatory = $false, Position = 12)] + [Boolean]$LogDebugMessage = $configToolkitLogDebugMessage + ) + + Begin { + ## Get the name of this function + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + + ## Logging Variables + # Log file date/time + [DateTime]$DateTimeNow = Get-Date + [String]$LogTime = $DateTimeNow.ToString('HH\:mm\:ss.fff') + [String]$LogDate = $DateTimeNow.ToString('MM-dd-yyyy') + If (-not (Test-Path -LiteralPath 'variable:LogTimeZoneBias')) { + [Int32]$script:LogTimeZoneBias = [TimeZone]::CurrentTimeZone.GetUtcOffset($DateTimeNow).TotalMinutes + } + [String]$LogTimePlusBias = $LogTime + $script:LogTimeZoneBias + # Initialize variables + [Boolean]$ExitLoggingFunction = $false + If (-not (Test-Path -LiteralPath 'variable:DisableLogging')) { + $DisableLogging = $false + } + # Check if the script section is defined + [Boolean]$ScriptSectionDefined = [Boolean](-not [String]::IsNullOrEmpty($ScriptSection)) + # Get the file name of the source script + Try { + If ($script:MyInvocation.Value.ScriptName) { + [String]$ScriptSource = Split-Path -Path $script:MyInvocation.Value.ScriptName -Leaf -ErrorAction 'Stop' + } + Else { + [String]$ScriptSource = Split-Path -Path $script:MyInvocation.MyCommand.Definition -Leaf -ErrorAction 'Stop' + } + } + Catch { + $ScriptSource = '' + } + + ## Create script block for generating CMTrace.exe compatible log entry + [ScriptBlock]$CMTraceLogString = { + Param ( + [String]$lMessage, + [String]$lSource, + [Int16]$lSeverity + ) + "" + "" + } + + ## Create script block for writing log entry to the console + [ScriptBlock]$WriteLogLineToHost = { + Param ( + [String]$lTextLogLine, + [Int16]$lSeverity + ) + If ($WriteHost) { + # Only output using color options if running in a host which supports colors. + If ($Host.UI.RawUI.ForegroundColor) { + Switch ($lSeverity) { + 3 { + Write-Host -Object $lTextLogLine -ForegroundColor 'Red' -BackgroundColor 'Black' + } + 2 { + Write-Host -Object $lTextLogLine -ForegroundColor 'Yellow' -BackgroundColor 'Black' + } + 1 { + Write-Host -Object $lTextLogLine + } + } + } + # If executing "powershell.exe -File .ps1 > log.txt", then all the Write-Host calls are converted to Write-Output calls so that they are included in the text log. + Else { + Write-Output -InputObject ($lTextLogLine) + } + } + } + + ## Exit function if it is a debug message and logging debug messages is not enabled in the config XML file + If (($DebugMessage) -and (-not $LogDebugMessage)) { + [Boolean]$ExitLoggingFunction = $true; Return + } + ## Exit function if logging to file is disabled and logging to console host is disabled + If (($DisableLogging) -and (-not $WriteHost)) { + [Boolean]$ExitLoggingFunction = $true; Return + } + ## Exit Begin block if logging is disabled + If ($DisableLogging) { + Return + } + ## Exit function function if it is an [Initialization] message and the toolkit has been relaunched + If (($AsyncToolkitLaunch) -and ($ScriptSection -eq 'Initialization')) { + [Boolean]$ExitLoggingFunction = $true; Return + } + + ## Create the directory where the log file will be saved + If (-not (Test-Path -LiteralPath $LogFileDirectory -PathType 'Container')) { + Try { + $null = New-Item -Path $LogFileDirectory -Type 'Directory' -Force -ErrorAction 'Stop' + } + Catch { + [Boolean]$ExitLoggingFunction = $true + # If error creating directory, write message to console + If (-not $ContinueOnError) { + Write-Host -Object "[$LogDate $LogTime] [${CmdletName}] $ScriptSection :: Failed to create the log directory [$LogFileDirectory]. `r`n$(Resolve-Error)" -ForegroundColor 'Red' + } + Return + } + } + + ## Assemble the fully qualified path to the log file + [String]$LogFilePath = Join-Path -Path $LogFileDirectory -ChildPath $LogFileName + } + Process { + ## Exit function if logging is disabled + If ($ExitLoggingFunction) { + Return + } + + ForEach ($Msg in $Message) { + ## If the message is not $null or empty, create the log entry for the different logging methods + [String]$CMTraceMsg = '' + [String]$ConsoleLogLine = '' + [String]$LegacyTextLogLine = '' + If ($Msg) { + # Create the CMTrace log message + If ($ScriptSectionDefined) { + [String]$CMTraceMsg = "[$ScriptSection] :: $Msg" + } + + # Create a Console and Legacy "text" log entry + [String]$LegacyMsg = "[$LogDate $LogTime]" + If ($ScriptSectionDefined) { + [String]$LegacyMsg += " [$ScriptSection]" + } + If ($Source) { + [String]$ConsoleLogLine = "$LegacyMsg [$Source] :: $Msg" + Switch ($Severity) { + 3 { + [String]$LegacyTextLogLine = "$LegacyMsg [$Source] [Error] :: $Msg" + } + 2 { + [String]$LegacyTextLogLine = "$LegacyMsg [$Source] [Warning] :: $Msg" + } + 1 { + [String]$LegacyTextLogLine = "$LegacyMsg [$Source] [Info] :: $Msg" + } + } + } + Else { + [String]$ConsoleLogLine = "$LegacyMsg :: $Msg" + Switch ($Severity) { + 3 { + [String]$LegacyTextLogLine = "$LegacyMsg [Error] :: $Msg" + } + 2 { + [String]$LegacyTextLogLine = "$LegacyMsg [Warning] :: $Msg" + } + 1 { + [String]$LegacyTextLogLine = "$LegacyMsg [Info] :: $Msg" + } + } + } + } + + ## Execute script block to create the CMTrace.exe compatible log entry + [String]$CMTraceLogLine = & $CMTraceLogString -lMessage $CMTraceMsg -lSource $Source -lSeverity $Severity + + ## Choose which log type to write to file + If ($LogType -ieq 'CMTrace') { + [String]$LogLine = $CMTraceLogLine + } + Else { + [String]$LogLine = $LegacyTextLogLine + } + + ## Write the log entry to the log file if logging is not currently disabled + If (-not $DisableLogging) { + Try { + $LogLine | Out-File -FilePath $LogFilePath -Append -NoClobber -Force -Encoding 'UTF8' -ErrorAction 'Stop' + } + Catch { + If (-not $ContinueOnError) { + Write-Host -Object "[$LogDate $LogTime] [$ScriptSection] [${CmdletName}] :: Failed to write message [$Msg] to the log file [$LogFilePath]. `r`n$(Resolve-Error)" -ForegroundColor 'Red' + } + } + } + + ## Execute script block to write the log entry to the console if $WriteHost is $true + & $WriteLogLineToHost -lTextLogLine $ConsoleLogLine -lSeverity $Severity + } + } + End { + ## Archive log file if size is greater than $MaxLogFileSizeMB and $MaxLogFileSizeMB > 0 + Try { + If ((-not $ExitLoggingFunction) -and (-not $DisableLogging)) { + [IO.FileInfo]$LogFile = Get-ChildItem -LiteralPath $LogFilePath -ErrorAction 'Stop' + [Decimal]$LogFileSizeMB = $LogFile.Length / 1MB + If (($LogFileSizeMB -gt $MaxLogFileSizeMB) -and ($MaxLogFileSizeMB -gt 0)) { + ## Change the file extension to "lo_" + [String]$ArchivedOutLogFile = [IO.Path]::ChangeExtension($LogFilePath, 'lo_') + [Hashtable]$ArchiveLogParams = @{ ScriptSection = $ScriptSection; Source = ${CmdletName}; Severity = 2; LogFileDirectory = $LogFileDirectory; LogFileName = $LogFileName; LogType = $LogType; MaxLogFileSizeMB = 0; WriteHost = $WriteHost; ContinueOnError = $ContinueOnError; PassThru = $false } + + ## Log message about archiving the log file + $ArchiveLogMessage = "Maximum log file size [$MaxLogFileSizeMB MB] reached. Rename log file to [$ArchivedOutLogFile]." + Write-Log -Message $ArchiveLogMessage @ArchiveLogParams + + ## Archive existing log file from .log to .lo_. Overwrites any existing .lo_ file. This is the same method SCCM uses for log files. + Move-Item -LiteralPath $LogFilePath -Destination $ArchivedOutLogFile -Force -ErrorAction 'Stop' + + ## Start new log file and Log message about archiving the old log file + $NewLogMessage = "Previous log file was renamed to [$ArchivedOutLogFile] because maximum log file size of [$MaxLogFileSizeMB MB] was reached." + Write-Log -Message $NewLogMessage @ArchiveLogParams + } + } + } + Catch { + ## If renaming of file fails, script will continue writing to log file even if size goes over the max file size + } + Finally { + If ($PassThru) { + Write-Output -InputObject ($Message) + } + } + } +} +#endregion + + +#region Function Remove-InvalidFileNameChars +Function Remove-InvalidFileNameChars { + <# +.SYNOPSIS + +Remove invalid characters from the supplied string. + +.DESCRIPTION + +Remove invalid characters from the supplied string and returns a valid filename as a string. + +.PARAMETER Name + +Text to remove invalid filename characters from. + +.INPUTS + +System.String + +A string containing invalid filename characters. + +.OUTPUTS + +System.String + +Returns the input string with the invalid characters removed. + +.EXAMPLE + +Remove-InvalidFileNameChars -Name "Filename/\1" + +.NOTES + +This functions always returns a string however it can be empty if the name only contains invalid characters. +Do no use this command for an entire path as '\' is not a valid filename character. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] + [AllowEmptyString()] + [String]$Name + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Output -InputObject (([Char[]]$Name | Where-Object { $invalidFileNameChars -notcontains $_ }) -join '') + } + Catch { + Write-Log -Message "Failed to remove invalid characters from the supplied filename. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function New-ZipFile +Function New-ZipFile { + <# +.SYNOPSIS + +Create a new zip archive or add content to an existing archive. + +.DESCRIPTION + +Create a new zip archive or add content to an existing archive by using the Shell object .CopyHere method. + +.PARAMETER DestinationArchiveDirectoryPath + +The path to the directory path where the zip archive will be saved. + +.PARAMETER DestinationArchiveFileName + +The name of the zip archive. + +.PARAMETER SourceDirectoryPath + +The path to the directory to be archived, specified as absolute paths. + +.PARAMETER SourceFilePath + +The path to the file to be archived, specified as absolute paths. + +.PARAMETER RemoveSourceAfterArchiving + +Remove the source path after successfully archiving the content. Default is: $false. + +.PARAMETER OverWriteArchive + +Overwrite the destination archive path if it already exists. Default is: $false. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +New-ZipFile -DestinationArchiveDirectoryPath 'E:\Testing' -DestinationArchiveFileName 'TestingLogs.zip' -SourceDirectory 'E:\Testing\Logs' + +.NOTES + +This is an internal script function and should typically not be called directly. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding(DefaultParameterSetName = 'CreateFromDirectory')] + Param ( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNullorEmpty()] + [String]$DestinationArchiveDirectoryPath, + [Parameter(Mandatory = $true, Position = 1)] + [ValidateNotNullorEmpty()] + [String]$DestinationArchiveFileName, + [Parameter(Mandatory = $true, Position = 2, ParameterSetName = 'CreateFromDirectory')] + [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Container' })] + [String[]]$SourceDirectoryPath, + [Parameter(Mandatory = $true, Position = 2, ParameterSetName = 'CreateFromFile')] + [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] + [String[]]$SourceFilePath, + [Parameter(Mandatory = $false, Position = 3)] + [ValidateNotNullorEmpty()] + [Switch]$RemoveSourceAfterArchiving = $false, + [Parameter(Mandatory = $false, Position = 4)] + [ValidateNotNullorEmpty()] + [Switch]$OverWriteArchive = $false, + [Parameter(Mandatory = $false, Position = 5)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + ## Remove invalid characters from the supplied filename + $DestinationArchiveFileName = Remove-InvalidFileNameChars -Name $DestinationArchiveFileName + If ($DestinationArchiveFileName.length -eq 0) { + Throw 'Invalid filename characters replacement resulted into an empty string.' + } + ## Get the full destination path where the archive will be stored + [String]$DestinationPath = Join-Path -Path $DestinationArchiveDirectoryPath -ChildPath $DestinationArchiveFileName -ErrorAction 'Stop' + Write-Log -Message "Creating a zip archive with the requested content at destination path [$DestinationPath]." -Source ${CmdletName} + + ## If the destination archive already exists, delete it if the -OverWriteArchive option was selected + If (($OverWriteArchive) -and (Test-Path -LiteralPath $DestinationPath)) { + Write-Log -Message "An archive at the destination path already exists, deleting file [$DestinationPath]." -Source ${CmdletName} + $null = Remove-Item -LiteralPath $DestinationPath -Force -ErrorAction 'Stop' + } + + ## If archive file does not exist, then create a zero-byte zip archive + If (-not (Test-Path -LiteralPath $DestinationPath)) { + ## Create a zero-byte file + Write-Log -Message "Creating a zero-byte file [$DestinationPath]." -Source ${CmdletName} + $null = New-Item -Path $DestinationArchiveDirectoryPath -Name $DestinationArchiveFileName -ItemType 'File' -Force -ErrorAction 'Stop' + + ## Write the file header for a zip file to the zero-byte file + [Byte[]]$ZipArchiveByteHeader = 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + [IO.FileStream]$FileStream = New-Object -TypeName 'System.IO.FileStream' -ArgumentList ($DestinationPath, ([IO.FileMode]::Create)) + [IO.BinaryWriter]$BinaryWriter = New-Object -TypeName 'System.IO.BinaryWriter' -ArgumentList ($FileStream) + Write-Log -Message "Write the file header for a zip archive to the zero-byte file [$DestinationPath]." -Source ${CmdletName} + $null = $BinaryWriter.Write($ZipArchiveByteHeader) + $BinaryWriter.Close() + $FileStream.Close() + } + + ## Create a Shell object + [__ComObject]$ShellApp = New-Object -ComObject 'Shell.Application' -ErrorAction 'Stop' + ## Create an object representing the archive file + [__ComObject]$Archive = $ShellApp.NameSpace($DestinationPath) + + ## Create the archive file + If ($PSCmdlet.ParameterSetName -eq 'CreateFromDirectory') { + ## Create the archive file from a source directory + ForEach ($Directory in $SourceDirectoryPath) { + Try { + # Create an object representing the source directory + [__ComObject]$CreateFromDirectory = $ShellApp.NameSpace($Directory) + # Copy all of the files and folders from the source directory to the archive + $null = $Archive.CopyHere($CreateFromDirectory.Items()) + # Wait for archive operation to complete. Archive file count property returns 0 if archive operation is in progress. + Write-Log -Message "Compressing [$($CreateFromDirectory.Count)] file(s) in source directory [$Directory] to destination path [$DestinationPath]..." -Source ${CmdletName} + Do { + Start-Sleep -Milliseconds 250 + } While ($Archive.Items().Count -eq 0) + } + Finally { + # Release the ComObject representing the source directory + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($CreateFromDirectory) + } + + # If option was selected, recursively delete the source directory after successfully archiving the contents + If ($RemoveSourceAfterArchiving) { + Try { + Write-Log -Message "Recursively deleting the source directory [$Directory] as contents have been successfully archived." -Source ${CmdletName} + $null = Remove-Item -LiteralPath $Directory -Recurse -Force -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to recursively delete the source directory [$Directory]. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + } + } + } + } + Else { + ## Create the archive file from a list of one or more files + [IO.FileInfo[]]$SourceFilePath = [IO.FileInfo[]]$SourceFilePath + ForEach ($File in $SourceFilePath) { + # Copy the files and folders from the source directory to the archive + $null = $Archive.CopyHere($File.FullName) + # Wait for archive operation to complete. Archive file count property returns 0 if archive operation is in progress. + Write-Log -Message "Compressing file [$($File.FullName)] to destination path [$DestinationPath]..." -Source ${CmdletName} + Do { + Start-Sleep -Milliseconds 250 + } While ($Archive.Items().Count -eq 0) + + # If option was selected, delete the source file after successfully archiving the content + If ($RemoveSourceAfterArchiving) { + Try { + Write-Log -Message "Deleting the source file [$($File.FullName)] as it has been successfully archived." -Source ${CmdletName} + $null = Remove-Item -LiteralPath $File.FullName -Force -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to delete the source file [$($File.FullName)]. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + } + } + } + } + + ## If the archive was created in session 0 or by an Admin, then it may only be readable by elevated users. + # Apply the parent folder's permissions to the archive file to fix the problem. + Write-Log -Message "If the archive was created in session 0 or by an Admin, then it may only be readable by elevated users. Apply permissions from parent folder [$DestinationArchiveDirectoryPath] to file [$DestinationPath]." -Source ${CmdletName} + Try { + [Security.AccessControl.DirectorySecurity]$DestinationArchiveDirectoryPathAcl = Get-Acl -Path $DestinationArchiveDirectoryPath -ErrorAction 'Stop' + Set-Acl -Path $DestinationPath -AclObject $DestinationArchiveDirectoryPathAcl -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to apply parent folder's [$DestinationArchiveDirectoryPath] permissions to file [$DestinationPath]. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + } + } + Catch { + Write-Log -Message "Failed to archive the requested file(s). `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to archive the requested file(s): $($_.Exception.Message)" + } + } + Finally { + ## Release the ComObject representing the archive + If ($Archive) { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($Archive) + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Exit-Script +Function Exit-Script { + <# +.SYNOPSIS + +Exit the script, perform cleanup actions, and pass an exit code to the parent process. + +.DESCRIPTION + +Always use when exiting the script to ensure cleanup actions are performed. + +.PARAMETER ExitCode + +The exit code to be passed from the script to the parent process, e.g. SCCM + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Exit-Script + +.EXAMPLE + +Exit-Script -ExitCode 1618 + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$ExitCode = 0 + ) + + ## Get the name of this function + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + + ## Stop the Close Program Dialog if running + If ($formCloseApps) { + $formCloseApps.Close + } + + ## Close the Installation Progress Dialog if running + Close-InstallationProgress + + ## If block execution variable is true, call the function to unblock execution + If ($BlockExecution) { + Unblock-AppExecution + } + + ## If Terminal Server mode was set, turn it off + If ($terminalServerMode) { + Disable-TerminalServerInstallMode + } + + ## Determine action based on exit code + Switch ($exitCode) { + $configInstallationUIExitCode { + $installSuccess = $false + } + $configInstallationDeferExitCode { + $installSuccess = $false + } + 3010 { + $installSuccess = $true + } + 1641 { + $installSuccess = $true + } + 0 { + $installSuccess = $true + } + Default { + $installSuccess = $false + } + } + + ## Determine if balloon notification should be shown + If ($deployModeSilent) { + [Boolean]$configShowBalloonNotifications = $false + } + + If ($installSuccess) { + If (Test-Path -LiteralPath $regKeyDeferHistory -ErrorAction 'SilentlyContinue') { + Write-Log -Message 'Removing deferral history...' -Source ${CmdletName} + Remove-RegistryKey -Key $regKeyDeferHistory -Recurse + } + + [String]$balloonText = "$deploymentTypeName $configBalloonTextComplete" + ## Handle reboot prompts on successful script completion + If (($AllowRebootPassThru) -and ((($msiRebootDetected) -or ($exitCode -eq 3010)) -or ($exitCode -eq 1641))) { + Write-Log -Message 'A restart has been flagged as required.' -Source ${CmdletName} + [String]$balloonText = "$deploymentTypeName $configBalloonTextRestartRequired" + If (($msiRebootDetected) -and ($exitCode -ne 1641)) { + [Int32]$exitCode = 3010 + } + } + Else { + [Int32]$exitCode = 0 + } + + Write-Log -Message "$installName $deploymentTypeName completed with exit code [$exitcode]." -Source ${CmdletName} + If ($configShowBalloonNotifications) { + Show-BalloonTip -BalloonTipIcon 'Info' -BalloonTipText $balloonText -NoWait + } + } + ElseIf (-not $installSuccess) { + Write-Log -Message "$installName $deploymentTypeName completed with exit code [$exitcode]." -Source ${CmdletName} + If (($exitCode -eq $configInstallationUIExitCode) -or ($exitCode -eq $configInstallationDeferExitCode)) { + [String]$balloonText = "$deploymentTypeName $configBalloonTextFastRetry" + If ($configShowBalloonNotifications) { + Show-BalloonTip -BalloonTipIcon 'Warning' -BalloonTipText $balloonText -NoWait + } + } + Else { + [String]$balloonText = "$deploymentTypeName $configBalloonTextError" + If ($configShowBalloonNotifications) { + Show-BalloonTip -BalloonTipIcon 'Error' -BalloonTipText $balloonText -NoWait + } + } + } + + [String]$LogDash = '-' * 79 + Write-Log -Message $LogDash -Source ${CmdletName} + + ## Archive the log files to zip format and then delete the temporary logs folder + If ($configToolkitCompressLogs) { + ## Disable logging to file so that we can archive the log files + . $DisableScriptLogging + + [String]$DestinationArchiveFileName = $installName + '_' + $deploymentType + '_' + ((Get-Date -Format 'yyyy-MM-dd-HH-mm-ss').ToString()) + '.zip' + New-ZipFile -DestinationArchiveDirectoryPath $configToolkitLogDir -DestinationArchiveFileName $DestinationArchiveFileName -SourceDirectory $logTempFolder -RemoveSourceAfterArchiving + } + + If ($script:notifyIcon) { + Try { + $script:notifyIcon.Dispose() + } + Catch { + } + } + ## Reset powershell window title to its previous title + $Host.UI.RawUI.WindowTitle = $oldPSWindowTitle + ## Reset variables in case another toolkit is being run in the same session + $global:logName = $null + $global:installTitle = $null + $global:installName = $null + $global:appName = $null + ## Exit the script, returning the exit code to SCCM + If (Test-Path -LiteralPath 'variable:HostInvocation') { + $script:ExitCode = $exitCode; Exit + } + Else { + Exit $exitCode + } +} +#endregion + + +#region Function Resolve-Error +Function Resolve-Error { + <# +.SYNOPSIS + +Enumerate error record details. + +.DESCRIPTION + +Enumerate an error record, or a collection of error record, properties. By default, the details for the last error will be enumerated. + +.PARAMETER ErrorRecord + +The error record to resolve. The default error record is the latest one: $global:Error[0]. This parameter will also accept an array of error records. + +.PARAMETER Property + +The list of properties to display from the error record. Use "*" to display all properties. + +Default list of error properties is: Message, FullyQualifiedErrorId, ScriptStackTrace, PositionMessage, InnerException + +.PARAMETER GetErrorRecord + +Get error record details as represented by $_. + +.PARAMETER GetErrorInvocation + +Get error record invocation information as represented by $_.InvocationInfo. + +.PARAMETER GetErrorException + +Get error record exception details as represented by $_.Exception. + +.PARAMETER GetErrorInnerException + +Get error record inner exception details as represented by $_.Exception.InnerException. Will retrieve all inner exceptions if there is more than one. + +.INPUTS + +System.Array. + +Accepts an array of error records. + +.OUTPUTS + +System.String + +Displays the error record details. + +.EXAMPLE + +Resolve-Error + +.EXAMPLE + +Resolve-Error -Property * + +.EXAMPLE + +Resolve-Error -Property InnerException + +.EXAMPLE + +Resolve-Error -GetErrorInvocation:$false + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] + [AllowEmptyCollection()] + [Array]$ErrorRecord, + [Parameter(Mandatory = $false, Position = 1)] + [ValidateNotNullorEmpty()] + [String[]]$Property = ('Message', 'InnerException', 'FullyQualifiedErrorId', 'ScriptStackTrace', 'PositionMessage'), + [Parameter(Mandatory = $false, Position = 2)] + [Switch]$GetErrorRecord = $true, + [Parameter(Mandatory = $false, Position = 3)] + [Switch]$GetErrorInvocation = $true, + [Parameter(Mandatory = $false, Position = 4)] + [Switch]$GetErrorException = $true, + [Parameter(Mandatory = $false, Position = 5)] + [Switch]$GetErrorInnerException = $true + ) + + Begin { + ## If function was called without specifying an error record, then choose the latest error that occurred + If (-not $ErrorRecord) { + If ($global:Error.Count -eq 0) { + #Write-Warning -Message "The `$Error collection is empty" + Return + } + Else { + [Array]$ErrorRecord = $global:Error[0] + } + } + + ## Allows selecting and filtering the properties on the error object if they exist + [ScriptBlock]$SelectProperty = { + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + $InputObject, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String[]]$Property + ) + + [String[]]$ObjectProperty = $InputObject | Get-Member -MemberType '*Property' | Select-Object -ExpandProperty 'Name' + ForEach ($Prop in $Property) { + If ($Prop -eq '*') { + [String[]]$PropertySelection = $ObjectProperty + Break + } + ElseIf ($ObjectProperty -contains $Prop) { + [String[]]$PropertySelection += $Prop + } + } + Write-Output -InputObject ($PropertySelection) + } + + # Initialize variables to avoid error if 'Set-StrictMode' is set + $LogErrorRecordMsg = $null + $LogErrorInvocationMsg = $null + $LogErrorExceptionMsg = $null + $LogErrorMessageTmp = $null + $LogInnerMessage = $null + } + Process { + If (-not $ErrorRecord) { + Return + } + ForEach ($ErrRecord in $ErrorRecord) { + ## Capture Error Record + If ($GetErrorRecord) { + [String[]]$SelectedProperties = & $SelectProperty -InputObject $ErrRecord -Property $Property + $LogErrorRecordMsg = $ErrRecord | Select-Object -Property $SelectedProperties + } + + ## Error Invocation Information + If ($GetErrorInvocation) { + If ($ErrRecord.InvocationInfo) { + [String[]]$SelectedProperties = & $SelectProperty -InputObject $ErrRecord.InvocationInfo -Property $Property + $LogErrorInvocationMsg = $ErrRecord.InvocationInfo | Select-Object -Property $SelectedProperties + } + } + + ## Capture Error Exception + If ($GetErrorException) { + If ($ErrRecord.Exception) { + [String[]]$SelectedProperties = & $SelectProperty -InputObject $ErrRecord.Exception -Property $Property + $LogErrorExceptionMsg = $ErrRecord.Exception | Select-Object -Property $SelectedProperties + } + } + + ## Display properties in the correct order + If ($Property -eq '*') { + # If all properties were chosen for display, then arrange them in the order the error object displays them by default. + If ($LogErrorRecordMsg) { + [Array]$LogErrorMessageTmp += $LogErrorRecordMsg + } + If ($LogErrorInvocationMsg) { + [Array]$LogErrorMessageTmp += $LogErrorInvocationMsg + } + If ($LogErrorExceptionMsg) { + [Array]$LogErrorMessageTmp += $LogErrorExceptionMsg + } + } + Else { + # Display selected properties in our custom order + If ($LogErrorExceptionMsg) { + [Array]$LogErrorMessageTmp += $LogErrorExceptionMsg + } + If ($LogErrorRecordMsg) { + [Array]$LogErrorMessageTmp += $LogErrorRecordMsg + } + If ($LogErrorInvocationMsg) { + [Array]$LogErrorMessageTmp += $LogErrorInvocationMsg + } + } + + If ($LogErrorMessageTmp) { + $LogErrorMessage = 'Error Record:' + $LogErrorMessage += "`n-------------" + $LogErrorMsg = $LogErrorMessageTmp | Format-List | Out-String + $LogErrorMessage += $LogErrorMsg + } + + ## Capture Error Inner Exception(s) + If ($GetErrorInnerException) { + If ($ErrRecord.Exception -and $ErrRecord.Exception.InnerException) { + $LogInnerMessage = 'Error Inner Exception(s):' + $LogInnerMessage += "`n-------------------------" + + $ErrorInnerException = $ErrRecord.Exception.InnerException + $Count = 0 + + While ($ErrorInnerException) { + [String]$InnerExceptionSeperator = '~' * 40 + + [String[]]$SelectedProperties = & $SelectProperty -InputObject $ErrorInnerException -Property $Property + $LogErrorInnerExceptionMsg = $ErrorInnerException | Select-Object -Property $SelectedProperties | Format-List | Out-String + + If ($Count -gt 0) { + $LogInnerMessage += $InnerExceptionSeperator + } + $LogInnerMessage += $LogErrorInnerExceptionMsg + + $Count++ + $ErrorInnerException = $ErrorInnerException.InnerException + } + } + } + + If ($LogErrorMessage) { + $Output = $LogErrorMessage + } + If ($LogInnerMessage) { + $Output += $LogInnerMessage + } + + Write-Output -InputObject $Output + + If (Test-Path -LiteralPath 'variable:Output') { + Clear-Variable -Name 'Output' + } + If (Test-Path -LiteralPath 'variable:LogErrorMessage') { + Clear-Variable -Name 'LogErrorMessage' + } + If (Test-Path -LiteralPath 'variable:LogInnerMessage') { + Clear-Variable -Name 'LogInnerMessage' + } + If (Test-Path -LiteralPath 'variable:LogErrorMessageTmp') { + Clear-Variable -Name 'LogErrorMessageTmp' + } + } + } + End { + } +} +#endregion + + +#region Function Show-InstallationPrompt +Function Show-InstallationPrompt { + <# +.SYNOPSIS + +Displays a custom installation prompt with the toolkit branding and optional buttons. + +.DESCRIPTION + +Any combination of Left, Middle or Right buttons can be displayed. The return value of the button clicked by the user is the button text specified. + +.PARAMETER Title + +Title of the prompt. Default: the application installation name. + +.PARAMETER Message + +Message text to be included in the prompt + +.PARAMETER MessageAlignment + +Alignment of the message text. Options: Left, Center, Right. Default: Center. + +.PARAMETER ButtonLeftText + +Show a button on the left of the prompt with the specified text + +.PARAMETER ButtonRightText + +Show a button on the right of the prompt with the specified text + +.PARAMETER ButtonMiddleText + +Show a button in the middle of the prompt with the specified text + +.PARAMETER Icon + +Show a system icon in the prompt. Options: Application, Asterisk, Error, Exclamation, Hand, Information, None, Question, Shield, Warning, WinLogo. Default: None + +.PARAMETER NoWait + +Specifies whether to show the prompt asynchronously (i.e. allow the script to continue without waiting for a response). Default: $false. + +.PARAMETER PersistPrompt + +Specify whether to make the prompt persist in the center of the screen every couple of seconds, specified in the AppDeployToolkitConfig.xml. The user will have no option but to respond to the prompt - resistance is futile! + +.PARAMETER MinimizeWindows + +Specifies whether to minimize other windows when displaying prompt. Default: $false. + +.PARAMETER Timeout + +Specifies the time period in seconds after which the prompt should timeout. Default: UI timeout value set in the config XML file. + +.PARAMETER ExitOnTimeout + +Specifies whether to exit the script if the UI times out. Default: $true. + +.PARAMETER TopMost + +Specifies whether the progress window should be topmost. Default: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Show-InstallationPrompt -Message 'Do you want to proceed with the installation?' -ButtonRightText 'Yes' -ButtonLeftText 'No' + +.EXAMPLE + +Show-InstallationPrompt -Title 'Funny Prompt' -Message 'How are you feeling today?' -ButtonRightText 'Good' -ButtonLeftText 'Bad' -ButtonMiddleText 'Indifferent' + +.EXAMPLE + +Show-InstallationPrompt -Message 'You can customize text to appear at the end of an install, or remove it completely for unattended installations.' -Icon Information -NoWait + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Title = $installTitle, + [Parameter(Mandatory = $false)] + [String]$Message = '', + [Parameter(Mandatory = $false)] + [ValidateSet('Left', 'Center', 'Right')] + [String]$MessageAlignment = 'Center', + [Parameter(Mandatory = $false)] + [String]$ButtonRightText = '', + [Parameter(Mandatory = $false)] + [String]$ButtonLeftText = '', + [Parameter(Mandatory = $false)] + [String]$ButtonMiddleText = '', + [Parameter(Mandatory = $false)] + [ValidateSet('Application', 'Asterisk', 'Error', 'Exclamation', 'Hand', 'Information', 'None', 'Question', 'Shield', 'Warning', 'WinLogo')] + [String]$Icon = 'None', + [Parameter(Mandatory = $false)] + [Switch]$NoWait = $false, + [Parameter(Mandatory = $false)] + [Switch]$PersistPrompt = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$MinimizeWindows = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$Timeout = $configInstallationUITimeout, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ExitOnTimeout = $true, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$TopMost = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Bypass if in non-interactive mode + If ($deployModeSilent) { + Write-Log -Message "Bypassing Show-InstallationPrompt [Mode: $deployMode]. Message:$Message" -Source ${CmdletName} + Return + } + + ## Get parameters for calling function asynchronously + [Hashtable]$installPromptParameters = $PSBoundParameters + + ## Check if the countdown was specified + If ($timeout -gt $configInstallationUITimeout) { + [String]$CountdownTimeoutErr = 'The installation UI dialog timeout cannot be longer than the timeout specified in the XML configuration file.' + Write-Log -Message $CountdownTimeoutErr -Severity 3 -Source ${CmdletName} + Throw $CountdownTimeoutErr + } + + ## If the NoWait parameter is specified, launch a new PowerShell session to show the prompt asynchronously + If ($NoWait) { + # Remove the NoWait parameter so that the script is run synchronously in the new PowerShell session. This also prevents the function to loop indefinitely. + $installPromptParameters.Remove('NoWait') + # Format the parameters as a string + [String]$installPromptParameters = ($installPromptParameters.GetEnumerator() | ForEach-Object { & $ResolveParameters $_ }) -join ' ' + + + Start-Process -FilePath "$PSHOME\powershell.exe" -ArgumentList "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -Command & {& `'$scriptPath`' -ReferredInstallTitle `'$Title`' -ReferredInstallName `'$installName`' -ReferredLogName `'$logName`' -ShowInstallationPrompt $installPromptParameters -AsyncToolkitLaunch}" -WindowStyle 'Hidden' -ErrorAction 'SilentlyContinue' + Return + } + + [Windows.Forms.Application]::EnableVisualStyles() + $formInstallationPrompt = New-Object -TypeName 'System.Windows.Forms.Form' + $pictureBanner = New-Object -TypeName 'System.Windows.Forms.PictureBox' + If ($Icon -ne 'None') { + $pictureIcon = New-Object -TypeName 'System.Windows.Forms.PictureBox' + } + $labelText = New-Object -TypeName 'System.Windows.Forms.Label' + $buttonRight = New-Object -TypeName 'System.Windows.Forms.Button' + $buttonMiddle = New-Object -TypeName 'System.Windows.Forms.Button' + $buttonLeft = New-Object -TypeName 'System.Windows.Forms.Button' + $buttonAbort = New-Object -TypeName 'System.Windows.Forms.Button' + $flowLayoutPanel = New-Object -TypeName 'System.Windows.Forms.FlowLayoutPanel' + $panelButtons = New-Object -TypeName 'System.Windows.Forms.Panel' + + [ScriptBlock]$Install_Prompt_Form_Cleanup_FormClosed = { + ## Remove all event handlers from the controls + Try { + $labelText.remove_Click($handler_labelText_Click) + $buttonLeft.remove_Click($buttonLeft_OnClick) + $buttonRight.remove_Click($buttonRight_OnClick) + $buttonMiddle.remove_Click($buttonMiddle_OnClick) + $buttonAbort.remove_Click($buttonAbort_OnClick) + $installPromptTimer.remove_Tick($installPromptTimer_Tick) + $installPromptTimer.Dispose() + $installPromptTimer = $null + $installPromptTimerPersist.remove_Tick($installPromptTimerPersist_Tick) + $installPromptTimerPersist.Dispose() + $installPromptTimerPersist = $null + $formInstallationPrompt.remove_Load($Install_Prompt_Form_StateCorrection_Load) + $formInstallationPrompt.remove_FormClosed($Install_Prompt_Form_Cleanup_FormClosed) + } + Catch { + } + } + + [ScriptBlock]$Install_Prompt_Form_StateCorrection_Load = { + # Disable the X button + Try { + $windowHandle = $formInstallationPrompt.Handle + If ($windowHandle -and ($windowHandle -ne [IntPtr]::Zero)) { + $menuHandle = [PSADT.UiAutomation]::GetSystemMenu($windowHandle, $false) + If ($menuHandle -and ($menuHandle -ne [IntPtr]::Zero)) { + [PSADT.UiAutomation]::EnableMenuItem($menuHandle, 0xF060, 0x00000001) + [PSADT.UiAutomation]::DestroyMenu($menuHandle) + } + } + } + Catch { + # Not a terminating error if we can't disable the button. Just disable the Control Box instead + Write-Log 'Failed to disable the Close button. Disabling the Control Box instead.' -Severity 2 -Source ${CmdletName} + $formInstallationPrompt.ControlBox = $false + } + $formInstallationPrompt.WindowState = 'Normal' + $formInstallationPrompt.AutoSize = $true + $formInstallationPrompt.AutoScaleMode = 'Font' + $formInstallationPrompt.AutoScaleDimensions = New-Object System.Drawing.SizeF(6, 13) #Set as if using 96 DPI + $formInstallationPrompt.TopMost = $TopMost + $formInstallationPrompt.BringToFront() + # Get the start position of the form so we can return the form to this position if PersistPrompt is enabled + Set-Variable -Name 'formInstallationPromptStartPosition' -Value $formInstallationPrompt.Location -Scope 'Script' + } + + ## Form + + ##---------------------------------------------- + ## Create padding object + $paddingNone = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 0, 0, 0) + + ## Default control size + $DefaultControlSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 0) + + ## Generic Button properties + $buttonSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (130, 24) + + ## Picture Banner + $pictureBanner.DataBindings.DefaultDataSourceUpdateMode = 0 + $pictureBanner.ImageLocation = $appDeployLogoBanner + $pictureBanner.Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, $appDeployLogoBannerHeight) + $pictureBanner.MinimumSize = $DefaultControlSize + $pictureBanner.SizeMode = 'CenterImage' + $pictureBanner.Margin = $paddingNone + $pictureBanner.TabStop = $false + $pictureBanner.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, 0) + + ## Picture Icon + If ($Icon -ne 'None') { + $pictureIcon.DataBindings.DefaultDataSourceUpdateMode = 0 + $pictureIcon.Image = ([Drawing.SystemIcons]::$Icon).ToBitmap() + $pictureIcon.Name = 'pictureIcon' + $pictureIcon.MinimumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (64, 32) + $pictureIcon.Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (64, 32) + $pictureIcon.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (24, 0, 8, 0) + $pictureIcon.SizeMode = 'CenterImage' + $pictureIcon.TabStop = $false + $pictureIcon.Anchor = 'None' + $pictureIcon.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 10, 0, 5) + } + + ## Label Text + $labelText.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelText.Font = $defaultFont + $labelText.Name = 'labelText' + $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (386, 0) + $labelText.Size = $System_Drawing_Size + If ($Icon -ne 'None') { + $labelText.MinimumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (386, $pictureIcon.Height) + } + Else { + $labelText.MinimumSize = $System_Drawing_Size + } + $labelText.MaximumSize = $System_Drawing_Size + $labelText.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 10, 0, 5) + $labelText.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (20, 0, 20, 0) + $labelText.TabStop = $false + $labelText.Text = $message + $labelText.TextAlign = "Middle$($MessageAlignment)" + $labelText.Anchor = 'None' + $labelText.AutoSize = $true + $labelText.add_Click($handler_labelText_Click) + + If ($Icon -ne 'None') { + # Add margin for the icon based on labelText Height so its centered + $pictureIcon.Height = $labelText.Height + } + ## Button Left + $buttonLeft.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonLeft.Name = 'buttonLeft' + $buttonLeft.Font = $defaultFont + $buttonLeft.Size = $buttonSize + $buttonLeft.MinimumSize = $buttonSize + $buttonLeft.MaximumSize = $buttonSize + $buttonLeft.TabIndex = 0 + $buttonLeft.Text = $buttonLeftText + $buttonLeft.DialogResult = 'No' + $buttonLeft.AutoSize = $false + $buttonLeft.Margin = $paddingNone + $buttonLeft.Padding = $paddingNone + $buttonLeft.UseVisualStyleBackColor = $true + $buttonLeft.Location = '14,4' + $buttonLeft.add_Click($buttonLeft_OnClick) + + ## Button Middle + $buttonMiddle.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonMiddle.Name = 'buttonMiddle' + $buttonMiddle.Font = $defaultFont + $buttonMiddle.Size = $buttonSize + $buttonMiddle.MinimumSize = $buttonSize + $buttonMiddle.MaximumSize = $buttonSize + $buttonMiddle.TabIndex = 1 + $buttonMiddle.Text = $buttonMiddleText + $buttonMiddle.DialogResult = 'Ignore' + $buttonMiddle.AutoSize = $true + $buttonMiddle.Margin = $paddingNone + $buttonMiddle.Padding = $paddingNone + $buttonMiddle.UseVisualStyleBackColor = $true + $buttonMiddle.Location = '160,4' + $buttonMiddle.add_Click($buttonMiddle_OnClick) + + ## Button Right + $buttonRight.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonRight.Name = 'buttonRight' + $buttonRight.Font = $defaultFont + $buttonRight.Size = $buttonSize + $buttonRight.MinimumSize = $buttonSize + $buttonRight.MaximumSize = $buttonSize + $buttonRight.TabIndex = 2 + $buttonRight.Text = $ButtonRightText + $buttonRight.DialogResult = 'Yes' + $buttonRight.AutoSize = $true + $buttonRight.Margin = $paddingNone + $buttonRight.Padding = $paddingNone + $buttonRight.UseVisualStyleBackColor = $true + $buttonRight.Location = '306,4' + $buttonRight.add_Click($buttonRight_OnClick) + + ## Button Abort (Hidden) + $buttonAbort.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonAbort.Name = 'buttonAbort' + $buttonAbort.Font = $defaultFont + $buttonAbort.Size = '0,0' + $buttonAbort.MinimumSize = '0,0' + $buttonAbort.MaximumSize = '0,0' + $buttonAbort.BackColor = [System.Drawing.Color]::Transparent + $buttonAbort.ForeColor = [System.Drawing.Color]::Transparent + $buttonAbort.FlatAppearance.BorderSize = 0 + $buttonAbort.FlatAppearance.MouseDownBackColor = [System.Drawing.Color]::Transparent + $buttonAbort.FlatAppearance.MouseOverBackColor = [System.Drawing.Color]::Transparent + $buttonAbort.FlatStyle = [System.Windows.Forms.FlatStyle]::System + $buttonAbort.DialogResult = 'Abort' + $buttonAbort.TabStop = $false + $buttonAbort.Visible = $true # Has to be set visible so we can call Click on it + $buttonAbort.Margin = $paddingNone + $buttonAbort.Padding = $paddingNone + $buttonAbort.UseVisualStyleBackColor = $true + $buttonAbort.add_Click($buttonAbort_OnClick) + + ## FlowLayoutPanel + $flowLayoutPanel.MinimumSize = $DefaultControlSize + $flowLayoutPanel.MaximumSize = $DefaultControlSize + $flowLayoutPanel.Size = $DefaultControlSize + $flowLayoutPanel.AutoSize = $true + $flowLayoutPanel.AutoSizeMode = 'GrowAndShrink' + $flowLayoutPanel.Anchor = 'Top,Left' + $flowLayoutPanel.FlowDirection = 'LeftToRight' + $flowLayoutPanel.WrapContents = $true + $flowLayoutPanel.Margin = $paddingNone + $flowLayoutPanel.Padding = $paddingNone + ## Make sure label text is positioned correctly + If ($Icon -ne 'None') { + $labelText.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 0, 10, 0) + $pictureIcon.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, 0) + $labelText.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (64, 0) + } + Else { + $labelText.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelText.MinimumSize = $DefaultControlSize + $labelText.MaximumSize = $DefaultControlSize + $labelText.Size = $DefaultControlSize + $labelText.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, 0) + } + If ($Icon -ne 'None') { + $flowLayoutPanel.Controls.Add($pictureIcon) + } + $flowLayoutPanel.Controls.Add($labelText) + $flowLayoutPanel.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, $appDeployLogoBannerHeight) + + ## ButtonsPanel + $panelButtons.MinimumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + If ($Icon -ne 'None') { + $panelButtons.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (64, 0) + } + Else { + $panelButtons.Padding = $paddingNone + } + $panelButtons.Margin = $paddingNone + $panelButtons.MaximumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.AutoSize = $true + If ($buttonLeftText) { + $panelButtons.Controls.Add($buttonLeft) + } + If ($buttonMiddleText) { + $panelButtons.Controls.Add($buttonMiddle) + } + If ($buttonRightText) { + $panelButtons.Controls.Add($buttonRight) + } + ## Add the ButtonsPanel to the flowLayoutPanel if any buttons are present + If ($buttonLeftText -or $buttonMiddleText -or $buttonRightText) { + $flowLayoutPanel.Controls.Add($panelButtons) + } + + ## Form Installation Prompt + $formInstallationPrompt.MinimumSize = $DefaultControlSize + $formInstallationPrompt.Size = $DefaultControlSize + $formInstallationPrompt.Padding = $paddingNone + $formInstallationPrompt.Margin = $paddingNone + $formInstallationPrompt.DataBindings.DefaultDataSourceUpdateMode = 0 + $formInstallationPrompt.Name = 'InstallPromptForm' + $formInstallationPrompt.Text = $title + $formInstallationPrompt.StartPosition = 'CenterScreen' + # $formInstallationPrompt.FormBorderStyle = 'FixedDialog' + $formInstallationPrompt.MaximizeBox = $false + $formInstallationPrompt.MinimizeBox = $false + $formInstallationPrompt.TopMost = $TopMost + $formInstallationPrompt.TopLevel = $true + $formInstallationPrompt.AutoSize = $true + $formInstallationPrompt.AutoScaleMode = 'Font' + $formInstallationPrompt.AutoScaleDimensions = New-Object System.Drawing.SizeF(6, 13) #Set as if using 96 DPI + $formInstallationPrompt.Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList ($AppDeployLogoIcon) + $formInstallationPrompt.Controls.Add($pictureBanner) + $formInstallationPrompt.Controls.Add($buttonAbort) + $formInstallationPrompt.Controls.Add($flowLayoutPanel) + ## Timer + $installPromptTimer = New-Object -TypeName 'System.Windows.Forms.Timer' + $installPromptTimer.Interval = ($timeout * 1000) + $installPromptTimer.Add_Tick({ + Write-Log -Message 'Installation action not taken within a reasonable amount of time.' -Source ${CmdletName} + $buttonAbort.PerformClick() + }) + ## Init the OnLoad event to correct the initial state of the form + $formInstallationPrompt.add_Load($Install_Prompt_Form_StateCorrection_Load) + ## Clean up the control events + $formInstallationPrompt.add_FormClosed($Install_Prompt_Form_Cleanup_FormClosed) + + ## Start the timer + $installPromptTimer.Start() + + ## Persistence Timer + If ($persistPrompt) { + $installPromptTimerPersist = New-Object -TypeName 'System.Windows.Forms.Timer' + $installPromptTimerPersist.Interval = ($configInstallationPersistInterval * 1000) + [ScriptBlock]$installPromptTimerPersist_Tick = { + $formInstallationPrompt.WindowState = 'Normal' + $formInstallationPrompt.TopMost = $TopMost + $formInstallationPrompt.BringToFront() + $formInstallationPrompt.Location = "$($formInstallationPromptStartPosition.X),$($formInstallationPromptStartPosition.Y)" + } + $installPromptTimerPersist.add_Tick($installPromptTimerPersist_Tick) + $installPromptTimerPersist.Start() + } + + If (-not $AsyncToolkitLaunch) { + ## Close the Installation Progress Dialog if running + Close-InstallationProgress + } + + [String]$installPromptLoggedParameters = ($installPromptParameters.GetEnumerator() | ForEach-Object { & $ResolveParameters $_ }) -join ' ' + Write-Log -Message "Displaying custom installation prompt with the parameters: [$installPromptLoggedParameters]." -Source ${CmdletName} + + + ## Show the prompt synchronously. If user cancels, then keep showing it until user responds using one of the buttons. + $showDialog = $true + While ($showDialog) { + # Minimize all other windows + If ($minimizeWindows) { + $null = $shellApp.MinimizeAll() + } + # Show the Form + $result = $formInstallationPrompt.ShowDialog() + If (($result -eq 'Yes') -or ($result -eq 'No') -or ($result -eq 'Ignore') -or ($result -eq 'Abort')) { + $showDialog = $false + } + } + $formInstallationPrompt.Dispose() + + Switch ($result) { + 'Yes' { + Write-Output -InputObject ($buttonRightText) + } + 'No' { + Write-Output -InputObject ($buttonLeftText) + } + 'Ignore' { + Write-Output -InputObject ($buttonMiddleText) + } + 'Abort' { + # Restore minimized windows + $null = $shellApp.UndoMinimizeAll() + If ($ExitOnTimeout) { + Exit-Script -ExitCode $configInstallationUIExitCode + } + Else { + Write-Log -Message 'UI timed out but `$ExitOnTimeout set to `$false. Continue...' -Source ${CmdletName} + } + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Show-DialogBox +Function Show-DialogBox { + <# +.SYNOPSIS + +Display a custom dialog box with optional title, buttons, icon and timeout. + +Show-InstallationPrompt is recommended over this function as it provides more customization and uses consistent branding with the other UI components. + +.DESCRIPTION + +Display a custom dialog box with optional title, buttons, icon and timeout. The default button is "OK", the default Icon is "None", and the default Timeout is None + +.PARAMETER Text + +Text in the message dialog box + +.PARAMETER Title + +Title of the message dialog box + +.PARAMETER Buttons + +Buttons to be included on the dialog box. Options: OK, OKCancel, AbortRetryIgnore, YesNoCancel, YesNo, RetryCancel, CancelTryAgainContinue. Default: OK. + +.PARAMETER DefaultButton + +The Default button that is selected. Options: First, Second, Third. Default: First. + +.PARAMETER Icon + +Icon to display on the dialog box. Options: None, Stop, Question, Exclamation, Information. Default: None + +.PARAMETER Timeout + +Timeout period in seconds before automatically closing the dialog box with the return message "Timeout". Default: UI timeout value set in the config XML file. + +.PARAMETER TopMost + +Specifies whether the message box is a system modal message box and appears in a topmost window. Default: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the text of the button that was clicked. + +.EXAMPLE + +Show-DialogBox -Title 'Installed Complete' -Text 'Installation has completed. Please click OK and restart your computer.' -Icon 'Information' + +.EXAMPLE + +Show-DialogBox -Title 'Installation Notice' -Text 'Installation will take approximately 30 minutes. Do you wish to proceed?' -Buttons 'OKCancel' -DefaultButton 'Second' -Icon 'Exclamation' -Timeout 600 -Topmost $false + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0, HelpMessage = 'Enter a message for the dialog box')] + [ValidateNotNullorEmpty()] + [String]$Text, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Title = $installTitle, + [Parameter(Mandatory = $false)] + [ValidateSet('OK', 'OKCancel', 'AbortRetryIgnore', 'YesNoCancel', 'YesNo', 'RetryCancel', 'CancelTryAgainContinue')] + [String]$Buttons = 'OK', + [Parameter(Mandatory = $false)] + [ValidateSet('First', 'Second', 'Third')] + [String]$DefaultButton = 'First', + [Parameter(Mandatory = $false)] + [ValidateSet('Exclamation', 'Information', 'None', 'Stop', 'Question')] + [String]$Icon = 'None', + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Timeout = $configInstallationUITimeout, + [Parameter(Mandatory = $false)] + [Boolean]$TopMost = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + # Bypass if in non-interactive mode + If ($deployModeNonInteractive) { + Write-Log -Message "Bypassing Show-DialogBox [Mode: $deployMode]. Text:$Text" -Source ${CmdletName} + Return + } + + Write-Log -Message "Displaying Dialog Box with message: $Text..." -Source ${CmdletName} + + [Hashtable]$dialogButtons = @{ + 'OK' = 0 + 'OKCancel' = 1 + 'AbortRetryIgnore' = 2 + 'YesNoCancel' = 3 + 'YesNo' = 4 + 'RetryCancel' = 5 + 'CancelTryAgainContinue' = 6 + } + + [Hashtable]$dialogIcons = @{ + 'None' = 0 + 'Stop' = 16 + 'Question' = 32 + 'Exclamation' = 48 + 'Information' = 64 + } + + [Hashtable]$dialogDefaultButton = @{ + 'First' = 0 + 'Second' = 256 + 'Third' = 512 + } + + Switch ($TopMost) { + $true { + $dialogTopMost = 4096 + } + $false { + $dialogTopMost = 0 + } + } + + $response = $Shell.Popup($Text, $Timeout, $Title, ($dialogButtons[$Buttons] + $dialogIcons[$Icon] + $dialogDefaultButton[$DefaultButton] + $dialogTopMost)) + + Switch ($response) { + 1 { + Write-Log -Message 'Dialog Box Response: OK' -Source ${CmdletName} + Write-Output -InputObject ('OK') + } + 2 { + Write-Log -Message 'Dialog Box Response: Cancel' -Source ${CmdletName} + Write-Output -InputObject ('Cancel') + } + 3 { + Write-Log -Message 'Dialog Box Response: Abort' -Source ${CmdletName} + Write-Output -InputObject ('Abort') + } + 4 { + Write-Log -Message 'Dialog Box Response: Retry' -Source ${CmdletName} + Write-Output -InputObject ('Retry') + } + 5 { + Write-Log -Message 'Dialog Box Response: Ignore' -Source ${CmdletName} + Write-Output -InputObject ('Ignore') + } + 6 { + Write-Log -Message 'Dialog Box Response: Yes' -Source ${CmdletName} + Write-Output -InputObject ('Yes') + } + 7 { + Write-Log -Message 'Dialog Box Response: No' -Source ${CmdletName} + Write-Output -InputObject ('No') + } + 10 { + Write-Log -Message 'Dialog Box Response: Try Again' -Source ${CmdletName} + Write-Output -InputObject ('Try Again') + } + 11 { + Write-Log -Message 'Dialog Box Response: Continue' -Source ${CmdletName} + Write-Output -InputObject ('Continue') + } + -1 { + Write-Log -Message 'Dialog Box Timed Out...' -Source ${CmdletName} + Write-Output -InputObject ('Timeout') + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-HardwarePlatform +Function Get-HardwarePlatform { + <# +.SYNOPSIS + +Retrieves information about the hardware platform (physical or virtual) + +.DESCRIPTION + +Retrieves information about the hardware platform (physical or virtual) + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the hardware platform (physical or virtual) + +.EXAMPLE + +Get-HardwarePlatform + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Retrieving hardware platform information.' -Source ${CmdletName} + $hwBios = Get-WmiObject -Class 'Win32_BIOS' -ErrorAction 'Stop' | Select-Object -Property 'Version', 'SerialNumber' + $hwMakeModel = Get-WmiObject -Class 'Win32_ComputerSystem' -ErrorAction 'Stop' | Select-Object -Property 'Model', 'Manufacturer' + + If ($hwBIOS.Version -match 'VRTUAL') { + $hwType = 'Virtual:Hyper-V' + } + ElseIf ($hwBIOS.Version -match 'A M I') { + $hwType = 'Virtual:Virtual PC' + } + ElseIf ($hwBIOS.Version -like '*Xen*') { + $hwType = 'Virtual:Xen' + } + ElseIf ($hwBIOS.SerialNumber -like '*VMware*') { + $hwType = 'Virtual:VMWare' + } + ElseIf (($hwMakeModel.Manufacturer -like '*Microsoft*') -and ($hwMakeModel.Model -notlike '*Surface*')) { + $hwType = 'Virtual:Hyper-V' + } + ElseIf ($hwMakeModel.Manufacturer -like '*VMWare*') { + $hwType = 'Virtual:VMWare' + } + ElseIf ($hwMakeModel.Model -like '*Virtual*') { + $hwType = 'Virtual' + } + Else { + $hwType = 'Physical' + } + + Write-Output -InputObject ($hwType) + } + Catch { + Write-Log -Message "Failed to retrieve hardware platform information. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to retrieve hardware platform information: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-FreeDiskSpace +Function Get-FreeDiskSpace { + <# +.SYNOPSIS + +Retrieves the free disk space in MB on a particular drive (defaults to system drive) + +.DESCRIPTION + +Retrieves the free disk space in MB on a particular drive (defaults to system drive) + +.PARAMETER Drive + +Drive to check free disk space on + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Double + +Returns the free disk space in MB + +.EXAMPLE + +Get-FreeDiskSpace -Drive 'C:' + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Drive = $envSystemDrive, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Retrieving free disk space for drive [$Drive]." -Source ${CmdletName} + $disk = Get-WmiObject -Class 'Win32_LogicalDisk' -Filter "DeviceID='$Drive'" -ErrorAction 'Stop' + [Double]$freeDiskSpace = [Math]::Round($disk.FreeSpace / 1MB) + + Write-Log -Message "Free disk space for drive [$Drive]: [$freeDiskSpace MB]." -Source ${CmdletName} + Write-Output -InputObject ($freeDiskSpace) + } + Catch { + Write-Log -Message "Failed to retrieve free disk space for drive [$Drive]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to retrieve free disk space for drive [$Drive]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-InstalledApplication +Function Get-InstalledApplication { + <# +.SYNOPSIS + +Retrieves information about installed applications. + +.DESCRIPTION + +Retrieves information about installed applications by querying the registry. You can specify an application name, a product code, or both. + +Returns information about application publisher, name & version, product code, uninstall string, install source, location, date, and application architecture. + +.PARAMETER Name + +The name of the application to retrieve information for. Performs a contains match on the application display name by default. + +.PARAMETER Exact + +Specifies that the named application must be matched using the exact name. + +.PARAMETER WildCard + +Specifies that the named application must be matched using a wildcard search. + +.PARAMETER RegEx + +Specifies that the named application must be matched using a regular expression search. + +.PARAMETER ProductCode + +The product code of the application to retrieve information for. + +.PARAMETER IncludeUpdatesAndHotfixes + +Include matches against updates and hotfixes in results. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +PSObject + +Returns a PSObject with information about an installed application +- Publisher +- DisplayName +- DisplayVersion +- ProductCode +- UninstallString +- InstallSource +- InstallLocation +- InstallDate +- Architecture + +.EXAMPLE + +Get-InstalledApplication -Name 'Adobe Flash' + +.EXAMPLE + Get-InstalledApplication -ProductCode '{1AD147D0-BE0E-3D6C-AC11-64F6DC4163F1}' +.Outputs + For every detected matching Application the Function puts out a custom Object containing the following Properties: + DisplayName, DisplayVersion, InstallDate, Publisher, Is64BitApplication, ProductCode, InstallLocation, UninstallSubkey, UninstallString, InstallSource. +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String[]]$Name, + [Parameter(Mandatory = $false)] + [Switch]$Exact = $false, + [Parameter(Mandatory = $false)] + [Switch]$WildCard = $false, + [Parameter(Mandatory = $false)] + [Switch]$RegEx = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$ProductCode, + [Parameter(Mandatory = $false)] + [Switch]$IncludeUpdatesAndHotfixes + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + If ($name) { + Write-Log -Message "Getting information for installed Application Name(s) [$($name -join ', ')]..." -Source ${CmdletName} + } + If ($productCode) { + Write-Log -Message "Getting information for installed Product Code [$ProductCode]..." -Source ${CmdletName} + } + + ## Enumerate the installed applications from the registry for applications that have the "DisplayName" property + [PSObject[]]$regKeyApplication = @() + ForEach ($regKey in $regKeyApplications) { + If (Test-Path -LiteralPath $regKey -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorUninstallKeyPath') { + [PSObject[]]$UninstallKeyApps = Get-ChildItem -LiteralPath $regKey -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorUninstallKeyPath' + ForEach ($UninstallKeyApp in $UninstallKeyApps) { + Try { + [PSObject]$regKeyApplicationProps = Get-ItemProperty -LiteralPath $UninstallKeyApp.PSPath -ErrorAction 'Stop' + If ($regKeyApplicationProps.DisplayName) { + [PSObject[]]$regKeyApplication += $regKeyApplicationProps + } + } + Catch { + Write-Log -Message "Unable to enumerate properties from registry key path [$($UninstallKeyApp.PSPath)]. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + Continue + } + } + } + } + If ($ErrorUninstallKeyPath) { + Write-Log -Message "The following error(s) took place while enumerating installed applications from the registry. `r`n$(Resolve-Error -ErrorRecord $ErrorUninstallKeyPath)" -Severity 2 -Source ${CmdletName} + } + + $UpdatesSkippedCounter = 0 + ## Create a custom object with the desired properties for the installed applications and sanitize property details + [PSObject[]]$installedApplication = @() + ForEach ($regKeyApp in $regKeyApplication) { + Try { + [String]$appDisplayName = '' + [String]$appDisplayVersion = '' + [String]$appPublisher = '' + + ## Bypass any updates or hotfixes + If ((-not $IncludeUpdatesAndHotfixes) -and (($regKeyApp.DisplayName -match '(?i)kb\d+') -or ($regKeyApp.DisplayName -match 'Cumulative Update') -or ($regKeyApp.DisplayName -match 'Security Update') -or ($regKeyApp.DisplayName -match 'Hotfix'))) { + $UpdatesSkippedCounter += 1 + Continue + } + + ## Remove any control characters which may interfere with logging and creating file path names from these variables + $appDisplayName = $regKeyApp.DisplayName -replace '[^\p{L}\p{Nd}\p{Z}\p{P}]', '' + $appDisplayVersion = $regKeyApp.DisplayVersion -replace '[^\p{L}\p{Nd}\p{Z}\p{P}]', '' + $appPublisher = $regKeyApp.Publisher -replace '[^\p{L}\p{Nd}\p{Z}\p{P}]', '' + + + ## Determine if application is a 64-bit application + [Boolean]$Is64BitApp = If (($is64Bit) -and ($regKeyApp.PSPath -notmatch '^Microsoft\.PowerShell\.Core\\Registry::HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node')) { + $true + } + Else { + $false + } + + If ($ProductCode) { + ## Verify if there is a match with the product code passed to the script + If ($regKeyApp.PSChildName -match [RegEx]::Escape($productCode)) { + Write-Log -Message "Found installed application [$appDisplayName] version [$appDisplayVersion] matching product code [$productCode]." -Source ${CmdletName} + $installedApplication += New-Object -TypeName 'PSObject' -Property @{ + UninstallSubkey = $regKeyApp.PSChildName + ProductCode = If ($regKeyApp.PSChildName -match $MSIProductCodeRegExPattern) { + $regKeyApp.PSChildName + } + Else { + [String]::Empty + } + DisplayName = $appDisplayName + DisplayVersion = $appDisplayVersion + UninstallString = $regKeyApp.UninstallString + InstallSource = $regKeyApp.InstallSource + InstallLocation = $regKeyApp.InstallLocation + InstallDate = $regKeyApp.InstallDate + Publisher = $appPublisher + Is64BitApplication = $Is64BitApp + } + } + } + + If ($name) { + ## Verify if there is a match with the application name(s) passed to the script + ForEach ($application in $Name) { + $applicationMatched = $false + If ($exact) { + # Check for an exact application name match + If ($regKeyApp.DisplayName -eq $application) { + $applicationMatched = $true + Write-Log -Message "Found installed application [$appDisplayName] version [$appDisplayVersion] using exact name matching for search term [$application]." -Source ${CmdletName} + } + } + ElseIf ($WildCard) { + # Check for wildcard application name match + If ($regKeyApp.DisplayName -like $application) { + $applicationMatched = $true + Write-Log -Message "Found installed application [$appDisplayName] version [$appDisplayVersion] using wildcard matching for search term [$application]." -Source ${CmdletName} + } + } + ElseIf ($RegEx) { + # Check for a regex application name match + If ($regKeyApp.DisplayName -match $application) { + $applicationMatched = $true + Write-Log -Message "Found installed application [$appDisplayName] version [$appDisplayVersion] using regex matching for search term [$application]." -Source ${CmdletName} + } + } + # Check for a contains application name match + ElseIf ($regKeyApp.DisplayName -match [RegEx]::Escape($application)) { + $applicationMatched = $true + Write-Log -Message "Found installed application [$appDisplayName] version [$appDisplayVersion] using contains matching for search term [$application]." -Source ${CmdletName} + } + + If ($applicationMatched) { + $installedApplication += New-Object -TypeName 'PSObject' -Property @{ + UninstallSubkey = $regKeyApp.PSChildName + ProductCode = If ($regKeyApp.PSChildName -match $MSIProductCodeRegExPattern) { + $regKeyApp.PSChildName + } + Else { + [String]::Empty + } + DisplayName = $appDisplayName + DisplayVersion = $appDisplayVersion + UninstallString = $regKeyApp.UninstallString + InstallSource = $regKeyApp.InstallSource + InstallLocation = $regKeyApp.InstallLocation + InstallDate = $regKeyApp.InstallDate + Publisher = $appPublisher + Is64BitApplication = $Is64BitApp + } + } + } + } + } + Catch { + Write-Log -Message "Failed to resolve application details from registry for [$appDisplayName]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + Continue + } + } + + If (-not $IncludeUpdatesAndHotfixes) { + ## Write to log the number of entries skipped due to them being considered updates + If ($UpdatesSkippedCounter -eq 1) { + Write-Log -Message 'Skipped 1 entry while searching, because it was considered a Microsoft update.' -Source ${CmdletName} + } + Else { + Write-Log -Message "Skipped $UpdatesSkippedCounter entries while searching, because they were considered Microsoft updates." -Source ${CmdletName} + } + } + + If (-not $installedApplication) { + Write-Log -Message 'Found no application based on the supplied parameters.' -Source ${CmdletName} + } + + Write-Output -InputObject ($installedApplication) + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Execute-MSI +Function Execute-MSI { + <# +.SYNOPSIS + +Executes msiexec.exe to perform the following actions for MSI & MSP files and MSI product codes: install, uninstall, patch, repair, active setup. + +.DESCRIPTION + +Executes msiexec.exe to perform the following actions for MSI & MSP files and MSI product codes: install, uninstall, patch, repair, active setup. + +If the -Action parameter is set to "Install" and the MSI is already installed, the function will exit. + +Sets default switches to be passed to msiexec based on the preferences in the XML configuration file. + +Automatically generates a log file name and creates a verbose log file for all msiexec operations. + +Expects the MSI or MSP file to be located in the "Files" sub directory of the App Deploy Toolkit. Expects transform files to be in the same directory as the MSI file. + +.PARAMETER Action + +The action to perform. Options: Install, Uninstall, Patch, Repair, ActiveSetup. + +.PARAMETER Path + +The path to the MSI/MSP file or the product code of the installed MSI. + +.PARAMETER Transform + +The name of the transform file(s) to be applied to the MSI. The transform file is expected to be in the same directory as the MSI file. Multiple transforms have to be separated by a semi-colon. + +.PARAMETER Patch + +The name of the patch (msp) file(s) to be applied to the MSI for use with the "Install" action. The patch file is expected to be in the same directory as the MSI file. Multiple patches have to be separated by a semi-colon. + +.PARAMETER Parameters + +Overrides the default parameters specified in the XML configuration file. Install default is: "REBOOT=ReallySuppress /QB!". Uninstall default is: "REBOOT=ReallySuppress /QN". + +.PARAMETER AddParameters + +Adds to the default parameters specified in the XML configuration file. Install default is: "REBOOT=ReallySuppress /QB!". Uninstall default is: "REBOOT=ReallySuppress /QN". + +.PARAMETER SecureParameters + +Hides all parameters passed to the MSI or MSP file from the toolkit Log file. + +.PARAMETER LoggingOptions + +Overrides the default logging options specified in the XML configuration file. Default options are: "/L*v". + +.PARAMETER LogName + +Overrides the default log file name. The default log file name is generated from the MSI file name. If LogName does not end in .log, it will be automatically appended. + +For uninstallations, by default the product code is resolved to the DisplayName and version of the application. + +.PARAMETER WorkingDirectory + +Overrides the working directory. The working directory is set to the location of the MSI file. + +.PARAMETER SkipMSIAlreadyInstalledCheck + +Skips the check to determine if the MSI is already installed on the system. Default is: $false. + +.PARAMETER IncludeUpdatesAndHotfixes + +Include matches against updates and hotfixes in results. + +.PARAMETER NoWait + +Immediately continue after executing the process. + +.PARAMETER PassThru + +Returns ExitCode, STDOut, and STDErr output from the process. + +.PARAMETER IgnoreExitCodes + +List the exit codes to ignore or * to ignore all exit codes. + +.PARAMETER PriorityClass + +Specifies priority class for the process. Options: Idle, Normal, High, AboveNormal, BelowNormal, RealTime. Default: Normal + +.PARAMETER ExitOnProcessFailure + +Specifies whether the function should call Exit-Script when the process returns an exit code that is considered an error/failure. Default: $true + +.PARAMETER RepairFromSource + +Specifies whether we should repair from source. Also rewrites local cache. Default: $false + +.PARAMETER ContinueOnError + +Continue if an error occurred while trying to start the process. Default: $false. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +PSObject + +Returns a PSObject with the results of the installation +- ExitCode +- STDOut +- STDErr + +.EXAMPLE + +Execute-MSI -Action 'Install' -Path 'Adobe_FlashPlayer_11.2.202.233_x64_EN.msi' + +Installs an MSI + +.EXAMPLE + +Execute-MSI -Action 'Install' -Path 'Adobe_FlashPlayer_11.2.202.233_x64_EN.msi' -Transform 'Adobe_FlashPlayer_11.2.202.233_x64_EN_01.mst' -Parameters '/QN' + +Installs an MSI, applying a transform and overriding the default MSI toolkit parameters + +.EXAMPLE + +[PSObject]$ExecuteMSIResult = Execute-MSI -Action 'Install' -Path 'Adobe_FlashPlayer_11.2.202.233_x64_EN.msi' -PassThru + +Installs an MSI and stores the result of the execution into a variable by using the -PassThru option + +.EXAMPLE + +Execute-MSI -Action 'Uninstall' -Path '{26923b43-4d38-484f-9b9e-de460746276c}' + +Uninstalls an MSI using a product code + +.EXAMPLE + +Execute-MSI -Action 'Patch' -Path 'Adobe_Reader_11.0.3_EN.msp' + +Installs an MSP + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateSet('Install', 'Uninstall', 'Patch', 'Repair', 'ActiveSetup')] + [String]$Action = 'Install', + [Parameter(Mandatory = $true, HelpMessage = 'Please enter either the path to the MSI/MSP file or the ProductCode')] + [ValidateScript({ ($_ -match $MSIProductCodeRegExPattern) -or ('.msi', '.msp' -contains [IO.Path]::GetExtension($_)) })] + [Alias('FilePath')] + [String]$Path, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Transform, + [Parameter(Mandatory = $false)] + [Alias('Arguments')] + [ValidateNotNullorEmpty()] + [String]$Parameters, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$AddParameters, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$SecureParameters = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Patch, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$LoggingOptions, + [Parameter(Mandatory = $false)] + [Alias('LogName')] + [String]$private:LogName, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$WorkingDirectory, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$SkipMSIAlreadyInstalledCheck = $false, + [Parameter(Mandatory = $false)] + [Switch]$IncludeUpdatesAndHotfixes = $false, + [Parameter(Mandatory = $false)] + [Switch]$NoWait = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$PassThru = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$IgnoreExitCodes, + [Parameter(Mandatory = $false)] + [ValidateSet('Idle', 'Normal', 'High', 'AboveNormal', 'BelowNormal', 'RealTime')] + [Diagnostics.ProcessPriorityClass]$PriorityClass = 'Normal', + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ExitOnProcessFailure = $true, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$RepairFromSource = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Initialize variable indicating whether $Path variable is a Product Code or not + [Boolean]$PathIsProductCode = $false + + ## If the path matches a product code + If ($Path -match $MSIProductCodeRegExPattern) { + # Set variable indicating that $Path variable is a Product Code + [Boolean]$PathIsProductCode = $true + + # Resolve the product code to a publisher, application name, and version + Write-Log -Message 'Resolving product code to a publisher, application name, and version.' -Source ${CmdletName} + + If ($IncludeUpdatesAndHotfixes) { + [PSObject]$productCodeNameVersion = Get-InstalledApplication -ProductCode $path -IncludeUpdatesAndHotfixes | Select-Object -Property 'Publisher', 'DisplayName', 'DisplayVersion' -First 1 -ErrorAction 'SilentlyContinue' + } + Else { + [PSObject]$productCodeNameVersion = Get-InstalledApplication -ProductCode $path | Select-Object -Property 'Publisher', 'DisplayName', 'DisplayVersion' -First 1 -ErrorAction 'SilentlyContinue' + } + + # Build the log file name + If (-not $logName) { + If ($productCodeNameVersion) { + If ($productCodeNameVersion.Publisher) { + $logName = (Remove-InvalidFileNameChars -Name ($productCodeNameVersion.Publisher + '_' + $productCodeNameVersion.DisplayName + '_' + $productCodeNameVersion.DisplayVersion)) -replace ' ', '' + } + Else { + $logName = (Remove-InvalidFileNameChars -Name ($productCodeNameVersion.DisplayName + '_' + $productCodeNameVersion.DisplayVersion)) -replace ' ', '' + } + } + Else { + # Out of other options, make the Product Code the name of the log file + $logName = $Path + } + } + } + Else { + # Get the log file name without file extension + If (-not $logName) { + $logName = ([IO.FileInfo]$path).BaseName + } + ElseIf ('.log', '.txt' -contains [IO.Path]::GetExtension($logName)) { + $logName = [IO.Path]::GetFileNameWithoutExtension($logName) + } + } + + If ($configToolkitCompressLogs) { + ## Build the log file path + [String]$logPath = Join-Path -Path $logTempFolder -ChildPath $logName + } + Else { + ## Create the Log directory if it doesn't already exist + If (-not (Test-Path -LiteralPath $configMSILogDir -PathType 'Container' -ErrorAction 'SilentlyContinue')) { + $null = New-Item -Path $configMSILogDir -ItemType 'Directory' -ErrorAction 'SilentlyContinue' + } + ## Build the log file path + [String]$logPath = Join-Path -Path $configMSILogDir -ChildPath $logName + } + + ## Set the installation Parameters + If ($deployModeSilent) { + $msiInstallDefaultParams = $configMSISilentParams + $msiUninstallDefaultParams = $configMSISilentParams + } + Else { + $msiInstallDefaultParams = $configMSIInstallParams + $msiUninstallDefaultParams = $configMSIUninstallParams + } + + ## Build the MSI Parameters + Switch ($action) { + 'Install' { + $option = '/i'; [String]$msiLogFile = "$logPath" + '_Install'; $msiDefaultParams = $msiInstallDefaultParams + } + 'Uninstall' { + $option = '/x'; [String]$msiLogFile = "$logPath" + '_Uninstall'; $msiDefaultParams = $msiUninstallDefaultParams + } + 'Patch' { + $option = '/update'; [String]$msiLogFile = "$logPath" + '_Patch'; $msiDefaultParams = $msiInstallDefaultParams + } + 'Repair' { + $option = '/f'; If ($RepairFromSource) { + $option += 'vomus' + } [String]$msiLogFile = "$logPath" + '_Repair'; $msiDefaultParams = $msiInstallDefaultParams + } + 'ActiveSetup' { + $option = '/fups'; [String]$msiLogFile = "$logPath" + '_ActiveSetup' + } + } + + ## Append ".log" to the MSI logfile path and enclose in quotes + If ([IO.Path]::GetExtension($msiLogFile) -ne '.log') { + [String]$msiLogFile = $msiLogFile + '.log' + [String]$msiLogFile = "`"$msiLogFile`"" + } + + ## If the MSI is in the Files directory, set the full path to the MSI + If (Test-Path -LiteralPath (Join-Path -Path $dirFiles -ChildPath $path -ErrorAction 'SilentlyContinue') -PathType 'Leaf' -ErrorAction 'SilentlyContinue') { + [String]$msiFile = Join-Path -Path $dirFiles -ChildPath $path + } + ElseIf (Test-Path -LiteralPath $Path -ErrorAction 'SilentlyContinue') { + [String]$msiFile = (Get-Item -LiteralPath $Path).FullName + } + ElseIf ($PathIsProductCode) { + [String]$msiFile = $Path + } + Else { + Write-Log -Message "Failed to find MSI file [$path]." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to find MSI file [$path]." + } + Continue + } + + ## Set the working directory of the MSI + If ((-not $PathIsProductCode) -and (-not $workingDirectory)) { + [String]$workingDirectory = Split-Path -Path $msiFile -Parent + } + + ## Enumerate all transforms specified, qualify the full path if possible and enclose in quotes + If ($transform) { + [String[]]$transforms = $transform -replace "`"", '' -split ';' + For ($i = 0; $i -lt $transforms.Length; $i++) { + [String]$FullPath = $null + [String]$FullPath = Join-Path -Path (Split-Path -Path $msiFile -Parent) -ChildPath $transforms[$i].Replace('.\', '') + If ($FullPath -and (Test-Path -LiteralPath $FullPath -PathType 'Leaf')) { + $transforms[$i] = $FullPath + } + } + [String]$mstFile = "`"$($transforms -join ';')`"" + } + + ## Enumerate all patches specified, qualify the full path if possible and enclose in quotes + If ($patch) { + [String[]]$patches = $patch -replace "`"", '' -split ';' + For ($i = 0; $i -lt $patches.Length; $i++) { + [String]$FullPath = $null + [String]$FullPath = Join-Path -Path (Split-Path -Path $msiFile -Parent) -ChildPath $patches[$i].Replace('.\', '') + If ($FullPath -and (Test-Path -LiteralPath $FullPath -PathType 'Leaf')) { + $patches[$i] = $FullPath + } + } + [String]$mspFile = "`"$($patches -join ';')`"" + } + + ## Get the ProductCode of the MSI + If ($PathIsProductCode) { + [String]$MSIProductCode = $path + } + ElseIf ([IO.Path]::GetExtension($msiFile) -eq '.msi') { + Try { + [Hashtable]$GetMsiTablePropertySplat = @{ Path = $msiFile; Table = 'Property'; ContinueOnError = $false } + If ($transforms) { + $GetMsiTablePropertySplat.Add( 'TransformPath', $transforms ) + } + [String]$MSIProductCode = Get-MsiTableProperty @GetMsiTablePropertySplat | Select-Object -ExpandProperty 'ProductCode' -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to get the ProductCode from the MSI file. Continue with requested action [$Action]..." -Source ${CmdletName} + } + } + + ## Enclose the MSI file in quotes to avoid issues with spaces when running msiexec + [String]$msiFile = "`"$msiFile`"" + + ## Start building the MsiExec command line starting with the base action and file + [String]$argsMSI = "$option $msiFile" + # Add MST + If ($transform) { + $argsMSI = "$argsMSI TRANSFORMS=$mstFile TRANSFORMSSECURE=1" + } + # Add MSP + If ($patch) { + $argsMSI = "$argsMSI PATCH=$mspFile" + } + # Replace default parameters if specified. + If ($Parameters) { + $argsMSI = "$argsMSI $Parameters" + } + Else { + $argsMSI = "$argsMSI $msiDefaultParams" + } + # Add reinstallmode and reinstall variable for Patch + If ($action -eq 'Patch') { + $argsMSI += ' REINSTALLMODE=ecmus REINSTALL=ALL' + } + # Append parameters to default parameters if specified. + If ($AddParameters) { + $argsMSI = "$argsMSI $AddParameters" + } + # Add custom Logging Options if specified, otherwise, add default Logging Options from Config file + If ($LoggingOptions) { + $argsMSI = "$argsMSI $LoggingOptions $msiLogFile" + } + Else { + $argsMSI = "$argsMSI $configMSILoggingOptions $msiLogFile" + } + + ## Check if the MSI is already installed. If no valid ProductCode to check, then continue with requested MSI action. + If ($MSIProductCode) { + If ($SkipMSIAlreadyInstalledCheck) { + [Boolean]$IsMsiInstalled = $false + } + Else { + If ($IncludeUpdatesAndHotfixes) { + [PSObject]$MsiInstalled = Get-InstalledApplication -ProductCode $MSIProductCode -IncludeUpdatesAndHotfixes + } + Else { + [PSObject]$MsiInstalled = Get-InstalledApplication -ProductCode $MSIProductCode + } + If ($MsiInstalled) { + [Boolean]$IsMsiInstalled = $true + } + } + } + Else { + If ($Action -eq 'Install') { + [Boolean]$IsMsiInstalled = $false + } + Else { + [Boolean]$IsMsiInstalled = $true + } + } + + If (($IsMsiInstalled) -and ($Action -eq 'Install')) { + Write-Log -Message "The MSI is already installed on this system. Skipping action [$Action]..." -Source ${CmdletName} + [PSObject]$ExecuteResults = @{ ExitCode = 1638; StdOut = 0; StdErr = '' } + } + ElseIf (((-not $IsMsiInstalled) -and ($Action -eq 'Install')) -or ($IsMsiInstalled)) { + Write-Log -Message "Executing MSI action [$Action]..." -Source ${CmdletName} + # Build the hashtable with the options that will be passed to Execute-Process using splatting + [Hashtable]$ExecuteProcessSplat = @{ + Path = $exeMsiexec + Parameters = $argsMSI + WindowStyle = 'Normal' + ExitOnProcessFailure = $ExitOnProcessFailure + ContinueOnError = $ContinueOnError + } + If ($WorkingDirectory) { + $ExecuteProcessSplat.Add( 'WorkingDirectory', $WorkingDirectory) + } + If ($SecureParameters) { + $ExecuteProcessSplat.Add( 'SecureParameters', $SecureParameters) + } + If ($PassThru) { + $ExecuteProcessSplat.Add( 'PassThru', $PassThru) + } + If ($IgnoreExitCodes) { + $ExecuteProcessSplat.Add( 'IgnoreExitCodes', $IgnoreExitCodes) + } + If ($PriorityClass) { + $ExecuteProcessSplat.Add( 'PriorityClass', $PriorityClass) + } + If ($NoWait) { + $ExecuteProcessSplat.Add( 'NoWait', $NoWait) + } + + # Call the Execute-Process function + If ($PassThru) { + [PSObject]$ExecuteResults = Execute-Process @ExecuteProcessSplat + } + Else { + Execute-Process @ExecuteProcessSplat + } + # Refresh environment variables for Windows Explorer process as Windows does not consistently update environment variables created by MSIs + Update-Desktop + } + Else { + Write-Log -Message "The MSI is not installed on this system. Skipping action [$Action]..." -Source ${CmdletName} + } + } + End { + If ($PassThru) { + Write-Output -InputObject ($ExecuteResults) + } + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Remove-MSIApplications +Function Remove-MSIApplications { + <# +.SYNOPSIS + +Removes all MSI applications matching the specified application name. + +.DESCRIPTION + +Removes all MSI applications matching the specified application name. +Enumerates the registry for installed applications matching the specified application name and uninstalls that application using the product code, provided the uninstall string matches "msiexec". + +.PARAMETER Name + +The name of the application to uninstall. Performs a contains match on the application display name by default. + +.PARAMETER Exact + +Specifies that the named application must be matched using the exact name. + +.PARAMETER WildCard + +Specifies that the named application must be matched using a wildcard search. + +.PARAMETER Parameters + +Overrides the default parameters specified in the XML configuration file. Uninstall default is: "REBOOT=ReallySuppress /QN". + +.PARAMETER AddParameters + +Adds to the default parameters specified in the XML configuration file. Uninstall default is: "REBOOT=ReallySuppress /QN". + +.PARAMETER FilterApplication + +Two-dimensional array that contains one or more (property, value, match-type) sets that should be used to filter the list of results returned by Get-InstalledApplication to only those that should be uninstalled. +Properties that can be filtered upon: ProductCode, DisplayName, DisplayVersion, UninstallString, InstallSource, InstallLocation, InstallDate, Publisher, Is64BitApplication + +.PARAMETER ExcludeFromUninstall + +Two-dimensional array that contains one or more (property, value, match-type) sets that should be excluded from uninstall if found. +Properties that can be excluded: ProductCode, DisplayName, DisplayVersion, UninstallString, InstallSource, InstallLocation, InstallDate, Publisher, Is64BitApplication + +.PARAMETER IncludeUpdatesAndHotfixes + +Include matches against updates and hotfixes in results. + +.PARAMETER LoggingOptions + +Overrides the default logging options specified in the XML configuration file. Default options are: "/L*v". + +.PARAMETER LogName + +Overrides the default log file name. The default log file name is generated from the MSI file name. If LogName does not end in .log, it will be automatically appended. +For uninstallations, by default the product code is resolved to the DisplayName and version of the application. + +.PARAMETER PassThru + +Returns ExitCode, STDOut, and STDErr output from the process. + +.PARAMETER ContinueOnError + +Continue if an error occured while trying to start the processes. Default: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +PSObject + +Returns an object with the following properties: +- ExitCode +- StdOut +- StdErr + +.EXAMPLE + +Remove-MSIApplications -Name 'Adobe Flash' + +Removes all versions of software that match the name "Adobe Flash" + +.EXAMPLE + +Remove-MSIApplications -Name 'Adobe' + +Removes all versions of software that match the name "Adobe" + +.EXAMPLE + +Remove-MSIApplications -Name 'Java 8 Update' -FilterApplication @( + @('Is64BitApplication', $false, 'Exact'), + @('Publisher', 'Oracle Corporation', 'Exact') + ) + +Removes all versions of software that match the name "Java 8 Update" where the software is 32-bits and the publisher is "Oracle Corporation". + +.EXAMPLE + +Remove-MSIApplications -Name 'Java 8 Update' -FilterApplication @(, @('Publisher', 'Oracle Corporation', 'Exact')) -ExcludeFromUninstall @(, @('DisplayName', 'Java 8 Update 45', 'Contains')) + +Removes all versions of software that match the name "Java 8 Update" and also have "Oracle Corporation" as the Publisher; however, it does not uninstall "Java 8 Update 45" of the software. +NOTE: If only specifying a single row in the two-dimensional arrays, the array must have the extra parentheses and leading comma as in this example. + +.EXAMPLE + +Remove-MSIApplications -Name 'Java 8 Update' -ExcludeFromUninstall @(, @('DisplayName', 'Java 8 Update 45', 'Contains')) + +Removes all versions of software that match the name "Java 8 Update"; however, it does not uninstall "Java 8 Update 45" of the software. +NOTE: If only specifying a single row in the two-dimensional array, the array must have the extra parentheses and leading comma as in this example. + +.EXAMPLE + +Remove-MSIApplications -Name 'Java 8 Update' -ExcludeFromUninstall @( + @('Is64BitApplication', $true, 'Exact'), + @('DisplayName', 'Java 8 Update 45', 'Exact'), + @('DisplayName', 'Java 8 Update 4*', 'WildCard'), + @('DisplayName', 'Java \d Update \d{3}', 'RegEx'), + @('DisplayName', 'Java 8 Update', 'Contains')) + +Removes all versions of software that match the name "Java 8 Update"; however, it does not uninstall 64-bit versions of the software, Update 45 of the software, or any Update that starts with 4. + +.NOTES + +More reading on how to create arrays if having trouble with -FilterApplication or -ExcludeFromUninstall parameter: http://blogs.msdn.com/b/powershell/archive/2007/01/23/array-literals-in-powershell.aspx + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + [Switch]$Exact = $false, + [Parameter(Mandatory = $false)] + [Switch]$WildCard = $false, + [Parameter(Mandatory = $false)] + [Alias('Arguments')] + [ValidateNotNullorEmpty()] + [String]$Parameters, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$AddParameters, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Array]$FilterApplication = @(@()), + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Array]$ExcludeFromUninstall = @(@()), + [Parameter(Mandatory = $false)] + [Switch]$IncludeUpdatesAndHotfixes = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$LoggingOptions, + [Parameter(Mandatory = $false)] + [Alias('LogName')] + [String]$private:LogName, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$PassThru = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Build the hashtable with the options that will be passed to Get-InstalledApplication using splatting + [Hashtable]$GetInstalledApplicationSplat = @{ Name = $name } + If ($Exact) { + $GetInstalledApplicationSplat.Add( 'Exact', $Exact) + } + ElseIf ($WildCard) { + $GetInstalledApplicationSplat.Add( 'WildCard', $WildCard) + } + If ($IncludeUpdatesAndHotfixes) { + $GetInstalledApplicationSplat.Add( 'IncludeUpdatesAndHotfixes', $IncludeUpdatesAndHotfixes) + } + + [PSObject[]]$installedApplications = Get-InstalledApplication @GetInstalledApplicationSplat + + Write-Log -Message "Found [$($installedApplications.Count)] application(s) that matched the specified criteria [$Name]." -Source ${CmdletName} + + ## Filter the results from Get-InstalledApplication + [Collections.ArrayList]$removeMSIApplications = New-Object -TypeName 'System.Collections.ArrayList' + If (($null -ne $installedApplications) -and ($installedApplications.Count)) { + ForEach ($installedApplication in $installedApplications) { + If ([String]::IsNullOrEmpty($installedApplication.ProductCode)) { + Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName)] because unable to discover MSI ProductCode from application's registry Uninstall subkey [$($installedApplication.UninstallSubkey)]." -Severity 2 -Source ${CmdletName} + Continue + } + + # Filter the results from Get-InstalledApplication to only those that should be uninstalled + [Boolean]$addAppToRemoveList = $true + If (($null -ne $FilterApplication) -and ($FilterApplication.Count)) { + Write-Log -Message 'Filter the results to only those that should be uninstalled as specified in parameter [-FilterApplication].' -Source ${CmdletName} + ForEach ($Filter in $FilterApplication) { + If ($Filter[2] -eq 'RegEx') { + If ($installedApplication.($Filter[0]) -match $Filter[1]) { + [Boolean]$addAppToRemoveList = $true + Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of regex match against [-FilterApplication] criteria." -Source ${CmdletName} + } + Else { + [Boolean]$addAppToRemoveList = $false + Break + } + } + ElseIf ($Filter[2] -eq 'Contains') { + If ($installedApplication.($Filter[0]) -match [RegEx]::Escape($Filter[1])) { + [Boolean]$addAppToRemoveList = $true + Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of contains match against [-FilterApplication] criteria." -Source ${CmdletName} + } + Else { + [Boolean]$addAppToRemoveList = $false + Break + } + } + ElseIf ($Filter[2] -eq 'WildCard') { + If ($installedApplication.($Filter[0]) -like $Filter[1]) { + [Boolean]$addAppToRemoveList = $true + Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of wildcard match against [-FilterApplication] criteria." -Source ${CmdletName} + } + Else { + [Boolean]$addAppToRemoveList = $false + Break + } + } + ElseIf ($Filter[2] -eq 'Exact') { + If ($installedApplication.($Filter[0]) -eq $Filter[1]) { + [Boolean]$addAppToRemoveList = $true + Write-Log -Message "Preserve removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of exact match against [-FilterApplication] criteria." -Source ${CmdletName} + } + Else { + [Boolean]$addAppToRemoveList = $false + Break + } + } + } + } + + # Filter the results from Get-InstalledApplication to remove those that should never be uninstalled + If (($null -ne $ExcludeFromUninstall) -and ($ExcludeFromUninstall.Count)) { + ForEach ($Exclude in $ExcludeFromUninstall) { + If ($Exclude[2] -eq 'RegEx') { + If ($installedApplication.($Exclude[0]) -match $Exclude[1]) { + [Boolean]$addAppToRemoveList = $false + Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of regex match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} + Break + } + } + ElseIf ($Exclude[2] -eq 'Contains') { + If ($installedApplication.($Exclude[0]) -match [RegEx]::Escape($Exclude[1])) { + [Boolean]$addAppToRemoveList = $false + Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of contains match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} + Break + } + } + ElseIf ($Exclude[2] -eq 'WildCard') { + If ($installedApplication.($Exclude[0]) -like $Exclude[1]) { + [Boolean]$addAppToRemoveList = $false + Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of wildcard match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} + Break + } + } + ElseIf ($Exclude[2] -eq 'Exact') { + If ($installedApplication.($Exclude[0]) -eq $Exclude[1]) { + [Boolean]$addAppToRemoveList = $false + Write-Log -Message "Skipping removal of application [$($installedApplication.DisplayName) $($installedApplication.Version)] because of exact match against [-ExcludeFromUninstall] criteria." -Source ${CmdletName} + Break + } + } + } + } + + If ($addAppToRemoveList) { + Write-Log -Message "Adding application to list for removal: [$($installedApplication.DisplayName) $($installedApplication.Version)]." -Source ${CmdletName} + $removeMSIApplications.Add($installedApplication) + } + } + } + + ## Build the hashtable with the options that will be passed to Execute-MSI using splatting + [Hashtable]$ExecuteMSISplat = @{ + Action = 'Uninstall' + Path = '' + ContinueOnError = $ContinueOnError + } + If ($Parameters) { + $ExecuteMSISplat.Add( 'Parameters', $Parameters) + } + ElseIf ($AddParameters) { + $ExecuteMSISplat.Add( 'AddParameters', $AddParameters) + } + If ($LoggingOptions) { + $ExecuteMSISplat.Add( 'LoggingOptions', $LoggingOptions) + } + If ($LogName) { + $ExecuteMSISplat.Add( 'LogName', $LogName) + } + If ($PassThru) { + $ExecuteMSISplat.Add( 'PassThru', $PassThru) + } + If ($IncludeUpdatesAndHotfixes) { + $ExecuteMSISplat.Add( 'IncludeUpdatesAndHotfixes', $IncludeUpdatesAndHotfixes) + } + + If (($null -ne $removeMSIApplications) -and ($removeMSIApplications.Count)) { + ForEach ($removeMSIApplication in $removeMSIApplications) { + Write-Log -Message "Removing application [$($removeMSIApplication.DisplayName) $($removeMSIApplication.Version)]." -Source ${CmdletName} + $ExecuteMSISplat.Path = $removeMSIApplication.ProductCode + If ($PassThru) { + [PSObject[]]$ExecuteResults += Execute-MSI @ExecuteMSISplat + } + Else { + Execute-MSI @ExecuteMSISplat + } + } + } + Else { + Write-Log -Message 'No applications found for removal. Continue...' -Source ${CmdletName} + } + } + End { + If ($PassThru) { + Write-Output -InputObject ($ExecuteResults) + } + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Execute-Process +Function Execute-Process { + <# +.SYNOPSIS + +Execute a process with optional arguments, working directory, window style. + +.DESCRIPTION + +Executes a process, e.g. a file included in the Files directory of the App Deploy Toolkit, or a file on the local machine. +Provides various options for handling the return codes (see Parameters). + +.PARAMETER Path + +Path to the file to be executed. If the file is located directly in the "Files" directory of the App Deploy Toolkit, only the file name needs to be specified. +Otherwise, the full path of the file must be specified. If the files is in a subdirectory of "Files", use the "$dirFiles" variable as shown in the example. + +.PARAMETER Parameters + +Arguments to be passed to the executable + +.PARAMETER SecureParameters + +Hides all parameters passed to the executable from the Toolkit log file + +.PARAMETER WindowStyle + +Style of the window of the process executed. Options: Normal, Hidden, Maximized, Minimized. Default: Normal. +Note: Not all processes honor WindowStyle. WindowStyle is a recommendation passed to the process. They can choose to ignore it. +Only works for native Windows GUI applications. If the WindowStyle is set to Hidden, UseShellExecute should be set to $true. + +.PARAMETER CreateNoWindow + +Specifies whether the process should be started with a new window to contain it. Only works for Console mode applications. UseShellExecute should be set to $false. +Default is false. + +.PARAMETER WorkingDirectory + +The working directory used for executing the process. Defaults to the directory of the file being executed. +Parameter UseShellExecute affects this parameter. + +.PARAMETER NoWait + +Immediately continue after executing the process. + +.PARAMETER PassThru + +If NoWait is not specified, returns an object with ExitCode, STDOut and STDErr output from the process. If NoWait is specified, returns an object with Id, Handle and ProcessName. + +.PARAMETER WaitForMsiExec + +Sometimes an EXE bootstrapper will launch an MSI install. In such cases, this variable will ensure that +this function waits for the msiexec engine to become available before starting the install. + +.PARAMETER MsiExecWaitTime + +Specify the length of time in seconds to wait for the msiexec engine to become available. Default: 600 seconds (10 minutes). + +.PARAMETER IgnoreExitCodes + +List the exit codes to ignore or * to ignore all exit codes. + +.PARAMETER PriorityClass + +Specifies priority class for the process. Options: Idle, Normal, High, AboveNormal, BelowNormal, RealTime. Default: Normal + +.PARAMETER ExitOnProcessFailure + +Specifies whether the function should call Exit-Script when the process returns an exit code that is considered an error/failure. Default: $true + +.PARAMETER UseShellExecute + +Specifies whether to use the operating system shell to start the process. $true if the shell should be used when starting the process; $false if the process should be created directly from the executable file. + +The word "Shell" in this context refers to a graphical shell (similar to the Windows shell) rather than command shells (for example, bash or sh) and lets users launch graphical applications or open documents. +It lets you open a file or a url and the Shell will figure out the program to open it with. +The WorkingDirectory property behaves differently depending on the value of the UseShellExecute property. When UseShellExecute is true, the WorkingDirectory property specifies the location of the executable. +When UseShellExecute is false, the WorkingDirectory property is not used to find the executable. Instead, it is used only by the process that is started and has meaning only within the context of the new process. +If you set UseShellExecute to $true, there will be no available output from the process. + +Default: $false + +.PARAMETER ContinueOnError + +Continue if an error occured while trying to start the process. Default: $false. + +.EXAMPLE + +Execute-Process -Path 'uninstall_flash_player_64bit.exe' -Parameters '/uninstall' -WindowStyle 'Hidden' + +If the file is in the "Files" directory of the App Deploy Toolkit, only the file name needs to be specified. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Execute-Process -Path "$dirFiles\Bin\setup.exe" -Parameters '/S' -WindowStyle 'Hidden' + +.EXAMPLE + +Execute-Process -Path 'setup.exe' -Parameters '/S' -IgnoreExitCodes '1,2' + +.EXAMPLE + +Execute-Process -Path 'setup.exe' -Parameters "-s -f2`"$configToolkitLogDir\$installName.log`"" + +Launch InstallShield "setup.exe" from the ".\Files" sub-directory and force log files to the logging folder. + +.EXAMPLE + +Execute-Process -Path 'setup.exe' -Parameters "/s /v`"ALLUSERS=1 /qn /L* \`"$configToolkitLogDir\$installName.log`"`"" + +Launch InstallShield "setup.exe" with embedded MSI and force log files to the logging folder. + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [Alias('FilePath')] + [ValidateNotNullorEmpty()] + [String]$Path, + [Parameter(Mandatory = $false)] + [Alias('Arguments')] + [ValidateNotNullorEmpty()] + [String[]]$Parameters, + [Parameter(Mandatory = $false)] + [Switch]$SecureParameters = $false, + [Parameter(Mandatory = $false)] + [ValidateSet('Normal', 'Hidden', 'Maximized', 'Minimized')] + [Diagnostics.ProcessWindowStyle]$WindowStyle = 'Normal', + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$CreateNoWindow = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$WorkingDirectory, + [Parameter(Mandatory = $false)] + [Switch]$NoWait = $false, + [Parameter(Mandatory = $false)] + [Switch]$PassThru = $false, + [Parameter(Mandatory = $false)] + [Switch]$WaitForMsiExec = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$MsiExecWaitTime = $configMSIMutexWaitTime, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$IgnoreExitCodes, + [Parameter(Mandatory = $false)] + [ValidateSet('Idle', 'Normal', 'High', 'AboveNormal', 'BelowNormal', 'RealTime')] + [Diagnostics.ProcessPriorityClass]$PriorityClass = 'Normal', + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ExitOnProcessFailure = $true, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$UseShellExecute = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + $private:returnCode = $null + + ## Validate and find the fully qualified path for the $Path variable. + If (([IO.Path]::IsPathRooted($Path)) -and ([IO.Path]::HasExtension($Path))) { + Write-Log -Message "[$Path] is a valid fully qualified path, continue." -Source ${CmdletName} + If (-not (Test-Path -LiteralPath $Path -PathType 'Leaf' -ErrorAction 'Stop')) { + Write-Log -Message "File [$Path] not found." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "File [$Path] not found." + } + Return + } + } + Else { + # The first directory to search will be the 'Files' subdirectory of the script directory + [String]$PathFolders = $dirFiles + # Add the current location of the console (Windows always searches this location first) + [String]$PathFolders = $PathFolders + ';' + (Get-Location -PSProvider 'FileSystem').Path + # Add the new path locations to the PATH environment variable + $env:PATH = $PathFolders + ';' + $env:PATH + + # Get the fully qualified path for the file. Get-Command searches PATH environment variable to find this value. + [String]$FullyQualifiedPath = Get-Command -Name $Path -CommandType 'Application' -TotalCount 1 -Syntax -ErrorAction 'Stop' + + # Revert the PATH environment variable to it's original value + $env:PATH = $env:PATH -replace [RegEx]::Escape($PathFolders + ';'), '' + + If ($FullyQualifiedPath) { + Write-Log -Message "[$Path] successfully resolved to fully qualified path [$FullyQualifiedPath]." -Source ${CmdletName} + $Path = $FullyQualifiedPath + } + Else { + Write-Log -Message "[$Path] contains an invalid path or file name." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "[$Path] contains an invalid path or file name." + } + Return + } + } + + ## Set the Working directory (if not specified) + If (-not $WorkingDirectory) { + $WorkingDirectory = Split-Path -Path $Path -Parent -ErrorAction 'Stop' + } + + ## If the WindowStyle parameter is set to 'Hidden', set the UseShellExecute parameter to '$true'. + If ($WindowStyle -eq 'Hidden') { + $UseShellExecute = $true + } + + ## If MSI install, check to see if the MSI installer service is available or if another MSI install is already underway. + ## Please note that a race condition is possible after this check where another process waiting for the MSI installer + ## to become available grabs the MSI Installer mutex before we do. Not too concerned about this possible race condition. + If (($Path -match 'msiexec') -or ($WaitForMsiExec)) { + [Timespan]$MsiExecWaitTimeSpan = New-TimeSpan -Seconds $MsiExecWaitTime + [Boolean]$MsiExecAvailable = Test-IsMutexAvailable -MutexName 'Global\_MSIExecute' -MutexWaitTimeInMilliseconds $MsiExecWaitTimeSpan.TotalMilliseconds + Start-Sleep -Seconds 1 + If (-not $MsiExecAvailable) { + # Default MSI exit code for install already in progress + [Int32]$returnCode = 1618 + Write-Log -Message 'Another MSI installation is already in progress and needs to be completed before proceeding with this installation.' -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw 'Another MSI installation is already in progress and needs to be completed before proceeding with this installation.' + } + Return + } + } + + Try { + ## Disable Zone checking to prevent warnings when running executables + $env:SEE_MASK_NOZONECHECKS = 1 + + ## Using this variable allows capture of exceptions from .NET methods. Private scope only changes value for current function. + $private:previousErrorActionPreference = $ErrorActionPreference + $ErrorActionPreference = 'Stop' + + ## Define process + $processStartInfo = New-Object -TypeName 'System.Diagnostics.ProcessStartInfo' -ErrorAction 'Stop' + $processStartInfo.FileName = $Path + $processStartInfo.WorkingDirectory = $WorkingDirectory + $processStartInfo.UseShellExecute = $UseShellExecute + $processStartInfo.ErrorDialog = $false + $processStartInfo.RedirectStandardOutput = $true + $processStartInfo.RedirectStandardError = $true + $processStartInfo.CreateNoWindow = $CreateNoWindow + If ($Parameters) { + $processStartInfo.Arguments = $Parameters + } + $processStartInfo.WindowStyle = $WindowStyle + If ($processStartInfo.UseShellExecute -eq $true) { + Write-Log -Message 'UseShellExecute is set to true, standard output and error will not be available.' -Source ${CmdletName} + $processStartInfo.RedirectStandardOutput = $false + $processStartInfo.RedirectStandardError = $false + } + $process = New-Object -TypeName 'System.Diagnostics.Process' -ErrorAction 'Stop' + $process.StartInfo = $processStartInfo + + If ($processStartInfo.UseShellExecute -eq $false) { + ## Add event handler to capture process's standard output redirection + [ScriptBlock]$processEventHandler = { If (-not [String]::IsNullOrEmpty($EventArgs.Data)) { + $Event.MessageData.AppendLine($EventArgs.Data) + } } + $stdOutBuilder = New-Object -TypeName 'System.Text.StringBuilder' -ArgumentList ('') + $stdOutEvent = Register-ObjectEvent -InputObject $process -Action $processEventHandler -EventName 'OutputDataReceived' -MessageData $stdOutBuilder -ErrorAction 'Stop' + $stdErrBuilder = New-Object -TypeName 'System.Text.StringBuilder' -ArgumentList ('') + $stdErrEvent = Register-ObjectEvent -InputObject $process -Action $processEventHandler -EventName 'ErrorDataReceived' -MessageData $stdErrBuilder -ErrorAction 'Stop' + } + + ## Start Process + Write-Log -Message "Working Directory is [$WorkingDirectory]." -Source ${CmdletName} + If ($Parameters) { + If ($Parameters -match '-Command \&') { + Write-Log -Message "Executing [$Path [PowerShell ScriptBlock]]..." -Source ${CmdletName} + } + Else { + If ($SecureParameters) { + Write-Log -Message "Executing [$Path (Parameters Hidden)]..." -Source ${CmdletName} + } + Else { + Write-Log -Message "Executing [$Path $Parameters]..." -Source ${CmdletName} + } + } + } + Else { + Write-Log -Message "Executing [$Path]..." -Source ${CmdletName} + } + + $null = $process.Start() + ## Set priority + If ($PriorityClass -ne 'Normal') { + Try { + If ($process.HasExited -eq $false) { + Write-Log -Message "Changing the priority class for the process to [$PriorityClass]" -Source ${CmdletName} + $process.PriorityClass = $PriorityClass + } + Else { + Write-Log -Message "Cannot change the priority class for the process to [$PriorityClass], because the process has exited already." -Severity 2 -Source ${CmdletName} + } + + } + Catch { + Write-Log -Message 'Failed to change the priority class for the process.' -Severity 2 -Source ${CmdletName} + } + } + ## NoWait specified, return process details. If it isn't specified, start reading standard Output and Error streams + If ($NoWait) { + Write-Log -Message 'NoWait parameter specified. Continuing without waiting for exit code...' -Source ${CmdletName} + + If ($PassThru) { + If ($process.HasExited -eq $false) { + Write-Log -Message 'PassThru parameter specified, returning process details object.' -Source ${CmdletName} + [PSObject]$ProcessDetails = New-Object -TypeName 'PSObject' -Property @{ Id = If ($process.Id) { + $process.Id + } + Else { + $null + } ; Handle = If ($process.Handle) { + $process.Handle + } + Else { + [IntPtr]::Zero + }; ProcessName = If ($process.ProcessName) { + $process.ProcessName + } + Else { + '' + } + } + Write-Output -InputObject ($ProcessDetails) + } + Else { + Write-Log -Message 'PassThru parameter specified, however the process has already exited.' -Source ${CmdletName} + } + } + } + Else { + If ($processStartInfo.UseShellExecute -eq $false) { + $process.BeginOutputReadLine() + $process.BeginErrorReadLine() + } + ## Instructs the Process component to wait indefinitely for the associated process to exit. + $process.WaitForExit() + + ## HasExited indicates that the associated process has terminated, either normally or abnormally. Wait until HasExited returns $true. + While (-not $process.HasExited) { + $process.Refresh(); Start-Sleep -Seconds 1 + } + + ## Get the exit code for the process + Try { + [Int32]$returnCode = $process.ExitCode + } + Catch [System.Management.Automation.PSInvalidCastException] { + # Catch exit codes that are out of int32 range + [Int32]$returnCode = 60013 + } + + If ($processStartInfo.UseShellExecute -eq $false) { + ## Unregister standard output and error event to retrieve process output + If ($stdOutEvent) { + Unregister-Event -SourceIdentifier $stdOutEvent.Name -ErrorAction 'Stop'; $stdOutEvent = $null + } + If ($stdErrEvent) { + Unregister-Event -SourceIdentifier $stdErrEvent.Name -ErrorAction 'Stop'; $stdErrEvent = $null + } + $stdOut = $stdOutBuilder.ToString() -replace $null, '' + $stdErr = $stdErrBuilder.ToString() -replace $null, '' + + If ($stdErr.Length -gt 0) { + Write-Log -Message "Standard error output from the process: $stdErr" -Severity 3 -Source ${CmdletName} + } + } + } + } + Finally { + If ($processStartInfo.UseShellExecute -eq $false) { + ## Make sure the standard output and error event is unregistered + If ($stdOutEvent) { + Unregister-Event -SourceIdentifier $stdOutEvent.Name -ErrorAction 'SilentlyContinue'; $stdOutEvent = $null + } + If ($stdErrEvent) { + Unregister-Event -SourceIdentifier $stdErrEvent.Name -ErrorAction 'SilentlyContinue'; $stdErrEvent = $null + } + } + ## Free resources associated with the process, this does not cause process to exit + If ($process) { + $process.Dispose() + } + + ## Re-enable Zone checking + Remove-Item -LiteralPath 'env:SEE_MASK_NOZONECHECKS' -ErrorAction 'SilentlyContinue' + + If ($private:previousErrorActionPreference) { + $ErrorActionPreference = $private:previousErrorActionPreference + } + } + + If (-not $NoWait) { + ## Check to see whether we should ignore exit codes + $ignoreExitCodeMatch = $false + If ($ignoreExitCodes) { + ## Check whether * was specified, which would tell us to ignore all exit codes + If ($ignoreExitCodes.Trim() -eq '*') { + $ignoreExitCodeMatch = $true + } + Else { + ## Split the processes on a comma + [Int32[]]$ignoreExitCodesArray = $ignoreExitCodes -split ',' + ForEach ($ignoreCode in $ignoreExitCodesArray) { + If ($returnCode -eq $ignoreCode) { + $ignoreExitCodeMatch = $true + } + } + } + } + + ## If the passthru switch is specified, return the exit code and any output from process + If ($PassThru) { + Write-Log -Message 'PassThru parameter specified, returning execution results object.' -Source ${CmdletName} + [PSObject]$ExecutionResults = New-Object -TypeName 'PSObject' -Property @{ ExitCode = $returnCode; StdOut = If ($stdOut) { + $stdOut + } + Else { + '' + }; StdErr = If ($stdErr) { + $stdErr + } + Else { + '' + } + } + Write-Output -InputObject ($ExecutionResults) + } + + If ($ignoreExitCodeMatch) { + Write-Log -Message "Execution completed and the exit code [$returncode] is being ignored." -Source ${CmdletName} + } + ElseIf (($returnCode -eq 3010) -or ($returnCode -eq 1641)) { + Write-Log -Message "Execution completed successfully with exit code [$returnCode]. A reboot is required." -Severity 2 -Source ${CmdletName} + Set-Variable -Name 'msiRebootDetected' -Value $true -Scope 'Script' + } + ElseIf (($returnCode -eq 1605) -and ($Path -match 'msiexec')) { + Write-Log -Message "Execution failed with exit code [$returnCode] because the product is not currently installed." -Severity 3 -Source ${CmdletName} + } + ElseIf (($returnCode -eq -2145124329) -and ($Path -match 'wusa')) { + Write-Log -Message "Execution failed with exit code [$returnCode] because the Windows Update is not applicable to this system." -Severity 3 -Source ${CmdletName} + } + ElseIf (($returnCode -eq 17025) -and ($Path -match 'fullfile')) { + Write-Log -Message "Execution failed with exit code [$returnCode] because the Office Update is not applicable to this system." -Severity 3 -Source ${CmdletName} + } + ElseIf ($returnCode -eq 0) { + Write-Log -Message "Execution completed successfully with exit code [$returnCode]." -Source ${CmdletName} + } + Else { + [String]$MsiExitCodeMessage = '' + If ($Path -match 'msiexec') { + [String]$MsiExitCodeMessage = Get-MsiExitCodeMessage -MsiExitCode $returnCode + } + + If ($MsiExitCodeMessage) { + Write-Log -Message "Execution failed with exit code [$returnCode]: $MsiExitCodeMessage" -Severity 3 -Source ${CmdletName} + } + Else { + Write-Log -Message "Execution failed with exit code [$returnCode]." -Severity 3 -Source ${CmdletName} + } + + If ($ExitOnProcessFailure) { + Exit-Script -ExitCode $returnCode + } + } + } + } + Catch { + If ([String]::IsNullOrEmpty([String]$returnCode)) { + [Int32]$returnCode = 60002 + Write-Log -Message "Function failed, setting exit code to [$returnCode]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Function failed, setting exit code to [$returnCode]. $($_.Exception.Message)" + } + } + Else { + Write-Log -Message "Execution completed with exit code [$returnCode]. Function failed. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + If ($PassThru) { + [PSObject]$ExecutionResults = New-Object -TypeName 'PSObject' -Property @{ ExitCode = $returnCode; StdOut = If ($stdOut) { + $stdOut + } + Else { + '' + }; StdErr = If ($stdErr) { + $stdErr + } + Else { + '' + } + } + Write-Output -InputObject ($ExecutionResults) + } + + If ($ExitOnProcessFailure) { + Exit-Script -ExitCode $returnCode + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-MsiExitCodeMessage +Function Get-MsiExitCodeMessage { + <# +.SYNOPSIS + + Get message for MSI error code + +.DESCRIPTION + + Get message for MSI error code by reading it from msimsg.dll + +.PARAMETER MsiErrorCode + + MSI error code + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the message for the MSI error code. + +.EXAMPLE + + Get-MsiExitCodeMessage -MsiErrorCode 1618 + +.NOTES + + This is an internal script function and should typically not be called directly. + +.LINK + + http://msdn.microsoft.com/en-us/library/aa368542(v=vs.85).aspx + +.LINK + + https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [Int32]$MsiExitCode + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Getting message for exit code [$MsiExitCode]." -Source ${CmdletName} + [String]$MsiExitCodeMsg = [PSADT.Msi]::GetMessageFromMsiExitCode($MsiExitCode) + Write-Output -InputObject ($MsiExitCodeMsg) + } + Catch { + Write-Log -Message "Failed to get message for exit code [$MsiExitCode]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Test-IsMutexAvailable +Function Test-IsMutexAvailable { + <# +.SYNOPSIS + +Wait, up to a timeout value, to check if current thread is able to acquire an exclusive lock on a system mutex. + +.DESCRIPTION + +A mutex can be used to serialize applications and prevent multiple instances from being opened at the same time. +Wait, up to a timeout (default is 1 millisecond), for the mutex to become available for an exclusive lock. + +.PARAMETER MutexName + +The name of the system mutex. + +.PARAMETER MutexWaitTime + +The number of milliseconds the current thread should wait to acquire an exclusive lock of a named mutex. Default is: 1 millisecond. +A wait timeof -1 milliseconds means to wait indefinitely. A wait time of zero does not acquire an exclusive lock but instead tests the state of the wait handle and returns immediately. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Boolean + +Returns $true if the current thread acquires an exclusive lock on the named mutex, $false otherwise. + +.EXAMPLE + +Test-IsMutexAvailable -MutexName 'Global\_MSIExecute' -MutexWaitTimeInMilliseconds 500 + +.EXAMPLE + +Test-IsMutexAvailable -MutexName 'Global\_MSIExecute' -MutexWaitTimeInMilliseconds (New-TimeSpan -Minutes 5).TotalMilliseconds + +.EXAMPLE + +Test-IsMutexAvailable -MutexName 'Global\_MSIExecute' -MutexWaitTimeInMilliseconds (New-TimeSpan -Seconds 60).TotalMilliseconds + +.NOTES + +This is an internal script function and should typically not be called directly. + +.LINK + + http://msdn.microsoft.com/en-us/library/aa372909(VS.85).asp + +.LINK + + https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateLength(1, 260)] + [String]$MutexName, + [Parameter(Mandatory = $false)] + [ValidateScript({ ($_ -ge -1) -and ($_ -le [Int32]::MaxValue) })] + [Int32]$MutexWaitTimeInMilliseconds = 1 + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + ## Initialize Variables + [Timespan]$MutexWaitTime = [Timespan]::FromMilliseconds($MutexWaitTimeInMilliseconds) + If ($MutexWaitTime.TotalMinutes -ge 1) { + [String]$WaitLogMsg = "$($MutexWaitTime.TotalMinutes) minute(s)" + } + ElseIf ($MutexWaitTime.TotalSeconds -ge 1) { + [String]$WaitLogMsg = "$($MutexWaitTime.TotalSeconds) second(s)" + } + Else { + [String]$WaitLogMsg = "$($MutexWaitTime.Milliseconds) millisecond(s)" + } + [Boolean]$IsUnhandledException = $false + [Boolean]$IsMutexFree = $false + [Threading.Mutex]$OpenExistingMutex = $null + } + Process { + Write-Log -Message "Checking to see if mutex [$MutexName] is available. Wait up to [$WaitLogMsg] for the mutex to become available." -Source ${CmdletName} + Try { + ## Using this variable allows capture of exceptions from .NET methods. Private scope only changes value for current function. + $private:previousErrorActionPreference = $ErrorActionPreference + $ErrorActionPreference = 'Stop' + + ## Open the specified named mutex, if it already exists, without acquiring an exclusive lock on it. If the system mutex does not exist, this method throws an exception instead of creating the system object. + [Threading.Mutex]$OpenExistingMutex = [Threading.Mutex]::OpenExisting($MutexName) + ## Attempt to acquire an exclusive lock on the mutex. Use a Timespan to specify a timeout value after which no further attempt is made to acquire a lock on the mutex. + $IsMutexFree = $OpenExistingMutex.WaitOne($MutexWaitTime, $false) + } + Catch [Threading.WaitHandleCannotBeOpenedException] { + ## The named mutex does not exist + $IsMutexFree = $true + } + Catch [ObjectDisposedException] { + ## Mutex was disposed between opening it and attempting to wait on it + $IsMutexFree = $true + } + Catch [UnauthorizedAccessException] { + ## The named mutex exists, but the user does not have the security access required to use it + $IsMutexFree = $false + } + Catch [Threading.AbandonedMutexException] { + ## The wait completed because a thread exited without releasing a mutex. This exception is thrown when one thread acquires a mutex object that another thread has abandoned by exiting without releasing it. + $IsMutexFree = $true + } + Catch { + $IsUnhandledException = $true + ## Return $true, to signify that mutex is available, because function was unable to successfully complete a check due to an unhandled exception. Default is to err on the side of the mutex being available on a hard failure. + Write-Log -Message "Unable to check if mutex [$MutexName] is available due to an unhandled exception. Will default to return value of [$true]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + $IsMutexFree = $true + } + Finally { + If ($IsMutexFree) { + If (-not $IsUnhandledException) { + Write-Log -Message "Mutex [$MutexName] is available for an exclusive lock." -Source ${CmdletName} + } + } + Else { + If ($MutexName -eq 'Global\_MSIExecute') { + ## Get the command line for the MSI installation in progress + Try { + [String]$msiInProgressCmdLine = Get-WmiObject -Class 'Win32_Process' -Filter "name = 'msiexec.exe'" -ErrorAction 'Stop' | Where-Object { $_.CommandLine } | Select-Object -ExpandProperty 'CommandLine' | Where-Object { $_ -match '\.msi' } | ForEach-Object { $_.Trim() } + } + Catch { + } + Write-Log -Message "Mutex [$MutexName] is not available for an exclusive lock because the following MSI installation is in progress [$msiInProgressCmdLine]." -Severity 2 -Source ${CmdletName} + } + Else { + Write-Log -Message "Mutex [$MutexName] is not available because another thread already has an exclusive lock on it." -Source ${CmdletName} + } + } + + If (($null -ne $OpenExistingMutex) -and ($IsMutexFree)) { + ## Release exclusive lock on the mutex + $null = $OpenExistingMutex.ReleaseMutex() + $OpenExistingMutex.Close() + } + If ($private:previousErrorActionPreference) { + $ErrorActionPreference = $private:previousErrorActionPreference + } + } + } + End { + Write-Output -InputObject ($IsMutexFree) + + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function New-Folder +Function New-Folder { + <# +.SYNOPSIS + +Create a new folder. + +.DESCRIPTION + +Create a new folder if it does not exist. + +.PARAMETER Path + +Path to the new folder to create. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +New-Folder -Path "$envWinDir\System32" + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Path, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + If (-not (Test-Path -LiteralPath $Path -PathType 'Container')) { + Write-Log -Message "Creating folder [$Path]." -Source ${CmdletName} + $null = New-Item -Path $Path -ItemType 'Directory' -ErrorAction 'Stop' -Force + } + Else { + Write-Log -Message "Folder [$Path] already exists." -Source ${CmdletName} + } + } + Catch { + Write-Log -Message "Failed to create folder [$Path]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to create folder [$Path]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Remove-Folder +Function Remove-Folder { + <# +.SYNOPSIS + +Remove folder and files if they exist. + +.DESCRIPTION + +Remove folder and all files with or without recursion in a given path. + +.PARAMETER Path + +Path to the folder to remove. + +.PARAMETER DisableRecursion + +Disables recursion while deleting. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Remove-Folder -Path "$envWinDir\Downloaded Program Files" + +Deletes all files and subfolders in the Windows\Downloads Program Files folder + +.EXAMPLE + +Remove-Folder -Path "$envTemp\MyAppCache" -DisableRecursion + +Deletes all files in the Temp\MyAppCache folder but does not delete any subfolders. + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Path, + [Parameter(Mandatory = $false)] + [Switch]$DisableRecursion, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + If (Test-Path -LiteralPath $Path -PathType 'Container' -ErrorAction 'SilentlyContinue') { + Try { + If ($DisableRecursion) { + Write-Log -Message "Deleting folder [$path] without recursion..." -Source ${CmdletName} + # Without recursion we have to go through the subfolder ourselves because Remove-Item asks for confirmation if we are trying to delete a non-empty folder without -Recurse + [Array]$ListOfChildItems = Get-ChildItem -LiteralPath $Path -Force + If ($ListOfChildItems) { + $SubfoldersSkipped = 0 + ForEach ($item in $ListOfChildItems) { + # Check whether this item is a folder + If (Test-Path -LiteralPath $item.FullName -PathType Container) { + # Item is a folder. Check if its empty + # Get list of child items in the folder + [Array]$ItemChildItems = Get-ChildItem -LiteralPath $item.FullName -Force -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorRemoveFolder' + If ($ItemChildItems.Count -eq 0) { + # The folder is empty, delete it + Remove-Item -LiteralPath $item.FullName -Force -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorRemoveFolder' + } + Else { + # Folder is not empty, skip it + $SubfoldersSkipped++ + Continue + } + } + Else { + # Item is a file. Delete it + Remove-Item -LiteralPath $item.FullName -Force -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorRemoveFolder' + } + } + If ($SubfoldersSkipped -gt 0) { + Throw "[$SubfoldersSkipped] subfolders are not empty!" + } + } + Else { + Remove-Item -LiteralPath $Path -Force -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorRemoveFolder' + } + } + Else { + Write-Log -Message "Deleting folder [$path] recursively..." -Source ${CmdletName} + Remove-Item -LiteralPath $Path -Force -Recurse -ErrorAction 'SilentlyContinue' -ErrorVariable '+ErrorRemoveFolder' + } + + If ($ErrorRemoveFolder) { + Throw $ErrorRemoveFolder + } + } + Catch { + Write-Log -Message "Failed to delete folder(s) and file(s) from path [$path]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to delete folder(s) and file(s) from path [$path]: $($_.Exception.Message)" + } + } + } + Else { + Write-Log -Message "Folder [$Path] does not exist." -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Copy-File +Function Copy-File { + <# +.SYNOPSIS + +Copy a file or group of files to a destination path. + +.DESCRIPTION + +Copy a file or group of files to a destination path. + +.PARAMETER Path + +Path of the file to copy. + +.PARAMETER Destination + +Destination Path of the file to copy. + +.PARAMETER Recurse + +Copy files in subdirectories. + +.PARAMETER Flatten + +Flattens the files into the root destination directory. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. This will continue the deployment script, but will not continue copying files if an error is encountered. Default is: $true. + +.PARAMETER ContinueFileCopyOnError + +Continue copying files if an error is encountered. This will continue the deployment script and will warn about files that failed to be copied. Default is: $false. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Copy-File -Path "$dirSupportFiles\MyApp.ini" -Destination "$envWinDir\MyApp.ini" + +.EXAMPLE + +Copy-File -Path "$dirSupportFiles\*.*" -Destination "$envTemp\tempfiles" + +Copy all of the files in a folder to a destination folder. + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String[]]$Path, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Destination, + [Parameter(Mandatory = $false)] + [Switch]$Recurse = $false, + [Parameter(Mandatory = $false)] + [Switch]$Flatten, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true, + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueFileCopyOnError = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + If ((-not ([IO.Path]::HasExtension($Destination))) -and (-not (Test-Path -LiteralPath $Destination -PathType 'Container'))) { + Write-Log -Message "Destination folder does not exist, creating destination folder [$destination]." -Source ${CmdletName} + $null = New-Item -Path $Destination -Type 'Directory' -Force -ErrorAction 'Stop' + } + + If ($Flatten) { + If ($Recurse) { + Write-Log -Message "Copying file(s) recursively in path [$path] to destination [$destination] root folder, flattened." -Source ${CmdletName} + If ($ContinueFileCopyOnError) { + $null = Get-ChildItem -Path $path -Recurse -Force -ErrorAction 'SilentlyContinue' | Where-Object { -not $_.PSIsContainer } | ForEach-Object { + Copy-Item -Path ($_.FullName) -Destination $destination -Force -ErrorAction 'SilentlyContinue' -ErrorVariable 'FileCopyError' + } + } + Else { + $null = Get-ChildItem -Path $path -Recurse -Force -ErrorAction 'SilentlyContinue' | Where-Object { -not $_.PSIsContainer } | ForEach-Object { + Copy-Item -Path ($_.FullName) -Destination $destination -Force -ErrorAction 'Stop' + } + } + } + Else { + Write-Log -Message "Copying file in path [$path] to destination [$destination]." -Source ${CmdletName} + If ($ContinueFileCopyOnError) { + $null = Copy-Item -Path $path -Destination $destination -Force -ErrorAction 'SilentlyContinue' -ErrorVariable 'FileCopyError' + } + Else { + $null = Copy-Item -Path $path -Destination $destination -Force -ErrorAction 'Stop' + } + } + } + Else { + If ($Recurse) { + Write-Log -Message "Copying file(s) recursively in path [$path] to destination [$destination]." -Source ${CmdletName} + If ($ContinueFileCopyOnError) { + $null = Copy-Item -Path $Path -Destination $Destination -Force -Recurse -ErrorAction 'SilentlyContinue' -ErrorVariable 'FileCopyError' + } + Else { + $null = Copy-Item -Path $Path -Destination $Destination -Force -Recurse -ErrorAction 'Stop' + } + } + Else { + Write-Log -Message "Copying file in path [$path] to destination [$destination]." -Source ${CmdletName} + If ($ContinueFileCopyOnError) { + $null = Copy-Item -Path $Path -Destination $Destination -Force -ErrorAction 'SilentlyContinue' -ErrorVariable 'FileCopyError' + } + Else { + $null = Copy-Item -Path $Path -Destination $Destination -Force -ErrorAction 'Stop' + } + } + } + + If ($FileCopyError) { + Write-Log -Message "The following warnings were detected while copying file(s) in path [$path] to destination [$destination]. `r`n$FileCopyError" -Severity 2 -Source ${CmdletName} + } + Else { + Write-Log -Message 'File copy completed successfully.' -Source ${CmdletName} + } + } + Catch { + Write-Log -Message "Failed to copy file(s) in path [$path] to destination [$destination]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to copy file(s) in path [$path] to destination [$destination]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Remove-File +Function Remove-File { + <# +.SYNOPSIS + +Removes one or more items from a given path on the filesystem. + +.DESCRIPTION + +Removes one or more items from a given path on the filesystem. + +.PARAMETER Path + +Specifies the path on the filesystem to be resolved. The value of Path will accept wildcards. Will accept an array of values. + +.PARAMETER LiteralPath + +Specifies the path on the filesystem to be resolved. The value of LiteralPath is used exactly as it is typed; no characters are interpreted as wildcards. Will accept an array of values. + +.PARAMETER Recurse + +Deletes the files in the specified location(s) and in all child items of the location(s). + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Remove-File -Path 'C:\Windows\Downloaded Program Files\Temp.inf' + +.EXAMPLE + +Remove-File -LiteralPath 'C:\Windows\Downloaded Program Files' -Recurse + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, ParameterSetName = 'Path')] + [ValidateNotNullorEmpty()] + [String[]]$Path, + [Parameter(Mandatory = $true, ParameterSetName = 'LiteralPath')] + [ValidateNotNullorEmpty()] + [String[]]$LiteralPath, + [Parameter(Mandatory = $false)] + [Switch]$Recurse = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Build hashtable of parameters/value pairs to be passed to Remove-Item cmdlet + [Hashtable]$RemoveFileSplat = @{ 'Recurse' = $Recurse + 'Force' = $true + 'ErrorVariable' = '+ErrorRemoveItem' + } + If ($ContinueOnError) { + $RemoveFileSplat.Add('ErrorAction', 'SilentlyContinue') + } + Else { + $RemoveFileSplat.Add('ErrorAction', 'Stop') + } + + ## Resolve the specified path, if the path does not exist, display a warning instead of an error + If ($PSCmdlet.ParameterSetName -eq 'Path') { + [String[]]$SpecifiedPath = $Path + } + Else { + [String[]]$SpecifiedPath = $LiteralPath + } + ForEach ($Item in $SpecifiedPath) { + Try { + If ($PSCmdlet.ParameterSetName -eq 'Path') { + [String[]]$ResolvedPath += Resolve-Path -Path $Item -ErrorAction 'Stop' | Where-Object { $_.Path } | Select-Object -ExpandProperty 'Path' -ErrorAction 'Stop' + } + Else { + [String[]]$ResolvedPath += Resolve-Path -LiteralPath $Item -ErrorAction 'Stop' | Where-Object { $_.Path } | Select-Object -ExpandProperty 'Path' -ErrorAction 'Stop' + } + } + Catch [System.Management.Automation.ItemNotFoundException] { + Write-Log -Message "Unable to resolve file(s) for deletion in path [$Item] because path does not exist." -Severity 2 -Source ${CmdletName} + } + Catch { + Write-Log -Message "Failed to resolve file(s) for deletion in path [$Item]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to resolve file(s) for deletion in path [$Item]: $($_.Exception.Message)" + } + } + } + + ## Delete specified path if it was successfully resolved + If ($ResolvedPath) { + ForEach ($Item in $ResolvedPath) { + Try { + If (($Recurse) -and (Test-Path -LiteralPath $Item -PathType 'Container')) { + Write-Log -Message "Deleting file(s) recursively in path [$Item]..." -Source ${CmdletName} + } + ElseIf ((-not $Recurse) -and (Test-Path -LiteralPath $Item -PathType 'Container')) { + Write-Log -Message "Skipping folder [$Item] because the Recurse switch was not specified." -Source ${CmdletName} + Continue + } + Else { + Write-Log -Message "Deleting file in path [$Item]..." -Source ${CmdletName} + } + $null = Remove-Item @RemoveFileSplat -LiteralPath $Item + } + Catch { + Write-Log -Message "Failed to delete file(s) in path [$Item]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to delete file(s) in path [$Item]: $($_.Exception.Message)" + } + } + } + } + + If ($ErrorRemoveItem) { + Write-Log -Message "The following error(s) took place while removing file(s) in path [$SpecifiedPath]. `r`n$(Resolve-Error -ErrorRecord $ErrorRemoveItem)" -Severity 2 -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Convert-RegistryPath +Function Convert-RegistryPath { + <# +.SYNOPSIS + +Converts the specified registry key path to a format that is compatible with built-in PowerShell cmdlets. + +.DESCRIPTION + +Converts the specified registry key path to a format that is compatible with built-in PowerShell cmdlets. + +Converts registry key hives to their full paths. Example: HKLM is converted to "Registry::HKEY_LOCAL_MACHINE". + +.PARAMETER Key + +Path to the registry key to convert (can be a registry hive or fully qualified path) + +.PARAMETER SID + +The security identifier (SID) for a user. Specifying this parameter will convert a HKEY_CURRENT_USER registry key to the HKEY_USERS\$SID format. + +Specify this parameter from the Invoke-HKCURegistrySettingsForAllUsers function to read/edit HKCU registry settings for all users on the system. + +.PARAMETER DisableFunctionLogging + +Disables logging of this function. Default: $true + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the converted registry key path. + +.EXAMPLE + +Convert-RegistryPath -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1AD147D0-BE0E-3D6C-AC11-64F6DC4163F1}' + +.EXAMPLE + +Convert-RegistryPath -Key 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1AD147D0-BE0E-3D6C-AC11-64F6DC4163F1}' + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Key, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$SID, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$DisableFunctionLogging = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Convert the registry key hive to the full path, only match if at the beginning of the line + If ($Key -match '^HKLM') { + $Key = $Key -replace '^HKLM:\\', 'HKEY_LOCAL_MACHINE\' -replace '^HKLM:', 'HKEY_LOCAL_MACHINE\' -replace '^HKLM\\', 'HKEY_LOCAL_MACHINE\' + } + ElseIf ($Key -match '^HKCR') { + $Key = $Key -replace '^HKCR:\\', 'HKEY_CLASSES_ROOT\' -replace '^HKCR:', 'HKEY_CLASSES_ROOT\' -replace '^HKCR\\', 'HKEY_CLASSES_ROOT\' + } + ElseIf ($Key -match '^HKCU') { + $Key = $Key -replace '^HKCU:\\', 'HKEY_CURRENT_USER\' -replace '^HKCU:', 'HKEY_CURRENT_USER\' -replace '^HKCU\\', 'HKEY_CURRENT_USER\' + } + ElseIf ($Key -match '^HKU') { + $Key = $Key -replace '^HKU:\\', 'HKEY_USERS\' -replace '^HKU:', 'HKEY_USERS\' -replace '^HKU\\', 'HKEY_USERS\' + } + ElseIf ($Key -match '^HKCC') { + $Key = $Key -replace '^HKCC:\\', 'HKEY_CURRENT_CONFIG\' -replace '^HKCC:', 'HKEY_CURRENT_CONFIG\' -replace '^HKCC\\', 'HKEY_CURRENT_CONFIG\' + } + ElseIf ($Key -match '^HKPD') { + $Key = $Key -replace '^HKPD:\\', 'HKEY_PERFORMANCE_DATA\' -replace '^HKPD:', 'HKEY_PERFORMANCE_DATA\' -replace '^HKPD\\', 'HKEY_PERFORMANCE_DATA\' + } + + ## Append the PowerShell provider to the registry key path + If ($key -notmatch '^Registry::') { + [String]$key = "Registry::$key" + } + + If ($PSBoundParameters.ContainsKey('SID')) { + ## If the SID variable is specified, then convert all HKEY_CURRENT_USER key's to HKEY_USERS\$SID + If ($key -match '^Registry::HKEY_CURRENT_USER\\') { + $key = $key -replace '^Registry::HKEY_CURRENT_USER\\', "Registry::HKEY_USERS\$SID\" + } + ElseIf (-not $DisableFunctionLogging) { + Write-Log -Message 'SID parameter specified but the registry hive of the key is not HKEY_CURRENT_USER.' -Source ${CmdletName} -Severity 2 + } + } + + If ($Key -match '^Registry::HKEY_LOCAL_MACHINE|^Registry::HKEY_CLASSES_ROOT|^Registry::HKEY_CURRENT_USER|^Registry::HKEY_USERS|^Registry::HKEY_CURRENT_CONFIG|^Registry::HKEY_PERFORMANCE_DATA') { + ## Check for expected key string format + If (-not $DisableFunctionLogging) { + Write-Log -Message "Return fully qualified registry key path [$key]." -Source ${CmdletName} + } + Write-Output -InputObject ($key) + } + Else { + # If key string is not properly formatted, throw an error + Throw "Unable to detect target registry hive in string [$key]." + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Test-RegistryValue +Function Test-RegistryValue { + <# +.SYNOPSIS + +Test if a registry value exists. + +.DESCRIPTION + +Checks a registry key path to see if it has a value with a given name. Can correctly handle cases where a value simply has an empty or null value. + +.PARAMETER Key + +Path of the registry key. + +.PARAMETER Value + +Specify the registry key value to check the existence of. + +.PARAMETER SID + +The security identifier (SID) for a user. Specifying this parameter will convert a HKEY_CURRENT_USER registry key to the HKEY_USERS\$SID format. + +Specify this parameter from the Invoke-HKCURegistrySettingsForAllUsers function to read/edit HKCU registry settings for all users on the system. + +.INPUTS + +System.String + +Accepts a string value for the registry key path. + +.OUTPUTS + +System.String + +Returns $true if the registry value exists, $false if it does not. + +.EXAMPLE + +Test-RegistryValue -Key 'HKLM:SYSTEM\CurrentControlSet\Control\Session Manager' -Value 'PendingFileRenameOperations' + +.NOTES + +To test if registry key exists, use Test-Path function like so: + +Test-Path -Path $Key -PathType 'Container' + +.LINK + +https://psappdeploytoolkit.com +#> + Param ( + [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] + [ValidateNotNullOrEmpty()]$Key, + [Parameter(Mandatory = $true, Position = 1)] + [ValidateNotNullOrEmpty()]$Value, + [Parameter(Mandatory = $false, Position = 2)] + [ValidateNotNullorEmpty()] + [String]$SID + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## If the SID variable is specified, then convert all HKEY_CURRENT_USER key's to HKEY_USERS\$SID + Try { + If ($PSBoundParameters.ContainsKey('SID')) { + [String]$Key = Convert-RegistryPath -Key $Key -SID $SID + } + Else { + [String]$Key = Convert-RegistryPath -Key $Key + } + } + Catch { + Throw + } + [Boolean]$IsRegistryValueExists = $false + Try { + If (Test-Path -LiteralPath $Key -ErrorAction 'Stop') { + [String[]]$PathProperties = Get-Item -LiteralPath $Key -ErrorAction 'Stop' | Select-Object -ExpandProperty 'Property' -ErrorAction 'Stop' + If ($PathProperties -contains $Value) { + $IsRegistryValueExists = $true + } + } + } + Catch { + } + + If ($IsRegistryValueExists) { + Write-Log -Message "Registry key value [$Key] [$Value] does exist." -Source ${CmdletName} + } + Else { + Write-Log -Message "Registry key value [$Key] [$Value] does not exist." -Source ${CmdletName} + } + Write-Output -InputObject ($IsRegistryValueExists) + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-RegistryKey +Function Get-RegistryKey { + <# +.SYNOPSIS + +Retrieves value names and value data for a specified registry key or optionally, a specific value. + +.DESCRIPTION + +Retrieves value names and value data for a specified registry key or optionally, a specific value. + +If the registry key does not exist or contain any values, the function will return $null by default. To test for existence of a registry key path, use built-in Test-Path cmdlet. + +.PARAMETER Key + +Path of the registry key. + +.PARAMETER Value + +Value to retrieve (optional). + +.PARAMETER SID + +The security identifier (SID) for a user. Specifying this parameter will convert a HKEY_CURRENT_USER registry key to the HKEY_USERS\$SID format. + +Specify this parameter from the Invoke-HKCURegistrySettingsForAllUsers function to read/edit HKCU registry settings for all users on the system. + +.PARAMETER ReturnEmptyKeyIfExists + +Return the registry key if it exists but it has no property/value pairs underneath it. Default is: $false. + +.PARAMETER DoNotExpandEnvironmentNames + +Return unexpanded REG_EXPAND_SZ values. Default is: $false. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the value of the registry key or value. + +.EXAMPLE + +Get-RegistryKey -Key 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{1AD147D0-BE0E-3D6C-AC11-64F6DC4163F1}' + +.EXAMPLE + +Get-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\iexplore.exe' + +.EXAMPLE + +Get-RegistryKey -Key 'HKLM:Software\Wow6432Node\Microsoft\Microsoft SQL Server Compact Edition\v3.5' -Value 'Version' + +.EXAMPLE + +Get-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' -Value 'Path' -DoNotExpandEnvironmentNames + +Returns %ProgramFiles%\Java instead of C:\Program Files\Java + +.EXAMPLE + +Get-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Example' -Value '(Default)' + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Key, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$Value, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$SID, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$ReturnEmptyKeyIfExists = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$DoNotExpandEnvironmentNames = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + ## If the SID variable is specified, then convert all HKEY_CURRENT_USER key's to HKEY_USERS\$SID + If ($PSBoundParameters.ContainsKey('SID')) { + [String]$key = Convert-RegistryPath -Key $key -SID $SID + } + Else { + [String]$key = Convert-RegistryPath -Key $key + } + + ## Check if the registry key exists + If (-not (Test-Path -LiteralPath $key -ErrorAction 'Stop')) { + Write-Log -Message "Registry key [$key] does not exist. Return `$null." -Severity 2 -Source ${CmdletName} + $regKeyValue = $null + } + Else { + If ($PSBoundParameters.ContainsKey('Value')) { + Write-Log -Message "Getting registry key [$key] value [$value]." -Source ${CmdletName} + } + Else { + Write-Log -Message "Getting registry key [$key] and all property values." -Source ${CmdletName} + } + + ## Get all property values for registry key + $regKeyValue = Get-ItemProperty -LiteralPath $key -ErrorAction 'Stop' + [Int32]$regKeyValuePropertyCount = $regKeyValue | Measure-Object | Select-Object -ExpandProperty 'Count' + + ## Select requested property + If ($PSBoundParameters.ContainsKey('Value')) { + # Check if registry value exists + [Boolean]$IsRegistryValueExists = $false + If ($regKeyValuePropertyCount -gt 0) { + Try { + [string[]]$PathProperties = Get-Item -LiteralPath $Key -ErrorAction 'Stop' | Select-Object -ExpandProperty 'Property' -ErrorAction 'Stop' + If ($PathProperties -contains $Value) { + $IsRegistryValueExists = $true + } + } + Catch { + } + } + + # Get the Value (do not make a strongly typed variable because it depends entirely on what kind of value is being read) + If ($IsRegistryValueExists) { + If ($DoNotExpandEnvironmentNames) { + #Only useful on 'ExpandString' values + If ($Value -like '(Default)') { + $regKeyValue = $(Get-Item -LiteralPath $key -ErrorAction 'Stop').GetValue($null, $null, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames) + } + Else { + $regKeyValue = $(Get-Item -LiteralPath $key -ErrorAction 'Stop').GetValue($Value, $null, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames) + } + } + ElseIf ($Value -like '(Default)') { + $regKeyValue = $(Get-Item -LiteralPath $key -ErrorAction 'Stop').GetValue($null) + } + Else { + $regKeyValue = $regKeyValue | Select-Object -ExpandProperty $Value -ErrorAction 'SilentlyContinue' + } + } + Else { + Write-Log -Message "Registry key value [$Key] [$Value] does not exist. Return `$null." -Source ${CmdletName} + $regKeyValue = $null + } + } + ## Select all properties or return empty key object + Else { + If ($regKeyValuePropertyCount -eq 0) { + If ($ReturnEmptyKeyIfExists) { + Write-Log -Message "No property values found for registry key. Return empty registry key object [$key]." -Source ${CmdletName} + $regKeyValue = Get-Item -LiteralPath $key -Force -ErrorAction 'Stop' + } + Else { + Write-Log -Message "No property values found for registry key. Return `$null." -Source ${CmdletName} + $regKeyValue = $null + } + } + } + } + Write-Output -InputObject ($regKeyValue) + } + Catch { + If (-not $Value) { + Write-Log -Message "Failed to read registry key [$key]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to read registry key [$key]: $($_.Exception.Message)" + } + } + Else { + Write-Log -Message "Failed to read registry key [$key] value [$value]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to read registry key [$key] value [$value]: $($_.Exception.Message)" + } + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Set-RegistryKey +Function Set-RegistryKey { + <# +.SYNOPSIS + +Creates a registry key name, value, and value data; it sets the same if it already exists. + +.DESCRIPTION + +Creates a registry key name, value, and value data; it sets the same if it already exists. + +.PARAMETER Key + +The registry key path. + +.PARAMETER Name + +The value name. + +.PARAMETER Value + +The value data. + +.PARAMETER Type + +The type of registry value to create or set. Options: 'Binary','DWord','ExpandString','MultiString','None','QWord','String','Unknown'. Default: String. + +DWord should be specified as a decimal. + +.PARAMETER SID + +The security identifier (SID) for a user. Specifying this parameter will convert a HKEY_CURRENT_USER registry key to the HKEY_USERS\$SID format. + +Specify this parameter from the Invoke-HKCURegistrySettingsForAllUsers function to read/edit HKCU registry settings for all users on the system. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Set-RegistryKey -Key $blockedAppPath -Name 'Debugger' -Value $blockedAppDebuggerValue + +.EXAMPLE + +Set-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE' -Name 'Application' -Type 'DWord' -Value '1' + +.EXAMPLE + +Set-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce' -Name 'Debugger' -Value $blockedAppDebuggerValue -Type String + +.EXAMPLE + +Set-RegistryKey -Key 'HKCU\Software\Microsoft\Example' -Name 'Data' -Value (0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x01,0x01,0x01,0x02,0x02,0x02) -Type 'Binary' + +.EXAMPLE + +Set-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Example' -Name '(Default)' -Value "Text" + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Key, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + $Value, + [Parameter(Mandatory = $false)] + [ValidateSet('Binary', 'DWord', 'ExpandString', 'MultiString', 'None', 'QWord', 'String', 'Unknown')] + [Microsoft.Win32.RegistryValueKind]$Type = 'String', + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$SID, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + [String]$RegistryValueWriteAction = 'set' + + ## If the SID variable is specified, then convert all HKEY_CURRENT_USER key's to HKEY_USERS\$SID + If ($PSBoundParameters.ContainsKey('SID')) { + [String]$key = Convert-RegistryPath -Key $key -SID $SID + } + Else { + [String]$key = Convert-RegistryPath -Key $key + } + + ## Create registry key if it doesn't exist + If (-not (Test-Path -LiteralPath $key -ErrorAction 'Stop')) { + Try { + Write-Log -Message "Creating registry key [$key]." -Source ${CmdletName} + # No forward slash found in Key. Use New-Item cmdlet to create registry key + If ((($Key -split '/').Count - 1) -eq 0) { + $null = New-Item -Path $key -ItemType 'Registry' -Force -ErrorAction 'Stop' + } + # Forward slash was found in Key. Use REG.exe ADD to create registry key + Else { + [String]$CreateRegkeyResult = & "$envWinDir\System32\reg.exe" Add "$($Key.Substring($Key.IndexOf('::') + 2))" + If ($global:LastExitCode -ne 0) { + Throw "Failed to create registry key [$Key]" + } + } + } + Catch { + Throw + } + } + + If ($Name) { + ## Set registry value if it doesn't exist + If (-not (Get-ItemProperty -LiteralPath $key -Name $Name -ErrorAction 'SilentlyContinue')) { + Write-Log -Message "Setting registry key value: [$key] [$name = $value]." -Source ${CmdletName} + $null = New-ItemProperty -LiteralPath $key -Name $name -Value $value -PropertyType $Type -ErrorAction 'Stop' + } + ## Update registry value if it does exist + Else { + [String]$RegistryValueWriteAction = 'update' + If ($Name -eq '(Default)') { + ## Set Default registry key value with the following workaround, because Set-ItemProperty contains a bug and cannot set Default registry key value + $null = $(Get-Item -LiteralPath $key -ErrorAction 'Stop').OpenSubKey('', 'ReadWriteSubTree').SetValue($null, $value) + } + Else { + Write-Log -Message "Updating registry key value: [$key] [$name = $value]." -Source ${CmdletName} + $null = Set-ItemProperty -LiteralPath $key -Name $name -Value $value -ErrorAction 'Stop' + } + } + } + } + Catch { + If ($Name) { + Write-Log -Message "Failed to $RegistryValueWriteAction value [$value] for registry key [$key] [$name]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to $RegistryValueWriteAction value [$value] for registry key [$key] [$name]: $($_.Exception.Message)" + } + } + Else { + Write-Log -Message "Failed to set registry key [$key]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to set registry key [$key]: $($_.Exception.Message)" + } + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Remove-RegistryKey +Function Remove-RegistryKey { + <# +.SYNOPSIS + +Deletes the specified registry key or value. + +.DESCRIPTION + +Deletes the specified registry key or value. + +.PARAMETER Key + +Path of the registry key to delete. + +.PARAMETER Name + +Name of the registry value to delete. + +.PARAMETER Recurse + +Delete registry key recursively. + +.PARAMETER SID + +The security identifier (SID) for a user. Specifying this parameter will convert a HKEY_CURRENT_USER registry key to the HKEY_USERS\$SID format. + +Specify this parameter from the Invoke-HKCURegistrySettingsForAllUsers function to read/edit HKCU registry settings for all users on the system. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Remove-RegistryKey -Key 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce' + +.EXAMPLE + +Remove-RegistryKey -Key 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Run' -Name 'RunAppInstall' + +.EXAMPLE + +Remove-RegistryKey -Key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Example' -Name '(Default)' + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Key, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + [Switch]$Recurse, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$SID, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + ## If the SID variable is specified, then convert all HKEY_CURRENT_USER key's to HKEY_USERS\$SID + If ($PSBoundParameters.ContainsKey('SID')) { + [String]$Key = Convert-RegistryPath -Key $Key -SID $SID + } + Else { + [String]$Key = Convert-RegistryPath -Key $Key + } + + If (-not $Name) { + If (Test-Path -LiteralPath $Key -ErrorAction 'Stop') { + If ($Recurse) { + Write-Log -Message "Deleting registry key recursively [$Key]." -Source ${CmdletName} + $null = Remove-Item -LiteralPath $Key -Force -Recurse -ErrorAction 'Stop' + } + Else { + If ($null -eq (Get-ChildItem -LiteralPath $Key -ErrorAction 'Stop')) { + ## Check if there are subkeys of $Key, if so, executing Remove-Item will hang. Avoiding this with Get-ChildItem. + Write-Log -Message "Deleting registry key [$Key]." -Source ${CmdletName} + $null = Remove-Item -LiteralPath $Key -Force -ErrorAction 'Stop' + } + Else { + Throw "Unable to delete child key(s) of [$Key] without [-Recurse] switch." + } + } + } + Else { + Write-Log -Message "Unable to delete registry key [$Key] because it does not exist." -Severity 2 -Source ${CmdletName} + } + } + Else { + If (Test-Path -LiteralPath $Key -ErrorAction 'Stop') { + Write-Log -Message "Deleting registry value [$Key] [$Name]." -Source ${CmdletName} + + If ($Name -eq '(Default)') { + ## Remove (Default) registry key value with the following workaround because Remove-ItemProperty cannot remove the (Default) registry key value + $null = (Get-Item -LiteralPath $Key -ErrorAction 'Stop').OpenSubKey('', 'ReadWriteSubTree').DeleteValue('') + } + Else { + $null = Remove-ItemProperty -LiteralPath $Key -Name $Name -Force -ErrorAction 'Stop' + } + } + Else { + Write-Log -Message "Unable to delete registry value [$Key] [$Name] because registry key does not exist." -Severity 2 -Source ${CmdletName} + } + } + } + Catch [System.Management.Automation.PSArgumentException] { + Write-Log -Message "Unable to delete registry value [$Key] [$Name] because it does not exist." -Severity 2 -Source ${CmdletName} + } + Catch { + If (-not $Name) { + Write-Log -Message "Failed to delete registry key [$Key]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to delete registry key [$Key]: $($_.Exception.Message)" + } + } + Else { + Write-Log -Message "Failed to delete registry value [$Key] [$Name]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to delete registry value [$Key] [$Name]: $($_.Exception.Message)" + } + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Invoke-HKCURegistrySettingsForAllUsers +Function Invoke-HKCURegistrySettingsForAllUsers { + <# +.SYNOPSIS + +Set current user registry settings for all current users and any new users in the future. + +.DESCRIPTION + +Set HKCU registry settings for all current and future users by loading their NTUSER.dat registry hive file, and making the modifications. + +This function will modify HKCU settings for all users even when executed under the SYSTEM account. + +To ensure new users in the future get the registry edits, the Default User registry hive used to provision the registry for new users is modified. + +This function can be used as an alternative to using ActiveSetup for registry settings. + +The advantage of using this function over ActiveSetup is that a user does not have to log off and log back on before the changes take effect. + +.PARAMETER RegistrySettings + +Script block which contains HKCU registry settings which should be modified for all users on the system. Must specify the -SID parameter for all HKCU settings. + +.PARAMETER UserProfiles + +Specify the user profiles to modify HKCU registry settings for. Default is all user profiles except for system profiles. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +[ScriptBlock]$HKCURegistrySettings = { + +Set-RegistryKey -Key 'HKCU\Software\Microsoft\Office\14.0\Common' -Name 'qmenable' -Value 0 -Type DWord -SID $UserProfile.SID + +Set-RegistryKey -Key 'HKCU\Software\Microsoft\Office\14.0\Common' -Name 'updatereliabilitydata' -Value 1 -Type DWord -SID $UserProfile.SID + +} + +Invoke-HKCURegistrySettingsForAllUsers -RegistrySettings $HKCURegistrySettings + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [ScriptBlock]$RegistrySettings, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [PSObject[]]$UserProfiles = (Get-UserProfiles) + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ForEach ($UserProfile in $UserProfiles) { + Try { + # Set the path to the user's registry hive when it is loaded + [String]$UserRegistryPath = "Registry::HKEY_USERS\$($UserProfile.SID)" + + # Set the path to the user's registry hive file + [String]$UserRegistryHiveFile = Join-Path -Path $UserProfile.ProfilePath -ChildPath 'NTUSER.DAT' + + # Load the User profile registry hive if it is not already loaded because the User is logged in + [Boolean]$ManuallyLoadedRegHive = $false + If (-not (Test-Path -LiteralPath $UserRegistryPath)) { + # Load the User registry hive if the registry hive file exists + If (Test-Path -LiteralPath $UserRegistryHiveFile -PathType 'Leaf') { + Write-Log -Message "Loading the User [$($UserProfile.NTAccount)] registry hive in path [HKEY_USERS\$($UserProfile.SID)]." -Source ${CmdletName} + [String]$HiveLoadResult = & "$envWinDir\System32\reg.exe" load "`"HKEY_USERS\$($UserProfile.SID)`"" "`"$UserRegistryHiveFile`"" + + If ($global:LastExitCode -ne 0) { + Throw "Failed to load the registry hive for User [$($UserProfile.NTAccount)] with SID [$($UserProfile.SID)]. Failure message [$HiveLoadResult]. Continue..." + } + + [Boolean]$ManuallyLoadedRegHive = $true + } + Else { + Throw "Failed to find the registry hive file [$UserRegistryHiveFile] for User [$($UserProfile.NTAccount)] with SID [$($UserProfile.SID)]. Continue..." + } + } + Else { + Write-Log -Message "The user [$($UserProfile.NTAccount)] registry hive is already loaded in path [HKEY_USERS\$($UserProfile.SID)]." -Source ${CmdletName} + } + + ## Execute ScriptBlock which contains code to manipulate HKCU registry. + # Make sure read/write calls to the HKCU registry hive specify the -SID parameter or settings will not be changed for all users. + # Example: Set-RegistryKey -Key 'HKCU\Software\Microsoft\Office\14.0\Common' -Name 'qmenable' -Value 0 -Type DWord -SID $UserProfile.SID + Write-Log -Message 'Executing ScriptBlock to modify HKCU registry settings for all users.' -Source ${CmdletName} + & $RegistrySettings + } + Catch { + Write-Log -Message "Failed to modify the registry hive for User [$($UserProfile.NTAccount)] with SID [$($UserProfile.SID)] `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + Finally { + If ($ManuallyLoadedRegHive) { + Try { + Write-Log -Message "Unload the User [$($UserProfile.NTAccount)] registry hive in path [HKEY_USERS\$($UserProfile.SID)]." -Source ${CmdletName} + [String]$HiveLoadResult = & "$envWinDir\System32\reg.exe" unload "`"HKEY_USERS\$($UserProfile.SID)`"" + + If ($global:LastExitCode -ne 0) { + Write-Log -Message "REG.exe failed to unload the registry hive and exited with exit code [$($global:LastExitCode)]. Performing manual garbage collection to ensure successful unloading of registry hive." -Severity 2 -Source ${CmdletName} + [GC]::Collect() + [GC]::WaitForPendingFinalizers() + Start-Sleep -Seconds 5 + + Write-Log -Message "Unload the User [$($UserProfile.NTAccount)] registry hive in path [HKEY_USERS\$($UserProfile.SID)]." -Source ${CmdletName} + [String]$HiveLoadResult = & "$envWinDir\System32\reg.exe" unload "`"HKEY_USERS\$($UserProfile.SID)`"" + If ($global:LastExitCode -ne 0) { + Throw "REG.exe failed with exit code [$($global:LastExitCode)] and result [$HiveLoadResult]." + } + } + } + Catch { + Write-Log -Message "Failed to unload the registry hive for User [$($UserProfile.NTAccount)] with SID [$($UserProfile.SID)]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function ConvertTo-NTAccountOrSID +Function ConvertTo-NTAccountOrSID { + <# +.SYNOPSIS + +Convert between NT Account names and their security identifiers (SIDs). + +.DESCRIPTION + +Specify either the NT Account name or the SID and get the other. Can also convert well known sid types. + +.PARAMETER AccountName + +The Windows NT Account name specified in \ format. +Use fully qualified account names (e.g., \) instead of isolated names (e.g, ) because they are unambiguous and provide better performance. + +.PARAMETER SID + +The Windows NT Account SID. + +.PARAMETER WellKnownSIDName + +Specify the Well Known SID name translate to the actual SID (e.g., LocalServiceSid). + +To get all well known SIDs available on system: [Enum]::GetNames([Security.Principal.WellKnownSidType]) + +.PARAMETER WellKnownToNTAccount + +Convert the Well Known SID to an NTAccount name + +.INPUTS + +System.String + +Accepts a string containing the NT Account name or SID. + +.OUTPUTS + +System.String + +Returns the NT Account name or SID. + +.EXAMPLE + +ConvertTo-NTAccountOrSID -AccountName 'CONTOSO\User1' + +Converts a Windows NT Account name to the corresponding SID + +.EXAMPLE + +ConvertTo-NTAccountOrSID -SID 'S-1-5-21-1220945662-2111687655-725345543-14012660' + +Converts a Windows NT Account SID to the corresponding NT Account Name + +.EXAMPLE + +ConvertTo-NTAccountOrSID -WellKnownSIDName 'NetworkServiceSid' + +Converts a Well Known SID name to a SID + +.NOTES + +This is an internal script function and should typically not be called directly. + +The conversion can return an empty result if the user account does not exist anymore or if translation fails. + +http://blogs.technet.com/b/askds/archive/2011/07/28/troubleshooting-sid-translation-failures-from-the-obvious-to-the-not-so-obvious.aspx + +.LINK + +https://psappdeploytoolkit.com + +.LINK + +http://msdn.microsoft.com/en-us/library/system.security.principal.wellknownsidtype(v=vs.110).aspx + +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, ParameterSetName = 'NTAccountToSID', ValueFromPipelineByPropertyName = $true)] + [ValidateNotNullOrEmpty()] + [String]$AccountName, + [Parameter(Mandatory = $true, ParameterSetName = 'SIDToNTAccount', ValueFromPipelineByPropertyName = $true)] + [ValidateNotNullOrEmpty()] + [String]$SID, + [Parameter(Mandatory = $true, ParameterSetName = 'WellKnownName', ValueFromPipelineByPropertyName = $true)] + [ValidateNotNullOrEmpty()] + [String]$WellKnownSIDName, + [Parameter(Mandatory = $false, ParameterSetName = 'WellKnownName')] + [ValidateNotNullOrEmpty()] + [Switch]$WellKnownToNTAccount + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Switch ($PSCmdlet.ParameterSetName) { + 'SIDToNTAccount' { + [String]$msg = "the SID [$SID] to an NT Account name" + Write-Log -Message "Converting $msg." -Source ${CmdletName} + + $NTAccountSID = New-Object -TypeName 'System.Security.Principal.SecurityIdentifier' -ArgumentList ($SID) + $NTAccount = $NTAccountSID.Translate([Security.Principal.NTAccount]) + Write-Output -InputObject ($NTAccount) + } + 'NTAccountToSID' { + [String]$msg = "the NT Account [$AccountName] to a SID" + Write-Log -Message "Converting $msg." -Source ${CmdletName} + + $NTAccount = New-Object -TypeName 'System.Security.Principal.NTAccount' -ArgumentList ($AccountName) + $NTAccountSID = $NTAccount.Translate([Security.Principal.SecurityIdentifier]) + Write-Output -InputObject ($NTAccountSID) + } + 'WellKnownName' { + If ($WellKnownToNTAccount) { + [String]$ConversionType = 'NTAccount' + } + Else { + [String]$ConversionType = 'SID' + } + [String]$msg = "the Well Known SID Name [$WellKnownSIDName] to a $ConversionType" + Write-Log -Message "Converting $msg." -Source ${CmdletName} + + # Get the SID for the root domain + Try { + $MachineRootDomain = (Get-WmiObject -Class 'Win32_ComputerSystem' -ErrorAction 'Stop').Domain.ToLower() + $ADDomainObj = New-Object -TypeName 'System.DirectoryServices.DirectoryEntry' -ArgumentList ("LDAP://$MachineRootDomain") + $DomainSidInBinary = $ADDomainObj.ObjectSid + $DomainSid = New-Object -TypeName 'System.Security.Principal.SecurityIdentifier' -ArgumentList ($DomainSidInBinary[0], 0) + } + Catch { + Write-Log -Message 'Unable to get Domain SID from Active Directory. Setting Domain SID to $null.' -Severity 2 -Source ${CmdletName} + $DomainSid = $null + } + + # Get the SID for the well known SID name + $WellKnownSidType = [Security.Principal.WellKnownSidType]::$WellKnownSIDName + $NTAccountSID = New-Object -TypeName 'System.Security.Principal.SecurityIdentifier' -ArgumentList ($WellKnownSidType, $DomainSid) + + If ($WellKnownToNTAccount) { + $NTAccount = $NTAccountSID.Translate([Security.Principal.NTAccount]) + Write-Output -InputObject ($NTAccount) + } + Else { + Write-Output -InputObject ($NTAccountSID) + } + } + } + } + Catch { + Write-Log -Message "Failed to convert $msg. It may not be a valid account anymore or there is some other problem. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-UserProfiles +Function Get-UserProfiles { + <# +.SYNOPSIS + +Get the User Profile Path, User Account Sid, and the User Account Name for all users that log onto the machine and also the Default User (which does not log on). + +.DESCRIPTION + +Get the User Profile Path, User Account Sid, and the User Account Name for all users that log onto the machine and also the Default User (which does not log on). + +Please note that the NTAccount property may be empty for some user profiles but the SID and ProfilePath properties will always be populated. + +.PARAMETER ExcludeNTAccount + +Specify NT account names in Domain\Username format to exclude from the list of user profiles. + +.PARAMETER ExcludeSystemProfiles + +Exclude system profiles: SYSTEM, LOCAL SERVICE, NETWORK SERVICE. Default is: $true. + +.PARAMETER ExcludeDefaultUser + +Exclude the Default User. Default is: $false. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +PSObject. Returns a PSObject with the following properties: NTAccount, SID, ProfilePath + +.EXAMPLE + +Get-UserProfiles + +Returns the following properties for each user profile on the system: NTAccount, SID, ProfilePath + +.EXAMPLE + +Get-UserProfiles -ExcludeNTAccount 'CONTOSO\Robot','CONTOSO\ntadmin' + +.EXAMPLE + +[String[]]$ProfilePaths = Get-UserProfiles | Select-Object -ExpandProperty 'ProfilePath' + +Returns the user profile path for each user on the system. This information can then be used to make modifications under the user profile on the filesystem. + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String[]]$ExcludeNTAccount, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ExcludeSystemProfiles = $true, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$ExcludeDefaultUser = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Getting the User Profile Path, User Account SID, and the User Account Name for all users that log onto the machine.' -Source ${CmdletName} + + ## Get the User Profile Path, User Account Sid, and the User Account Name for all users that log onto the machine + [String]$UserProfileListRegKey = 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' + [PSObject[]]$UserProfiles = Get-ChildItem -LiteralPath $UserProfileListRegKey -ErrorAction 'Stop' | + ForEach-Object { + Get-ItemProperty -LiteralPath $_.PSPath -ErrorAction 'Stop' | Where-Object { ($_.ProfileImagePath) } | + Select-Object @{ Label = 'NTAccount'; Expression = { $(ConvertTo-NTAccountOrSID -SID $_.PSChildName).Value } }, @{ Label = 'SID'; Expression = { $_.PSChildName } }, @{ Label = 'ProfilePath'; Expression = { $_.ProfileImagePath } } + } | + Where-Object { $_.NTAccount } # This removes the "defaultuser0" account, which is a Windows 10 bug + If ($ExcludeSystemProfiles) { + [String[]]$SystemProfiles = 'S-1-5-18', 'S-1-5-19', 'S-1-5-20' + [PSObject[]]$UserProfiles = $UserProfiles | Where-Object { $SystemProfiles -notcontains $_.SID } + } + If ($ExcludeNTAccount) { + [PSObject[]]$UserProfiles = $UserProfiles | Where-Object { $ExcludeNTAccount -notcontains $_.NTAccount } + } + + ## Find the path to the Default User profile + If (-not $ExcludeDefaultUser) { + [String]$UserProfilesDirectory = Get-ItemProperty -LiteralPath $UserProfileListRegKey -Name 'ProfilesDirectory' -ErrorAction 'Stop' | Select-Object -ExpandProperty 'ProfilesDirectory' + + # On Windows Vista or higher + If (([Version]$envOSVersion).Major -gt 5) { + # Path to Default User Profile directory on Windows Vista or higher: By default, C:\Users\Default + [string]$DefaultUserProfileDirectory = Get-ItemProperty -LiteralPath $UserProfileListRegKey -Name 'Default' -ErrorAction 'Stop' | Select-Object -ExpandProperty 'Default' + } + # On Windows XP or lower + Else { + # Default User Profile Name: By default, 'Default User' + [string]$DefaultUserProfileName = Get-ItemProperty -LiteralPath $UserProfileListRegKey -Name 'DefaultUserProfile' -ErrorAction 'Stop' | Select-Object -ExpandProperty 'DefaultUserProfile' + + # Path to Default User Profile directory: By default, C:\Documents and Settings\Default User + [String]$DefaultUserProfileDirectory = Join-Path -Path $UserProfilesDirectory -ChildPath $DefaultUserProfileName + } + + ## Create a custom object for the Default User profile. + # Since the Default User is not an actual User account, it does not have a username or a SID. + # We will make up a SID and add it to the custom object so that we have a location to load the default registry hive into later on. + [PSObject]$DefaultUserProfile = New-Object -TypeName 'PSObject' -Property @{ + NTAccount = 'Default User' + SID = 'S-1-5-21-Default-User' + ProfilePath = $DefaultUserProfileDirectory + } + + ## Add the Default User custom object to the User Profile list. + $UserProfiles += $DefaultUserProfile + } + + Write-Output -InputObject ($UserProfiles) + } + Catch { + Write-Log -Message "Failed to create a custom object representing all user profiles on the machine. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-FileVersion +Function Get-FileVersion { + <# +.SYNOPSIS + +Gets the version of the specified file + +.DESCRIPTION + +Gets the version of the specified file + +.PARAMETER File + +Path of the file + +.PARAMETER ProductVersion + +Switch that makes the command return ProductVersion instead of FileVersion + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the version of the specified file. + +.EXAMPLE + +Get-FileVersion -File "$envProgramFilesX86\Adobe\Reader 11.0\Reader\AcroRd32.exe" + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$File, + [Parameter(Mandatory = $false)] + [Switch]$ProductVersion, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Getting version info for file [$file]." -Source ${CmdletName} + + If (Test-Path -LiteralPath $File -PathType 'Leaf') { + $fileVersionInfo = (Get-Command -Name $file -ErrorAction 'Stop').FileVersionInfo + If ($ProductVersion) { + $fileVersion = $fileVersionInfo.ProductVersion + } + Else { + $fileVersion = $fileVersionInfo.FileVersion + } + + If ($fileVersion) { + If ($ProductVersion) { + Write-Log -Message "Product version is [$fileVersion]." -Source ${CmdletName} + } + Else { + Write-Log -Message "File version is [$fileVersion]." -Source ${CmdletName} + } + + Write-Output -InputObject ($fileVersion) + } + Else { + Write-Log -Message 'No version information found.' -Source ${CmdletName} + } + } + Else { + Throw "File path [$file] does not exist." + } + } + Catch { + Write-Log -Message "Failed to get version info. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to get version info: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function New-Shortcut +Function New-Shortcut { + <# +.SYNOPSIS + +Creates a new .lnk or .url type shortcut + +.DESCRIPTION + +Creates a new shortcut .lnk or .url file, with configurable options + +.PARAMETER Path + +Path to save the shortcut + +.PARAMETER TargetPath + +Target path or URL that the shortcut launches + +.PARAMETER Arguments + +Arguments to be passed to the target path + +.PARAMETER IconLocation + +Location of the icon used for the shortcut + +.PARAMETER IconIndex + +The index of the icon. Executables, DLLs, ICO files with multiple icons need the icon index to be specified. This parameter is an Integer. The first index is 0. + +.PARAMETER Description + +Description of the shortcut + +.PARAMETER WorkingDirectory + +Working Directory to be used for the target path + +.PARAMETER WindowStyle + +Windows style of the application. Options: Normal, Maximized, Minimized. Default is: Normal. + +.PARAMETER RunAsAdmin + +Set shortcut to run program as administrator. This option will prompt user to elevate when executing shortcut. + +.PARAMETER Hotkey + +Create a Hotkey to launch the shortcut, e.g. "CTRL+SHIFT+F" + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None. This function does not return any output. + +.EXAMPLE + +New-Shortcut -Path "$envProgramData\Microsoft\Windows\Start Menu\My Shortcut.lnk" -TargetPath "$envWinDir\System32\notepad.exe" -IconLocation "$envWinDir\System32\notepad.exe" -Description 'Notepad' -WorkingDirectory "$envHomeDrive\$envHomePath" + +.NOTES + +Url shortcuts only support TargetPath, IconLocation and IconIndex. Other parameters are ignored. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNullorEmpty()] + [String]$Path, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$TargetPath, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$Arguments, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$IconLocation, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$IconIndex, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$Description, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$WorkingDirectory, + [Parameter(Mandatory = $false)] + [ValidateSet('Normal', 'Maximized', 'Minimized')] + [String]$WindowStyle, + [Parameter(Mandatory = $false)] + [Switch]$RunAsAdmin, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Hotkey, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + If (-not $Shell) { + [__ComObject]$Shell = New-Object -ComObject 'WScript.Shell' -ErrorAction 'Stop' + } + } + Process { + Try { + $extension = [IO.Path]::GetExtension($Path).ToLower() + If ((-not $extension) -or (($extension -ne '.lnk') -and ($extension -ne '.url'))) { + Write-Log -Message "Specified file [$Path] does not have a valid shortcut extension: .url .lnk" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw + } + Return + } + Try { + # Make sure Net framework current dir is synced with powershell cwd + [IO.Directory]::SetCurrentDirectory((Get-Location -PSProvider 'FileSystem').ProviderPath) + # Get full path + [String]$FullPath = [IO.Path]::GetFullPath($Path) + } + Catch { + Write-Log -Message "Specified path [$Path] is not valid." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw + } + Return + } + + Try { + [String]$PathDirectory = [IO.Path]::GetDirectoryName($FullPath) + If (-not $PathDirectory) { + # The path is root or no filename supplied + If (-not [IO.Path]::GetFileNameWithoutExtension($FullPath)) { + # No filename supplied + If (-not $ContinueOnError) { + Throw + } + Return + } + # Continue without creating a folder because the path is root + } + ElseIf (-not (Test-Path -LiteralPath $PathDirectory -PathType 'Container' -ErrorAction 'Stop')) { + Write-Log -Message "Creating shortcut directory [$PathDirectory]." -Source ${CmdletName} + $null = New-Item -Path $PathDirectory -ItemType 'Directory' -Force -ErrorAction 'Stop' + } + } + Catch { + Write-Log -Message "Failed to create shortcut directory [$PathDirectory]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + Throw + } + + If (Test-Path -Path $FullPath -PathType 'Leaf') { + Write-Log -Message "The shortcut [$FullPath] already exists. Deleting the file..." -Source ${CmdletName} + Remove-File -Path $FullPath + } + + Write-Log -Message "Creating shortcut [$FullPath]." -Source ${CmdletName} + If ($extension -eq '.url') { + [String[]]$URLFile = '[InternetShortcut]' + $URLFile += "URL=$targetPath" + If ($null -ne $IconIndex) { + $URLFile += "IconIndex=$IconIndex" + } + If ($IconLocation) { + $URLFile += "IconFile=$IconLocation" + } + [IO.File]::WriteAllLines($FullPath, $URLFile, (New-Object -TypeName 'Text.UTF8Encoding' -ArgumentList ($false))) + } + Else { + $shortcut = $shell.CreateShortcut($FullPath) + ## TargetPath + $shortcut.TargetPath = $targetPath + ## Arguments + If ($arguments) { + $shortcut.Arguments = $arguments + } + ## Description + If ($description) { + $shortcut.Description = $description + } + ## Working directory + If ($workingDirectory) { + $shortcut.WorkingDirectory = $workingDirectory + } + ## Window Style + Switch ($windowStyle) { + 'Normal' { + $windowStyleInt = 1 + } + 'Maximized' { + $windowStyleInt = 3 + } + 'Minimized' { + $windowStyleInt = 7 + } + Default { + $windowStyleInt = 1 + } + } + $shortcut.WindowStyle = $windowStyleInt + ## Hotkey + If ($Hotkey) { + $shortcut.Hotkey = $Hotkey + } + ## Icon + If ($null -eq $IconIndex) { + $IconIndex = 0 + } + If ($IconLocation) { + $shortcut.IconLocation = $IconLocation + ",$IconIndex" + } + ## Save the changes + $shortcut.Save() + + ## Set shortcut to run program as administrator + If ($RunAsAdmin) { + Write-Log -Message 'Setting shortcut to run program as administrator.' -Source ${CmdletName} + [Byte[]]$filebytes = [IO.FIle]::ReadAllBytes($FullPath) + $filebytes[21] = $filebytes[21] -bor 32 + [IO.FIle]::WriteAllBytes($FullPath, $filebytes) + } + } + } + Catch { + Write-Log -Message "Failed to create shortcut [$Path]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to create shortcut [$Path]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + +#region Function Set-Shortcut +Function Set-Shortcut { + <# +.SYNOPSIS + +Modifies a .lnk or .url type shortcut + +.DESCRIPTION + +Modifies a shortcut - .lnk or .url file, with configurable options. + +Only specify the parameters that you want to change. + +.PARAMETER Path + +Path to the shortcut to be changed + +.PARAMETER TargetPath + +Changes target path or URL that the shortcut launches + +.PARAMETER Arguments + +Changes Arguments to be passed to the target path + +.PARAMETER IconLocation + +Changes location of the icon used for the shortcut + +.PARAMETER IconIndex + +Change the index of the icon. Executables, DLLs, ICO files with multiple icons need the icon index to be specified. This parameter is an Integer. The first index is 0. + +.PARAMETER Description + +Changes description of the shortcut + +.PARAMETER WorkingDirectory + +Changes Working Directory to be used for the target path + +.PARAMETER WindowStyle + +Changes the Windows style of the application. Options: Normal, Maximized, Minimized, DontChange. Default is: DontChange. + +.PARAMETER RunAsAdmin + +Set shortcut to run program as administrator. This option will prompt user to elevate when executing shortcut. If not specified or set to $null, the flag will not be changed. + +.PARAMETER Hotkey + +Changes the Hotkey to launch the shortcut, e.g. "CTRL+SHIFT+F" + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +PSOjbect + +Path to the shortcut to be changed or a hashtable of parameters to be changed + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Set-Shortcut -Path "$envProgramData\Microsoft\Windows\Start Menu\My Shortcut.lnk" -TargetPath "$envWinDir\System32\notepad.exe" -IconLocation "$envWinDir\System32\notepad.exe" -IconIndex 0 -Description 'Notepad' -WorkingDirectory "$envHomeDrive\$envHomePath" + +.NOTES + +Url shortcuts only support TargetPath, IconLocation and IconIndex. Other parameters are ignored. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding(DefaultParameterSetName = 'Default')] + Param ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0, ParameterSetName = 'Default')] + [ValidateNotNullorEmpty()] + [String]$Path, + [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0, ParameterSetName = 'Pipeline')] + [ValidateNotNullorEmpty()] + [Hashtable]$PathHash, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$TargetPath, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$Arguments, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$IconLocation, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$IconIndex, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$Description, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$WorkingDirectory, + [Parameter(Mandatory = $false)] + [ValidateSet('Normal', 'Maximized', 'Minimized', 'DontChange')] + [String]$WindowStyle = 'DontChange', + [Parameter(Mandatory = $false)] + [System.Nullable[Boolean]]$RunAsAdmin, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Hotkey, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + If (-not $Shell) { + [__ComObject]$Shell = New-Object -ComObject 'WScript.Shell' -ErrorAction 'Stop' + } + } + Process { + Try { + If ($PsCmdlet.ParameterSetName -eq 'Pipeline') { + $Path = $PathHash.Path + } + + If (-not (Test-Path -LiteralPath $Path -PathType 'Leaf' -ErrorAction 'Stop')) { + Write-Log -Message "Failed to find the file [$Path]." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw + } + Return + } + $extension = [IO.Path]::GetExtension($Path).ToLower() + If ((-not $extension) -or (($extension -ne '.lnk') -and ($extension -ne '.url'))) { + Write-Log -Message "Specified file [$Path] is not a valid shortcut." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw + } + Return + } + # Make sure Net framework current dir is synced with powershell cwd + [IO.Directory]::SetCurrentDirectory((Get-Location -PSProvider 'FileSystem').ProviderPath) + Write-Log -Message "Changing shortcut [$Path]." -Source ${CmdletName} + If ($extension -eq '.url') { + [String[]]$URLFile = [IO.File]::ReadAllLines($Path) + For ($i = 0; $i -lt $URLFile.Length; $i++) { + $URLFile[$i] = $URLFile[$i].TrimStart() + If ($URLFile[$i].StartsWith('URL=') -and $targetPath) { + $URLFile[$i] = "URL=$targetPath" + } + ElseIf ($URLFile[$i].StartsWith('IconIndex=') -and ($null -ne $IconIndex)) { + $URLFile[$i] = "IconIndex=$IconIndex" + } + ElseIf ($URLFile[$i].StartsWith('IconFile=') -and $IconLocation) { + $URLFile[$i] = "IconFile=$IconLocation" + } + } + [IO.File]::WriteAllLines($Path, $URLFile, (New-Object -TypeName 'Text.UTF8Encoding' -ArgumentList ($false))) + } + Else { + $shortcut = $shell.CreateShortcut($Path) + ## TargetPath + If ($targetPath) { + $shortcut.TargetPath = $targetPath + } + ## Arguments + If ($arguments) { + $shortcut.Arguments = $arguments + } + ## Description + If ($description) { + $shortcut.Description = $description + } + ## Working directory + If ($workingDirectory) { + $shortcut.WorkingDirectory = $workingDirectory + } + ## Window Style + Switch ($windowStyle) { + 'Normal' { + $windowStyleInt = 1 + } + 'Maximized' { + $windowStyleInt = 3 + } + 'Minimized' { + $windowStyleInt = 7 + } + 'DontChange' { + $windowStyleInt = 0 + } + Default { + $windowStyleInt = 1 + } + } + If ($windowStyleInt -ne 0) { + $shortcut.WindowStyle = $windowStyleInt + } + ## Hotkey + If ($Hotkey) { + $shortcut.Hotkey = $Hotkey + } + ## Icon + # Retrieve previous value and split the path from the index + [String[]]$Split = $shortcut.IconLocation.Split(',') + $TempIconLocation = $Split[0] + $TempIconIndex = $Split[1] + # Check whether a new icon path was specified + If ($IconLocation) { + # New icon path was specified. Check whether new icon index was also specified + If ($null -ne $IconIndex) { + # Create new icon path from new icon path and new icon index + $IconLocation = $IconLocation + ",$IconIndex" + } + Else { + # No new icon index was specified as a parameter. We will keep the old one + $IconLocation = $IconLocation + ",$TempIconIndex" + } + } + ElseIf ($null -ne $IconIndex) { + # New icon index was specified, but not the icon location. Append it to the icon path from the shortcut + $IconLocation = $TempIconLocation + ",$IconIndex" + } + If ($IconLocation) { + $shortcut.IconLocation = $IconLocation + } + ## Save the changes + $shortcut.Save() + + ## Set shortcut to run program as administrator + If ($RunAsAdmin -eq $true) { + Write-Log -Message 'Setting shortcut to run program as administrator.' -Source ${CmdletName} + [Byte[]]$filebytes = [IO.FIle]::ReadAllBytes($Path) + $filebytes[21] = $filebytes[21] -bor 32 + [IO.FIle]::WriteAllBytes($Path, $filebytes) + } + ElseIf ($RunAsAdmin -eq $false) { + [Byte[]]$filebytes = [IO.FIle]::ReadAllBytes($Path) + Write-Log -Message 'Setting shortcut to not run program as administrator.' -Source ${CmdletName} + $filebytes[21] = $filebytes[21] -band (-bnot 32) + [IO.FIle]::WriteAllBytes($Path, $filebytes) + } + } + } + Catch { + Write-Log -Message "Failed to change the shortcut [$Path]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to change the shortcut [$Path]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + +#region Function Get-Shortcut +Function Get-Shortcut { + <# +.SYNOPSIS + +Get information from a new .lnk or .url type shortcut + +.DESCRIPTION + +Get information from a new .lnk or .url type shortcut. Returns a hashtable. + +.PARAMETER Path + +Path to the shortcut to get information from + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Collections.Hashtable. + +Returns a hashtable with the following keys +- TargetPath +- Arguments +- Description +- WorkingDirectory +- WindowStyle +- Hotkey +- IconLocation +- IconIndex +- RunAsAdmin + +.EXAMPLE + +Get-Shortcut -Path "$envProgramData\Microsoft\Windows\Start Menu\My Shortcut.lnk" + +.NOTES + +Url shortcuts only support TargetPath, IconLocation and IconIndex. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNullorEmpty()] + [String]$Path, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + If (-not $Shell) { + [__ComObject]$Shell = New-Object -ComObject 'WScript.Shell' -ErrorAction 'Stop' + } + } + Process { + Try { + $extension = [IO.Path]::GetExtension($Path).ToLower() + If ((-not $extension) -or (($extension -ne '.lnk') -and ($extension -ne '.url'))) { + Write-Log -Message "Specified file [$Path] does not have a valid shortcut extension: .url .lnk" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw + } + Return + } + Try { + # Make sure Net framework current dir is synced with powershell cwd + [IO.Directory]::SetCurrentDirectory((Get-Location -PSProvider 'FileSystem').ProviderPath) + # Get full path + [String]$FullPath = [IO.Path]::GetFullPath($Path) + } + Catch { + Write-Log -Message "Specified path [$Path] is not valid." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw + } + Return + } + + $Output = @{ Path = $FullPath } + If ($extension -eq '.url') { + [String[]]$URLFile = [IO.File]::ReadAllLines($Path) + For ($i = 0; $i -lt $URLFile.Length; $i++) { + $URLFile[$i] = $URLFile[$i].TrimStart() + If ($URLFile[$i].StartsWith('URL=')) { + $Output.TargetPath = $URLFile[$i].Replace('URL=', '') + } + ElseIf ($URLFile[$i].StartsWith('IconIndex=')) { + $Output.IconIndex = $URLFile[$i].Replace('IconIndex=', '') + } + ElseIf ($URLFile[$i].StartsWith('IconFile=')) { + $Output.IconLocation = $URLFile[$i].Replace('IconFile=', '') + } + } + } + Else { + $shortcut = $shell.CreateShortcut($FullPath) + ## TargetPath + $Output.TargetPath = $shortcut.TargetPath + ## Arguments + $Output.Arguments = $shortcut.Arguments + ## Description + $Output.Description = $shortcut.Description + ## Working directory + $Output.WorkingDirectory = $shortcut.WorkingDirectory + ## Window Style + Switch ($shortcut.WindowStyle) { + 1 { + $Output.WindowStyle = 'Normal' + } + 3 { + $Output.WindowStyle = 'Maximized' + } + 7 { + $Output.WindowStyle = 'Minimized' + } + Default { + $Output.WindowStyle = 'Normal' + } + } + ## Hotkey + $Output.Hotkey = $shortcut.Hotkey + ## Icon + [String[]]$Split = $shortcut.IconLocation.Split(',') + $Output.IconLocation = $Split[0] + $Output.IconIndex = $Split[1] + ## Remove the variable + $shortcut = $null + ## Run as admin + [Byte[]]$filebytes = [IO.FIle]::ReadAllBytes($FullPath) + If ($filebytes[21] -band 32) { + $Output.RunAsAdmin = $true + } + Else { + $Output.RunAsAdmin = $false + } + } + Write-Output -InputObject ($Output) + } + Catch { + Write-Log -Message "Failed to read the shortcut [$Path]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to read the shortcut [$Path]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + +#region Function Execute-ProcessAsUser +Function Execute-ProcessAsUser { + <# +.SYNOPSIS + +Execute a process with a logged in user account, by using a scheduled task, to provide interaction with user in the SYSTEM context. + +.DESCRIPTION + +Execute a process with a logged in user account, by using a scheduled task, to provide interaction with user in the SYSTEM context. + +.PARAMETER UserName + +Logged in Username under which to run the process from. Default is: The active console user. If no console user exists but users are logged in, such as on terminal servers, then the first logged-in non-console user. + +.PARAMETER Path + +Path to the file being executed. + +.PARAMETER TempPath + +Path to the temporary directory used to store the script to be executed as user. If using a user writable directory, ensure you select -RunLevel 'LeastPrivilege'. + +.PARAMETER Parameters + +Arguments to be passed to the file being executed. + +.PARAMETER SecureParameters + +Hides all parameters passed to the executable from the Toolkit log file. + +.PARAMETER RunLevel + +Specifies the level of user rights that Task Scheduler uses to run the task. The acceptable values for this parameter are: + +- HighestAvailable: Tasks run by using the highest available privileges (Admin privileges for Administrators). Default Value. + +- LeastPrivilege: Tasks run by using the least-privileged user account (LUA) privileges. + +.PARAMETER Wait + +Wait for the process, launched by the scheduled task, to complete execution before accepting more input. Default is $false. + +.PARAMETER PassThru + +Returns the exit code from this function or the process launched by the scheduled task. + +.PARAMETER WorkingDirectory + +Set working directory for the process. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Int32. + +Returns the exit code from this function or the process launched by the scheduled task. + +.EXAMPLE + +Execute-ProcessAsUser -UserName 'CONTOSO\User' -Path "$PSHOME\powershell.exe" -Parameters "-Command & { & `"C:\Test\Script.ps1`"; Exit `$LastExitCode }" -Wait + +Execute process under a user account by specifying a username under which to execute it. + +.EXAMPLE + +Execute-ProcessAsUser -Path "$PSHOME\powershell.exe" -Parameters "-Command & { & `"C:\Test\Script.ps1`"; Exit `$LastExitCode }" -Wait + +Execute process under a user account by using the default active logged in user that was detected when the toolkit was launched. + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$UserName = $RunAsActiveUser.NTAccount, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Path, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$TempPath, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Parameters = '', + [Parameter(Mandatory = $false)] + [Switch]$SecureParameters = $false, + [Parameter(Mandatory = $false)] + [ValidateSet('HighestAvailable', 'LeastPrivilege')] + [String]$RunLevel = 'HighestAvailable', + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$Wait = $false, + [Parameter(Mandatory = $false)] + [Switch]$PassThru = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$WorkingDirectory, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + If ((![string]::IsNullOrEmpty($tempPath))) { + $executeAsUserTempPath = $tempPath + If (($tempPath -eq $loggedOnUserTempPath) -and ($RunLevel -eq "HighestPrivilege")) { + Write-Log -Message "WARNING: Using [${CmdletName}] with a user writable directory using the HighestPrivilege creates a security vulnerability. Please use -RunLevel 'LeastPrivilege' when using a user writable directoy." -Severity 'Warning' + } + } + Else { + [String]$executeAsUserTempPath = Join-Path -Path $dirAppDeployTemp -ChildPath 'ExecuteAsUser' + } + } + Process { + ## Initialize exit code variable + [Int32]$executeProcessAsUserExitCode = 0 + + ## Confirm that the username field is not empty + If (-not $UserName) { + [Int32]$executeProcessAsUserExitCode = 60009 + Write-Log -Message "The function [${CmdletName}] has a -UserName parameter that has an empty default value because no logged in users were detected when the toolkit was launched." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "The function [${CmdletName}] has a -UserName parameter that has an empty default value because no logged in users were detected when the toolkit was launched." + } + Return + } + + ## Confirm if the toolkit is running with administrator privileges + If (($RunLevel -eq 'HighestAvailable') -and (-not $IsAdmin)) { + [Int32]$executeProcessAsUserExitCode = 60003 + Write-Log -Message "The function [${CmdletName}] requires the toolkit to be running with Administrator privileges if the [-RunLevel] parameter is set to 'HighestAvailable'." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "The function [${CmdletName}] requires the toolkit to be running with Administrator privileges if the [-RunLevel] parameter is set to 'HighestAvailable'." + } + Return + } + + ## Check whether the specified Working Directory exists + If ($WorkingDirectory -and (-not (Test-Path -LiteralPath $WorkingDirectory -PathType 'Container'))) { + Write-Log -Message 'The specified working directory does not exist or is not a directory. The scheduled task might not work as expected.' -Severity 2 -Source ${CmdletName} + } + + ## Build the scheduled task XML name + [String]$schTaskName = (("$appDeployToolkitName-ExecuteAsUser" -replace ' ', '').Trim('_') -replace '[_]+', '_') + + ## Remove and recreate the temporary folder + If (Test-Path -LiteralPath $executeAsUserTempPath -PathType 'Container') { + Write-Log -Message "Previous [$executeAsUserTempPath] found. Attempting removal." -Source ${CmdletName} + Remove-Folder -Path $executeAsUserTempPath + } + Write-Log -Message "Creating [$executeAsUserTempPath]." -Source ${CmdletName} + Try { + $null = New-Item -Path $executeAsUserTempPath -ItemType 'Directory' -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Unable to create [$executeAsUserTempPath]. Possible attempt to gain elevated rights." -Source ${CmdletName} -Severity 2 + } + + ## Escape XML characters + $EscapedPath = [System.Security.SecurityElement]::Escape($Path) + $EscapedParameters = [System.Security.SecurityElement]::Escape($Parameters) + + ## If PowerShell.exe is being launched, then create a VBScript to launch PowerShell so that we can suppress the console window that flashes otherwise + If (((Split-Path -Path $Path -Leaf) -like 'PowerShell*') -or ((Split-Path -Path $Path -Leaf) -like 'cmd*')) { + If ($SecureParameters) { + Write-Log -Message "Preparing a VBScript that will start [$Path] (Parameters Hidden) as the logged-on user [$userName] and suppress the console window..." -Source ${CmdletName} + } + Else { + Write-Log -Message "Preparing a VBScript that will start [$Path $Parameters] as the logged-on user [$userName] and suppress the console window..." -Source ${CmdletName} + } + + # Permit inclusion of double quotes in parameters + $QuotesIndex = $Parameters.Length - 1 + If ($QuotesIndex -lt 0) { + $QuotesIndex = 0 + } + + If ($($Parameters.Substring($QuotesIndex)) -eq '"') { + [String]$executeProcessAsUserParametersVBS = 'chr(34) & ' + "`"$($Path)`"" + ' & chr(34) & ' + '" ' + ($Parameters -replace "`r`r`n", ';' -replace "`r`n", ';' -replace '"', "`" & chr(34) & `"" -replace ' & chr\(34\) & "$', '') + ' & chr(34)' + } + Else { + [String]$executeProcessAsUserParametersVBS = 'chr(34) & ' + "`"$($Path)`"" + ' & chr(34) & ' + '" ' + ($Parameters -replace "`r`r`n", ';' -replace "`r`n", ';' -replace '"', "`" & chr(34) & `"" -replace ' & chr\(34\) & "$', '') + '"' + } + + [String[]]$executeProcessAsUserScript = "strCommand = $executeProcessAsUserParametersVBS" + $executeProcessAsUserScript += 'set oWShell = CreateObject("WScript.Shell")' + $executeProcessAsUserScript += 'intReturn = oWShell.Run(strCommand, 0, true)' + $executeProcessAsUserScript += 'WScript.Quit intReturn' + $executeProcessAsUserScript | Out-File -FilePath "$executeAsUserTempPath\$($schTaskName).vbs" -Force -Encoding 'Default' -ErrorAction 'SilentlyContinue' + $Path = "$envWinDir\System32\wscript.exe" + $Parameters = "/e:vbscript `"$executeAsUserTempPath\$($schTaskName).vbs`"" + $EscapedPath = [System.Security.SecurityElement]::Escape($Path) + $EscapedParameters = [System.Security.SecurityElement]::Escape($Parameters) + + Try { + Set-ItemPermission -Path "$executeAsUserTempPath\$schTaskName.vbs" -User $UserName -Permission 'Read' + } + Catch { + Write-Log -Message "Failed to set read permissions on path [$executeAsUserTempPath\$schTaskName.vbs]. The function might not be able to work correctly." -Source ${CmdletName} -Severity 2 + } + } + + ## Prepare working directory insert + [String]$WorkingDirectoryInsert = '' + If ($WorkingDirectory) { + $WorkingDirectoryInsert = "`r`n $WorkingDirectory" + } + + ## Specify the scheduled task configuration in XML format + [String]$xmlSchTask = @" + + + + + + StopExisting + false + false + true + false + false + + false + false + + true + true + false + false + false + PT72H + 7 + + + + $EscapedPath + $EscapedParameters$WorkingDirectoryInsert + + + + + $UserName + InteractiveToken + $RunLevel + + + +"@ + ## Export the XML to file + Try { + # Specify the filename to export the XML to + [String]$xmlSchTaskFilePath = "$dirAppDeployTemp\$schTaskName.xml" + [String]$xmlSchTask | Out-File -FilePath $xmlSchTaskFilePath -Force -ErrorAction 'Stop' + Set-ItemPermission -Path $xmlSchTaskFilePath -User $UserName -Permission 'Read' + } + Catch { + [Int32]$executeProcessAsUserExitCode = 60007 + Write-Log -Message "Failed to export the scheduled task XML file [$xmlSchTaskFilePath]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to export the scheduled task XML file [$xmlSchTaskFilePath]: $($_.Exception.Message)" + } + Return + } + + ## Create Scheduled Task to run the process with a logged-on user account + If ($Parameters) { + If ($SecureParameters) { + Write-Log -Message "Creating scheduled task to run the process [$Path] (Parameters Hidden) as the logged-on user [$userName]..." -Source ${CmdletName} + } + Else { + Write-Log -Message "Creating scheduled task to run the process [$Path $Parameters] as the logged-on user [$userName]..." -Source ${CmdletName} + } + } + Else { + Write-Log -Message "Creating scheduled task to run the process [$Path] as the logged-on user [$userName]..." -Source ${CmdletName} + } + [PSObject]$schTaskResult = Execute-Process -Path $exeSchTasks -Parameters "/create /f /tn $schTaskName /xml `"$xmlSchTaskFilePath`"" -WindowStyle 'Hidden' -CreateNoWindow -PassThru -ExitOnProcessFailure $false + If ($schTaskResult.ExitCode -ne 0) { + [Int32]$executeProcessAsUserExitCode = $schTaskResult.ExitCode + Write-Log -Message "Failed to create the scheduled task by importing the scheduled task XML file [$xmlSchTaskFilePath]." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to create the scheduled task by importing the scheduled task XML file [$xmlSchTaskFilePath]." + } + Return + } + + ## Trigger the Scheduled Task + If ($Parameters) { + If ($SecureParameters) { + Write-Log -Message "Triggering execution of scheduled task with command [$Path] (Parameters Hidden) as the logged-on user [$userName]..." -Source ${CmdletName} + } + Else { + Write-Log -Message "Triggering execution of scheduled task with command [$Path $Parameters] as the logged-on user [$userName]..." -Source ${CmdletName} + } + } + Else { + Write-Log -Message "Triggering execution of scheduled task with command [$Path] as the logged-on user [$userName]..." -Source ${CmdletName} + } + [PSObject]$schTaskResult = Execute-Process -Path $exeSchTasks -Parameters "/run /i /tn $schTaskName" -WindowStyle 'Hidden' -CreateNoWindow -Passthru -ExitOnProcessFailure $false + If ($schTaskResult.ExitCode -ne 0) { + [Int32]$executeProcessAsUserExitCode = $schTaskResult.ExitCode + Write-Log -Message "Failed to trigger scheduled task [$schTaskName]." -Severity 3 -Source ${CmdletName} + # Delete Scheduled Task + Write-Log -Message 'Deleting the scheduled task which did not trigger.' -Source ${CmdletName} + Execute-Process -Path $exeSchTasks -Parameters "/delete /tn $schTaskName /f" -WindowStyle 'Hidden' -CreateNoWindow -ExitOnProcessFailure $false + If (-not $ContinueOnError) { + Throw "Failed to trigger scheduled task [$schTaskName]." + } + Return + } + + ## Wait for the process launched by the scheduled task to complete execution + If ($Wait) { + Write-Log -Message "Waiting for the process launched by the scheduled task [$schTaskName] to complete execution (this may take some time)..." -Source ${CmdletName} + Start-Sleep -Seconds 1 + #If on Windows Vista or higer, Windows Task Scheduler 2.0 is supported. 'Schedule.Service' ComObject output is UI language independent + If (([Version]$envOSVersion).Major -gt 5) { + Try { + [__ComObject]$ScheduleService = New-Object -ComObject 'Schedule.Service' -ErrorAction 'Stop' + $ScheduleService.Connect() + $RootFolder = $ScheduleService.GetFolder('\') + $Task = $RootFolder.GetTask("$schTaskName") + # Task State(Status) 4 = 'Running' + While ($Task.State -eq 4) { + Start-Sleep -Seconds 5 + } + # Get the exit code from the process launched by the scheduled task + [Int32]$executeProcessAsUserExitCode = $Task.LastTaskResult + } + Catch { + Write-Log -Message "Failed to retrieve information from Task Scheduler. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + Finally { + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($ScheduleService) + } + Catch { + } + } + } + #Windows Task Scheduler 1.0 + Else { + While ((($exeSchTasksResult = & $exeSchTasks /query /TN $schTaskName /V /FO CSV) | ConvertFrom-Csv | Select-Object -ExpandProperty 'Status' -First 1) -eq 'Running') { + Start-Sleep -Seconds 5 + } + # Get the exit code from the process launched by the scheduled task + [Int32]$executeProcessAsUserExitCode = ($exeSchTasksResult = & $exeSchTasks /query /TN $schTaskName /V /FO CSV) | ConvertFrom-Csv | Select-Object -ExpandProperty 'Last Result' -First 1 + } + Write-Log -Message "Exit code from process launched by scheduled task [$executeProcessAsUserExitCode]." -Source ${CmdletName} + } + Else { + Start-Sleep -Seconds 1 + } + + ## Delete scheduled task + Try { + Write-Log -Message "Deleting scheduled task [$schTaskName]." -Source ${CmdletName} + Execute-Process -Path $exeSchTasks -Parameters "/delete /tn $schTaskName /f" -WindowStyle 'Hidden' -CreateNoWindow -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to delete scheduled task [$schTaskName]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + ## Remove the XML scheduled task file + If (Test-Path -LiteralPath $xmlSchTaskFilePath -PathType 'Leaf') { + Remove-File -Path $xmlSchTaskFilePath + } + + ## Remove the temporary folder + If (Test-Path -LiteralPath $executeAsUserTempPath -PathType 'Container') { + Remove-Folder -Path $executeAsUserTempPath + } + } + End { + If ($PassThru) { + Write-Output -InputObject ($executeProcessAsUserExitCode) + } + + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Update-Desktop +Function Update-Desktop { + <# +.SYNOPSIS + +Refresh the Windows Explorer Shell, which causes the desktop icons and the environment variables to be reloaded. + +.DESCRIPTION + +Refresh the Windows Explorer Shell, which causes the desktop icons and the environment variables to be reloaded. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None. This function does not return objects. + +.EXAMPLE + +Update-Desktop + +.NOTES + +This function has an alias: Refresh-Desktop + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Refreshing the Desktop and the Windows Explorer environment process block.' -Source ${CmdletName} + [PSADT.Explorer]::RefreshDesktopAndEnvironmentVariables() + } + Catch { + Write-Log -Message "Failed to refresh the Desktop and the Windows Explorer environment process block. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to refresh the Desktop and the Windows Explorer environment process block: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +Set-Alias -Name 'Refresh-Desktop' -Value 'Update-Desktop' -Scope 'Script' -Force -ErrorAction 'SilentlyContinue' +#endregion + + +#region Function Update-SessionEnvironmentVariables +Function Update-SessionEnvironmentVariables { + <# +.SYNOPSIS + +Updates the environment variables for the current PowerShell session with any environment variable changes that may have occurred during script execution. + +.DESCRIPTION + +Environment variable changes that take place during script execution are not visible to the current PowerShell session. + +Use this function to refresh the current PowerShell session with all environment variable settings. + +.PARAMETER LoadLoggedOnUserEnvironmentVariables + +If script is running in SYSTEM context, this option allows loading environment variables from the active console user. If no console user exists but users are logged in, such as on terminal servers, then the first logged-in non-console user. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None. This function does not return objects. + +.EXAMPLE + +Update-SessionEnvironmentVariables + +.NOTES + +This function has an alias: Refresh-SessionEnvironmentVariables + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$LoadLoggedOnUserEnvironmentVariables = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + [ScriptBlock]$GetEnvironmentVar = { + Param ( + $Key, + $Scope + ) + [Environment]::GetEnvironmentVariable($Key, $Scope) + } + } + Process { + Try { + Write-Log -Message 'Refreshing the environment variables for this PowerShell session.' -Source ${CmdletName} + + If ($LoadLoggedOnUserEnvironmentVariables -and $RunAsActiveUser) { + [String]$CurrentUserEnvironmentSID = $RunAsActiveUser.SID + } + Else { + [String]$CurrentUserEnvironmentSID = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value + } + [String]$MachineEnvironmentVars = 'Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' + [String]$UserEnvironmentVars = "Registry::HKEY_USERS\$CurrentUserEnvironmentSID\Environment" + + ## Update all session environment variables. Ordering is important here: $UserEnvironmentVars comes second so that we can override $MachineEnvironmentVars. + $MachineEnvironmentVars, $UserEnvironmentVars | Get-Item | Where-Object { $_ } | ForEach-Object { $envRegPath = $_.PSPath; $_ | Select-Object -ExpandProperty 'Property' | ForEach-Object { Set-Item -LiteralPath "env:$($_)" -Value (Get-ItemProperty -LiteralPath $envRegPath -Name $_).$_ } } + + ## Set PATH environment variable separately because it is a combination of the user and machine environment variables + [String[]]$PathFolders = 'Machine', 'User' | ForEach-Object { (& $GetEnvironmentVar -Key 'PATH' -Scope $_) } | Where-Object { $_ } | ForEach-Object { $_.Trim(';').Split(';').Trim().Trim('"') } | Select-Object -Unique + $env:PATH = $PathFolders -join ';' + } + Catch { + Write-Log -Message "Failed to refresh the environment variables for this PowerShell session. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to refresh the environment variables for this PowerShell session: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +Set-Alias -Name 'Refresh-SessionEnvironmentVariables' -Value 'Update-SessionEnvironmentVariables' -Scope 'Script' -Force -ErrorAction 'SilentlyContinue' +#endregion + + +#region Function Get-SchedulerTask +Function Get-SchedulerTask { + <# +.SYNOPSIS + +Retrieve all details for scheduled tasks on the local computer. + +.DESCRIPTION + +Retrieve all details for scheduled tasks on the local computer using schtasks.exe. All property names have spaces and colons removed. + +.PARAMETER TaskName + +Specify the name of the scheduled task to retrieve details for. Uses regex match to find scheduled task. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +PSOjbect. This function returns a PSObject with all scheduled task properties. + +.EXAMPLE + +Get-SchedulerTask + +To display a list of all scheduled task properties. + +.EXAMPLE + +Get-SchedulerTask | Out-GridView + +To display a grid view of all scheduled task properties. + +.EXAMPLE + +Get-SchedulerTask | Select-Object -Property TaskName + +To display a list of all scheduled task names. + +.NOTES + +This function has an alias: Get-ScheduledTask if Get-ScheduledTask is not defined + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$TaskName, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + [PSObject[]]$ScheduledTasks = @() + } + Process { + Try { + Write-Log -Message 'Retrieving Scheduled Tasks...' -Source ${CmdletName} + [String[]]$exeSchtasksResults = & $exeSchTasks /Query /V /FO CSV + If ($global:LastExitCode -ne 0) { + Throw "Failed to retrieve scheduled tasks using [$exeSchTasks]." + } + [PSObject[]]$SchtasksResults = $exeSchtasksResults | ConvertFrom-Csv -Header 'HostName', 'TaskName', 'Next Run Time', 'Status', 'Logon Mode', 'Last Run Time', 'Last Result', 'Author', 'Task To Run', 'Start In', 'Comment', 'Scheduled Task State', 'Idle Time', 'Power Management', 'Run As User', 'Delete Task If Not Rescheduled', 'Stop Task If Runs X Hours and X Mins', 'Schedule', 'Schedule Type', 'Start Time', 'Start Date', 'End Date', 'Days', 'Months', 'Repeat: Every', 'Repeat: Until: Time', 'Repeat: Until: Duration', 'Repeat: Stop If Still Running' -ErrorAction 'Stop' + + If ($SchtasksResults) { + ForEach ($SchtasksResult in $SchtasksResults) { + If ($SchtasksResult.TaskName -match $TaskName) { + $SchtasksResult | Get-Member -MemberType 'Properties' | + ForEach-Object -Begin { + [Hashtable]$Task = @{} + } -Process { + ## Remove spaces and colons in property names. Do not set property value if line being processed is a column header (this will only work on English language machines). + ($Task.($($_.Name).Replace(' ', '').Replace(':', ''))) = If ($_.Name -ne $SchtasksResult.($_.Name)) { + $SchtasksResult.($_.Name) + } + } -End { + ## Only add task to the custom object if all property values are not empty + If (($Task.Values | Select-Object -Unique | Measure-Object).Count) { + $ScheduledTasks += New-Object -TypeName 'PSObject' -Property $Task + } + } + } + } + } + } + Catch { + Write-Log -Message "Failed to retrieve scheduled tasks. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to retrieve scheduled tasks: $($_.Exception.Message)" + } + } + } + End { + Write-Output -InputObject ($ScheduledTasks) + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +# If Get-ScheduledTask doesn't exist, add alias Get-ScheduledTask +If (-not (Get-Command -Name 'Get-ScheduledTask' -ErrorAction 'SilentlyContinue')) { + New-Alias -Name 'Get-ScheduledTask' -Value 'Get-SchedulerTask' +} +#endregion + + +#region Function Block-AppExecution +Function Block-AppExecution { + <# +.SYNOPSIS + +Block the execution of an application(s) + +.DESCRIPTION + +This function is called when you pass the -BlockExecution parameter to the Stop-RunningApplications function. It does the following: + +1. Makes a copy of this script in a temporary directory on the local machine. +2. Checks for an existing scheduled task from previous failed installation attempt where apps were blocked and if found, calls the Unblock-AppExecution function to restore the original IFEO registry keys. + This is to prevent the function from overriding the backup of the original IFEO options. +3. Creates a scheduled task to restore the IFEO registry key values in case the script is terminated uncleanly by calling the local temporary copy of this script with the parameter -CleanupBlockedApps. +4. Modifies the "Image File Execution Options" registry key for the specified process(s) to call this script with the parameter -ShowBlockedAppDialog. +5. When the script is called with those parameters, it will display a custom message to the user to indicate that execution of the application has been blocked while the installation is in progress. + The text of this message can be customized in the XML configuration file. + +.PARAMETER ProcessName + +Name of the process or processes separated by commas + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Block-AppExecution -ProcessName ('winword','excel') + +.NOTES + +This is an internal script function and should typically not be called directly. + +It is used when the -BlockExecution parameter is specified with the Show-InstallationWelcome function to block applications. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + ## Specify process names separated by commas + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String[]]$ProcessName + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + ## Remove illegal characters from the scheduled task arguments string + [char[]]$invalidScheduledTaskChars = '$', '!', '''', '"', '(', ')', ';', '\', '`', '*', '?', '{', '}', '[', ']', '<', '>', '|', '&', '%', '#', '~', '@', ' ' + [string]$SchInstallName = $installName + ForEach ($invalidChar in $invalidScheduledTaskChars) { + [string]$SchInstallName = $SchInstallName -replace [regex]::Escape($invalidChar),'' + } + [string]$blockExecutionTempPath = Join-Path -Path $dirAppDeployTemp -ChildPath 'BlockExecution' + [string]$schTaskUnblockAppsCommand += "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -File `"$blockExecutionTempPath\$scriptFileName`" -CleanupBlockedApps -ReferredInstallName `"$SchInstallName`" -ReferredInstallTitle `"$installTitle`" -ReferredLogName `"$logName`" -AsyncToolkitLaunch" + ## Specify the scheduled task configuration in XML format + [string]$xmlUnblockAppsSchTask = @" + + + + + + true + + + + + S-1-5-18 + + + + IgnoreNew + false + false + true + false + false + + false + false + + true + true + false + false + false + PT1H + 7 + + + + $PSHome\powershell.exe + $schTaskUnblockAppsCommand + + + +"@ + } + Process { + ## Bypass if no Admin rights + If ($configToolkitRequireAdmin -eq $false) { + Write-Log -Message "Bypassing Function [${CmdletName}], because [Require Admin: $configToolkitRequireAdmin]." -Source ${CmdletName} + Return + } + + [String]$schTaskBlockedAppsName = $installName + '_BlockedApps' + + ## Delete this file if it exists as it can cause failures (it is a bug from an older version of the toolkit) + If (Test-Path -LiteralPath "$configToolkitTempPath\PSAppDeployToolkit" -PathType 'Leaf' -ErrorAction 'SilentlyContinue') { + $null = Remove-Item -LiteralPath "$configToolkitTempPath\PSAppDeployToolkit" -Force -ErrorAction 'SilentlyContinue' + } + + If (Test-Path -LiteralPath $blockExecutionTempPath -PathType 'Container') { + Remove-Folder -Path $blockExecutionTempPath + } + + Try { + $null = New-Item -Path $blockExecutionTempPath -ItemType 'Directory' -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Unable to create [$blockExecutionTempPath]. Possible attempt to gain elevated rights." -Source ${CmdletName} + } + + Copy-Item -Path "$scriptRoot\*.*" -Destination $blockExecutionTempPath -Exclude 'thumbs.db' -Force -Recurse -ErrorAction 'SilentlyContinue' + + ## Build the debugger block value script + [String[]]$debuggerBlockScript = "strCommand = `"$PSHome\powershell.exe -ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -File `" & chr(34) & `"$blockExecutionTempPath\$scriptFileName`" & chr(34) & `" -ShowBlockedAppDialog -AsyncToolkitLaunch -ReferredInstallTitle `" & chr(34) & `"$installTitle`" & chr(34)" + $debuggerBlockScript += 'set oWShell = CreateObject("WScript.Shell")' + $debuggerBlockScript += 'oWShell.Run strCommand, 0, false' + $debuggerBlockScript | Out-File -FilePath "$blockExecutionTempPath\AppDeployToolkit_BlockAppExecutionMessage.vbs" -Force -Encoding 'Default' -ErrorAction 'SilentlyContinue' + [String]$debuggerBlockValue = "$envWinDir\System32\wscript.exe `"$blockExecutionTempPath\AppDeployToolkit_BlockAppExecutionMessage.vbs`"" + + ## Set contents to be readable for all users (BUILTIN\USERS) + Try { + $Users = ConvertTo-NTAccountOrSID -SID 'S-1-5-32-545' + Set-ItemPermission -Path $blockExecutionTempPath -User $Users -Permission 'Read' -Inheritance ('ObjectInherit', 'ContainerInherit') + } + Catch { + Write-Log -Message "Failed to set read permissions on path [$blockExecutionTempPath]. The function might not be able to work correctly." -Source ${CmdletName} -Severity 2 + } + + ## Create a scheduled task to run on startup to call this script and clean up blocked applications in case the installation is interrupted, e.g. user shuts down during installation" + Write-Log -Message 'Creating scheduled task to cleanup blocked applications in case the installation is interrupted.' -Source ${CmdletName} + If (Get-SchedulerTask -ContinueOnError $true | Select-Object -Property 'TaskName' | Where-Object { $_.TaskName -eq "\$schTaskBlockedAppsName" }) { + Write-Log -Message "Scheduled task [$schTaskBlockedAppsName] already exists." -Source ${CmdletName} + } + Else { + ## Export the scheduled task XML to file + Try { + ## Specify the filename to export the XML to + ## XML does not need to be user readable to stays in protected TEMP folder + [String]$xmlSchTaskFilePath = "$dirAppDeployTemp\SchTaskUnBlockApps.xml" + [String]$xmlUnblockAppsSchTask | Out-File -FilePath $xmlSchTaskFilePath -Force -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to export the scheduled task XML file [$xmlSchTaskFilePath]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + Return + } + + ## Import the Scheduled Task XML file to create the Scheduled Task + [PSObject]$schTaskResult = Execute-Process -Path $exeSchTasks -Parameters "/create /f /tn $schTaskBlockedAppsName /xml `"$xmlSchTaskFilePath`"" -WindowStyle 'Hidden' -CreateNoWindow -PassThru -ExitOnProcessFailure $false + If ($schTaskResult.ExitCode -ne 0) { + Write-Log -Message "Failed to create the scheduled task [$schTaskBlockedAppsName] by importing the scheduled task XML file [$xmlSchTaskFilePath]." -Severity 3 -Source ${CmdletName} + Return + } + } + + [String[]]$blockProcessName = $processName + ## Append .exe to match registry keys + [String[]]$blockProcessName = $blockProcessName | ForEach-Object { $_ + '.exe' } -ErrorAction 'SilentlyContinue' + + ## Enumerate each process and set the debugger value to block application execution + ForEach ($blockProcess in $blockProcessName) { + Write-Log -Message "Setting the Image File Execution Option registry key to block execution of [$blockProcess]." -Source ${CmdletName} + Set-RegistryKey -Key (Join-Path -Path $regKeyAppExecution -ChildPath $blockProcess) -Name 'Debugger' -Value $debuggerBlockValue -ContinueOnError $true + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Unblock-AppExecution +Function Unblock-AppExecution { + <# +.SYNOPSIS + +Unblocks the execution of applications performed by the Block-AppExecution function + +.DESCRIPTION + +This function is called by the Exit-Script function or when the script itself is called with the parameters -CleanupBlockedApps + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Unblock-AppExecution + +.NOTES + +This is an internal script function and should typically not be called directly. + +It is used when the -BlockExecution parameter is specified with the Show-InstallationWelcome function to undo the actions performed by Block-AppExecution. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Bypass if no Admin rights + If ($configToolkitRequireAdmin -eq $false) { + Write-Log -Message "Bypassing Function [${CmdletName}], because [Require Admin: $configToolkitRequireAdmin]." -Source ${CmdletName} + Return + } + + ## Remove Debugger values to unblock processes + [PSObject[]]$unblockProcesses = $null + [PSObject[]]$unblockProcesses += (Get-ChildItem -LiteralPath $regKeyAppExecution -Recurse -ErrorAction 'SilentlyContinue' | ForEach-Object { Get-ItemProperty -LiteralPath $_.PSPath -ErrorAction 'SilentlyContinue' }) + ForEach ($unblockProcess in ($unblockProcesses | Where-Object { $_.Debugger -like '*AppDeployToolkit_BlockAppExecutionMessage*' })) { + Write-Log -Message "Removing the Image File Execution Options registry key to unblock execution of [$($unblockProcess.PSChildName)]." -Source ${CmdletName} + $unblockProcess | Remove-ItemProperty -Name 'Debugger' -ErrorAction 'SilentlyContinue' + } + + ## If block execution variable is $true, set it to $false + If ($BlockExecution) { + # Make this variable globally available so we can check whether we need to call Unblock-AppExecution + Set-Variable -Name 'BlockExecution' -Value $false -Scope 'Script' + } + + ## Remove the scheduled task if it exists + [String]$schTaskBlockedAppsName = $installName + '_BlockedApps' + Try { + If (Get-SchedulerTask -ContinueOnError $true | Select-Object -Property 'TaskName' | Where-Object { $_.TaskName -eq "\$schTaskBlockedAppsName" }) { + Write-Log -Message "Deleting Scheduled Task [$schTaskBlockedAppsName]." -Source ${CmdletName} + Execute-Process -Path $exeSchTasks -Parameters "/Delete /TN $schTaskBlockedAppsName /F" + } + } + Catch { + Write-Log -Message "Error retrieving/deleting Scheduled Task.`r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + ## Remove BlockAppExecution Schedule Task XML file + [String]$xmlSchTaskFilePath = "$dirAppDeployTemp\SchTaskUnBlockApps.xml" + If (Test-Path -LiteralPath $xmlSchTaskFilePath) { + $null = Remove-Item -LiteralPath $xmlSchTaskFilePath -Force -ErrorAction 'SilentlyContinue' + } + + ## Remove BlockAppExection Temporary directory + [String]$blockExecutionTempPath = Join-Path -Path $dirAppDeployTemp -ChildPath 'BlockExecution' + If (Test-Path -LiteralPath $blockExecutionTempPath -PathType 'Container') { + Remove-Folder -Path $blockExecutionTempPath + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-DeferHistory +Function Get-DeferHistory { + <# +.SYNOPSIS + +Get the history of deferrals from the registry for the current application, if it exists. + +.DESCRIPTION + +Get the history of deferrals from the registry for the current application, if it exists. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the history of deferrals from the registry for the current application, if it exists. + +.EXAMPLE + +Get-DeferHistory + +.NOTES + +This is an internal script function and should typically not be called directly. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Write-Log -Message 'Getting deferral history...' -Source ${CmdletName} + Get-RegistryKey -Key $regKeyDeferHistory -ContinueOnError $true + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Set-DeferHistory +Function Set-DeferHistory { + <# +.SYNOPSIS + +Set the history of deferrals in the registry for the current application. + +.DESCRIPTION + +Set the history of deferrals in the registry for the current application. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None. This function does not return any objects. + +.EXAMPLE + +Set-DeferHistory + +.NOTES + +This is an internal script function and should typically not be called directly. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [String]$deferTimesRemaining, + [Parameter(Mandatory = $false)] + [String]$deferDeadline + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + If ($deferTimesRemaining -and ($deferTimesRemaining -ge 0)) { + Write-Log -Message "Setting deferral history: [DeferTimesRemaining = $deferTimesRemaining]." -Source ${CmdletName} + Set-RegistryKey -Key $regKeyDeferHistory -Name 'DeferTimesRemaining' -Value $deferTimesRemaining -ContinueOnError $true + } + If ($deferDeadline) { + Write-Log -Message "Setting deferral history: [DeferDeadline = $deferDeadline]." -Source ${CmdletName} + Set-RegistryKey -Key $regKeyDeferHistory -Name 'DeferDeadline' -Value $deferDeadline -ContinueOnError $true + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-UniversalDate +Function Get-UniversalDate { + <# +.SYNOPSIS + +Returns the date/time for the local culture in a universal sortable date time pattern. + +.DESCRIPTION + +Converts the current datetime or a datetime string for the current culture into a universal sortable date time pattern, e.g. 2013-08-22 11:51:52Z + +.PARAMETER DateTime + +Specify the DateTime in the current culture. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default: $false. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the date/time for the local culture in a universal sortable date time pattern. + +.EXAMPLE + +Get-UniversalDate + +Returns the current date in a universal sortable date time pattern. + +.EXAMPLE + +Get-UniversalDate -DateTime '25/08/2013' + +Returns the date for the current culture in a universal sortable date time pattern. + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + # Get the current date + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$DateTime = ((Get-Date -Format ($culture).DateTimeFormat.UniversalDateTimePattern).ToString()), + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + ## If a universal sortable date time pattern was provided, remove the Z, otherwise it could get converted to a different time zone. + If ($DateTime -match 'Z$') { + $DateTime = $DateTime -replace 'Z$', '' + } + [DateTime]$DateTime = [DateTime]::Parse($DateTime, $culture) + + ## Convert the date to a universal sortable date time pattern based on the current culture + Write-Log -Message "Converting the date [$DateTime] to a universal sortable date time pattern based on the current culture [$($culture.Name)]." -Source ${CmdletName} + [String]$universalDateTime = (Get-Date -Date $DateTime -Format ($culture).DateTimeFormat.UniversalSortableDateTimePattern -ErrorAction 'Stop').ToString() + Write-Output -InputObject ($universalDateTime) + } + Catch { + Write-Log -Message "The specified date/time [$DateTime] is not in a format recognized by the current culture [$($culture.Name)]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "The specified date/time [$DateTime] is not in a format recognized by the current culture: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-RunningProcesses +Function Get-RunningProcesses { + <# +.SYNOPSIS + +Gets the processes that are running from a custom list of process objects and also adds a property called ProcessDescription. + +.DESCRIPTION + +Gets the processes that are running from a custom list of process objects and also adds a property called ProcessDescription. + +.PARAMETER ProcessObjects + +Custom object containing the process objects to search for. If not supplied, the function just returns $null + +.PARAMETER DisableLogging + +Disables function logging + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +Syste.Boolean. + +Rettuns $true if the process is running, otherwise $false. + +.EXAMPLE + +Get-RunningProcesses -ProcessObjects $ProcessObjects + +.NOTES + +This is an internal script function and should typically not be called directly. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false, Position = 0)] + [PSObject[]]$ProcessObjects, + [Parameter(Mandatory = $false, Position = 1)] + [Switch]$DisableLogging + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + If ($processObjects -and $processObjects[0].ProcessName) { + [String]$runningAppsCheck = $processObjects.ProcessName -join ',' + If (-not $DisableLogging) { + Write-Log -Message "Checking for running applications: [$runningAppsCheck]" -Source ${CmdletName} + } + ## Prepare a filter for Where-Object + [ScriptBlock]$whereObjectFilter = { + ForEach ($processObject in $processObjects) { + If ($_.ProcessName -ieq $processObject.ProcessName) { + If ($processObject.ProcessDescription) { + # The description of the process provided as a Parameter to the function, e.g. -ProcessName "winword=Microsoft Office Word". + Add-Member -InputObject $_ -MemberType 'NoteProperty' -Name 'ProcessDescription' -Value $processObject.ProcessDescription -Force -PassThru -ErrorAction 'SilentlyContinue' + } + ElseIf ($_.Description) { + # If the process already has a description field specified, then use it + Add-Member -InputObject $_ -MemberType 'NoteProperty' -Name 'ProcessDescription' -Value $_.Description -Force -PassThru -ErrorAction 'SilentlyContinue' + } + Else { + # Fall back on the process name if no description is provided by the process or as a parameter to the function + Add-Member -InputObject $_ -MemberType 'NoteProperty' -Name 'ProcessDescription' -Value $_.ProcessName -Force -PassThru -ErrorAction 'SilentlyContinue' + } + Write-Output -InputObject ($true) + Return + } + } + + Write-Output -InputObject ($false) + Return + } + ## Get all running processes and escape special characters. Match against the process names to search for to find running processes. + [Diagnostics.Process[]]$runningProcesses = Get-Process | Where-Object -FilterScript $whereObjectFilter | Sort-Object -Property 'ProcessName' + + If (-not $DisableLogging) { + If ($runningProcesses) { + [String]$runningProcessList = ($runningProcesses.ProcessName | Select-Object -Unique) -join ',' + Write-Log -Message "The following processes are running: [$runningProcessList]." -Source ${CmdletName} + } + Else { + Write-Log -Message 'Specified applications are not running.' -Source ${CmdletName} + } + } + Write-Output -InputObject ($runningProcesses) + } + Else { + Write-Output -InputObject ($null) + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Show-InstallationWelcome +Function Show-InstallationWelcome { + <# +.SYNOPSIS + +Show a welcome dialog prompting the user with information about the installation and actions to be performed before the installation can begin. + +.DESCRIPTION + +The following prompts can be included in the welcome dialog: + a) Close the specified running applications, or optionally close the applications without showing a prompt (using the -Silent switch). + b) Defer the installation a certain number of times, for a certain number of days or until a deadline is reached. + c) Countdown until applications are automatically closed. + d) Prevent users from launching the specified applications while the installation is in progress. + +Notes: + The process descriptions are retrieved from WMI, with a fall back on the process name if no description is available. Alternatively, you can specify the description yourself with a '=' symbol - see examples. + The dialog box will timeout after the timeout specified in the XML configuration file (default 1 hour and 55 minutes) to prevent SCCM installations from timing out and returning a failure code to SCCM. When the dialog times out, the script will exit and return a 1618 code (SCCM fast retry code). + +.PARAMETER CloseApps + +Name of the process to stop (do not include the .exe). Specify multiple processes separated by a comma. Specify custom descriptions like this: "winword=Microsoft Office Word,excel=Microsoft Office Excel" + +.PARAMETER Silent + +Stop processes without prompting the user. + +.PARAMETER CloseAppsCountdown + +Option to provide a countdown in seconds until the specified applications are automatically closed. This only takes effect if deferral is not allowed or has expired. + +.PARAMETER ForceCloseAppsCountdown + +Option to provide a countdown in seconds until the specified applications are automatically closed regardless of whether deferral is allowed. + +.PARAMETER PromptToSave + +Specify whether to prompt to save working documents when the user chooses to close applications by selecting the "Close Programs" button. Option does not work in SYSTEM context unless toolkit launched with "psexec.exe -s -i" to run it as an interactive process under the SYSTEM account. + +.PARAMETER PersistPrompt + +Specify whether to make the Show-InstallationWelcome prompt persist in the center of the screen every couple of seconds, specified in the AppDeployToolkitConfig.xml. The user will have no option but to respond to the prompt. This only takes effect if deferral is not allowed or has expired. + +.PARAMETER BlockExecution + +Option to prevent the user from launching processes/applications, specified in -CloseApps, during the installation. + +.PARAMETER AllowDefer + +Enables an optional defer button to allow the user to defer the installation. + +.PARAMETER AllowDeferCloseApps + +Enables an optional defer button to allow the user to defer the installation only if there are running applications that need to be closed. This parameter automatically enables -AllowDefer + +.PARAMETER DeferTimes + +Specify the number of times the installation can be deferred. + +.PARAMETER DeferDays + +Specify the number of days since first run that the installation can be deferred. This is converted to a deadline. + +.PARAMETER DeferDeadline + +Specify the deadline date until which the installation can be deferred. + +Specify the date in the local culture if the script is intended for that same culture. + +If the script is intended to run on EN-US machines, specify the date in the format: "08/25/2013" or "08-25-2013" or "08-25-2013 18:00:00" + +If the script is intended for multiple cultures, specify the date in the universal sortable date/time format: "2013-08-22 11:51:52Z" + +The deadline date will be displayed to the user in the format of their culture. + +.PARAMETER CheckDiskSpace + +Specify whether to check if there is enough disk space for the installation to proceed. + +If this parameter is specified without the RequiredDiskSpace parameter, the required disk space is calculated automatically based on the size of the script source and associated files. + +.PARAMETER RequiredDiskSpace + +Specify required disk space in MB, used in combination with CheckDiskSpace. + +.PARAMETER MinimizeWindows + +Specifies whether to minimize other windows when displaying prompt. Default: $true. + +.PARAMETER TopMost + +Specifies whether the windows is the topmost window. Default: $true. + +.PARAMETER ForceCountdown + +Specify a countdown to display before automatically proceeding with the installation when a deferral is enabled. + +.PARAMETER CustomText + +Specify whether to display a custom message specified in the XML file. Custom message must be populated for each language section in the XML. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return objects. + +.EXAMPLE + +Show-InstallationWelcome -CloseApps 'iexplore,winword,excel' + +Prompt the user to close Internet Explorer, Word and Excel. + +.EXAMPLE + +Show-InstallationWelcome -CloseApps 'winword,excel' -Silent + +Close Word and Excel without prompting the user. + +.EXAMPLE + +Show-InstallationWelcome -CloseApps 'winword,excel' -BlockExecution + +Close Word and Excel and prevent the user from launching the applications while the installation is in progress. + +.EXAMPLE + +Show-InstallationWelcome -CloseApps 'winword=Microsoft Office Word,excel=Microsoft Office Excel' -CloseAppsCountdown 600 + +Prompt the user to close Word and Excel, with customized descriptions for the applications and automatically close the applications after 10 minutes. + +.EXAMPLE + +Show-InstallationWelcome -CloseApps 'winword,msaccess,excel' -PersistPrompt + +Prompt the user to close Word, MSAccess and Excel. + +By using the PersistPrompt switch, the dialog will return to the center of the screen every couple of seconds, specified in the AppDeployToolkitConfig.xml, so the user cannot ignore it by dragging it aside. + +.EXAMPLE + +Show-InstallationWelcome -AllowDefer -DeferDeadline '25/08/2013' + +Allow the user to defer the installation until the deadline is reached. + +.EXAMPLE + +Show-InstallationWelcome -CloseApps 'winword,excel' -BlockExecution -AllowDefer -DeferTimes 10 -DeferDeadline '25/08/2013' -CloseAppsCountdown 600 + +Close Word and Excel and prevent the user from launching the applications while the installation is in progress. + +Allow the user to defer the installation a maximum of 10 times or until the deadline is reached, whichever happens first. + +When deferral expires, prompt the user to close the applications and automatically close them after 10 minutes. + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding(DefaultParametersetName = 'None')] + + Param ( + ## Specify process names separated by commas. Optionally specify a process description with an equals symbol, e.g. "winword=Microsoft Office Word" + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$CloseApps, + ## Specify whether to prompt user or force close the applications + [Parameter(Mandatory = $false)] + [Switch]$Silent = $false, + ## Specify a countdown to display before automatically closing applications where deferral is not allowed or has expired + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$CloseAppsCountdown = 0, + ## Specify a countdown to display before automatically closing applications whether or not deferral is allowed + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$ForceCloseAppsCountdown = 0, + ## Specify whether to prompt to save working documents when the user chooses to close applications by selecting the "Close Programs" button + [Parameter(Mandatory = $false)] + [Switch]$PromptToSave = $false, + ## Specify whether to make the prompt persist in the center of the screen every couple of seconds, specified in the AppDeployToolkitConfig.xml. + [Parameter(Mandatory = $false)] + [Switch]$PersistPrompt = $false, + ## Specify whether to block execution of the processes during installation + [Parameter(Mandatory = $false)] + [Switch]$BlockExecution = $false, + ## Specify whether to enable the optional defer button on the dialog box + [Parameter(Mandatory = $false)] + [Switch]$AllowDefer = $false, + ## Specify whether to enable the optional defer button on the dialog box only if an app needs to be closed + [Parameter(Mandatory = $false)] + [Switch]$AllowDeferCloseApps = $false, + ## Specify the number of times the deferral is allowed + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$DeferTimes = 0, + ## Specify the number of days since first run that the deferral is allowed + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$DeferDays = 0, + ## Specify the deadline (in format dd/mm/yyyy) for which deferral will expire as an option + [Parameter(Mandatory = $false)] + [String]$DeferDeadline = '', + ## Specify whether to check if there is enough disk space for the installation to proceed. If this parameter is specified without the RequiredDiskSpace parameter, the required disk space is calculated automatically based on the size of the script source and associated files. + [Parameter(ParameterSetName = 'CheckDiskSpaceParameterSet', Mandatory = $true)] + [ValidateScript({ $_.IsPresent -eq ($true -or $false) })] + [Switch]$CheckDiskSpace, + ## Specify required disk space in MB, used in combination with $CheckDiskSpace. + [Parameter(ParameterSetName = 'CheckDiskSpaceParameterSet', Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$RequiredDiskSpace = 0, + ## Specify whether to minimize other windows when displaying prompt + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$MinimizeWindows = $true, + ## Specifies whether the window is the topmost window + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$TopMost = $true, + ## Specify a countdown to display before automatically proceeding with the installation when a deferral is enabled + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$ForceCountdown = 0, + ## Specify whether to display a custom message specified in the XML file. Custom message must be populated for each language section in the XML. + [Parameter(Mandatory = $false)] + [Switch]$CustomText = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## If running in NonInteractive mode, force the processes to close silently + If ($deployModeNonInteractive) { + $Silent = $true + } + + ## If using Zero-Config MSI Deployment, append any executables found in the MSI to the CloseApps list + If ($useDefaultMsi) { + $CloseApps = "$CloseApps,$defaultMsiExecutablesList" + } + + ## Check disk space requirements if specified + If ($CheckDiskSpace) { + Write-Log -Message 'Evaluating disk space requirements.' -Source ${CmdletName} + [Double]$freeDiskSpace = Get-FreeDiskSpace + If ($RequiredDiskSpace -eq 0) { + Try { + # Determine the size of the Files folder + $fso = New-Object -ComObject 'Scripting.FileSystemObject' -ErrorAction 'Stop' + $RequiredDiskSpace = [Math]::Round((($fso.GetFolder($scriptParentPath).Size) / 1MB)) + } + Catch { + Write-Log -Message "Failed to calculate disk space requirement from source files. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + Finally { + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($fso) + } + Catch { + } + } + } + If ($freeDiskSpace -lt $RequiredDiskSpace) { + Write-Log -Message "Failed to meet minimum disk space requirement. Space Required [$RequiredDiskSpace MB], Space Available [$freeDiskSpace MB]." -Severity 3 -Source ${CmdletName} + If (-not $Silent) { + Show-InstallationPrompt -Message ($configDiskSpaceMessage -f $installTitle, $RequiredDiskSpace, ($freeDiskSpace)) -ButtonRightText 'OK' -Icon 'Error' + } + Exit-Script -ExitCode $configInstallationUIExitCode + } + Else { + Write-Log -Message 'Successfully passed minimum disk space requirement check.' -Source ${CmdletName} + } + } + + If ($CloseApps) { + ## Create a Process object with custom descriptions where they are provided (split on an '=' sign) + [PSObject[]]$processObjects = @() + # Split multiple processes on a comma, then split on equal sign, then create custom object with process name and description + ForEach ($process in ($CloseApps -split ',' | Where-Object { $_ })) { + If ($process.Contains('=')) { + [String[]]$ProcessSplit = $process -split '=' + $processObjects += New-Object -TypeName 'PSObject' -Property @{ + ProcessName = $ProcessSplit[0] + ProcessDescription = $ProcessSplit[1] + } + } + Else { + [String]$ProcessInfo = $process + $processObjects += New-Object -TypeName 'PSObject' -Property @{ + ProcessName = $process + ProcessDescription = '' + } + } + } + } + + ## Check Deferral history and calculate remaining deferrals + If (($allowDefer) -or ($AllowDeferCloseApps)) { + # Set $allowDefer to true if $AllowDeferCloseApps is true + $allowDefer = $true + + # Get the deferral history from the registry + $deferHistory = Get-DeferHistory + $deferHistoryTimes = $deferHistory | Select-Object -ExpandProperty 'DeferTimesRemaining' -ErrorAction 'SilentlyContinue' + $deferHistoryDeadline = $deferHistory | Select-Object -ExpandProperty 'DeferDeadline' -ErrorAction 'SilentlyContinue' + + # Reset Switches + $checkDeferDays = $false + $checkDeferDeadline = $false + If ($DeferDays -ne 0) { + $checkDeferDays = $true + } + If ($DeferDeadline) { + $checkDeferDeadline = $true + } + If ($DeferTimes -ne 0) { + If ($deferHistoryTimes -ge 0) { + Write-Log -Message "Defer history shows [$($deferHistory.DeferTimesRemaining)] deferrals remaining." -Source ${CmdletName} + $DeferTimes = $deferHistory.DeferTimesRemaining - 1 + } + Else { + $DeferTimes = $DeferTimes - 1 + } + Write-Log -Message "The user has [$deferTimes] deferrals remaining." -Source ${CmdletName} + If ($DeferTimes -lt 0) { + Write-Log -Message 'Deferral has expired.' -Source ${CmdletName} + $AllowDefer = $false + } + } + Else { + If (Test-Path -LiteralPath 'variable:deferTimes') { + Remove-Variable -Name 'deferTimes' + } + $DeferTimes = $null + } + If ($checkDeferDays -and $allowDefer) { + If ($deferHistoryDeadline) { + Write-Log -Message "Defer history shows a deadline date of [$deferHistoryDeadline]." -Source ${CmdletName} + [String]$deferDeadlineUniversal = Get-UniversalDate -DateTime $deferHistoryDeadline + } + Else { + [String]$deferDeadlineUniversal = Get-UniversalDate -DateTime (Get-Date -Date ((Get-Date).AddDays($deferDays)) -Format ($culture).DateTimeFormat.UniversalDateTimePattern).ToString() + } + Write-Log -Message "The user has until [$deferDeadlineUniversal] before deferral expires." -Source ${CmdletName} + If ((Get-UniversalDate) -gt $deferDeadlineUniversal) { + Write-Log -Message 'Deferral has expired.' -Source ${CmdletName} + $AllowDefer = $false + } + } + If ($checkDeferDeadline -and $allowDefer) { + # Validate Date + Try { + [String]$deferDeadlineUniversal = Get-UniversalDate -DateTime $deferDeadline -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Date is not in the correct format for the current culture. Type the date in the current locale format, such as 20/08/2014 (Europe) or 08/20/2014 (United States). If the script is intended for multiple cultures, specify the date in the universal sortable date/time format, e.g. '2013-08-22 11:51:52Z'. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + Throw "Date is not in the correct format for the current culture. Type the date in the current locale format, such as 20/08/2014 (Europe) or 08/20/2014 (United States). If the script is intended for multiple cultures, specify the date in the universal sortable date/time format, e.g. '2013-08-22 11:51:52Z': $($_.Exception.Message)" + } + Write-Log -Message "The user has until [$deferDeadlineUniversal] remaining." -Source ${CmdletName} + If ((Get-UniversalDate) -gt $deferDeadlineUniversal) { + Write-Log -Message 'Deferral has expired.' -Source ${CmdletName} + $AllowDefer = $false + } + } + } + If (($deferTimes -lt 0) -and (-not $deferDeadlineUniversal)) { + $AllowDefer = $false + } + + ## Prompt the user to close running applications and optionally defer if enabled + If ((-not $deployModeSilent) -and (-not $silent)) { + If ($forceCloseAppsCountdown -gt 0) { + # Keep the same variable for countdown to simplify the code: + $closeAppsCountdown = $forceCloseAppsCountdown + # Change this variable to a boolean now to switch the countdown on even with deferral + [Boolean]$forceCloseAppsCountdown = $true + } + ElseIf ($forceCountdown -gt 0) { + # Keep the same variable for countdown to simplify the code: + $closeAppsCountdown = $forceCountdown + # Change this variable to a boolean now to switch the countdown on + [Boolean]$forceCountdown = $true + } + Set-Variable -Name 'closeAppsCountdownGlobal' -Value $closeAppsCountdown -Scope 'Script' + + While ((Get-RunningProcesses -ProcessObjects $processObjects -OutVariable 'runningProcesses') -or (($promptResult -ne 'Defer') -and ($promptResult -ne 'Close'))) { + [String]$runningProcessDescriptions = ($runningProcesses | Where-Object { $_.ProcessDescription } | Select-Object -ExpandProperty 'ProcessDescription' | Sort-Object -Unique) -join ',' + # Check if we need to prompt the user to defer, to defer and close apps, or not to prompt them at all + If ($allowDefer) { + # If there is deferral and closing apps is allowed but there are no apps to be closed, break the while loop + If ($AllowDeferCloseApps -and (-not $runningProcessDescriptions)) { + Break + } + # Otherwise, as long as the user has not selected to close the apps or the processes are still running and the user has not selected to continue, prompt user to close running processes with deferral + ElseIf (($promptResult -ne 'Close') -or (($runningProcessDescriptions) -and ($promptResult -ne 'Continue'))) { + [String]$promptResult = Show-WelcomePrompt -ProcessDescriptions $runningProcessDescriptions -CloseAppsCountdown $closeAppsCountdownGlobal -ForceCloseAppsCountdown $forceCloseAppsCountdown -ForceCountdown $forceCountdown -PersistPrompt $PersistPrompt -AllowDefer -DeferTimes $deferTimes -DeferDeadline $deferDeadlineUniversal -MinimizeWindows $MinimizeWindows -CustomText:$CustomText -TopMost $TopMost + } + } + # If there is no deferral and processes are running, prompt the user to close running processes with no deferral option + ElseIf (($runningProcessDescriptions) -or ($forceCountdown)) { + [String]$promptResult = Show-WelcomePrompt -ProcessDescriptions $runningProcessDescriptions -CloseAppsCountdown $closeAppsCountdownGlobal -ForceCloseAppsCountdown $forceCloseAppsCountdown -ForceCountdown $forceCountdown -PersistPrompt $PersistPrompt -MinimizeWindows $minimizeWindows -CustomText:$CustomText -TopMost $TopMost + } + # If there is no deferral and no processes running, break the while loop + Else { + Break + } + + # If the user has clicked OK, wait a few seconds for the process to terminate before evaluating the running processes again + If ($promptResult -eq 'Continue') { + Write-Log -Message 'The user selected to continue...' -Source ${CmdletName} + Start-Sleep -Seconds 2 + + # Break the while loop if there are no processes to close and the user has clicked OK to continue + If (-not $runningProcesses) { + Break + } + } + # Force the applications to close + ElseIf ($promptResult -eq 'Close') { + Write-Log -Message 'The user selected to force the application(s) to close...' -Source ${CmdletName} + If (($PromptToSave) -and ($SessionZero -and (-not $IsProcessUserInteractive))) { + Write-Log -Message 'Specified [-PromptToSave] option will not be available, because current process is running in session zero and is not interactive.' -Severity 2 -Source ${CmdletName} + } + # Update the process list right before closing, in case it changed + $runningProcesses = Get-RunningProcesses -ProcessObjects $processObjects + # Close running processes + ForEach ($runningProcess in $runningProcesses) { + [PSObject[]]$AllOpenWindowsForRunningProcess = Get-WindowTitle -GetAllWindowTitles -DisableFunctionLogging | Where-Object { $_.ParentProcess -eq $runningProcess.ProcessName } + # If the PromptToSave parameter was specified and the process has a window open, then prompt the user to save work if there is work to be saved when closing window + If (($PromptToSave) -and (-not ($SessionZero -and (-not $IsProcessUserInteractive))) -and ($AllOpenWindowsForRunningProcess) -and ($runningProcess.MainWindowHandle -ne [IntPtr]::Zero)) { + [Timespan]$PromptToSaveTimeout = New-TimeSpan -Seconds $configInstallationPromptToSave + [Diagnostics.StopWatch]$PromptToSaveStopWatch = [Diagnostics.StopWatch]::StartNew() + $PromptToSaveStopWatch.Reset() + ForEach ($OpenWindow in $AllOpenWindowsForRunningProcess) { + Try { + Write-Log -Message "Stopping process [$($runningProcess.ProcessName)] with window title [$($OpenWindow.WindowTitle)] and prompt to save if there is work to be saved (timeout in [$configInstallationPromptToSave] seconds)..." -Source ${CmdletName} + [Boolean]$IsBringWindowToFrontSuccess = [PSADT.UiAutomation]::BringWindowToFront($OpenWindow.WindowHandle) + [Boolean]$IsCloseWindowCallSuccess = $runningProcess.CloseMainWindow() + If (-not $IsCloseWindowCallSuccess) { + Write-Log -Message "Failed to call the CloseMainWindow() method on process [$($runningProcess.ProcessName)] with window title [$($OpenWindow.WindowTitle)] because the main window may be disabled due to a modal dialog being shown." -Severity 3 -Source ${CmdletName} + } + Else { + $PromptToSaveStopWatch.Start() + Do { + [Boolean]$IsWindowOpen = [Boolean](Get-WindowTitle -GetAllWindowTitles -DisableFunctionLogging | Where-Object { $_.WindowHandle -eq $OpenWindow.WindowHandle }) + If (-not $IsWindowOpen) { + Break + } + Start-Sleep -Seconds 3 + } While (($IsWindowOpen) -and ($PromptToSaveStopWatch.Elapsed -lt $PromptToSaveTimeout)) + $PromptToSaveStopWatch.Reset() + If ($IsWindowOpen) { + Write-Log -Message "Exceeded the [$configInstallationPromptToSave] seconds timeout value for the user to save work associated with process [$($runningProcess.ProcessName)] with window title [$($OpenWindow.WindowTitle)]." -Severity 2 -Source ${CmdletName} + } + Else { + Write-Log -Message "Window [$($OpenWindow.WindowTitle)] for process [$($runningProcess.ProcessName)] was successfully closed." -Source ${CmdletName} + } + } + } + Catch { + Write-Log -Message "Failed to close window [$($OpenWindow.WindowTitle)] for process [$($runningProcess.ProcessName)]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + Continue + } + Finally { + $runningProcess.Refresh() + } + } + } + Else { + Write-Log -Message "Stopping process $($runningProcess.ProcessName)..." -Source ${CmdletName} + Stop-Process -Name $runningProcess.ProcessName -Force -ErrorAction 'SilentlyContinue' + } + } + + If ($runningProcesses = Get-RunningProcesses -ProcessObjects $processObjects -DisableLogging) { + # Apps are still running, give them 2s to close. If they are still running, the Welcome Window will be displayed again + Write-Log -Message 'Sleeping for 2 seconds because the processes are still not closed...' -Source ${CmdletName} + Start-Sleep -Seconds 2 + } + } + # Stop the script (if not actioned before the timeout value) + ElseIf ($promptResult -eq 'Timeout') { + Write-Log -Message 'Installation not actioned before the timeout value.' -Source ${CmdletName} + $BlockExecution = $false + + If (($deferTimes -ge 0) -or ($deferDeadlineUniversal)) { + Set-DeferHistory -DeferTimesRemaining $DeferTimes -DeferDeadline $deferDeadlineUniversal + } + ## Dispose the welcome prompt timer here because if we dispose it within the Show-WelcomePrompt function we risk resetting the timer and missing the specified timeout period + If ($script:welcomeTimer) { + Try { + $script:welcomeTimer.Dispose() + $script:welcomeTimer = $null + } + Catch { + } + } + + # Restore minimized windows + $null = $shellApp.UndoMinimizeAll() + + Exit-Script -ExitCode $configInstallationUIExitCode + } + # Stop the script (user chose to defer) + ElseIf ($promptResult -eq 'Defer') { + Write-Log -Message 'Installation deferred by the user.' -Source ${CmdletName} + $BlockExecution = $false + + Set-DeferHistory -DeferTimesRemaining $DeferTimes -DeferDeadline $deferDeadlineUniversal + + # Restore minimized windows + $null = $shellApp.UndoMinimizeAll() + + Exit-Script -ExitCode $configInstallationDeferExitCode + } + } + } + + ## Force the processes to close silently, without prompting the user + If (($Silent -or $deployModeSilent) -and $CloseApps) { + [Array]$runningProcesses = $null + [Array]$runningProcesses = Get-RunningProcesses $processObjects + If ($runningProcesses) { + [String]$runningProcessDescriptions = ($runningProcesses | Where-Object { $_.ProcessDescription } | Select-Object -ExpandProperty 'ProcessDescription' | Sort-Object -Unique) -join ',' + Write-Log -Message "Force closing application(s) [$($runningProcessDescriptions)] without prompting user." -Source ${CmdletName} + $runningProcesses.ProcessName | ForEach-Object -Process { Stop-Process -Name $_ -Force -ErrorAction 'SilentlyContinue' } + Start-Sleep -Seconds 2 + } + } + + ## Force nsd.exe to stop if Notes is one of the required applications to close + If (($processObjects | Select-Object -ExpandProperty 'ProcessName') -contains 'notes') { + ## Get the path where Notes is installed + [String]$notesPath = Get-Item -LiteralPath $regKeyLotusNotes -ErrorAction 'SilentlyContinue' | Get-ItemProperty | Select-Object -ExpandProperty 'Path' + + ## Ensure we aren't running as a Local System Account and Notes install directory was found + If ((-not $IsLocalSystemAccount) -and ($notesPath)) { + # Get a list of all the executables in the Notes folder + [string[]]$notesPathExes = Get-ChildItem -LiteralPath $notesPath -Filter '*.exe' -Recurse | Select-Object -ExpandProperty 'BaseName' | Sort-Object + ## Check for running Notes executables and run NSD if any are found + $notesPathExes | ForEach-Object { + If ((Get-Process | Select-Object -ExpandProperty 'Name') -contains $_) { + [String]$notesNSDExecutable = Join-Path -Path $notesPath -ChildPath 'NSD.exe' + Try { + If (Test-Path -LiteralPath $notesNSDExecutable -PathType 'Leaf' -ErrorAction 'Stop') { + Write-Log -Message "Executing [$notesNSDExecutable] with the -kill argument..." -Source ${CmdletName} + [Diagnostics.Process]$notesNSDProcess = Start-Process -FilePath $notesNSDExecutable -ArgumentList '-kill' -WindowStyle 'Hidden' -PassThru -ErrorAction 'SilentlyContinue' + + If (-not $notesNSDProcess.WaitForExit(10000)) { + Write-Log -Message "[$notesNSDExecutable] did not end in a timely manner. Force terminate process." -Source ${CmdletName} + Stop-Process -Name 'NSD' -Force -ErrorAction 'SilentlyContinue' + } + } + } + Catch { + Write-Log -Message "Failed to launch [$notesNSDExecutable]. `r`n$(Resolve-Error)" -Source ${CmdletName} + } + + Write-Log -Message "[$notesNSDExecutable] returned exit code [$($notesNSDProcess.ExitCode)]." -Source ${CmdletName} + + # Force NSD process to stop in case the previous command was not successful + Stop-Process -Name 'NSD' -Force -ErrorAction 'SilentlyContinue' + } + } + } + + # Strip all Notes processes from the process list except notes.exe, because the other notes processes (e.g. notes2.exe) may be invoked by the Notes installation, so we don't want to block their execution. + If ($notesPathExes) { + [Array]$processesIgnoringNotesExceptions = Compare-Object -ReferenceObject ($processObjects | Select-Object -ExpandProperty 'ProcessName' | Sort-Object) -DifferenceObject $notesPathExes -IncludeEqual | Where-Object { ($_.SideIndicator -eq '<=') -or ($_.InputObject -eq 'notes') } | Select-Object -ExpandProperty 'InputObject' + [Array]$processObjects = $processObjects | Where-Object { $processesIgnoringNotesExceptions -contains $_.ProcessName } + } + } + + ## If block execution switch is true, call the function to block execution of these processes + If ($BlockExecution) { + # Make this variable globally available so we can check whether we need to call Unblock-AppExecution + Set-Variable -Name 'BlockExecution' -Value $BlockExecution -Scope 'Script' + Write-Log -Message '[-BlockExecution] parameter specified.' -Source ${CmdletName} + Block-AppExecution -ProcessName ($processObjects | Select-Object -ExpandProperty 'ProcessName') + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Show-WelcomePrompt +Function Show-WelcomePrompt { + <# +.SYNOPSIS + +Called by Show-InstallationWelcome to prompt the user to optionally do the following: + 1) Close the specified running applications. + 2) Provide an option to defer the installation. + 3) Show a countdown before applications are automatically closed. + +.DESCRIPTION + +The user is presented with a Windows Forms dialog box to close the applications themselves and continue or to have the script close the applications for them. +If the -AllowDefer option is set to true, an optional "Defer" button will be shown to the user. If they select this option, the script will exit and return a 1618 code (SCCM fast retry code). +The dialog box will timeout after the timeout specified in the XML configuration file (default 1 hour and 55 minutes) to prevent SCCM installations from timing out and returning a failure code to SCCM. When the dialog times out, the script will exit and return a 1618 code (SCCM fast retry code). + +.PARAMETER ProcessDescriptions + +The descriptive names of the applications that are running and need to be closed. + +.PARAMETER CloseAppsCountdown + +Specify the countdown time in seconds before running applications are automatically closed when deferral is not allowed or expired. + +.PARAMETER ForceCloseAppsCountdown + +Specify whether to show the countdown regardless of whether deferral is allowed. + +.PARAMETER PersistPrompt + +Specify whether to make the prompt persist in the center of the screen every couple of seconds, specified in the AppDeployToolkitConfig.xml. + +.PARAMETER AllowDefer + +Specify whether to provide an option to defer the installation. + +.PARAMETER DeferTimes + +Specify the number of times the user is allowed to defer. + +.PARAMETER DeferDeadline + +Specify the deadline date before the user is allowed to defer. + +.PARAMETER MinimizeWindows + +Specifies whether to minimize other windows when displaying prompt. Default: $true. + +.PARAMETER TopMost + +Specifies whether the windows is the topmost window. Default: $true. + +.PARAMETER ForceCountdown + +Specify a countdown to display before automatically proceeding with the installation when a deferral is enabled. + +.PARAMETER CustomText + +Specify whether to display a custom message specified in the XML file. Custom message must be populated for each language section in the XML. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the user's selection. + +.EXAMPLE + +Show-WelcomePrompt -ProcessDescriptions 'Lotus Notes, Microsoft Word' -CloseAppsCountdown 600 -AllowDefer -DeferTimes 10 + +.NOTES + +This is an internal script function and should typically not be called directly. It is used by the Show-InstallationWelcome prompt to display a custom prompt. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [String]$ProcessDescriptions, + [Parameter(Mandatory = $false)] + [Int32]$CloseAppsCountdown, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ForceCloseAppsCountdown, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$PersistPrompt = $false, + [Parameter(Mandatory = $false)] + [Switch]$AllowDefer = $false, + [Parameter(Mandatory = $false)] + [String]$DeferTimes, + [Parameter(Mandatory = $false)] + [String]$DeferDeadline, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$MinimizeWindows = $true, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$TopMost = $true, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$ForceCountdown = 0, + [Parameter(Mandatory = $false)] + [Switch]$CustomText = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Reset switches + [Boolean]$showCloseApps = $false + [Boolean]$showDefer = $false + [Boolean]$persistWindow = $false + + ## Reset times + [DateTime]$startTime = Get-Date + [DateTime]$countdownTime = $startTime + + ## Check if the countdown was specified + If ($CloseAppsCountdown -and ($CloseAppsCountdown -gt $configInstallationUITimeout)) { + Throw 'The close applications countdown time cannot be longer than the timeout specified in the XML configuration for installation UI dialogs to timeout.' + } + + ## Initial form layout: Close Applications / Allow Deferral + If ($processDescriptions) { + Write-Log -Message "Prompting the user to close application(s) [$processDescriptions]..." -Source ${CmdletName} + $showCloseApps = $true + } + If (($allowDefer) -and (($deferTimes -ge 0) -or ($deferDeadline))) { + Write-Log -Message 'The user has the option to defer.' -Source ${CmdletName} + $showDefer = $true + If ($deferDeadline) { + # Remove the Z from universal sortable date time format, otherwise it could be converted to a different time zone + $deferDeadline = $deferDeadline -replace 'Z', '' + # Convert the deadline date to a string + [String]$deferDeadline = (Get-Date -Date $deferDeadline).ToString() + } + } + + ## If deferral is being shown and 'close apps countdown' or 'persist prompt' was specified, enable those features. + If (-not $showDefer) { + If ($closeAppsCountdown -gt 0) { + Write-Log -Message "Close applications countdown has [$closeAppsCountdown] seconds remaining." -Source ${CmdletName} + $showCountdown = $true + } + } + Else { + If ($persistPrompt) { + $persistWindow = $true + } + } + ## If 'force close apps countdown' was specified, enable that feature. + If ($forceCloseAppsCountdown -eq $true) { + Write-Log -Message "Close applications countdown has [$closeAppsCountdown] seconds remaining." -Source ${CmdletName} + $showCountdown = $true + } + ## If 'force countdown' was specified, enable that feature. + If ($forceCountdown -eq $true) { + Write-Log -Message "Countdown has [$closeAppsCountdown] seconds remaining." -Source ${CmdletName} + $showCountdown = $true + } + + [String[]]$processDescriptions = $processDescriptions -split ',' + [Windows.Forms.Application]::EnableVisualStyles() + + $formWelcome = New-Object -TypeName 'System.Windows.Forms.Form' + $pictureBanner = New-Object -TypeName 'System.Windows.Forms.PictureBox' + $labelWelcomeMessage = New-Object -TypeName 'System.Windows.Forms.Label' + $labelAppName = New-Object -TypeName 'System.Windows.Forms.Label' + $labelCustomMessage = New-Object -TypeName 'System.Windows.Forms.Label' + $labelCloseAppsMessage = New-Object -TypeName 'System.Windows.Forms.Label' + $labelCountdownMessage = New-Object -TypeName 'System.Windows.Forms.Label' + $labelCountdown = New-Object -TypeName 'System.Windows.Forms.Label' + $labelDefer = New-Object -TypeName 'System.Windows.Forms.Label' + $listBoxCloseApps = New-Object -TypeName 'System.Windows.Forms.ListBox' + $buttonContinue = New-Object -TypeName 'System.Windows.Forms.Button' + $buttonDefer = New-Object -TypeName 'System.Windows.Forms.Button' + $buttonCloseApps = New-Object -TypeName 'System.Windows.Forms.Button' + $buttonAbort = New-Object -TypeName 'System.Windows.Forms.Button' + $flowLayoutPanel = New-Object -TypeName 'System.Windows.Forms.FlowLayoutPanel' + $panelButtons = New-Object -TypeName 'System.Windows.Forms.Panel' + $toolTip = New-Object -TypeName 'System.Windows.Forms.ToolTip' + + ## Remove all event handlers from the controls + [ScriptBlock]$Welcome_Form_Cleanup_FormClosed = { + Try { + $labelWelcomeMessage.remove_Click($handler_labelWelcomeMessage_Click) + $labelAppName.remove_Click($handler_labelAppName_Click) + $labelCustomMessage.remove_Click($handler_labelCustomMessage_Click) + $labelCloseAppsMessage.remove_Click($handler_labelCloseAppsMessage_Click) + $labelDefer.remove_Click($handler_labelDefer_Click) + $labelCountdownMessage.remove_Click($handler_labelCountdownMessage_Click) + $buttonCloseApps.remove_Click($buttonCloseApps_OnClick) + $buttonContinue.remove_Click($buttonContinue_OnClick) + $buttonDefer.remove_Click($buttonDefer_OnClick) + $buttonAbort.remove_Click($buttonAbort_OnClick) + $script:welcomeTimer.remove_Tick($welcomeTimer_Tick) + $welcomeTimerPersist.remove_Tick($welcomeTimerPersist_Tick) + $timerRunningProcesses.remove_Tick($timerRunningProcesses_Tick) + $formWelcome.remove_Load($Welcome_Form_StateCorrection_Load) + $formWelcome.remove_FormClosed($Welcome_Form_Cleanup_FormClosed) + } + Catch { + } + } + + [ScriptBlock]$Welcome_Form_StateCorrection_Load = { + # Disable the X button + Try { + $windowHandle = $formWelcome.Handle + If ($windowHandle -and ($windowHandle -ne [IntPtr]::Zero)) { + $menuHandle = [PSADT.UiAutomation]::GetSystemMenu($windowHandle, $false) + If ($menuHandle -and ($menuHandle -ne [IntPtr]::Zero)) { + [PSADT.UiAutomation]::EnableMenuItem($menuHandle, 0xF060, 0x00000001) + [PSADT.UiAutomation]::DestroyMenu($menuHandle) + } + } + } + Catch { + # Not a terminating error if we can't disable the button. Just disable the Control Box instead + Write-Log 'Failed to disable the Close button. Disabling the Control Box instead.' -Severity 2 -Source ${CmdletName} + $formWelcome.ControlBox = $false + } + ## Correct the initial state of the form to prevent the .NET maximized form issue + $formWelcome.WindowState = 'Normal' + $formWelcome.AutoSize = $true + $formWelcome.AutoScaleMode = 'Font' + $formWelcome.AutoScaleDimensions = New-Object System.Drawing.SizeF(6, 13) #Set as if using 96 DPI + $formWelcome.TopMost = $TopMost + $formWelcome.BringToFront() + # Get the start position of the form so we can return the form to this position if PersistPrompt is enabled + Set-Variable -Name 'formWelcomeStartPosition' -Value $formWelcome.Location -Scope 'Script' + + ## Initialize the countdown timer + [DateTime]$currentTime = Get-Date + [DateTime]$countdownTime = $startTime.AddSeconds($CloseAppsCountdown) + $script:welcomeTimer.Start() + + ## Set up the form + [Timespan]$remainingTime = $countdownTime.Subtract($currentTime) + $labelCountdown.Text = [String]::Format('{0}:{1:d2}:{2:d2}', $remainingTime.Days * 24 + $remainingTime.Hours, $remainingTime.Minutes, $remainingTime.Seconds) + } + + ## Add the timer if it doesn't already exist - this avoids the timer being reset if the continue button is clicked + If (-not $script:welcomeTimer) { + $script:welcomeTimer = New-Object -TypeName 'System.Windows.Forms.Timer' + } + + If ($showCountdown) { + [ScriptBlock]$welcomeTimer_Tick = { + ## Get the time information + [DateTime]$currentTime = Get-Date + [DateTime]$countdownTime = $startTime.AddSeconds($CloseAppsCountdown) + [Timespan]$remainingTime = $countdownTime.Subtract($currentTime) + Set-Variable -Name 'closeAppsCountdownGlobal' -Value $remainingTime.TotalSeconds -Scope 'Script' + + ## If the countdown is complete, close the application(s) or continue + If ($countdownTime -le $currentTime) { + If ($forceCountdown -eq $true) { + Write-Log -Message 'Countdown timer has elapsed. Force continue.' -Source ${CmdletName} + $buttonContinue.PerformClick() + } + Else { + Write-Log -Message 'Close application(s) countdown timer has elapsed. Force closing application(s).' -Source ${CmdletName} + If ($buttonCloseApps.CanFocus) { + $buttonCloseApps.PerformClick() + } + Else { + $buttonContinue.PerformClick() + } + } + } + Else { + # Update the form + $labelCountdown.Text = [String]::Format('{0}:{1:d2}:{2:d2}', $remainingTime.Days * 24 + $remainingTime.Hours, $remainingTime.Minutes, $remainingTime.Seconds) + } + } + } + Else { + $script:welcomeTimer.Interval = ($configInstallationUITimeout * 1000) + [ScriptBlock]$welcomeTimer_Tick = { $buttonAbort.PerformClick() } + } + + $script:welcomeTimer.add_Tick($welcomeTimer_Tick) + + ## Persistence Timer + If ($persistWindow) { + $welcomeTimerPersist = New-Object -TypeName 'System.Windows.Forms.Timer' + $welcomeTimerPersist.Interval = ($configInstallationPersistInterval * 1000) + [ScriptBlock]$welcomeTimerPersist_Tick = { + $formWelcome.WindowState = 'Normal' + $formWelcome.TopMost = $TopMost + $formWelcome.BringToFront() + $formWelcome.Location = "$($formWelcomeStartPosition.X),$($formWelcomeStartPosition.Y)" + } + $welcomeTimerPersist.add_Tick($welcomeTimerPersist_Tick) + $welcomeTimerPersist.Start() + } + + ## Process Re-Enumeration Timer + If ($configInstallationWelcomePromptDynamicRunningProcessEvaluation) { + $timerRunningProcesses = New-Object -TypeName 'System.Windows.Forms.Timer' + $timerRunningProcesses.Interval = ($configInstallationWelcomePromptDynamicRunningProcessEvaluationInterval * 1000) + [ScriptBlock]$timerRunningProcesses_Tick = { + Try { + $dynamicRunningProcesses = $null + $dynamicRunningProcesses = Get-RunningProcesses -ProcessObjects $processObjects -DisableLogging + [String]$dynamicRunningProcessDescriptions = ($dynamicRunningProcesses | Where-Object { $_.ProcessDescription } | Select-Object -ExpandProperty 'ProcessDescription' | Sort-Object -Unique) -join ',' + If ($dynamicRunningProcessDescriptions -ne $script:runningProcessDescriptions) { + # Update the runningProcessDescriptions variable for the next time this function runs + Set-Variable -Name 'runningProcessDescriptions' -Value $dynamicRunningProcessDescriptions -Force -Scope 'Script' + If ($dynamicRunningProcesses) { + Write-Log -Message "The running processes have changed. Updating the apps to close: [$script:runningProcessDescriptions]..." -Source ${CmdletName} + } + # Update the list box with the processes to close + $listboxCloseApps.Items.Clear() + $script:runningProcessDescriptions -split ',' | ForEach-Object { $null = $listboxCloseApps.Items.Add($_) } + } + # If CloseApps processes were running when the prompt was shown, and they are subsequently detected to be closed while the form is showing, then close the form. The deferral and CloseApps conditions will be re-evaluated. + If ($ProcessDescriptions) { + If (-not $dynamicRunningProcesses) { + Write-Log -Message 'Previously detected running processes are no longer running.' -Source ${CmdletName} + $formWelcome.Dispose() + } + } + # If CloseApps processes were not running when the prompt was shown, and they are subsequently detected to be running while the form is showing, then close the form for relaunch. The deferral and CloseApps conditions will be re-evaluated. + Else { + If ($dynamicRunningProcesses) { + Write-Log -Message 'New running processes detected. Updating the form to prompt to close the running applications.' -Source ${CmdletName} + $formWelcome.Dispose() + } + } + } + Catch { + } + } + $timerRunningProcesses.add_Tick($timerRunningProcesses_Tick) + $timerRunningProcesses.Start() + } + + ## Form + + ##---------------------------------------------- + ## Create zero px padding object + $paddingNone = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 0, 0, 0) + ## Create basic control size + $defaultControlSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 0) + + ## Generic Button properties + $buttonSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (130, 24) + + ## Picture Banner + $pictureBanner.DataBindings.DefaultDataSourceUpdateMode = 0 + $pictureBanner.ImageLocation = $appDeployLogoBanner + $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, 0) + $pictureBanner.Location = $System_Drawing_Point + $pictureBanner.Name = 'pictureBanner' + $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, $appDeployLogoBannerHeight) + $pictureBanner.Size = $System_Drawing_Size + $pictureBanner.SizeMode = 'CenterImage' + $pictureBanner.Margin = $paddingNone + $pictureBanner.TabStop = $false + + ## Label Welcome Message + $labelWelcomeMessage.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelWelcomeMessage.Font = $defaultFont + $labelWelcomeMessage.Name = 'labelWelcomeMessage' + $labelWelcomeMessage.Size = $defaultControlSize + $labelWelcomeMessage.MinimumSize = $defaultControlSize + $labelWelcomeMessage.MaximumSize = $defaultControlSize + $labelWelcomeMessage.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 10, 0, 0) + $labelWelcomeMessage.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelWelcomeMessage.TabStop = $false + $labelWelcomeMessage.Text = $configDeferPromptWelcomeMessage + $labelWelcomeMessage.TextAlign = 'MiddleCenter' + $labelWelcomeMessage.Anchor = 'Top' + $labelWelcomeMessage.AutoSize = $true + $labelWelcomeMessage.add_Click($handler_labelWelcomeMessage_Click) + + ## Label App Name + $labelAppName.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelAppName.Font = "$($defaultFont.Name), $($defaultFont.Size + 2), style=Bold" + $labelAppName.Name = 'labelAppName' + $labelAppName.Size = $defaultControlSize + $labelAppName.MinimumSize = $defaultControlSize + $labelAppName.MaximumSize = $defaultControlSize + $labelAppName.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 5, 0, 5) + $labelAppName.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelAppName.TabStop = $false + $labelAppName.Text = $installTitle + $labelAppName.TextAlign = 'MiddleCenter' + $labelAppName.Anchor = 'Top' + $labelAppName.AutoSize = $true + $labelAppName.add_Click($handler_labelAppName_Click) + + ## Label CustomMessage + $labelCustomMessage.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelCustomMessage.Font = $defaultFont + $labelCustomMessage.Name = 'labelCustomMessage' + $labelCustomMessage.Size = $defaultControlSize + $labelCustomMessage.MinimumSize = $defaultControlSize + $labelCustomMessage.MaximumSize = $defaultControlSize + $labelCustomMessage.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 0, 0, 5) + $labelCustomMessage.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelCustomMessage.TabStop = $false + $labelCustomMessage.Text = $configClosePromptMessage + $labelCustomMessage.TextAlign = 'MiddleCenter' + $labelCustomMessage.Anchor = 'Top' + $labelCustomMessage.AutoSize = $true + $labelCustomMessage.add_Click($handler_labelCustomMessage_Click) + + ## Label CloseAppsMessage + $labelCloseAppsMessage.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelCloseAppsMessage.Font = $defaultFont + $labelCloseAppsMessage.Name = 'labelCloseAppsMessage' + $labelCloseAppsMessage.Size = $defaultControlSize + $labelCloseAppsMessage.MinimumSize = $defaultControlSize + $labelCloseAppsMessage.MaximumSize = $defaultControlSize + $labelCloseAppsMessage.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 0, 0, 5) + $labelCloseAppsMessage.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelCloseAppsMessage.TabStop = $false + $labelCloseAppsMessage.Text = $configClosePromptMessage + $labelCloseAppsMessage.TextAlign = 'MiddleCenter' + $labelCloseAppsMessage.Anchor = 'Top' + $labelCloseAppsMessage.AutoSize = $true + $labelCloseAppsMessage.add_Click($handler_labelCloseAppsMessage_Click) + + ## Listbox Close Applications + $listBoxCloseApps.DataBindings.DefaultDataSourceUpdateMode = 0 + $listboxCloseApps.Font = $defaultFont + $listBoxCloseApps.FormattingEnabled = $true + $listBoxCloseApps.HorizontalScrollbar = $true + $listBoxCloseApps.Name = 'listBoxCloseApps' + $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (420, 100) + $listBoxCloseApps.Size = $System_Drawing_Size + $listBoxCloseApps.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (15, 0, 15, 0) + $listBoxCloseApps.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $listBoxCloseApps.TabIndex = 3 + $ProcessDescriptions | ForEach-Object { $null = $listboxCloseApps.Items.Add($_) } + + ## Label Defer + $labelDefer.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelDefer.Font = $defaultFont + $labelDefer.Name = 'labelDefer' + $labelDefer.Size = $defaultControlSize + $labelDefer.MinimumSize = $defaultControlSize + $labelDefer.MaximumSize = $defaultControlSize + $labelDefer.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 0, 0, 5) + $labelDefer.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelDefer.TabStop = $false + $deferralText = "$configDeferPromptExpiryMessage`r`n" + + If ($deferTimes -ge 0) { + $deferralText = "$deferralText `r`n$configDeferPromptRemainingDeferrals $([Int32]$deferTimes + 1)" + } + If ($deferDeadline) { + $deferralText = "$deferralText `r`n$configDeferPromptDeadline $deferDeadline" + } + If (($deferTimes -lt 0) -and (-not $DeferDeadline)) { + $deferralText = "$deferralText `r`n$configDeferPromptNoDeadline" + } + $deferralText = "$deferralText `r`n`r`n$configDeferPromptWarningMessage" + $labelDefer.Text = $deferralText + $labelDefer.TextAlign = 'MiddleCenter' + $labelDefer.AutoSize = $true + $labelDefer.add_Click($handler_labelDefer_Click) + + ## Label CountdownMessage + $labelCountdownMessage.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelCountdownMessage.Name = 'labelCountdownMessage' + $labelCountdownMessage.Font = "$($defaultFont.Name), $($defaultFont.Size + 2), style=Regular" + $labelCountdownMessage.Size = $defaultControlSize + $labelCountdownMessage.MinimumSize = $defaultControlSize + $labelCountdownMessage.MaximumSize = $defaultControlSize + $labelCountdownMessage.Margin = $paddingNone + $labelCountdownMessage.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelCountdownMessage.TabStop = $false + If (($forceCountdown -eq $true) -or (-not $script:runningProcessDescriptions)) { + Switch ($deploymentType) { + 'Uninstall' { + $labelCountdownMessage.Text = ($configWelcomePromptCountdownMessage -f $configDeploymentTypeUninstall); Break + } + 'Repair' { + $labelCountdownMessage.Text = ($configWelcomePromptCountdownMessage -f $configDeploymentTypeRepair); Break + } + Default { + $labelCountdownMessage.Text = ($configWelcomePromptCountdownMessage -f $configDeploymentTypeInstall); Break + } + } + } + Else { + $labelCountdownMessage.Text = $configClosePromptCountdownMessage + } + $labelCountdownMessage.TextAlign = 'MiddleCenter' + $labelCountdownMessage.Anchor = 'Top' + $labelCountdownMessage.AutoSize = $true + $labelCountdownMessage.add_Click($handler_labelCountdownMessage_Click) + + ## Label Countdown + $labelCountdown.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelCountdown.Name = 'labelCountdown' + $labelCountdown.Font = "$($defaultFont.Name), $($defaultFont.Size + 9), style=Bold" + $labelCountdown.Size = $defaultControlSize + $labelCountdown.MinimumSize = $defaultControlSize + $labelCountdown.MaximumSize = $defaultControlSize + $labelCountdown.Margin = $paddingNone + $labelCountdown.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelCountdown.TabStop = $false + $labelCountdown.Text = '00:00:00' + $labelCountdown.TextAlign = 'MiddleCenter' + $labelCountdown.AutoSize = $true + $labelCountdown.add_Click($handler_labelDefer_Click) + + ## Panel Flow Layout + $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, $appDeployLogoBannerHeight) + $flowLayoutPanel.Location = $System_Drawing_Point + $flowLayoutPanel.MinimumSize = $DefaultControlSize + $flowLayoutPanel.MaximumSize = $DefaultControlSize + $flowLayoutPanel.Size = $DefaultControlSize + $flowLayoutPanel.Margin = $paddingNone + $flowLayoutPanel.Padding = $paddingNone + $flowLayoutPanel.AutoSizeMode = 'GrowAndShrink' + $flowLayoutPanel.AutoSize = $true + $flowLayoutPanel.Anchor = 'Top' + $flowLayoutPanel.FlowDirection = 'TopDown' + $flowLayoutPanel.WrapContents = $true + $flowLayoutPanel.Controls.Add($labelWelcomeMessage) + $flowLayoutPanel.Controls.Add($labelAppName) + + If ($CustomText -and $configWelcomePromptCustomMessage) { + $labelCustomMessage.Text = $configWelcomePromptCustomMessage + $flowLayoutPanel.Controls.Add($labelCustomMessage) + } + If ($showCloseApps) { + $flowLayoutPanel.Controls.Add($labelCloseAppsMessage) + $flowLayoutPanel.Controls.Add($listBoxCloseApps) + } + If ($showDefer) { + $flowLayoutPanel.Controls.Add($labelDefer) + } + If ($showCountdown) { + $flowLayoutPanel.Controls.Add($labelCountdownMessage) + $flowLayoutPanel.Controls.Add($labelCountdown) + } + + ## Button Close For Me + $buttonCloseApps.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonCloseApps.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (14, 4) + $buttonCloseApps.Font = $defaultFont + $buttonCloseApps.Name = 'buttonCloseApps' + $buttonCloseApps.Size = $buttonSize + $buttonCloseApps.MinimumSize = $buttonSize + $buttonCloseApps.MaximumSize = $buttonSize + $buttonCloseApps.TabIndex = 1 + $buttonCloseApps.Text = $configClosePromptButtonClose + $buttonCloseApps.DialogResult = 'Yes' + $buttonCloseApps.AutoSize = $true + $buttonCloseApps.Margin = $paddingNone + $buttonCloseApps.Padding = $paddingNone + $buttonCloseApps.UseVisualStyleBackColor = $true + $buttonCloseApps.add_Click($buttonCloseApps_OnClick) + + ## Button Defer + $buttonDefer.DataBindings.DefaultDataSourceUpdateMode = 0 + If (-not $showCloseApps) { + $buttonDefer.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (14, 4) + } + Else { + $buttonDefer.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (160, 4) + } + $buttonDefer.Name = 'buttonDefer' + $buttonDefer.Font = $defaultFont + $buttonDefer.Size = $buttonSize + $buttonDefer.MinimumSize = $buttonSize + $buttonDefer.MaximumSize = $buttonSize + $buttonDefer.TabIndex = 0 + $buttonDefer.Text = $configClosePromptButtonDefer + $buttonDefer.DialogResult = 'No' + $buttonDefer.AutoSize = $true + $buttonDefer.Margin = $paddingNone + $buttonDefer.Padding = $paddingNone + $buttonDefer.UseVisualStyleBackColor = $true + $buttonDefer.add_Click($buttonDefer_OnClick) + + ## Button Continue + $buttonContinue.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonContinue.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (306, 4) + $buttonContinue.Name = 'buttonContinue' + $buttonContinue.Font = $defaultFont + $buttonContinue.Size = $buttonSize + $buttonContinue.MinimumSize = $buttonSize + $buttonContinue.MaximumSize = $buttonSize + $buttonContinue.TabIndex = 2 + $buttonContinue.Text = $configClosePromptButtonContinue + $buttonContinue.DialogResult = 'OK' + $buttonContinue.AutoSize = $true + $buttonContinue.Margin = $paddingNone + $buttonContinue.Padding = $paddingNone + $buttonContinue.UseVisualStyleBackColor = $true + $buttonContinue.add_Click($buttonContinue_OnClick) + If ($showCloseApps) { + # Add tooltip to Continue button + $toolTip.BackColor = [Drawing.Color]::LightGoldenrodYellow + $toolTip.IsBalloon = $false + $toolTip.InitialDelay = 100 + $toolTip.ReshowDelay = 100 + $toolTip.SetToolTip($buttonContinue, $configClosePromptButtonContinueTooltip) + } + + ## Button Abort (Hidden) + $buttonAbort.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonAbort.Name = 'buttonAbort' + $buttonAbort.Font = $defaultFont + $buttonAbort.Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (0, 0) + $buttonAbort.MinimumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (0, 0) + $buttonAbort.MaximumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (0, 0) + $buttonAbort.BackColor = [System.Drawing.Color]::Transparent + $buttonAbort.ForeColor = [System.Drawing.Color]::Transparent + $buttonAbort.FlatAppearance.BorderSize = 0 + $buttonAbort.FlatAppearance.MouseDownBackColor = [System.Drawing.Color]::Transparent + $buttonAbort.FlatAppearance.MouseOverBackColor = [System.Drawing.Color]::Transparent + $buttonAbort.FlatStyle = [System.Windows.Forms.FlatStyle]::System + $buttonAbort.TabStop = $false + $buttonAbort.DialogResult = 'Abort' + $buttonAbort.Visible = $true # Has to be set visible so we can call Click on it + $buttonAbort.Margin = $paddingNone + $buttonAbort.Padding = $paddingNone + $buttonAbort.UseVisualStyleBackColor = $true + $buttonAbort.add_Click($buttonAbort_OnClick) + + ## Form Welcome + $formWelcome.Size = $defaultControlSize + $formWelcome.MinimumSize = $defaultControlSize + $formWelcome.Padding = $paddingNone + $formWelcome.Margin = $paddingNone + $formWelcome.DataBindings.DefaultDataSourceUpdateMode = 0 + $formWelcome.Name = 'WelcomeForm' + $formWelcome.Text = $installTitle + $formWelcome.StartPosition = 'CenterScreen' + # $formWelcome.FormBorderStyle = 'FixedDialog' + $formWelcome.MaximizeBox = $false + $formWelcome.MinimizeBox = $false + $formWelcome.TopMost = $TopMost + $formWelcome.TopLevel = $true + $formWelcome.Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList ($AppDeployLogoIcon) + $formWelcome.AutoSize = $true + $formWelcome.AutoScaleMode = 'Font' + $formWelcome.AutoScaleDimensions = New-Object System.Drawing.SizeF(6, 13) #Set as if using 96 DPI + $formWelcome.Controls.Add($pictureBanner) + $formWelcome.Controls.Add($buttonAbort) + ## Panel Button + $panelButtons.MinimumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.MaximumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.AutoSize = $true + $panelButtons.Padding = $paddingNone + $panelButtons.Margin = $paddingNone + If ($showCloseApps) { + $panelButtons.Controls.Add($buttonCloseApps) + } + If ($showDefer) { + $panelButtons.Controls.Add($buttonDefer) + } + $panelButtons.Controls.Add($buttonContinue) + + ## Add the Buttons Panel to the flowPanel + $flowLayoutPanel.Controls.Add($panelButtons) + ## Add FlowPanel to the form + $formWelcome.Controls.Add($flowLayoutPanel) + # Init the OnLoad event to correct the initial state of the form + $formWelcome.add_Load($Welcome_Form_StateCorrection_Load) + # Clean up the control events + $formWelcome.add_FormClosed($Welcome_Form_Cleanup_FormClosed) + + ## Minimize all other windows + If ($minimizeWindows) { + $null = $shellApp.MinimizeAll() + } + + ## Show the form + $result = $formWelcome.ShowDialog() + $formWelcome.Dispose() + + Switch ($result) { + OK { + $result = 'Continue' + } + No { + $result = 'Defer' + } + Yes { + $result = 'Close' + } + Abort { + $result = 'Timeout' + } + } + + If ($configInstallationWelcomePromptDynamicRunningProcessEvaluation) { + $timerRunningProcesses.Stop() + } + + Write-Output -InputObject ($result) + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Show-InstallationRestartPrompt +Function Show-InstallationRestartPrompt { + <# +.SYNOPSIS + +Displays a restart prompt with a countdown to a forced restart. + +.DESCRIPTION + +Displays a restart prompt with a countdown to a forced restart. + +.PARAMETER CountdownSeconds + +Specifies the number of seconds to countdown before the system restart. Default: 60 + +.PARAMETER CountdownNoHideSeconds + +Specifies the number of seconds to display the restart prompt without allowing the window to be hidden. Default: 30 + +.PARAMETER NoSilentRestart + +Specifies whether the restart should be triggered when Deploy mode is silent or very silent. Default: $true + +.PARAMETER NoCountdown + +Specifies not to show a countdown. + +The UI will restore/reposition itself persistently based on the interval value specified in the config file. + +.PARAMETER SilentCountdownSeconds + +Specifies number of seconds to countdown for the restart when the toolkit is running in silent mode and NoSilentRestart is $false. Default: 5 + +.PARAMETER TopMost + +Specifies whether the windows is the topmost window. Default: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the version of the specified file. + +.EXAMPLE + +Show-InstallationRestartPrompt -Countdownseconds 600 -CountdownNoHideSeconds 60 + +.EXAMPLE + +Show-InstallationRestartPrompt -NoCountdown + +.EXAMPLE + +Show-InstallationRestartPrompt -Countdownseconds 300 -NoSilentRestart $false -SilentCountdownSeconds 10 + +.NOTES + +Be mindful of the countdown you specify for the reboot as code directly after this function might NOT be able to execute - that includes logging. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$CountdownSeconds = 60, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$CountdownNoHideSeconds = 30, + [Parameter(Mandatory = $false)] + [Boolean]$NoSilentRestart = $true, + [Parameter(Mandatory = $false)] + [Switch]$NoCountdown = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$SilentCountdownSeconds = 5, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$TopMost = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## If in non-interactive mode + If ($deployModeSilent) { + If ($NoSilentRestart -eq $false) { + Write-Log -Message "Triggering restart silently, because the deploy mode is set to [$deployMode] and [NoSilentRestart] is disabled. Timeout is set to [$SilentCountdownSeconds] seconds." -Source ${CmdletName} + Start-Process -FilePath "$PSHOME\powershell.exe" -ArgumentList "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -Command `"& { Start-Sleep -Seconds $SilentCountdownSeconds; Restart-Computer -Force; }`"" -WindowStyle 'Hidden' -ErrorAction 'SilentlyContinue' + } + Else { + Write-Log -Message "Skipping restart, because the deploy mode is set to [$deployMode] and [NoSilentRestart] is enabled." -Source ${CmdletName} + } + Return + } + ## Get the parameters passed to the function for invoking the function asynchronously + [Hashtable]$installRestartPromptParameters = $PSBoundParameters + + ## Check if we are already displaying a restart prompt + If (Get-Process | Where-Object { $_.MainWindowTitle -match $configRestartPromptTitle }) { + Write-Log -Message "${CmdletName} was invoked, but an existing restart prompt was detected. Cancelling restart prompt." -Severity 2 -Source ${CmdletName} + Return + } + + ## If the script has been dot-source invoked by the deploy app script, display the restart prompt asynchronously + If ($deployAppScriptFriendlyName) { + If ($NoCountdown) { + Write-Log -Message "Invoking ${CmdletName} asynchronously with no countdown..." -Source ${CmdletName} + } + Else { + Write-Log -Message "Invoking ${CmdletName} asynchronously with a [$countDownSeconds] second countdown..." -Source ${CmdletName} + } + ## Remove Silent reboot parameters from the list that is being forwarded to the main script for asynchronous function execution. This is only for Interactive mode so we dont need silent mode reboot parameters. + $installRestartPromptParameters.Remove('NoSilentRestart') + $installRestartPromptParameters.Remove('SilentCountdownSeconds') + ## Prepare a list of parameters of this function as a string + [String]$installRestartPromptParameters = ($installRestartPromptParameters.GetEnumerator() | ForEach-Object { & $ResolveParameters $_ }) -join ' ' + ## Start another powershell instance silently with function parameters from this function + Start-Process -FilePath "$PSHOME\powershell.exe" -ArgumentList "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -Command & {& `'$scriptPath`' -ReferredInstallTitle `'$installTitle`' -ReferredInstallName `'$installName`' -ReferredLogName `'$logName`' -ShowInstallationRestartPrompt $installRestartPromptParameters -AsyncToolkitLaunch}" -WindowStyle 'Hidden' -ErrorAction 'SilentlyContinue' + Return + } + + [DateTime]$startTime = Get-Date + [DateTime]$countdownTime = $startTime + + [Windows.Forms.Application]::EnableVisualStyles() + $formRestart = New-Object -TypeName 'System.Windows.Forms.Form' + $labelCountdown = New-Object -TypeName 'System.Windows.Forms.Label' + $labelTimeRemaining = New-Object -TypeName 'System.Windows.Forms.Label' + $labelMessage = New-Object -TypeName 'System.Windows.Forms.Label' + $buttonRestartLater = New-Object -TypeName 'System.Windows.Forms.Button' + $pictureBanner = New-Object -TypeName 'System.Windows.Forms.PictureBox' + $buttonRestartNow = New-Object -TypeName 'System.Windows.Forms.Button' + $timerCountdown = New-Object -TypeName 'System.Windows.Forms.Timer' + $flowLayoutPanel = New-Object -TypeName 'System.Windows.Forms.FlowLayoutPanel' + $panelButtons = New-Object -TypeName 'System.Windows.Forms.Panel' + + [ScriptBlock]$RestartComputer = { + Write-Log -Message 'Forcefully restarting the computer...' -Source ${CmdletName} + Restart-Computer -Force + } + + [ScriptBlock]$Restart_Form_StateCorrection_Load = { + # Disable the X button + Try { + $windowHandle = $formRestart.Handle + If ($windowHandle -and ($windowHandle -ne [IntPtr]::Zero)) { + $menuHandle = [PSADT.UiAutomation]::GetSystemMenu($windowHandle, $false) + If ($menuHandle -and ($menuHandle -ne [IntPtr]::Zero)) { + [PSADT.UiAutomation]::EnableMenuItem($menuHandle, 0xF060, 0x00000001) + [PSADT.UiAutomation]::DestroyMenu($menuHandle) + } + } + } + Catch { + # Not a terminating error if we can't disable the button. Just disable the Control Box instead + Write-Log 'Failed to disable the Close button. Disabling the Control Box instead.' -Severity 2 -Source ${CmdletName} + $formRestart.ControlBox = $false + } + ## Initialize the countdown timer + [DateTime]$currentTime = Get-Date + [DateTime]$countdownTime = $startTime.AddSeconds($countdownSeconds) + $timerCountdown.Start() + ## Set up the form + [Timespan]$remainingTime = $countdownTime.Subtract($currentTime) + $labelCountdown.Text = [String]::Format('{0}:{1:d2}:{2:d2}', $remainingTime.Days * 24 + $remainingTime.Hours, $remainingTime.Minutes, $remainingTime.Seconds) + If ($remainingTime.TotalSeconds -le $countdownNoHideSeconds) { + $buttonRestartLater.Enabled = $false + } + $formRestart.WindowState = 'Normal' + $formRestart.AutoSize = $true + $formRestart.AutoScaleMode = 'Font' + $formRestart.AutoScaleDimensions = New-Object System.Drawing.SizeF(6, 13) #Set as if using 96 DPI + $formRestart.TopMost = $TopMost + $formRestart.BringToFront() + ## Get the start position of the form so we can return the form to this position if PersistPrompt is enabled + Set-Variable -Name 'formInstallationRestartPromptStartPosition' -Value $formRestart.Location -Scope 'Script' + } + + ## Persistence Timer + If ($NoCountdown) { + $restartTimerPersist = New-Object -TypeName 'System.Windows.Forms.Timer' + $restartTimerPersist.Interval = ($configInstallationRestartPersistInterval * 1000) + [ScriptBlock]$restartTimerPersist_Tick = { + # Show the Restart Popup + $formRestart.WindowState = 'Normal' + $formRestart.TopMost = $TopMost + $formRestart.BringToFront() + $formRestart.Location = "$($formInstallationRestartPromptStartPosition.X),$($formInstallationRestartPromptStartPosition.Y)" + } + $restartTimerPersist.add_Tick($restartTimerPersist_Tick) + $restartTimerPersist.Start() + } + + [ScriptBlock]$buttonRestartLater_Click = { + ## Minimize the form + $formRestart.WindowState = 'Minimized' + If ($NoCountdown) { + ## Reset the persistence timer + $restartTimerPersist.Stop() + $restartTimerPersist.Start() + } + } + + ## Restart the computer + [ScriptBlock]$buttonRestartNow_Click = { & $RestartComputer } + + ## Hide the form if minimized + [ScriptBlock]$formRestart_Resize = { If ($formRestart.WindowState -eq 'Minimized') { + $formRestart.WindowState = 'Minimized' + } } + + [ScriptBlock]$timerCountdown_Tick = { + ## Get the time information + [DateTime]$currentTime = Get-Date + [DateTime]$countdownTime = $startTime.AddSeconds($countdownSeconds) + [Timespan]$remainingTime = $countdownTime.Subtract($currentTime) + ## If the countdown is complete, restart the machine + If ($countdownTime -le $currentTime) { + $buttonRestartNow.PerformClick() + } + Else { + ## Update the form + $labelCountdown.Text = [String]::Format('{0}:{1:d2}:{2:d2}', $remainingTime.Days * 24 + $remainingTime.Hours, $remainingTime.Minutes, $remainingTime.Seconds) + If ($remainingTime.TotalSeconds -le $countdownNoHideSeconds) { + $buttonRestartLater.Enabled = $false + # If the form is hidden when we hit the "No Hide", bring it back up + If ($formRestart.WindowState -eq 'Minimized') { + # Show Popup + $formRestart.WindowState = 'Normal' + $formRestart.TopMost = $TopMost + $formRestart.BringToFront() + $formRestart.Location = "$($formInstallationRestartPromptStartPosition.X),$($formInstallationRestartPromptStartPosition.Y)" + } + } + } + } + + ## Remove all event handlers from the controls + [ScriptBlock]$Restart_Form_Cleanup_FormClosed = { + Try { + $buttonRestartLater.remove_Click($buttonRestartLater_Click) + $buttonRestartNow.remove_Click($buttonRestartNow_Click) + $formRestart.remove_Load($Restart_Form_StateCorrection_Load) + $formRestart.remove_Resize($formRestart_Resize) + $timerCountdown.remove_Tick($timerCountdown_Tick) + $restartTimerPersist.remove_Tick($restartTimerPersist_Tick) + $formRestart.remove_FormClosed($Restart_Form_Cleanup_FormClosed) + } + Catch { + } + } + + ## Form + ##---------------------------------------------- + ## Create zero px padding object + $paddingNone = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 0, 0, 0) + ## Create basic control size + $defaultControlSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 0) + + ## Generic Button properties + $buttonSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (195, 24) + + ## Picture Banner + $pictureBanner.DataBindings.DefaultDataSourceUpdateMode = 0 + $pictureBanner.ImageLocation = $appDeployLogoBanner + $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, 0) + $pictureBanner.Location = $System_Drawing_Point + $pictureBanner.Name = 'pictureBanner' + $System_Drawing_Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, $appDeployLogoBannerHeight) + $pictureBanner.Size = $System_Drawing_Size + $pictureBanner.SizeMode = 'CenterImage' + $pictureBanner.Margin = $paddingNone + $pictureBanner.TabStop = $false + + ## Label Message + $labelMessage.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelMessage.Font = $defaultFont + $labelMessage.Name = 'labelMessage' + $labelMessage.Size = $defaultControlSize + $labelMessage.MinimumSize = $defaultControlSize + $labelMessage.MaximumSize = $defaultControlSize + $labelMessage.Margin = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (0, 10, 0, 5) + $labelMessage.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelMessage.Text = "$configRestartPromptMessage $configRestartPromptMessageTime `r`n`r`n$configRestartPromptMessageRestart" + If ($NoCountdown) { + $labelMessage.Text = $configRestartPromptMessage + } + $labelMessage.TextAlign = 'MiddleCenter' + $labelMessage.Anchor = 'Top' + $labelMessage.TabStop = $false + $labelMessage.AutoSize = $true + + ## Label Time remaining message + $labelTimeRemaining.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelTimeRemaining.Font = "$($defaultFont.Name), $($defaultFont.Size + 2), style=Regular" + $labelTimeRemaining.Name = 'labelTimeRemaining' + $labelTimeRemaining.Size = $defaultControlSize + $labelTimeRemaining.MinimumSize = $defaultControlSize + $labelTimeRemaining.MaximumSize = $defaultControlSize + $labelTimeRemaining.Margin = $paddingNone + $labelTimeRemaining.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelTimeRemaining.TabStop = $false + $labelTimeRemaining.Text = $configRestartPromptTimeRemaining + $labelTimeRemaining.TextAlign = 'MiddleCenter' + $labelTimeRemaining.Anchor = 'Top' + $labelTimeRemaining.AutoSize = $true + + ## Label Countdown + $labelCountdown.DataBindings.DefaultDataSourceUpdateMode = 0 + $labelCountdown.Font = "$($defaultFont.Name), $($defaultFont.Size + 9), style=Bold" + $labelCountdown.Name = 'labelCountdown' + $labelCountdown.Size = $defaultControlSize + $labelCountdown.MinimumSize = $defaultControlSize + $labelCountdown.MaximumSize = $defaultControlSize + $labelCountdown.Margin = $paddingNone + $labelCountdown.Padding = New-Object -TypeName 'System.Windows.Forms.Padding' -ArgumentList (10, 0, 10, 0) + $labelCountdown.TabStop = $false + $labelCountdown.Text = '00:00:00' + $labelCountdown.TextAlign = 'MiddleCenter' + $labelCountdown.AutoSize = $true + + ## Panel Flow Layout + $System_Drawing_Point = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (0, $appDeployLogoBannerHeight) + $flowLayoutPanel.Location = $System_Drawing_Point + $flowLayoutPanel.MinimumSize = $DefaultControlSize + $flowLayoutPanel.MaximumSize = $DefaultControlSize + $flowLayoutPanel.Size = $DefaultControlSize + $flowLayoutPanel.Margin = $paddingNone + $flowLayoutPanel.Padding = $paddingNone + $flowLayoutPanel.AutoSizeMode = 'GrowAndShrink' + $flowLayoutPanel.AutoSize = $true + $flowLayoutPanel.Anchor = 'Top' + $flowLayoutPanel.FlowDirection = 'TopDown' + $flowLayoutPanel.WrapContents = $true + $flowLayoutPanel.Controls.Add($labelMessage) + If (-not $NoCountdown) { + $flowLayoutPanel.Controls.Add($labelTimeRemaining) + $flowLayoutPanel.Controls.Add($labelCountdown) + } + + ## Button Minimize + $buttonRestartLater.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonRestartLater.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (240, 4) + $buttonRestartLater.Name = 'buttonRestartLater' + $buttonRestartLater.Font = $defaultFont + $buttonRestartLater.Size = $buttonSize + $buttonRestartLater.MinimumSize = $buttonSize + $buttonRestartLater.MaximumSize = $buttonSize + $buttonRestartLater.TabIndex = 0 + $buttonRestartLater.Text = $configRestartPromptButtonRestartLater + $buttonRestartLater.AutoSize = $true + $buttonRestartLater.Margin = $paddingNone + $buttonRestartLater.Padding = $paddingNone + $buttonRestartLater.UseVisualStyleBackColor = $true + $buttonRestartLater.add_Click($buttonRestartLater_Click) + + ## Button Restart Now + $buttonRestartNow.DataBindings.DefaultDataSourceUpdateMode = 0 + $buttonRestartNow.Location = New-Object -TypeName 'System.Drawing.Point' -ArgumentList (14, 4) + $buttonRestartNow.Name = 'buttonRestartNow' + $buttonRestartNow.Font = $defaultFont + $buttonRestartNow.Size = $buttonSize + $buttonRestartNow.MinimumSize = $buttonSize + $buttonRestartNow.MaximumSize = $buttonSize + $buttonRestartNow.TabIndex = 1 + $buttonRestartNow.Text = $configRestartPromptButtonRestartNow + $buttonRestartNow.Margin = $paddingNone + $buttonRestartNow.Padding = $paddingNone + $buttonRestartNow.UseVisualStyleBackColor = $true + $buttonRestartNow.add_Click($buttonRestartNow_Click) + + ## Form Restart + $formRestart.Size = $defaultControlSize + $formRestart.MinimumSize = $defaultControlSize + $formRestart.Padding = $paddingNone + $formRestart.Margin = $paddingNone + $formRestart.DataBindings.DefaultDataSourceUpdateMode = 0 + $formRestart.Name = 'formRestart' + $formRestart.Text = $installTitle + $formRestart.StartPosition = 'CenterScreen' + # $formRestart.FormBorderStyle = 'FixedDialog' + $formRestart.MaximizeBox = $false + $formRestart.MinimizeBox = $false + $formRestart.TopMost = $TopMost + $formRestart.TopLevel = $true + $formRestart.Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList ($AppDeployLogoIcon) + $formRestart.AutoSize = $true + $formRestart.AutoScaleMode = 'Font' + $formRestart.AutoScaleDimensions = New-Object System.Drawing.SizeF(6, 13) #Set as if using 96 DPI + $formRestart.ControlBox = $true + $formRestart.Controls.Add($pictureBanner) + + ## Button Panel + $panelButtons.MinimumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.Size = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.MaximumSize = New-Object -TypeName 'System.Drawing.Size' -ArgumentList (450, 39) + $panelButtons.AutoSize = $true + $panelButtons.Padding = $paddingNone + $panelButtons.Margin = $paddingNone + $panelButtons.Controls.Add($buttonRestartNow) + $panelButtons.Controls.Add($buttonRestartLater) + ## Add the Buttons Panel to the flowPanel + $flowLayoutPanel.Controls.Add($panelButtons) + ## Add FlowPanel to the form + $formRestart.Controls.Add($flowLayoutPanel) + $formRestart.add_Resize($formRestart_Resize) + ## Timer Countdown + If (-not $NoCountdown) { + $timerCountdown.add_Tick($timerCountdown_Tick) + } + ##---------------------------------------------- + # Init the OnLoad event to correct the initial state of the form + $formRestart.add_Load($Restart_Form_StateCorrection_Load) + # Clean up the control events + $formRestart.add_FormClosed($Restart_Form_Cleanup_FormClosed) + $formRestartClosing = [Windows.Forms.FormClosingEventHandler] { If ($_.CloseReason -eq 'UserClosing') { + $_.Cancel = $true + } } + $formRestart.add_FormClosing($formRestartClosing) + + If ($NoCountdown) { + Write-Log -Message 'Displaying restart prompt with no countdown.' -Source ${CmdletName} + } + Else { + Write-Log -Message "Displaying restart prompt with a [$countDownSeconds] second countdown." -Source ${CmdletName} + } + + # Show the Form + Write-Output -InputObject ($formRestart.ShowDialog()) + $formRestart.Dispose() + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Show-BalloonTip +Function Show-BalloonTip { + <# +.SYNOPSIS + +Displays a balloon tip notification in the system tray. + +.DESCRIPTION + +Displays a balloon tip notification in the system tray. + +.PARAMETER BalloonTipText + +Text of the balloon tip. + +.PARAMETER BalloonTipTitle + +Title of the balloon tip. + +.PARAMETER BalloonTipIcon + +Icon to be used. Options: 'Error', 'Info', 'None', 'Warning'. Default is: Info. + +.PARAMETER BalloonTipTime + +Time in milliseconds to display the balloon tip. Default: 10000. + +.PARAMETER NoWait + +Create the balloontip asynchronously. Default: $false + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the version of the specified file. + +.EXAMPLE + +Show-BalloonTip -BalloonTipText 'Installation Started' -BalloonTipTitle 'Application Name' + +.EXAMPLE + +Show-BalloonTip -BalloonTipIcon 'Info' -BalloonTipText 'Installation Started' -BalloonTipTitle 'Application Name' -BalloonTipTime 1000 + +.NOTES + +For Windows 10 OS and above a Toast notification is displayed in place of a balloon tip if toast notifications are enabled in the XML config file. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNullOrEmpty()] + [String]$BalloonTipText, + [Parameter(Mandatory = $false, Position = 1)] + [ValidateNotNullorEmpty()] + [String]$BalloonTipTitle = $installTitle, + [Parameter(Mandatory = $false, Position = 2)] + [ValidateSet('Error', 'Info', 'None', 'Warning')] + [Windows.Forms.ToolTipIcon]$BalloonTipIcon = 'Info', + [Parameter(Mandatory = $false, Position = 3)] + [ValidateNotNullorEmpty()] + [Int32]$BalloonTipTime = 10000, + [Parameter(Mandatory = $false, Position = 4)] + [Switch]$NoWait = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + ## Skip balloon if in silent mode, disabled in the config or presentation is detected + $presentationDetected = Test-PowerPoint + If (($deployModeSilent) -or (-not $configShowBalloonNotifications) -or $presentationDetected) { + Write-Log -Message "Bypassing Show-BalloonTip [Mode:$deployMode, Config Show Balloon Notifications:$configShowBalloonNotifications, Presentation Detected:$presentationDetected]. BalloonTipText:$BalloonTipText" -Source ${CmdletName} + Return + } + ## Dispose of previous balloon + If ($script:notifyIcon) { + Try { + $script:notifyIcon.Dispose() + } + Catch { + } + } + + If (($envOSVersionMajor -lt 10) -or ($configToastDisable -eq $true)) { + ## NoWait - Create the balloontip icon asynchronously + If ($NoWait) { + Write-Log -Message "Displaying balloon tip notification asynchronously with message [$BalloonTipText]." -Source ${CmdletName} + ## Create a script block to display the balloon notification in a new PowerShell process so that we can wait to cleanly dispose of the balloon tip without having to make the deployment script wait + ## Scriptblock text has to be as short as possible because it is passed as a parameter to powershell + ## Don't strongly type parameter BalloonTipIcon as System.Drawing assembly not loaded yet in asynchronous scriptblock so will throw error + [ScriptBlock]$notifyIconScriptBlock = { + Param( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNullOrEmpty()] + [String]$BalloonTipText, + [Parameter(Mandatory = $false, Position = 1)] + [ValidateNotNullorEmpty()] + [String]$BalloonTipTitle, + [Parameter(Mandatory = $false, Position = 2)] + [ValidateSet('Error', 'Info', 'None', 'Warning')] + $BalloonTipIcon = 'Info', + [Parameter(Mandatory = $false, Position = 3)] + [ValidateNotNullorEmpty()] + [Int32]$BalloonTipTime, + [Parameter(Mandatory = $false, Position = 4)] + [ValidateNotNullorEmpty()] + [String]$AppDeployLogoIcon + ) + Add-Type -AssemblyName 'System.Windows.Forms', 'System.Drawing' -ErrorAction 'Stop' + $BalloonTipIconText = [String]::Concat($BalloonTipTitle, ' - ', $BalloonTipText) + If ($BalloonTipIconText.Length -gt 63) { + $BalloonTipIconText = [String]::Concat($BalloonTipIconText.Substring(0, 60), '...') + } + [Windows.Forms.ToolTipIcon]$BalloonTipIcon = $BalloonTipIcon + $script:notifyIcon = New-Object -TypeName 'System.Windows.Forms.NotifyIcon' -Property @{ + BalloonTipIcon = $BalloonTipIcon + BalloonTipText = $BalloonTipText + BalloonTipTitle = $BalloonTipTitle + Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList ($AppDeployLogoIcon) + Text = $BalloonTipIconText + Visible = $true + } + + $script:notifyIcon.ShowBalloonTip($BalloonTipTime) + Start-Sleep -Milliseconds ($BalloonTipTime) + $script:notifyIcon.Dispose() } + + ## Invoke a separate PowerShell process passing the script block as a command and associated parameters to display the balloon tip notification asynchronously + Try { + Execute-Process -Path "$PSHOME\powershell.exe" -Parameters "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -Command & {$notifyIconScriptBlock} `'$BalloonTipText`' `'$BalloonTipTitle`' `'$BalloonTipIcon`' `'$BalloonTipTime`' `'$AppDeployLogoIcon`'" -NoWait -WindowStyle 'Hidden' -CreateNoWindow + } + Catch { + } + } + ## Otherwise create the balloontip icon synchronously + Else { + Write-Log -Message "Displaying balloon tip notification with message [$BalloonTipText]." -Source ${CmdletName} + ## Prepare Text - Cut it if longer than 63 chars + $BalloonTipIconText = [String]::Concat($BalloonTipTitle, ' - ', $BalloonTipText) + If ($BalloonTipIconText.Length -gt 63) { + $BalloonTipIconText = [String]::Concat($BalloonTipIconText.Substring(0, 60), '...') + } + ## Create the BalloonTip + [Windows.Forms.ToolTipIcon]$BalloonTipIcon = $BalloonTipIcon + $script:notifyIcon = New-Object -TypeName 'System.Windows.Forms.NotifyIcon' -Property @{ + BalloonTipIcon = $BalloonTipIcon + BalloonTipText = $BalloonTipText + BalloonTipTitle = $BalloonTipTitle + Icon = New-Object -TypeName 'System.Drawing.Icon' -ArgumentList ($AppDeployLogoIcon) + Text = $BalloonTipIconText + Visible = $true + } + ## Display the balloon tip notification + $script:notifyIcon.ShowBalloonTip($BalloonTipTime) + } + } + # Otherwise use toast notification + Else { + $toastAppID = $appDeployToolkitName + $toastAppDisplayName = $configToastAppName + + [scriptblock]$toastScriptBlock = { + Param( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNullOrEmpty()] + [String]$BalloonTipText, + [Parameter(Mandatory = $false, Position = 1)] + [ValidateNotNullorEmpty()] + [String]$BalloonTipTitle, + [Parameter(Mandatory = $false, Position = 2)] + [ValidateNotNullorEmpty()] + [String]$AppDeployLogoImage, + [Parameter(Mandatory = $false, Position = 3)] + [ValidateNotNullorEmpty()] + [String]$toastAppID, + [Parameter(Mandatory = $false, Position = 4)] + [ValidateNotNullorEmpty()] + [String]$toastAppDisplayName + ) + + # Check for required entries in registry for when using Powershell as application for the toast + # Register the AppID in the registry for use with the Action Center, if required + $regPathToastNotificationSettings = 'Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Notifications\Settings' + $regPathToastApp = 'Registry::HKEY_CURRENT_USER\Software\Classes\AppUserModelId' + + # Create the registry entries + $null = New-Item -Path "$regPathToastNotificationSettings\$toastAppId" -Force + # Make sure the app used with the action center is enabled + $null = New-ItemProperty -Path "$regPathToastNotificationSettings\$toastAppId" -Name 'ShowInActionCenter' -Value 1 -PropertyType 'DWORD' -Force + $null = New-ItemProperty -Path "$regPathToastNotificationSettings\$toastAppId" -Name 'Enabled' -Value 1 -PropertyType 'DWORD' -Force + $null = New-ItemProperty -Path "$regPathToastNotificationSettings\$toastAppId" -Name 'SoundFile' -PropertyType 'STRING' -Force + + # Create the registry entries + $null = New-Item -Path "$regPathToastApp\$toastAppId" -Force + $null = New-ItemProperty -Path "$regPathToastApp\$toastAppId" -Name 'DisplayName' -Value "$($toastAppDisplayName)" -PropertyType 'STRING' -Force + $null = New-ItemProperty -Path "$regPathToastApp\$toastAppId" -Name 'ShowInSettings' -Value 0 -PropertyType 'DWORD' -Force + $null = New-ItemProperty -Path "$regPathToastApp\$toastAppId" -Name 'IconUri' -Value $appDeployLogoImage -PropertyType 'ExpandString' -Force + $null = New-ItemProperty -Path "$regPathToastApp\$toastAppId" -Name 'IconBackgroundColor' -Value 0 -PropertyType 'ExpandString' -Force + + [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null + [Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null + + ## Gets the Template XML so we can manipulate the values + $Template = [Windows.UI.Notifications.ToastTemplateType]::ToastImageAndText01 + [xml] $ToastTemplate = ([Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent($Template).GetXml()) + [xml] $ToastTemplate = @" + + + + $BalloonTipTitle + $BalloonTipText + + + + +"@ + + $ToastXml = New-Object -TypeName Windows.Data.Xml.Dom.XmlDocument + $ToastXml.LoadXml($ToastTemplate.OuterXml) + + $notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($toastAppId) + $notifier.Show($toastXml) + + } + + If ($ProcessNTAccount -eq $runAsActiveUser.NTAccount) { + Write-Log -Message "Displaying toast notification with message [$BalloonTipText]." -Source ${CmdletName} + Invoke-Command -ScriptBlock $toastScriptBlock -ArgumentList $BalloonTipText, $BalloonTipTitle, $AppDeployLogoImage, $toastAppID, $toastAppDisplayName + } + Else { + ## Invoke a separate PowerShell process as the current user passing the script block as a command and associated parameters to display the toast notification in the user context + Try { + Write-Log -Message "Displaying toast notification with message [$BalloonTipText] using Execute-ProcessAsUser." -Source ${CmdletName} + $executeToastAsUserScript = "$loggedOnUserTempPath" + "$($appDeployToolkitName)-ToastNotification.ps1" + Set-Content -Path $executeToastAsUserScript -Value $toastScriptBlock -Force + Execute-ProcessAsUser -Path "$PSHOME\powershell.exe" -Parameters "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -Command & { & `"`'$executeToastAsUserScript`' `'$BalloonTipText`' `'$BalloonTipTitle`' `'$AppDeployLogoImage`' `'$toastAppID`' `'$toastAppDisplayName`'`"; Exit `$LastExitCode }" -TempPath $loggedOnUserTempPath -Wait -RunLevel 'LeastPrivilege' + } + Catch { + } + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Show-InstallationProgress +Function Show-InstallationProgress { + <# +.SYNOPSIS + +Displays a progress dialog in a separate thread with an updateable custom message. + +.DESCRIPTION + +Create a WPF window in a separate thread to display a marquee style progress ellipse with a custom message that can be updated. + +The status message supports line breaks. + +The first time this function is called in a script, it will display a balloon tip notification to indicate that the installation has started (provided balloon tips are enabled in the configuration). + +.PARAMETER StatusMessage + +The status message to be displayed. The default status message is taken from the XML configuration file. + +.PARAMETER WindowLocation + +The location of the progress window. Default: center of the screen. + +.PARAMETER TopMost + +Specifies whether the progress window should be topmost. Default: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Show-InstallationProgress + +Uses the default status message from the XML configuration file. + +.EXAMPLE + +Show-InstallationProgress -StatusMessage 'Installation in Progress...' + +.EXAMPLE + +Show-InstallationProgress -StatusMessage "Installation in Progress...`r`nThe installation may take 20 minutes to complete." + +.EXAMPLE + +Show-InstallationProgress -StatusMessage 'Installation in Progress...' -WindowLocation 'BottomRight' -TopMost $false + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$StatusMessage = $configProgressMessageInstall, + [Parameter(Mandatory = $false)] + [ValidateSet('Default', 'BottomRight', 'TopCenter')] + [String]$WindowLocation = 'Default', + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$TopMost = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + If ($deployModeSilent) { + Write-Log -Message "Bypassing Show-InstallationProgress [Mode: $deployMode]. Status message:$StatusMessage" -Source ${CmdletName} + Return + } + + ## If the default progress message hasn't been overridden and the deployment type is uninstall, use the default uninstallation message + If ($StatusMessage -eq $configProgressMessageInstall) { + If ($deploymentType -eq 'Uninstall') { + $StatusMessage = $configProgressMessageUninstall + } + ElseIf ($deploymentType -eq 'Repair') { + $StatusMessage = $configProgressMessageRepair + } + } + + If ($envHost.Name -match 'PowerGUI') { + Write-Log -Message "$($envHost.Name) is not a supported host for WPF multi-threading. Progress dialog with message [$statusMessage] will not be displayed." -Severity 2 -Source ${CmdletName} + Return + } + + ## Check if the progress thread is running before invoking methods on it + If ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -ne 'Running') { + # Notify user that the software installation has started + $balloonText = "$deploymentTypeName $configBalloonTextStart" + Show-BalloonTip -BalloonTipIcon 'Info' -BalloonTipText $balloonText + # Create a synchronized hashtable to share objects between runspaces + $script:ProgressSyncHash = [Hashtable]::Synchronized(@{ }) + # Create a new runspace for the progress bar + $script:ProgressRunspace = [runspacefactory]::CreateRunspace() + $script:ProgressRunspace.ApartmentState = 'STA' + $script:ProgressRunspace.ThreadOptions = 'ReuseThread' + $script:ProgressRunspace.Open() + # Add the sync hash to the runspace + $script:ProgressRunspace.SessionStateProxy.SetVariable('progressSyncHash', $script:ProgressSyncHash) + # Add other variables from the parent thread required in the progress runspace + $script:ProgressRunspace.SessionStateProxy.SetVariable('installTitle', $installTitle) + $script:ProgressRunspace.SessionStateProxy.SetVariable('windowLocation', $windowLocation) + $script:ProgressRunspace.SessionStateProxy.SetVariable('topMost', $topMost.ToString()) + $script:ProgressRunspace.SessionStateProxy.SetVariable('appDeployLogoBanner', $appDeployLogoBanner) + $script:ProgressRunspace.SessionStateProxy.SetVariable('ProgressStatusMessage', $statusMessage) + $script:ProgressRunspace.SessionStateProxy.SetVariable('AppDeployLogoIcon', $AppDeployLogoIcon) + + # Add the script block to be executed in the progress runspace + $progressCmd = [PowerShell]::Create().AddScript({ + [String]$xamlProgressString = @' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +'@ + [Xml.XmlDocument]$xamlProgress = New-Object -TypeName 'System.Xml.XmlDocument' + $xamlProgress.LoadXml($xamlProgressString) + ## Set the configurable values using variables added to the runspace from the parent thread + $xamlProgress.Window.TopMost = $topMost + $xamlProgress.Window.Icon = $AppDeployLogoIcon + $xamlProgress.Window.Grid.Image.Source = $appDeployLogoBanner + $xamlProgress.Window.Grid.TextBlock.Text = $ProgressStatusMessage + $xamlProgress.Window.Title = $installTitle + # Parse the XAML + $progressReader = New-Object -TypeName 'System.Xml.XmlNodeReader' -ArgumentList ($xamlProgress) + $script:ProgressSyncHash.Window = [Windows.Markup.XamlReader]::Load($progressReader) + # Grey out the X button + $script:ProgressSyncHash.Window.add_Loaded({ + # Calculate the position on the screen where the progress dialog should be placed + [Int32]$screenWidth = [System.Windows.SystemParameters]::WorkArea.Width + [Int32]$screenHeight = [System.Windows.SystemParameters]::WorkArea.Height + [Int32]$script:screenCenterWidth = $screenWidth - $script:ProgressSyncHash.Window.ActualWidth + [Int32]$script:screenCenterHeight = $screenHeight - $script:ProgressSyncHash.Window.ActualHeight + # Set the start position of the Window based on the screen size + If ($windowLocation -eq 'BottomRight') { + $script:ProgressSyncHash.Window.Left = [Double]($screenCenterWidth) + $script:ProgressSyncHash.Window.Top = [Double]($screenCenterHeight - 100) #-100 Needed to not overlap system tray Toasts + } + ElseIf ($windowLocation -eq 'TopCenter') { + $script:ProgressSyncHash.Window.Left = [Double]($screenCenterWidth / 2) + $script:ProgressSyncHash.Window.Top = [Double]($screenCenterHeight / 6) + } + Else { + # Center the progress window by calculating the center of the workable screen based on the width of the screen minus half the width of the progress bar + $script:ProgressSyncHash.Window.Left = [Double]($screenCenterWidth / 2) + $script:ProgressSyncHash.Window.Top = [Double]($screenCenterHeight / 2) + } + # Disable the X button + Try { + $windowHandle = (New-Object -TypeName System.Windows.Interop.WindowInteropHelper -ArgumentList ($this)).Handle + If ($windowHandle -and ($windowHandle -ne [IntPtr]::Zero)) { + $menuHandle = [PSADT.UiAutomation]::GetSystemMenu($windowHandle, $false) + If ($menuHandle -and ($menuHandle -ne [IntPtr]::Zero)) { + [PSADT.UiAutomation]::EnableMenuItem($menuHandle, 0xF060, 0x00000001) + [PSADT.UiAutomation]::DestroyMenu($menuHandle) + } + } + } + Catch { + # Not a terminating error if we can't disable the close button + Write-Log 'Failed to disable the Close button.' -Severity 2 -Source ${CmdletName} + } + }) + # Prepare the ProgressText variable so we can use it to change the text in the text area + $script:ProgressSyncHash.ProgressText = $script:ProgressSyncHash.Window.FindName('ProgressText') + # Add an action to the Window.Closing event handler to disable the close button + $script:ProgressSyncHash.Window.Add_Closing({ $_.Cancel = $true }) + # Allow the window to be dragged by clicking on it anywhere + $script:ProgressSyncHash.Window.Add_MouseLeftButtonDown({ $script:ProgressSyncHash.Window.DragMove() }) + # Add a tooltip + $script:ProgressSyncHash.Window.ToolTip = $installTitle + $null = $script:ProgressSyncHash.Window.ShowDialog() + $script:ProgressSyncHash.Error = $Error + }) + + $progressCmd.Runspace = $script:ProgressRunspace + Write-Log -Message "Creating the progress dialog in a separate thread with message: [$statusMessage]." -Source ${CmdletName} + # Invoke the progress runspace + $null = $progressCmd.BeginInvoke() + # Allow the thread to be spun up safely before invoking actions against it. + Start-Sleep -Seconds 1 + If ($script:ProgressSyncHash.Error) { + Write-Log -Message "Failure while displaying progress dialog. `r`n$(Resolve-Error -ErrorRecord $script:ProgressSyncHash.Error)" -Severity 3 -Source ${CmdletName} + } + } + ## Check if the progress thread is running before invoking methods on it + ElseIf ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -eq 'Running') { + Try { + # Update the progress text + $script:ProgressSyncHash.Window.Dispatcher.Invoke([Windows.Threading.DispatcherPriority]::Send, [Windows.Input.InputEventHandler] { $script:ProgressSyncHash.ProgressText.Text = $statusMessage }, $null, $null) + # Calculate the position on the screen where the progress dialog should be placed + $script:ProgressSyncHash.Window.Dispatcher.Invoke([Windows.Threading.DispatcherPriority]::Send, [Windows.Input.InputEventHandler] { + [Int32]$screenWidth = [System.Windows.SystemParameters]::WorkArea.Width + [Int32]$screenHeight = [System.Windows.SystemParameters]::WorkArea.Height + # Set the start position of the Window based on the screen size + If ($windowLocation -eq 'BottomRight') { + # Put the window in the corner + $script:ProgressSyncHash.Window.Left = ($screenWidth - $script:ProgressSyncHash.Window.ActualWidth) + $script:ProgressSyncHash.Window.Top = ($screenHeight - $script:ProgressSyncHash.Window.ActualHeight - 100) #-100 Needed to not overlap system tray Toasts + } + ElseIf ($windowLocation -eq 'TopCenter') { + $script:ProgressSyncHash.Window.Left = [Double](($screenWidth - $script:ProgressSyncHash.Window.ActualWidth) / 2) + $script:ProgressSyncHash.Window.Top = [Double](($screenHeight - $script:ProgressSyncHash.Window.ActualHeight) / 6) + } + Else { + # Center the progress window by calculating the center of the workable screen based on the width of the screen minus half the width of the progress bar + $script:ProgressSyncHash.Window.Left = [Double](($screenWidth - $script:ProgressSyncHash.Window.ActualWidth) / 2) + $script:ProgressSyncHash.Window.Top = [Double](($screenHeight - $script:ProgressSyncHash.Window.ActualHeight) / 2) + } + }, $null, $null) + + Write-Log -Message "Updated the progress message: [$statusMessage]." -Source ${CmdletName} + } + Catch { + Write-Log -Message "Unable to update the progress message. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Close-InstallationProgress +Function Close-InstallationProgress { + <# +.SYNOPSIS + +Closes the dialog created by Show-InstallationProgress. + +.DESCRIPTION + +Closes the dialog created by Show-InstallationProgress. + +This function is called by the Exit-Script function to close a running instance of the progress dialog if found. + +.PARAMETER WaitingTime + +How many seconds to wait, at most, for the InstallationProgress window to be initialized, before the function returns, without closing anything. Range: 1 - 60 Default: 5 + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the version of the specified file. + +.EXAMPLE + +Close-InstallationProgress + +.NOTES + +This is an internal script function and should typically not be called directly. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateRange(1, 60)] + [Int32]$WaitingTime = 5 + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + If ($deployModeSilent) { + Write-Log -Message "Bypassing Close-InstallationProgress [Mode: $deployMode]" -Source ${CmdletName} + Return + } + # Check whether the window has been created and wait for up to $WaitingTime seconds if it does not + [Int32]$Timeout = $WaitingTime + While ((-not $script:ProgressSyncHash.Window.IsInitialized) -and ($Timeout -gt 0)) { + If ($Timeout -eq $WaitingTime) { + Write-Log -Message "The installation progress dialog does not exist. Waiting up to $WaitingTime seconds..." -Source ${CmdletName} + } + $Timeout -= 1 + Start-Sleep -Seconds 1 + } + # Return if we still have no window + If (-not $script:ProgressSyncHash.Window.IsInitialized) { + Write-Log -Message "The installation progress dialog was not created within $WaitingTime seconds." -Source ${CmdletName} -Severity 2 + Return + } + # If the thread is suspended, resume it + If ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::Suspended) { + Write-Log -Message 'The thread for the installation progress dialog is suspended. Resuming the thread.' -Source ${CmdletName} + Try { + $script:ProgressSyncHash.Window.Dispatcher.Thread.Resume() + } + Catch { + Write-Log -Message 'Failed to resume the thread for the installation progress dialog.' -Source ${CmdletName} -Severity 2 + } + } + # If the thread is changing its state, wait + [Int32]$Timeout = 0 + While ((($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::Aborted) -or ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::AbortRequested) -or ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::StopRequested) -or ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::Unstarted) -or ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::WaitSleepJoin)) -and ($Timeout -le $WaitingTime)) { + If (-not $Timeout) { + Write-Log -Message "The thread for the installation progress dialog is changing its state. Waiting up to $WaitingTime seconds..." -Source ${CmdletName} -Severity 2 + } + $Timeout += 1 + Start-Sleep -Seconds 1 + } + # If the thread is running, stop it + If ((-not ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::Stopped)) -and (-not ($script:ProgressSyncHash.Window.Dispatcher.Thread.ThreadState -band [System.Threading.ThreadState]::Unstarted))) { + Write-Log -Message 'Closing the installation progress dialog.' -Source ${CmdletName} + $script:ProgressSyncHash.Window.Dispatcher.InvokeShutdown() + } + + If ($script:ProgressRunspace) { + # If the runspace is still opening, wait + [Int32]$Timeout = 0 + While ((($script:ProgressRunspace.RunspaceStateInfo.State -eq [System.Management.Automation.Runspaces.RunspaceState]::Opening) -or ($script:ProgressRunspace.RunspaceStateInfo.State -eq [System.Management.Automation.Runspaces.RunspaceState]::BeforeOpen)) -and ($Timeout -le $WaitingTime)) { + If (-not $Timeout) { + Write-Log -Message "The runspace for the installation progress dialog is still opening. Waiting up to $WaitingTime seconds..." -Source ${CmdletName} -Severity 2 + } + $Timeout += 1 + Start-Sleep -Seconds 1 + } + # If the runspace is opened, close it + If ($script:ProgressRunspace.RunspaceStateInfo.State -eq [System.Management.Automation.Runspaces.RunspaceState]::Opened) { + Write-Log -Message "Closing the installation progress dialog`'s runspace." -Source ${CmdletName} + $script:ProgressRunspace.Close() + } + } + Else { + Write-Log -Message 'The runspace for the installation progress dialog is already closed.' -Source ${CmdletName} -Severity 2 + } + + If ($script:ProgressSyncHash) { + # Clear sync hash + $script:ProgressSyncHash.Clear() + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Set-PinnedApplication +Function Set-PinnedApplication { + <# +.SYNOPSIS + +Pins or unpins a shortcut to the start menu or task bar. + +.DESCRIPTION + +Pins or unpins a shortcut to the start menu or task bar. + +This should typically be run in the user context, as pinned items are stored in the user profile. + +.PARAMETER Action + +Action to be performed. Options: 'PinToStartMenu','UnpinFromStartMenu','PinToTaskbar','UnpinFromTaskbar'. + +.PARAMETER FilePath + +Path to the shortcut file to be pinned or unpinned. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Set-PinnedApplication -Action 'PinToStartMenu' -FilePath "$envProgramFilesX86\IBM\Lotus\Notes\notes.exe" + +.EXAMPLE + +Set-PinnedApplication -Action 'UnpinFromTaskbar' -FilePath "$envProgramFilesX86\IBM\Lotus\Notes\notes.exe" + +.NOTES + +Windows 10 logic borrowed from Stuart Pearson (https://pinto10blog.wordpress.com/2016/09/10/pinto10/) + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateSet('PinToStartMenu', 'UnpinFromStartMenu', 'PinToTaskbar', 'UnpinFromTaskbar')] + [String]$Action, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$FilePath + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + #region Function Get-PinVerb + Function Get-PinVerb { + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [Int32]$VerbId + ) + + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + + Write-Log -Message "Get localized pin verb for verb id [$VerbID]." -Source ${CmdletName} + [String]$PinVerb = [PSADT.FileVerb]::GetPinVerb($VerbId) + Write-Log -Message "Verb ID [$VerbID] has a localized pin verb of [$PinVerb]." -Source ${CmdletName} + Write-Output -InputObject ($PinVerb) + } + #endregion + + #region Function Invoke-Verb + Function Invoke-Verb { + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$FilePath, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Verb + ) + + Try { + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + $Verb = $Verb.Replace('&', '') + $path = Split-Path -Path $FilePath -Parent -ErrorAction 'Stop' + $folder = $shellApp.Namespace($path) + $item = $folder.ParseName((Split-Path -Path $FilePath -Leaf -ErrorAction 'Stop')) + $itemVerb = $item.Verbs() | Where-Object { $_.Name.Replace('&', '') -eq $Verb } -ErrorAction 'Stop' + + If ($null -eq $itemVerb) { + Write-Log -Message "Performing action [$Verb] is not programmatically supported for this file [$FilePath]." -Severity 2 -Source ${CmdletName} + } + Else { + Write-Log -Message "Performing action [$Verb] on [$FilePath]." -Source ${CmdletName} + $itemVerb.DoIt() + } + } + Catch { + Write-Log -Message "Failed to perform action [$Verb] on [$FilePath]. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + } + } + #endregion + + If (([Version]$envOSVersion).Major -ge 10) { + Write-Log -Message 'Detected Windows 10 or higher, using Windows 10 verb codes.' -Source ${CmdletName} + [Hashtable]$Verbs = @{ + 'PinToStartMenu' = 51201 + 'UnpinFromStartMenu' = 51394 + 'PinToTaskbar' = 5386 + 'UnpinFromTaskbar' = 5387 + } + } + Else { + [Hashtable]$Verbs = @{ + 'PinToStartMenu' = 5381 + 'UnpinFromStartMenu' = 5382 + 'PinToTaskbar' = 5386 + 'UnpinFromTaskbar' = 5387 + } + } + + } + Process { + Try { + Write-Log -Message "Execute action [$Action] for file [$FilePath]." -Source ${CmdletName} + + If (-not (Test-Path -LiteralPath $FilePath -PathType 'Leaf' -ErrorAction 'Stop')) { + Throw "Path [$filePath] does not exist." + } + + If (-not ($Verbs.$Action)) { + Throw "Action [$Action] not supported. Supported actions are [$($Verbs.Keys -join ', ')]." + } + + If ($Action.Contains('StartMenu')) { + If ([Int32]$envOSVersionMajor -ge 10) { + If ((Get-Item -Path $FilePath).Extension -ne '.lnk') { + Throw 'Only shortcut files (.lnk) are supported on Windows 10 and higher.' + } + ElseIf (-not ($FilePath.StartsWith($envUserStartMenu, 'OrdinalIgnoreCase') -or $FilePath.StartsWith($envCommonStartMenu, 'OrdinalIgnoreCase'))) { + Throw "Only shortcut files (.lnk) in [$envUserStartMenu] and [$envCommonStartMenu] are supported on Windows 10 and higher." + } + } + + [String]$PinVerbAction = Get-PinVerb -VerbId ($Verbs.$Action) + If (-not $PinVerbAction) { + Throw "Failed to get a localized pin verb for action [$Action]. Action is not supported on this operating system." + } + + Invoke-Verb -FilePath $FilePath -Verb $PinVerbAction + } + ElseIf ($Action.Contains('Taskbar')) { + If ([Int32]$envOSVersionMajor -ge 10) { + $FileNameWithoutExtension = [System.IO.Path]::GetFileNameWithoutExtension($FilePath) + $PinExists = Test-Path -Path "$envAppData\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\$($FileNameWithoutExtension).lnk" + + If (($Action -eq 'PinToTaskbar') -and ($PinExists)) { + If ($(Invoke-ObjectMethod -InputObject $Shell -MethodName 'CreateShortcut' -ArgumentList "$envAppData\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\$($FileNameWithoutExtension).lnk").TargetPath -eq $FilePath) { + Write-Log -Message "Pin [$FileNameWithoutExtension] already exists." -Source ${CmdletName} + Return + } + } + ElseIf (($Action -eq 'UnpinFromTaskbar') -and ($PinExists -eq $false)) { + Write-Log -Message "Pin [$FileNameWithoutExtension] does not exist." -Source ${CmdletName} + Return + } + + $ExplorerCommandHandler = Get-RegistryKey -Key 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\Windows.taskbarpin' -Value 'ExplorerCommandHandler' + $classesStarKey = (Get-Item "Registry::HKEY_USERS\$($RunasActiveUser.SID)\SOFTWARE\Classes").OpenSubKey('*', $true) + $shellKey = $classesStarKey.CreateSubKey('shell', $true) + $specialKey = $shellKey.CreateSubKey('{:}', $true) + $specialKey.SetValue('ExplorerCommandHandler', $ExplorerCommandHandler) + + $Folder = Invoke-ObjectMethod -InputObject $ShellApp -MethodName 'Namespace' -ArgumentList $(Split-Path -Path $FilePath -Parent) + $Item = Invoke-ObjectMethod -InputObject $Folder -MethodName 'ParseName' -ArgumentList $(Split-Path -Path $FilePath -Leaf) + + $Item.InvokeVerb('{:}') + + $shellKey.DeleteSubKey('{:}') + If ($shellKey.SubKeyCount -eq 0 -and $shellKey.ValueCount -eq 0) { + $classesStarKey.DeleteSubKey('shell') + } + } + Else { + [String]$PinVerbAction = Get-PinVerb -VerbId ($Verbs.$Action) + If (-not $PinVerbAction) { + Throw "Failed to get a localized pin verb for action [$Action]. Action is not supported on this operating system." + } + + Invoke-Verb -FilePath $FilePath -Verb $PinVerbAction + } + } + } + Catch { + Write-Log -Message "Failed to execute action [$Action]. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + } + Finally { + Try { + If ($shellKey) { + $shellKey.Close() + } + } + Catch { + } + Try { + If ($classesStarKey) { + $classesStarKey.Close() + } + } + Catch { + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-IniValue +Function Get-IniValue { + <# +.SYNOPSIS + +Parses an INI file and returns the value of the specified section and key. + +.DESCRIPTION + +Parses an INI file and returns the value of the specified section and key. + +.PARAMETER FilePath + +Path to the INI file. + +.PARAMETER Section + +Section within the INI file. + +.PARAMETER Key + +Key within the section of the INI file. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.String + +Returns the value of the specified section and key. + +.EXAMPLE + +Get-IniValue -FilePath "$envProgramFilesX86\IBM\Notes\notes.ini" -Section 'Notes' -Key 'KeyFileName' + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$FilePath, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Section, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Key, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Reading INI Key: [Section = $Section] [Key = $Key]." -Source ${CmdletName} + + If (-not (Test-Path -LiteralPath $FilePath -PathType 'Leaf')) { + Throw "File [$filePath] could not be found." + } + + $IniValue = [PSADT.IniFile]::GetIniValue($Section, $Key, $FilePath) + Write-Log -Message "INI Key Value: [Section = $Section] [Key = $Key] [Value = $IniValue]." -Source ${CmdletName} + + Write-Output -InputObject ($IniValue) + } + Catch { + Write-Log -Message "Failed to read INI file key value. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to read INI file key value: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Set-IniValue +Function Set-IniValue { + <# +.SYNOPSIS + +Opens an INI file and sets the value of the specified section and key. + +.DESCRIPTION + +Opens an INI file and sets the value of the specified section and key. + +.PARAMETER FilePath + +Path to the INI file. + +.PARAMETER Section + +Section within the INI file. + +.PARAMETER Key + +Key within the section of the INI file. + +.PARAMETER Value + +Value for the key within the section of the INI file. To remove a value, set this variable to $null. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any output. + +.EXAMPLE + +Set-IniValue -FilePath "$envProgramFilesX86\IBM\Notes\notes.ini" -Section 'Notes' -Key 'KeyFileName' -Value 'MyFile.ID' + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$FilePath, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Section, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Key, + # Don't strongly type this variable as [String] b/c PowerShell replaces [String]$Value = $null with an empty string + [Parameter(Mandatory = $true)] + [AllowNull()] + $Value, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Writing INI Key Value: [Section = $Section] [Key = $Key] [Value = $Value]." -Source ${CmdletName} + + If (-not (Test-Path -LiteralPath $FilePath -PathType 'Leaf')) { + Throw "File [$filePath] could not be found." + } + + [PSADT.IniFile]::SetIniValue($Section, $Key, ([Text.StringBuilder]$Value), $FilePath) + } + Catch { + Write-Log -Message "Failed to write INI file key value. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to write INI file key value: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-PEFileArchitecture +Function Get-PEFileArchitecture { + <# +.SYNOPSIS + +Determine if a PE file is a 32-bit or a 64-bit file. + +.DESCRIPTION + +Determine if a PE file is a 32-bit or a 64-bit file by examining the file's image file header. + +PE file extensions: .exe, .dll, .ocx, .drv, .sys, .scr, .efi, .cpl, .fon + +.PARAMETER FilePath + +Path to the PE file to examine. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.PARAMETER PassThru + +Get the file object, attach a property indicating the file binary type, and write to pipeline + +.INPUTS + +System.IO.FileInfo. + +Accepts a FileInfo object from the pipeline. + +.OUTPUTS + +System.String + +Returns a string indicating the file binary type. + +.EXAMPLE + +Get-PEFileArchitecture -FilePath "$env:windir\notepad.exe" + +.NOTES + +This is an internal script function and should typically not be called directly. + +.LINK + +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] + [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] + [IO.FileInfo[]]$FilePath, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true, + [Parameter(Mandatory = $false)] + [Switch]$PassThru + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + [String[]]$PEFileExtensions = '.exe', '.dll', '.ocx', '.drv', '.sys', '.scr', '.efi', '.cpl', '.fon' + [Int32]$MACHINE_OFFSET = 4 + [Int32]$PE_POINTER_OFFSET = 60 + } + Process { + ForEach ($Path in $filePath) { + Try { + If ($PEFileExtensions -notcontains $Path.Extension) { + Throw "Invalid file type. Please specify one of the following PE file types: $($PEFileExtensions -join ', ')" + } + + [Byte[]]$data = New-Object -TypeName 'System.Byte[]' -ArgumentList (4096) + $stream = New-Object -TypeName 'System.IO.FileStream' -ArgumentList ($Path.FullName, 'Open', 'Read') + $null = $stream.Read($data, 0, 4096) + $stream.Flush() + $stream.Close() + + [Int32]$PE_HEADER_ADDR = [BitConverter]::ToInt32($data, $PE_POINTER_OFFSET) + [UInt16]$PE_IMAGE_FILE_HEADER = [BitConverter]::ToUInt16($data, $PE_HEADER_ADDR + $MACHINE_OFFSET) + Switch ($PE_IMAGE_FILE_HEADER) { + 0 { + $PEArchitecture = 'Native' + } # The contents of this file are assumed to be applicable to any machine type + 0x014c { + $PEArchitecture = '32BIT' + } # File for Windows 32-bit systems + 0x0200 { + $PEArchitecture = 'Itanium-x64' + } # File for Intel Itanium x64 processor family + 0x8664 { + $PEArchitecture = '64BIT' + } # File for Windows 64-bit systems + Default { + $PEArchitecture = 'Unknown' + } + } + Write-Log -Message "File [$($Path.FullName)] has a detected file architecture of [$PEArchitecture]." -Source ${CmdletName} + + If ($PassThru) { + # Get the file object, attach a property indicating the type, and write to pipeline + Get-Item -LiteralPath $Path.FullName -Force | Add-Member -MemberType 'NoteProperty' -Name 'BinaryType' -Value $PEArchitecture -Force -PassThru | Write-Output + } + Else { + Write-Output -InputObject ($PEArchitecture) + } + } + Catch { + Write-Log -Message "Failed to get the PE file architecture. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to get the PE file architecture: $($_.Exception.Message)" + } + Continue + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Invoke-RegisterOrUnregisterDLL +Function Invoke-RegisterOrUnregisterDLL { + <# +.SYNOPSIS + +Register or unregister a DLL file. + +.DESCRIPTION + +Register or unregister a DLL file using regsvr32.exe. Function can be invoked using alias: 'Register-DLL' or 'Unregister-DLL'. + +.PARAMETER FilePath + +Path to the DLL file. + +.PARAMETER DLLAction + +Specify whether to register or unregister the DLL. Optional if function is invoked using 'Register-DLL' or 'Unregister-DLL' alias. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return objects. + +.EXAMPLE + +Register-DLL -FilePath "C:\Test\DcTLSFileToDMSComp.dll" + +Register DLL file using the "Register-DLL" alias for this function + +.EXAMPLE + +UnRegister-DLL -FilePath "C:\Test\DcTLSFileToDMSComp.dll" + +Unregister DLL file using the "Unregister-DLL" alias for this function + +.EXAMPLE + +Invoke-RegisterOrUnregisterDLL -FilePath "C:\Test\DcTLSFileToDMSComp.dll" -DLLAction 'Register' + +Register DLL file using the actual name of this function + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$FilePath, + [Parameter(Mandatory = $false)] + [ValidateSet('Register', 'Unregister')] + [String]$DLLAction, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + ## Get name used to invoke this function in case the 'Register-DLL' or 'Unregister-DLL' alias was used and set the correct DLL action + [String]${InvokedCmdletName} = $MyInvocation.InvocationName + # Set the correct register/unregister action based on the alias used to invoke this function + If (${InvokedCmdletName} -ne ${CmdletName}) { + Switch (${InvokedCmdletName}) { + 'Register-DLL' { + [String]$DLLAction = 'Register' + } + 'Unregister-DLL' { + [String]$DLLAction = 'Unregister' + } + } + } + # Set the correct DLL register/unregister action parameters + If (-not $DLLAction) { + Throw 'Parameter validation failed. Please specify the [-DLLAction] parameter to determine whether to register or unregister the DLL.' + } + [String]$DLLAction = ((Get-Culture).TextInfo).ToTitleCase($DLLAction.ToLower()) + Switch ($DLLAction) { + 'Register' { + [String]$DLLActionParameters = "/s `"$FilePath`"" + } + 'Unregister' { + [String]$DLLActionParameters = "/s /u `"$FilePath`"" + } + } + } + Process { + Try { + Write-Log -Message "$DLLAction DLL file [$filePath]." -Source ${CmdletName} + If (-not (Test-Path -LiteralPath $FilePath -PathType 'Leaf')) { + Throw "File [$filePath] could not be found." + } + + [String]$DLLFileBitness = Get-PEFileArchitecture -FilePath $filePath -ContinueOnError $false -ErrorAction 'Stop' + If (($DLLFileBitness -ne '64BIT') -and ($DLLFileBitness -ne '32BIT')) { + Throw "File [$filePath] has a detected file architecture of [$DLLFileBitness]. Only 32-bit or 64-bit DLL files can be $($DLLAction.ToLower() + 'ed')." + } + + If ($Is64Bit) { + If ($DLLFileBitness -eq '64BIT') { + If ($Is64BitProcess) { + [String]$RegSvr32Path = "$envWinDir\System32\regsvr32.exe" + } + Else { + [String]$RegSvr32Path = "$envWinDir\Sysnative\regsvr32.exe" + } + } + ElseIf ($DLLFileBitness -eq '32BIT') { + [String]$RegSvr32Path = "$envWinDir\SysWOW64\regsvr32.exe" + } + } + Else { + If ($DLLFileBitness -eq '64BIT') { + Throw "File [$filePath] cannot be $($DLLAction.ToLower()) because it is a 64-bit file on a 32-bit operating system." + } + ElseIf ($DLLFileBitness -eq '32BIT') { + [String]$RegSvr32Path = "$envWinDir\System32\regsvr32.exe" + } + } + + [PSObject]$ExecuteResult = Execute-Process -Path $RegSvr32Path -Parameters $DLLActionParameters -WindowStyle 'Hidden' -PassThru -ExitOnProcessFailure $false + + If ($ExecuteResult.ExitCode -ne 0) { + If ($ExecuteResult.ExitCode -eq 60002) { + Throw "Execute-Process function failed with exit code [$($ExecuteResult.ExitCode)]." + } + Else { + Throw "regsvr32.exe failed with exit code [$($ExecuteResult.ExitCode)]." + } + } + } + Catch { + Write-Log -Message "Failed to $($DLLAction.ToLower()) DLL file. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to $($DLLAction.ToLower()) DLL file: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +Set-Alias -Name 'Register-DLL' -Value 'Invoke-RegisterOrUnregisterDLL' -Scope 'Script' -Force -ErrorAction 'SilentlyContinue' +Set-Alias -Name 'Unregister-DLL' -Value 'Invoke-RegisterOrUnregisterDLL' -Scope 'Script' -Force -ErrorAction 'SilentlyContinue' +#endregion + + +#region Function Invoke-ObjectMethod +Function Invoke-ObjectMethod { + <# +.SYNOPSIS + +Invoke method on any object. + +.DESCRIPTION + +Invoke method on any object with or without using named parameters. + +.PARAMETER InputObject + +Specifies an object which has methods that can be invoked. + +.PARAMETER MethodName + +Specifies the name of a method to invoke. + +.PARAMETER ArgumentList + +Argument to pass to the method being executed. Allows execution of method without specifying named parameters. + +.PARAMETER Parameter + +Argument to pass to the method being executed. Allows execution of method by using named parameters. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Object. + +The object returned by the method being invoked. + +.EXAMPLE + +$ShellApp = New-Object -ComObject 'Shell.Application' +$null = Invoke-ObjectMethod -InputObject $ShellApp -MethodName 'MinimizeAll' + +Minimizes all windows. + +.EXAMPLE + +$ShellApp = New-Object -ComObject 'Shell.Application' + +$null = Invoke-ObjectMethod -InputObject $ShellApp -MethodName 'Explore' -Parameter @{'vDir'='C:\Windows'} + +Opens the C:\Windows folder in a Windows Explorer window. + +.NOTES + +This is an internal script function and should typically not be called directly. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding(DefaultParameterSetName = 'Positional')] + Param ( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNull()] + [Object]$InputObject, + [Parameter(Mandatory = $true, Position = 1)] + [ValidateNotNullorEmpty()] + [String]$MethodName, + [Parameter(Mandatory = $false, Position = 2, ParameterSetName = 'Positional')] + [Object[]]$ArgumentList, + [Parameter(Mandatory = $true, Position = 2, ParameterSetName = 'Named')] + [ValidateNotNull()] + [Hashtable]$Parameter + ) + + Begin { + } + Process { + If ($PSCmdlet.ParameterSetName -eq 'Named') { + ## Invoke method by using parameter names + Write-Output -InputObject ($InputObject.GetType().InvokeMember($MethodName, [Reflection.BindingFlags]::InvokeMethod, $null, $InputObject, ([Object[]]($Parameter.Values)), $null, $null, ([String[]]($Parameter.Keys)))) + } + Else { + ## Invoke method without using parameter names + Write-Output -InputObject ($InputObject.GetType().InvokeMember($MethodName, [Reflection.BindingFlags]::InvokeMethod, $null, $InputObject, $ArgumentList, $null, $null, $null)) + } + } + End { + } +} +#endregion + + +#region Function Get-ObjectProperty +Function Get-ObjectProperty { + <# +.SYNOPSIS + +Get a property from any object. + +.DESCRIPTION + +Get a property from any object. + +.PARAMETER InputObject + +Specifies an object which has properties that can be retrieved. + +.PARAMETER PropertyName + +Specifies the name of a property to retrieve. + +.PARAMETER ArgumentList + +Argument to pass to the property being retrieved. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Object. + +Returns the value of the property being retrieved. + +.EXAMPLE + +Get-ObjectProperty -InputObject $Record -PropertyName 'StringData' -ArgumentList @(1) + +.NOTES + +This is an internal script function and should typically not be called directly. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0)] + [ValidateNotNull()] + [Object]$InputObject, + [Parameter(Mandatory = $true, Position = 1)] + [ValidateNotNullorEmpty()] + [String]$PropertyName, + [Parameter(Mandatory = $false, Position = 2)] + [Object[]]$ArgumentList + ) + + Begin { + } + Process { + ## Retrieve property + Write-Output -InputObject ($InputObject.GetType().InvokeMember($PropertyName, [Reflection.BindingFlags]::GetProperty, $null, $InputObject, $ArgumentList, $null, $null, $null)) + } + End { + } +} +#endregion + + +#region Function Get-MsiTableProperty +Function Get-MsiTableProperty { + <# +.SYNOPSIS + +Get all of the properties from a Windows Installer database table or the Summary Information stream and return as a custom object. + +.DESCRIPTION + +Use the Windows Installer object to read all of the properties from a Windows Installer database table or the Summary Information stream. + +.PARAMETER Path + +The fully qualified path to an database file. Supports .msi and .msp files. + +.PARAMETER TransformPath + +The fully qualified path to a list of MST file(s) which should be applied to the MSI file. + +.PARAMETER Table + +The name of the the MSI table from which all of the properties must be retrieved. Default is: 'Property'. + +.PARAMETER TablePropertyNameColumnNum + +Specify the table column number which contains the name of the properties. Default is: 1 for MSIs and 2 for MSPs. + +.PARAMETER TablePropertyValueColumnNum + +Specify the table column number which contains the value of the properties. Default is: 2 for MSIs and 3 for MSPs. + +.PARAMETER GetSummaryInformation + +Retrieves the Summary Information for the Windows Installer database. + +Summary Information property descriptions: https://msdn.microsoft.com/en-us/library/aa372049(v=vs.85).aspx + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Management.Automation.PSObject + +Returns a custom object with the following properties: 'Name' and 'Value'. + +.EXAMPLE + +Get-MsiTableProperty -Path 'C:\Package\AppDeploy.msi' -TransformPath 'C:\Package\AppDeploy.mst' + +Retrieve all of the properties from the default 'Property' table. + +.EXAMPLE + +Get-MsiTableProperty -Path 'C:\Package\AppDeploy.msi' -TransformPath 'C:\Package\AppDeploy.mst' -Table 'Property' | Select-Object -ExpandProperty ProductCode + +Retrieve all of the properties from the 'Property' table and then pipe to Select-Object to select the ProductCode property. + +.EXAMPLE + +Get-MsiTableProperty -Path 'C:\Package\AppDeploy.msi' -GetSummaryInformation + +Retrieves the Summary Information for the Windows Installer database. + +.NOTES + +This is an internal script function and should typically not be called directly. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding(DefaultParameterSetName = 'TableInfo')] + Param ( + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] + [String]$Path, + [Parameter(Mandatory = $false)] + [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] + [String[]]$TransformPath, + [Parameter(Mandatory = $false, ParameterSetName = 'TableInfo')] + [ValidateNotNullOrEmpty()] + [String]$Table = $(If ([IO.Path]::GetExtension($Path) -eq '.msi') { + 'Property' + } + Else { + 'MsiPatchMetadata' + }), + [Parameter(Mandatory = $false, ParameterSetName = 'TableInfo')] + [ValidateNotNullorEmpty()] + [Int32]$TablePropertyNameColumnNum = $(If ([IO.Path]::GetExtension($Path) -eq '.msi') { + 1 + } + Else { + 2 + }), + [Parameter(Mandatory = $false, ParameterSetName = 'TableInfo')] + [ValidateNotNullorEmpty()] + [Int32]$TablePropertyValueColumnNum = $(If ([IO.Path]::GetExtension($Path) -eq '.msi') { + 2 + } + Else { + 3 + }), + [Parameter(Mandatory = $true, ParameterSetName = 'SummaryInfo')] + [ValidateNotNullorEmpty()] + [Switch]$GetSummaryInformation = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + If ($PSCmdlet.ParameterSetName -eq 'TableInfo') { + Write-Log -Message "Reading data from Windows Installer database file [$Path] in table [$Table]." -Source ${CmdletName} + } + Else { + Write-Log -Message "Reading the Summary Information from the Windows Installer database file [$Path]." -Source ${CmdletName} + } + + ## Create a Windows Installer object + [__ComObject]$Installer = New-Object -ComObject 'WindowsInstaller.Installer' -ErrorAction 'Stop' + ## Determine if the database file is a patch (.msp) or not + If ([IO.Path]::GetExtension($Path) -eq '.msp') { + [Boolean]$IsMspFile = $true + } + ## Define properties for how the MSI database is opened + [Int32]$msiOpenDatabaseModeReadOnly = 0 + [Int32]$msiSuppressApplyTransformErrors = 63 + [Int32]$msiOpenDatabaseMode = $msiOpenDatabaseModeReadOnly + [Int32]$msiOpenDatabaseModePatchFile = 32 + If ($IsMspFile) { + [Int32]$msiOpenDatabaseMode = $msiOpenDatabaseModePatchFile + } + ## Open database in read only mode + [__ComObject]$Database = Invoke-ObjectMethod -InputObject $Installer -MethodName 'OpenDatabase' -ArgumentList @($Path, $msiOpenDatabaseMode) + ## Apply a list of transform(s) to the database + If (($TransformPath) -and (-not $IsMspFile)) { + ForEach ($Transform in $TransformPath) { + $null = Invoke-ObjectMethod -InputObject $Database -MethodName 'ApplyTransform' -ArgumentList @($Transform, $msiSuppressApplyTransformErrors) + } + } + + ## Get either the requested windows database table information or summary information + If ($PSCmdlet.ParameterSetName -eq 'TableInfo') { + ## Open the requested table view from the database + [__ComObject]$View = Invoke-ObjectMethod -InputObject $Database -MethodName 'OpenView' -ArgumentList @("SELECT * FROM $Table") + $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Execute' + + ## Create an empty object to store properties in + [PSObject]$TableProperties = New-Object -TypeName 'PSObject' + + ## Retrieve the first row from the requested table. If the first row was successfully retrieved, then save data and loop through the entire table. + # https://msdn.microsoft.com/en-us/library/windows/desktop/aa371136(v=vs.85).aspx + [__ComObject]$Record = Invoke-ObjectMethod -InputObject $View -MethodName 'Fetch' + While ($Record) { + # Read string data from record and add property/value pair to custom object + $TableProperties | Add-Member -MemberType 'NoteProperty' -Name (Get-ObjectProperty -InputObject $Record -PropertyName 'StringData' -ArgumentList @($TablePropertyNameColumnNum)) -Value (Get-ObjectProperty -InputObject $Record -PropertyName 'StringData' -ArgumentList @($TablePropertyValueColumnNum)) -Force + # Retrieve the next row in the table + [__ComObject]$Record = Invoke-ObjectMethod -InputObject $View -MethodName 'Fetch' + } + Write-Output -InputObject ($TableProperties) + } + Else { + ## Get the SummaryInformation from the windows installer database + [__ComObject]$SummaryInformation = Get-ObjectProperty -InputObject $Database -PropertyName 'SummaryInformation' + [Hashtable]$SummaryInfoProperty = @{} + ## Summary property descriptions: https://msdn.microsoft.com/en-us/library/aa372049(v=vs.85).aspx + $SummaryInfoProperty.Add('CodePage', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(1))) + $SummaryInfoProperty.Add('Title', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(2))) + $SummaryInfoProperty.Add('Subject', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(3))) + $SummaryInfoProperty.Add('Author', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(4))) + $SummaryInfoProperty.Add('Keywords', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(5))) + $SummaryInfoProperty.Add('Comments', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(6))) + $SummaryInfoProperty.Add('Template', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(7))) + $SummaryInfoProperty.Add('LastSavedBy', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(8))) + $SummaryInfoProperty.Add('RevisionNumber', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(9))) + $SummaryInfoProperty.Add('LastPrinted', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(11))) + $SummaryInfoProperty.Add('CreateTimeDate', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(12))) + $SummaryInfoProperty.Add('LastSaveTimeDate', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(13))) + $SummaryInfoProperty.Add('PageCount', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(14))) + $SummaryInfoProperty.Add('WordCount', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(15))) + $SummaryInfoProperty.Add('CharacterCount', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(16))) + $SummaryInfoProperty.Add('CreatingApplication', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(18))) + $SummaryInfoProperty.Add('Security', (Get-ObjectProperty -InputObject $SummaryInformation -PropertyName 'Property' -ArgumentList @(19))) + [PSObject]$SummaryInfoProperties = New-Object -TypeName 'PSObject' -Property $SummaryInfoProperty + Write-Output -InputObject ($SummaryInfoProperties) + } + } + Catch { + Write-Log -Message "Failed to get the MSI table [$Table]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to get the MSI table [$Table]: $($_.Exception.Message)" + } + } + Finally { + Try { + If ($View) { + $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Close' -ArgumentList @() + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($View) + } + Catch { + } + } + ElseIf ($SummaryInformation) { + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($SummaryInformation) + } + Catch { + } + } + } + Catch { + } + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($DataBase) + } + Catch { + } + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($Installer) + } + Catch { + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Set-MsiProperty +Function Set-MsiProperty { + <# +.SYNOPSIS + +Set a property in the MSI property table. + +.DESCRIPTION + +Set a property in the MSI property table. + +.PARAMETER DataBase + +Specify a ComObject representing an MSI database opened in view/modify/update mode. + +.PARAMETER PropertyName + +The name of the property to be set/modified. + +.PARAMETER PropertyValue + +The value of the property to be set/modified. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + +Set-MsiProperty -DataBase $TempMsiPathDatabase -PropertyName 'ALLUSERS' -PropertyValue '1' + +.NOTES + +This is an internal script function and should typically not be called directly. + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [__ComObject]$DataBase, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$PropertyName, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$PropertyValue, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Setting the MSI Property Name [$PropertyName] with Property Value [$PropertyValue]." -Source ${CmdletName} + + ## Open the requested table view from the database + [__ComObject]$View = Invoke-ObjectMethod -InputObject $DataBase -MethodName 'OpenView' -ArgumentList @("SELECT * FROM Property WHERE Property='$PropertyName'") + $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Execute' + + ## Retrieve the requested property from the requested table. + # https://msdn.microsoft.com/en-us/library/windows/desktop/aa371136(v=vs.85).aspx + [__ComObject]$Record = Invoke-ObjectMethod -InputObject $View -MethodName 'Fetch' + + ## Close the previous view on the MSI database + $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Close' -ArgumentList @() + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($View) + + ## Set the MSI property + If ($Record) { + # If the property already exists, then create the view for updating the property + [__ComObject]$View = Invoke-ObjectMethod -InputObject $DataBase -MethodName 'OpenView' -ArgumentList @("UPDATE Property SET Value='$PropertyValue' WHERE Property='$PropertyName'") + } + Else { + # If property does not exist, then create view for inserting the property + [__ComObject]$View = Invoke-ObjectMethod -InputObject $DataBase -MethodName 'OpenView' -ArgumentList @("INSERT INTO Property (Property, Value) VALUES ('$PropertyName','$PropertyValue')") + } + # Execute the view to set the MSI property + $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Execute' + } + Catch { + Write-Log -Message "Failed to set the MSI Property Name [$PropertyName] with Property Value [$PropertyValue]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to set the MSI Property Name [$PropertyName] with Property Value [$PropertyValue]: $($_.Exception.Message)" + } + } + Finally { + Try { + If ($View) { + $null = Invoke-ObjectMethod -InputObject $View -MethodName 'Close' -ArgumentList @() + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($View) + } + } + Catch { + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function New-MsiTransform +Function New-MsiTransform { + <# +.SYNOPSIS + +Create a transform file for an MSI database. + +.DESCRIPTION + +Create a transform file for an MSI database and create/modify properties in the Properties table. + +.PARAMETER MsiPath + +Specify the path to an MSI file. + +.PARAMETER ApplyTransformPath + +Specify the path to a transform which should be applied to the MSI database before any new properties are created or modified. + +.PARAMETER NewTransformPath + +Specify the path where the new transform file with the desired properties will be created. If a transform file of the same name already exists, it will be deleted before a new one is created. + +Default is: a) If -ApplyTransformPath was specified but not -NewTransformPath, then .new.mst + b) If only -MsiPath was specified, then .mst + +.PARAMETER TransformProperties + +Hashtable which contains calls to Set-MsiProperty for configuring the desired properties which should be included in new transform file. + +Example hashtable: [Hashtable]$TransformProperties = @{ 'ALLUSERS' = '1' } + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not generate any output. + +.EXAMPLE + [Hashtable]$TransformProperties = { + 'ALLUSERS' = '1' + 'AgreeToLicense' = 'Yes' + 'REBOOT' = 'ReallySuppress' + 'RebootYesNo' = 'No' + 'ROOTDRIVE' = 'C:' + } + New-MsiTransform -MsiPath 'C:\Temp\PSADTInstall.msi' -TransformProperties $TransformProperties + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] + [String]$MsiPath, + [Parameter(Mandatory = $false)] + [ValidateScript({ Test-Path -LiteralPath $_ -PathType 'Leaf' })] + [String]$ApplyTransformPath, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$NewTransformPath, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [Hashtable]$TransformProperties, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + ## Define properties for how the MSI database is opened + [Int32]$msiOpenDatabaseModeReadOnly = 0 + [Int32]$msiOpenDatabaseModeTransact = 1 + [Int32]$msiViewModifyUpdate = 2 + [Int32]$msiViewModifyReplace = 4 + [Int32]$msiViewModifyDelete = 6 + [Int32]$msiTransformErrorNone = 0 + [Int32]$msiTransformValidationNone = 0 + [Int32]$msiSuppressApplyTransformErrors = 63 + } + Process { + Try { + Write-Log -Message "Creating a transform file for MSI [$MsiPath]." -Source ${CmdletName} + + ## Discover the parent folder that the MSI file resides in + [String]$MsiParentFolder = Split-Path -Path $MsiPath -Parent -ErrorAction 'Stop' + + ## Create a temporary file name for storing a second copy of the MSI database + [String]$TempMsiPath = Join-Path -Path $MsiParentFolder -ChildPath ([IO.Path]::GetFileName(([IO.Path]::GetTempFileName()))) -ErrorAction 'Stop' + + ## Create a second copy of the MSI database + Write-Log -Message "Copying MSI database in path [$MsiPath] to destination [$TempMsiPath]." -Source ${CmdletName} + $null = Copy-Item -LiteralPath $MsiPath -Destination $TempMsiPath -Force -ErrorAction 'Stop' + + ## Create a Windows Installer object + [__ComObject]$Installer = New-Object -ComObject 'WindowsInstaller.Installer' -ErrorAction 'Stop' + + ## Open both copies of the MSI database + # Open the original MSI database in read only mode + Write-Log -Message "Opening the MSI database [$MsiPath] in read only mode." -Source ${CmdletName} + [__ComObject]$MsiPathDatabase = Invoke-ObjectMethod -InputObject $Installer -MethodName 'OpenDatabase' -ArgumentList @($MsiPath, $msiOpenDatabaseModeReadOnly) + # Open the temporary copy of the MSI database in view/modify/update mode + Write-Log -Message "Opening the MSI database [$TempMsiPath] in view/modify/update mode." -Source ${CmdletName} + [__ComObject]$TempMsiPathDatabase = Invoke-ObjectMethod -InputObject $Installer -MethodName 'OpenDatabase' -ArgumentList @($TempMsiPath, $msiViewModifyUpdate) + + ## If a MSI transform file was specified, then apply it to the temporary copy of the MSI database + If ($ApplyTransformPath) { + Write-Log -Message "Applying transform file [$ApplyTransformPath] to MSI database [$TempMsiPath]." -Source ${CmdletName} + $null = Invoke-ObjectMethod -InputObject $TempMsiPathDatabase -MethodName 'ApplyTransform' -ArgumentList @($ApplyTransformPath, $msiSuppressApplyTransformErrors) + } + + ## Determine the path for the new transform file that will be generated + If (-not $NewTransformPath) { + If ($ApplyTransformPath) { + [String]$NewTransformFileName = [IO.Path]::GetFileNameWithoutExtension($ApplyTransformPath) + '.new' + [IO.Path]::GetExtension($ApplyTransformPath) + } + Else { + [String]$NewTransformFileName = [IO.Path]::GetFileNameWithoutExtension($MsiPath) + '.mst' + } + [String]$NewTransformPath = Join-Path -Path $MsiParentFolder -ChildPath $NewTransformFileName -ErrorAction 'Stop' + } + + ## Set the MSI properties in the temporary copy of the MSI database + $TransformProperties.GetEnumerator() | ForEach-Object { Set-MsiProperty -DataBase $TempMsiPathDatabase -PropertyName $_.Key -PropertyValue $_.Value } + + ## Commit the new properties to the temporary copy of the MSI database + $null = Invoke-ObjectMethod -InputObject $TempMsiPathDatabase -MethodName 'Commit' + + ## Reopen the temporary copy of the MSI database in read only mode + # Release the database object for the temporary copy of the MSI database + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($TempMsiPathDatabase) + # Open the temporary copy of the MSI database in read only mode + Write-Log -Message "Re-opening the MSI database [$TempMsiPath] in read only mode." -Source ${CmdletName} + [__ComObject]$TempMsiPathDatabase = Invoke-ObjectMethod -InputObject $Installer -MethodName 'OpenDatabase' -ArgumentList @($TempMsiPath, $msiOpenDatabaseModeReadOnly) + + ## Delete the new transform file path if it already exists + If (Test-Path -LiteralPath $NewTransformPath -PathType 'Leaf' -ErrorAction 'Stop') { + Write-Log -Message "A transform file of the same name already exists. Deleting transform file [$NewTransformPath]." -Source ${CmdletName} + $null = Remove-Item -LiteralPath $NewTransformPath -Force -ErrorAction 'Stop' + } + + ## Generate the new transform file by taking the difference between the temporary copy of the MSI database and the original MSI database + Write-Log -Message "Generating new transform file [$NewTransformPath]." -Source ${CmdletName} + $null = Invoke-ObjectMethod -InputObject $TempMsiPathDatabase -MethodName 'GenerateTransform' -ArgumentList @($MsiPathDatabase, $NewTransformPath) + $null = Invoke-ObjectMethod -InputObject $TempMsiPathDatabase -MethodName 'CreateTransformSummaryInfo' -ArgumentList @($MsiPathDatabase, $NewTransformPath, $msiTransformErrorNone, $msiTransformValidationNone) + + If (Test-Path -LiteralPath $NewTransformPath -PathType 'Leaf' -ErrorAction 'Stop') { + Write-Log -Message "Successfully created new transform file in path [$NewTransformPath]." -Source ${CmdletName} + } + Else { + Throw "Failed to generate transform file in path [$NewTransformPath]." + } + } + Catch { + Write-Log -Message "Failed to create new transform file in path [$NewTransformPath]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to create new transform file in path [$NewTransformPath]: $($_.Exception.Message)" + } + } + Finally { + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($TempMsiPathDatabase) + } + Catch { + } + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($MsiPathDatabase) + } + Catch { + } + Try { + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($Installer) + } + Catch { + } + Try { + ## Delete the temporary copy of the MSI database + If (Test-Path -LiteralPath $TempMsiPath -PathType 'Leaf' -ErrorAction 'Stop') { + $null = Remove-Item -LiteralPath $TempMsiPath -Force -ErrorAction 'Stop' + } + } + Catch { + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Test-MSUpdates +Function Test-MSUpdates { + <# +.SYNOPSIS + +Test whether a Microsoft Windows update is installed. + +.DESCRIPTION + +Test whether a Microsoft Windows update is installed. + +.PARAMETER KBNumber + +KBNumber of the update. + +.PARAMETER ContinueOnError + +Suppress writing log message to console on failure to write message to log file. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Boolean + +Returns $true if the update is installed, otherwise returns $false. + +.EXAMPLE + +Test-MSUpdates -KBNumber 'KB2549864' + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, Position = 0, HelpMessage = 'Enter the KB Number for the Microsoft Update')] + [ValidateNotNullorEmpty()] + [String]$KBNumber, + [Parameter(Mandatory = $false, Position = 1)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Checking if Microsoft Update [$kbNumber] is installed." -Source ${CmdletName} + + ## Default is not found + [Boolean]$kbFound = $false + + ## Check for update using built in PS cmdlet which uses WMI in the background to gather details + Get-HotFix -Id $kbNumber -ErrorAction 'SilentlyContinue' | ForEach-Object { $kbFound = $true } + + If (-not $kbFound) { + Write-Log -Message 'Unable to detect Windows update history via Get-Hotfix cmdlet. Trying via COM object.' -Source ${CmdletName} + + ## Check for update using ComObject method (to catch Office updates) + [__ComObject]$UpdateSession = New-Object -ComObject 'Microsoft.Update.Session' + [__ComObject]$UpdateSearcher = $UpdateSession.CreateUpdateSearcher() + # Indicates whether the search results include updates that are superseded by other updates in the search results + $UpdateSearcher.IncludePotentiallySupersededUpdates = $false + # Indicates whether the UpdateSearcher goes online to search for updates. + $UpdateSearcher.Online = $false + [Int32]$UpdateHistoryCount = $UpdateSearcher.GetTotalHistoryCount() + If ($UpdateHistoryCount -gt 0) { + [PSObject]$UpdateHistory = $UpdateSearcher.QueryHistory(0, $UpdateHistoryCount) | + Select-Object -Property 'Title', 'Date', + @{Name = 'Operation'; Expression = { Switch ($_.Operation) { + 1 { + 'Installation' + }; 2 { + 'Uninstallation' + }; 3 { + 'Other' + } + } } + }, + @{Name = 'Status'; Expression = { Switch ($_.ResultCode) { + 0 { + 'Not Started' + }; 1 { + 'In Progress' + }; 2 { + 'Successful' + }; 3 { + 'Incomplete' + }; 4 { + 'Failed' + }; 5 { + 'Aborted' + } + } } + }, + 'Description' | + Sort-Object -Property 'Date' -Descending + ForEach ($Update in $UpdateHistory) { + If (($Update.Operation -ne 'Other') -and ($Update.Title -match "\($KBNumber\)")) { + $LatestUpdateHistory = $Update + Break + } + } + If (($LatestUpdateHistory.Operation -eq 'Installation') -and ($LatestUpdateHistory.Status -eq 'Successful')) { + Write-Log -Message "Discovered the following Microsoft Update: `r`n$($LatestUpdateHistory | Format-List | Out-String)" -Source ${CmdletName} + $kbFound = $true + } + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($UpdateSession) + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($UpdateSearcher) + } + Else { + Write-Log -Message 'Unable to detect Windows update history via COM object.' -Source ${CmdletName} + } + } + + ## Return Result + If (-not $kbFound) { + Write-Log -Message "Microsoft Update [$kbNumber] is not installed." -Source ${CmdletName} + Write-Output -InputObject ($false) + } + Else { + Write-Log -Message "Microsoft Update [$kbNumber] is installed." -Source ${CmdletName} + Write-Output -InputObject ($true) + } + } + Catch { + Write-Log -Message "Failed discovering Microsoft Update [$kbNumber]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed discovering Microsoft Update [$kbNumber]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Install-MSUpdates +Function Install-MSUpdates { + <# +.SYNOPSIS + +Install all Microsoft Updates in a given directory. + +.DESCRIPTION + +Install all Microsoft Updates of type ".exe", ".msu", or ".msp" in a given directory (recursively search directory). + +.PARAMETER Directory + +Directory containing the updates. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + +.EXAMPLE + +Install-MSUpdates -Directory "$dirFiles\MSUpdates" + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$Directory + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Write-Log -Message "Recursively installing all Microsoft Updates in directory [$Directory]." -Source ${CmdletName} + + ## KB Number pattern match + $kbPattern = '(?i)kb\d{6,8}' + + ## Get all hotfixes and install if required + [IO.FileInfo[]]$files = Get-ChildItem -LiteralPath $Directory -Recurse -Include ('*.exe', '*.msu', '*.msp') + ForEach ($file in $files) { + If ($file.Name -match 'redist') { + [Version]$redistVersion = [Diagnostics.FileVersionInfo]::GetVersionInfo($file.FullName).ProductVersion + [String]$redistDescription = [Diagnostics.FileVersionInfo]::GetVersionInfo($file.FullName).FileDescription + + Write-Log -Message "Installing [$redistDescription $redistVersion]..." -Source ${CmdletName} + # Handle older redistributables (ie, VC++ 2005) + If ($redistDescription -match 'Win32 Cabinet Self-Extractor') { + Execute-Process -Path $file.FullName -Parameters '/q' -WindowStyle 'Hidden' -IgnoreExitCodes '*' + } + Else { + Execute-Process -Path $file.FullName -Parameters '/quiet /norestart' -WindowStyle 'Hidden' -IgnoreExitCodes '*' + } + } + Else { + # Get the KB number of the file + [String]$kbNumber = [RegEx]::Match($file.Name, $kbPattern).ToString() + If (-not $kbNumber) { + Continue + } + + # Check to see whether the KB is already installed + If (-not (Test-MSUpdates -KBNumber $kbNumber)) { + Write-Log -Message "KB Number [$KBNumber] was not detected and will be installed." -Source ${CmdletName} + Switch ($file.Extension) { + # Installation type for executables (i.e., Microsoft Office Updates) + '.exe' { + Execute-Process -Path $file.FullName -Parameters '/quiet /norestart' -WindowStyle 'Hidden' -IgnoreExitCodes '*' + } + # Installation type for Windows updates using Windows Update Standalone Installer + '.msu' { + Execute-Process -Path $exeWusa -Parameters "`"$($file.FullName)`" /quiet /norestart" -WindowStyle 'Hidden' -IgnoreExitCodes '*' + } + # Installation type for Windows Installer Patch + '.msp' { + Execute-MSI -Action 'Patch' -Path $file.FullName -IgnoreExitCodes '*' + } + } + } + Else { + Write-Log -Message "KB Number [$kbNumber] is already installed. Continue..." -Source ${CmdletName} + } + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-WindowTitle +Function Get-WindowTitle { + <# +.SYNOPSIS + +Search for an open window title and return details about the window. + +.DESCRIPTION + +Search for a window title. If window title searched for returns more than one result, then details for each window will be displayed. + +Returns the following properties for each window: WindowTitle, WindowHandle, ParentProcess, ParentProcessMainWindowHandle, ParentProcessId. + +Function does not work in SYSTEM context unless launched with "psexec.exe -s -i" to run it as an interactive process under the SYSTEM account. + +.PARAMETER WindowTitle + +The title of the application window to search for using regex matching. + +.PARAMETER GetAllWindowTitles + +Get titles for all open windows on the system. + +.PARAMETER DisableFunctionLogging + +Disables logging messages to the script log file. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Management.Automation.PSObject + +Returns a PSObject with the following properties: WindowTitle, WindowHandle, ParentProcess, ParentProcessMainWindowHandle, ParentProcessId. + +.EXAMPLE + +Get-WindowTitle -WindowTitle 'Microsoft Word' + +Gets details for each window that has the words "Microsoft Word" in the title. + +.EXAMPLE + +Get-WindowTitle -GetAllWindowTitles + +Gets details for all windows with a title. + +.EXAMPLE + +Get-WindowTitle -GetAllWindowTitles | Where-Object { $_.ParentProcess -eq 'WINWORD' } + +Get details for all windows belonging to Microsoft Word process with name "WINWORD". + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, ParameterSetName = 'SearchWinTitle')] + [AllowEmptyString()] + [String]$WindowTitle, + [Parameter(Mandatory = $true, ParameterSetName = 'GetAllWinTitles')] + [ValidateNotNullorEmpty()] + [Switch]$GetAllWindowTitles = $false, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Switch]$DisableFunctionLogging = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + If ($PSCmdlet.ParameterSetName -eq 'SearchWinTitle') { + If (-not $DisableFunctionLogging) { + Write-Log -Message "Finding open window title(s) [$WindowTitle] using regex matching." -Source ${CmdletName} + } + } + ElseIf ($PSCmdlet.ParameterSetName -eq 'GetAllWinTitles') { + If (-not $DisableFunctionLogging) { + Write-Log -Message 'Finding all open window title(s).' -Source ${CmdletName} + } + } + + ## Get all window handles for visible windows + [IntPtr[]]$VisibleWindowHandles = [PSADT.UiAutomation]::EnumWindows() | Where-Object { [PSADT.UiAutomation]::IsWindowVisible($_) } + + ## Discover details about each visible window that was discovered + ForEach ($VisibleWindowHandle in $VisibleWindowHandles) { + If (-not $VisibleWindowHandle) { + Continue + } + ## Get the window title + [String]$VisibleWindowTitle = [PSADT.UiAutomation]::GetWindowText($VisibleWindowHandle) + If ($VisibleWindowTitle) { + ## Get the process that spawned the window + [Diagnostics.Process]$Process = Get-Process -ErrorAction 'Stop' | Where-Object { $_.Id -eq [PSADT.UiAutomation]::GetWindowThreadProcessId($VisibleWindowHandle) } + If ($Process) { + ## Build custom object with details about the window and the process + [PSObject]$VisibleWindow = New-Object -TypeName 'PSObject' -Property @{ + WindowTitle = $VisibleWindowTitle + WindowHandle = $VisibleWindowHandle + ParentProcess = $Process.ProcessName + ParentProcessMainWindowHandle = $Process.MainWindowHandle + ParentProcessId = $Process.Id + } + + ## Only save/return the window and process details which match the search criteria + If ($PSCmdlet.ParameterSetName -eq 'SearchWinTitle') { + $MatchResult = $VisibleWindow.WindowTitle -match $WindowTitle + If ($MatchResult) { + [PSObject[]]$VisibleWindows += $VisibleWindow + } + } + ElseIf ($PSCmdlet.ParameterSetName -eq 'GetAllWinTitles') { + [PSObject[]]$VisibleWindows += $VisibleWindow + } + } + } + } + } + Catch { + If (-not $DisableFunctionLogging) { + Write-Log -Message "Failed to get requested window title(s). `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + } + End { + Write-Output -InputObject ($VisibleWindows) + + If ($DisableFunctionLogging) { + . $RevertScriptLogging + } + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Send-Keys +Function Send-Keys { + <# +.SYNOPSIS + +Send a sequence of keys to one or more application windows. + +.DESCRIPTION + +Send a sequence of keys to one or more application window. If window title searched for returns more than one window, then all of them will receive the sent keys. + +Function does not work in SYSTEM context unless launched with "psexec.exe -s -i" to run it as an interactive process under the SYSTEM account. + +.PARAMETER WindowTitle + +The title of the application window to search for using regex matching. + +.PARAMETER GetAllWindowTitles + +Get titles for all open windows on the system. + +.PARAMETER WindowHandle + +Send keys to a specific window where the Window Handle is already known. + +.PARAMETER Keys + +The sequence of keys to send. Info on Key input at: http://msdn.microsoft.com/en-us/library/System.Windows.Forms.SendKeys(v=vs.100).aspx + +.PARAMETER WaitSeconds + +An optional number of seconds to wait after the sending of the keys. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + +.EXAMPLE + +Send-Keys -WindowTitle 'foobar - Notepad' -Key 'Hello world' + +Send the sequence of keys "Hello world" to the application titled "foobar - Notepad". + +.EXAMPLE + +Send-Keys -WindowTitle 'foobar - Notepad' -Key 'Hello world' -WaitSeconds 5 + +Send the sequence of keys "Hello world" to the application titled "foobar - Notepad" and wait 5 seconds. + +.EXAMPLE + +Send-Keys -WindowHandle ([IntPtr]17368294) -Key 'Hello world' + +Send the sequence of keys "Hello world" to the application with a Window Handle of '17368294'. + +.NOTES + +.LINK + +http://msdn.microsoft.com/en-us/library/System.Windows.Forms.SendKeys(v=vs.100).aspx + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false, Position = 0)] + [AllowEmptyString()] + [ValidateNotNull()] + [String]$WindowTitle, + [Parameter(Mandatory = $false, Position = 1)] + [ValidateNotNullorEmpty()] + [Switch]$GetAllWindowTitles = $false, + [Parameter(Mandatory = $false, Position = 2)] + [ValidateNotNullorEmpty()] + [IntPtr]$WindowHandle, + [Parameter(Mandatory = $false, Position = 3)] + [ValidateNotNullorEmpty()] + [String]$Keys, + [Parameter(Mandatory = $false, Position = 4)] + [ValidateNotNullorEmpty()] + [Int32]$WaitSeconds + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + [ScriptBlock]$SendKeys = { + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [IntPtr]$WindowHandle + ) + Try { + ## Bring the window to the foreground + [Boolean]$IsBringWindowToFrontSuccess = [PSADT.UiAutomation]::BringWindowToFront($WindowHandle) + If (-not $IsBringWindowToFrontSuccess) { + Throw 'Failed to bring window to foreground.' + } + + ## Send the Key sequence + If ($Keys) { + [Boolean]$IsWindowModal = If ([PSADT.UiAutomation]::IsWindowEnabled($WindowHandle)) { + $false + } + Else { + $true + } + If ($IsWindowModal) { + Throw 'Unable to send keys to window because it may be disabled due to a modal dialog being shown.' + } + Write-Log -Message "Sending key(s) [$Keys] to window title [$($Window.WindowTitle)] with window handle [$WindowHandle]." -Source ${CmdletName} + [Windows.Forms.SendKeys]::SendWait($Keys) + If ($WaitSeconds) { + Write-Log -Message "Sleeping for [$WaitSeconds] seconds." -Source ${CmdletName} + Start-Sleep -Seconds $WaitSeconds + } + } + } + Catch { + Write-Log -Message "Failed to send keys to window title [$($Window.WindowTitle)] with window handle [$WindowHandle]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + } + Process { + Try { + If ($WindowHandle) { + [PSObject]$Window = Get-WindowTitle -GetAllWindowTitles | Where-Object { $_.WindowHandle -eq $WindowHandle } + If (-not $Window) { + Write-Log -Message "No windows with Window Handle [$WindowHandle] were discovered." -Severity 2 -Source ${CmdletName} + Return + } + & $SendKeys -WindowHandle $Window.WindowHandle + } + Else { + [Hashtable]$GetWindowTitleSplat = @{} + If ($GetAllWindowTitles) { + $GetWindowTitleSplat.Add( 'GetAllWindowTitles', $GetAllWindowTitles) + } + Else { + $GetWindowTitleSplat.Add( 'WindowTitle', $WindowTitle) + } + [PSObject[]]$AllWindows = Get-WindowTitle @GetWindowTitleSplat + If (-not $AllWindows) { + Write-Log -Message 'No windows with the specified details were discovered.' -Severity 2 -Source ${CmdletName} + Return + } + + ForEach ($Window in $AllWindows) { + & $SendKeys -WindowHandle $Window.WindowHandle + } + } + } + Catch { + Write-Log -Message "Failed to send keys to specified window. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Test-Battery +Function Test-Battery { + <# +.SYNOPSIS + +Tests whether the local machine is running on AC power or not. + +.DESCRIPTION + +Tests whether the local machine is running on AC power and returns true/false. For detailed information, use -PassThru option. + +.PARAMETER PassThru + +Outputs a hashtable containing the following properties: + +IsLaptop, IsUsingACPower, ACPowerLineStatus, BatteryChargeStatus, BatteryLifePercent, BatteryLifeRemaining, BatteryFullLifetime + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Hashtable. + +Returns a hashtable containing the following properties +- IsLaptop +- IsUsingACPower +- ACPowerLineStatus +- BatteryChargeStatus +- BatteryLifePercent +- BatteryLifeRemaining +- BatteryFullLifetime + +.EXAMPLE + +Test-Battery + +.EXAMPLE + +(Test-Battery -PassThru).IsLaptop + +Determines if the current system is a laptop or not. + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$PassThru = $false + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + ## Initialize a hashtable to store information about system type and power status + [Hashtable]$SystemTypePowerStatus = @{ } + } + Process { + Write-Log -Message 'Checking if system is using AC power or if it is running on battery...' -Source ${CmdletName} + + [Windows.Forms.PowerStatus]$PowerStatus = [Windows.Forms.SystemInformation]::PowerStatus + + ## Get the system power status. Indicates whether the system is using AC power or if the status is unknown. Possible values: + # Offline : The system is not using AC power. + # Online : The system is using AC power. + # Unknown : The power status of the system is unknown. + [String]$PowerLineStatus = $PowerStatus.PowerLineStatus + $SystemTypePowerStatus.Add('ACPowerLineStatus', $PowerStatus.PowerLineStatus) + + ## Get the current battery charge status. Possible values: High, Low, Critical, Charging, NoSystemBattery, Unknown. + [String]$BatteryChargeStatus = $PowerStatus.BatteryChargeStatus + $SystemTypePowerStatus.Add('BatteryChargeStatus', $PowerStatus.BatteryChargeStatus) + + ## Get the approximate amount, from 0.00 to 1.0, of full battery charge remaining. + # This property can report 1.0 when the battery is damaged and Windows can't detect a battery. + # Therefore, this property is only indicative of battery charge remaining if 'BatteryChargeStatus' property is not reporting 'NoSystemBattery' or 'Unknown'. + [Single]$BatteryLifePercent = $PowerStatus.BatteryLifePercent + If (($BatteryChargeStatus -eq 'NoSystemBattery') -or ($BatteryChargeStatus -eq 'Unknown')) { + [Single]$BatteryLifePercent = 0.0 + } + $SystemTypePowerStatus.Add('BatteryLifePercent', $PowerStatus.BatteryLifePercent) + + ## The reported approximate number of seconds of battery life remaining. It will report -1 if the remaining life is unknown because the system is on AC power. + [Int32]$BatteryLifeRemaining = $PowerStatus.BatteryLifeRemaining + $SystemTypePowerStatus.Add('BatteryLifeRemaining', $PowerStatus.BatteryLifeRemaining) + + ## Get the manufacturer reported full charge lifetime of the primary battery power source in seconds. + # The reported number of seconds of battery life available when the battery is fully charged, or -1 if it is unknown. + # This will only be reported if the battery supports reporting this information. You will most likely get -1, indicating unknown. + [Int32]$BatteryFullLifetime = $PowerStatus.BatteryFullLifetime + $SystemTypePowerStatus.Add('BatteryFullLifetime', $PowerStatus.BatteryFullLifetime) + + ## Determine if the system is using AC power + [Boolean]$OnACPower = $false + Switch ($PowerLineStatus) { + 'Online' { + Write-Log -Message 'System is using AC power.' -Source ${CmdletName} + $OnACPower = $true + } + 'Offline' { + Write-Log -Message 'System is using battery power.' -Source ${CmdletName} + } + 'Unknown' { + If (($BatteryChargeStatus -eq 'NoSystemBattery') -or ($BatteryChargeStatus -eq 'Unknown')) { + Write-Log -Message "System power status is [$PowerLineStatus] and battery charge status is [$BatteryChargeStatus]. This is most likely due to a damaged battery so we will report system is using AC power." -Source ${CmdletName} + $OnACPower = $true + } + Else { + Write-Log -Message "System power status is [$PowerLineStatus] and battery charge status is [$BatteryChargeStatus]. Therefore, we will report system is using battery power." -Source ${CmdletName} + } + } + } + $SystemTypePowerStatus.Add('IsUsingACPower', $OnACPower) + + ## Determine if the system is a laptop + [Boolean]$IsLaptop = $false + If (($BatteryChargeStatus -eq 'NoSystemBattery') -or ($BatteryChargeStatus -eq 'Unknown')) { + $IsLaptop = $false + } + Else { + $IsLaptop = $true + } + # Chassis Types + [Int32[]]$ChassisTypes = Get-WmiObject -Class 'Win32_SystemEnclosure' | Where-Object { $_.ChassisTypes } | Select-Object -ExpandProperty 'ChassisTypes' + Write-Log -Message "The following system chassis types were detected [$($ChassisTypes -join ',')]." -Source ${CmdletName} + ForEach ($ChassisType in $ChassisTypes) { + Switch ($ChassisType) { + 9 { + $IsLaptop = $true + } # 9=Laptop + 10 { + $IsLaptop = $true + } # 10=Notebook + 14 { + $IsLaptop = $true + } # 14=Sub Notebook + 3 { + $IsLaptop = $false + } # 3=Desktop + } + } + # Add IsLaptop property to hashtable + $SystemTypePowerStatus.Add('IsLaptop', $IsLaptop) + + If ($PassThru) { + Write-Output -InputObject ($SystemTypePowerStatus) + } + Else { + Write-Output -InputObject ($OnACPower) + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Test-NetworkConnection +Function Test-NetworkConnection { + <# +.SYNOPSIS + +Tests for an active local network connection, excluding wireless and virtual network adapters. + +.DESCRIPTION + +Tests for an active local network connection, excluding wireless and virtual network adapters, by querying the Win32_NetworkAdapter WMI class. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Boolean + +Returns $true if a wired network connection is detected, otherwise returns $false. + +.EXAMPLE + +Test-NetworkConnection + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Write-Log -Message 'Checking if system is using a wired network connection...' -Source ${CmdletName} + + [PSObject[]]$networkConnected = Get-WmiObject -Class 'Win32_NetworkAdapter' | Where-Object { ($_.NetConnectionStatus -eq 2) -and ($_.NetConnectionID -match 'Local' -or $_.NetConnectionID -match 'Ethernet') -and ($_.NetConnectionID -notmatch 'Wireless') -and ($_.Name -notmatch 'Virtual') } -ErrorAction 'SilentlyContinue' + [Boolean]$onNetwork = $false + If ($networkConnected) { + Write-Log -Message 'Wired network connection found.' -Source ${CmdletName} + [Boolean]$onNetwork = $true + } + Else { + Write-Log -Message 'Wired network connection not found.' -Source ${CmdletName} + } + + Write-Output -InputObject ($onNetwork) + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Test-PowerPoint +Function Test-PowerPoint { + <# +.SYNOPSIS + +Tests whether PowerPoint is running in either fullscreen slideshow mode or presentation mode. + +.DESCRIPTION + +Tests whether someone is presenting using PowerPoint in either fullscreen slideshow mode or presentation mode. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Boolean + +Returns $true if PowerPoint is running in either fullscreen slideshow mode or presentation mode, otherwise returns $false. + +.EXAMPLE + +Test-PowerPoint + +.NOTES + +This function can only execute detection logic if the process is in interactive mode. + +There is a possiblity of a false positive if the PowerPoint filename starts with "PowerPoint Slide Show". + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Checking if PowerPoint is in either fullscreen slideshow mode or presentation mode...' -Source ${CmdletName} + Try { + [Diagnostics.Process[]]$PowerPointProcess = Get-Process -ErrorAction 'Stop' | Where-Object { $_.ProcessName -eq 'POWERPNT' } + If ($PowerPointProcess) { + [Boolean]$IsPowerPointRunning = $true + Write-Log -Message 'PowerPoint application is running.' -Source ${CmdletName} + } + Else { + [Boolean]$IsPowerPointRunning = $false + Write-Log -Message 'PowerPoint application is not running.' -Source ${CmdletName} + } + } + Catch { + Throw + } + + [Nullable[Boolean]]$IsPowerPointFullScreen = $false + If ($IsPowerPointRunning) { + ## Detect if PowerPoint is in fullscreen mode or Presentation Mode, detection method only works if process is interactive + If ([Environment]::UserInteractive) { + # Check if "POWERPNT" process has a window with a title that begins with "PowerPoint Slide Show" or "Powerpoint-" for non-English language systems. + # There is a possiblity of a false positive if the PowerPoint filename starts with "PowerPoint Slide Show" + [PSObject]$PowerPointWindow = Get-WindowTitle -GetAllWindowTitles | Where-Object { $_.WindowTitle -match '^PowerPoint Slide Show' -or $_.WindowTitle -match '^PowerPoint-' } | Where-Object { $_.ParentProcess -eq 'POWERPNT' } | Select-Object -First 1 + If ($PowerPointWindow) { + [Nullable[Boolean]]$IsPowerPointFullScreen = $true + Write-Log -Message 'Detected that PowerPoint process [POWERPNT] has a window with a title that beings with [PowerPoint Slide Show] or [PowerPoint-].' -Source ${CmdletName} + } + Else { + Write-Log -Message 'Detected that PowerPoint process [POWERPNT] does not have a window with a title that beings with [PowerPoint Slide Show] or [PowerPoint-].' -Source ${CmdletName} + Try { + [Int32[]]$PowerPointProcessIDs = $PowerPointProcess | Select-Object -ExpandProperty 'Id' -ErrorAction 'Stop' + Write-Log -Message "PowerPoint process [POWERPNT] has process id(s) [$($PowerPointProcessIDs -join ', ')]." -Source ${CmdletName} + } + Catch { + Write-Log -Message "Unable to retrieve process id(s) for [POWERPNT] process. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + } + } + + ## If previous detection method did not detect PowerPoint in fullscreen mode, then check if PowerPoint is in Presentation Mode (check only works on Windows Vista or higher) + If ((-not $IsPowerPointFullScreen) -and (([Version]$envOSVersion).Major -gt 5)) { + # Note: below method does not detect PowerPoint presentation mode if the presentation is on a monitor that does not have current mouse input control + [String]$UserNotificationState = [PSADT.UiAutomation]::GetUserNotificationState() + Write-Log -Message "Detected user notification state [$UserNotificationState]." -Source ${CmdletName} + Switch ($UserNotificationState) { + 'PresentationMode' { + Write-Log -Message 'Detected that system is in [Presentation Mode].' -Source ${CmdletName} + [Nullable[Boolean]]$IsPowerPointFullScreen = $true + } + 'FullScreenOrPresentationModeOrLoginScreen' { + If (([String]$PowerPointProcessIDs) -and ($PowerPointProcessIDs -contains [PSADT.UIAutomation]::GetWindowThreadProcessID([PSADT.UIAutomation]::GetForeGroundWindow()))) { + Write-Log -Message 'Detected that fullscreen foreground window matches PowerPoint process id.' -Source ${CmdletName} + [Nullable[Boolean]]$IsPowerPointFullScreen = $true + } + } + } + } + } + Else { + [Nullable[Boolean]]$IsPowerPointFullScreen = $null + Write-Log -Message 'Unable to run check to see if PowerPoint is in fullscreen mode or Presentation Mode because current process is not interactive. Configure script to run in interactive mode in your deployment tool. If using SCCM Application Model, then make sure "Allow users to view and interact with the program installation" is selected. If using SCCM Package Model, then make sure "Allow users to interact with this program" is selected.' -Severity 2 -Source ${CmdletName} + } + } + } + Catch { + [Nullable[Boolean]]$IsPowerPointFullScreen = $null + Write-Log -Message "Failed check to see if PowerPoint is running in fullscreen slideshow mode. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + End { + Write-Log -Message "PowerPoint is running in fullscreen mode [$IsPowerPointFullScreen]." -Source ${CmdletName} + Write-Output -InputObject ($IsPowerPointFullScreen) + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Invoke-SCCMTask +Function Invoke-SCCMTask { + <# +.SYNOPSIS + +Triggers SCCM to invoke the requested schedule task id. + +.DESCRIPTION + +Triggers SCCM to invoke the requested schedule task id. + +.PARAMETER ScheduleId + +Name of the schedule id to trigger. + +Options: HardwareInventory, SoftwareInventory, HeartbeatDiscovery, SoftwareInventoryFileCollection, RequestMachinePolicy, EvaluateMachinePolicy, +LocationServicesCleanup, SoftwareMeteringReport, SourceUpdate, PolicyAgentCleanup, RequestMachinePolicy2, CertificateMaintenance, PeerDistributionPointStatus, +PeerDistributionPointProvisioning, ComplianceIntervalEnforcement, SoftwareUpdatesAgentAssignmentEvaluation, UploadStateMessage, StateMessageManager, +SoftwareUpdatesScan, AMTProvisionCycle, UpdateStorePolicy, StateSystemBulkSend, ApplicationManagerPolicyAction, PowerManagementStartSummarizer + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + +.EXAMPLE + +Invoke-SCCMTask 'SoftwareUpdatesScan' + +.EXAMPLE + +Invoke-SCCMTask + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateSet('HardwareInventory', 'SoftwareInventory', 'HeartbeatDiscovery', 'SoftwareInventoryFileCollection', 'RequestMachinePolicy', 'EvaluateMachinePolicy', 'LocationServicesCleanup', 'SoftwareMeteringReport', 'SourceUpdate', 'PolicyAgentCleanup', 'RequestMachinePolicy2', 'CertificateMaintenance', 'PeerDistributionPointStatus', 'PeerDistributionPointProvisioning', 'ComplianceIntervalEnforcement', 'SoftwareUpdatesAgentAssignmentEvaluation', 'UploadStateMessage', 'StateMessageManager', 'SoftwareUpdatesScan', 'AMTProvisionCycle', 'UpdateStorePolicy', 'StateSystemBulkSend', 'ApplicationManagerPolicyAction', 'PowerManagementStartSummarizer')] + [String]$ScheduleID, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Invoke SCCM Schedule Task ID [$ScheduleId]..." -Source ${CmdletName} + + ## Make sure SCCM client is installed and running + Write-Log -Message 'Checking to see if SCCM Client service [ccmexec] is installed and running.' -Source ${CmdletName} + If (Test-ServiceExists -Name 'ccmexec') { + If ($(Get-Service -Name 'ccmexec' -ErrorAction 'SilentlyContinue').Status -ne 'Running') { + Throw "SCCM Client Service [ccmexec] exists but it is not in a 'Running' state." + } + } + Else { + Throw 'SCCM Client Service [ccmexec] does not exist. The SCCM Client may not be installed.' + } + + ## Determine the SCCM Client Version + Try { + [Version]$SCCMClientVersion = Get-WmiObject -Namespace 'ROOT\CCM' -Class 'CCM_InstalledComponent' -ErrorAction 'Stop' | Where-Object { $_.Name -eq 'SmsClient' } | Select-Object -ExpandProperty 'Version' -ErrorAction 'Stop' + If ($SCCMClientVersion) { + Write-Log -Message "Installed SCCM Client Version Number [$SCCMClientVersion]." -Source ${CmdletName} + } + Else { + Write-Log -Message "Failed to determine the SCCM client version number. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + Throw 'Failed to determine the SCCM client version number.' + } + } + Catch { + Write-Log -Message "Failed to determine the SCCM client version number. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + Throw 'Failed to determine the SCCM client version number.' + } + + ## Create a hashtable of Schedule IDs compatible with SCCM Client 2007 + [Hashtable]$ScheduleIds = @{ + HardwareInventory = '{00000000-0000-0000-0000-000000000001}'; # Hardware Inventory Collection Task + SoftwareInventory = '{00000000-0000-0000-0000-000000000002}'; # Software Inventory Collection Task + HeartbeatDiscovery = '{00000000-0000-0000-0000-000000000003}'; # Heartbeat Discovery Cycle + SoftwareInventoryFileCollection = '{00000000-0000-0000-0000-000000000010}'; # Software Inventory File Collection Task + RequestMachinePolicy = '{00000000-0000-0000-0000-000000000021}'; # Request Machine Policy Assignments + EvaluateMachinePolicy = '{00000000-0000-0000-0000-000000000022}'; # Evaluate Machine Policy Assignments + RefreshDefaultMp = '{00000000-0000-0000-0000-000000000023}'; # Refresh Default MP Task + RefreshLocationServices = '{00000000-0000-0000-0000-000000000024}'; # Refresh Location Services Task + LocationServicesCleanup = '{00000000-0000-0000-0000-000000000025}'; # Location Services Cleanup Task + SoftwareMeteringReport = '{00000000-0000-0000-0000-000000000031}'; # Software Metering Report Cycle + SourceUpdate = '{00000000-0000-0000-0000-000000000032}'; # Source Update Manage Update Cycle + PolicyAgentCleanup = '{00000000-0000-0000-0000-000000000040}'; # Policy Agent Cleanup Cycle + RequestMachinePolicy2 = '{00000000-0000-0000-0000-000000000042}'; # Request Machine Policy Assignments + CertificateMaintenance = '{00000000-0000-0000-0000-000000000051}'; # Certificate Maintenance Cycle + PeerDistributionPointStatus = '{00000000-0000-0000-0000-000000000061}'; # Peer Distribution Point Status Task + PeerDistributionPointProvisioning = '{00000000-0000-0000-0000-000000000062}'; # Peer Distribution Point Provisioning Status Task + ComplianceIntervalEnforcement = '{00000000-0000-0000-0000-000000000071}'; # Compliance Interval Enforcement + SoftwareUpdatesAgentAssignmentEvaluation = '{00000000-0000-0000-0000-000000000108}'; # Software Updates Agent Assignment Evaluation Cycle + UploadStateMessage = '{00000000-0000-0000-0000-000000000111}'; # Send Unsent State Messages + StateMessageManager = '{00000000-0000-0000-0000-000000000112}'; # State Message Manager Task + SoftwareUpdatesScan = '{00000000-0000-0000-0000-000000000113}'; # Force Update Scan + AMTProvisionCycle = '{00000000-0000-0000-0000-000000000120}'; # AMT Provision Cycle + } + + ## If SCCM 2012 Client or higher, modify hashtabe containing Schedule IDs so that it only has the ones compatible with this version of the SCCM client + If ($SCCMClientVersion.Major -ge 5) { + $ScheduleIds.Remove('PeerDistributionPointStatus') + $ScheduleIds.Remove('PeerDistributionPointProvisioning') + $ScheduleIds.Remove('ComplianceIntervalEnforcement') + $ScheduleIds.Add('UpdateStorePolicy', '{00000000-0000-0000-0000-000000000114}') # Update Store Policy + $ScheduleIds.Add('StateSystemBulkSend', '{00000000-0000-0000-0000-000000000116}') # State System Policy Bulk Send Low + $ScheduleIds.Add('ApplicationManagerPolicyAction', '{00000000-0000-0000-0000-000000000121}') # Application Manager Policy Action + $ScheduleIds.Add('PowerManagementStartSummarizer', '{00000000-0000-0000-0000-000000000131}') # Power Management Start Summarizer + } + + ## Determine if the requested Schedule ID is available on this version of the SCCM Client + If (-not $ScheduleIds.ContainsKey($ScheduleId)) { + Throw "The requested ScheduleId [$ScheduleId] is not available with this version of the SCCM Client [$SCCMClientVersion]." + } + + ## Trigger SCCM task + Write-Log -Message "Triggering SCCM Task ID [$ScheduleId]." -Source ${CmdletName} + [Management.ManagementClass]$SmsClient = [WMIClass]'ROOT\CCM:SMS_Client' + $null = $SmsClient.TriggerSchedule($ScheduleIds.$ScheduleID) + } + Catch { + Write-Log -Message "Failed to trigger SCCM Schedule Task ID [$($ScheduleIds.$ScheduleId)]. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to trigger SCCM Schedule Task ID [$($ScheduleIds.$ScheduleId)]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Install-SCCMSoftwareUpdates +Function Install-SCCMSoftwareUpdates { + <# +.SYNOPSIS + +Scans for outstanding SCCM updates to be installed and installs the pending updates. + +.DESCRIPTION + +Scans for outstanding SCCM updates to be installed and installs the pending updates. + +Only compatible with SCCM 2012 Client or higher. This function can take several minutes to run. + +.PARAMETER SoftwareUpdatesScanWaitInSeconds + +The amount of time to wait in seconds for the software updates scan to complete. Default is: 180 seconds. + +.PARAMETER WaitForPendingUpdatesTimeout + +The amount of time to wait for missing and pending updates to install before exiting the function. Default is: 45 minutes. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + +.EXAMPLE + +Install-SCCMSoftwareUpdates + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Int32]$SoftwareUpdatesScanWaitInSeconds = 180, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Timespan]$WaitForPendingUpdatesTimeout = $(New-TimeSpan -Minutes 45), + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Scanning for and installing pending SCCM software updates.' -Source ${CmdletName} + + ## Make sure SCCM client is installed and running + Write-Log -Message 'Checking to see if SCCM Client service [ccmexec] is installed and running.' -Source ${CmdletName} + If (Test-ServiceExists -Name 'ccmexec') { + If ($(Get-Service -Name 'ccmexec' -ErrorAction 'SilentlyContinue').Status -ne 'Running') { + Throw "SCCM Client Service [ccmexec] exists but it is not in a 'Running' state." + } + } + Else { + Throw 'SCCM Client Service [ccmexec] does not exist. The SCCM Client may not be installed.' + } + + ## Determine the SCCM Client Version + Try { + [Version]$SCCMClientVersion = Get-WmiObject -Namespace 'ROOT\CCM' -Class 'CCM_InstalledComponent' -ErrorAction 'Stop' | Where-Object { $_.Name -eq 'SmsClient' } | Select-Object -ExpandProperty 'Version' -ErrorAction 'Stop' + If ($SCCMClientVersion) { + Write-Log -Message "Installed SCCM Client Version Number [$SCCMClientVersion]." -Source ${CmdletName} + } + Else { + Write-Log -Message "Failed to determine the SCCM client version number. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + Throw 'Failed to determine the SCCM client version number.' + } + } + Catch { + Write-Log -Message "Failed to determine the SCCM client version number. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + Throw 'Failed to determine the SCCM client version number.' + } + # If SCCM 2007 Client or lower, exit function + If ($SCCMClientVersion.Major -le 4) { + Throw 'SCCM 2007 or lower, which is incompatible with this function, was detected on this system.' + } + + $StartTime = Get-Date + ## Trigger SCCM client scan for Software Updates + Write-Log -Message 'Triggering SCCM client scan for Software Updates...' -Source ${CmdletName} + Invoke-SCCMTask -ScheduleId 'SoftwareUpdatesScan' + + Write-Log -Message "The SCCM client scan for Software Updates has been triggered. The script is suspended for [$SoftwareUpdatesScanWaitInSeconds] seconds to let the update scan finish." -Source ${CmdletName} + Start-Sleep -Seconds $SoftwareUpdatesScanWaitInSeconds + + ## Find the number of missing updates + Try { + Write-Log -Message 'Getting the number of missing updates...' -Source ${CmdletName} + [Management.ManagementObject[]]$CMMissingUpdates = @(Get-WmiObject -Namespace 'ROOT\CCM\ClientSDK' -Query "SELECT * FROM CCM_SoftwareUpdate WHERE ComplianceState = '0'" -ErrorAction 'Stop') + } + Catch { + Write-Log -Message "Failed to find the number of missing software updates. `r`n$(Resolve-Error)" -Severity 2 -Source ${CmdletName} + Throw 'Failed to find the number of missing software updates.' + } + + ## Install missing updates and wait for pending updates to finish installing + If ($CMMissingUpdates.Count) { + # Install missing updates + Write-Log -Message "Installing missing updates. The number of missing updates is [$($CMMissingUpdates.Count)]." -Source ${CmdletName} + $CMInstallMissingUpdates = (Get-WmiObject -Namespace 'ROOT\CCM\ClientSDK' -Class 'CCM_SoftwareUpdatesManager' -List).InstallUpdates($CMMissingUpdates) + + # Wait for pending updates to finish installing or the timeout value to expire + Do { + Start-Sleep -Seconds 60 + [Array]$CMInstallPendingUpdates = @(Get-WmiObject -Namespace 'ROOT\CCM\ClientSDK' -Query 'SELECT * FROM CCM_SoftwareUpdate WHERE EvaluationState = 6 or EvaluationState = 7') + Write-Log -Message "The number of updates pending installation is [$($CMInstallPendingUpdates.Count)]." -Source ${CmdletName} + } While (($CMInstallPendingUpdates.Count -ne 0) -and ((New-TimeSpan -Start $StartTime -End $(Get-Date)) -lt $WaitForPendingUpdatesTimeout)) + } + Else { + Write-Log -Message 'There are no missing updates.' -Source ${CmdletName} + } + } + Catch { + Write-Log -Message "Failed to trigger installation of missing software updates. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to trigger installation of missing software updates: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Update-GroupPolicy +Function Update-GroupPolicy { + <# +.SYNOPSIS + +Performs a gpupdate command to refresh Group Policies on the local machine. + +.DESCRIPTION + +Performs a gpupdate command to refresh Group Policies on the local machine. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + +.EXAMPLE + +Update-GroupPolicy + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + [String[]]$GPUpdateCmds = '/C echo N | gpupdate.exe /Target:Computer /Force', '/C echo N | gpupdate.exe /Target:User /Force' + [Int32]$InstallCount = 0 + ForEach ($GPUpdateCmd in $GPUpdateCmds) { + Try { + If ($InstallCount -eq 0) { + [String]$InstallMsg = 'Updating Group Policies for the Machine' + } + Else { + [String]$InstallMsg = 'Updating Group Policies for the User' + } + Write-Log -Message "$($InstallMsg)..." -Source ${CmdletName} + [PSObject]$ExecuteResult = Execute-Process -Path "$envWinDir\System32\cmd.exe" -Parameters $GPUpdateCmd -WindowStyle 'Hidden' -PassThru -ExitOnProcessFailure $false + + If ($ExecuteResult.ExitCode -ne 0) { + If ($ExecuteResult.ExitCode -eq 60002) { + Throw "Execute-Process function failed with exit code [$($ExecuteResult.ExitCode)]." + } + Else { + Throw "gpupdate.exe failed with exit code [$($ExecuteResult.ExitCode)]." + } + } + $InstallCount++ + } + Catch { + Write-Log -Message "$($InstallMsg) failed. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "$($InstallMsg) failed: $($_.Exception.Message)" + } + Continue + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Enable-TerminalServerInstallMode +Function Enable-TerminalServerInstallMode { + <# +.SYNOPSIS + +Changes to user install mode for Remote Desktop Session Host/Citrix servers. + +.DESCRIPTION + +Changes to user install mode for Remote Desktop Session Host/Citrix servers. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + +.EXAMPLE + +Enable-TerminalServerInstallMode + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Changing terminal server into user install mode...' -Source ${CmdletName} + $terminalServerResult = & "$envWinDir\System32\change.exe" User /Install + + If ($global:LastExitCode -ne 1) { + Throw $terminalServerResult + } + } + Catch { + Write-Log -Message "Failed to change terminal server into user install mode. `r`n$(Resolve-Error) " -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to change terminal server into user install mode: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Disable-TerminalServerInstallMode +Function Disable-TerminalServerInstallMode { + <# +.SYNOPSIS + +Changes to user install mode for Remote Desktop Session Host/Citrix servers. + +.DESCRIPTION + +Changes to user install mode for Remote Desktop Session Host/Citrix servers. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + +.EXAMPLE + +Disable-TerminalServerInstallMode + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Changing terminal server into user execute mode...' -Source ${CmdletName} + $terminalServerResult = & "$envWinDir\System32\change.exe" User /Execute + + If ($global:LastExitCode -ne 1) { + Throw $terminalServerResult + } + } + Catch { + Write-Log -Message "Failed to change terminal server into user execute mode. `r`n$(Resolve-Error) " -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to change terminal server into user execute mode: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Set-ActiveSetup +Function Set-ActiveSetup { + <# +.SYNOPSIS + +Creates an Active Setup entry in the registry to execute a file for each user upon login. + +.DESCRIPTION + +Active Setup allows handling of per-user changes registry/file changes upon login. +A registry key is created in the HKLM registry hive which gets replicated to the HKCU hive when a user logs in. +If the "Version" value of the Active Setup entry in HKLM is higher than the version value in HKCU, the file referenced in "StubPath" is executed. + +This Function: + - Creates the registry entries in HKLM:SOFTWARE\Microsoft\Active Setup\Installed Components\$installName. + - Creates StubPath value depending on the file extension of the $StubExePath parameter. + - Handles Version value with YYYYMMDDHHMMSS granularity to permit re-installs on the same day and still trigger Active Setup after Version increase. + - Copies/overwrites the StubPath file to $StubExePath destination path if file exists in 'Files' subdirectory of script directory. + - Executes the StubPath file for the current user based on $ExecuteForCurrentUser (no need to logout/login to trigger Active Setup). + +.PARAMETER StubExePath + +Use this parameter to specify the destination path of the file that will be executed upon user login. + +Note: Place the file you want users to execute in the '\Files' subdirectory of the script directory and the toolkit will install it to the path specificed in this parameter. + +.PARAMETER Arguments + +Arguments to pass to the file being executed. + +.PARAMETER Description + +Description for the Active Setup. Users will see "Setting up personalized settings for: $Description" at logon. Default is: $installName. + +.PARAMETER Key + +Name of the registry key for the Active Setup entry. Default is: $installName. + +.PARAMETER Version + +Optional. Specify version for Active setup entry. Active Setup is not triggered if Version value has more than 8 consecutive digits. Use commas to get around this limitation. Default: YYYYMMDDHHMMSS + +Note: + - Do not use this parameter if it is not necessary. PSADT will handle this parameter automatically using the time of the installation as the version number. + - In Windows 10, Scripts and EXEs might be blocked by AppLocker. Ensure that the path given to -StubExePath will permit end users to run Scripts and EXEs unelevated. + +.PARAMETER Locale + +Optional. Arbitrary string used to specify the installation language of the file being executed. Not replicated to HKCU. + +.PARAMETER PurgeActiveSetupKey + +Remove Active Setup entry from HKLM registry hive. Will also load each logon user's HKCU registry hive to remove Active Setup entry. Function returns after purging. + +.PARAMETER DisableActiveSetup + +Disables the Active Setup entry so that the StubPath file will not be executed. This also disables -ExecuteForCurrentUser + +.PARAMETER ExecuteForCurrentUser + +Specifies whether the StubExePath should be executed for the current user. Since this user is already logged in, the user won't have the application started without logging out and logging back in. Default: $true + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.Boolean + +Returns $true if Active Setup entry was created or updated, $false if Active Setup entry was not created or updated. + +.EXAMPLE + +Set-ActiveSetup -StubExePath 'C:\Users\Public\Company\ProgramUserConfig.vbs' -Arguments '/Silent' -Description 'Program User Config' -Key 'ProgramUserConfig' -Locale 'en' + +.EXAMPLE + +Set-ActiveSetup -StubExePath "$envWinDir\regedit.exe" -Arguments "/S `"%SystemDrive%\Program Files (x86)\PS App Deploy\PSAppDeployHKCUSettings.reg`"" -Description 'PS App Deploy Config' -Key 'PS_App_Deploy_Config' -ContinueOnError $true + +.EXAMPLE + +Set-ActiveSetup -Key 'ProgramUserConfig' -PurgeActiveSetupKey + +Deletes "ProgramUserConfig" active setup entry from all registry hives. + +.NOTES + +Original code borrowed from: Denis St-Pierre (Ottawa, Canada), Todd MacNaught (Ottawa, Canada) + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true, ParameterSetName = 'Create')] + [ValidateNotNullorEmpty()] + [String]$StubExePath, + [Parameter(Mandatory = $false, ParameterSetName = 'Create')] + [ValidateNotNullorEmpty()] + [String]$Arguments, + [Parameter(Mandatory = $false, ParameterSetName = 'Create')] + [ValidateNotNullorEmpty()] + [String]$Description = $installName, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$Key = $installName, + [Parameter(Mandatory = $false, ParameterSetName = 'Create')] + [ValidateNotNullorEmpty()] + [String]$Version = ((Get-Date -Format 'yyMM,ddHH,mmss').ToString()), # Ex: 1405,1515,0522 + [Parameter(Mandatory = $false, ParameterSetName = 'Create')] + [ValidateNotNullorEmpty()] + [String]$Locale, + [Parameter(Mandatory = $false, ParameterSetName = 'Create')] + [ValidateNotNullorEmpty()] + [Switch]$DisableActiveSetup = $false, + [Parameter(Mandatory = $true, ParameterSetName = 'Purge')] + [Switch]$PurgeActiveSetupKey, + [Parameter(Mandatory = $false, ParameterSetName = 'Create')] + [ValidateNotNullorEmpty()] + [Boolean]$ExecuteForCurrentUser = $true, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [Boolean]$ContinueOnError = $true + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + [String]$ActiveSetupKey = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\$Key" + [String]$HKCUActiveSetupKey = "Registry::HKEY_CURRENT_USER\Software\Microsoft\Active Setup\Installed Components\$Key" + + ## Delete Active Setup registry entry from the HKLM hive and for all logon user registry hives on the system + If ($PurgeActiveSetupKey) { + Write-Log -Message "Removing Active Setup entry [$ActiveSetupKey]." -Source ${CmdletName} + Remove-RegistryKey -Key $ActiveSetupKey -Recurse + + Write-Log -Message "Removing Active Setup entry [$HKCUActiveSetupKey] for all log on user registry hives on the system." -Source ${CmdletName} + [ScriptBlock]$RemoveHKCUActiveSetupKey = { + If (Get-RegistryKey -Key $HKCUActiveSetupKey -SID $RunAsActiveUser.SID) { + Remove-RegistryKey -Key $HKCUActiveSetupKey -SID $RunAsActiveUser.SID -Recurse + } + } + Invoke-HKCURegistrySettingsForAllUsers -RegistrySettings $RemoveHKCUActiveSetupKey -UserProfiles (Get-UserProfiles -ExcludeDefaultUser) + Return + } + + ## Verify a file with a supported file extension was specified in $StubExePath + [String[]]$StubExePathFileExtensions = '.exe', '.vbs', '.cmd', '.ps1', '.js' + [String]$StubExeExt = [IO.Path]::GetExtension($StubExePath) + If ($StubExePathFileExtensions -notcontains $StubExeExt) { + Throw "Unsupported Active Setup StubPath file extension [$StubExeExt]." + } + + ## Copy file to $StubExePath from the 'Files' subdirectory of the script directory (if it exists there) + [String]$StubExePath = [Environment]::ExpandEnvironmentVariables($StubExePath) + [String]$ActiveSetupFileName = [IO.Path]::GetFileName($StubExePath) + [String]$StubExeFile = Join-Path -Path $dirFiles -ChildPath $ActiveSetupFileName + If (Test-Path -LiteralPath $StubExeFile -PathType 'Leaf') { + # This will overwrite the StubPath file if $StubExePath already exists on target + Copy-File -Path $StubExeFile -Destination $StubExePath -ContinueOnError $false + } + + ## Check if the $StubExePath file exists + If (-not (Test-Path -LiteralPath $StubExePath -PathType 'Leaf')) { + Throw "Active Setup StubPath file [$ActiveSetupFileName] is missing." + } + + ## Define Active Setup StubPath according to file extension of $StubExePath + Switch ($StubExeExt) { + '.exe' { + [String]$CUStubExePath = "$StubExePath" + [String]$CUArguments = $Arguments + [String]$StubPath = "`"$CUStubExePath`"" + } + '.js' { + [String]$CUStubExePath = "$envWinDir\System32\cscript.exe" + [String]$CUArguments = "//nologo `"$StubExePath`"" + [String]$StubPath = "`"$CUStubExePath`" $CUArguments" + } + '.vbs' { + [String]$CUStubExePath = "$envWinDir\System32\cscript.exe" + [String]$CUArguments = "//nologo `"$StubExePath`"" + [String]$StubPath = "`"$CUStubExePath`" $CUArguments" + } + '.cmd' { + [String]$CUStubExePath = "$envWinDir\System32\cmd.exe" + [String]$CUArguments = "/C `"$StubExePath`"" + [String]$StubPath = "`"$CUStubExePath`" $CUArguments" + } + '.ps1' { + [String]$CUStubExePath = "$PSHOME\powershell.exe" + [String]$CUArguments = "-ExecutionPolicy Bypass -NoProfile -NoLogo -WindowStyle Hidden -Command `"& {& `\`"$StubExePath`\`"}`"" + [String]$StubPath = "`"$CUStubExePath`" $CUArguments" + } + } + If ($Arguments) { + [String]$StubPath = "$StubPath $Arguments" + If ($StubExeExt -ne '.exe') { + [String]$CUArguments = "$CUArguments $Arguments" + } + } + + [ScriptBlock]$TestActiveSetup = { + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$HKLMKey, + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$HKCUKey, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$UserSID + ) + If ($UserSID) { + $HKCUProps = (Get-RegistryKey -Key $HKCUKey -SID $UserSID -ContinueOnError $true) + } + Else { + $HKCUProps = (Get-RegistryKey -Key $HKCUKey -ContinueOnError $true) + } + + $HKLMProps = (Get-RegistryKey -Key $HKLMKey -ContinueOnError $true) + [String]$HKCUVer = $HKCUProps.Version + [String]$HKLMVer = $HKLMProps.Version + [Int32]$HKLMInst = $HKLMProps.IsInstalled + + # HKLM entry not present. Nothing to run. + If (-not $HKLMProps) { + Write-Log 'HKLM active setup entry is not present.' -Source ${CmdletName} + Return ($false) + } + # HKLM entry present, but disabled. Nothing to run. + If ($HKLMInst -eq 0) { + Write-Log 'HKLM active setup entry is present, but it is disabled (IsInstalled set to 0).' -Source ${CmdletName} + Return ($false) + } + # HKLM entry present and HKCU entry is not. Run the StubPath. + If (-not $HKCUProps) { + Write-Log 'HKLM active setup entry is present. HKCU active setup entry is not present.' -Source ${CmdletName} + Return ($true) + } + # Both entries present. HKLM entry does not have Version property. Nothing to run. + If (-not $HKLMVer) { + Write-Log 'HKLM and HKCU active setup entries are present. HKLM Version property is missing.' -Source ${CmdletName} + Return ($false) + } + # Both entries present. HKLM entry has Version property, but HKCU entry does not. Run the StubPath. + If (-not $HKCUVer) { + Write-Log 'HKLM and HKCU active setup entries are present. HKCU Version property is missing.' -Source ${CmdletName} + Return ($true) + } + + # Remove invalid characters from Version property. Only digits and commas are allowed. + [String]$HKLMValidVer = '' + For ($i = 0; $i -lt $HKLMVer.Length; $i++) { + If ([Char]::IsDigit($HKLMVer[$i]) -or ($HKLMVer[$i] -eq ',')) { + $HKLMValidVer += $HKLMVer[$i] + } + } + + [String]$HKCUValidVer = '' + For ($i = 0; $i -lt $HKCUVer.Length; $i++) { + If ([Char]::IsDigit($HKCUVer[$i]) -or ($HKCUVer[$i] -eq ',')) { + $HKCUValidVer += $HKCUVer[$i] + } + } + + # After cleanup, the HKLM Version property is empty. Considering it missing. HKCU is present so nothing to run. + If (-not $HKLMValidVer) { + Write-Log 'HKLM and HKCU active setup entries are present. HKLM Version property is invalid.' -Source ${CmdletName} + Return ($false) + } + + # After cleanup, the HKCU Version property is empty while HKLM Version property is not. Run the StubPath. + If (-not $HKCUValidVer) { + Write-Log 'HKLM and HKCU active setup entries are present. HKCU Version property is invalid.' -Source ${CmdletName} + Return ($true) + } + + ## Both entries present, with a Version property. Compare the Versions. + # Convert the version property to Version type and compare + [Version]$VersionHKLMValidVer = $null + [Version]$VersionHKCUValidVer = $null + Try { + [Version]$VersionHKLMValidVer = [Version]$HKLMValidVer.Replace(',','.') + [Version]$VersionHKCUValidVer = [Version]$HKCUValidVer.Replace(',','.') + + If ($VersionHKLMValidVer -gt $VersionHKCUValidVer) { + # HKLM is greater, run the StubPath. + Write-Log "HKLM and HKCU active setup entries are present. Both contain Version properties, and the HKLM Version is greater." -Source ${CmdletName} + Return ($true) + } + Else { + # The HKCU version is equal or higher than HKLM version, Nothing to run + Write-Log 'HKLM and HKCU active setup entries are present. Both contain Version properties. However, they are either the same or the HKCU Version property is higher.' -Source ${CmdletName} + Return ($false) + } + } + Catch { + # Failed to convert version property to Version type. + } + + # Check whether the Versions were split into the same number of strings + # Split the version by commas + [String[]]$SplitHKLMValidVer = $HKLMValidVer.Split(',') + [String[]]$SplitHKCUValidVer = $HKCUValidVer.Split(',') + If ($SplitHKLMValidVer.Count -ne $SplitHKCUValidVer.Count) { + # The versions are different length - more commas + If ($SplitHKLMValidVer.Count -gt $SplitHKCUValidVer.Count) { + # HKLM is longer, Run the StubPath + Write-Log "HKLM and HKCU active setup entries are present. Both contain Version properties. However, the HKLM Version has more version fields." -Source ${CmdletName} + Return ($true) + } + Else { + # HKCU is longer, Nothing to run + Write-Log "HKLM and HKCU active setup entries are present. Both contain Version properties. However, the HKCU Version has more version fields." -Source ${CmdletName} + Return ($false) + } + } + + # The Versions have the same number of strings. Compare them + Try { + For ($i = 0; $i -lt $SplitHKLMValidVer.Count; $i++) { + # Parse the version is UINT64 + [UInt64]$ParsedHKLMVer = [UInt64]::Parse($SplitHKLMValidVer[$i]) + [UInt64]$ParsedHKCUVer = [UInt64]::Parse($SplitHKCUValidVer[$i]) + # The HKCU ver is lower, Run the StubPath + If ($ParsedHKCUVer -lt $ParsedHKLMVer) { + Write-Log 'HKLM and HKCU active setup entries are present. Both Version properties are present and valid. However, HKCU Version property is lower.' -Source ${CmdletName} + Return ($true) + } + } + # The HKCU version is equal or higher than HKLM version, Nothing to run + Write-Log 'HKLM and HKCU active setup entries are present. Both Version properties are present and valid. However, they are either the same or HKCU Version property is higher.' -Source ${CmdletName} + Return ($false) + } + Catch { + # Failed to parse strings as UInt64, Run the StubPath + Write-Log 'HKLM and HKCU active setup entries are present. Both Version properties are present and valid. However, parsing string numerics to 64-bit integers failed.' -Severity 2 -Source ${CmdletName} + Return ($true) + } + } + + ## Create the Active Setup entry in the registry + [ScriptBlock]$SetActiveSetupRegKeys = { + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullorEmpty()] + [String]$ActiveSetupRegKey, + [Parameter(Mandatory = $false)] + [ValidateNotNullorEmpty()] + [String]$SID + ) + If ($SID) { + Set-RegistryKey -Key $ActiveSetupRegKey -Name '(Default)' -Value $Description -SID $SID -ContinueOnError $false + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'Version' -Value $Version -SID $SID -ContinueOnError $false + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'StubPath' -Value $StubPath -Type 'String' -SID $SID -ContinueOnError $false + If ($Locale) { + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'Locale' -Value $Locale -SID $SID -ContinueOnError $false + } + # Only Add IsInstalled to HKLM + If ($ActiveSetupRegKey.Contains('HKEY_LOCAL_MACHINE')) { + If ($DisableActiveSetup) { + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'IsInstalled' -Value 0 -Type 'DWord' -SID $SID -ContinueOnError $false + } + Else { + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'IsInstalled' -Value 1 -Type 'DWord' -SID $SID -ContinueOnError $false + } + } + } + Else { + Set-RegistryKey -Key $ActiveSetupRegKey -Name '(Default)' -Value $Description -ContinueOnError $false + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'Version' -Value $Version -ContinueOnError $false + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'StubPath' -Value $StubPath -Type 'String' -ContinueOnError $false + If ($Locale) { + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'Locale' -Value $Locale -ContinueOnError $false + } + # Only Add IsInstalled to HKLM + If ($ActiveSetupRegKey.Contains('HKEY_LOCAL_MACHINE')) { + If ($DisableActiveSetup) { + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'IsInstalled' -Value 0 -Type 'DWord' -ContinueOnError $false + } + Else { + Set-RegistryKey -Key $ActiveSetupRegKey -Name 'IsInstalled' -Value 1 -Type 'DWord' -ContinueOnError $false + } + } + } + } + + Write-Log -Message "Adding Active Setup Key for local machine: [$ActiveSetupKey]." -Source ${CmdletName} + & $SetActiveSetupRegKeys -ActiveSetupRegKey $ActiveSetupKey + + ## Execute the StubPath file for the current user as long as not in Session 0 + If ($ExecuteForCurrentUser) { + If ($SessionZero) { + If ($RunAsActiveUser) { + # Skip if Active Setup reg key is present and Version is equal or higher + [Boolean]$InstallNeeded = (& $TestActiveSetup -HKLMKey $ActiveSetupKey -HKCUKey $HKCUActiveSetupKey -UserSID $RunAsActiveUser.SID) + If ($InstallNeeded) { + Write-Log -Message "Session 0 detected: Executing Active Setup StubPath file for currently logged in user [$($RunAsActiveUser.NTAccount)]." -Source ${CmdletName} + If ($CUArguments) { + Execute-ProcessAsUser -Path $CUStubExePath -Parameters $CUArguments -Wait -ContinueOnError $true + } + Else { + Execute-ProcessAsUser -Path $CUStubExePath -Wait -ContinueOnError $true + } + + Write-Log -Message "Adding Active Setup Key for the current user: [$HKCUActiveSetupKey]." -Source ${CmdletName} + & $SetActiveSetupRegKeys -ActiveSetupRegKey $HKCUActiveSetupKey -SID $RunAsActiveUser.SID + } + Else { + Write-Log -Message "Session 0 detected: Skipping executing Active Setup StubPath file for currently logged in user [$($RunAsActiveUser.NTAccount)]." -Source ${CmdletName} -Severity 2 + } + } + Else { + Write-Log -Message 'Session 0 detected: No logged in users detected. Active Setup StubPath file will execute when users first log into their account.' -Source ${CmdletName} + } + } + Else { + # Skip if Active Setup reg key is present and Version is equal or higher + [Boolean]$InstallNeeded = (& $TestActiveSetup -HKLMKey $ActiveSetupKey -HKCUKey $HKCUActiveSetupKey) + If ($InstallNeeded) { + Write-Log -Message 'Executing Active Setup StubPath file for the current user.' -Source ${CmdletName} + If ($CUArguments) { + Execute-Process -FilePath $CUStubExePath -Parameters $CUArguments -ExitOnProcessFailure $false + } + Else { + Execute-Process -FilePath $CUStubExePath -ExitOnProcessFailure $false + } + + Write-Log -Message "Adding Active Setup Key for the current user: [$HKCUActiveSetupKey]." -Source ${CmdletName} + & $SetActiveSetupRegKeys -ActiveSetupRegKey $HKCUActiveSetupKey + } + Else { + Write-Log -Message 'Skipping executing Active Setup StubPath file for current user.' -Source ${CmdletName} -Severity 2 + } + } + } + } + Catch { + Write-Log -Message "Failed to set Active Setup registry entry. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed to set Active Setup registry entry: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Test-ServiceExists +Function Test-ServiceExists { + <# +.SYNOPSIS + +Check to see if a service exists. + +.DESCRIPTION + +Check to see if a service exists (using WMI method because Get-Service will generate ErrorRecord if service doesn't exist). + +.PARAMETER Name + +Specify the name of the service. + +Note: Service name can be found by executing "Get-Service | Format-Table -AutoSize -Wrap" or by using the properties screen of a service in services.msc. + +.PARAMETER ComputerName + +Specify the name of the computer. Default is: the local computer. + +.PARAMETER PassThru + +Return the WMI service object. To see all the properties use: Test-ServiceExists -Name 'spooler' -PassThru | Get-Member + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + +.EXAMPLE + +Test-ServiceExists -Name 'wuauserv' + +.EXAMPLE + +Test-ServiceExists -Name 'testservice' -PassThru | Where-Object { $_ } | ForEach-Object { $_.Delete() } + +Check if a service exists and then delete it by using the -PassThru parameter. + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$ComputerName = $env:ComputerName, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$PassThru, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + Begin { + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + $ServiceObject = Get-WmiObject -ComputerName $ComputerName -Class 'Win32_Service' -Filter "Name='$Name'" -ErrorAction 'Stop' + # If nothing is returned from Win32_Service, check Win32_BaseService + If (-not $ServiceObject) { + $ServiceObject = Get-WmiObject -ComputerName $ComputerName -Class 'Win32_BaseService' -Filter "Name='$Name'" -ErrorAction 'Stop' + } + + If ($ServiceObject) { + Write-Log -Message "Service [$Name] exists." -Source ${CmdletName} + If ($PassThru) { + Write-Output -InputObject ($ServiceObject) + } + Else { + Write-Output -InputObject ($true) + } + } + Else { + Write-Log -Message "Service [$Name] does not exist." -Source ${CmdletName} + If ($PassThru) { + Write-Output -InputObject ($ServiceObject) + } + Else { + Write-Output -InputObject ($false) + } + } + } + Catch { + Write-Log -Message "Failed check to see if service [$Name] exists." -Severity 3 -Source ${CmdletName} + If (-not $ContinueOnError) { + Throw "Failed check to see if service [$Name] exists: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Stop-ServiceAndDependencies +Function Stop-ServiceAndDependencies { + <# +.SYNOPSIS + +Stop Windows service and its dependencies. + +.DESCRIPTION + +Stop Windows service and its dependencies. + +.PARAMETER Name + +Specify the name of the service. + +.PARAMETER ComputerName + +Specify the name of the computer. Default is: the local computer. + +.PARAMETER SkipServiceExistsTest + +Choose to skip the test to check whether or not the service exists if it was already done outside of this function. + +.PARAMETER SkipDependentServices + +Choose to skip checking for and stopping dependent services. Default is: $false. + +.PARAMETER PendingStatusWait + +The amount of time to wait for a service to get out of a pending state before continuing. Default is 60 seconds. + +.PARAMETER PassThru + +Return the System.ServiceProcess.ServiceController service object. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.ServiceProcess.ServiceController. + +Returns the service object. + +.EXAMPLE + +Stop-ServiceAndDependencies -Name 'wuauserv' + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$ComputerName = $env:ComputerName, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$SkipServiceExistsTest, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$SkipDependentServices, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Timespan]$PendingStatusWait = (New-TimeSpan -Seconds 60), + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$PassThru, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + Begin { + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + ## Check to see if the service exists + If ((-not $SkipServiceExistsTest) -and (-not (Test-ServiceExists -ComputerName $ComputerName -Name $Name -ContinueOnError $false))) { + Write-Log -Message "Service [$Name] does not exist." -Source ${CmdletName} -Severity 2 + Throw "Service [$Name] does not exist." + } + + ## Get the service object + Write-Log -Message "Getting the service object for service [$Name]." -Source ${CmdletName} + [ServiceProcess.ServiceController]$Service = Get-Service -ComputerName $ComputerName -Name $Name -ErrorAction 'Stop' + ## Wait up to 60 seconds if service is in a pending state + [String[]]$PendingStatus = 'ContinuePending', 'PausePending', 'StartPending', 'StopPending' + If ($PendingStatus -contains $Service.Status) { + Switch ($Service.Status) { + 'ContinuePending' { + $DesiredStatus = 'Running' + } + 'PausePending' { + $DesiredStatus = 'Paused' + } + 'StartPending' { + $DesiredStatus = 'Running' + } + 'StopPending' { + $DesiredStatus = 'Stopped' + } + } + Write-Log -Message "Waiting for up to [$($PendingStatusWait.TotalSeconds)] seconds to allow service pending status [$($Service.Status)] to reach desired status [$DesiredStatus]." -Source ${CmdletName} + $Service.WaitForStatus([ServiceProcess.ServiceControllerStatus]$DesiredStatus, $PendingStatusWait) + $Service.Refresh() + } + ## Discover if the service is currently running + Write-Log -Message "Service [$($Service.ServiceName)] with display name [$($Service.DisplayName)] has a status of [$($Service.Status)]." -Source ${CmdletName} + If ($Service.Status -ne 'Stopped') { + # Discover all dependent services that are running and stop them + If (-not $SkipDependentServices) { + Write-Log -Message "Discovering all dependent service(s) for service [$Name] which are not 'Stopped'." -Source ${CmdletName} + [ServiceProcess.ServiceController[]]$DependentServices = Get-Service -ComputerName $ComputerName -Name $Service.ServiceName -DependentServices -ErrorAction 'Stop' | Where-Object { $_.Status -ne 'Stopped' } + If ($DependentServices) { + ForEach ($DependentService in $DependentServices) { + Write-Log -Message "Stopping dependent service [$($DependentService.ServiceName)] with display name [$($DependentService.DisplayName)] and a status of [$($DependentService.Status)]." -Source ${CmdletName} + Try { + Stop-Service -InputObject (Get-Service -ComputerName $ComputerName -Name $DependentService.ServiceName -ErrorAction 'Stop') -Force -WarningAction 'SilentlyContinue' -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to stop dependent service [$($DependentService.ServiceName)] with display name [$($DependentService.DisplayName)] and a status of [$($DependentService.Status)]. Continue..." -Severity 2 -Source ${CmdletName} + Continue + } + } + } + Else { + Write-Log -Message "Dependent service(s) were not discovered for service [$Name]." -Source ${CmdletName} + } + } + # Stop the parent service + Write-Log -Message "Stopping parent service [$($Service.ServiceName)] with display name [$($Service.DisplayName)]." -Source ${CmdletName} + [ServiceProcess.ServiceController]$Service = Stop-Service -InputObject (Get-Service -ComputerName $ComputerName -Name $Service.ServiceName -ErrorAction 'Stop') -Force -PassThru -WarningAction 'SilentlyContinue' -ErrorAction 'Stop' + } + } + Catch { + Write-Log -Message "Failed to stop the service [$Name]. `r`n$(Resolve-Error)" -Source ${CmdletName} -Severity 3 + If (-not $ContinueOnError) { + Throw "Failed to stop the service [$Name]: $($_.Exception.Message)" + } + } + Finally { + # Return the service object if option selected + If ($PassThru -and $Service) { + Write-Output -InputObject ($Service) + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Start-ServiceAndDependencies +Function Start-ServiceAndDependencies { + <# +.SYNOPSIS + +Start Windows service and its dependencies. + +.DESCRIPTION + +Start Windows service and its dependencies. + +.PARAMETER Name + +Specify the name of the service. + +.PARAMETER ComputerName + +Specify the name of the computer. Default is: the local computer. + +.PARAMETER SkipServiceExistsTest + +Choose to skip the test to check whether or not the service exists if it was already done outside of this function. + +.PARAMETER SkipDependentServices + +Choose to skip checking for and starting dependent services. Default is: $false. + +.PARAMETER PendingStatusWait + +The amount of time to wait for a service to get out of a pending state before continuing. Default is 60 seconds. + +.PARAMETER PassThru + +Return the System.ServiceProcess.ServiceController service object. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.ServiceProcess.ServiceController. + +Returns the service object. + +.EXAMPLE + +Start-ServiceAndDependencies -Name 'wuauserv' + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$ComputerName = $env:ComputerName, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$SkipServiceExistsTest, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$SkipDependentServices, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Timespan]$PendingStatusWait = (New-TimeSpan -Seconds 60), + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Switch]$PassThru, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + Begin { + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + ## Check to see if the service exists + If ((-not $SkipServiceExistsTest) -and (-not (Test-ServiceExists -ComputerName $ComputerName -Name $Name -ContinueOnError $false))) { + Write-Log -Message "Service [$Name] does not exist." -Source ${CmdletName} -Severity 2 + Throw "Service [$Name] does not exist." + } + + ## Get the service object + Write-Log -Message "Getting the service object for service [$Name]." -Source ${CmdletName} + [ServiceProcess.ServiceController]$Service = Get-Service -ComputerName $ComputerName -Name $Name -ErrorAction 'Stop' + ## Wait up to 60 seconds if service is in a pending state + [String[]]$PendingStatus = 'ContinuePending', 'PausePending', 'StartPending', 'StopPending' + If ($PendingStatus -contains $Service.Status) { + Switch ($Service.Status) { + 'ContinuePending' { + $DesiredStatus = 'Running' + } + 'PausePending' { + $DesiredStatus = 'Paused' + } + 'StartPending' { + $DesiredStatus = 'Running' + } + 'StopPending' { + $DesiredStatus = 'Stopped' + } + } + Write-Log -Message "Waiting for up to [$($PendingStatusWait.TotalSeconds)] seconds to allow service pending status [$($Service.Status)] to reach desired status [$DesiredStatus]." -Source ${CmdletName} + $Service.WaitForStatus([ServiceProcess.ServiceControllerStatus]$DesiredStatus, $PendingStatusWait) + $Service.Refresh() + } + ## Discover if the service is currently stopped + Write-Log -Message "Service [$($Service.ServiceName)] with display name [$($Service.DisplayName)] has a status of [$($Service.Status)]." -Source ${CmdletName} + If ($Service.Status -ne 'Running') { + # Start the parent service + Write-Log -Message "Starting parent service [$($Service.ServiceName)] with display name [$($Service.DisplayName)]." -Source ${CmdletName} + [ServiceProcess.ServiceController]$Service = Start-Service -InputObject (Get-Service -ComputerName $ComputerName -Name $Service.ServiceName -ErrorAction 'Stop') -PassThru -WarningAction 'SilentlyContinue' -ErrorAction 'Stop' + + # Discover all dependent services that are stopped and start them + If (-not $SkipDependentServices) { + Write-Log -Message "Discover all dependent service(s) for service [$Name] which are not 'Running'." -Source ${CmdletName} + [ServiceProcess.ServiceController[]]$DependentServices = Get-Service -ComputerName $ComputerName -Name $Service.ServiceName -DependentServices -ErrorAction 'Stop' | Where-Object { $_.Status -ne 'Running' } + If ($DependentServices) { + ForEach ($DependentService in $DependentServices) { + Write-Log -Message "Starting dependent service [$($DependentService.ServiceName)] with display name [$($DependentService.DisplayName)] and a status of [$($DependentService.Status)]." -Source ${CmdletName} + Try { + Start-Service -InputObject (Get-Service -ComputerName $ComputerName -Name $DependentService.ServiceName -ErrorAction 'Stop') -WarningAction 'SilentlyContinue' -ErrorAction 'Stop' + } + Catch { + Write-Log -Message "Failed to start dependent service [$($DependentService.ServiceName)] with display name [$($DependentService.DisplayName)] and a status of [$($DependentService.Status)]. Continue..." -Severity 2 -Source ${CmdletName} + Continue + } + } + } + Else { + Write-Log -Message "Dependent service(s) were not discovered for service [$Name]." -Source ${CmdletName} + } + } + } + } + Catch { + Write-Log -Message "Failed to start the service [$Name]. `r`n$(Resolve-Error)" -Source ${CmdletName} -Severity 3 + If (-not $ContinueOnError) { + Throw "Failed to start the service [$Name]: $($_.Exception.Message)" + } + } + Finally { + # Return the service object if option selected + If ($PassThru -and $Service) { + Write-Output -InputObject ($Service) + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-ServiceStartMode +Function Get-ServiceStartMode { + <# +.SYNOPSIS + +Get the service startup mode. + +.DESCRIPTION + +Get the service startup mode. + +.PARAMETER Name + +Specify the name of the service. + +.PARAMETER ComputerName + +Specify the name of the computer. Default is: the local computer. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +System.ServiceProcess.ServiceController. + +Returns the service object. + +.EXAMPLE + +Get-ServiceStartMode -Name 'wuauserv' + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdLetBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$ComputerName = $env:ComputerName, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + Begin { + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message "Getting the service [$Name] startup mode." -Source ${CmdletName} + [String]$ServiceStartMode = (Get-WmiObject -ComputerName $ComputerName -Class 'Win32_Service' -Filter "Name='$Name'" -Property 'StartMode' -ErrorAction 'Stop').StartMode + ## If service start mode is set to 'Auto', change value to 'Automatic' to be consistent with 'Set-ServiceStartMode' function + If ($ServiceStartMode -eq 'Auto') { + $ServiceStartMode = 'Automatic' + } + + ## If on Windows Vista or higher, check to see if service is set to Automatic (Delayed Start) + If (($ServiceStartMode -eq 'Automatic') -and (([Version]$envOSVersion).Major -gt 5)) { + Try { + [String]$ServiceRegistryPath = "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\$Name" + [Int32]$DelayedAutoStart = Get-ItemProperty -LiteralPath $ServiceRegistryPath -ErrorAction 'Stop' | Select-Object -ExpandProperty 'DelayedAutoStart' -ErrorAction 'Stop' + If ($DelayedAutoStart -eq 1) { + $ServiceStartMode = 'Automatic (Delayed Start)' + } + } + Catch { + } + } + + Write-Log -Message "Service [$Name] startup mode is set to [$ServiceStartMode]." -Source ${CmdletName} + Write-Output -InputObject ($ServiceStartMode) + } + Catch { + Write-Log -Message "Failed to get the service [$Name] startup mode. `r`n$(Resolve-Error)" -Source ${CmdletName} -Severity 3 + If (-not $ContinueOnError) { + Throw "Failed to get the service [$Name] startup mode: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Set-ServiceStartMode +Function Set-ServiceStartMode { + <# +.SYNOPSIS + +Set the service startup mode. + +.DESCRIPTION + +Set the service startup mode. + +.PARAMETER Name + +Specify the name of the service. + +.PARAMETER ComputerName + +Specify the name of the computer. Default is: the local computer. + +.PARAMETER StartMode + +Specify startup mode for the service. Options: Automatic, Automatic (Delayed Start), Manual, Disabled, Boot, System. + +.PARAMETER ContinueOnError + +Continue if an error is encountered. Default is: $true. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + +.EXAMPLE + +Set-ServiceStartMode -Name 'wuauserv' -StartMode 'Automatic (Delayed Start)' + +.NOTES + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdLetBinding()] + Param ( + [Parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [String]$Name, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [String]$ComputerName = $env:ComputerName, + [Parameter(Mandatory = $true)] + [ValidateSet('Automatic', 'Automatic (Delayed Start)', 'Manual', 'Disabled', 'Boot', 'System')] + [String]$StartMode, + [Parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [Boolean]$ContinueOnError = $true + ) + Begin { + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + ## If on lower than Windows Vista and 'Automatic (Delayed Start)' selected, then change to 'Automatic' because 'Delayed Start' is not supported. + If (($StartMode -eq 'Automatic (Delayed Start)') -and (([Version]$envOSVersion).Major -lt 6)) { + $StartMode = 'Automatic' + } + + Write-Log -Message "Set service [$Name] startup mode to [$StartMode]." -Source ${CmdletName} + + ## Set the name of the start up mode that will be passed to sc.exe + [String]$ScExeStartMode = $StartMode + Switch ($StartMode) { + 'Automatic' { + $ScExeStartMode = 'Auto'; Break + } + 'Automatic (Delayed Start)' { + $ScExeStartMode = 'Delayed-Auto'; Break + } + 'Manual' { + $ScExeStartMode = 'Demand'; Break + } + } + + ## Set the start up mode using sc.exe. Note: we found that the ChangeStartMode method in the Win32_Service WMI class set services to 'Automatic (Delayed Start)' even when you specified 'Automatic' on Win7, Win8, and Win10. + $ChangeStartMode = & "$envWinDir\System32\sc.exe" config $Name start= $ScExeStartMode + + If ($global:LastExitCode -ne 0) { + Throw "sc.exe failed with exit code [$($global:LastExitCode)] and message [$ChangeStartMode]." + } + + Write-Log -Message "Successfully set service [$Name] startup mode to [$StartMode]." -Source ${CmdletName} + } + Catch { + Write-Log -Message "Failed to set service [$Name] startup mode to [$StartMode]. `r`n$(Resolve-Error)" -Source ${CmdletName} -Severity 3 + If (-not $ContinueOnError) { + Throw "Failed to set service [$Name] startup mode to [$StartMode]: $($_.Exception.Message)" + } + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-LoggedOnUser +Function Get-LoggedOnUser { + <# +.SYNOPSIS + +Get session details for all local and RDP logged on users. + +.DESCRIPTION + +Get session details for all local and RDP logged on users using Win32 APIs. Get the following session details: + NTAccount, SID, UserName, DomainName, SessionId, SessionName, ConnectState, IsCurrentSession, IsConsoleSession, IsUserSession, IsActiveUserSession + IsRdpSession, IsLocalAdmin, LogonTime, IdleTime, DisconnectTime, ClientName, ClientProtocolType, ClientDirectory, ClientBuildNumber + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + +.EXAMPLE + +Get-LoggedOnUser + +.NOTES + +Description of ConnectState property: + +Value Description +----- ----------- +Active A user is logged on to the session. +ConnectQuery The session is in the process of connecting to a client. +Connected A client is connected to the session. +Disconnected The session is active, but the client has disconnected from it. +Down The session is down due to an error. +Idle The session is waiting for a client to connect. +Initializing The session is initializing. +Listening The session is listening for connections. +Reset The session is being reset. +Shadowing This session is shadowing another session. + +Description of IsActiveUserSession property: + +- If a console user exists, then that will be the active user session. +- If no console user exists but users are logged in, such as on terminal servers, then the first logged-in non-console user that has ConnectState either 'Active' or 'Connected' is the active user. + +Description of IsRdpSession property: +- Gets a value indicating whether the user is associated with an RDP client session. + +Description of IsLocalAdmin property: +- Checks whether the user is a member of the Administrators group + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + Process { + Try { + Write-Log -Message 'Getting session information for all logged on users.' -Source ${CmdletName} + Write-Output -InputObject ([PSADT.QueryUser]::GetUserSessionInfo("$env:ComputerName")) + } + Catch { + Write-Log -Message "Failed to get session information for all logged on users. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + + +#region Function Get-PendingReboot +Function Get-PendingReboot { + <# +.SYNOPSIS + +Get the pending reboot status on a local computer. + +.DESCRIPTION + +Check WMI and the registry to determine if the system has a pending reboot operation from any of the following: +a) Component Based Servicing (Vista, Windows 2008) +b) Windows Update / Auto Update (XP, Windows 2003 / 2008) +c) SCCM 2012 Clients (DetermineIfRebootPending WMI method) +d) App-V Pending Tasks (global based Appv 5.0 SP2) +e) Pending File Rename Operations (XP, Windows 2003 / 2008) + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +PSObject + +Returns a custom object with the following properties +- ComputerName +- LastBootUpTime +- IsSystemRebootPending +- IsCBServicingRebootPending +- IsWindowsUpdateRebootPending +- IsSCCMClientRebootPending +- IsFileRenameRebootPending +- PendingFileRenameOperations +- ErrorMsg + +.EXAMPLE + +Get-PendingReboot + +Returns custom object with following properties: +- ComputerName +- LastBootUpTime +- IsSystemRebootPending +- IsCBServicingRebootPending +- IsWindowsUpdateRebootPending +- IsSCCMClientRebootPending +- IsFileRenameRebootPending +- PendingFileRenameOperations +- ErrorMsg + +.EXAMPLE + +(Get-PendingReboot).IsSystemRebootPending + +Returns boolean value determining whether or not there is a pending reboot operation. + +.NOTES + +ErrorMsg only contains something if an error occurred + +.LINK + +https://psappdeploytoolkit.com +#> + [CmdletBinding()] + Param ( + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + + ## Initialize variables + [String]$private:ComputerName = $envComputerNameFQDN + $PendRebootErrorMsg = $null + } + Process { + Write-Log -Message "Getting the pending reboot status on the local computer [$ComputerName]." -Source ${CmdletName} + + ## Get the date/time that the system last booted up + Try { + [Nullable[DateTime]]$LastBootUpTime = (Get-Date -ErrorAction 'Stop') - ([Timespan]::FromMilliseconds([Math]::Abs([Environment]::TickCount))) + } + Catch { + [Nullable[DateTime]]$LastBootUpTime = $null + [String[]]$PendRebootErrorMsg += "Failed to get LastBootUpTime: $($_.Exception.Message)" + Write-Log -Message "Failed to get LastBootUpTime. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + ## Determine if a Windows Vista/Server 2008 and above machine has a pending reboot from a Component Based Servicing (CBS) operation + Try { + If (([Version]$envOSVersion).Major -ge 5) { + If (Test-Path -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending' -ErrorAction 'Stop') { + [Nullable[Boolean]]$IsCBServicingRebootPending = $true + } + Else { + [Nullable[Boolean]]$IsCBServicingRebootPending = $false + } + } + } + Catch { + [Nullable[Boolean]]$IsCBServicingRebootPending = $null + [String[]]$PendRebootErrorMsg += "Failed to get IsCBServicingRebootPending: $($_.Exception.Message)" + Write-Log -Message "Failed to get IsCBServicingRebootPending. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + ## Determine if there is a pending reboot from a Windows Update + Try { + If (Test-Path -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired' -ErrorAction 'Stop') { + [Nullable[Boolean]]$IsWindowsUpdateRebootPending = $true + } + Else { + [Nullable[Boolean]]$IsWindowsUpdateRebootPending = $false + } + } + Catch { + [Nullable[Boolean]]$IsWindowsUpdateRebootPending = $null + [String[]]$PendRebootErrorMsg += "Failed to get IsWindowsUpdateRebootPending: $($_.Exception.Message)" + Write-Log -Message "Failed to get IsWindowsUpdateRebootPending. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + ## Determine if there is a pending reboot from a pending file rename operation + [Boolean]$IsFileRenameRebootPending = $false + $PendingFileRenameOperations = $null + If (Test-RegistryValue -Key 'Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager' -Value 'PendingFileRenameOperations') { + # If PendingFileRenameOperations value exists, set $IsFileRenameRebootPending variable to $true + [Boolean]$IsFileRenameRebootPending = $true + # Get the value of PendingFileRenameOperations + Try { + [String[]]$PendingFileRenameOperations = Get-ItemProperty -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager' -ErrorAction 'Stop' | Select-Object -ExpandProperty 'PendingFileRenameOperations' -ErrorAction 'Stop' + } + Catch { + [String[]]$PendRebootErrorMsg += "Failed to get PendingFileRenameOperations: $($_.Exception.Message)" + Write-Log -Message "Failed to get PendingFileRenameOperations. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + } + + ## Determine SCCM 2012 Client reboot pending status + Try { + [Boolean]$IsSccmClientNamespaceExists = $false + [PSObject]$SCCMClientRebootStatus = Invoke-WmiMethod -ComputerName $ComputerName -Namespace 'ROOT\CCM\ClientSDK' -Class 'CCM_ClientUtilities' -Name 'DetermineIfRebootPending' -ErrorAction 'Stop' + [Boolean]$IsSccmClientNamespaceExists = $true + If ($SCCMClientRebootStatus.ReturnValue -ne 0) { + Throw "'DetermineIfRebootPending' method of 'ROOT\CCM\ClientSDK\CCM_ClientUtilities' class returned error code [$($SCCMClientRebootStatus.ReturnValue)]" + } + Else { + Write-Log -Message 'Successfully queried SCCM client for reboot status.' -Source ${CmdletName} + [Nullable[Boolean]]$IsSCCMClientRebootPending = $false + If ($SCCMClientRebootStatus.IsHardRebootPending -or $SCCMClientRebootStatus.RebootPending) { + [Nullable[Boolean]]$IsSCCMClientRebootPending = $true + Write-Log -Message 'Pending SCCM reboot detected.' -Source ${CmdletName} + } + Else { + Write-Log -Message 'Pending SCCM reboot not detected.' -Source ${CmdletName} + } + } + } + Catch [System.Management.ManagementException] { + [Nullable[Boolean]]$IsSCCMClientRebootPending = $null + [Boolean]$IsSccmClientNamespaceExists = $false + Write-Log -Message 'Failed to get IsSCCMClientRebootPending. Failed to detect the SCCM client WMI class.' -Severity 3 -Source ${CmdletName} + } + Catch { + [Nullable[Boolean]]$IsSCCMClientRebootPending = $null + [String[]]$PendRebootErrorMsg += "Failed to get IsSCCMClientRebootPending: $($_.Exception.Message)" + Write-Log -Message "Failed to get IsSCCMClientRebootPending. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + ## Determine if there is a pending reboot from an App-V global Pending Task. (User profile based tasks will complete on logoff/logon) + Try { + If (Test-Path -LiteralPath 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Software\Microsoft\AppV\Client\PendingTasks' -ErrorAction 'Stop') { + [Nullable[Boolean]]$IsAppVRebootPending = $true + } + Else { + [Nullable[Boolean]]$IsAppVRebootPending = $false + } + } + Catch { + [Nullable[Boolean]]$IsAppVRebootPending = $null + [String[]]$PendRebootErrorMsg += "Failed to get IsAppVRebootPending: $($_.Exception.Message)" + Write-Log -Message "Failed to get IsAppVRebootPending. `r`n$(Resolve-Error)" -Severity 3 -Source ${CmdletName} + } + + ## Determine if there is a pending reboot for the system + [Boolean]$IsSystemRebootPending = $false + If ($IsCBServicingRebootPending -or $IsWindowsUpdateRebootPending -or $IsSCCMClientRebootPending -or $IsFileRenameRebootPending) { + [Boolean]$IsSystemRebootPending = $true + } + + ## Create a custom object containing pending reboot information for the system + [PSObject]$PendingRebootInfo = New-Object -TypeName 'PSObject' -Property @{ + ComputerName = $ComputerName + LastBootUpTime = $LastBootUpTime + IsSystemRebootPending = $IsSystemRebootPending + IsCBServicingRebootPending = $IsCBServicingRebootPending + IsWindowsUpdateRebootPending = $IsWindowsUpdateRebootPending + IsSCCMClientRebootPending = $IsSCCMClientRebootPending + IsAppVRebootPending = $IsAppVRebootPending + IsFileRenameRebootPending = $IsFileRenameRebootPending + PendingFileRenameOperations = $PendingFileRenameOperations + ErrorMsg = $PendRebootErrorMsg + } + Write-Log -Message "Pending reboot status on the local computer [$ComputerName]: `r`n$($PendingRebootInfo | Format-List | Out-String)" -Source ${CmdletName} + } + End { + Write-Output -InputObject ($PendingRebootInfo | Select-Object -Property 'ComputerName', 'LastBootUpTime', 'IsSystemRebootPending', 'IsCBServicingRebootPending', 'IsWindowsUpdateRebootPending', 'IsSCCMClientRebootPending', 'IsAppVRebootPending', 'IsFileRenameRebootPending', 'PendingFileRenameOperations', 'ErrorMsg') + + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + +#region Function Set-ItemPermission +Function Set-ItemPermission { + <# +.SYNOPSIS + + Allow you to easily change permissions on files or folders + +.PARAMETER Path + + Path to the folder or file you want to modify (ex: C:\Temp) + +.PARAMETER User + + One or more user names (ex: BUILTIN\Users, DOMAIN\Admin) to give the permissions to. If you want to use SID, prefix it with an asterisk * (ex: *S-1-5-18) + +.PARAMETER Permission + + Permission or list of permissions to be set/added/removed/replaced. To see all the possible permissions go to 'http://technet.microsoft.com/fr-fr/library/ff730951.aspx'. + + Permission DeleteSubdirectoriesAndFiles does not apply to files. + +.PARAMETER PermissionType + + Sets Access Control Type of the permissions. Allowed options: Allow, Deny Default: Allow + +.PARAMETER Inheritance + + Sets permission inheritance. Does not apply to files. Multiple options can be specified. Allowed options: ObjectInherit, ContainerInherit, None Default: None + + None - The permission entry is not inherited by child objects, ObjectInherit - The permission entry is inherited by child leaf objects. ContainerInherit - The permission entry is inherited by child container objects. + +.PARAMETER Propagation + + Sets how to propagate inheritance. Does not apply to files. Allowed options: None, InheritOnly, NoPropagateInherit Default: None + + None - Specifies that no inheritance flags are set. NoPropagateInherit - Specifies that the permission entry is not propagated to child objects. InheritOnly - Specifies that the permission entry is propagated only to child objects. This includes both container and leaf child objects. + +.PARAMETER Method + + Specifies which method will be used to apply the permissions. Allowed options: Add, Set, Reset. + + Add - adds permissions rules but it does not remove previous permissions, Set - overwrites matching permission rules with new ones, Reset - removes matching permissions rules and then adds permission rules, Remove - Removes matching permission rules, RemoveSpecific - Removes specific permissions, RemoveAll - Removes all permission rules for specified user/s + Default: Add + +.PARAMETER EnableInheritance + + Enables inheritance on the files/folders. + +.INPUTS + +None + +You cannot pipe objects to this function. + +.OUTPUTS + +None + +This function does not return any objects. + +.EXAMPLE + + Will grant FullControl permissions to 'John' and 'Users' on 'C:\Temp' and its files and folders children. + + PS C:\>Set-ItemPermission -Path 'C:\Temp' -User 'DOMAIN\John', 'BUILTIN\Utilisateurs' -Permission FullControl -Inheritance ObjectInherit,ContainerInherit + +.EXAMPLE + + Will grant Read permissions to 'John' on 'C:\Temp\pic.png' + + PS C:\>Set-ItemPermission -Path 'C:\Temp\pic.png' -User 'DOMAIN\John' -Permission 'Read' + +.EXAMPLE + + Will remove all permissions to 'John' on 'C:\Temp\Private' + + PS C:\>Set-ItemPermission -Path 'C:\Temp\Private' -User 'DOMAIN\John' -Permission 'None' -Method 'RemoveAll' + +.NOTES + + Original Author: Julian DA CUNHA - dacunha.julian@gmail.com, used with permission + +.LINK + + https://psappdeploytoolkit.com +#> + + [CmdletBinding()] + Param ( + [Parameter( Mandatory = $true, Position = 0, HelpMessage = 'Path to the folder or file you want to modify (ex: C:\Temp)', ParameterSetName = 'DisableInheritance' )] + [Parameter( Mandatory = $true, Position = 0, HelpMessage = 'Path to the folder or file you want to modify (ex: C:\Temp)', ParameterSetName = 'EnableInheritance' )] + [ValidateNotNullOrEmpty()] + [Alias('File', 'Folder')] + [String]$Path, + + [Parameter( Mandatory = $true, Position = 1, HelpMessage = 'One or more user names (ex: BUILTIN\Users, DOMAIN\Admin). If you want to use SID, prefix it with an asterisk * (ex: *S-1-5-18)', ParameterSetName = 'DisableInheritance')] + [Alias('Username', 'Users', 'SID', 'Usernames')] + [String[]]$User, + + [Parameter( Mandatory = $true, Position = 2, HelpMessage = "Permission or list of permissions to be set/added/removed/replaced. To see all the possible permissions go to 'http://technet.microsoft.com/fr-fr/library/ff730951.aspx'", ParameterSetName = 'DisableInheritance')] + [Alias('Acl', 'Grant', 'Permissions', 'Deny')] + [ValidateSet('AppendData', 'ChangePermissions', 'CreateDirectories', 'CreateFiles', 'Delete', ` + 'DeleteSubdirectoriesAndFiles', 'ExecuteFile', 'FullControl', 'ListDirectory', 'Modify', ` + 'Read', 'ReadAndExecute', 'ReadAttributes', 'ReadData', 'ReadExtendedAttributes', 'ReadPermissions', ` + 'Synchronize', 'TakeOwnership', 'Traverse', 'Write', 'WriteAttributes', 'WriteData', 'WriteExtendedAttributes', 'None')] + [String[]]$Permission, + + [Parameter( Mandatory = $false, Position = 3, HelpMessage = 'Whether you want to set Allow or Deny permissions', ParameterSetName = 'DisableInheritance')] + [Alias('AccessControlType')] + [ValidateSet('Allow', 'Deny')] + [String]$PermissionType = 'Allow', + + [Parameter( Mandatory = $false, Position = 4, HelpMessage = 'Sets how permissions are inherited', ParameterSetName = 'DisableInheritance')] + [ValidateSet('ContainerInherit', 'None', 'ObjectInherit')] + [String[]]$Inheritance = 'None', + + [Parameter( Mandatory = $false, Position = 5, HelpMessage = 'Sets how to propage inheritance flags', ParameterSetName = 'DisableInheritance')] + [ValidateSet('None', 'InheritOnly', 'NoPropagateInherit')] + [String]$Propagation = 'None', + + [Parameter( Mandatory = $false, Position = 6, HelpMessage = 'Specifies which method will be used to add/remove/replace permissions.', ParameterSetName = 'DisableInheritance')] + [ValidateSet('Add', 'Set', 'Reset', 'Remove', 'RemoveSpecific', 'RemoveAll')] + [Alias('ApplyMethod', 'ApplicationMethod')] + [String]$Method = 'Add', + + [Parameter( Mandatory = $true, Position = 1, HelpMessage = 'Enables inheritance, which removes explicit permissions.', ParameterSetName = 'EnableInheritance')] + [Switch]$EnableInheritance + ) + + Begin { + ## Get the name of this function and write header + [String]${CmdletName} = $PSCmdlet.MyInvocation.MyCommand.Name + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -CmdletBoundParameters $PSBoundParameters -Header + } + + Process { + # Test elevated perms + If (-not $IsAdmin) { + Write-Log -Message 'Unable to use the function [Set-ItemPermission] without elevated permissions.' -Source ${CmdletName} + Throw 'Unable to use the function [Set-ItemPermission] without elevated permissions.' + } + + # Check path existence + If (-not (Test-Path -Path $Path -ErrorAction 'Stop')) { + Write-Log -Message "Specified path does not exist [$Path]." -Source ${CmdletName} + Throw "Specified path does not exist [$Path]." + } + + If ($EnableInheritance) { + # Get object acls + $Acl = (Get-Item -Path $Path -ErrorAction 'Stop').GetAccessControl('Access') + # Enable inherance + $Acl.SetAccessRuleProtection($false, $true) + Write-Log -Message "Enabling Inheritance on path [$Path]." -Source ${CmdletName} + $null = Set-Acl -Path $Path -AclObject $Acl -ErrorAction 'Stop' + Return + } + # Permissions + [System.Security.AccessControl.FileSystemRights]$FileSystemRights = New-Object -TypeName 'System.Security.AccessControl.FileSystemRights' + If ($Permission -ne 'None') { + ForEach ($Entry in $Permission) { + $FileSystemRights = $FileSystemRights -bor [System.Security.AccessControl.FileSystemRights]$Entry + } + } + + # InheritanceFlags + $InheritanceFlag = New-Object -TypeName 'System.Security.AccessControl.InheritanceFlags' + ForEach ($IFlag in $Inheritance) { + $InheritanceFlag = $InheritanceFlag -bor [System.Security.AccessControl.InheritanceFlags]$IFlag + } + + # PropagationFlags + $PropagationFlag = [System.Security.AccessControl.PropagationFlags]$Propagation + + # Access Control Type + $Allow = [System.Security.AccessControl.AccessControlType]$PermissionType + + # Modify variables to remove file incompatible flags if this is a file + If (Test-Path -Path $Path -ErrorAction 'Stop' -PathType 'Leaf') { + $FileSystemRights = $FileSystemRights -band (-bnot [System.Security.AccessControl.FileSystemRights]::DeleteSubdirectoriesAndFiles) + $InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None + $PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None + } + + # Get object acls + $Acl = (Get-Item -Path $Path -ErrorAction 'Stop').GetAccessControl('Access') + # Disable inherance, Preserve inherited permissions + $Acl.SetAccessRuleProtection($true, $true) + $null = Set-Acl -Path $Path -AclObject $Acl -ErrorAction 'Stop' + # Get updated acls - without inheritance + $Acl = $null + $Acl = (Get-Item -Path $Path -ErrorAction 'Stop').GetAccessControl('Access') + # Apply permissions on Users + ForEach ($U in $User) { + # Trim whitespace and skip if empty + $U = $U.Trim() + If ($U.Length -eq 0) { + Continue + } + # Set Username + If ($U.StartsWith('*')) { + # This is a SID, remove the * + $U = $U.remove(0, 1) + Try { + # Translate the SID + $UsersAccountName = ConvertTo-NTAccountOrSID -SID $U + } + Catch { + Write-Log "Failed to translate SID [$U]. Skipping..." -Source ${CmdletName} -Severity 2 + Continue + } + + $Username = New-Object -TypeName 'System.Security.Principal.NTAccount' -ArgumentList ($UsersAccountName) + } + Else { + $Username = New-Object -TypeName 'System.Security.Principal.NTAccount' -ArgumentList ($U) + } + + # Set/Add/Remove/Replace permissions and log the changes + $Rule = New-Object -TypeName 'System.Security.AccessControl.FileSystemAccessRule' -ArgumentList ($Username, $FileSystemRights, $InheritanceFlag, $PropagationFlag, $Allow) + Switch ($Method) { + 'Add' { + Write-Log -Message "Setting permissions [Permissions:$FileSystemRights, InheritanceFlags:$InheritanceFlag, PropagationFlags:$PropagationFlag, AccessControlType:$Allow, Method:$Method] on path [$Path] for user [$Username]." -Source ${CmdletName} + $Acl.AddAccessRule($Rule) + Break + } + 'Set' { + Write-Log -Message "Setting permissions [Permissions:$FileSystemRights, InheritanceFlags:$InheritanceFlag, PropagationFlags:$PropagationFlag, AccessControlType:$Allow, Method:$Method] on path [$Path] for user [$Username]." -Source ${CmdletName} + $Acl.SetAccessRule($Rule) + Break + } + 'Reset' { + Write-Log -Message "Setting permissions [Permissions:$FileSystemRights, InheritanceFlags:$InheritanceFlag, PropagationFlags:$PropagationFlag, AccessControlType:$Allow, Method:$Method] on path [$Path] for user [$Username]." -Source ${CmdletName} + $Acl.ResetAccessRule($Rule) + Break + } + 'Remove' { + Write-Log -Message "Removing permissions [Permissions:$FileSystemRights, InheritanceFlags:$InheritanceFlag, PropagationFlags:$PropagationFlag, AccessControlType:$Allow, Method:$Method] on path [$Path] for user [$Username]." -Source ${CmdletName} + $Acl.RemoveAccessRule($Rule) + Break + } + 'RemoveSpecific' { + Write-Log -Message "Removing permissions [Permissions:$FileSystemRights, InheritanceFlags:$InheritanceFlag, PropagationFlags:$PropagationFlag, AccessControlType:$Allow, Method:$Method] on path [$Path] for user [$Username]." -Source ${CmdletName} + $Acl.RemoveAccessRuleSpecific($Rule) + Break + } + 'RemoveAll' { + Write-Log -Message "Removing permissions [Permissions:$FileSystemRights, InheritanceFlags:$InheritanceFlag, PropagationFlags:$PropagationFlag, AccessControlType:$Allow, Method:$Method] on path [$Path] for user [$Username]." -Source ${CmdletName} + $Acl.RemoveAccessRuleAll($Rule) + Break + } + } + } + # Use the prepared ACL + $null = Set-Acl -Path $Path -AclObject $Acl -ErrorAction 'Stop' + } + + End { + Write-FunctionHeaderOrFooter -CmdletName ${CmdletName} -Footer + } +} +#endregion + +#endregion +##*============================================= +##* END FUNCTION LISTINGS +##*============================================= + +##*============================================= +##* SCRIPT BODY +##*============================================= +#region ScriptBody + +## If the script was invoked by the Help Console, exit the script now +If ($invokingScript) { + If ((Split-Path -Path $invokingScript -Leaf) -eq 'AppDeployToolkitHelp.ps1') { + Return + } +} + +## Add the custom types required for the toolkit +If (-not ([Management.Automation.PSTypeName]'PSADT.UiAutomation').Type) { + [String[]]$ReferencedAssemblies = 'System.Drawing', 'System.Windows.Forms', 'System.DirectoryServices' + Add-Type -Path $appDeployCustomTypesSourceCode -ReferencedAssemblies $ReferencedAssemblies -IgnoreWarnings -ErrorAction 'Stop' +} + +## Define ScriptBlocks to disable/revert script logging +[ScriptBlock]$DisableScriptLogging = { $OldDisableLoggingValue = $DisableLogging ; $DisableLogging = $true } +[ScriptBlock]$RevertScriptLogging = { $DisableLogging = $OldDisableLoggingValue } + +## Define ScriptBlock for getting details for all logged on users +[ScriptBlock]$GetLoggedOnUserDetails = { + [PSObject[]]$LoggedOnUserSessions = Get-LoggedOnUser + [String[]]$usersLoggedOn = $LoggedOnUserSessions | ForEach-Object { $_.NTAccount } + + If ($usersLoggedOn) { + # Get account and session details for the logged on user session that the current process is running under. Note that the account used to execute the current process may be different than the account that is logged into the session (i.e. you can use "RunAs" to launch with different credentials when logged into an account). + [PSObject]$CurrentLoggedOnUserSession = $LoggedOnUserSessions | Where-Object { $_.IsCurrentSession } + + # Get account and session details for the account running as the console user (user with control of the physical monitor, keyboard, and mouse) + [PSObject]$CurrentConsoleUserSession = $LoggedOnUserSessions | Where-Object { $_.IsConsoleSession } + + ## Determine the account that will be used to execute commands in the user session when toolkit is running under the SYSTEM account + # If a console user exists, then that will be the active user session. + # If no console user exists but users are logged in, such as on terminal servers, then the first logged-in non-console user that is either 'Active' or 'Connected' is the active user. + [PSObject]$RunAsActiveUser = $LoggedOnUserSessions | Where-Object { $_.IsActiveUserSession } + } +} + +[ScriptBlock]$GetLoggedOnUserTempPath = { + # When running in system context we can derive the native "C:\Users" base path from the Public environment variable + [String]$dirUserProfile = Split-path $envPublic -ErrorAction 'SilentlyContinue' + If ($null -ne $RunAsActiveUser.NTAccount) { + [String]$userProfileName = $RunAsActiveUser.UserName + If (Test-Path (Join-Path -Path $dirUserProfile -ChildPath $userProfileName -ErrorAction 'SilentlyContinue')) { + [String]$runasUserProfile = Join-Path -Path $dirUserProfile -ChildPath $userProfileName -ErrorAction 'SilentlyContinue' + [String]$loggedOnUserTempPath = Join-Path -Path $runasUserProfile -ChildPath (Join-Path -Path $appDeployToolkitName -ChildPath 'ExecuteAsUser') + If (-not (Test-Path -LiteralPath $loggedOnUserTempPath -PathType 'Container' -ErrorAction 'SilentlyContinue')) { + $null = New-Item -Path $loggedOnUserTempPath -ItemType 'Directory' -Force -ErrorAction 'SilentlyContinue' + } + } + } + Else { + [String]$loggedOnUserTempPath = Join-Path -Path $dirAppDeployTemp -ChildPath 'ExecuteAsUser' + } +} + +## Disable logging until log file details are available +. $DisableScriptLogging + +## If the default Deploy-Application.ps1 hasn't been modified, and the main script was not called by a referring script, check for MSI / MST and modify the install accordingly +If ((-not $appName) -and (-not $ReferredInstallName)) { + # Build properly formatted Architecture String + Switch ($Is64Bit) { + $false { + $formattedOSArch = 'x86' + } + $true { + $formattedOSArch = 'x64' + } + } + # Find the first MSI file in the Files folder and use that as our install + If ([String]$defaultMsiFile = (Get-ChildItem -LiteralPath $dirFiles -ErrorAction 'SilentlyContinue' | Where-Object { (-not $_.PsIsContainer) -and ([IO.Path]::GetExtension($_.Name) -eq '.msi') -and ($_.Name.EndsWith(".$formattedOSArch.msi")) } | Select-Object -ExpandProperty 'FullName' -First 1)) { + Write-Log -Message "Discovered $formattedOSArch Zerotouch MSI under $defaultMSIFile" -Source $appDeployToolkitName + } + ElseIf ([String]$defaultMsiFile = (Get-ChildItem -LiteralPath $dirFiles -ErrorAction 'SilentlyContinue' | Where-Object { (-not $_.PsIsContainer) -and ([IO.Path]::GetExtension($_.Name) -eq '.msi') } | Select-Object -ExpandProperty 'FullName' -First 1)) { + Write-Log -Message "Discovered Arch-Independent Zerotouch MSI under $defaultMSIFile" -Source $appDeployToolkitName + } + If ($defaultMsiFile) { + Try { + [Boolean]$useDefaultMsi = $true + Write-Log -Message "Discovered Zero-Config MSI installation file [$defaultMsiFile]." -Source $appDeployToolkitName + # Discover if there is a zero-config MST file + [String]$defaultMstFile = [IO.Path]::ChangeExtension($defaultMsiFile, 'mst') + If (Test-Path -LiteralPath $defaultMstFile -PathType 'Leaf') { + Write-Log -Message "Discovered Zero-Config MST installation file [$defaultMstFile]." -Source $appDeployToolkitName + } + Else { + [String]$defaultMstFile = '' + } + # Discover if there are zero-config MSP files. Name multiple MSP files in alphabetical order to control order in which they are installed. + [String[]]$defaultMspFiles = Get-ChildItem -LiteralPath $dirFiles -ErrorAction 'SilentlyContinue' | Where-Object { (-not $_.PsIsContainer) -and ([IO.Path]::GetExtension($_.Name) -eq '.msp') } | Select-Object -ExpandProperty 'FullName' + If ($defaultMspFiles) { + Write-Log -Message "Discovered Zero-Config MSP installation file(s) [$($defaultMspFiles -join ',')]." -Source $appDeployToolkitName + } + + ## Read the MSI and get the installation details + [Hashtable]$GetDefaultMsiTablePropertySplat = @{ Path = $defaultMsiFile; Table = 'Property'; ContinueOnError = $false; ErrorAction = 'Stop' } + If ($defaultMstFile) { + $GetDefaultMsiTablePropertySplat.Add('TransformPath', $defaultMstFile) + } + [PSObject]$defaultMsiPropertyList = Get-MsiTableProperty @GetDefaultMsiTablePropertySplat + [String]$appVendor = $defaultMsiPropertyList.Manufacturer + [String]$appName = $defaultMsiPropertyList.ProductName + [String]$appVersion = $defaultMsiPropertyList.ProductVersion + $GetDefaultMsiTablePropertySplat.Set_Item('Table', 'File') + [PSObject]$defaultMsiFileList = Get-MsiTableProperty @GetDefaultMsiTablePropertySplat + [String[]]$defaultMsiExecutables = Get-Member -InputObject $defaultMsiFileList -ErrorAction 'Stop' | Select-Object -ExpandProperty 'Name' -ErrorAction 'Stop' | Where-Object { [IO.Path]::GetExtension($_) -eq '.exe' } | ForEach-Object { [IO.Path]::GetFileNameWithoutExtension($_) } + [String]$defaultMsiExecutablesList = $defaultMsiExecutables -join ',' + Write-Log -Message "App Vendor [$appVendor]." -Source $appDeployToolkitName + Write-Log -Message "App Name [$appName]." -Source $appDeployToolkitName + Write-Log -Message "App Version [$appVersion]." -Source $appDeployToolkitName + Write-Log -Message "MSI Executable List [$defaultMsiExecutablesList]." -Source $appDeployToolkitName + } + Catch { + Write-Log -Message "Failed to process Zero-Config MSI Deployment. `r`n$(Resolve-Error)" -Source $appDeployToolkitName + $useDefaultMsi = $false ; $appVendor = '' ; $appName = '' ; $appVersion = '' + } + } +} + +## Set up sample variables if Dot Sourcing the script, app details have not been specified +If (-not $appName) { + [String]$appName = $appDeployMainScriptFriendlyName + If (-not $appVendor) { + [String]$appVendor = 'PS' + } + If (-not $appVersion) { + [String]$appVersion = $appDeployMainScriptVersion + } + If (-not $appLang) { + [String]$appLang = $currentLanguage + } + If (-not $appRevision) { + [String]$appRevision = '01' + } + If (-not $appArch) { + [String]$appArch = '' + } +} +Else { + If (-not $appVendor) { + [String]$appVendor = '' + } + If (-not $appVersion) { + [String]$appVersion = '' + } + If (-not $appLang) { + [String]$appLang = '' + } + If (-not $appRevision) { + [String]$appRevision = '' + } + If (-not $appArch) { + [String]$appArch = '' + } +} + +## Sanitize the application details, as they can cause issues in the script +[String]$appVendor = (Remove-InvalidFileNameChars -Name ($appVendor.Trim())) +[String]$appName = (Remove-InvalidFileNameChars -Name ($appName.Trim())) +[String]$appVersion = (Remove-InvalidFileNameChars -Name ($appVersion.Trim())) +[String]$appArch = (Remove-InvalidFileNameChars -Name ($appArch.Trim())) +[String]$appLang = (Remove-InvalidFileNameChars -Name ($appLang.Trim())) +[String]$appRevision = (Remove-InvalidFileNameChars -Name ($appRevision.Trim())) + +## Build the Installation Title +If ($ReferredInstallTitle) { + [String]$installTitle = (Remove-InvalidFileNameChars -Name ($ReferredInstallTitle.Trim())) +} +If (-not $installTitle) { + [String]$installTitle = "$appVendor $appName $appVersion" +} + +## Set Powershell window title, in case the window is visible +[String]$oldPSWindowTitle = $Host.UI.RawUI.WindowTitle +$Host.UI.RawUI.WindowTitle = "$installTitle - $DeploymentType" + +## Build the Installation Name +If ($ReferredInstallName) { + [String]$installName = (Remove-InvalidFileNameChars -Name $ReferredInstallName) +} +If (-not $installName) { + If ($appArch) { + [String]$installName = $appVendor + '_' + $appName + '_' + $appVersion + '_' + $appArch + '_' + $appLang + '_' + $appRevision + } + Else { + [String]$installName = $appVendor + '_' + $appName + '_' + $appVersion + '_' + $appLang + '_' + $appRevision + } +} +[String]$installName = (($installName -replace ' ', '').Trim('_') -replace '[_]+', '_') + +## Set the Defer History registry path +[String]$regKeyDeferHistory = "$configToolkitRegPath\$appDeployToolkitName\DeferHistory\$installName" + +## Variables: Log Files +If ($ReferredLogName) { + [String]$logName = $ReferredLogName +} +If (-not $logName) { + [String]$logName = $installName + '_' + $appDeployToolkitName + '_' + $deploymentType + '.log' +} +# If option to compress logs is selected, then log will be created in temp log folder ($logTempFolder) and then copied to actual log folder ($configToolkitLogDir) after being zipped. +[String]$logTempFolder = Join-Path -Path $envTemp -ChildPath "${installName}_$deploymentType" +If ($configToolkitCompressLogs) { + # If the temp log folder already exists from a previous ZIP operation, then delete all files in it to avoid issues + If (Test-Path -LiteralPath $logTempFolder -PathType 'Container' -ErrorAction 'SilentlyContinue') { + $null = Remove-Item -LiteralPath $logTempFolder -Recurse -Force -ErrorAction 'SilentlyContinue' + } +} + +## Revert script logging to original setting +. $RevertScriptLogging + +## Initialize Logging +$installPhase = 'Initialization' +$scriptSeparator = '*' * 79 +Write-Log -Message ($scriptSeparator, $scriptSeparator) -Source $appDeployToolkitName +Write-Log -Message "[$installName] setup started." -Source $appDeployToolkitName + +## Assemblies: Load +Try { + Add-Type -AssemblyName ('System.Drawing', 'System.Windows.Forms', 'PresentationFramework', 'Microsoft.VisualBasic', 'PresentationCore', 'WindowsBase') -ErrorAction 'Stop' +} +Catch { + Write-Log -Message "Failed to load assembly. `r`n$(Resolve-Error)" -Severity 3 -Source $appDeployToolkitName + If ($deployModeNonInteractive) { + Write-Log -Message "Continue despite assembly load error since deployment mode is [$deployMode]." -Source $appDeployToolkitName + } + Else { + Exit-Script -ExitCode 60004 + } +} + +# Calculate banner height +[Int32]$appDeployLogoBannerHeight = 0 +Try { + [System.Drawing.Bitmap]$appDeployLogoBannerObject = New-Object -TypeName 'System.Drawing.Bitmap' -ArgumentList ($appDeployLogoBanner) + [Int32]$appDeployLogoBannerHeight = $appDeployLogoBannerObject.Height + If ($appDeployLogoBannerHeight -gt $appDeployLogoBannerMaxHeight) { + $appDeployLogoBannerHeight = $appDeployLogoBannerMaxHeight + } + $appDeployLogoBannerObject.Dispose($true) # Must dispose() when installing from local cache or else AppDeployToolkitBanner.png is locked and cannot be removed +} +Catch { +} + +## Get the default font to use in the user interface +[System.Drawing.Font]$defaultFont = [System.Drawing.SystemFonts]::MessageBoxFont + +## Check how the script was invoked +If ($invokingScript) { + Write-Log -Message "Script [$scriptPath] dot-source invoked by [$invokingScript]" -Source $appDeployToolkitName +} +Else { + Write-Log -Message "Script [$scriptPath] invoked directly" -Source $appDeployToolkitName +} + +## Dot Source script extensions +If (Test-Path -LiteralPath "$scriptRoot\$appDeployToolkitDotSourceExtensions" -PathType 'Leaf') { + . "$scriptRoot\$appDeployToolkitDotSourceExtensions" +} + +## Evaluate non-default parameters passed to the scripts +If ($deployAppScriptParameters) { + [String]$deployAppScriptParameters = ($deployAppScriptParameters.GetEnumerator() | ForEach-Object { & $ResolveParameters $_ }) -join ' ' +} +# Save main script parameters hashtable for async execution of the toolkit +[Hashtable]$appDeployMainScriptAsyncParameters = $appDeployMainScriptParameters +If ($appDeployMainScriptParameters) { + [String]$appDeployMainScriptParameters = ($appDeployMainScriptParameters.GetEnumerator() | ForEach-Object { & $ResolveParameters $_ }) -join ' ' +} +If ($appDeployExtScriptParameters) { + [String]$appDeployExtScriptParameters = ($appDeployExtScriptParameters.GetEnumerator() | ForEach-Object { & $ResolveParameters $_ }) -join ' ' +} + +## Check the XML config file version +If ($configConfigVersion -lt $appDeployMainScriptMinimumConfigVersion) { + [String]$XMLConfigVersionErr = "The XML configuration file version [$configConfigVersion] is lower than the supported version required by the Toolkit [$appDeployMainScriptMinimumConfigVersion]. Please upgrade the configuration file." + Write-Log -Message $XMLConfigVersionErr -Severity 3 -Source $appDeployToolkitName + Throw $XMLConfigVersionErr +} + +## Log system/script information +If ($appScriptVersion) { + Write-Log -Message "[$installName] script version is [$appScriptVersion]" -Source $appDeployToolkitName +} +If ($appScriptDate) { + Write-Log -Message "[$installName] script date is [$appScriptDate]" -Source $appDeployToolkitName +} +If ($appScriptAuthor) { + Write-Log -Message "[$installName] script author is [$appScriptAuthor]" -Source $appDeployToolkitName +} +If ($deployAppScriptFriendlyName) { + Write-Log -Message "[$deployAppScriptFriendlyName] script version is [$deployAppScriptVersion]" -Source $appDeployToolkitName +} +If ($deployAppScriptParameters) { + Write-Log -Message "The following non-default parameters were passed to [$deployAppScriptFriendlyName]: [$deployAppScriptParameters]" -Source $appDeployToolkitName +} +If ($appDeployMainScriptFriendlyName) { + Write-Log -Message "[$appDeployMainScriptFriendlyName] script version is [$appDeployMainScriptVersion]" -Source $appDeployToolkitName +} +If ($appDeployMainScriptParameters) { + Write-Log -Message "The following non-default parameters were passed to [$appDeployMainScriptFriendlyName]: [$appDeployMainScriptParameters]" -Source $appDeployToolkitName +} +If ($appDeployExtScriptFriendlyName) { + Write-Log -Message "[$appDeployExtScriptFriendlyName] version is [$appDeployExtScriptVersion]" -Source $appDeployToolkitName +} +If ($appDeployExtScriptParameters) { + Write-Log -Message "The following non-default parameters were passed to [$appDeployExtScriptFriendlyName]: [$appDeployExtScriptParameters]" -Source $appDeployToolkitName +} +Write-Log -Message "Computer Name is [$envComputerNameFQDN]" -Source $appDeployToolkitName +Write-Log -Message "Current User is [$ProcessNTAccount]" -Source $appDeployToolkitName +If ($envOSServicePack) { + Write-Log -Message "OS Version is [$envOSName $envOSServicePack $envOSArchitecture $envOSVersion]" -Source $appDeployToolkitName +} +Else { + Write-Log -Message "OS Version is [$envOSName $envOSArchitecture $envOSVersion]" -Source $appDeployToolkitName +} +Write-Log -Message "OS Type is [$envOSProductTypeName]" -Source $appDeployToolkitName +Write-Log -Message "Current Culture is [$($culture.Name)], language is [$currentLanguage] and UI language is [$currentUILanguage]" -Source $appDeployToolkitName +Write-Log -Message "Hardware Platform is [$(. $DisableScriptLogging; Get-HardwarePlatform; . $RevertScriptLogging)]" -Source $appDeployToolkitName +Write-Log -Message "PowerShell Host is [$($envHost.Name)] with version [$($envHost.Version)]" -Source $appDeployToolkitName +Write-Log -Message "PowerShell Version is [$envPSVersion $psArchitecture]" -Source $appDeployToolkitName +Write-Log -Message "PowerShell CLR (.NET) version is [$envCLRVersion]" -Source $appDeployToolkitName +Write-Log -Message $scriptSeparator -Source $appDeployToolkitName + +## Disable logging +. $DisableScriptLogging + +## Dot source ScriptBlock to get a list of all users logged on to the system (both local and RDP users), and discover session details for account executing script +. $GetLoggedOnUserDetails + +## Dot source ScriptBlock to create temporary directory of logged on user +. $GetLoggedOnUserTempPath + +## Dot source ScriptBlock to load localized UI messages from config XML +. $xmlLoadLocalizedUIMessages + +## Dot source ScriptBlock to get system DPI scale factor +. $GetDisplayScaleFactor + +## Revert script logging to original setting +. $RevertScriptLogging + +## Set the install phase to asynchronous if the script was not dot sourced, i.e. called with parameters +If ($AsyncToolkitLaunch) { + $installPhase = 'Asynchronous' +} + +## If the ShowInstallationPrompt Parameter is specified, only call that function. +If ($showInstallationPrompt) { + Write-Log -Message "[$appDeployMainScriptFriendlyName] called with switch [-ShowInstallationPrompt]." -Source $appDeployToolkitName + $appDeployMainScriptAsyncParameters.Remove('ShowInstallationPrompt') + $appDeployMainScriptAsyncParameters.Remove('AsyncToolkitLaunch') + $appDeployMainScriptAsyncParameters.Remove('ReferredInstallName') + $appDeployMainScriptAsyncParameters.Remove('ReferredInstallTitle') + $appDeployMainScriptAsyncParameters.Remove('ReferredLogName') + Show-InstallationPrompt @appDeployMainScriptAsyncParameters + Exit 0 +} + +## If the ShowInstallationRestartPrompt Parameter is specified, only call that function. +If ($showInstallationRestartPrompt) { + Write-Log -Message "[$appDeployMainScriptFriendlyName] called with switch [-ShowInstallationRestartPrompt]." -Source $appDeployToolkitName + $appDeployMainScriptAsyncParameters.Remove('ShowInstallationRestartPrompt') + $appDeployMainScriptAsyncParameters.Remove('AsyncToolkitLaunch') + $appDeployMainScriptAsyncParameters.Remove('ReferredInstallName') + $appDeployMainScriptAsyncParameters.Remove('ReferredInstallTitle') + $appDeployMainScriptAsyncParameters.Remove('ReferredLogName') + Show-InstallationRestartPrompt @appDeployMainScriptAsyncParameters + Exit 0 +} + +## If the CleanupBlockedApps Parameter is specified, only call that function. +If ($cleanupBlockedApps) { + $deployModeSilent = $true + Write-Log -Message "[$appDeployMainScriptFriendlyName] called with switch [-CleanupBlockedApps]." -Source $appDeployToolkitName + Unblock-AppExecution + Exit 0 +} + +## If the ShowBlockedAppDialog Parameter is specified, only call that function. +If ($showBlockedAppDialog) { + Try { + . $DisableScriptLogging + Write-Log -Message "[$appDeployMainScriptFriendlyName] called with switch [-ShowBlockedAppDialog]." -Source $appDeployToolkitName + # Create a mutex and specify a name without acquiring a lock on the mutex + [Boolean]$showBlockedAppDialogMutexLocked = $false + [String]$showBlockedAppDialogMutexName = 'Global\PSADT_ShowBlockedAppDialog_Message' + [Threading.Mutex]$showBlockedAppDialogMutex = New-Object -TypeName 'System.Threading.Mutex' -ArgumentList ($false, $showBlockedAppDialogMutexName) + # Attempt to acquire an exclusive lock on the mutex, attempt will fail after 1 millisecond if unable to acquire exclusive lock + If ((Test-IsMutexAvailable -MutexName $showBlockedAppDialogMutexName -MutexWaitTimeInMilliseconds 1) -and ($showBlockedAppDialogMutex.WaitOne(1))) { + [Boolean]$showBlockedAppDialogMutexLocked = $true + Show-InstallationPrompt -Title $installTitle -Message $configBlockExecutionMessage -Icon 'Warning' -ButtonRightText 'OK' + Exit 0 + } + Else { + # If attempt to acquire an exclusive lock on the mutex failed, then exit script as another blocked app dialog window is already open + Write-Log -Message "Unable to acquire an exclusive lock on mutex [$showBlockedAppDialogMutexName] because another blocked application dialog window is already open. Exiting script..." -Severity 2 -Source $appDeployToolkitName + Exit 0 + } + } + Catch { + Write-Log -Message "There was an error in displaying the Installation Prompt. `r`n$(Resolve-Error)" -Severity 3 -Source $appDeployToolkitName + Exit 60005 + } + Finally { + If ($showBlockedAppDialogMutexLocked) { + $null = $showBlockedAppDialogMutex.ReleaseMutex() + } + If ($showBlockedAppDialogMutex) { + $showBlockedAppDialogMutex.Close() + } + } +} + +## Log details for all currently logged in users +Write-Log -Message "Display session information for all logged on users: `r`n$($LoggedOnUserSessions | Format-List | Out-String)" -Source $appDeployToolkitName +If ($usersLoggedOn) { + Write-Log -Message "The following users are logged on to the system: [$($usersLoggedOn -join ', ')]." -Source $appDeployToolkitName + + # Check if the current process is running in the context of one of the logged in users + If ($CurrentLoggedOnUserSession) { + Write-Log -Message "Current process is running with user account [$ProcessNTAccount] under logged in user session for [$($CurrentLoggedOnUserSession.NTAccount)]." -Source $appDeployToolkitName + } + Else { + Write-Log -Message "Current process is running under a system account [$ProcessNTAccount]." -Source $appDeployToolkitName + } + + # Check if OOBE / ESP is running [credit Michael Niehaus] + $TypeDef = @" + +using System; +using System.Text; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +namespace Api +{ + public class Kernel32 + { + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + public static extern int OOBEComplete(ref int bIsOOBEComplete); + } +} +"@ + +Add-Type -TypeDefinition $TypeDef -Language CSharp + +$IsOOBEComplete = $false +$hr = [Api.Kernel32]::OOBEComplete([ref] $IsOOBEComplete) + + If (!($IsOOBEComplete)) { + Write-Log -Message "Detected OOBE in progress, changing deployment mode to silent." -Source $appDeployToolkitExtName + $deployMode = 'Silent' + } + + [Int]$defenderHideSysTray = Get-RegistryKey -Key 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender Security Center\Systray' -Value 'HideSystray' + If ($defenderHideSysTray -ne "1" -and ($null -eq (Get-Process -Name SecurityHealthSystray -ErrorAction SilentlyContinue))) { + $deployMode = 'Silent' + } + + # Display account and session details for the account running as the console user (user with control of the physical monitor, keyboard, and mouse) + If ($CurrentConsoleUserSession) { + Write-Log -Message "The following user is the console user [$($CurrentConsoleUserSession.NTAccount)] (user with control of physical monitor, keyboard, and mouse)." -Source $appDeployToolkitName + } + Else { + Write-Log -Message 'There is no console user logged in (user with control of physical monitor, keyboard, and mouse).' -Source $appDeployToolkitName + } + + # Display the account that will be used to execute commands in the user session when toolkit is running under the SYSTEM account + If ($RunAsActiveUser) { + Write-Log -Message "The active logged on user is [$($RunAsActiveUser.NTAccount)]." -Source $appDeployToolkitName + } +} +Else { + Write-Log -Message 'No users are logged on to the system.' -Source $appDeployToolkitName +} + +## Log which language's UI messages are loaded from the config XML file +If ($HKUPrimaryLanguageShort) { + Write-Log -Message "The active logged on user [$($RunAsActiveUser.NTAccount)] has a primary UI language of [$HKUPrimaryLanguageShort]." -Source $appDeployToolkitName +} +Else { + Write-Log -Message "The current system account [$ProcessNTAccount] has a primary UI language of [$currentLanguage]." -Source $appDeployToolkitName +} +If ($configInstallationUILanguageOverride) { + Write-Log -Message "The config XML file was configured to override the detected primary UI language with the following UI language: [$configInstallationUILanguageOverride]." -Source $appDeployToolkitName +} +Write-Log -Message "The following UI messages were imported from the config XML file: [$xmlUIMessageLanguage]." -Source $appDeployToolkitName + +## Log system DPI scale factor of active logged on user +If ($UserDisplayScaleFactor) { + Write-Log -Message "The active logged on user [$($RunAsActiveUser.NTAccount)] has a DPI scale factor of [$dpiScale] with DPI pixels [$dpiPixels]." -Source $appDeployToolkitName +} +Else { + Write-Log -Message "The system has a DPI scale factor of [$dpiScale] with DPI pixels [$dpiPixels]." -Source $appDeployToolkitName +} + +## Check if script is running from a SCCM Task Sequence +Try { + [__ComObject]$SMSTSEnvironment = New-Object -ComObject 'Microsoft.SMS.TSEnvironment' -ErrorAction 'Stop' + Write-Log -Message 'Successfully loaded COM Object [Microsoft.SMS.TSEnvironment]. Therefore, script is currently running from a SCCM Task Sequence.' -Source $appDeployToolkitName + $null = [Runtime.Interopservices.Marshal]::ReleaseComObject($SMSTSEnvironment) + $runningTaskSequence = $true +} +Catch { + Write-Log -Message 'Unable to load COM Object [Microsoft.SMS.TSEnvironment]. Therefore, script is not currently running from a SCCM Task Sequence.' -Source $appDeployToolkitName + $runningTaskSequence = $false +} + +## Check to see if the Task Scheduler service is in a healthy state by checking its services to see if they exist, are currently running, and have a start mode of 'Automatic'. +## The task scheduler service and the services it is dependent on can/should only be started/stopped/modified when running in the SYSTEM context. +[Boolean]$IsTaskSchedulerHealthy = $true +If ($IsLocalSystemAccount) { + # Check the health of the 'Task Scheduler' service + Try { + If (Test-ServiceExists -Name 'Schedule' -ContinueOnError $false) { + If ((Get-ServiceStartMode -Name 'Schedule' -ContinueOnError $false) -ne 'Automatic') { + Set-ServiceStartMode -Name 'Schedule' -StartMode 'Automatic' -ContinueOnError $false + } + Start-ServiceAndDependencies -Name 'Schedule' -SkipServiceExistsTest -ContinueOnError $false + } + Else { + [Boolean]$IsTaskSchedulerHealthy = $false + } + } + Catch { + [Boolean]$IsTaskSchedulerHealthy = $false + } + # Log the health of the 'Task Scheduler' service + Write-Log -Message "The task scheduler service is in a healthy state: $IsTaskSchedulerHealthy." -Source $appDeployToolkitName +} +Else { + Write-Log -Message "Skipping attempt to check for and make the task scheduler services healthy, because the App Deployment Toolkit is not running under the [$LocalSystemNTAccount] account." -Source $appDeployToolkitName +} + +## If script is running in session zero +If ($SessionZero) { + ## If the script was launched with deployment mode set to NonInteractive, then continue + If ($deployMode -eq 'NonInteractive') { + Write-Log -Message "Session 0 detected but deployment mode was manually set to [$deployMode]." -Source $appDeployToolkitName + } + Else { + ## If the process is not able to display a UI, enable NonInteractive mode + If (-not $IsProcessUserInteractive) { + $deployMode = 'NonInteractive' + Write-Log -Message "Session 0 detected, process not running in user interactive mode; deployment mode set to [$deployMode]." -Source $appDeployToolkitName + } + Else { + If (-not $usersLoggedOn) { + $deployMode = 'NonInteractive' + Write-Log -Message "Session 0 detected, process running in user interactive mode, no users logged in; deployment mode set to [$deployMode]." -Source $appDeployToolkitName + } + Else { + Write-Log -Message 'Session 0 detected, process running in user interactive mode, user(s) logged in.' -Source $appDeployToolkitName + } + } + } +} +Else { + Write-Log -Message 'Session 0 not detected.' -Source $appDeployToolkitName +} + +## Set Deploy Mode switches +If ($deployMode) { + Write-Log -Message "Installation is running in [$deployMode] mode." -Source $appDeployToolkitName +} +Switch ($deployMode) { + 'Silent' { + $deployModeSilent = $true + } + 'NonInteractive' { + $deployModeNonInteractive = $true; $deployModeSilent = $true + } + Default { + $deployModeNonInteractive = $false; $deployModeSilent = $false + } +} + +## Check deployment type (install/uninstall) +Switch ($deploymentType) { + 'Install' { + $deploymentTypeName = $configDeploymentTypeInstall + } + 'Uninstall' { + $deploymentTypeName = $configDeploymentTypeUnInstall + } + 'Repair' { + $deploymentTypeName = $configDeploymentTypeRepair + } + Default { + $deploymentTypeName = $configDeploymentTypeInstall + } +} +If ($deploymentTypeName) { + Write-Log -Message "Deployment type is [$deploymentTypeName]." -Source $appDeployToolkitName +} + +If ($useDefaultMsi) { + Write-Log -Message "Discovered Zero-Config MSI installation file [$defaultMsiFile]." -Source $appDeployToolkitName +} + +## Check current permissions and exit if not running with Administrator rights +If ($configToolkitRequireAdmin) { + # Check if the current process is running with elevated administrator permissions + If ((-not $IsAdmin) -and (-not $ShowBlockedAppDialog)) { + [String]$AdminPermissionErr = "[$appDeployToolkitName] has an XML config file option [Toolkit_RequireAdmin] set to [True] so as to require Administrator rights for the toolkit to function. Please re-run the deployment script as an Administrator or change the option in the XML config file to not require Administrator rights." + Write-Log -Message $AdminPermissionErr -Severity 3 -Source $appDeployToolkitName + Show-DialogBox -Text $AdminPermissionErr -Icon 'Stop' + Throw $AdminPermissionErr + } +} + +## If terminal server mode was specified, change the installation mode to support it +If ($terminalServerMode) { + Enable-TerminalServerInstallMode +} + +## If not in install phase Asynchronous, change the install phase so we dont have Initialization phase when we are done initializing +## This should get overwritten shortly, unless this is not dot sourced by Deploy-Application.ps1 +If (-not $AsyncToolkitLaunch) { + $installPhase = 'Execution' +} + +#endregion +##*============================================= +##* END SCRIPT BODY +##*============================================= diff --git a/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/Thumbs.db b/Adobe Creative Cloud/6.4.0/PS_Deployment/AppDeployToolkit/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..fc62b169b767fe5b6606ea80186e1c75b8fd3320 GIT binary patch literal 6656 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 literal 0 HcmV?d00001 diff --git a/Adobe Creative Cloud/6.4.0/PS_Deployment/Deploy-Application.exe b/Adobe Creative Cloud/6.4.0/PS_Deployment/Deploy-Application.exe new file mode 100644 index 0000000000000000000000000000000000000000..04c5570784d401352a24dd9c08872336d5f8b982 GIT binary patch literal 274944 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 z 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

    uKublUQ}wXsZiA;xfP-0AMSDJc6s?uSoc51 zWOH$JeN%py5*EqK#Pk!qf5T7d*^|WdVX9ma2Q)U&Kbt<{e{#GVHK2sDA6RyG-nsVN zc_!bl!=j6?gp*hx*_?8gmbpY&Z)rfP>Sm5cvzZVs?PQf1XfDFd%PUC`_hFGFa8f*?pNbPz?HAxgs*Omm5+2NBq5oFl@T8gFM_8*|aEX zQ_3N^;3I_WjmKyl zKm75UdjRlj`|of6@9Y2OkAosG00j6SfBgCD3a9_xdF!jl19jsxI{@(id&TUBV&>2o zwLDbTtps06rK+-FYY>qMK%r1Vg8aV*Kf(c4I0w_=QTyLB&b6E0p>QUhS8^nTj4uc` z8mYf&t1h5pC=f9^SUVl<)b2jsjd!)~8vFX{OgKQzvgz+Xsp-@k`F7vs9))Z_kE(h! zN|L?6*l$tkU2yLSyofjX@2xH=P(>~W{`sd02>TB{8LAJv*d?rh%3e@a&_#4zV;Dkg z_@r-U>#d}qMnHuX$}DpOIei2du>X_2=XSRGzfaA&7X-mB|1#^M!n>|FOnQPYz)uwf z;Tk6OT7|%>09l8HF9+=~oZ^2C0rU;z*8H>e-OjWTT~xq}W#Ru?PWEfx-U@+2dD3K{ zpusnM>Z{5}P`vjaI-HAP-|SVxeAuThT;MoVs!zgerIUaBp|=;FqFtV-$YjfB-JP>F zo~r?3Z2jEbxn;tpij;&OQuqIR7LUPwGwTp9D1i5Hu{YmZreC@DWJG-hbgId>YOv|^ zRwUWm-34W=B>A>|fl|BXiZ-bAM3MG%oIrN%(AjZcfmE zf`X!9Z*R|IMhF|cXp^{v1O)olMaZqSrNvAmgQw5k^t7r%FhWXD@)F6{QjP+kpSjm} z2^UvZx+-y{S80^bU>KJomxmmtDd_0RKwIp?sQHdJc5r%yOM?vpZ z<9tY#6d^!U8V=IK?|!boV!y`y{?hG%3gD*$V4oLxEd3T8^RKr=dIC*&$g0tQir_GN zQ7Gd9@K3JUH>xZjl78B~1#gM00NrpVqKnPyvW@TS02Cg+IUj`>0Io|SF+nM9ehlP4 z6&dlzBG3-tQ;b{j6bFT@cBHJaU_=fy0_>?nry*(B=9|CzoyWl7X z2&4Jpeg{g!!q?uCCyad(p&mY4?HRXyFF#xC7PE9lP@sQ~nC)pNMpBD-N{VJ_GF^XX zW@e^Aex03Hx%Yh{8>)f^8TtG#7;(2^0>)hd==(sWAy?+aHUvu90GSbL3L{uB%7P#B zVdCJ3rd*?p>R!8!=7^>0?&v1%9Uew=#)T5J;dA1LS@}#U4U=rrv|8RXRfcu{Wo{@3 zfbb@;06~+dUP_lVuwD|`^DW)F6oP}%ivtJ3{xi<%K5MBDJs@LJS1i^;1xC@-BYJsD zFiFJdTQqjE`$ekYFvYy`&&beO*?e4;UnNSYBi73jkoS z)?W+>hdcxAJTExT)qt{C0*7@0u3(`+bDZ9avje=(>dv4Y{u0@Q=RyFLPu0LG=|QbM^Ff(bnWHGD1?v}UYN`udTfA$tw44atdBnSWpw|8YF z=_Wuc1z{Pl70E;90PHt%?AO7;!3Z;J6MsfZAFLGH_d%9RZ&z@sMJ%sU^O5Iq8hl+o ztctoN`k!gAWZuj!FJm*<$o$BD=DrUadz%ll)rQV!Dk>wOlb_gtlwIpFe@D7F1#ar#i>|^S8H=7XrKlF%GA;s= zgk-(rLRuxT_X1dmmL={+cbH#kzMVe|kh)Itc<~|x;FgJ`=a%^)u`TE~CQTPd{{yCM zi_R(s6xnc)*b%6f&zR+6R`~SJOEegm3=|d?whuY{^<*k`O^!JbnO=3*$BV?m6{~|RhTZRyo59Ep1=l`U%5~o z+=*%eBt5mV1WR?bFu8EMEZ1LkPy?cUJ)j&2F=!@s`1Wh=m{V?g57E!?8lYer@)P!7 z{7rBDvJZ8>%11U5zeqfNpK)tW z83W4*kxXg>d|xauzQmpi>wUE`2xW1|UrOgME5)Irq+1F(ESElO?0L9YIyB`mW|ktv zfu5qp3&8=+0+3$j1uA&_nf{$3L3-?$$iEaS^Yai52q_T(X+{yC)p$?!YQ4`Ug778K z1fbS|bIIOsGu`B2KN6d_4XsK{2to_%g)w05GBh-4yoq9FW-qmC>;S>jrm0^{UW`#c zvyEc8LF9Wg?Wkps}~EFK(E;iNGp4-?(O|__;uRIreDA&JvPVx<~^t& z)ny0fS3QhH7*ubYec)N}I?VmiUD@#P+mB02*ZMT6GCkriWICRB{Zhi!Z=@$!FSg1M z8!20ZF4BisLML>jG$T|xq+IB>U!aRlP~<{BFj1N#vKzn zn5eQ!X1D{$7Sz`#X}lRseHJIl_`dJq;lUn6n2B9Ko)0JA?|;eBqsMJmlO_uYC>#`) z6lU<<(jYlV=Gu7j3GK`w+$A4IyG-~j8tqnOLgL|#j^xcoYBjhXG$Q~Z0(kG_q;7X( zBO#FdPSg}NqE)h6*6a|gZcvow@G?eHt=mCg`^QzJ%uXSA)YB#p)h2jLI$mRxxQ)ro z$L&r)A4EAeaQlAt?AQPf_sAD~W=kW&sSQLFZ+C5{PJoaEad0K1E15&+y7zi}W$|=a zi@yDC_pa6~n0|UkCh6G=CTC{8 z12)UT;&?`J(o3ua6iAaUNf)V>XT)wXSzr3X!vCPNgqdJ>iLQCZtn*<}!8Az>pfOQV zV)4?`=|xvQ{jLo?UL$$~V-iR0<@spDF{;7M--CM5z}M-)!NCo<7(4BxW{K8Z%CE*A z@9MCCaneqYe*kL`q*9Qr+-P1nMq$qxjPdq{pSR)#A&5+9ot^%9~I5@yc z0}NrZNm-aRmK_-o8!!xf+xVV*#`W>YYQGg+19~WPcH1x1-y*`LcG?Oaj1x!?n}oQM zTLI{o`zcqo_3I%_RA~NX1pHKSHP{{mu%m!6H{Gb->?=2~u;k3(0ZT%_r|)QgYimp9 zFE$C*Tc$oQCO{Sy8DOoUgWe1C?7En%mN`vHLgvJ1_V9CTV~R5H(`m_;-}mesHf4GZ zQQ=Mz%wJwSM%r~vYt)ly12DAH45@JQVNqN44|1!22I%}BK#fThHei4OfO`?hMF~OL z&@y?AC;VADmPvV%UPppr8Y{ zySCV7+DLE3Jwvi~xi_flQiECGw=y}IT;Hr%f&RY%pdq&D;xx3cEtf&HVj_N^qQfWHs;X{pxN-lTpuH}wx2~&~6~TtU4tpLSKIw?Ay`i^h1mpjIRo-7Q(#=3O zO3X9VLhJzbH`wI7Ki(_7D48;Ou$Do%%Y0_^5bD>eJ3B%Sa{3XjI`pvv1fs!@;_S4d zrwi-SXUL}$om_9_9_p^g1!)I4*$UpsnPFD?5oz1VCS8>Jp#l`ou4gls`pW23HtD%l z6E;u8iDML*&OucP`xCGa|0vaoCV3`~!N7k`RM?EW{DH|kuM;$Y@&~g7skrUOBk$#d zck}qvS||L~7b~k*yonkP{2wGF*|E?ftm2k-2dA;!VTcSdXO*d9S&l(@9Zb~ zNL&j^3-;BuIkFV_fe0T6P``<=J{o1rm7Y9 zLHhKf+bY4yk4L*T=+YBOWT#c!C#Gl-HIDfb)qSF_`6L%t9ti%c+;`UCc5-IULL_j{ z0N4`1phkpn;Kg?%EgN=4zqfoh#!$HT+sn&KD^oC8P{_T!Gr2E-Q*#3eWX;4sg^tC4 zr^l>Bd=*DwIPOKkNB*Z43P4IwY@nTjMVb{%q~{qn?My zfrtibcqM5&(G!~*h*U~a>w+E!Uacc@Iy!O1v%ifLQm2FVS2UsLDTtrnIN$bZg7N3y zo|Kf7c~C*6dmV9hSbX@j=+*7c`rbY|IJ3rvFy7+KF0DVkMdd%&XK&#kPIi{Bz^pU+ zn1o7>`P)bKv31*P>C+~bFa##;ZIgQPP-iYfd<+N90Zo1RBj6*jpwp6mJ@zhBgc``v za09bVng8}GbLo6`oE#ocbyBdu$$b;hXIrx)S2@sB@`PDyXqn^L6~=ZyuDac=;W8_G3u0-#!SVc;DI)ED zTX}{JO_!COv{%oKmK~5?os9!Sjxt$tnrV6VOf-li_4xI(2sm017r0@y9Xmncyw~@g z;8vy4{v2;OAPc8S63{FmbWx#%V}z7;a32#cwqcnNry*FabNXP>Oq1p zTCt@sG!*=Soq2A*6+StSsQap)4M%~7E%Sc_)ZcV>Vfd|NQrznvHYNo;g~0Luf|^s@ zcn?$ha9Z4@DT;nmpugi3yC<n?|$eY~YUCF&Bu0z-FVdvGYBqqlOVcQGt zI&<;pSY!9DP;cTW4vPj?e)p;Ql|^OteFKfq&}EU%v)p&#%Esu1u?;L36)O={9s%2S z6Q3Z!y7|q0A3e#w7b{S4wFQ@N?NZNdoF3VgIBfa|p)gFA@%D?sQXb4p!=S_+qNokn ztt5SX-m(i9L*LIt{_(chM;BqZCU#IRBEfn$gaOL46HI;t<{@IIC3O6@^B7wwTJU6y zV}Te!AR@;xd_DJ|Kh|I*68QAiXP|&eSloF$N8a~r7E_{6iLbc{B5QINZV7G{S?Vr5 z&Oh}rePufiO(8a&LGosy@W+ZvbaHMP6!`O-lcPvNCgHwiw#U3ig&aK1*sa8jY*CNr ztr^{62cegzYZzLdH6o*`im))zzrS&wYBCbL0@DyPJVkNc67>Dfc*mOhgd{fE0$Fmp z6}h8ab3s}TLF^p`r7B!Sd#TfOnXqyQ{P+7f^1+pr6~x^9e7?xsD*Y2w3T!3%M7ab? zP0?M_G5;o;n#E=uQxySe(iLG1*Uzqmg-ly!xd9D+#)nj=?ztj zdhvZu8CQ_FL6r77iJ5Imt&XjCM^-QkXZtKL$-{JvSl5YhUv)$^IXrpxYd*FhQxoWUiY;rd%SAiM+_m3b|COk~ zl43k}t3|gScPm9l^c&ZH!2A07Gg6 z{`VL6w|9456}7dwGApa|D84n^=ZexR6GDnB^)5Yk1~m_!-F(L3ExYmQ2ndG7i*bl8 z0cqsU6pvP2{IpD7=-Y1O_MOMm6v5rSJyaAp#XkV<0Anmc;lMAVHFbm7R}i#y%ElMN zjaM7<&h(SW85o2jj%XHLJHyRG+jrq^3|!d)rXCF06;J;jw@s7kF0PvhNW&z%ahPt{cb1x43?HK>a5D@5U`uYr z{nn63*+>{8GOX6)@e?0Qpj`w)XHV?b#R`8;WW7YQS@v_Wv01G* zy?L62^V6>Jv+u)HcYnYc^0iRUsg22dy87XXW^2sQ=YFZ&Jrx%cY1XJRa9NBfJ9IiR z99<-@97OAx4a!}=vP=Fg#gou5($LG@4j9HS4T5A%hBvEMaJUWBZiL>5iKKiki-2Py zvhK_TN}}DKWUZx5&Rfhm*g0rsg}m<7gv%A!ScjaGtZz`#5y&0^PB`M0Zvco*Nw#p! z1VxQ8x^jHp)T8toFgZVe^#B&sB$U0c6Cb92FtZT>{deYE6XeWKOKWxBpOZFQ!`jSG z`T&MY(m@AEvXUI-Kc;`E@CGr}2iz+Z*h|EyX>{2$MN05&n$1-_p>j*pl-+?UQy4*p zV9mRLGm3VW?vtK$x&x8zSJwf|f$<#}J^rI4>rqdseAx=9VgfP%CoG$?q7?~UD9pj` zax3JW)TSjH4FJM~C0k2NH`ORRwJna`(=_OF_L`cU77TDFbK>LO0ullO*xcOcErd)X z%9Rt`m!vo;N7YCQ`PhwZ^Agd2cLRc8(7}Ocl zFbR=W@&u9m7-R**Z&pqVB&d7C$<$Mx-aqK~91T*EIw-+qBf=!TxVjKp=;N7Aj6Y$L zU)J5#`J8Tss-%hczM?TMcm!yP3!N-vnl&4SjW}44MGSWKj zw&8RnhrU!g>j-<8ujjM*&1PKE)d@VJNenFQk)b^)s?ln;=Fzx&rnHknK0g`Qb0;$# zz5eUhB*VWR7^Ga$CE8LixeHq5s+#row}GyD{r256#z{WNza823`QBc_$LDgs@)uXS z4E$+NCUsV3lpY1ULwlLNEk3d=wv^Hnu;2lWPPNey%% zrJc&W7N7C-))@w+%63c!25uA^2pboQEfX1<;}QH9?1xiXi_RVX?Gj@=m{ z94`F2)10Y>fY=WW_&7~!5pXeUGLb7CdTVseL$Q}Q)J+;z7e@h3i(pFwidsPi<6vLk z_*qJm&$_3$pK)6LADYfPoa+Dm{;)G?~h-* zOXtQq7*FUaPhF2Xctq|$-xBY+pExL6*`(=a7p$^(+riVrlgSVRfrP^Ooqd&ouPEK< zzatRl_@ZNpj)$(_PPq64%MvsRKpE`fVc4sd70kx|-U)Y5{}Ja*5U5dgsH&@biFj7F z)QL30LqF_<*EFX-73c-zdKTmUnR*M7Mur?(O< z|99n&<>|AKD??e1A8v@p>4XfF#s~y|PVtGQAE5E^@fAZFPT@+)=n@(qE z?Y`S4R95Ym`Pn75Hzf~I&%2X7CojdleQrkt+$W%@-Aq9yEv9a3?e`3~m8%54p*O3= zSj>F*46pP&8;xwcL`^v%WeP2XS;zN#@Ng{DZfIY_Hr!)OLuW@hRbgJ`NIg@RDoCmG zo~jAxB_M3U2RlYVZlY>hg_Ii2#8@&O(}6l;G$cPNYgPOU23YjmX$lKwi}H;R3VF2g zl}_VytRPXj>-~UU5$|4kKQJtA3m333blGqr^x;3+&7WAEDcNFG!jHKlLyk@9^;bESQGaYoIv)tmOeU8HuA!Uu_>UtD+pHG zI)Ei(^v|Cbq2P?~&lsWM`MvO@pl`)v<@NUV`YLB9&igei&(5ORTIx8# zQnEWKVz;1~mk#+39Bzb&X^l=86pxnH)RbyB}z(Wyk(XWQ5 zZMPDBL^c|Y8d1T8iQ4JpjQWeqRdvGUcRt0dN3=Uyt9aeCdH5af0Y~-C0L2TruGM%2Jolh4Wk7hnFu| z`d;1}>Cyj@`y(3)fbWEYMY%PzbyJvahhZf zIHigG>Y~x1T?Cw~YHZFJWB#^CdY)H&v_s;a9J9)klSx6F$!8(Jisa@@?DyZ1+(^OS z`?RPcDs9B&hr1Q~Y+vdgaGo{i&KTY!-yWVG7l&((V3-m|`DDG4&A6p>&U!H~Ff=S% z-i*bzvPH`gN*Nm{ic$f%T0remf?<1AtRG9!L$b!;bFM$hFBNUU9MNW#KTl;Vm`>hl zXPKj!D638E-QDBLzmEFRaF&}Ro_sz6NLpyH2UaNw4m`ag$>w*Ce8I)h($VR)z$?H+ z+N3NHD#Nw0STA7gKZ^x7*wYKq;sz-eWB|IxiI&14mA9}x5HW^CfQdCvtGI%rOdNq><^s?k` zp<^K#&aS?#RCfW}>NxQZ_&3l|uYB93m^%1ju;gA~M(F6dSYj;gGZnUy|FHmU=Q8N? ziV#41MG^@VN|o%veJP16P(||llzet(p3tvk`D3N3+*9;Lk8F;YhkxA9x2$t3`SKy! zjRI+enRbp(ena`-5#|Pk`R2*J@SI)D(BNqehuw8`1o2{Z@YR_N2mY#)c}85^Pr8L= zs)s@YI4=2U9^CH0r|Cz-H)mo=)GUBx3KY^XU?9N|@BC*g=#d`Q>#w+o@&a1tc|wFJQ*5x49|KSzqvN&gjZNr8jZEa&ruyd7&of6sN( zM{wqlUB6r*GGR+HVS&ToMz{brZJCP+|J#BAO)ZL2bTv);>9bN`Ch;ZS;y!QQ_44vo z8F2{yN3?63U_1F`!2T=!Px$aRepMI!(>D^y2Ev~bDUNrBi!A?L5^fUSqcX*r?9!kG zf>wuOIc|zNtEkNEmxA;DW{7O^Fq8x^QIYDmyg(l=i5CV7(w=vE=}~_;-d-r_*}DPw zh^fbmJ(+HJ3KFZ7j0{8Xg5O+IQBd929lNpl0~3$gfp{X%4f0bhb5dIWuzFspB?ZGVnvX z;>U=3?amR%3QHOq+nBIfep@S4Hdr~tfctFW>&cLriA3lucP#h06IYk7;!`=GC6_i@ zOCJG1-yuLE_1!m+f3kIftRGF>28i#~W5QkNEeuHrXg_(~#ecK=_4m1F|H{EWH~}s7 z(i5YE7DfOSK|(t?j}x-JzF6lK6DQ#JhuSTB7c-!ASEkd=)SS!gC>rguc>N&m$5O(QG{%9S z|9;@mEOxylg|%l8{-`nW`$*>2Rv|sqO0mQ5c9b(bUpmes>Nn!|qsih+R?(cl9YV(% zV%ffAUOjzZ9X|Lg-kmK!7mjzp;~gOeD06X)1-#4yA2S2qqO6^yE)w{xW&5L3zo+XX zvUAgs&Win3o5^br?5}?wP)8Y|3?_**4gPR7d_{NGos3_)E8IS9&2Tm?pX* z1@N+!oRBRX{5(}VP*Q51VP2+;HRhP(yqtfRHJ7YXDP3q>(q#ZK&63yBA{V~=Jaf7F z*GFmOW|-!f0>}%U)+Zk$L6aSx7 zeADM4C><}Rg+@h10RTAxBv*Nk{u|`^M4(FGK!6+>YF$J6_YJu-VMzbw!*g2#_Rn(x zi*PmW{wPa-vg5X%e?As&706p$pBOx z%TfWz^kOCcc8oC$++VkAIIv_uu)(xA!1jUyob>5F|L*J@6r^ZD2^Uv%62w!anLzFU zq%__+h*Wm)Il59aI06krGC;EH>_s-OTg?7E5_1B|GO>k}5ej)hG*X1yA_?mCCXWX% z-9FyDnAE>v>GR+<9u9Q{JbTfhu*Z6MA8XjnWZxyrlZ3K3>sD^_o5HtfcCXQ%KYOMp zOE%GTG5PiB>+g3O%fq)7!1DDoBs0$HWwaVg9*i0S2LLGq4IQ0ZMn;Ao*rWZ?ldYoA z45kj1(QXR90hCX7S3TEK z91SzUh`#8m00)8!?xx{30#zQY{L3mA1)pD2W5PMdwxnwl4IOqez!)%p0BllP6tg37W~mVd5WLy?5M0BA4qv#(-|-96CWNBI z^ozo`w_r+zu&de1@>;JAUk(vM?Z&jTxxGIl_*$ge8o_o6I1CIXvs&Jm^*wp-)Pn{#W0JdEh8Pp2FI)?Op#;eBx&44H zIRfz>td|==G-Yw28~7(TA2trY9{JV_+MEFb0d3uClM0&_0LES!8$+>+Te)GUJpUiN zR8(48%7ey_Z@5q6t83ulQ6?QtV$qlYplsjn(tOGJA%Ekgs$p?JfJwBBM~=Gf*0~Gi ztU0CsPjuvj1630~a1ioE3&2#x9q(w%K4%H{vQFD>PzApXoGTTt6#AWck*Fx3mH-H% z-@>?*3vJkyP~)@Wgds*(8y zY^4BbYrO3x6b%14Ckot3baw}4?nhKIh0+P9buLWpl6nqC{?>f4;=COBXReoJx0e^r z2q3eRt{6Dm><;A4Xenr%a2R>`yul93Q;IkwFHxqWU^Lg(wc1jyP^*hB>)CWgHJ*PP z)p2L5^B(*5El=F`s0Fs%J=U}PtP*$Dm3#irjZU}VW*7hu`d0JKUp<#s`&iiL&=!K1 zIDL@H0apKRZ|Jq!qvBfUq*z!#y?GOR@vMwMOCHLP`uqYwb;85Gz)<86D2n_9q^Nhp zaYsMwrhkH|?@$!Ru0H?t#r)BWV(LU3F9%+IJ2UWb>ne2X)~zlCacVjqp^%PP5dY9W}qa_t&w zpSIKWJ#xQ19U~vSJ)f}=<~FB};0^1Xu(lDB7h>2daao9siHQNDL7vHr^{MW3vw}HR z_17ytl!9cHl-D-^dOGcSXGCFYcO*-_lF23|u z^BoT2J>Xahr9guO@PJL##a0C7=I`8z0P$1mgcNWI7l*6rJW`g~wER2R)77R@6-_=k6TWP>#sh8o4AmWR$=%wRd5xvSvLb_rTkJ zZzhtz1>C-V1ZMeltq2AB*LKSrm5DrRV4-uztsS0G_`h`JyT#9?3YJc; zcOs4!Xpwk|r>`JsP%;Nr##=xKgZRgNiy@pE)IL7IeglJ2K%)dB*iG>?`zpI3U|OG&lj6b+##N)AH@+}YJe40zZKqqz3rZRoqh1_ zG)k-NebxqOxEgRCuT>xeC|Tc`xrh0{{x%J|LaGHbmNM9ju!`DlcLHRiFgAKB(agwB ze+&#VAWIwt5KZHc3%66C=jIrl-)IDiuQsMr6UoD5&k+UMYNDYC-0znfJy zu9i)JWQ`yMPDGlRQ_jW_2C0Yv00T^OmzU=+5BoUfu>%RkHbpPfCod&zj}ISoa363sY){<#`FX#* z)NJM|LM%d1V@AU2M*E(Zb|;D>m;a^pcV4%vH|nxGI_j={ixpwH>x^Lx1LMm!UMoM! zrNUkTaYi@dU=YL&c)udS@jZOB z&U+O2-M>vn-q}>R-K}I&r=}G%;3dR=z^RQG%8;nBNx183o}; zN@gI1J-+$}WTOA+;O7cH2_XN~0C+|O%BtSi!F_$QLDgK_hy}_B!ryUif3`+J!^D2D zaW@X;cb?lQD=WJ~;kr)H7x<|ANQMdAr8gGg5D6;09+3+sECMAr4dbRZFr*w5M2LA4 z)3`^)fDkw2az015SpE-hA{;}ogX-~I&zOET|Io9m5&zOIG^&lp^(v9x4*;v>|yDO za9h9-V~n0&!`NGr0WT;^a;c$gGULiN?!AYDy(<$SFAtEgdA8@^chP-rWm4UYIg5a|%_7{_|jk<>~Vtm`>p% ztCz?xBaq;6uGFf4*VS`+-wLU1?o|l9lyhd<#d@fJ4s0b@{yEs!i5#qbp&3-{nCjG)78k8Iah>)Y~ zdjS&Q1(ZUgFeWBR(@s?rY_S0@U@?Wyko)HZ_3Rf8gRX!rOKJKj9r=3OV+O*TYwC@WhrqKY(AD64FeZKM3CWGI=X$f+$y=#QxiwEXIgNxCa3QMqwZ z7o)#lXf%a@=5PUzjK+S|_!Ou7(~IWSEI)m5or<}Wo&%}PD;+njBWAg;`k%fsf*GA` zDEKT)ovs>E3SjVNkpu$aj+>j?^hdsU14MuaYLpv5CsWwZACgD_`7^&qq#E%mkZQUF z>QQL^%hSvMo+`u(7bNQ1S+)YFNe}9?Ci(P{9-eQd98j&z!H%e_R3g$+!#y40Q@9-O zmR$?`i_5bz-mQLV={Y?0By^-278p*)Yup0A=uAS#;AOufLr{5XW~8Um{+pr#JTr`b zp24qP9+rogJ3pqK^)jjGEi7h=yu9m1X?U`s@`Lddbs9pphC8$2KV%)!UuT-r)$Z+E zc`QdGyn%NPbNsV~C)Zhf&|AyLoX?sxf>92wD2N{%a?QxzM0s90D(bG z%$m9C!$re?*GU z8($?_Si;?w$@u}+6RPx`T9q{C)4OGZ3%{@^C8$&0c?3C*jW5f~lgOsap~G6Em<&7a zv0DgeWsd*Rwo^yz(!>jgpP2*>^quc37L8Acywp#=qDjI$!aQPVtaG@@@9Y51SFH8; z)^&U7S~kw#Pv7VIWOB2&vivl`)|hPj~-}>P(2B**LVSD;t_Br@QIgb zROlpHS(`xmbs4E>lPZE@E4jOP? zDj z2fJTp|DzVlii~+8r%Q&Edy~IwmvFAhYI}ihx0w)rX*ixmn@%4!73szF+?CI}Dy{$# z=N(^SSAM$0<>}r+_kp)oV{qvGBB!jYVYUn3q3n9s1~v7R!&Eby@RK4q1nS)O&pDqB z{`~vpm|tbt@mxk|eYVM4Lxd@Mz@Qj*eASsvlwTf##~gy0J!d;$uu;;B6%0LNi8e2` z6rZ2V&+Pk=mNlOk7(=X~e%0G@_8y{BVTWDN^2T8lW^FSnVVD%P`boJwhCkmPp$05X zx#8BPH;?D8+*r}5u+<8ONq!AePv=&z@`VG0~@W+}1a%IRPax}h$o7LhUJ<<`bLxX8b#Q4M#n{BWPRLnlp zbCH-dYg6gt0dP?^xO0S#^@MPaZ?vWhrv>M8M_w&y_u;}8F9Idm#NDt(zHhPn_lhko zD*lc6T%2j141DEXSs94bxDqvkjm(v-eWcp|%BPZPR{eV>ENCaXCI$T(z@P;%vqi7& zM)?1H2P0Ah4MOmw&Q9cD-yJiv)OAL@Q~&sg9ASzbFo?u2vYDenZj{jhfZ{Sh8xB=G z;Etb`lM%Ef*=_t1g|$jAQ$_)iT#Lx%i4c$0Oas_y1FrNWVf=}jW{Y&!YQ)!Sq> zKDNGbTXSbNKPpeZT5p>4cWH3Q3SR^UB}5C(!XWNYkK5b;BgVt`GU!9jN4~zgLRzN< zbkKN<-(FYmp}CW7QXa(ny1OHFA4oy|fKl{EU%Ow+&LoiY|A^evULJOW0zACy68x=~ zh?9~0G$^O`Xg#zLjz!9EQuaf~r&Tc;k{tz-fm+WEXkQ~~_FOA^*S31H)hd$xMH9W5 z+Dtona%KVnF||)v+v@O@+3g-?ut#yRd4vi?R1O3GRr2 zoSa*BxzbJ?L+88wBKdJ{$PacaM+-3XmJw~+LCwwBd(QfJj1ijAcMu{#-6|jF4`e?M z0p~*qLBUFPp+=+O0gj~!lhL8!gIVslD!$V3j5{zwXMaD6E6N_a`=1sn1Wcztu@_98 zvyJ=K3fC4T-a=+wwZFwE_htX`L|lyO1IleG9`kT>)sX2A~ZxwC%<<49r#?{a4oLhAbm+bnHD>m`sYei~vLXdX!ef z;|i4>tn#1!(%sgFeP2RmTM%{Dwy{C-7MqP;3(Kx0iQAV684+Mu{ zX=g7~Tv_ATbMMmCSgVLW)7WZsH?I*lkY&Lt^?8KR>uq@J;%`)6kC+pt;r&C;ra?gtSo^YEFEW*)YS+`%MMX8NudmyIQkuV) zz#evq7FsAAP7&2;gY71=T+?Yc@{)SKjG~K#nMg7q-oes z+m~(=9fb{cW~1J=zi4!?;uFCDUtlN0?aN)EuLj7P8>32^;(vdT|Hs5tjXEt3-|LvZ zpY?DaQtNn>`gXBtr%KG($>b2s{XJR*PhF}c(Mgk)JVvX{i3dIxhfZ%~2&g4mL-c*2 zzb`qp--FGwyCL9O~=Vk3)8S4Ish+O=OhOD?Z)_B+(CQB@)1gkwiMJbSpLMPXz?)~sb zVKYGMa<~z(qN3M~8v~=aj-TmTCFPI<$9r8MI;mF=vLiUER#WOznz<2*~gvzo2n@txxX zoLc1iMMu;<6UD8$i`mPlIcB zzrXpFy`5rqAsjUmbU3G{{&4uF-ulGMNnls8MrVsphKRI_Ar1F0nE-CeQ`UEO$6~B~ zMLaelQB{eRgWWQ7i17wWZYUKi}5yU_UkES_IPW+7b@0f$x? zYTU3S{54^Tl<;i6Vf(2VHmT|<~}@45mE)C zAa4|$y-v2NlO?BFvD?IVd3p@8e*YRzZX`LNd=|Ka%Z$o-jX@%$Z#?Kqwq?sV7dGO} zuA?)mxK|ju-rzQJT__t4bWZsX8M);gPMf{)w#Hpqkfjpl;CrI`ye*T-Nd?Myg@xQl zgS7FdLHX?ON9&|VY{G#`fBO!ubu9Nq9ZUM*w(gKa$T4??+Ngw4?i}230DkS-HQ^i0 zMd+$GFbq9%IRn68j9E za$4loWa-v4w@Umy`k#-0ItrM6Z4+dH%^ACC6?f|c$?cFLovYACv@6%L26R6A@m8Bm zfRpGlTQJ3^rSxP7*)DAKz<}}g8Pglh5W8P3at#g)Q@D%pO4aj2#=NAg;}!Om7MsrA zEFUMj=kC-kK4xulT&PVMf+?D~7+!O^qk8Gq#-j@22l$QdWbTQ`jPF7TKkbh;YKFDc z^;t!jwYDE{x*DMcG-r>NKJh9p6P0EL8p;>JFZhjZ2A&zaN6TPNCN92w9s>(W{^K2)Gc;N&6;FB*c z6&}!+ndJ3ol$;sK4Y|F>bD5;;%jycD1>B!BQ-`>@ysXveZpkecezw`CNMqK`mY+Ow zLwdEK;0@0WZW`GV94Y@~o!lCNw1q$;p%wt_?uQ;Hv(kN>LFt zcA{dI2Pb&aj_;ZeWWLpoHVtd0`5D6oM_&GCE^F}k{qoULE^d|>MY|n^mo@fm04*4l)2^UOy*mT&PST^6qJxvw5*R$Lj-nyk|ZDAulfv zBPhiI^S#PF5`bc9MMw6&r9dCvdIYQh=WC@<^lZ_wWIFyYFBU*~@&07T69kXW*^`5EX~!qXLrJ>*0}rC z-13IGW$r8!T2K@4z%Y4W(laT8yV5-rqheoByon5%&cvy)gd#|@XllWK<_Sg>F3Q1uh+RYIUS}#tyiHl7cU<`G;?u7#+#U%Xb$&@)0kJUDwE2^`tVVL&ZhX zAVC-epyU4e8o;64Yz7rHx;jo1IT+oq&_Nr$*;Ys|uh>w6i8b@KaW5t9B#yfSo;&&a zz<_K{WiNZs_kxxY9RBpfRMEtAOdgg2! zsT+I{=sPOpgFchJ7d%AkxT80d43iGX8tUZ@q5ho+7k$&GWEU2YrL@z_z+;*hJ20SX z6$ZozOISuQpWfsky1V1G_5~@;B#pAe_(p#58vUIKO6K{zp$3I>klxn2R*y-O5!ZZDN$+h?@O1PINU{gwB`rz z*Y+@IZ}h6f0p~2~7J%;7`o}nHlP;4(3DP!YBh%S@vvH3-t>P-Rg}YMjS5#7KtuH-b z$8R=)qVS0#^dUR(%xX_(^HVKOzv9?&VQE%@T$q7_h@>%%yLz*8+Bj7ir~P4X;|1DR zb>!!KX&#@%AOr!fG=@fjds7NR0|!+;=Gi8!`@4tSLl28YO8}wehKL5u(5K$lQSOq1 z@EQ)}Q&H;mr{wuxn1RU0np{+MG}johh9Gl?JaPZy6HcdoI2-+6^IXy#ZGU_8wY9jy zLM^bTKo03~=qTo-)%BjNe|BGBK)a3mF)dZH2!ZCr_ciI2E`PHfKKBxLWP}NTqkNqh zXL7my(e<;ViP*TR?G7*YQ*u8XHe&u%^pI>%Z}#Elj(2iv7$^VNX)V5S;~wr;rbcIa z9)FI7+*i~#ip^#8o;`!Y^KV8CMfwgGvqgc5De`+zzORe57~{}iqnKnbUQ~JFAg}Kj z>m&7G%TTxc>S>lzjW#D{VF{xU49Py11RE3rc<~Ev&_=0x*^Y#@9$*%a=TNHnmLLL3 zX2G*OFF0PQ_E)A^d3yjVbwLhq!?gbjRX zt?(tZV9Dx9EQaO%d-IAso2f;J?f3-YFNx2|nEg7-`9Kx#_rnMuJuc}N!E&y+%nYD6 zc!fDni=_>VQv|pJ`7#q7^u%OW7&JQgI3cpVlrC%3EjZQ#_aTFvWpo8cL1yye^9rh`NQT02$DjF9}U=Zs`&^D+# zV~6_-qT0y8Nl_J~lumKjMxIP$qN@B2j036v6=g|nU=G<1*-7q`Bn3D7Jgq;ZKEAKN zEK+rQ4RNNo*&%$183%9fJ_?V_wK_V#N{dRWz~m}f>Z+;PH2q+;O+y-hJxe;F(c^20y}%YtHRJH8%BQb8AXE z$bf3$SWF57*b#M@;~Ivm({Uyjqj7trqKo_o$S(-3SZqTx0R4f=%&Tvaw2ZJgL1g>c z-6=TjJYimA9md6JkppNWKDY)1@N;HU;{TNEC3a1|+!9+e_pmm6LToolh4zhA;V%dn zQ4~o-)UvNq>?{RmcJ*A{N|{BbxIMh%U2GU%+BR$@X}6hf<7F>*k?~HUtU*g~j(nt1 z=URp_9oVk5;y@~@LzGPH-zbv51+Zb$9-ui6-vYRcf)aR^mvavYc%I#y88T&kP3*b9 z6+VLzt(O1+yz&reZVV;<9D>I)Ae5Fqdaqc=pwqAz-#AnP76?`MXsA9u~zIcqQ|Bd2^xj z*QL_H6Vb+v{RXC_{qbkdq@(tLpJdMQC__vU%#;daFgqS2fIu?L`-e!qEc(Lr{7@Ee zs%1|KO|Xq;4CtBX2Vo=dc%Cy&$ev?+2gPi)lRDsNB4~7-lY<3;q)XJaw6t1maAB_l zS%OyHtWt3S4F49PIF7&Cptnnl{D>BB-K4B?0);C1hUwMO1mS+ccOLM>_gKc$&j4Bz zaLmjuD9Lt+{)Q1o29iehn!ZZd{kQE|xbU#Tm+j!rDFtbs!Tj*hbg-Tt$x;ZvjYk!~drCpr?$; z@YIy|DjGcmAt%_}Z&;W#Ggcx?_4WWq=~porZ#@f2;BAH8!I4)Ve(yu#x`uv$)QPVVTFdUb8gZ`ly1fF&q+0usw zbn$W|rV+?=ruj=TZWPu2%2pZFj+nL7#!{L@dTHb$fgl3cV{k(0))vn1w+(2;`L z49$U4%-J~2bM`ZVX48xP=0wgAkW~oinaGikD;{Dr0d>0cdR!2Peh^9u4&O=fSI!1K zfMT=L^%8%Lj4(HT`t;({op90!e z{*kBJ{I|oefz(&FL@VfpGfIytfs&TzFH3Q|dw8@M5`69KcroZmFn681{&@AR#((_r zTf-q|ROix;alBN&)O--MPy^G|L2O&y>NV#ZGwx2*T!xfokCG!xO!H1f&S392JLR-; zmEVyQ&=7@xQ1*aCOB^FWqDHSl@zUBiJEp*F$>3(u1HL8JC(YJp(c`%eAHcB5od~!( z437-qd-<0jjC+Mf`J9sr*hCnv%t0ELe!{-@HtY6Wxfww9oBTv-5MuHONCX=MwGvu= zLDEHxPZIBa6sVtkgt`o0-MSl(Wz(kK%qdHxP%BL4`|4G7Z$CIYQ0usb?mTo3^k~a& z*5jX5p8uzW4@YR_VSD9z!t8kW9~7U0&MeXalXq*J zA_W0K{QcJB=dk}@em>?oe34UM;&h~fO zx@viwGAC+5D}|>%gWw2sseu+^4p7o+5+?@J6~B*sE!RyAx+Ol51TgUC#^~EytijDP zCvmfS>wQ$IclNji3W6SJabVjz>G`!7<31t^@OYV0?7g~#6K$4w!dn`^&-?41mGgpMn%9L$^xr1k1XjtW{WLSux?~_j~u=gLm=w23q_G42hGfOKt18Aq}a5Aft*fv;VmY z#P)&^oQ8v#MZv+O?5NgvFF10`_CJ~sow`}6?*d{;gA&CxH2FebiOKK>RbhUjNg5b4OOPN@%f|T zxZ}KKKdwN0z1Pe@EpdaF3~iq*({25!`0Wgv@sRzEhuf3>%3lPyXbV0+o;CSVsznWb zPBssE59Kv9G@w5rMl>Zu)7}D7R{`I2P}*QB!EG<-+sgroROQ~7&^GWnin}q1|y?{qK2EG>ryDqiwBHM+ch%KYjZ2f#crMGiGp!0slR_Wy)AHvjRB?3ptpS zy3GitMrLt>@)35p411xU=@|{^@oYdg`CY3fW+U^@#ue5w4^2O=2DiOmQ?d4d7R(;N zoAv4T+${v8c8~zcAc+Z}CMIF5d#&dfK;Ep+bKpg8$B8T_?L`^d7idLWZFj@}7?DBVJe<2mEBDQBAi|TQo#M_uMYkC0I3QJeNE{+N4LBRMm^kqAG0;1pnrMOpb|6u zP76mm5F zp+7dNEA~Y<;*@vnr2# z(b4^hASZx!e2enZRpL`+;5s2hBsi$`fAlCCWLsMYg@{y9;h>w4>h@o|i{szUGVI^5 z^j?nEUD9mn93{-!SAnC6Coft+_u&uhao?CGjWpnAOU$g-ufBn}_iMf)*aLj7fbWio zPct$?_(BkmCl`KftikY&x9C(Q!0rQZbni^3XUKtCX501xW$wrIqGe`uD31(41ahO?#MZb9r3ChhJfmgp`O#sY0nwMIRJ zYHKN})E+(g&%hiY`~@9RJ&%u%-F;D^y`NSv*z5fRR9pZ`K$T~r-EGuS?25KpwUN@y zAGRmvZz}bK0x5OI3Vz1X+ZXSgf%_|cYT!5_ z_RBfxeX`^2 z((BEa)~dzJCU7Fm%jvC?*JjT5z`>2H{8J48_zq1b2c_riAh%IhSLdqWGo1ydKHj}+ z0ozq4Zq#>kU*5u`y6KzxUI2eZIQSo&Ts(@{P**v9YIzjBpClj7uCq zqgXMd5d4q=S{~AHHrkf8KUgU<{%Ay$}2z@UxB000~vYuRS%qemCFiRps#nG#&H^c*`bb2u7@Yv1PfBF=~hrU$_h zi)l0OWn7z0@PhiG#0%oC2)9-rGUKd5m$YqiM{VWR8@Vw@=f zz}Fu?J$;u2CRPdu-Ig6I49{*IrXMd-IQME?oX!U}pG@fqndF3RHa_|bwTu86&jT7^ zSkiH6Bqt>C#hvuftlScjzq7M95at5-P^b$B*n|Rr;4c8A_@w5v!ybRVIfseFeVj+0 z^@$^m3aS~IS#JVLDLa2ZCmIE)>$z@Y42*Dz+hqAOr-kwSd28l2oD0+7zd&eUFp&fl zOxogU5Ub-M>N$q?Z1#aZ8}eOJjNWCv&rU72+)$qD4uotD(0cFgGZ~ud(U2+ z^k!|tkfCgpPz9pP?XTK}7Py~KG`#gnx}o6vO&B=qc!QpJe1qSY84%V`83m&j=vfw6U30AQ-y4p08^BjE0vW?Zrs-_ygNaLjWNyc4u_=d&7cAC??Z)zM1n zRf9T>j}npp!yb{6S$Tx~G9E7Wp=(5gg`S!O0YKeEE=Jt*y&0-yLyjsqHa5;L?0dN0 zw~R~6NxXj_woA7jJo}hsRDB&+__wloYhSiE9hdEq!S@sq#SZEl+o5GZ)x*eO)ylFb zMn8YIC)@*V0ygzjl$95~ra!-~YKVI;=zbKQ%sdJqzg4p{5DtG=vr|UuSWU2xZHSE; zgOI6O7|o?HLsvv*%?UVGW(c1AJy5X%gZIx~x(!qwo1QH(5NiN2a&!z1$yqgh{x&Ue z;p`Pal+@I@sv_l;V0n(+UQ5f^V&ZLV$KA&KA5G^S2=)KR@y{L3US+SlQb`mclyN5& zArys-Q&v)$A>;1sqC!>@rx1k*85w63Wn}M7_I9{Cw|<}RAHRS6asRl_ectQ!dOx4f zNB6nf)UmN{>_*Vc*LKd`><_(Ger*nx`So4M1JTD=J#q0c%K zrl#15yxtg-;CXJlv$G{4}hn|j`rJx2lJf#bap{MpapK4x0E({x%e>$Lm-}0REtaSS2kFqp_G9=*v!@$Hi1gV#|mD$ z%e$R{AJMNQ1N;#IY+M_&eKlH#7mmwLB!Tjl;ohe3Lo-WkkMETaEGr;$gz@XbuwA+K zkr!`a2`L=V?1vl@Z(I=utXKZC=*@}Do&jEB?w&dn48d3xS@({Oj#4axgQ?D}So4Hh z(hG&27A~o@ET6UOPtli1R}u>C&^!~$=5RM9g4Z4=&=|@kbV8t@4_|qabDl^2L?Q$F z?OLIV%qm4i+A$BVpo2n9Ow0rrVAmE<=XrjnyPXIns%&4JnMejmv0{qPQwR)JBfm+7 zaOM|_l^T~SbK4mA7_hl%CsUEN#1_tGIEa3MC4Zj4O&lv|$9-Yd3^PXO*)R%*90wS_ zmD2cKd)XoX^E#A&v2OfYk2bq+^hZ9HT15h=6yP44>kdB>{D9;44ZR1vFu*btI4V80 zfbQmGTu(ZsGuhkQTjSCp;>NFsEhb2vuHFx=xqm4u^!n$8)lK^iy;?ysBLjf+l9VPs zG}H6Na8f-kIbRoe*4{+g7molCHIieI295C%4cvy_6T4-K0>YJ9cid(r8};`-74Y_) zctpSQe=R_r`)4FC3K^2x{8aAN{V^RCGV*fwxriCJTPGgvUU6h4j2H?@#tJVFC{; z{!C9+xc66bL`w_Y`@+-BQmXh!5wVM1V2$KQNb$Md|7Km;(4ZUhqAA6M{T)h5sv9!u zl-1HS-QVAzYLu6Ct4T@yxqxV(JkZmnJ;8Qr+%Kg!CQA2Z{~KuL@15ION_PX#|JJ9F zYofPsIND?qjDz0zhe^@7`d|!zO!;@RL9JcI&uBisYJ`x$oR~~QWE(}B8Y{=ed^wJI z_ex6O^gDh83kzN$?N~XZKKZS`2E1wwLoFGor};m0SCyCI)B97^;)5v2Vy^MvETC>m zkPoyt+Vr$w!B;}I4}6W)$E)D)ph2yx!8}V))(4DILdy5kLx3wmR*Hw%`BV-zX+R!A#YG0I&~SHHjD z+0wpM@%|+gfFcG0&$;Z}=F=T4DTzc5ewTydBOJK>D|RIw&3Bn|Ogb6M#>{Bj=6cP55K3?GQ93)FG76G!nCBWB*T8;1gxZl zrYH00;wqB5sGY9_;!S2pid=u3!e(}=e^T=)cI2I><7$tyICvh$Yol4~Dj>{klyR>Uohm!{m-_h0P zvkTdLpNHa1byfzFp6Qrvh5e2`u!librbz(Knm(Gb^*lm_%}cTQIH|3Dix-o`u72P6ZPlloC}w%(q?N?SN+yNFlD1CjG2;BMyl#6ot6NPK52^L1VWm>K`+k z2}bY7rvo6Lpd6%76r|ZfOZGtC1p)wJGu)~f@7`sBfCsaCBQY|x*h8x~(BDDthsQb! zE6)%)Z<@W_e1i!cC3srP{zdS+0z6=F+&%693z&=0Ep^9ljPPCVRnJSvvrrBW1Q?eo zdBFYi!pRYw*x@lc^A}COU;)p~Iq?Iogz@D`>VfQzbtp zBSyO}4u0Lj8LL9VJN8D4u+k(i&=D@OKyX&E(cJ6NC;AY3$}(}cVWkmr|AmK_f9ze} z1*B800&V00oZA@opk2=Pt=-cM%xmuse`mLIJHdA;ix=?1`pjHU5ReB~ zT8{I7Z)hnWH(@2*2Rki%A(VdgW|}7k^Z-#y&wfh{?$7}P9$}t zAV(OsO>6?n1hcJw7KF65O(Jrtj4Qf09DBF7J$|MQOvdfb%LEJJMfe3i9^_5ZurJm+ z^4p=4L=TNZEbdioT+P_xvbJur8QGU9^I2%O0aJU;swyk5ftSdcGgf%NJs}heSH8X( z8$qJ)*slN0`K7aZ@{wVQ6J-j!p{xyI7d$%Isyi_0ypr?UMS5Xl65cRHUU4yDPp?}yM&o;LZ=S}s4jZ_vJU_QzqF?DD=9 zK6g<>kamATG#SlG;0QcTy~Qu!F#iiA`b@9jeGnUjl<#l2^^w_JAe^b!@E_gt(U1^>j|{l&rl{%Aoz>@zLT z0{GJ@1?kz};~vHr><~*$jlUk+&5I7;tpXL!`eJF8h-{Ref24|+;nO_)ll3IQ4_b4Idl#i*`-JVyX5(2D_oG*k6XG->Kv}>#K_%A#5lk-NoQd(_eFNbbk2*qr zcnzU*?xnH8t1GH+U5MGs&tpCikWg-{H8|{Chu}2Nb`l)* zlKN(DtNd}l@;?>x8i|P=2jT%*nzi}uPY$!C)=n9SKl?v{nbH#ci4)Yv9H!Mh=d|Z` zc$&J^Zv3SgQa=Z*K{1y^0VJs5bDH%E1gs)wMY8AS<|5}y&CSlZWkCXikETSAkBpEL zo12?qa^$C_T4DIl5RQGF;-4PL=(`~=b_@OSzuy(C5}QpscT;m|G#l_Iq{-(9P?_H$ z$HX}TuV_A2ZS?_IAj1r6nDRC~J3Q<@w1D$@%athQx2zeFdRfN|*&%{F|8CyX)J_h8 zcY;RI<=<=qYaS5>Sno45r#4&VC)VlsQ?vo7`G2$cx?sqx?hi&!k#Bhna<~! zsmCD3$K?fL%~puN0>P$y*g?pr6##n{n=SIb&&j;8@#dlsx$tjUoU68$)V7nFL60hV z#SVBxJ!b6nfuTrSV8LlT3MLGK!f97wA)%tr1qF>sVcKpO@M`jm3Jl8nse*hf*fbVX z=IM!8c3E`08DCx>Wn<}rafXZtJ7yCf0o^>mS5OzupT<`8NnEK-9Kf7m*W_3}iNm); z4rdUkAGr7XEg~OUS%0ftv4=XG3wJSwi~X^8Ov&P&T_K@7hxr268Qo2ri?5WwHhGldkR0|M7YxwGECFr}ejY-z^F3O(>nr%#h^N5&^a zS`v66tjwGG;qU-P@57TeB!!ud_4vko7QHhH3iH)m+Cp4;%2fWC!=($rR&~Cu`h^Rj z$HjOU^>uYpB(nT=txIqK3?bt4eEnF8-@^9M`5%6pB@)YtGiJvY3|5s=Fo#lXamm

    IjQ7r;baU+u!iRicEyW*Osy*M_w34mJhU>E1Im=5`f7WFOF#0^y-ypP-CEFhX zKbm!ic78Or1yz=YK;h7GyvP;E^*%NeLqTDYf%FbY8DF6ff-7N+rJ+ytL*VLu&tRoEhS_+r zXYdD0dwYL6o=#uhmfbe)HFL(uGrrYZ`Lk)R6-MD>4}$MEif=Izf)BOr6w);kXW-aW z`=2wSr|=ibx|K|Xn^$5kAl)!!G@trzIToiyw{7Av1P9~Gmov6s7%fnwFa92~xMhWJ zyvnmgNkJj_q!`a-HHof|^vzM-&>fdcbWP$~1)hJ=&^F}hxA<_N40yF^J2E}YrppJ7 zogv21MYb*-Et}HaRBo57W*NJ1(Gu3cKUR2%cZj zytFpw9){hF+jqP;fCnPOfO6eiSRuNXf;sdmp|$neBg!bK@2jYPiqzcFBK3RXQN&^_2ntFOo%N zNgted*?M|^h^J}?s_*$%>e-K*OYDWm;n+&WU}_=(W6ZnFw>H!W!PD}g}! zyIN@{4UwwKBn8xVIbK!c!dMfX7MWgu-{I{sMF&n@-QoCihrB=UpMSVE^R5K+#9n#) z_;FoDh1$usQ12O@&&+Lkvnj6kTB2&|>aJl}Wg>Fw5a3fd* zT#s==9jw$TQPrDc+iR5<@SJR>Fy(dn;R_GTZ;P)H486 z$_rg2!_Eb}$DaLbxMCp-dvPWysoT|`6eIOV`kamc*ywT?xg%Zrm`N_jHDL#DgQ|MR zCVhqdcjz4YfW{yzGV{=45u_vqW?TWmkw@g{V&J=TnM5AnUNXjYYS=DBft-y@8<4sU zb!Av9Uc12bQbG1(f&#A=v#|&mYnxx{w+(Hc>VS`|wH?T~V1%e%1u-hR+(GGu4ex`2 z!B#{)sXIKU@~ozQOpgZd=Qk)^Ogb>cZ02s95q;eJauXPhe%$zC(DF~)z2=wY_d14N z=~OY78*a#Dg)DNqoIJKX%D`6&j=QpkYtFXi9~yn*4=V}B-CYI??%!gO`pPF-Y}`1Sq*32*x*?QG0P(2W@d~x3CMsg>_gzYJAU8CAu?MScnyi~ew^~6)_PK(B0_)gr zd71e5f$D~$7)0Que6=-m2@k2mKEM+ zn;9z`Wc?G9ZiCpilUd$BL@;@ZroExK1fm_6ZL z%%AycJ4z|!-cSmtg0iJ_6(cHVw=T?KV@<}0qHiuE@S7bC7>A`-CxK&+O1m0VyyTB&`5#s}d@amh5@O4|pWS-Cy5non z)hkp8l!M{KMz(*5QL4Zu5ZE`4As=WN5R1uMMx?;kJ(AuVxbq1n7@4DI62 zyZmIj|CQdJ=R!eZ^u?X;%1o~q)C1|slli#wvz8;oDckJ{Pfu25y8o~Do{}!}`7KQC zn(EmALhwJ~XAu9cjDVH(HG=P2jTmc?hQlM<-d94b=H!-}4q3p7@91+x!|uI&RYFqk zza#6Dk)ia48VPolq0{{*)rI>qH*#~#bAsLcIk{iDsa+L=>bxcpSb5MmQM_N)jUQUPL8hfV8t7U6cR zpE>+WsCADIiZ#NoezK0rLK#=R!ay@N~B%H|jD?DL<5?4C?m^N*NB&bxujQg>-f zIoN6)59Jo2xki0D2>wIU9MR9GD3ddb8+t#{pMefr=zEIOd8zNM_P&=lNPY97f6$)$ zc_b3i+ZIZ`&vqy1i_$UnU}a+5UHoZ+&*sIbhCO*?`T%|{baFA{qG{10&t58i73QV& zW-ZiSVBja}yN-T$;{6yPK;=?%KI&nJ&id4jh&F*71H5qH5KX(4@z-cSjPRgNIx95d ze8Zwx;M})q27MFHq}fnJD*g*dVfuBDu-e_Gdng0_dfrKoS13UkkTewF+oiNfnVh*e zVKh}dilr&(1r1)WU9jDcq#)hqGNGPqGqHp8ZyOEgg)aQ z-sN`0FVZa9c_Du$LV9hsn?T@x>CDvi3rqnk(WP;WGBy zs~c6*3a?i0l=B?V+x01Sr(wURYVWphU0YnS zm;Bef|9)-3X?x@520Mp|W(yx&PKCft)^Wjf&8GFPN_M=Pri4qGO5na8pf7mO{bUCR zv(cXvN`2*F@Nu8=K~jqUtTRA9BewhRnB*9j8BjatRO-7X5xDb$+T?laL&0g2k4Fi}l_9t@EdbWw;5{{gNzZt46~&vHSo?_Qo&)v;7{7A&Ct~EyZ5+FMFJF zFRG77rl!P|6t@YJaC}G;nqpq&vu*_^lSS>l#sW<2>XUJEQ&2|KFt;t;rcjN|ap=`&}J|1g~~5R6|&LZ>a^A8?#umZFjENar*>1$R^DnFQz=YUy^s zP=wDp4(CXAS{id|RIuK78ng~9;FR0O^G{3}mqj8kY{1n1f zhzH~S)zM?w$uX@fl2lm~M$o3)a@+-?u10|xw?k72+VVE{O#tN^e>Ds-ql!pa4@Xhd zf+uYFC9me)-X_mu$@n-WMqdkv0mQw&8Yhy4{d1Do5JsqR`?cd=_r1wNK#cC~uoE5k zj_IdG^G>Jq&scfX+11g%hU2G}hTW0e80s0KYBt{jkR8EX1ToIE=c)wTLeK3ZD2|Yi zJkDcEme`LpqZLsRv>rWg#9)bdF*#^drt=7CfV8mj=cnv?J?yF6PY3LWO|5f@Em{8>&&UAmGI}BhR?e|ufSZuV#Ie8ickrpq)zd%sz%z%88^j&>cEJEOSIwgh+ zXrC(V>XK|3M|oulRV*Waoa;95?g+Zet{C>#?T|A419F-;eVObej8@%uR_1i0cgKGy zXFFTI#3At0?_c-NEGRCu@w{W26z8~lakN#I?eQiw3MP$zVc>s#Y^(nvCY|nHW)=o# zi8_7sCj-gS$xttCe_f%!G?Qw_9ntvlzkn|i^#X_EqCs$pDb*mA(mSs|9y&3=h>nI` zs&_*V(f&Gm6|e!)G~}1hpKEGza#%pk@6ZS7sZQPS&HjivXeg~}mlD_O@Rh2%8v2oT zHwGtP$v2|7V>ZmDVjNwuTcQffe?4<+yp|Jl(HNqx;*Ha9>WkKC$blGrYD%rLYA!<} z*=ECW_5xfI5Bdbtr;8WC;VrY|a#^4Q+Ih%>xiI1c{2Xgi%zVO5C`~@W{1qp9_Qzh| zGpam?^Ds?g(r-RoYpZUJnL9?X3WvW7DSh42qSe|ryYyXAGZ~75GXD$tF9&CcUHlA) zaoG^`b%le5F}1RrQ9hzDuy1jq-D# zz&7lAIuNAuyZ&vYWqY*FVoW24S!CCmRnxRXkVtcs9tRuC5t{p%cpH235dAX@ko>#<8iVKq=}enc&b#XBka*OmQ<^uh z5G_;FXn~%-VG%mAG~84oJ#kF6r9tV@N53;!GISVR#VEqi#8R^nAknar5ksD4rScCW;G*ct5myMA#(4UfLG$06!p){b@V$f0KPV=WKtCqErI>ZB{ zD`sNYEE(N{aoN?&L#t99l?Bq#6)Y<+kP%?)vv@U`J!ULo#m$gGHtp8q5S;R z_F~({l{Jap%HFDphUcL*Al3 z3(FtZW`?1t`&J8%e88m*Z0V;@i)T7%9GFhppWNITiAmBm`qhh#=aAoiT5w=aVN>I@ z&l9=7qx(56@l(g3m-N1Vr>La*8unNm1o-pq;S!FHyncf7-Lt9`{v0LG?5e;9ltDY2 zxkgIALL9LBCr_W_x_lb(0DCFPI9SOw6yA>+J+zoHOXIL4=8P%jQ+kNT%!?)3OXlcY z;g_)=hFWs|uLa22=%LK*O@PV4xj^po8f2o+= zB&`+eeilC6mi;8(MX+0*cCj5QLfM-lKz|r#;&)UxiXayR{!NJseEe9g6TyrK6c_t& zE6`)(jP=f8p}Cz{xMQPIlhWPLiA|?5d?qFDkHM5k2iw?;tUK}+R#-9ShoAXiTt&Ez zce3>1M-C|RunEhYOJ$PqN^3=6CC|d+iqMoJX z`iEvLwf*&XV^>Bq?oE(kZezpFp~qJ3k|?R(-R91R=`Az&nWdw_?>n?li)k7JW%3d7 zjMHS4FA#_>NHKAoDV3=V=HJE%&@}a;?oG$dEVZ)sP51voLbCl9Mb*))NK7tE6i8i@ zFQBe`{@Z=Kh1iPs%P<>Y9D|90kR`pzShxJE*Q z8{eyq^M&4n*cal-KRKBVA(VFMzVjpg;8>6$me*pRwp8!V$u8?W!b%+1f=6Fj@<@<) zV5K0rOu9!pX3fj+&c8f6pa3y4&G97E7Q3%q70qI1L`PrPI!3cwpcwwOWSN^xiPT>4={>ENd?mIXu8TmY_kt_P%(-tG^ z{Y6Q0iE}tqBfE9US_39)-PjG=H6A~JHf4NkiczQVoFP9WB;V43&2TSnI=hAi{;<}14_!}GaXL_H& zPZwwe+_ynt!zu;nW05HqNmJN#`+ccPBORzEu*aUGv!MR?Rj-$IfHtJ&DBe^Twr$>o z{s0|oi4aolbmr5|XQJ=bo*v#*?J#N?gdii&@8kn-dNIoz4?L!c2eyS8OvX0@D(`aUXK5)^C1~;}~*9l1ALxSLGEP4*54bU4}FBL$=F?3 zeUs$1@0iO{w1N-sS;9a)A5T=c4t4$*PaNpDX{Vz58--KIQjTEf=HfE?bVIA`v_NS{ zq9IS^V~>|7lm0ws)!>t6Q`817)7nBYHP3EKjl9so)C?r?Adk?51bU|8f~lYkbG!O0 zU8Q^LWCy>0Mno87`2tfF+=X=|-9hHP(%V`5h^)iw2}nfB@kh+O;h=j!_89*4od2zm z%HH<$u$N?z85?6@S1>GAo-ctt`A2j6q;07@;EL3;-diV-|6R4GurykuP$!@eI zI?N7PbZA>HiW=)EQ!N(dJW47^Z)(kgs8>bIs;JQ`Pyehe8~f7E89 z^4$qVl=8+B@ldXiPaC9kFx&ni@2!mZ8@jNE?8mzb?f!xtXxn3|vY)H0lL5=4Jx#e4 zfp+v5zC}Yxp)7ydw{3r;D8!}dfbqvw^->(HAts|Iy)KG5zvKQnbZnJ-q_T^-Sf+nh z?#0C!f*@H6Fl1?T`jPub?#Vk>sBNg-DJjKpyyQ{M1aSZ@e$CgH$PK2b~xT5qD~?yK1<6 zG@4TY{=6mYudZ?k#=7CYa2q(Yq#9wSa?SAh0l zLTo@XQtI?`NGWi71(^aNhd~fWUYsy8G6KismEd44&L|E>XibZ!r#!RiBSe4n7uMNBkvU%hb_NPuvp1wq^o<)`oR`Rgr4A|-uSbL+#63j*3O05bNn-rcRPGPbnV03b(6}~=XLLaj zlWW~?w=EXonVaP@jc(k#YS|O0qP=i6^3@Xb1Rwho*nN6wZ83{U2YZPUniB+ngzvsN zKJIA)gR#r>9rIB7zN`3U=hqcH=P}BK$2)?>y5lN5`mB5_YiS2lofbjqu;uE0o0_B# z9mA$P=nfCdMAXikwj9T3g%8_>#*Q8q#KoLXW_riG0LTj{f`4)Qy0(hIcBDv^>w8)x z_Ix}EKc!{|3!)r%GNsGGdcLDPm`~{DpX;9Bk z^X9|^y>1btO^h@-z6@i5ZIMLF8Bh~L=2f8a2#y6e#5fv-857HGG{Zi7#C0Fr1x^HySod|pnC!Ekw0~sU6YntPYj2DA+OxQPt3$UBs^k% z_!HAuqCk%>@5UFlPRDih_o|i7p9iZ2y;;J!s8;DNTUV2#5WsA}`;fRWT=dV^ziQ!_ za)s<=1oKvXJJ%^VS#;WL06o857XOoKB6k$`B3N1XaMff~`i)OO^Zp z0>}k|nU>*LL?3%?z}B@INe6TdOxh%AbqO_r|6wA|f>wugGYyhTm#}7t~OadeR`pfVd?9u8X7P9Y(|>@&KMSv z3hWILcH0#`h^xBR>ALsj#?MbN`uc9MF=k!&W~X$!0OiwO?6?@5Gk1bGDtdCbm+kjq zIuESoCF)4s$}Ak*OchfRP>2h|5WY@nqxzNooxW2P9Z;!u`I+}IvSJZsVf9H7>H8g- zTiEjxvW;dhQBQVy4M1Xfn>zg5t{1#PpDq)1(DccBVws@o<`N8Bx7Hx%(>d-3OsqhLg9e-ikx z(4gunGY{AVn}9BGAE;hQ^8Jb@GjOqLa{ZAZDoT38&ccVm<#i6tlLp8fsF~54ogJD}c!Sdoi!x8kC$VrZ$x_~%fS6)}NfA!yW zY^iQ`#8h5u+dlfCHewr$^g=i}H*}WQ?X8&cy;B%Z1^rG#wG2Qg_ zTPjh&WFso#V&6i{C;`-*once#Xx`8cIdHh#_bhmydQ&xXvUO99E>HT1WQ(bs-BY}Hl2M_RB`V--wOIBL|enfUooi(Z-1RygNX zD;n&bzq%)0H-)wF#1K;q0Hb}OGUZ4tf+ZUONibUG_V&_XlL{fozoN|$G+eR0dzXiI zoyRXhUz=9Zikg-BrS?OV|2vWe0K>MPgn){cFRQDo@~7K1RSA4^;214!Y(jQC5N_|h zA)34X*^Qs&o8M_sfpFAo}FoY~Z!OdW7cjrLa)$YR=7E`>)uJ-&Bh1S?(*YZF%B> z67lj@;V+^PocAFGYz6kfBU0BY)uXt{4uT4|8DySo(iyn>RKk&u2Sx9VG0U=oqf(T zq@;`(?B`;PC9O9bV_etWJ*F+}ZO+37F}cJEs#)GGMc|fz@{Ob702>Z$7+}_?%`((^ z1BkQdFq21>2jC%w%n&p?*faHL18?=ugZ5Ka!W>%v$+ooo$mBTAh~In?7+~?*uTo~? zG%jtRqK{Hl_8|8BUhZoPTtEab#qgRVnJ(~noVR#fBkZx*_OQlq^XtqmbD3-3r!9%J z_Hm`Ak}{-AsPQ}Ozgd|w6EK|k3ngzZzWWB@zK<~Ruh?uge;4i95vbSo2clwZdHy>A zS&hG(l|83UBGDDg-v%)RcubHX-2j%&hSL>-+~|Lapl_|Mt(AQF5)0OOtqTR`s>poq zj=`ZmR24vgY*pf*;||_!7e;eql#($8Z<^vF5@0v21)L3}%YgeVr(s5?67F&NI0xI9 zI*&x8kGZ`FTe%qeU3}!miWR9G(gb&>vsXMGHw+&`r(-E&*WMiebm>c*gh%Mp7h!5oZfFk4wZZ=6Y6@ zfSESfjj``Z3JMD6iB<12)i3!^DTv+C>LH=CxH}bCv@+;WB$2D zMVu&B^QG1Z6jVt`7eT_FS75uTJq;U=wX#gal?XL_{-N6t-h=1*8Y5E*omvy!OPBCv z4Y@S1m$e$7j-E<;fb7~^3&pto5K)$?n?_ofV3lJLTozhm+|ll%C#@KLxK;6OlE#!Z z{ZEqFr>@NEB8y7KX(0DjAf{xMX(7;f2ygSJW0>H6eXp*j#wM%Cs2>wkRG=~OV1X0Y z5^7#G?m1EIeeL@7Ke6C=EDO|rA}TEWj4>(82|Rh(q!5?QCUN&h{HT(SOy^&eGt^tz zovZsMv^o`1wCM}Xi~<)+N`4YLFQGGGkzv2#xQ59sz2JGUTl6S!cFV&tz=JzECay8Y zM$#%^&28T%cXJ%lp(aKqf1g(2gaHf2fyt5E_T+KecfnYgT2yuPrnY%1DqxE8;i044~$)EpOEVz!$@wK zIhCcS**qMs!mQnD(2^D7`C1GL6s6?JBv_BbSo9?)0SKyNLI?o!z#Hd(lnP~6A}+Bm zga9PQpb4-fzNCob0qzc2@gO?3lx$c|UBv=H8C7})^FhyL$!R5FsYB}RwB^lmp3$nb zRC_(@4GtT%0oe%PGre;9XF8^#{(6{xFNWU37hV$ijR?)gxbq2Kv?_O0rkj~_wbLAJ z{8w%tq4DyrElFXuBj6c=pb8}601ZP{LjJHlhae;Q|GdDVTGofdzKKHH3m)Gn)acWP3492bIn%P9)Y~6W3Kc$D@s65nw{*`q&qQQ%f|K@#&yAXlhUCr^4=ioo7DE~YCOIS`IV>n z<++yv)M~w#6@;{+C>N_~kH*}bdxKx1!LcO8G*+WJ642;A`2gn5incaQf2Qp#5DxD` zg6x#odBc)VjHMNVtoBPA@Jb(Vl(!BF(FN&Wd-ouL!Z1}Mpncjpjp(j7Y6AR1omW7( zvgalueD45yDG)y!YT;4b`^T4A!O`ajr$zC) zDHys;OTp*)&i_0bQn~cHotRIIie7LKgCaRa%|Y8x6wdx2sT zfmgDnR-cZ7O7kKVqR0H^&Dn9uZT?^2=}cXV0;8;_NauQ{t!&8YAUy6XUkw5zqLxR_ zYB(hfwdXk1kUeBp7D~HSxw3|i$HfAnlN1! zMX6N3@94ioW5?IOqLg#}pI0D zp<7;T{FsgLdj3vSpq4c%!VJ6v`Xzmi2NAUnO}ovWy)^l%XaDcR=R7B7C>nS40|NMy zMWRa=t9G0pAK6g`oO>{T8R45wc=TwnONQCokUkr{2gV-XvG19(Egh<+k?ANPZEhGB z4UvDeFCJ|lv_BaQ!(<-xPw8-CDrv`A5RJrjq$&N+(P!X~y@bAr-J>i8Gixjk93uKD zJz4>qwEJLVbnO1&#kTIh06{w|E`IT2 z=N6Ijo7@7@mnj?Z*K$}~TwJ`h-*LxaKtARhP;lt4OXX)|y$k|CLP@ZVvY6e4d(Dxu z)WbvVj8GqXddna%v0R^~p6y}NxPdBu|67w^AOe?rc;7d{8WFys=lvSz#dk{xQMz^t zVVervpN7{9Vvv67PjFMMAckg)pGn1fqH;_4jkpDAb-!i%$Kj=YPIb=2lyv;Tf$>;( z9CAk${QvLJq_qd$j?Svo*C%bCc%G>`R3@T{sx7nxE%LK(`FDs;)A)y>a^#zPEsjl3 zk*2hJxm~7EI?lLjSThMLZYH2S<3gC2MkZBPcMA_|%zs%DOuI1Ft&eJ+m4ih*_!2+mJ<)({4SJhlhHK)Fwm-Z9VSwby z232tX!n;2tNN&h&t8P=SIA~`nNb&WXqVktxW{^GI3zFO@e$x52<3PegDwuVBTRM3C zTcMokd+Yw;VU0N-$LfmET!@qMVgg;&|2JoGW8-?(f=IF+&;=#~ZfDz^_rp zI_QAsDaEP{254->7NefTpOA?#mg|KWUZwtCFrL9j&rDaiEOvs~{DW!5x^m<}?}>;o zxYg5~Wvg4a!fo(}`OgNYZBL8s1LkP7=ULmzmqThgwC$ForXa6T7+g@_sYvKG#)&BR z9ceVqzPX9|10?6!-3<2U_PL15gk0247LpG46GyOJ?g;<8cxsvMDCZa8-$-N<<(?n- z>%Rbvx}%=A1O$jQpSbv3&>_UH zxMgOTUxxYf@LQs&64Wi*vrpdj>@=NQ9xvzqao2XHCO<3pyTi%Z<2%rHhOTsf*9>TB z(PpR+EyPg_OlSf7RpcYlUGw;Gq`tpq&+iWud2reJgU_|7AW1~qADo3?&Jsx--=^%+ zk=(RPpa2WoFsV_dtojaulkotdXN!G##yf}mDQRi!U}(vY|AO=6H72}TjQjJ=kPlBx zhRx!h=ALXcWZ_+doGB+R7p)&L2T+MhDYq1Ug**_0;$9D_KPT;@JOY%ospIVH412AY zeX&Mg`oBG~g2DUES+qYcit6F2$gFDZ-SwESr2hFj)79>Rryg?`l}>qQ?0Ll}U0U`# zmUN(B5kC-JhGl-fXIc{R3T&vQ+gJru<jA= z(jH3txCrN=9j@r|gd7(2W2!pw`Sh&qtfx8WIf4JuHi|&8%Y8^*US8OhdmSSq>m;)j8QC0Bq(YKiWM-66BI_KZC^8}=ii$Mskrj>=vL%~y zWM_|XIL`S#yuP3J?fdx~zCC~7cI4*qe2nXHUH9v{?sv`L@n|4kl?y}&9X5K|CJ(fR zGd0I!G?S0xD8qbIv*{)|$+mWkqI!fz$cT6|)cb3K=3)a{=+|%W?)s3!2CV8z3@5+| z%nesY$~i@-HNdj6OES9jg(!A-KL10smX>`>4PG;Pdf2*Zxj0w;1Ny2ZZEUp=-7 z)1WWPaT?^VZ&mrs%F8=uuclP_)Hgmv1oFspk_6C{x*5`R{#Oa_Wp`+5s=!x^eNjkOgOYqd|whO%I68k z>^BQ-e2jVIxce|6t2V`z>K9^fq38JdFy!8sIKdDd=Md9_tun$dHQ8nU7cIUQRB_#K zT3XP=77BBO?Xf>^vFAk^0QQHCX29RBaYYX1GX3mrC&=08ug(9U{~jW9s3yjbz6Z%` zVS?-+fDGGBjF#t9eY&f(?zy@yGSi0pD+_9@Q79pu&owH>eL61kbk;1(*LGb)J>H)G zR$ntg|0vtxZ`ajEW1=lXD>1cfm zev{9IY(wg*QJV*CXIE0x4*n@Ua9pZ<`dG}n&AEYXp5*yG5nu1LH0T$n`5Yg&R8#xu zuxzyB+PeF_d%jCs^PyUu6&)*c4(yOANyTr~Mkg8W3~*~V824Y;XVd2jp%&6lxqEt_ zvhWM#fBkxpz0B%(s_V7W?At7b3AypLe%s8ACM0I<-UDnu5f$> z1ZLX56kIhm(ysQWZJRVVqH%?nTM=yP>*djfdlg%%lfiTWt8YB5R{~?~EL9jn;AD^k zOI>&s=>NS@Bn2F{i?1%SM-U_HAB|(j8O{=iQy*~!w%n(Tz`Hg(q9lQwq^KNnIhu~=*zVXbxkD&0*3T1;3fH_`-wK-|SG z2H3a1T&h?0Tjd#hO$aZ@9QWYASHpsJtr{ih>1ezr=3a{XeXyo`nu>q17ma&$Xj>qH z84g^b4v@%N`bx$c|~felHJ_g+9prOZ5jx=(LD%=TpXV8$%8|s z&@p7MfC9*hFv39wrPF{fU!6Kveab4BdBUTbYJCl?vGGhKN;{G2>@M z+hY6HXMkJv1{VqJ9aPU3mofKKuNvpOo-2p^C`{nX7FGKju+hR(f3RqT-T!mf`g9qU zIQDH~6Gj6wIS?Frk`nOtPC@;~{llR7-EAdPvQ@_XT9e3+v-PCbr)!_$m>ENY?x!9; zaH7}*gQDN9a194ekp@;PkGq;xTRUNEYB~duFP&?UOo+qb{y(NTjU9_2G?8ZJ z1E1_A4yck+_$hCofeT; z0~?YUhP!F?QOqNsChhd%R!u?&g8~<ZC)F#oy>-M?az2A5-5HxPVT(bk~Xzh>8qE~+?=zbl8ciF=Y11TdZ=(4oH~k>Lfe zo}?#V-I{&LR1kjdWPeED^0Sj_@tIN(@%nafaPZ#i?L6z!Il5BK{k{&6RLZZgamXFr z;dQ?JnaSO+-@oFcR(&7es-Wju9UR+#wtnOonXk;2P78Fxh;m#dU0&z^GS}l0;_2C; z@2NP*jH8}Cc4T8Qjdted=9m01oU~F$WZgSTpww^NFAp9#qkdOZ+ zZ*KZnfa;tYP^Kdx%YVtKtFS~Z+72{d76@vKD2*8d05$QVw)`stOCXr&Pn~4pKTobK zC|LE0+R+~CG9POn)Oh;rDxQ>SexmoWmJ3V5E0MBJ>=qjfA+l7CYE1Mi-}RaE`*QfW z*fYCmC!{|37&MR*aTOO1jXsgM_Bz`tLXIA3U(9=Z-9Kzy2W-K80ou?%f9&~r+V7xv zrMiR}a?Gpxy)mEVQ_*`JKYtR-hi;E;e>MtcOtDfOv*lx~PAXkdRovZ*2tTv zHk!^pWK~M*9{>(u|NS;s8WS* zl2TG9JnP?*yuTO~Z2k;9*rgp2TB|8U;M`F}AG@J~TX%Wy+(C^w`Li?USrq@7KLYP~ z!!g&dvmbZadCm}X=`k)Y)FVQk+96Z_of0G8y?1PIKm1-rf^U(}_u>tjQZ17^*;LTH zIV@fVG8r)?C34b9eL7Q1i;E1pAFfCEIc|Nt<|i23dCvAp>JOwcz1L3iT7eu*``Xuw zLgAMWM;(Uy=!ZXx#?+AXK(*l0c8L!?ackzR<(a&Y3*`iD;Ce+|S^S3o;=E__&8d~? zlnCjj`>!z~3G0`~WM4m7zYtYNnoHl!@M>g8nPG(AE-g1VD5QI4GYSh6mN;$;B*%SS zGQ4Sp9Ya6#?uRj%krpLSckNxkVc7FNeTu@z9V{P)XuWj|59GRWczAdTEd1!FuHs zjah$xO7&p_v~51BNU!V+I{cd_gSNVAROq?5xlf4`Y4Sc;%E_+uz(U;qxzbrm<`AX= z_~Ubj|C}?M@nb{6+cD_)m)7?djaFAy6bJLIT>z5JgoxG>V0G|%$Og}2NYcNC{u=97 z)pkolR`))>lTFI>AW~xQ@_Nl6`F@yfNLnj}N%KGrl4a^sgq54*WoJjwMr9k}Qt{7^ zon8e3RNXmk$Za4mBTsxHHuH05)LK^+S#UlO$f}tgIm#gzp*yq5q>;VG)A^+~o;GyT zF@XT^d6k^}(Re+nT$c4FEY8fquGu8(>(|r9#>Ti=3^(W9+Qp?uKSu=H7&i0HWc_vJ z*qipQAt$Rb+fI0g2OLCxAx&5XFR!Po`JEjiKOU_Y{(}!iflILR6+$HyvkmNP5*!``S<%BqS=n)8uY%U3*LS$N!q`tivf19l_voXxK`R0!r05{PgHUG0yZeSj8>Xgn`U-iX5nt&q2R^wzDhV2VePc(ZuKarhC{d?gw&xwa?dmkldOV7qWec zEK;|rxbWDAU37BHFg;|w>`qZorJTOa{e^q_;tfAw&AJ?&-p7ph(jL59&xl@VJ#Cg} z;R`Z9XE9lk7fuWaDR2E657Sxcu~+f8H!66og>~x*x$u2@NJvr)M{(J(zwQ8<_-1%L zJUkRY(kJ-4sji7FBm9Whc-K&ErEJX(wSI7zl=DD^mM;Bo$3OWXX<90fW4~Ry@IG3o z51%=^?rDmYm+#W0KV`WG3an(KuQVt*9p~yMiS8Nhy95Z+ zdPGtG&hJXsQTCT?lY3rmvoy)Jr6*h!mpbT}|7kX-o$`30N0E(!K#=LI81RM984ZFO zO6i~Ss56CIp%y5h^m(&ZzFT>kmK6@Pdg#WPLgOuHoI`llx6=N31ZiiTmet2Fl34`>6>JdK-eCy&4SmSp`*yW5 z4Vev(GFpA_JUclryuM>PIpa=2(Ct~;so^PQd1#zvVNFfCM-!_!_-+YEHdfC9RkwO} zBlHE%F1xGve0499P-y+9PxQ%WZ&fchGRfFPS;vZ@w{wy$F4%tkR2;;W%4b7#ID9=OsO{kROVUEfDUra2lLeP)PkkD4XpS;biqqm+$%dg@-D{ zJ1D#L#Gw<%UvTjItga`930nu&BC8Qdp-4)mcNQIV^W)v=X0vP8SPVJ#0kuiHstvHs zJnH8{d2ahp{gCfb-wG_zTm6X~=Y_g9rp?Ao4MMSf?=Q-9rz@?UGaXH1oTgdbBK-jo z1tY|aT!F68glz9D@!u0%%G3MnH`HQ6uCTmuqeHc{KokQSqFh~MU+!kpd~Z#dX>!9-n%^Rn;suyt7#i3Ba{Ib{q#EmI8QRcQ zm(1WD>&%1k`TI>QH-?=z8UM#X>9Q8B7{Q zZ->q@d`|Av#=S7lJGcJ(IdO;&dU2{_R*V-~cV~XM0bJtN`RAdrpryHY_L?T$*>$#u zEclgI)6tVNs~Bl+`SkSkU`b|s6#_bl((-$8R}E(Ihq;O6}RFapy8$*)VZxU#vjXUNuNh7huKQU!sA{C7McV;KNBK_P+&k=y3xDWjF%4jfYTdJR1t zuM+!2ntd>Afb_^NH|x`qFk%rQ~v3bWZ%GmZim`dSY}Fv7nLw)cL(BwU2%c)A}x3a!XW30Sc%M_O+vTE z?s$#Y*m*jbOLV-v7A<`zd3Q2!?FM0gu!16aY@K;sO=;9EEz@QH+}5;7M_y-K7H>G; zZiY7SL({=xFL2_o+aqhA9B|7*=-DC7nsd;jxz7-~;@EWwoCMD~+kOQ^tZgZr!@I0mR1H_u`cQL=6C}S0z36{Q5+- z*iUJo1trHp*QXfe0kuB6VqhQ(^}aqwjuAFdI=7+HLD$@K3IeV&BOJI42+Z@)xGPtR zzBYu=ekAYll5XDq5YvAys4`p?Y8z_NbzmN>2Zc_}F?t>H)z#HOV5*hRU(vP$`NNbW zPh;1P0TtKE5R*#Md50PYMP+eqowhOI8spUDA3PKPF5Q#K?}<~y#wd}9kJ5pg+xb*< zZzXc&{C3FClcQ45!0+FDKp>(6_5ef%sf*9}Ksx5eU`i+siP<(LVi$trneo6g&4G-~ z%#s_MuA=rpnTcMq_rnqApK%6S7oEKg8!TvR&P6m$?e@~SLv8)YhwRLXp@V~F-`d{G zMrmgqZnO#?4Rn4Y@=8F}$}S$kHhvTUIn2qFOEcZ{sl$!zU2v;F*81$9TWRf#D^U7) z2r}yaTKvb>4+khF+E7Y9aS7DxIRIG$-d`WD$#XtKR?`#oykhWgOszk0?<{Hrf575qb1DnSod3v^tw10ObZ+w-WM-k zBy|D4`+=M%X>YX)Rd`OYk*{M2uys_V0c5NVSx4-(fX&L@Yj_P8>4eJSWiFc2s}M-0 zw-Nrzfxi=UXV*HzI(Yct$G)&DHaJ*Ais8hxP&w?hBxIwUXeNODMZcbvj`5$H%?*G*TeE7|w@Uyu{+FWfiKXruJDvGjL}a z$rv))UVgHCcQx)xW5+=z-2uhlWv6d#+XuG%LCa|%ghfNb5$+TEbhBN8gW+pwX`)BT za!le!-U;R=X51()$cBftTKSe|K&I{eZ&L@cqlxWW#*|~c9p*%1W~f>`%PK=4&}+UpZ7G=#<- zdTG7|{7YQB%O?+&KvMM+MNbDc(I>mCFB&$-qxvPiOQy07G4#k`E~SwdL^kVj?Xzjv z-r^7%(6k+&!;obeb?w|jY|~5hD}y^)8Tm!H^rzR`n!4(T5h*U43CFmVc7K}j8g9>8 z+c^aL&Iw~XZ9{c5ATLzbyrr$JktWO|_#8jJPU*Pa-UB^7I-#{|hn@=cb}~WWbc!;9 zb+%5k-F!53uKxU1y`3=FLpqT0Rot19yMmVrgYMlsqcXit3l5JY_o-8a@o|r#!NJk~ z)#s<`OLl}H@yuW^*BNZf)Hq@tmUR?T@B>qEx!C5+iC#=l_pU)qL3=Px z=X(Mv4=W4w+UqC&9aA1hU??SR_3+4lr{me6$bVy**v-g;|Gqys7LTQX&)2Cip$rFZ z-`eE6fR`P*e9=(1;DTKk1Sx!jL0&oVqYwZ4_srN(kA?9#AeDz$F6-->K+w_8;1E46 z__FOkun)e#9+>D|fC{<=7XQ~*=zn{;mMPB#t_m&iWg6|wVee&*`Mf&o9q|PyXF<4<7OZc`kpZ|L@6D zW8}OjYh2T|9cP+mhJx<4Ti}dDuT;YYdLws{`Y{v zX#8&|#54c@8H_k{6Pg}g`e44Bc+WGCpW;<`M~E!=^n@j2;Xk&?`Q2qWrS<;0BT1fwj}1?KBP$LiJ_sT089}vrOUJT zzu&i;k_PM7IO22J^Vx@>`Sq#gf3T*$=%$q2+1j$%0l5e^Q*QLi+f6&W%LG9R@o0t3 z-qWZ<7BF+cZeezf++8tMy)sWA`&mcKc+kxNqkptKtUWjkirYu(g4HJYLHhN?{EOZ7 zDl$-JWBcYwxP9fdkpX=Mtamqs4tAP&dncNIk%6=JsJsiRw@&Fz-JsB-v z>Dw<0Vgbaly)#)G*k0i|Qu5>*VRZDko1GVMrU&CsKyjFFA8fY*h3GRr)ikaR{Wpgg zORxZm%a4o`w4y@nwiBB){MU&Wb4(VoPw!Z0dJ*wM-GCZEhTq{iD3(6+@ZrM&Rsm%c zVC?n+Z}rf~W4tmUWQ|a7YfZoQ`~1C8-L*T9aZo!4aQh_2iyidnQBYQvKaHy)0TG(G zJh_!SeKcR+|C_Js+t=dE{vKKwi%^03*O0HDpKY#r$V`IXeN_MR$18s zA&d6`r2%gK3%w_N{-~br{r&r5D{d3lO@FkRCe2lmd%u=wGX!?uX)ytd6YAs$V}p|W zTHGFfdbvYaiUn8PO=%?sh3(aXf&wM?c^N@i-qJJ%e^hCJ1=T7Kei4Nv&pRNH)%f=GB_ziP zJimfa{;W}&*|H#UqG%=0q12H{lomeP*Fgn0M-!^cv|LHYbqsgg5>5&)EH9I{+{)d= z#l=FHGB}%(e);3P-la>D{&ZWmZBM|6 zS~MBBws&^=589Ai(JfY0HXo;9mMApF5E6rpoaa2IL2oe$<|5#~xwv~Y7gHCfbuL8< zmy=w-)hkoMUXxc;JobPxQ)~Ilww5*_4ui3^CG3WfQm`bf;nk}#uR5IQ;KTtvJ-zZo zZaPCdyWd}KmIJhkHwW(V^@}zx9=W?lutmr~R&YT5DG_>t8~uLe?*ogvlxE?o|85lg zW-*Qq>X^5xI{C^>>pSd;R?AL(T}{owm$WoKc@-7Qd2%9zp*TkhCUrQW5cTyS;NdX> ze>%Bi_PhhLGK^#P#wgaqBL>2N<{L-&x;1@7xy@N~#5+_PE=bcz3=n0%VThN8mbgTJ zQR@VXnAfgg+m7z3jt+1Hqzjj3#dlrjUkrf_MFkt?AEO{?-p8~t?r?z_14p5Kh0DHu zgCoaFgAaC6*2XH<^sijGVqIk;ZV07tj(gsP@EZse#2gbFJD4Q}K{za$sld9T;OY5B zka{xiKv%*{STW~uzKG^2_trISyj+da;Z(rUlFJ+|xq2bb!vn>sH3tyO6=uACEeA?m zxJXT;rPo-iZJFGHONae7b~s#JUERUi>V@|ynt)Io0Tf&$=^*5Qaw*XO$`HhCuTfsa z#2Ej`0tdngfoH&o+fgZpy-Xh!#)kZ#v8i;9U5;!D z?u)*i#QBZd_d!o<5XdhKkX(>ZGdtvOhbr0yAX!jLD1wf5Y;^P|1iNwLMtO2_G75t+ zK;-A=|9s4=0W;yfjUBz!!>K$JH?~Ub; z-gsLkwdNA~P|WJ^_$7)ft5zDt=7(bA$ss zzMjcr<3!z8%!ldkomB+C(tI|vI+Duof+&Jp>;Yc=CGvbRGqsNQZ z=%tk4#mx5h#}TXh%frP@IfpGI33rOuu++VfYj1*&8>1+YX!vzjh~EDwO)@(jr=P3LPDZX1G5$`5H$A7pLv2`%-(R{H@s;VBJSCk*YkLWsvKQ{ zDrrl5XFTXgG&8-vT~uI@GXDaDgjgX@WhX{x2`mQ5L(jSNC8X1EM+o)&d?uFS&MK_Q zj51~fE_9ZvynMJcbm;Et`i=uf3&D{QoLO?P8KTntas8j6yrQB`kfIvSu;oeWdHz3w zKgaK1Ji~j@{bwgVbcWo;DUfKL^DNeD-GZk12H$eTKZ{magz51;(brsXj(*m@@XD%N z%JpRxczY`_(w4GS@;AY+BnQs^dF=K=pA5K`$yCb>>IDcoMDw85+fK$UAN;eW0yRM_ z^)T)j#;d&@0U;$R=mZXW$SW! zaT3(!Hn3GnZZGA2^ObqC-`^xSy3~}+naEPggpS*kj>^U5m&)moyu?*-riPe=TJ{q$Xj}mv) ziOqU|;YEWQzUuO?UzhyKwq&>%ef2`}q_BcHVkf^Tpo##4?vUm>9?^zOif;MC)fVan zE$r$U;26T*i|R*c;~;M4FRW~A=79kLZUE&&F*iotk%Gm0$i|+~W_Gl3IE=V@#%4+^ z)I!7d?^Z^&AI1mxGi4c%c9zRF>eT5Lc0r><7v=Dv{fGYxVe$*_p7wNBOa8pVazP~O zuD!${CmJ`@#-*_L_c5xd?CoXBT|@gL)1!N~V1R5%5FW~5oW~AYx&+sJ_%J;L?$)d2 zRymPpz-IYPPA{h|X%##DtR%~gU48vMPwj%tYTdzo|L9}@D4n8{l>tqQBJeLhI0S55 zL?4_ogczq6aDCj^#!H;8u=I&%(C_5a(vz-Y$Zubzp*}U#EGH-jIjJ>X{eDVRq$Rcr zTnjU9<;R1~^34(~pN~`)7P8$CI>GAHTkB24!^kYfQWfLC;$DE!_xj_%;TJK{62jr> zuoHG@Cz0%?H&Li*f{Q*MF<1&~gY08Xs^gS5d*P zRQ{6^a!#$eW&xW zqGISC9d^s#C4fy(aPvgL2?G^5B;y(a<+TW*@i5hP_@_{_GCo_5wt#lB&m_Fn88{oU zT_H@x=X31DoT4Ll&FlAnCm->K87fnYi_g7IQnH>Qw2ep*JO{S4_$BqN^&FoT2S?Ee zsy@8Si#}rI+3ZQ>jWWTNF^K&2i?zkTez08egGyjcO-B#8=d6$5 z9bUtmUw`*4E-r>9BqY?e3S-F>I^m#o{ApX#PXv(oFhY- z*dHP9Ht_X2uN1Qk*&OLAZHSc!^y8l!0dHF`s2h;af2Wx{diOc!!Y8+@&u&uxn%9p$ z28nQyP3kL!`J*>Jp!y0|XfBW(A!h_^k2wv(;XoY(xu<@wMP|}mlIv6_14adB1$w+O zju;rMUl6Sd1I|PFNxj&3Lx^&3xG3}^y-#!&3egw)^qZoOv=q-wHWDt$zA>ZM7%pYf zPC8htr-uCkX-dCM5;=zy6auOV2Kl+iGTy!o@$&K6)ML}!12(#9Ho0bUw{BMhKlJ_> zN!Z_P*YrAtt4u`#k;@Ekq*Ed!y%hy77YXs-t_)Xpt6cn5ne^bv*ay6^qq3iRg zlD4~GD8^zZ+5rm>51;l7_?14n-Um{;kr3?3g*&I{;qeF>WMv72gXZW=PaXS-1g@9K z4B_|hSu5m4Ro+;KrNR7i-M}p6n8XRoC=StEjB`X? z=4QTGYn+hA{u^N+!CIkyFw#SLdd_)(_m|aYQ$~@EnEaTSm|kDvj&>Dy`OU9pPr!)a z{R_L`ex0~`x0{yt6XxyXxwMCx)ene+)}AyLSA`ZXGpxS0WvP#-!2dal<6DZ|OY>Fd zdwj>-`bk4>iqAJOdmZoBQ_hoQn6AsRAUnmbWL=DkXW%`4{B_VYKVfe_E_fLT()Kc> z&a6Tw5FGS4yWW9;0cH&Jlz~A4N;rA@BxjLx*YWRhtB`K2C_l4an5vvxuZU*iO9o|2 z0UCC4c3ftM(8K${BXI%1T5Y+7H04fd`n_uBPSZ0AHxygo%rR1PF;er0R%VZ~H^Ae| zqyYWdJtFA-p^Wg#hyG+6I6*@XX7%;X&ZFw{HsW|i(cJE#L{$y{gO^hY_YpWXy`5&c zzoU$}-k#5iv!my0JSY!5LoZeUixhqT&mL>GZThdOJ(MD~`^wp>nHmmK^p*^FblNcG zg$RkHyen-P?q~*~F+w}948)XuX4+=>C)a6lIN@w>xRsTaGhoC0GV4>th(ZUzh&1{t zP`4upD;7AiNWjq|B9{pOi57`6fwm-G#@?w?WAvfeyR(M}tT)hgEDaT613#Mv-1uPa zXLm{=F6L%egEuGZ)xoghwBD-&7v!&(vyMdEiSOb2^-}($Vy3)c3qJ1*owJUZZ0@(Y zYYfb|q)c$wYYF5zCBk7%{Xq>itRN21wTcvsG&e^~qZgK;9h&=e9TNM;s#u zJv_4^R3LVnhmpqQ2@p6T1}u+Nu!)6QnP_Ff2o6=Z$EJ6iHv%`g@7f>P@uoBHZ;m>D zB`vjKzrCgg36y2b1>tlCS7Gf)J6jW0|B0pByZdoi@^lh|B#`E0fF$s*5W1%^QK1Is zP&bfYFEB5I{LWSA2ZO_Kd|9%qOM)arR5aubUKb&KvW@4mf!(@pb*t{6l)7eSCb)>tr1~vA;Os%S=S8%Z07{*4!>E zb2o3B&Z{kLi=w~K^1;2l!oE033H#3hrd-CSFc8920?(Jqs#990=yLX!wOo45UwJrn z+laco&-0x~ld1IM;UB9kQCYC;8R{h}ZVC^T<>W5>3;7-w0~tjk(amv5kF$5yMBn+U z;FpjBnUTqaj&@J5;M~;XLn>5oi(tEeaBAI9U!S))z3C=KXSAMgN~X)zg@(b^5|`I^ zXoI1bgN>iSao0i3cu@4S|3ZlnwDmUI0_6gg8R9xvWzQMU(Hlo+bt5sstj|N=E7O%@ z6w_ieC~`jB1#>cv_0+vMs>P8^<|I3^q44fJmOzZD`r!E!y<#hc6sJq^q|^Jd_8Ah<9b=a8_0JO|V#WEgRPJbm&3PiAQt=~s zRz&;dJ1AnGEv!~A6_g)cV)f+}6>9TrE+bLvDZi(BXpq_E+g)?SQf2B4B@sV+p+HfKLvG;R*lm9tQWA>lq%0tO(7Q0#*<6gbgQYCgBqQ1uxmrrxI?W z6y=9PHWM@R#z1m=!nNC0geuKW3KH=7u%MM6EbIDGx;2Rw^Ac_6@6YSHqGSWgVf;!B zabEC`PPq7&EKd!gMLMEz3PKh`uQBI43+3?Y`;*m*q(bY8RlMzXR{W@v*<~U7qGHoM>OF=M{TG}p`Z=BLS0a&AN zfRoGenBe_2BTu!(YKR(~-rewF674oaxdo$<3aNc3Ng-!-P-T;V8j~Yb|Gy)qS(`UvA zG;mfsYX(p&AKQO-R*nAF%w|RJs()qRzRrQ98&8i1-=4(@%B|c5VFb=Z2=;{*w=xv3 z;$?|&`1s`=U*YksvD{Z(7u~1PL^T4bo8US2Z6*9is!xtd!*gC{Db5q#(jqL^>>wwh zRTSDQawtCHhwsYTTI6xju49GiQq8xz{1P6Zx(c zITu6L{a(DG?t)?YY)ONhzjJG>pdz1kIvj2&3F%+OW=kGbkF2Ot z$y@cD$c8E(>qZjw5c?uchg0!6S>>7MNzYgBD-7Qbg;kg}Ur(PcX3~9|!9y2s{26O5 zgsZE+c5-+bUV{97%_HQaGxIi0$WmEJmA_yYo6jr`K>AxBT{M;~g-bq&oC;7-$f5rF zsAI5%MySVYGK{W=v&rPb@XvpNUD&SK_Zsb$89;L!(eQI*q8%;oZQ=t+#%4 zvu8X>jDLU3`tTWQit~3OwRI0s>1o%WhbA$^Uk)>nmIP(`C%f2;ITzZhN(}KPQZx(9 z?4i2K)Le}fS3>)&PdACpXsEMGOIR^d;=-?|ZG^|9;h{m5+nc`!Xk^EX?D@(cg|7_V z>x4hG!l1L<8VQ>D0yZxp*iki9!Qml+df0$8O<2Fk zrvb#nCk@9Iyr8pI^Y_cwx=->jebULpo|1;woR}?y!Z}pFqufQ*jFxT;NS~w%WBNp5 zLnV6pmN>-(^ThX`eaJ4uTFqdmdoB%=qR)DAeTi%y;k<-RdM9C)^?gnK-0WVymg!{L zGni>HhX}Ny?aMSgfIZ9HFjkr>mMlZ;$0*-o3g7s`Ks{KTCHCL=gC^d{+#fi&z4WXcDUFxO=f^~m#sk=U*$z!gW|Kh6Uw-m9Oc&9Y!gMR00-vmE~;?nO| zFIFE#vP@`zzR^7A{>P=A!@E$8Ft$xTap3|Q6h4W$ocQaLD%xfVab#VefVI{L7`L)i zZFQ^FRNNceS@9p$QczkJJb##2UQ}zW#o9A+Qv&h&BBi|ZS=o55(>DK=-}!{+G59bN1zy< zAHEYMPE5CSKGA;k4PKBo71{c=>~T0h2|wLYl6Z4> za3Sbyw^FoxPc^}L%x&i}MivJv?VN_p*I5(kIQj_b7!b?^NhZu=O^0MT<^1Pws_6YqWIDi*~=%tLrDRS0q6ue?|aw(CiFG-Q>329vp|z! zwnHSX^W@i)@GD1I!cMByz(tA|1pxj8cX#&(u2^N2iN7i16CUi?=IU79;Z`^l`+G#f zo!r&!^v$8A7=JboipIlqN0w;VVt#F^Yi!QQz03SHhW*nAM{0p&osNdIEz^S1&aHyoz=A?$DWZEdCGUk9D5CK1#NP;~qMkX$GYr@G z$xE)l>=P_zl+W{th@vs< zZQNf${nB%CL5>RbgBK+*vWdbFMaE3_46ZB%?7q5dG(DDlImmZ8z^z9q~IS4e%CXki?$w5u0o+hlF$dSuP3Z0Yh>WV*5LRW`A|$%)-sT`Juz z#XWPCrI&VE1DLx+D5869J~kGYQV^n?@enL(TjIL<*;fX-tfpad5Q6KBh>0Wj<72-T z{fDpmg2p!pX=r>2!_S5ATbn#1KhHCMU4LJg6Mg*=9{L0hwv5?UyLe~4 zc)yz0=g)0iG(6^pgq!??d2xB|6k8Q9Ad6n3Um+Yrp!XNgNS^F3$vFRG86rQJfH4h- zTPQ()L+OMTj%si7dW5^F;aVE@`>kI;en@i3f9o7fE}bYkzaQsDdG?8LyKUI-Ei$C? zE4pgdbQPah6Ia5W#6bUo?@d7(55*+?@m!*n;O&NJqo6;W!v3J*_beJ3O8lrRt{Zmu z6UvXiIVu!v-kylH6SI(}`b(C%Znj+5)aB3zfy1O6qY!X!#ZMhyQa#I^;(8C1mo98^a4v8ZJ}@ho>R)}!#w47Eaw zPvkKnmSc$AB#Z9S020N_iu&%=~=X2ED5!`^cDVt3w}&F>)$`ZDZAWkB>IBE z(-T~;@MQ(?uP5k>v-%c$mz7KH-;%Non31A#u*z>qv)7@*1low2f`GHga0ouvFA^o_ zW}ig|;}h}^NjT;JBGuQnf2()SxN_esn4H?2*9pYQp(;dUpBx&bQr~;FXIpjSP7SPMg zJ8yNKx0PX&R~go-eBX?4dL|0kgZLTBoL=}-cS>?h>vYf}(`RzU$rT3X%X`#InN99$ zvxMdtsOC_$LD)+35{IMVyC%BTkIzJcF^CIi_9fmr(C0SAS0f%}j5xo21spTb;s~e@ z;MoHwhfGT}ihUp^ZFV}0IKy*PQoQEBWvCCQe0`s-OZZ#}gJ&q`fA2dS3}iu6LcGwM zxuzQ*;xzZizM2=-ow)+A^eUGZUrHgIbVr-FqviPyIZJK4O=vtVtlX;0mo8{dKC^0r zjY4G8bgc?{V*X0DQxJ9R2fpV5nde#2jxYmX9#5hr^lye--#&UMc2xqj`q|jYK zH7$5jx7Hn&Xruu9^}%D>=tf$(1bu4*S47*RPZx{0`;9*k2m`lM820vBwI~hd-~Sw2 zV7=?aLT_UYgCYNN;XiD$DZ@-QVe~i@R|Wl3{_`H6-VcQD^nfINONqL&DM8T7KH~*p zslODQ>lcL#Io^+>n3r`8|A10pYAt|wv5s z59DZBcwL+rZA<>6^&JTKkt@%Agi!b!$QJFWCNDB{o!Rj>ravw6%Xn|E@y*k;_eV-{ z#NWW=F2>8lE~9!s31n5BK%N>VeVC(~R(+cW(?f`(?Fub+8@8Nb(D2UBEK|-DJY%$b z?40IdmzZ9jz+=&o^xoC!lisoEL&Y8P5yt#K0@b;qhOT074W}Z)@o~NprG0)gd2)J0H~|3B zM+s7{1Mz^0#rCKcAghcmtf)}>O;UQ0Z7JxUJX-=F*|GLNG5oMZ>9L-YtE1=iRp6>H zqA8v->y!3WGWZbm>@+?Afx;3Dj)&7p;KthiD#Na_ib|ZwfW9aDK)1gpor9^Dy*%Nh z&Ln|P(^b2e94bDqB`XUGDt;e3Nq)A4b$s|kmC9A3{bt>$amlUTYN#sZZ;J=APy)Ji zQ0@@+46Z+paX_!@q~EF2E~}R;&tf--c$ylNsw^SGJE|H%LkGdid#{>a+j}YDhfFE( zq=)O%Gg=C{vL~&wiSb>v*9PfLdEkU9Sm;}6{q~adro5+pW)g=$G9-3IE)`cAxzzgt zjQS{R_K)_X=~)c{%W@E_uI=vZgvFTgfXSe={<+Jqq8~i`Lf~GqZ>jVzdN0R5t~UGh z5pbKFhT!XHK!X8Om9E=(;Tbfg(({1U^+?|TSU%h+#(W6{f2(C-d zXb{h$rll*S`k6E97{cBEcAo6Jo*-1 zQrv@!H@pEq{aZF@WaLf5H(ha@3anp5xy4@l;kC!gToSVeP9pz~glN zX=E<_A2BERaTG#PQknbozHco}av6YXqRz%elgqb+k00Nk2FWWQ%H4lof4iNV$4ax` zAAOTBw@|7(x&`BXA+jdj`pRh{uXVt~x{)FNDh6bMjF0bi`_*mzKQx_XR8;NT#m@v? z1A~B4Lxa*G4Fe(|9X?74BPj^dB{4&TAX3sL9U>`Vz@R7~EhP=olF~W6$NyUI2bYVr z{Nh=hb6@wh_x|lsP}2U)$fgy7lhecDfNx~@hL*{$F4EU911L%25Bqw1FY1$PuX_c*xyHa4(=@ea3{7qapSaS|ACqV7 zzN;#mEGlXLiA=aHDXTTREnhcEuhy4T=tW2};AVUL_FmSat37(L(q>01d zp1rL}f!hAe#sOW#{}!8=r%!Jc$AW_(mBRuHH2eGZ%ty~@E6dLyisDw=X;$0mjD_&A zWQ%(A#oYVV1b;ujNw3#?skI_tiZ$%n>k}Sl*8^`I?H0c0J7gBS9O@madL^1J?8~8Q zKdctWegr=`RoTAOpHC&_TRT!#BC0ZalBmV4yV+QH`$-Q(YX3#)Tk$lWj!-7}S_>jM z(8VT@=2K}YsVcSE0XsJm*Mf*X`{zq3W`pNdQNSK@DCsJ?xvI<`1U5IwR@Ue?V*`Ac|4i zOMC?fy@I(R`&hz$-c?_q(iNrbgM-ty4ND(_5ceLEY%5x1mHs2|u6)$Jrb6S*JD1@tx;{?fIpeRS^~Out72c=kH=eyep*4DKVFZ|pHZ<9*xCXR058eQ4v>=9Ex`(9dZ= zQOkrXi=#AT0s@M+DRN5B5BNtD?ur@6K%xoQzp+*z?_3&C{wFIO=t|Gr_y2aw@^6)O z?a5Q;Qa5K_%31#bj{V)Pl=Y&nxv>spqF76ZhW46fa>pp$3o3ANk?g2%2g|KlmIvDq_y0nI<;J1xxIITX<82y zQzw}0jjaO-9cE^OtQZzjgJoa=&K=OrW2AP#mjO5-mr_7=slZ1;R20Xds(B5`hxr;w z1>yV-ic_|blI_pOvp-r^bI+@c%8RnGLVlf!QN4G*4nKaVJ*z(F76}J_V*i|YQI!CH z-cQ)Yp2sa$*#+F>ETx3Lhm|ZfGwZT?og*K!n@Vp5a?U`ee9{})L%45hzd435>w5U& z*zvbYh{@DEVC-E}Vt1^Satb?`>} z76dvK|2hqR~#S+1|>@9}Cm^GnD4|^iv3MP4_ZL z<#L)dLUp=zfY&foPaH(zCJeod11*V@BO~;7#E4UguxvE0ACAEofU63s!{6oQ<@37> zU*BJzAM0;Ux71$>x%&4=H|(?Lyd%0gpF4NyYqJvz_pz$?52if%JJ_zVYX~4b;Suy>8ghFMrc814u{n}B%Fmm z0?qgGGXTe=>{j-J&*S}@K2~wdz_mN<&jKJ6Cj5BVx|g-=ajF_atx;OhE_IAQ9SDEK^LT!uI#q9Ac*7)sm1fgUJf|;J!&OgN1PnUE454+(9U_~!yqBTw-`a|Hc%8=h1ibp*Gs^a^Rpkwmrl z7chYAwXz2R{5RD*+uQN7*oN!{t5o)_wQ!R(FKbg4e}mLykqZI;6FbReKB%&|a<>c%>^xUNzukBDe`(_8Ua)P+P_4Z^Q z00LL-jQ!#uT)5BN9Ue-s?;Lw`*;lKp{pjc=KQL#? zeih8mPb_pHR$YPe{yZAm{IwcjaZmmQmXi+Cn{edu;Hi|c;F9js79A8SZ-7LoI0@8Y z1FjB3OO-FTOo}XoSDD~=0nDGb%(uS^*)B=W^BWMO8OlC>WKOj8o5zQQRKELAv7h<$ z-Ko8=@9{8)hLzyT7p_H#_N&&?IR!}tn-7NjrFnQJzVfW}r12BpXx?+Ro9%DsJ2T+C zBaY%$Ip_DU7i%iwS+CJvk^+B}u+Q$)a0KW*C!ao66V#I>eVBpxgYi;zPqNX{Mfq&| zNL$3a<%weGUWOrrLI=rCl06@0Iq;#;p-lYCzz`YAQbSdcw649mbq$L6$w#KTE;jU9 zD`HaF-M}H&pLZQDIG?^|w?KcP@{Wb#Ek8(lWNSJzSo-HCJq9J6Pi$OWe7wAC{_xdT zl6w}xbuwSn`$Z`Xy6P?k(HuQKOP{iYvaTugt~MLBM_N~OMmR!YO2ARF$dax(9emnz zr%9w4Ck|P=HUJiXbc4=mD8%BH&)2YYCQZGNQqstOA>{=|(B;L7J#WIEAA)5j7k|LB zS0K&9{z-xTyHf%Zb&;{{(N48U8~O2ZJX(e)g zPH^8-OPDptDn^isejm||9vQ!G40m^lK)Nk;B|3pE4rng!;zXf}H;2e`mCmR*x(AqB zk@~B9*}FZ@DFme`-jV`nAzc-OCqW~grR80H{l0hf3NIgD`9K@^I~zIBdnza8xzxwv z^q`YD;H>wHqKPI+4$-F~xh?wmuYrws^=)D-kz^)nxpi4)(G2)cqbS2%d09>ZJmK_b~nX z+HGHqYVqCFfDy?#3wSGofy64Tl9ZHPNonbNh+TjH=@D^@W4)2aAIz1pm4jyr=} z(jkjOz3C0jihxO82rh-lB)9QKBpf=~PKM9N1?FmoDqo#mDl4vLms&ikdZ0lbq5AIq z`)fj>CmAb~?$_Si^rq%zW>&Dudf3iiAMjIOmdHEpbpg}e3fL!4z$%Y(zNf^F*eB<{ zueG0jS4{|0<|f7H55*6?KlMq0XMeFQ${4^)s{eYbhD_fIQQ0t93~ETZmGvtgI*I+c zA$>OWOk}n-y@;NhorOBGtQ-6M-0^OReFT&$oF6IrNaEo|ljVN48ZX+L1jnQa{&qdS z3pE=EOBe@tY2a2Z9+!!TxfAXs3c7=+cPpoHFw>+J8Jz?rhT{G71op|GC`PNlq)YWEY}9#~IiIKqZi?_bX5KU>8c zlO+2DeqI}!Sbv@*0AB7$SR`Mz^ks~V)e%F!f_^hV0}|w4&Uibv{$mUGVu5PTu2Bn)@TXJb`&Ze;+ZfKm3_+TEBfUwnES`m_qnYqiE_timLPuqII-77@30*+p0 zlj5PXpt*VK<>M2&yDkIaWat2J_TZBRAp_5bs5Ct<*eH8X$^JZ)No0_5grHUDtbP%$ z24`k2$+s?E@$Bh)roNo*`QXg3Dl=zS$MV&J^VGgm%yk|;7tR0P^_98AxLQm9Z0k{s zAb=yDOLywChkh`7vE+t$Q`oT&X6P?2euFU6Gw|vQOXs1Sz>K_<)uk*s!6)ZkEH#P* zE>Pr6faSB*2gk=*M@F+cBT&yiaOi|-l=M}M6?88zoY3xljY-^Jr2~?Wrsv=Yw~M2& zU()gVKXS5)#xkBce3p^F_MfUjqh{3``Hmu=)bwqV#^7G_^^}kR&c9iPb;`5jW%kUw zfq9yhizPD%U;`I=4$THV^{h{CsjURKE6%?x_iGf zs)rhfM5!8dkuUB0rv&rwY48HsKrS=-{PzUpWeMqXz>V{B#@unXklRlPuyyj7>hU=Z z6;;q%(C_{lR1Jl`#Kj|h+o%2mlt&alc-6ly`?v?%5gCInc$!SdB|(^?y7lp2D@d=P21)cAQK zHu!Dhg{xjLt)$64dzz#}n7tZzt%2kd^a?`}j@=dtnnrTUGo+tAdfMn3?EuY;CUV>& zA%S|y;v(|Vlts4&gW>J!W zPdD{{aFM?Ms=!NU(=#dP?B5DY|#qRE`94eu~|)b{5S4Jzo5$>ujN7VitmM} zp}A$H^Pge8D6=gS?g2w~4a`X@T|?*H3XxiRzmkn^*P5r7MLvGdK_}nHrqPMLUkn(9r;sHA@Psfn78c6!DszpxA(;nHh%}>cWyGP3`Q*}P zvfCl}m^~-3Dptr1Od83uU+8%gI?eX=>o-+L$A($F8CIuA`8!yiN^X9m3cd#eOpm4K zmNTnXSpt6lz2}UTGi;_wiMxivKvA=ucS{GVEcHh&z3|MORUc<}+~#GP3DRMd)c_tp9?*N~rPgdYB9ng#vik1V~0+ z(lKCw9H5xm1jPKc8*n($j=;iEbVTp*psdF{%8}r80*=5fQ5WKTBTzmhP^16o99em) zJ&6^|#%3aOs%>0WSeRwc)H@Rbm7nScw|3@vfBvwK;cW}H{%-3a%avbv#Sg=jc+2sf3t+aW5V+l zH4T_T{IS#b%eQg|axR@w2V%*kKpo}AZ%L6PpHO8x)$0#KDx$IqQO>_dI7 z%RHB(qtIza=eM4COzoMvlg|p9md>&3ZhPYRZ+_O8eV9yL^iAXj*`_#BO!}LLlFyC& zYbYOGxKB@_oAL+vZzL5_l4%g^DfA{wvs4vh>8q0tc+IcJK%+Tlg?E`}Q)S&7TT4}( z*cW&KVK3Bs<%_Wds3~0zgBNH41zFj9a1|+efR#g%i5xtFU!ZKm++`5p@&%nS6ibw2 zpuFO%q)(Ae3E-7noO4Hu7r}gM%x=@Kerzi+Z<2j!!Qx`ZfS$W$8gJ8jJzfwWo*ia= zvi{8LdK?!9Z#m7+%rbgW_0%IiFYW8x?OT{D-3Uks&RF|DCL;*#uZBstm^R47=Q9tM@m4f10eSHl{D1Fn{5{ zIl-An@gVVc=;s8-&Cm}T$y}5__-La-v{2;ye=Ru)ur#L4Ou-g~+mDJ5x~#1HemJA@ zt1N_#ebKchUZwyW<5ow$ZAwiFJTfXu;8w!Y|J>*uHT=6!G^LIq<-v8FzZ_57H3J)e;kF=Z+-c%ZOE z$UC7O?W6KmyozeO?R(Jsd>GC=1m6Wu+uuoDQxN&Bt#+N1qR#mVdkBqh_PxKHv#BFH ztdh|j^bw3Biu3X8W^kW}ac2dTF?Ki9I>nS&Gc(Eh%&}Yd_n+3=Le&IG<1Mq>NLBvw zKc+(%)wT1(I>aFclnQS10D#uH?FS~UQLJ2C30?#?N*3k3m19W~3PA@TKc{V<2n^y{ zZT|W59KvnxU~j+H5_Tj~TPvU6Wy!*((I3tHt$U-($^qa;iaL6f(2ew7zx#^a(b z^=;bIt=HM4{>M@*kM#w``hY!z{BZ&dRl@^#5Kf_KM0g0GjBW-_B-leGKu=42wde)IQ$ORQkpN7aDcON)+Hn6VIX?z1tm9 zx8LOPOouLIq-_z7;zCUT!X$91`dXRCS|#dW?*6CK_T{(26{@@wGZ{%!isui!qgqrs zx~{!ol0>~H0L1_WAjmOz_sW9J4Tb9pnMOu0JO9W;hwd-k#J{{r@R1!`t-gvcv7anF zYyBv4;2{RJ9E$hzHAiuElO-ux$&oL4CJW;(QG9poJn4~1lLpq4qx zFQ@8&**gs6f!7QXaSqK}j@k+Xhkm6kt}T$%^@3IMW^R8SqhEg?3p{04zk&5RcQVaM ze)YLzM&O2Z!S`xKU%|AmrL;R{W!Ug_)w`db(9U__R|PM=7WJ{TCst{E4SRwf>5mt7Zp>+r@vG$|>%Y)FgR)qjf?XD3=pCq#%TkY3NrVXT&B>`Nju07d>&un@M7 zOcMu;3zw;Y^El`@t#TK@RhUrsl=wao-W%?Aoi)e!PzXu`7|+(;qp1BkFb0tW>Jx3Z zZ{N0elKL4g{|t0O4)^~-*W;q>r{owk+6FNN6SY6?Sb8~Z4kzX%YV~%G;kVMQvVO0o zD&1~g227R}v-Vc!bdF$vrai!-Vqoj8_7K&8%BKh5I_Vw;Tr;@s_!s_b^Em&*xjFkI znz&3U0P@X8S|a8N!^nevhj z*e5YfdX!eDK9jycY(Bai>bH(YQv4w%E_M;}xnJMQsVRS^Y2wuA$#oXOC2WQ?v+Vfg z^%{+rVpQ(7I4Js_jRVz$AJ7^Tg9<%B2GT_h($A7Hh*;uLFm_H#*#&UeLP0B?Dd0td z7kP9CNo3?*Re27b*WqqDNo?HV_F~WwB}m)CKD+@R&`rj~A&-e%6@N zvbk@P9gw=%Rj0GZg9L=` zg=sg&JQ%RCa9{|mG+P!x4u9B@mld4G2o0Z zJ4o^=f!CzzEYY%%=Id3KxFB{t<>Yh-w=HZoQS@(&G_C&gRqI0E|0JFJ ze!RbS96QIUr}F8VL14w1y{rn}kE`{OY7^bwhj$5!jm6^7X)F^5(*spaPb^EX{5n^+ zjAnv3XI%r$HZNHJ2T}xm5j=6%uOBc z%X~2KXR}^dnjOz+=sY9)O^!8tb^gR$?J?IYB=hE?!Yk2>zkW@LZ7%z<;n-cJ^{Yis zy>s(#cv4Rjchpg`FcQDc4JtOI{CeqH@0?1$W}A-AIvpvCVcwlZRYzX=?`qbRluj*a z3#Gy}!T$tahcrBlh8v05AQUm;10nI7Rkjh#oE?*pcl78y*{$F#@zvwE^1hDV5YfFz zK=2;-lf3er$~DBVN9sQ)sPp^w?nhhyjgHfJ4oyvT42fK({#BO!fnH6bD^=kwKEY*i z*oL;?@>UWjw%fu(O|&R8jeG8nuXD^+eBb=8>VCX-F1^J?(FwqzODRZCKAcX`E)<%H z%#R6)Cd4oTdO!(jD2oX{Xq2XA<%|cSLw>U2J6FDi#!virN+lTi?}-{LB#^Zof8Oy1 z4Lr;5;^X5>!9PaZJ8DIjhu^xOK%LBJgc)yTp=*Q1gPNpI9L%!V>ru=wolv4*kD3X= z?;NFsszP+tnm3z>Z0wnAa@>T#MkDL#~>oJSx5odFn2WN85qsj!eC zMVG3T+BbzOds(j1%3I8mPahh~;`|}EVe@h@H8Iio+bUhecle_vpqz}(@_>IT5C-wd zw|L_ljS{cddsDyPsArk_I$P_vE2Dyh*uZ2fwTVV?@TdnLhxeV|`95viZ2}%jPV$1Yhx;e&8LMx6qdZD-=aW}h1{FM|XW724U5^h9rf{@O zz(^7w{_lgA924{4rD{CAIr~WPm?z}hu3KSa(82`1~fvj*94af`Jd1m2^K$QwRE&NIBH8;$WE#NjRaL+=ho zr#N8lrQ>C(B1WNqwPN8H558z5?sCHrwBp`e1u0a{w$*Qlo|A`~b_J3X8#J)HUoWKX zxKXecW#FuwZI~}i92@Vfac46zb(W#*bGe|1Q0UHdW4lFC7kt`p@#Rj-?-#eGHvxWP zk3!AYQ6#j|ICFR+ZJE1l{tFMB4sG}_;{@gzZMZt%O*~(7xe4qfrX>-jQUIi~TRWUr zAh}6r6S;N4I6TqQSg$kD1LXx}-alQ;IO@-z8`i7>0=CWs_83+NLX`>$*|YwX zuH|@N^86{K!*QKIZc(6sOkA_kQ({=3k{NcVyzwcw;<_=ps^^2A@Nzgm3EcjgI3!G? zuTuH>$J6dYm_4fuq&QWyi_vgUx+RddK)HVi$)6t&WL!fh!#QZ*hKJjpv3Zl!Sm!s} zZ}ftpXdYtQy3L18 zs$=YS9`7)d*(#qIl-P61>F(`5N_$2sJTq9sGHAw6KflRWUSS(26P$5FQy~PDK>o0R zd)OO%=rEjOz!8c9u|4})-sxGna#dWUWANw&-7K_Eux11TC_1wFFC~tFv)f0ouRX6Z zh4bnycmvftG-=H9&NKbNxId8^@ZuXi!MS9NmVhRB4i#68Yp?=GV-az#)9V`6$`5{z zgCKxMnG;$hx7G>#bxrHoXAqqtf^j?g3I8Px!mSYsnQ^h(KbfyNP5$?8t}}~nJP&Xd z0Gx1L@C0f!8#0VVY%qpM_9a*@>b!xngY5a-L~W4#dVs#(bBhSFzC`0OR-ng@6Jq6p zu2m~KbQZeGod;@_)*EIj5QhW&u^&IZ#D%1E##QYOOddJtdoWx_KlCx^EbWdi*O$(@ z6WtY?xEC%4X20Kv?X+%sCBq^As=D4kwDjkp2Zv$%W#LQG#s{?(5+;){{uzB8sLx0chqJ^2$)<1Yi=J7MG zI9s3BDX%{3pHx6&G3KN@d`)xUB873sA^*s3HJ=3`KXALzAVG2rdVuOU)-OA}z?zX8bCnlz$ zR1U*O>j7wd1`i|o?5-yp;tZ~_kHpgwKb^+8m;aQ#*&e*dt1wfo8B&QfR))ixK7>VVV&&t zPC?9Y2jElE%D@d?Y*o8T4ruZb|AD9?DClwk0g`6JFJ^+#c43v352`9SkSJ>vkfNi- zQ|AmCTAIOb04)oZi4lF;>?y^~G$rsB@*j{-m-QV~S@K3fX=h*c4MtsEz08svVIZ9L zY6ePC6LAWx+{NfBLzySF|qFYv7+>`O`X5osSegeTiR$L&?9<5tG(p5;ED+n?3;Cl$b*p zKNqSPa)U{&3j2GvR$+iHzexs$89s>Fakch&btm$L?oI>z7ecIzmFvXwELXaK>j~@Q z(w0)D7Y27iHf6s_kp8`BE4-~16h#e;xYG(MB`hw^b+_4FPZP*zHVP-%3a zCLe0`%aqGyXIsSns&q>t(v$9(gw?o!RczAAVgO_N!HK*De=$=(AldfZDJz>=k<0bN zdWrA99-w%pE}L*MwFEO*@qb`Apn!qjCG7pe!s9>mCiV7I_u+TC;rDO8o&@2fwG;qE zLOT{ruf+a_K0H!Sy9wkkhA#U5gY!+jf67QG(b@eN}{k8i$RR(;`Js*h>?*AsZz9vIlV`6mi{IwFfKM1=~*J`#fAb!d9I4`^|kNm!O z5|`7VHu$rV)gonx7iAeG&WqxS?Bf-(-oY3WVvsll*h1yZ%zH-;;{0d$TJ2jezLN9` zd{!(WoxtcIdKs%wh=QOWlr^XXR#r+Cj)He&>}WHn0CU0}{LP9G14Y|+cQ>ah2?j>8 z+h_d#7D0VChP3+lEN`BQ0io1h%OZR z09ql3#BJjm8ygd(pwUca-$Ft3YWOxFCqPOZg3SL2qg$=3`}|t@oTv$(1P4-QSa9^n zY0wY{`DxuW7aR~gkgIsIG62BeT7EvG_JWb}0j7`!;@s#wdjR$HOqq&Fa_XoyG)6LN zj?%45&X8L;QC2y3hGgxuNrMRjxT7{l-al)*v9OV?ya75ItpoZ6%3VGN6=`1Z#smo$ zRGT-l@nb%^f5D85i|UexGQhLV)Ob;%Tgwc_mH&y!X(jyK|aR0&@4SxfdggoxIe^=!ur^rY~XLqh4-_3dM4SY<{C{VI=p{t^dIs# zFgAWvQSJSs{~zQ&)tTck{EZcYvnlzA>*0O5i-J>lU;=}O<}HjhcU=PKqMxRizOk>s z*Tmn0(1DzV?(4=~tG!Xdi)p>X`Yv5$W%wcOSkwrV_EKM0*Rd8g&WaO+AYlSv)}j40 zP-$~xqcTPhpgsi6N=;&$g7;aWdoTA)amc?o<(T6ZZV0YolStlYlN7|^MQA60j0l@x zkV<(1)!hOqzf+E-IY-rCUW1PkE?M!}!M(zNqS1lGn?iA(w_Wzz4F!1V!!2g(MLimzV(HM0ov;< zWy%j8(Ir$aaB~`h|;#om6QLaw^Aft}+o47hj28=15fQ(~P?Ve>$*#%+DK?a6JY!o@wH$ z&$CcrWK{g=NSuB@2LkgEHfg2>M-qOg%J;6eUgdE!TRf=>m%T;fT!`gk3Lp2s8Ib@W z1}O9Ig<5dB%|MD+(pM)wG{%1UHV`w?#!oKix*!wkG?^O=ZBDSVo8V$-rG8!2pT{;{ z3BR=7mexYvrMdN<-F(9sRUM*S+Jx+6FiTtO#o_|#E z0dwcGO<+&U=+&1QNIHt?DeclJq*fsGUj&GgSwTU;Vw|(=BkTkR`Y(Bjd2?DxAf20p z3*uA-V18Fz69B>^Po(#Dt_VAAt^WHfuDO~B(K*e4R#Th}gs3~H|L_-2rq2hlo2pF! z&~#sI%#%8^Ac(oa=}lf)XI?!ZxRVukkt}O)W-cGEKJ?iZpwpB8zV|ROsE`5AABz|# zOW41|3rqz%ZP2H|;vAnkik+fFU7MG!dL6E|92U&npg)9E;=@DpNz*A%>^fgV3~uD# zMr$91rQ*7$CY4`91s!nq@CiAE5aL^;OOv~FUsP&Wvr|eKeO$SfAG40;1`!+Gg#gkhPjYxl` z(8LD+bUw2aykSLHwhB&G!E=Y<)ayY|K36|}ZH+$?_Bc*-wva(3hYTG%50)XRuE8V5b^bg+(A>Kn3PtL&4yPOy44(sI@ zNLk9J0OfJ&N7VRylpCA@be9Ezd+}$fjd`vev(BH@J9AQp27A7Lp?1dyetRnscLMmF zWxpi2{7~G!h@o0GyW9+K<90Ogm}+>b*2{Gh`z(W-RP)}1{HQV!O41)uAZkR6FbC*6 z?8(Xm!vHctidt0mvg~Vt{i2_78E=V7-WNY1SBXdC9SAPfrcF0c`8vZeJ0}b^w@S=e z_Yj3jLMchz1KcPPdMe+A6J^NZqM9pJv z==67d3PZajxKe&U-g@}2qNgc8@VUkB|MvoH7z?MB<|Aa3l;V?cNYc>Z)ot7_{>NZ= zKn_Ae!={#%FAGv`U$@O0exdpR3uM65vhVVp9;I;t(QNeJp8)eK#qX@zl;+0A(?Ab& zKj>3hU?FZh?Q>Py0r9;TlYdv>l7D)tW6M{DlJizNvSg1WN#4EU`P1jH(onH{>wE3S zg8ue^qWejN_vTS2VQdJi^(U|M#AvBHgD_1tAFo{d=19MEP((schIHVbRd4Ce?9;I-Q&tA^A8R|Eq$)lH zam}tjFq06}v+F57D*f<5#6svxLU~9MntmVNwNP0tm1cSH{{0O~ZvQoOD6xP1y1u#t z2fN39BF-RZ6|z0p%052ebE}!QwSl^g@AJu9+IF^Idbgre3$IQ0hWzr?ddcn6^YJ@u zw)CsaQN$xX2+7R#H{Hc#zi>8XXjdT2=AbsK8Xsb_WG_pj?aub2hg(KJv9`}pDmjrQuR3hSY! z5|pOxstmwT3M@YxyL7_JC-nW~)#Rn~=gIQ3@^+=7Z4Ei#hGs`M);r$n$4CVwO3x%W zS8wv6tbYI@#uSJ@Ni$k}^_rSf^$oK^imF_=9^mY!XE&KWCT>&0k2DaEz^6-3dqkZc z%p7ODuY8zACk}~#786v68>rcTqZ@S-WFXJtfzSY9TKs~!3hKp4p+IP(G4AIP6z-*) z(~k2F^|JP!!^T7y|8~!$MJIiry^A_h(26bGXtFWhxY5v}d{FxxZ8zdn_Ug0ybnaey zui3jNyWz$6xx#SFc@Jrzvxo0|FRRhH-LO9g!G3LNUq=Sm}ziI_5}HU z1BZu)99#)Io14AkPVXbh+l1o$Eqa7ol!5;sV#N{K{2O zyyJI9sEGnc{*x)VPcJ$;RPJQbOVs{yKylcjrj;u)f*XmKgCxI2;snue;R)%SOkBi1 zzP^Rbz}HAkQT`!T;3Y7_7Ja#RTQ5ZK*6^Ft`rNF4AN87nTjzz?MXA>i1890~uDU%A zjRr+2H2SfZ7d@8d;vYV?Sj4ZLqV?y*gsB`Y3Zrx#!boe!f2~*gh5kEfW*QV3{n9!;72_8A5}k|b>HD;XWt8(+*bCH`*wOnC5%*R*q-wjky8;l8DOK#=p{RzSu3 zSB!7dPIVoQZLojKLt-d##3*V}wJE3=;;O$&C(G()7!sp%3kjP$DVP7E5Bj`oN*rE0 z3Z&_38e-d*_Qoba%S#JTM4v8VWTMZlB0w~V;i$yf%r*J&guYoO?kL!bra_I_E$|X5 zCVB>ceblah^O<_mX40E;uKZ1b^Kej3h6J97^7vDorJ|X{7nUO0Z%YYFv>KgHA<(as zlNDia%{K7CsKHTIUqw$2xl+=zpV{Bt{6Jh{EanDjf(}lYWEXg&o{h`&BEcaCCnjQ& z&@P~-`a1lRTx?AhnT2e$M#+Dlsep=}2*8t_IWz`+Pc2pA_56%$K@0pKH# zTpR$~nwBAO5a}Q6>`Ylr;`-_DcWvy>aqvzfSWCe9o%E}zP^yUmLsXkVPZ1Uv*u3$R&94l>PavvrjgrV4eLE7~lX^r_ZK82Ep zlBDwH`-iJA{VwQs<_r>|OF)wpTTGM+P4#J1U_E9|f@ZDZhXv;7NYWvBIH&zRwGOtG zXHR>X2d5gsUU0(A+WN|DIr3UO&`ON62h$Q^w!HH>JAtd_S7+5%XZ@;g420>)K@Kh~ z+=2{EOuFnL%Xghp4+jcqf}|Nhwob88`Sw)PD^UT$gSvL_X1}}7#j!v4>+nWIz)-y^ zE#&VCm_!{S!wCa7VQor%p^!6OSA|hRTqk}fcXHapZqNEz2%|DZG0vTiIs?Z1G$%L?Ypoe&P?t$Dd0{^SN z!U!qD8ewd9;8&l^DP11o^{$l-Ro_c0AItx!pmc1ZGfxg!>Y~N1>3@7%wy6_%*`T5+ z5VJc$x9F%4{b65khzb!q=>gEfT!UwMJ=@PT#SnAl|F}8T{}3y|_l46q^yLx<$=vGN zEvVD)g#sMJ1uQrt-~(*_0<2~?3*)>A14u~e^sl)2)6+b6Z{=Jtn4|(gF%H!J;h=%~ zG$SM9VtyX;uCS0RN*v7;d7m1cif8g%`f;mTVf9~R==Yz|%5gRtL_+b{4$A}1nLO_q zK|T4N#yUYH36KCxV)3@fZtS>m8*8 zrIsgmH*P|JDPGO;O9d9iNMiSgxIVq!XZ-Y;PP9Hyu&*nWQCM}&UH~^)_%*BlGI){YRAJEdG}b9 zj0&pU-+q0_kKORX5EjON=JW2qwa9yKrO)dHIEf~gmm;+u^{^E#ztt4rP#3&^J=%n| zNG~2QYx?eGvjNLIg6YHwL(UbzguUR(uQX03}7} z=;-u#>g{!tDAOIpF|8KDj9`2WfJa)M{&<)h1YQORd0=O*)E6?G$)G9@7va(B z2(n`vhsU&A(_ZhUJ*WJ!SSSC!D)_)lzl@L=rXNkvY*Pj=Yu3tpOD~E~|C4)!)!XJ; zu5T`*kpNP-^hf~O7JUa`Nk)@JGlVin7cX}A6Y!C%52EQr)Emx0My%K(Zqx5_CpMo5 zvQ=fbPY}UQecEXJsQd8YLzD9RP)Y=6JBkBlq>eU&nDWY4k$TGhxC9+wIWPvqF9wxl z7;S<-H1Lu0DEjb6rx)ygEGh)zE%h_D(i-gywB)MfirG7v5 zH?z;QKIyqil@a|)&#Px0^8fCIc#=pQ76E49&)G7v#azB+pYBoQS>N_*XqNbQWqiN! z&&(eM)*VntLhbGC%M@!=crnkdtqWc}SKc5^P{)HsB@lWwrm_$2i|Qbl2gD?#QCLD| zpVR8On*u<$owd#i=*x~}IRHSeX(&j9Sq2+9(&YViG1LXFBGmlH6;>;PupRWKi%SJPx?kD$5dDW( zRN)qA%*f^i>Od%T4Q-RlWI%6e;9}(HV7He!`?V#j=ue6;jdG3ag$VYP^Yo= zm|wTHv%E&`fhT0h$OwD1xAy`(}_4q5Mda|LmRtCjdVY4haO|jLPZ31G9-( z39Tw@qH=V1_eO9s-~Z8c9{yDR{~N#WvmE=_o0IIlXE@TQ%%~(O5fLJLuX7F}WtC*b zQG^h(2}cQKuWXK%m65&uZr{h_cm4zCeZ0r@x~}UPhfF~NluDksM-%nFl1C{mI4u12 zS>QH+0_si`Z!~~Lf5v>o!**eo%Qt(2zAv11F}hoeVG_USHn`hAPjAlU$jCdaSn+P^ z%!_y?HYmY3sJ}g;;iKlyan$}gY-u-&gT$vYCQ_1}9hYLfDw^#&o~xl{O3I}MVg$DW zP_{A=cqvNEbGju~*!8sYcxpAME<6K-jk~D>wv`nnuJ2Fg8oHHFHm%{;jbPxOoxWGg z5Xy-SuFHVnl8b&!;FP)W8_;x4wEM2Fj}|bhZ*ycxtu#mjhJ!9u`!Xm@Kby-6_$qo) zkoKpxMboo%-CC2xGdGnCKb>dk>Cb0f&9lcXM;EdBWmu(l{I{9wO<_g+PJMQn|zyDz(zkbVE2hqB5OlbvJ8o$@;`)e0Vnc0Kf~}MpuHdQgX-aGCwM}1rBvPP$ZxBstx z=_xv64~f)Q-U_ssyaT=o9rbaJq-KbErx{KUD4`RRgWmN1rmHkdkTOaGe!IR}w9#A7 za$9|F-0I4O&(%w)NB$7h{d@gvRm+8FJf1(&on@Hp`Y=PKdEn0VG=LU%y!d_UZDYx2 z^KnTG`~x4%e5b}5R5?rj4WPht!gAzLW9k4jYIemDMsj2NrJ|eo!!>SVYdAVrBnGFD z?;P@v9hYBdBMbZ@N1RfOk*wI5M5S<;J7p3P{-Lk{BA^fYV(s@>PoA!!sttu@q^SvFoh{e)*Aq`G6hjEu!E7x087De-L zUYnI4g=y9gfhI?lUK2y&IkyCtiN8--LJyujoO|+X9VTzH^eONjo754*ZQ=zXYmQ!8 z@uZL%lTupGviFN5WGJg{?+>_@h8N|Nb6Gp4v+S#U-In>bNkiaHs9_SfN3RXnWki2b zU#gz{;2*x1ukPOQTd}I?IDo()OUFNCkAEydKtMC8W1a13MAwIR8a#LArt5dU4=MXz zH&yCWqIWv0pmdG5jP0JeJg1VpCmHd(-#E;mi7p$yx7q8SOltd=fHQuIa${>v(sh;t zximy1pyy*;CB0Uk^>ynFzMhj}=hdnm^_oS$K_OU8R(`|cbnu_xo;#~yBMsBnUn>C; zM-FW|9KM*`oqqx;REE8fJxd7+=lnaWyjnO^E>+gh&`^Hw>ob&v0auZ&k-64ax&Avx zX+g-aVGw`EU*oa^cnZ5je8FEuMPwu0h~?CYsqiFDj4tpN-X{Qz0mXFC%AblCmadaAF`|C^c11Q7D{(9=%LW&pCt+a=7(S?MD|WJcg&f-?Uo)D%X4tplC603 z^S1M96LVi>kp^$4nK+fW^_dXziOHcoL+)qJkOVY@`|2r~Ah_|1%PVCnL4GV2X<|y` zeTA#-*T3h4dnziq-WzWBo}n|i(_>ax`pqyT`UqA! z#6Dn58zWXWJu-6R5<4(K^~MMr1jhp8S6H;%G(>5iaRj%2J`7Zm-mioK>E zM>+oLhRL=+S{pl;=ySek!aWLfsy23=)O&Sw8@Q(vUbXFzuk&+D_O)W(XvEDXdTAN# zdPX_fG{S#v;zP5_?nFqid4d4Kulr~&k7`{4nJzOYiFDOCW6M{(WZUDX&uK}eR-ez1 zzd1}2F$P><+FN`mumiEVx&78m>b0-jV^DnUIiH*#Gi23HTW;6{ROnvUQc1vT{_t)5aV zjt%o*TS1}hK;m|dF>vMN6J6~w_=7d(7`TTKB9iyNy^#FMi`FIo>CWiK>NkSBD#?#* zl3M?avHl#N)97Ujs0RS<#I8WIm$-X~N(n$`qSE;q6CZTdGs~bf2JeWBO6lWppa~I! zfN*52k}qN{sQzj$qk@2j-YhtdFhV z!FL;;&B?`fy-$u`r8|E7h$G|H$XI2e##(Pp>%1DrDtnpy?S-(MV|BwP0dm@azv@_y zQ2m>~o~jvY4Zosqs%j?3_gKvSCwVaIU8*s@yb6^Ye>{fX?Tz)8Qg#Lu`LshSYM@F33K=L$fCUxs?s!Z}tdc?GId+AK90V3o z+q$D3O6hYcw*Wy4C4&N{v+$F!OYFZ8#+?jnmp5+>1u8fCRqcb=vWW-Uc{^zlse*Ft z0z;`?iX!7btDe;DcyrRBG>_9e)XkTqWE%Hs;(h<%6128Qdr!XznPlnf5-(gD@3c?q z$OBLdS~kE0d**4zPm34)1nnmhNONz}aM2A_71vRW4*Rm%XcH_=a?J+>*i$C*x&M>> z3NdZ_&=JK%D2iw#LlC1W9$6|tl4p<(uvQ+xtuIrAyo)d{zFFb;YkR`|1f~F@Vchfs zf%f}&!^-tA1|ejhgj+U82gkTg5y|!hhi2S6_s%0L8yRkOQu-H<2kF$_Z)YcTFwAia zO&u_^dP=_6o+)N6eNc1%3qhvVh0>F;bxF}ra=fA<PB%F+6w^% z>7gta+{nJ#ZFlc$*M#ORz4$be@nxGe_V~M17}dEh`tM3?OsSlnefe8@_V(KDb@#Ws zz7IBsF3f&)7tlOELR}OWuXDVsa|m^7f8g`pHF(zb-Sce=fPV*k`>kMs(7>E(;VsRO z@7PERut1PxPC35S5U=o~7F1by6|`i+3lsj?4_yW;--J)I1!#bH>{`b293OxN?!P?# z!s#&u+R>a@_408DAW6>b6-=BDZv_}r$B5YefLb_v$fs--(^9LdMI_WT*MU$%f+dK4 zixg*NC)Hc;+04pxjH4WoN@77?HvoLfMBP|3CwPS$@CA_^szj``=v`fWPv+F#7?aV$ zy8c-*rDKM=UW@+w_fI1zPwp5bwpEx|Z?YuBS)B1xoN|A2&y@(LG2v#Em&As_#=r0n zg5qTJvxMu`zH0VmZQjO6kmm$`yq5hi($L>@yry8JidkgIwjbg27@G&L^d=#~+yo;Z z5{Ep{jLclH^d~GviO)DO0)niJZ_!&JzxiZ2Xejf?&;Ha0^?U@~zkOblKkP|18|g*d zL&Z0L(E5X!Y@9VChR%Ga(x4Q!>#|YTH}T#$hgJ~QZSM*odP9U7L6VD4SaJ`8(g1Bu>l zQr7j!yfArstaQX6G{UsJ33MVV-`F0|AZ}0=(0~FCR|K!L!M}x@amJWLK>B40L}AVW zMO#%T5eGJijs};eBFy{ zRf)Jp_LgFs6o0H>^f99@@#?XNN#b)9`U}4LYoZBPq!baxmK<8L=tADl(I^=eW4%kt zr)^q0I*HWTo9s4Q70W+D!!-ItNfC?3!orE{1+V171opGs<C4*V8=9N=bP$P@9S* zCoYep5Agf}e;Sg6&~u)dbROUouUNYM!w&DmkJMo$U1ol{>#&PQ=Y1C6n@2GIm`%;O z=C=&T9X#i`ZYeXy*K81dUz%2$_&A;Fzfs2zxyb>r`Ipc5Fyr9Ao1w_8_W)M=;STpT z*f#`4^~pm58g_xxl9!wNd=klK7>r^2uV&NPTh!x$ zEsZa>*sa>2f3?Kmy8^$5-KKP|1NuugAOP)#O3&Rr?`Ey#spIz|)&9x*q71p;BYUI%!-X+0_w0Cgc>0$g!y6-t?aY7Mc`eE(A zXhw2|wl92$R(O8Z24PVCv^s^lhWXD2+}B3-@WS=-*1S2fr^4l1Q?sF8+MF|rvIAh`>`V=_F@X)LEJk*?}0KX?t zY>fB8v?h6=bjgsuSz%gwv*M2f1Q#|d8jj)q&jfdgN~ez&+3(m{$y|AT*J;O-gn#qm zsE#BxSx*HxDhN4*TI`uBspr80woCKydvvhXFJX=w1zbG}ROtC!@LjPpVV!MLA9fCzL=pM)^9?aUxuvwoxUf~MIW2Lb)rWky4hy8=OLdhO$d`%E16K^q&>h3T zxuqK-Krr&!7|Dv-zA0Oi-oO`cPV1BnRMCs@;gC2K%ojcAQrYT=v&c?0PrK)YK%j$0x^sL3;}Igt`K)Pg9=Qc zHjKh~LWAy+c4plXO~B@jDSq^{E|~G$8d(%-u%GvqX2D}g<`PIO>BUV=s;ad>S7oP~ z57W>48Ak1&FC_Aaj>+`Y0s~Kt#KH?1`j~MD1cQ0UZu-loPkmtwz=gUnTDr*?N0}V@ zCco|Y)rM~{=1EVdhbREe+Mz&)89i@tf2S!kktynOsjCg_mNE%z__EXNXd{J-=8aU! z=i0chL9l2G?zQ#VATq-B@T=b1Bhx$CKQcW$NV4LIA~R4^Xy{Z z$w8e}AbC*vyv~>QBV!QY!eB|bUdHe@&KRhFisip8>cnrr0G#AomX18b0(tt_R59l< ziH8sw;b_P^YlF8PG3rBZAuXI9=k=HQ=Pl>8=rUELmt4brA1z7|5MfLNU! zUk=-9>Q~K#>GkYaUo|PVjy?NXMy`MIQ0Bkx0~Qt>q^aY8pSoPOt<0lb4K#G253?C3 zAI`v@Plh2LCG~yOfzeIHzwdRtc=)Z#`nv>iND;b(Ydm9p_l#lp_)j!tOW;6)5J@-= zyG&I!nqUYo48~@_ZT9Oe)7uv_Mr+(>cJD^>ZNGLG8)4>MZs}!pl!t>rzi|^6fW{F) zs{Jsh?X#e^YI842MM8I=Z$Ug2=C>k3f4*s` zjhhYw3`>Tyt`4vP7@f=_3IR56?a;wc2M5>0UOe84&ec1F>gnePV3Rog*G;=3qL-x~8MqZA!^phE>+ZRorJ3S*8xaS1G+{q({y_N2-B0Y0K*ea zEJ>Kq#+CS;ionFIYDxpt0AS7T%FD(Xdq|r}u zhb+5hpY*`cJY9iW&cc~*l>2%sCSFt$?0LGvSTFoiK%TipoQwU0Lx6K?B3MGpG(Q|h zvp^xg77|Yp=SzIXPdY2j`efh?W(-Il4mJS>_IJ~bBh3ykiRcQl4>jjSGBV}(G3TyY zIsGG9yDPb;oejdNc5#E3m6PQ_q9kwvp$WWc^L3z@vj1oun~z^8F>%UXZSKFbI|AINuCtjtZHx1U7sp?p$6kMYNKooMP}iFimJ z9EXVV?;tIG3)+<0$YdZ09Krx3@xC8lo=^iM>9S-vjgRXSF#E3jp~0&jMS5WV3p$dJ zT!28kM&#$`vmihyBbbxq1|=$$z~Jq_SMJ(^MhJO6ED^^{3#ETk%o?Bk^rnM(T+B@e zd=9O|aDyy$cm~o7($qJFhpdyPQv}9Hg~2yt{8WC&bJF->hSW}=Ts)3uAz)QQaH)Pj zi@|`ldu3UlKLSNloraZaQFjCc6BF6MpjSA|M>vq9JIPV)FaG5)xY~biA)hhfz6MN0cY4gsA0%?*l3EEW%04o^<}>Itr;lX zWTJcn9`0W#gt60UoZ;*L!7JD8W@?+n!eRdGhAkDYj)yZfc96l^%VF7<>Gma+2dRNa zE9$Zs*UQWzx(iLQCV64~lhNsQi9@k2^nab#Djb4o>q6_R{@cYeqgTUXMsmOF4;EU% z-)n@Mcugls!9xC)w^x_ku3Lx4U9@NB0;J%T7Gw*w*mWQkhP5>-v9NZAqHwPjDXp!D z{u2lXwFTt~o=cL(VeaFVU+;bwyJ{(dm1U?*BZ{(FW%EnwTm$j(7vibOs)_VaUcoJ* z5Y0`_gF^%X!XsS^7Kovi%8W4qj!WnxF|SllIiMk%qxK1n9)5o8QBfD3{JBo`3%O6$ z|8M1GKJi;NV@y{~GhQ{BkO+HSd6;K=uNYs&0ru zf1tSzV-eiK=dA~U2pCgsdT9W<`MPPLo-d)l1^ZtH*8l5&Fal^pw*`9EXrP5eg{9DAlHv&jiAu|x5LU1RJr_#iJJ#rn) zPMHj0B?cjEUgj|$&Qc@Mm%&zb`TDUav~zI*^ILRpg_DlM}xyE1t;N zdJkx_B){PbrsMzgv%~b-?$LhlmX<%=Wl3^7Uj0N*Lj0qhxB_T->ya@u!iYBDRI`Zk zDQiyPh2KQSyvDH}<+PPXEQBqdC7s9ZXFQGa`QEFAY^B8w!hY~z--q!YW}aaP?JOhy`gRe=Ywaq*v88g3Bc=51E%{iSBXw4og z+SFm{9Y2`tm0UBX0$S`PU*m#;Amg{)IyIRC4I5J71aVym%WU8|1L+~LqN1V$VSZYJ zlTd8ku&q4o!UmaKoM;GGTqw+nx~&B9%i^WF8IH1&O|F^lDG8v?-794CPz3PHgnpuh zaes`s+~+9zaSdD4Dpyo9-xCfik&5ufJ0a(5VZAZ zzl!sO=aNfb08m;SdKY@T&>LIBl`tcz7Kr6sEP(YG2T5#hJAOQ?!T zpe{IYRtf)Z>O%L`Y(`D_l;_JS zCXdF6K-=7ZHy+}r6qPN{$zkIOZ3>ouBkBSZt7$LFV^iqtXz;1vUs>`G#$|qeaqvC6 z*^c!;=ERRpIS+?!>wo)oxWkn)^KW=tG2}ZF;wa{@-Q z=83=)kRtc}WII&*cFEJVoo_2&B|dKDI;_>mYJOUtgWSnG+Cf{xH%@BJC4|4&F>wLQ zD1AYk?}=g_o(3?3<0!ZZgd{EgJkA7etBlJr(=TuJfbLoBiVdA{!u|Vae-k&oAYh={ z884jfIdid4JO$SR$Q0qpM9^D)0!Jx~pQgHd(8~_s67JK%)|7jW|6?R&KbHYcq#?Z$ z2LvHVH}GA@b& z;tLVPJ|nZ`bsjw2vv%S0u0rV4}TXhK;9uCFK*9r~5|6*V(z>D~bm{wiMfRi7G^e&ra62 zTR}dgsMn+=pWJBDr=pk2XoRsU@Q8hj+<1#W>WR)r(9d{yV73K($v`2QHp1nkac+_Q zYGT6YNuSf;Nd!z9?PE-$1Zq?xb%J(7hl5qg@R?^~$iXBamg(By^zJvoOVIJ{g1FFz zn5HBy(6pbWbS@(C-`q>vSJZyo~9Tb(+m+t1XCKsPu7)Ll=i3LKc4T4wFcP<6k^2#!`dvzWxL zDZeiw<4VO93ijWaMEgAJM}bsl6i!s#evBaiI}A<=j~#NH% z^2X~{w}_#Kl7VXGtXHpuF&+?gy=iW9&@^1LdM_(0%g-2><+gUdkYJ$<(7N3ZC+ndA z&KH#r1{~|b4~keSBI@eNMJkE}DjgZfGDJLV%4yoV>G38RLCd!!trqhoP@{;!aZRD& z2IENxBVhlN2RZVzhm87z)t^g7JEk~nlPv@hcybwQkPP>(qRN*)+&{O=G;9l!KSgzN zx1z<+wc!&C0n3+~VT^xyqmy!U#ZtZr(Fpy^_NFn%VU6+iR5Xg%VVEw>rfY@*r?KBPW7gGN+8oJudgUH1$J!k`+- zU7mz%sS)>}X}vRKQhG8lJp5aR;Vr92*MiI>8Nrq zq8WAhSj}gC&<)uvT>D2JxQtEBndmOoyv$S3P6%#(p+Nq)3AT%9sUBXQ41AZ;LQv@C zkHkh_pNEF}zQD(zn>1&C4-xRu0yFd+cm4?n*p8@4-8|=1kM_$IuSexPuuU2wP_DtA zahqZA;_!8}*!qo&Q^^0~N-q-^ryjtxd&#~Yb~6CYSKaQ$oH(bkrv<%(hMXauTnNq( z_aNP@PTrWh#3zPHUoo!;2I^%6XFiVoQcM0?_8R_BEw_;2*n7vE?T-In=G~K?TR$)U zIQ3ofOdoI8gy%=X@ODY*z}KgDrVcyk%@&X0dRP$H9h?07S4shvt8;Z3pPBySUUYtR zbabH=j0?P{?EiOEw>=_!B3rQj{ExQ9Erc=x&9HWfd_MLms6e$_@o=gh^#K97058?( z8uDQ|$-Tv^xK^50J@O}}ca5#rf{+x`B{fan&>kHgzjp!+qU~T(XiKq}8pE+Az7J+(ci-T&d8ROyQcN)=X9sH1osexfPE$Ty1UK=j>!6D>gzHQI2>`N`ib0Uss&aaUVHawGF+GFrU@{^SOvfO71ihUz+ zMxA5C?cJOQv-xP)BUBD9p1|j9B_?9NKj(PFca;z4OkgcS)xN}kKqxK0bP#fgS3dd6 z(c5n-gZ zMsBxykSnKsE86|zieqL88FQ9ukrxOzxwYg+ z+uv1=U6DYL@83PDlE_n(nI1b44_VyIG=L=e6f`%6QVBTmJjLl|pu2l|eniNJO}Nz@ z{o}fy`Hus-MPSJ-!XXUoFl69TW&JD1rM6X7O_A-~Ir-uA!vZZin&VpeM1Rx}dy5P% z<3Irg{8QMlpijlW&v+WK8M5bn>z4b%PU>{c0!Uvb5j*78)hJEa&aL>zXy{+4lbL#-pa zfqH!p=`PgTP=4U?IpPNPo5Cn#%MIn-qebrdlatpkj@GtD_?F_2r-N6IX2tU}*Tn%b z@gtkkk@7dsV1OIkSRBgtJbGmRJhi*Ux98kO*O!;peq-LJ?8D|lQ2aU!fzUtEB#`D|R(7x-GDMlgWl=FFU&k2< zGbaWhp!lt*y2qX(H;|sbo2Iivm8gVs#O)O0?v&k_wZ#f5^-sglJN{-Xb8&d3j^KJ5 zJRSGiudY66IA$N9tcMvo>kN*m($eKckfcWxNl{x=CLsu3#TIcNn#~XIhjqosEk<@l zJW{kI4XWFy`^QfVfl^(J+3d5HFHh=c%e8*4ElR$R3J(8=kkZ4Ly~A0}>x0(-sJ}`F zphk>o;se678L+{3A2MI)^!kE#fpthHdY@P-_a)W`O0HA{`gI<9FJR9i*tXK1eZ;?h z>2+@5crFN~@ZBtqki408VAjBeqK4^Y%w2kPvh#{@K{Dxs-pv#ipv&K!XA~?$jU2U& z|LVF9f4CMlwRC4ENj7xBNJsjGp<0-2S$<|??0zL94ziGN9c$nI=O4b~f5XOa%t7{M zW6)N8OH0d~V*2<=_Qf~yTJrLq?JN+U;ngXjP8Gt@WQXe$Jw>;57M7PyL`6lF^{;&c z2!wROGg#ao;ARA*tk_GO8BT`IQezg^u@AzK{3z{=Ok^UzsdNTI;+o)|)MwIUs=|*i zy(d?20Uk=7udhn5m}5xBfJ}qeZ$lU8xWb)76j%XCK9J>33#dcJy2-)7k9F$_Q8@r`BXC4uKg{YpSSH!SnSRdYi5XKK+O6P1;C66jvMjH<5uzb{*o<$-QRSSI$zz7xGFk9aE(_@y+CeoxCx_)rTUVa`Q ze*vcbdzTB1-RgaX5T_Uo18)&%Hr7}(=nr8ZAc>HL+dKp9kBR_XD`DDDjho7z>5k+A z{$oyMTI#ATV}rpnyOk4Y*}iUZl=|KZKOGEOL2EKITar)`nztd)b4U$fr*yQm;uMcP zGnZ|Ahp*?~@n}Jo-l=vSdrWnJk!LHv-i@j} z9ZI(M5QK~PmmIrpIDc^>8jv%>f|lYTT(8wey=cZ_H-6w`D%wb`y)XY7$lP{(n-j6OQdY15n(crH0eZxlBIdm=i%2Yj13O!?z2oRw) zc%rr;YZho5>p;+0YFEOQU-9KXP=2Ln`-iB$fV6`uf+C7cGV4KYTN< zV&IE{9Uf#PL|;F8^-zz)+NVGIbb~xF%DWmJbF#K14B)q$w}SZK;Xk1OU||1)I~(aU z3rkCym3y3bqLrqo=>wou2gT3bRUXJ`20BZ0R>2yba|Jg@^uVXiG!XoTI=9)U7X=|^lSFJC9p9F@O{hRd7ZWmcL_dKz z>KzQMRTn&5T;9E@sCZr+k#_;(zJ3J>20)myn(JPNa^G+YqrItSKdh|PVDfd2Hhw6q! z09C~tUU=ozNxt{;kD;(`0H;wKdU|ktsDE}?T zD@A8Kt7_rF2r4jM6`|;jeA2q*-|`{p3qL}rfEve+cO#}DA^%G$*XW)-V$`2y(!YCoQA&M}G*`SN+DC72 zm!9?6ASv}DFU{AqM4`;V1So4e>Unf)dOhW2?$*pc`&-n0S@z>p`u?i(a`>NYZ)tKT z6Cd6O;hUCpjEwd{z$>)pRlOs0Wh7<`tR=ohm_h%9Kb=88k`1=99}`C2}hzIvC}XN{;05GLnXiyNzn*b01H)EjxbBZ%hYH)ghj6+9so(%G5-sIYI#qEV4} zd@af=78gV<$4udeUB-~QgN01Uzh8^U1$$tqH-1fw6frU04O|_R_)|?Yb(BsAGOTLo zJgBk#{u1DrZYoVb-rl(QEIepf{-MF{9;qKe{5NBIB`Dm-4H45i z7_b=9ZJj0^ZSBjJ+$T9~@()AW!soml;`@68vk2=o>NgYv!Q5pmaJSv#?V7mtLJD$>0 zwL=Ju%*2>;m_8a#CpIPCd9S-PI7cT5yPwCa>!v5wuW{euW$KBt)W0a4F5q9OnNY`w z*EjEs*vKK}+^Mtr_Ubx0QMlJ3saIpZZ3xCr)6zPqPd!4igFkI6;Ty@K1HV)6JFael zdvwukY(HiOeepeli2E5}wU1++I40ITa=QLoo^i+0P^ zS^&elSmFmgnqq$41Nm!Th~nhkx&;QJ1_Wy%|9y>>!!P6UA6Ib#QhMExu zbjLr7Zj`PxLP_xHz*eS9yc~>rRc+VJO2UDG&AIg})Xxx-(H~KA1NzJv??p?)50(Wv zQ{nncn|*B0pAW=;YItThJEC~@v|Omk19CSva_Ab?-F|QT1@;!niqLn#{wIf@0Y1R= zckF|3uh3VZY8m=8K$)L8$5zi5thN8ig$qSJ#g%m<4pk{BDnROq;NVu$Ikp$nKOV@_ zNxZkJioMg@-OX0*K63|ZX?d&A0-4)SXXe%#xJj5MB)5z4VLyMLhw6z+jC!G;>CPMh z;Mrx21f3k-W>ca61o!GBz3Wk713~oK>H{uYG;ogA_I}GhRxBqdsK@^}0$eIo^f-RS zM*02wt8#+C;M%{x8kzq+@s0aBJF#IIlRolu5IaJ?oBa1tiAO@IXYtBTdkcq<+I_g# z+H*Bu!of8@;zO#L&px;tAf-wYwAcb_7*>`et?jR^rAs!WXTm)+rE+|5k8yx9@~V+7 zGxCEdP(!;tg{X_{BfwMoH9Kv;vwA(4jbWpaK;&*bn{V&*YRNX#KVT=m93=_n+WHBhI!{Jj;%_*7mO?g z_d<^yz4y(>`#YQ4+X|wxnnkJ)qpW@=3|!o|PhS=_;0Tnx2d|$nSrJYRx76c3UoRvk zG$;J~hv*pt3uNkp)#=8Q!2N~%=B*Zp{r>v4jQ?v7CO)dXk7=Vo;T;lA2Z9Z8gKSJc zf=8bN(vQon$k6eN$h~K_V~|Hw4+Gtx6n+H$D3Cwvhu+?csgHNg?w4R~A&PNp^J7!| z5+D9LES-UDPKL^PX*y6!-1PTgO2YW+mfE_;ncX&3nMMkc_74)IEeE=R^F?(>7Aef&E8q#xR4Ddqr9(An9rcNY@zLal!J?Z5SP%!(ixf zN-X*I3HQeyJ?^MvieF!sS^MVWu1(2VK+?lz)dT2pe=pgF(j96nLIr(GS2>cZTjJ_b z=G{X#D^JqdfCmSh2)a$bmeF6VX~?N#vi(8_ng(t}Erf=}8t>Sz*ub>5FjxS4QfZzz z2+{$$Qs!}l3!=F8cf0t6EIc@6^5eruP|4`wnJaRwhuzT%Z>|(?vm};3ct_JNwL)BN z{)d=9`zSk{KWIKDI^o=UM}puNn?m!oz5KCo=mom*?ndKc%;`JluVd{9;k_uV&W*kHM{@onLn%pnDMVzk_n@z24-C*)DOptrH$L;Ph{)oUnk^X z`rg9jgh_-EEv6)G+ol~37(@5>R|%eFrb4}!_t*!Tt;_5=)ZA%=?f|~aykgl8NU_-g zR1#ebT772ZmIuf}ILpwa@wxn2MgjNv&+ZZKj_k7SIaYXV&Fc1obcl72NYKic9JL&YoNWXbXVf~K8w&TB-Yyw9aO9_Je)zj%m&qslj<-aM+O z1iP#8r}(^_oNk9cr$Nw@<+BOrKIC65OjcekZ3&0|5njIR{4H~GxJ(?|5A1VtB?`5C zkz}|!F)NPV-e~hXnLPw_vuCJ(e9(9{qF48G!|&xl_-gTLi%&c%uDBC$!mE}ZL3IC3X@ri= zqlT1#Mp!nWL^H4m3?ZB}fR~?{by-o|3BX^Wc~^B$M>$Q+Cliz2&=jb7Kh8bmr;csk z4UCx-djxaKuGx;L37Md9qV9qeLmb2s-!IeR-)KpmR2h-vQ6FRo1ERP~L7h_bX8Z#0 zkw9SQF9krPPx-+bbfckUozM(kYPUBZBUrVji$mO90)WH1eO60#nu7J<&r4jCjYdJpu*6hSm zj9i&7h!X^JE%{?!z`oI8CTxq%edK z)@6}+EHAe};52us-LS=mMUU8W-rW<^kgw=_;S>JmrG5d_3B=QWaVZ2!*M*hRA47#1C9i0m>uI0m@>~;3rQz7u2@i;m z*#D%ft=SQ^LiXy3%P5$H4C$*PsLTh@?<8+^O>r9buU_(&clvP#poq?-|(5ZK2 zkFvSxV;xBxP2to9(@{A)Kp+f@9&HK@K5gUu#eqFS$bA{dX!?aEPhf3NUJrs&Qz)Rs zM#;Zqtt|wqExSd|@P#zq$EnCG2VIcL%Zg@Z!IwnlDPWU)0I$ejf-&0Qu4+2!R6`67 zeqZ+|{YK-zIQK(3R2Tv*ej#BdIUD7)ALRq<25@wOKaPHt%n_>&bCRVskGWLv>*G0E zWlNl#f$(2*DYh*SV-dvx%jJHb6_K{Tiggk zedII)8exLAqxYdS(w{tG-Ux~o+GFAAu*cB3jstG}s7Jg7CORE4Mss>v(jeuv9&njc z9}TJf*U`A9l{YqzN~gB~x;VOgzTY44K<3s#GH?Ty=!waL&np_jv1r@-y2CIt0}>5F zd3UL@3I9Xq*6NvhP^W*#v@}%q_}0&ld1$9@-XzXmQx)R0{yQN|#f(w_# zkSn1I05r^}_B7k=;CT2lP3nj!Sp#tur`Ugo&q9%okk&TFikr`$xlmXts7pU; zq6CDLgi@0f=*p3$@Uuy}iFsoY@9+VC+>!ANPBAh4Wzrw%wdXA>3)(5E(N2!N6=A~< zx<>FZH3{kXpl`xNQEK%3g48u75zJb|!CjAg^2y&`xiU$;$2*t9GrCCjBvpn_RjtPQ z<5U`-v1u#bY9fyT9>YBWXZfewpv&Kg1>`!qBcsUZ#k+^CeyAZHwbH!=5x})$Ho|Vg z#?#^A_{sbi>$J3!(b3V?oA+OB`R_nd@U~&zfP>euJ@es=eMESpCso(?-bjRF!8!Mw zyB(-a$ME(EGq>O8VCU;rioL(*tDF2EO=lhs)&IWnb7mjw*muSfk{H?dp_D99BwHDk zC4}s|v6V_uAB3_-6h$eLZ7iW|6UiD=WZ(C7{EqK+{rX#7SMxUKJn!eeU-!+15X5E{ zRKsy)&Zbrde^{m-mwf&Fhjw~FVWCtLVge*fonBa4+8p61`uN$; zWW&tal3O~pp@W4KN_rJMD3jKUTvuhThc@P-g=g`D%DDGBHW%QP1roWk=V}>f7AY(csR^G%owQm7KXuN1i#fqg~%Xvbj<} zPgyWr+shgLF}D!L5sRgSTjQw1-xf+Dr^fpmo-J-4XOb0;^^uAuv)>1A1tb}>-&Aey7Z>Ng# zOfc_%a(|N{to<{6WV40i)W<_(hut1l$iz1D3`+Vkc8%oRU(jBvS$q6>@ypz(5b99V z@m-f@W=?iKqdd|G=+dymgaEd0m*bi-uCRmlq*~ z(1WNH0}uuHU#sCPVAG=HQm0L`FXXy99a+XR#*XWZMK7-a0sNM|_yuutBLxDbcqNX} zrVy)PANSCLFWN>>z+R-#{bxV<9=gFe5jklF{vZZ`l$;rUOs*tgj5x+jdjp4h5!m(C z8O$YV4^F&OGu9((pll^ck!zd5QFSR>88M9MkK7(!QBAM`$n9lMZPEb-y3ygoYeZv& zVtLpjd(&4S|MKsgQCYkZ(CG$z5F_$f7bM8(Qtw7-Y|d3O>9yg5&Wbssx7{*&>f?`5 zm%azHNo$JobfOjk401Ovp6v2;qNCr82Sh%?6l1Uzl%x?YYF>!piD##qvMQC2f1mfKdNtagsCu3cy| zh|o)}sp~~goc+1e5``d5-DG}jGlH$G{e$40S&7!|*vSr_Oc$w}$_gcHi!UVps^i>$ z-nl!SbQqwe}7YSn6b&pSPsD{4=-u}Yc1T%~bekMiznbwt4I>q7b;DA6Y{(9bVf zL5Qq>Zogq{JLR$rR}E^r@)aWbBRL;dWMZxay7K=V_~7*LzYgj9eR6DJ><)im#T6h0 zykc}29vQG z?_NM%&G=w0%`2v+pyMs%`o7<_%BJ0glFjYsMo zLc`2u8A#rDKG520C6@{zQ$(r#7kJ}0qJF9Zi2%I5XknW5c--2tsQI8)A@WRJ$2LYy zFee=7lP-$8r|o&}g~ah6^iyjN*P|mZbcrA%)7C_ezCu=C6(c)#x_>#OzM3(~Q$IY& zdOuYlpC5mUHvwaO>Zd{qyJ_p*{GDZv6ctC<5iEk#qd-IJDzs^`dCNjMdyap5r2^{m z)ITI=#KZee02Z)~++0xvfI+mKAVKB>X%>?wSSmvlWN@r`Vj<>wCz8>@BlJnl2`UOO zTda#O&8`bL4y^L>G<-}lAKlCGar%>tQ6iR9IF^yZT38(Eb6BsHdxR0Ypmma5u|?=u412hN~Fe1 zc>2atG%d{J0db5KR%IkxBPmQoy*KbnoLHkuJ1G{41K<@4p!pilAw1IBjDrnm%nHY z5u6)D)x@?0N1$2qRGK(TVkmDjdN60EyO>DLip#0IUm`% z0a`fhvux5xlmr*$Q5-_E`~n#jb{&02!Z4C#=Qy?CRlPO%r=#UTP}+a1`q`&>?zZQ1 z$8ToGKzF%6dtMsg-}FOhx=1;YLk27{nb;OVEb0j&81Ffzde2w*pPiinFs0QqC! zrNapU2+Fh8#zDDP8YB;o1R1P-h520uS+?fP^Tv*QMa8F!Gexv^e(c*+#Hj#5s}4bv z{0|_F5912Y?R>5pvml{%>XiQDC}?`|?*k#EPMWFt?&*sAxDNIz8NO#p#wddfg1XO&ZH>72`aO%VXM=|(E@`+syy%0S*KC70bv(hPat z+6AKa7y-ezrH`T$0`Qjop>M`u;3@D!2wWX7TQg3-_Rycs>H2n=AY=A(=}}zre(qv6 zth${V+jZ}KM3f%+@SR6UV?WRK2mNgQhC$uPrfK*UV=!WzinvzBt4B6N*Q|_VV06aa zRHniLpJNRb4I>cChc&lze1o2li|$}5Vj;%GT<0md1)?zDB}D%%39Z6NB&Nu16`T0o zL|qpn;P70igY3p0{rLqC{{4#!@{+nrYr0b}e65b6n;8+2k6IE*6`Nv)jv^A$+s6DO z^21Gb7VXp_(npAtmEmNHeY(lFihH@!b!-8m)69cd{8A%iA5YdWM3avyIwBAL^3>xc zA#APF@qUiA$PM!=P+bxcjD~@nSU1JoCr_Syaf2-f^!Y*Gx?ntBBjuMIDfD@S}U{!3%N9qNkb@$hA-@cuB126I-yTZJihxZy-BbJ#Uulv^4 zvl0R>9B%t&EYW4Nsv%20{sY$PWM}aSUV@&(yIeRzKW~-Ywp>`1`FbSKhoF79#+25C z7`Rl0LC7KiwdJ@sq0FwihTW+LahA0_yLXlYe}>^dSiHY6DmxZ}3JRbI2{`z@GcqSS z=JTXKxC@ZCXMt9XY?*d<(8Nc$5#)oZncyvMh3ThUKTws5F|H3OfMID z^&u)-Pgx=9C&>?{r@$+%!t+Z(eO)M#N@<) zU_O@ESY$6(?FW6VoES?N=Q1iMmC$w{ewjD^HNc5p9C-gSs*y6F!rN-;A+`=J#rsuQ zdmef(pIvupNIg2Uh;M${olOS4+%=9*u$1ny%(86+%_W(o>{#?P2k8a;^}#b`#*o9k zvBSo(!-KKIJS6z}suS#Q@B3R(@RK|*ytIu!+Flf%I?zVGmei9=QcDD0g)46@8AP`+ zxP}mCklEv(=E*uc8WhcfeJ%er2H@1j`UOs2)UA^H{Wn^tqvi$=wuxB#&zI` zu9MsOxv@OBM3-8Z6Bff!t|AKN69<5kteh5j4}IdXD9D&ls+k{1_TuH-M#Nqmjtdc{ zp6ZPA5rVA=AN;oPSlaXQ>gwA6IwAGnT6gx&A+HPlR>ot^1`%;B85i1i*9#jpbRo;> zcL;Oy2Zt={``erg2DA;FVbLwU$^91?{isBJzo%Bb#A9-8RidB3M}7Gb9YwI z(J{FnC8gGB5eQTT1%*GGB8+gZgaLTiss<=*;1d_Eal?OOU+b)>lY3maV9rnFq_{|X z;kG4T0;3&f*rx8Wagc<@fB$?p^o9<9OYnGQ9K@1E?L=``U<3A{CHa*N&ti&itr?h<`rVQF?l5Q(>Jy>pByw{_ApMYd{8T^7rr2n=vjmN9kEFzKb*iT@nX+#7o4`48^uvuNZmH{WFb1#O!nBNZq2 z*IekAW((a8-$OFo)Uxct;f=Jnb(kJMLHrD}$0N0yiqO>CyCvrwcm~AoCkIEuZCJ-O zpXnHav0sF6MTFOJL7I*7YBW(Dn33%Aogbpe@n>eL)@40prOar37R&(DZo~jTocM80 zj=0$kUqu3%_JPPFBhy0GckgZ1b$O>oGl!~SJk#8LnjQpBj zx=&+W>rOZcP4*UR+NgdmW$+E7b*1N33PQ;kUF1~Ohrp=ius5)V(cpzwLuLvNm7qWI zc%sd{G_18WZOO}tj5>Cqbob#@OiJ0kcO8%8h9868<))s%_%7=6cfegJ;a`;Psp)p? zLi2g}0n~KsTz`>)=(}j+MK%YfVKwOm_Y~I#P7;g{HJ5Mr9>^t*CDbLJ06z4=?>I$i znlZxiYU*1cQoIaiSbDCEBr{Sui(Hn>c9$SrHvW@xg28)q6=w1ahe*z~UnJp{JF9b{ z89(!?y%5A)sWTg|-Swk=BW+Mxcmbkm#X$_I@X3k`vUA83a zKUMl#ts#P#A9z1LRrtb(0a9^bM$$}5I^Y}7yC53MH24JVnko7Ny9kmI&06F*a91V~HC;=1b?D7>}$-S%&6PX`!;g@Kza@J9Sv64`~@Is=OucJ+Q3s z3%S35v^VgY>%m~x5#xkoG?(+Ih}a*PZf~nD-R;Va`dD6m0+ijk@jhFgQG%KA3Ze)_ z=7r%!z|{HYSzrk>eu3<^X;R@ZGiUwuKORPFM0~?x+t;h!t;Y=a?kOHhZ&#-u9!0P< z)k7=RniH<`y~_>gT9QEI6S=_VI@D7>B`X2TXai0 zROwwLd2J2nte>V~IyvKP{Wm5auC8f>&QDntlJp`rQnItdR=b=0oEVur7XoS#2hnp*%KEU`1>FSCez z36t!3UPSXTpNc(UVcF`@oqg>eJ3X@TI{o;<%srnThC8*jsQv-_wkVjo^&4Stljv;6 z;g-`33G+U?nbQB!`t~&HJ-BIcH&t$7bOLHe8Hn3}khG%5y{s7eFZYS0gfr|VOlj}n zFY0TEhs$0yXwCLx+w}sTaa-4_*<=n5sC~bYx86%E#46Bk(5Bu1F1T2yhyh{|8S))# zT}frvdk2u%a@M(Ud1KKgB9fm>F6X^})wv;XezS{X|LD8OI_BShb$0n)g9wynIRN=@ z->*(S_lhv%-H$|+`^rlWWt&D!WPI__WSd_Zq=Kl15eac6wR`1?Qi97__BJTd;%&x~ zC-4<;q27}J^_TwHP=rEo$h62|RZ&cvR zKgZ#owPBPZ_shxm6>#)v8}Xbx`k-d60r zy>h4Jr!uRZLZ3*_Xq`HXXFJ-V^m|}~y@9VOELf0`VnCugu45L}{3X2}i<-3)9QOVM zp9$L>;R33Z$V?lHwrK}LGFWuQdbOo4tbId*XhOLuM4K-_e)cv1o%!2#d2-7y-Q5b` zu?p(u@r+xA&_v;zU_1zkvUwDVbd zU75g5(Hfb_sSNaCv0@Eu%2Zd3WTxvc_4Y$gDb0YPTZJbf#-V<15#myGYT>VcdM$pH z*ltR%XUtv6ckst%gi+lPb8{lvW!y|S5@E3=;75@XL1{7h5n*t$wt6G<5i5thB8v@+ z5N}m(_@ezAa#rbaX>PN7U4l68zxSo+_c3qCiQNze#uhbe<0Ax*p>Mjiv-vj+{Pd z@M}4WB^TaI?+%+Bf|3`7b=1{oE&&r&o)O&F0b3)s&(p#>b~SR@Z}yrEkskP!NOw<% zd!}+|zsq1ghj~4)AWq?e>5(4HgfRb{3`(ATrpAp3VZ>yBK(?1qDQ9cFzW;qk)Mmq9o}9YI)TO z$&SAM{z|U3#2jra(n-8#Z*45@(jnmIANZeLP5|2(M^Z-F4g3~6^#SmXC5IDWMDm$( zNRx!_Bf$xNX?3X|gFEM0cyK+H1dYpaeW!nWw?gbp0o#ICbiK-E)ZpOY4@mm<-+{a? zwTF=Rr`Idyuw(wAXw-^Q!Mg}LAJu6ckRWU3UKLEA^qq3I+8cu$8R8;^BCdT{g6_R?(>t)5k&x!=}73c8DbCx3G9zjWe{HLo<30~0Hjf%Fdyl!E?3 zdc=%mdwe*fel=xXMH!hrsk)4qVS)|cs3cNjs*VICgpIBh+M7pjL87gZ7=X!V zfURPF`CRIQe;{4E{$x+{{JFx(r(d<5wi7F}nC@*{9uc#i@`}+#iQSr4)NxowTkctO zIdmX9er8C{=e@A#y81P;>UIe8+oh*S!5S#FpzYhng2Yt@cn#3X!Bm%Wuj8GU%*{F39^i_=Gr7Nz<(TdhWtR@jExFfxF{H3 z|2~uO3SM>w7X`^~+=%9ih9Irm+2ptwI{`p8>=DZ^_Tc`Z0yu$-tO*G^I&&wiN(_&T zN6B*0)4bFC7}E(-6@r`&J9X3&nH1w6re?`SuTf672v$Ez>r z1BvXSaM}rYkjm^?r>xALMs}+GalDW+S}~X2r}J4(8*a`+F(JFKdR!*6dfG%?m2P9a zyl90!qBMz#z` zg+6eh_p`S6&9(K*K}0(FwWJBR3>fD;}wm_*3 z3}cB`_DrxD4$7T$hKb=Ib>+x>Zw7^{Jciz}5DW|g{_M#%k+05BKXSaPXoPzI9*oW9 zVX1P_N|q#5D-$$LG*1pcRW@uw-k}cxq{!@FQuSeXv6N);I;%9aFcZxtL#iAC=Egf= zixodjP*tt;f@%(9f=~3pf*b0O{USago5WbEzr(_Wo5bJ(VjTa%UHD3lgNJr@48y+~ z2Z=2Xsh2;vT;9{lu>D#OXIa_v(NQsgpo!(Wzda3v+9XqvW~0z{1i|{jLh$9bw1b3a z8|?4QIdc0?r#{I|im5wwY&4M)eO$^f`30CYt{($s2D4!(>0yB`NS)PA%|Ds_VFC|o zALdjSqN_1a<$w(l50Md3rzi%*fE0NM+skQN3lGzD6x&|O!JVNd7A;_mB?&55&GxDv zeA^le6BDeAy}Y}9!emY*{N{z3b_TT+ zFe=l}*U50BOQNK$6VIfnLTc>iJnxbp{t}P?%kZ@RV?tywOOGP7+*Mo;M;f8m0Y92- z_6gWeb;!nK&rj@#X;vjN-8s)B9c67A7n{;b)4d!+&$<+{_xyrkR=wYo-g>*Cv9$f9 zAqPa{5=37YI>`FdwLLdIR&71Y%)e-_*_1bjD0SQf&UA&WbY#6*i@pZmQQUKGO%0CB zy5ZkiICQPaNaDP>DO4%?BDEP0U9qGx{n*`L0nbtTzI`(MCN9dLn?OSLEe$BBQAr5u z0f$l@g)W4g=x(?dQ-5gZU_6c& zXUhMeH^*(50?IO-8OMKjPsuC zf$i^phpA((lb04{o6gk-qxV<(#?A|2q`3?3;~pF^+;^9VwXkr(c}=a2-_tudvNS#F1p@rWekp#AZZ}4fVWKX6y{$!u`=)124yRCV=GX zS_Gjd!ZobR@A8K2i{T~GIM&LmVrd6GLqJZ76z#QL%hkv`jQM|Hp=ghRGBBNdCKL@- zS@#{C7yvEuWg(>KvLngS&F#SvNb6V^~7k^Kfa!3$G(wBjN=rnhm)hDkM9lZ#D46aKFy`o(tiBXM+Z)0hPcfw z5lqXZM3le8V@l@f;Zucon4(YL-8L{QgcL59xTx<4Lk;{mFXX;*gR&yzlnD?w#2m|S zD}+x05iqL~YrTT#UnmbZvG7V=x@fKZ~Ny@REsb@MD4 zDz3U-aOsC1r5P%Xx#v~4GbvwU{r+#2tyo)mYS{j>LPl%pfyxXW+F;djjs)k!!NC$+ z)OhsJF>@P`8~BSm%|yI}|2`PN#RWu>$@YV@$YI`)FK0x&f13FLUqiEvJ8fIdRNt(xfmPKV?(7u^H%UPA_X1>ZSjo|8;%akj2lA-1GV* zYhERCO=q@+_fb^D^G1Z<3x>?Ax|nA6iyHW4ta&2v1Ez+E$DSLyH&17O zMt|{NtsYVz(u9F}gw(Z50HxeTWa5USqc)6Lhm;`~t?*Vjg@5*6XRkDYwBi;nK;x5@ z*8FP|PvUdZ%m74xN1zf0XMqFrd%jp{zsnO|ffmoJ1-jkyP|JBwU^Sa%V$}pmBs5G% z26F6=O4XsLznOp6J`8FxGa<6|5%+w@a&hO;^dK#Z|BQA|KZ+r zw55APk>W*(J8f43f5(l|xhzx1MZ3GY9%o1F&a`_%zr6Lc3z_oU?cqz;i)Zp%%{UVo zJI}B+6zO#vN_-h#*rTNj<=swtW@XxSR~4={p~n3NMw3?KkfKcEU;rMf z2g=Qg+KQhS=rx~LW4Et{= zwuEAMJofXT-w~ffh+F*QNlemFtwS{)vOYRzzNTcI<9Yrz31^AbjZQ^&bc-Va` z^T{qVAxNIda2Cq7Z%aLFr%aC9>Ggxp9YNjm-&MQ@bg1*{jF54uu4a- z5+B{+Ut5);_;BVDg%fY*Wi)|(T_Q8KY40*3X zCIel&$B_6;gf^ZyOd30lk9wW1u^w=lRt;&$7qqYQI=d8`zxHc{CgAr=(TsB2)6h|F zSVK-H!_m)CZifzgpB(H0dQDXivQ3t=lhY$}T}JsddCI3dG?uPou2b3i|F{S&pFHLQ zR@j`M4i}l`JA;|U&9ikc`=&808hNbf3`@K}6#2pGajnBF-%m8T)fOZx-SGA>NWJ5o z!uFA?6_KC$TeoeUh2X5`G)#n4GR^WFX(99f{K%Uu-Wp_RS)h_1W&Q=Kd2e}o%y{|< zg}tHTc9}>fWDCCn2c|C${E5=Qnq7&bCe3F3Xq|D1+?9BjAlj5S^6R62( zpOa4%8UA`kzmUoKp?B}QVe*vox{BI!lJK*=Tjl|;A$j^4u!}EdBAP$uogbS<`j|w{ z>u6D3e`!fu9w^>;x?nv`G4p=ACWKb}O9aL2iITsR651u8#gzzBtG07lW1;w!cMl01 z^*e+9+Ra}^SkAChZCHw!4UL@3oEW0LIK0-}+PWXMtRehCd3yH-mHYf1Wnuy;Ej&qz z^}JFYkI(h!aN|vJ?sgkzQF`O2x8yAG(Hrv|)V}}bcnx(x=vfMVBi)XZ%4Z=jxF-S) zX_L-+w!-lV#1SHYJ3fkxn^W$CeY_&ER2-x6*CE8z=WyZ{*D69<)A80U_ec z$ebE&`Kv2a^T&=n^e#N^Fn3CGHy{y}{+Gu9N0?Ga~@h9ZB5I3K#6 z9V&A z?v(kJrw_n|)rFy4El8W`=*_yudF_ z5x^pXBuPz~x>5ay2ma>952<})tpL#^`qI3x^e!O7%oza0M4Fi)>o$g4oA})CR;`!T ziyW19g+mG6f20bd9c!@9b<2ri5Ye_~U|#0)Sa zeq4fm|KFF3)QRIhyzLtZ-*c8cw4FSk_G_kv?V&#ROK4pVDx+^knT)E6y-zRQYHC4T z*Xm8e1kULy#y_g#fS<|ppWIMeoXh17odO`oBGg9p(2e`&84dy*D1eN~VNil~M+eiSp%BJ3Zq&;u zT??1f55;lc>7=f0`i3ynp1Ys>R&W>&;)_+qb?G77p;d(9}=aW zVjNsGpkIiwmLPQ%(8Kl4trG{H4@Cjz(SpO>Cd4YhJPz^Y1lM*~B%SHnPLz8uKj+gf zdc>?)n+})<(kdF889F*tatf=NRBPynpur5spzB{)9`eZFb=d#Q!*K*8OR3x*T5pGX zrsU?&_PZ+0rmZSgklOw<0%HUW(y@`~Ws zzv0tnE8D?&CLED6@bgtZd?y_u;`-lJLpc)^U;c`iBU1<+A|RY#5PJLtwR>TVmP zy@P$?n3Rk5;L^Hc3dS7rIP8T5&CH4pX!nwj8K*YhNW7h0JMq+5$9Hd`((B}S=QY`$ z1h$w%2pq4O&>Y+8I)r53JBK49vYZdN$SnbB=}9z)>BmMloi^*KYx2UDk5@h83{~D= zhQCuB{ieA5ekMk;bsScyEnMzl(JLky<@a{}*8-0$J}+0NF{|TcebFoOVY?fnpm(E( zq4sSh=ckW*Y;F}yO_Dm=6&QU?hzMAj26-1ltA{Wc1XhCS4E0_`gYh%Dw>%FGVDLO_ zjvXK0WkF;4`hA}e!K~Xy4^r-sqQfcO#Cmadl$bc#DLN>q2um3oIPdN0$#TdQxHS66 zgm_9r<3TnTR4ve^Og#nm5DoR9=P?4NBt$Yh_-0OL1d&6DxnnaO*x{KJ&J_h_6}P|U-zp!?w_ z_Gl~U`|MiC%;m#Puft8lbLgknxbhC1ChI4T3RcUV+EX`jF%{Dx3%8j=8^Bj?r(8PcI4A?6EY zDrg+;wvvPnh&}}mJ8_OwF9n0*S1TIU`96TIys>>CbgU;QlA)As5)@nah)7Haj2KCL zN}f$eYyXcL|Ba3P^YCahV~l-v*BaJ`AS}(pUo*g+_>7nh6-Bv0A7jVc!p+gd0G2ao zJ;%2D`m8Q3Hb$eD=ye@t-;r^3Q#6kgpxT|TZ>^lOA2_lW6xV3Ykt)`6vbq+tE=CMj z@riL^wjkwnnIg+~Hq7oinQce;{Bh|M_l{T8LIr=V=i@Pw=Ht?B9*KL;wzPkw z&k}^lon6onI501d%mE_Pd0NvdaOsE zJ$C2gxax}&IbHNj(Z>Yvg)k`_$Yv*TlS47FC=I3F+fR!t6@4`1#Bm?FV4^2*Q7|-j z*igfk;4%|g_#EC!Nj1 z4iUwg*;PMRa|B`}ZIGfDrs2l~AG5 zv^29mjJ08Yq8%V?GcI%s#ac{DKhR4QL-yO@70KKI~mk)IulfedU!9H4rcF(_9i*IF=2e-+@xg#F&I40JIr5IaO#E>`mD?X(;HEU2&Q?yk=kbeAr_K(dnXf#3ESG^ zTL0wfkS+dCe%<%^o3i2f$=P?cWHk1IFyXN3Vpn#WdQ)Z^$3xVm&=>m`Pb+~g`crvj z8nkEi`~S?25GdW^{<%E~AxMh}@17NmXCenb(yP0hK{j~EebI<01plM~Y(Z@wn_pCL zjs0ziB5qpxJ1m3=Pu~sWuSuv^RLz$Wz~6`oVD~d2ry>9Bt#{|c%gRYuWHhvewH8a0 z#!zO-Zl7jbPBPONkv_GL-x83F?_pVN7_?Sa&aTPH&i&3%HzAW5z=+3C9#la390xwJ zqb&-CKd4%4^7k`kk9vD@iZlsAtI&+9JCttgw~%LD8tUE!6* zxOlxsf>$tN$y^u^FpzGN8}K^wuok{+?S%;bFYo-!q2NvDaR;62i@23AL6MV$Ey47Roas_d>B8wxEw z96Nk%@%!Xp>O%g0xKH4fOb!3ppX!I#LZN>6cX1-s9+C;F{EoT(jN_RX)PmQ&w|_2n z$EBwamVN$QwmsBew|P2puQKu>ZA^bzb?9&cl9tQqsdk<_=@5G1Gix`d!9M%wp}uyQ zx@_hFk0>WvzdVlSaKg>M>bu(`{s>hpnNO%8zKrtqMr-O9xU7lsr0xJ^>9=n=$zA$B z;+fNQe)|oR4%gKOB#|WrG)gR5IuXgOo#ko$tN-%_yB+7Sod!>-gQ2$)7r$EO-@oU< zWdayH?oEoXclxGs(;uP0JKGQ0Fo(La>spH@NQGlYRjH{GnNgA-q;p>3{W_h=8AW_CKSq9 zQpai~frbc(i}%OCSN4AX%Qo_~n$B@$8u~k1P%8+xSx5aC&oB5e4a2Y2W$$bOYt}T<$(B*lDCH;ob%3b`KWL)S_JhlqeP+EM}Z!^Q%f z76=0l^052wFaC`vh-2tMkT3e<@j|wAF0B=@c+J0TK+xZaaJUKZ9mJvjil_UM!XYPy zG@7QsgnRSS0QZo;BYN5TwI=ZuCQr5ufN$VZ7a^3s(ms5nPc>N&NU->RnCV`zE2-C#arAS{lsu8 z-ma{>IZ9688QG0OzI``kI2Aajexv&UWiJ&qN5Yp=%3o1L(MX;6xvB5QsB3#kDJbhw zVG>|p!Q(zTxn|vDQ$fTxG(PSqqNg3$F1J?3P#jbNDrXF>pp2TyI{fQnBkQ#Q8(y!9 zM*VsLjfMB#V^q4vbpj_R?4#Ve4n_H=Y)aUAV1 zg_^nd2j@11>6{F5CEqG~U77@f1B^5aqmI)46y}`qI|wlSVYpHKf7&^}Mty(8Xa#q%bd*#0c4pw^ivuj@==v&m{q+y zTRewD^+?gExu-WE*Hwl(ib0%&Cp+s!B$tuNP%8f3$$seB$82nDoR%RO0|x+M&)P^{ zAjz-s_@nES>>MYq#>whlpwr*eOH1QH3uiFD{(!S#fC~@6#$zo)@f+aN!QrM>_TpN2PxSi#y>-9J%_cyfP~V8unpQ6!c4?2K=WaKPDin9HK>@vfTNZz^N6vDJmR zM8+;;{|84mL{EDEoK1r{`%;18?fD06>^U5ia2nXYl=G^8#Gh>X%5Q_I}6b6GXp)DX*%buSaSRcwusvS zoKDF zCsXy$tb3Y~BgKce)02mjqIH+zpPeCV=#tCfs~rvlYybS8NSBFa8VBiP60xmdZS_CyU+r{K$npOp5psxyc`G9a84o5&Hp#NV)gj z<)m-L2SU>p!fzf%;0F97d+7P}=Z@dV06@9q`U_y-Zo0H(GNAU0p?i4qx8oOWKJHM) zQ!`5q2dr7!i%YwUb|JM9pZ}#kkKF%$qV$EN;+Skm_A??G<%6QBxK6pyCuTFfH`17tVmev>Po92 z?*{xRTlP9f$ys_P^H{N~RgB}dKoMq^1IkD2J)KVej~5@yt(Oc>O-=pYNSt9QTE(WN zr?W{?SaGv{8V8WGFfXo*HV>V++GeClBjxBZ3@01mC_aD@H~_4{AuA3a&`$)QpMaou z5P%U3aHIy07*VF!qRF2Nm1A^=td#_pnhZQ~jq9dBg;H{#fv{xtl$C`{5rWg+-lM+b zLY3^-!r#**=ID1E6nbic#x5M-ERq5aVCFD$6mU~%3NtNG=wbh?vl%rZ9#iX{)D)&A|hV)uIH9tnveiv_t0hnL0d(LJ7mqV z4u3#Av&$g&VkE(D>KfndpIoY2;^}1`ep5u`O}ffC!`XvR)a2Jq zJ|59dH-TK?>c6}M_!F$*<;bTnd`250Uv}i4rgKAu?$p-Yv)q3*J8QM?Tb8~v7i@G? zGYlO(3Ac-&lcPR?QdBi9X%>vnzWvvAir+p;Anz>sCF0Eh=4y+jZEm(Ph)ib~K*`IZ zVR$A^Q=lW7DnzqIe8XU*)3URdd>`PAKma9Wmc?0)uR%SIg37Ow22h$fJX*ggCsGzq zLICtT02##5&SA&T=U6AhY1{(~0q$vHnBB;L0F`I}AV<`XQ8*h`R#sX@MqczI0K|)` zgU#VcEVQ{i94vQHl*|c}xpIQjzB9o7)aTn0*M+n@=TD`!2Fhg{dH8$Me{{`S~FRgnEW~-0JeN*iQ3w~A{Bk%9fx`2 zQ&|Ma-hfd^CxF6ARhws`kuV1LmFuoowqi?s?Zx%O+MK#q-&)h23E_d~v~F}H{T=k& zJr0=Ts2IlFeod}lkNg||kESz^hU)+S_`S0k`&hEeNVc+-Jz+>FYn!Fb$i53v!d$zO z_>?_mR3a%mC7B^2ON8t(t@eFqmf!7n&iDU0jx#g&J@41^^?W{_{i+{SEW_MCK8=R_ z0~E(Y=j1>B>~nC?yKy|OFrPDJ_e8<=0c6%I#{wKqJ zZFN>G8|a`#9v+Y@$6Q5BOA~dfxEIJao9F=wqM9N<k=yE^)6th<@-X!r=Dn%un5p2^(JAha7q(D;^^n%gi~~OL>@gKwyC)n2Sa*uX)nK zKp=TFtg2RI_q%{|iN4U2@DYpV_3cmP1CMzZHXU>#!xbYItF#jZ%%bE<9~+1td%V)? z>jh;|RR;{S;g)B7S`a~>C_ZBx$DWpi_{y8uB30&d_9(9q-U|_A`_YcT*(H~zO>3Iqv}-4`1AR1WI;5j zd!uY`Fl_%{FzsmAVd)l?=<{bqh-f7b3qcZGhI!dRlihZIKlRKP`h~P&g_tJ8cZe51 z4DSiEH#p+1YmmIxegXJSnaDEAm7I7qD{m3L(8L&2kx;kMa0pL$ehIzvep-@OV8MF( zjfIogi#F{D#3P@(xyh%}?3>H(_Zik@n0#&NsQ5JEnysdmkJ3r=J8U7N z6cH!+DqA2>CI7#+MW=H&B))mHV6YoP-YFGR2`l_qnElsyed|w_lQj++0W~-eaUxr_ zhBd%uF52Y!x<+<%fpQGYCg5^K(B5B@MA*Ph1_)p(bW;CoZRWlFkc@BT%`jNRTY-&w zq&F^FQw>bym3nc@)+H$DY&HNyudG}bl|F80Xyc4m*?yS6J5Y3$kvDaGDk~ESzT(5! zRUlp|axUL6=zVDA8d%$)QIhLIb`i3%f*iqqeur(U!=8-*s!)P>A`ZZueSIZXArjG! z+vY(S!db7Z2@u7F?Qi5NKg-_avCy^1)&VpMP^oE#VSMLx67aVTDtYK9$9jtc)E7@a zIoN8`apz0a#2;R`ik6=I#BK9?uL60O4O>oA9id=I`5T9E4r+D;BLXE%snp9R?v?7T zli6Yv1*Om_zt4VZW8OnJ5c@It#f5Gv`0KgcGd!~4N@UD!By{#HTNVy$lg0RCGS zkP`e~{uU82q7Dzk@AdSfWdQ?_2o4{>;%M)Y@KRHkN{w0KqG?a3y10eZ{`?%Vt__z_ znXx1c?UrbiOFNPTB3zVkwlz-SpV6t(`q{~}W`Y3s=}o8H0}gH7C_J#ASQB@h|J|8JmRU?%e*Gf0hAb%lqs2AvdNmYbc$`#@So!wVbF0khX4{ zeKfg!^m5I{1?TSVR_D(I>iCGuj~@TXP@U`Z7S5rA>frKT);*^Vu${gVmeNEKHGT!= zoqN@EP@xiB*6h_XQWW;&B%b-`vfb(HwS-f{M&gI`=P{GjyyQU6z zf_Vo#tI7-5(}aw85%7x>{eiD2ogo4U@Sx0fY3JZ4sfXJI@g-}~&>kSJv=;k*;AQIo zWlJvolJ1W66fRAL$uLbuyV>`7P1&jH2(7c(H+CzvsEXS;8}cvk8Mp`SW%Hl&Ben~l z(@^2p4OMi4ONjj2x@JaU)*Xv+f*?Qsxg+rMICUzb{#nS|CjmweGj|05^VP(Q^&*I- zAG{+J1XMaG2`ekF3+4#a zBEyyWKnXnYgBn;MYYBxS%})_DKv-S)4(>*9azQh|Q$sjdMYr4^X9DxMq|yr26}_AWY?w$anCjFa!j13XaiWQFks)gol?xtw(Pt}jBFlSUDeyAN@v2L0M}6%#%4)M0>KyE&~?(z~aV10R)T6RYgwW-@# z2##bO!S5HL<%L_t^i0>ds(G$GI>z0%w%_)1=RjHOM*F)`!>3?pq^!EuXnqbUdeFdc zCHXX|g#MVO>b7&5kp&~IkN^lJg!>&4WXKfsUlvvw+kMeHbNK=M?XOt&kRpZZ+=9RS zrrA)qXMtonyFS#%1V9|(sUTsL@=b+fhM{U~>jEgbS%DaQ3rT&ZjB# z)r&V6HR9T5F3)bHztl3^-i`MAbGW?Lw-Jm_+F_) z>2lkz^8a?Y6{9qq3g)+8-MT(;+FBYKh}&ezgrhAt$xk} zSmak`*mQ3JaSi!g4{9dB;)n*g%uyahefh6Aqzo>I&u3T+&&~7~JyR>^LfAdybg;6A zRPvszs`h8K{)htrJaEdy=sfEaDt#EZQlzw2m(lUF0&~U-JP-Vv;ej227{W!Y*&NL` z%{G3-hHLzd57p50EBP&&XP5IPkXC^f#kcE$eLkgXXEz1#=AWtOu32Lmkuh?PgR7Wj zPsHyrX3Gy=zO!B=)!lP&l5p?rtNg)TBgT|B%V8_4?KM+%-S9MsrDFgTN(n2VHVA)y zjoU-U9zQ#J=e|7SR_p4Kf01}R zH9ck>ofM4hHTIN=*G&5JnKXFhUDr|Ptir3s`@hldI!1x8CsA{br?{u93oAg(1(rkp!%QU>we|Q^`5oYrADXy8_wXKoa>nMB*FheFbYS1 zZGyiT-FzA$$8}E<@pZG#WX66M<(c{9>z;~(d{4MaU9H~>{;FH`TIWN@uujuw-Dc+N`_5u zfKM^*h~EQlox1_gw4YcXBfHe?>6R}Y-E~kFThV@H_+oV`W$z>SQmwq=G_HJH!5IPU z!k91eNgVuxj_|#U?*R4TEl_!b4V2;NsO8XIx1Q~*jsQ|Wdy%>(&Nl{}op%>Hm$N2(jmT$qn)%6_PAcpG%JZ;uo-9?`*jgs-9!Uv!uQa(uUkj_{ zJ{>5Oc#?t5RgJixZ`6? z(UZz;hCdF{CVXN2)y9?#g@2vCcJj=;B`X(=iXTwr;g?(qlo6Bewx za{SX#=+o6-g92P0sV|hV{<`=5HumxLh_YsQ)^B8p1}iJ_cWbL1NNZZS5>h+lC3-;r zDr5hB<35=?Z2ISir#xBF-_#6>s<=A}aV*EGU;hm`n|?O_Dsek%x@$bQwT`j3Ws!`> zc32mkON41%-)5WH0G??7P}nh zi6jlNtJAW9`PuD!`se(H)mGK0l`=k9Wd!i#SxSaT^tW_wtiOhNMkjLS3M2SA^TLMp zNBkNGo)f>)QyL>1ct`;!M|i>Y7a2D#R%~i4R9vN`|8DIEyn~aUftb_eo-s-z+Tb3s?ciPyo(TsAUmS_xRG1X*4ioDUqbN(b8tHS&<+9gVSl7 zMU&gig^pq!6u0-Njr=zid|-51VdS)#$K%IDLR}{t+o?eJS9uu-Pf4W(Nb6|!>*(En zC_0DD>l6gF+(CV|OPWqiy_8l5IO!i7?iNpKB9#XNc#w4~H=iO8{kD)U+%#fS$WA-C zY0^XV-AHE7cViYO4{=`D>BLFdvYylZifx`VjdqfSsG^LPOiIIKeoa&_i+}nxcN!jl z6mUL*FF&8dPGS!a`kV#C?g~WGv#mNH$E2M90ZNFN}zo^WuON zl!F9;q(Iw5uCGc-S3rKc8#dMAdzGspsIZWjrDc4`p+C-0bEKxqhW01a#0B$#dgJ4H zlR#e2ivjodItD#yb%!q`F0bo8NZtFrj zoRK|)@>Cso)1hVFYhb%WOQUe(km|J{*P{ODM8}aM zxMsq*%GV<}0D2Z@lW*|-Ql00?Y7e=j$QeKgmmaE ziYw=dvM%F#Mk0;ZZK)tO^5AxVpZ!Z_W(`9TF!zhZp$?Ffr&Ad$L5Aq}GD+YL8n^2d zV-Nz+M+9)T>!}>F6#uookHf!%Pf+Saa=Sxqam#suzoizj>T_cS>VsInGt6g)3HPE0 zcnKkZ*mgXcY)z0rS_wKN@}<$0$7^8rb0((+RVP0iOm1E|9lHL`{k@{ipihKafJ*Sp z%#!b=T;$DF2Qrpws+sMTvJ9fJJf+RtVm#FCS_BDOP6 zH72xWe1TH)cjmZJf(5Yf>WwRhJ%Bw|g1a>XjA>dp+n5-}^1ek84tv zENg>CXWq_;L_Dxna};iazVvugW%S?R&E?x>pK&CuQ_^!sCxv=vadh2L3OFjY5S7WO z>*^bdg({m;YZ-r@8iGiEy5^c{KLfjYdhb^en)Fr^i>KOT_zAThIh8cz&$Jb}v_{7w z!ao!)zcYN_xcwSgzr+7m_ny=MVbbhdP_0*5-{ft}GB);6uT#TU-7mPXpbo|IVp z-`^Q)$hU&qpYL41)$4ogOaD0?h|Tv)AV;_&-yrb`n+2oe>8`37Zbg;(^TFQsgUjnP zlP6-s?q54VF7Iru*e^Ql!1vbH(-T{;8`;;U7!B!onsy3+DyS@11H{SZCT2(4;~?4;cj%+-|j~zd5O7@*f8+ufcY2^1UWf50mQZqf%=bb z9F~%j!VN(g2;H9X@=Qv}R43Kg>5-7?qDB9{5@xV$gF&IA0g}wIQL3-@=wNXdVICLQ z1+;r!#3l!(HRX;(z_!sP8$KH0_2dm<+YuWfd>t+{7wp@qm`{@{SHym`pw8ibe)E=B z@Md?_trc*$$HqKBk-QdOiOpQFs7awVj?~>WtZm+ z+Z8qfblM~z1_XHb?-_f{Cdy!`ZM$85h9W!$%U{*rH@aC86j~&(ix7OrLm1uXyMN8- zk(z=5c)GhEuQ1AHcHMQA3pd^pMT)gswbD6sC1dk`d0pw4-c^o2l4qd%UzI&JczlM- z{s6v26_;C=90!1B{|C~^Uw;ZY+8LE!?H7fMm1dYGfUvP_VQU* z`1G;fvVFt|05O;>hxZTN`X08#yuY-~13_2ev()z1ga~xnib|(P^q8_IyWl<8s4$-c z2nPTV;0R#@P&96RT)8S08GXn$&!fXd`$dJcX*AKVmqL zFOkI`LpFQ*b{%s-p$z`@5Qe$*7sMbnhXI+eX z>XZj-AEc+On(kB{((YyNjkR=22_t?rt4pfs>Kt?90Ib}P5EKc!ipJAYi8MV+zg^Nh|?+F`-zJJJub{eWA;SD*nsoCTs#+E{@z zFsRbsGi&ZC#){0$Jrv7y$==RuSnhWB&1mr9qOxFMB z9oR(Lp0x*!;q;HkCyGmGB#Hav<>A=}6K(}i0W)@S z0esU$2bg_8K@5axV^gXB5W$dtZ5V|YML)j% z@X$AW*66zL{bbI#`;uyjgawgaQN$hY-s2CEaXOX??o3zEM1XoHCRWstN4^%Ql%cv! zDR$aC0q(H(5*|lzX(Y8(LV8YLh4Fp#aMNq#)Kh0WG&QH^Zl$w=pO^L0OSbKkod&iZ ze{?#}c+^^!L_be!Gcx>dQ}rbyelskRiCtF$2jbAS0Dhz~9aw(I(wOE1(r7jr7+{F~ zWxl2VE>YxBy|fE#gz_-FcznBt_nW)>BbaQ|Ocg4Q%0;*44_GRx?;g_uNn!cxyXq@h|picUU>y!a-=Q1^+e?z zztx9(;hk9LH}E}0A&Shc?BLyR!Uzy!?^T@aQGoBzlO(s5>yk2BHLCx{C1`8goB``VG- z_m%KY-y+0iaOt!-&vM|8zg`D`AXz)KXm6KZa9kx6c5@qKyNr z!lKEV?RRz*hqbV4l=G}28t**_!-8?n9Zp3JtKw&Hgc&&kRnakK$hTfL0v^U_96Dt5uL61+v=M)3-c2=vE@01V}8_ zAvWv-%Pou$%5Te+y^cDB={g#fDRh~a;?88ZBw9W9fEpugmxa}%6lae5DfTlDZ9bfL zl3)!?%Wv$-i%oK}sz3FF8opv#_>m^$SfYOdlpt4z>5j!G8w>%T!NDXf{gU!#o_A}n zlX-lFUc^j2dEL&S_xImNCvMLc7Az5{Qy^mTwo|s_Bo_cGqgZy*RR}Qzmdr->!ktEx zfH+=I4I`m=ZxGAJUVjK;XZw&C1I27R|9;{qK1fk>C2ZH^kGa!nb*{&~qxe~lg^z76%VTc%;`8PBAH>Ac z{Qj%9uQrmS!YbtcKyX%!P0WTW95H0}yPfnlf;&del5e(ocdYBZdd; zT^hiaU+KM!e0Gj_4SPN})0AuPRMhGd(@A+YYD8YS`(Ax!)(s@b)sE8WeFmqWnhA^l zq~Uuo(`)dsUT`9{;rNJ6N)&+V8k%fi+_;T;CpY#i$|xiB7ea=W zz^&y}Bd2MS*VG# z_J8%J!?5njpf$x}=W9kr9IJNTMgpnG(=vO=l9~b^f{#_%Zdw5s(H~O&o|Xl9 zF&z{SLet5cZ}#MoY<-I;a0A+20h4 z39<6>Bdb=NVuQ&a0f$f^&7*R?keAkoAY=*wn*za3>JA3zt}jgf)9OOn|dz8t!W+Uplhx z@JEJ687%#)Hhwv-)bpxAZHY@p|5K;>V8P$-pPqyl!?HNoBFBp$3LT6gbTSLrlPm!b zwwrRWP?jpG_c!fDF1iBNv8WlS<2ZOl`R%gEGe4DK(WE-fDK=XHVlZ;KAsej^H^i*I z&p?XFTjzONTU!sR!R%q9K}q~zle;v$+a#@N=dazhZ}`dZ8G6$l7u_gPewmOO*6D2l z@Bo3Zs{b6yZFZWF#-D$$y?F#67qr5hd2{Cl!L*s^WhC)Jt^p{=;krlckw7Uk;f&V# z4=$LzQA00wjZ0g{fCBm}IgnrJ?H{>06#m@3qtOx9P*KXR<&#eFBoy*FBLi%|P5;n8 zY3w;5@ZH9UnDUTmxouWNF^9!4sb<5475iUOoZF_1hfdOX5h40H7kSF9yk~DBz6yww zR6_=tk9wCjjFAx(FT^5ib+5TT#}p?=M&|?HfOanM6$6P&TFK8rOTVofJ?gJR)qMN4 z_mjbnm&%7(3D3~5iW3ASpy8G+$F&RS<(n0=H7`drPX(Rk*v`x5ezDjjJ*PNc6u*acuU@C=sbI zD6#~kubSzOakYeMu%=@~7`z?~3;u66PQ3rVANCz9_$piyMcosDIE8+i258K4ZT~Ti zg4gO^_JQ>!X9Ngx!2Re%9?2NL@^s`fuPoGGWE1QU-Q&}$!UM6t0;1L)<*)qf-TQlE zZm{NqBhH9g9(##^Yy)se-znM@W{^i_k*KSqUNElj2AA0zh9Tynd^p22bYCI~7 zvx=o693mgWofOAM0OplVVVYUfl!dz~#{Ke#$>+$`JI|*7drf*uH(Nf-E>lUW9%jdu zlYAK;JtsAO%b#KT&R9UyA%^l^ombSvcivIp5MyRlm}IxHGd5zSOuD!d3G1z=^m#IrtWDdVS}5Fs3pHFap@H3-E*;`m^OueGd8? zoET6tHS*=l%grsxKX#*}!o6Dzh>`ot8JLuofxO?i2z%&1{cDoug*_g%k-O_&1*|g| z5e&la5WCWlsZMpIS_yNbVJ`^c6|PA6LM3oChUXS*s)k`r=7_^|F-}}Gp_<#e5Ofo~ ztUUQb7Bil5dT*;daYs%_!I4?14mKkZ+vTpL-N2U9q z!J^?NYb5#CeNW$()9-(XX3EiTUvOq$%+k)aGp{sgdn>m3+M+9VqT2UOHLu7ykz>MU zDFv4T+bR_Jf684LIY(vmpHuNUoFAYd(7r2MuQ`^*S*@2s6HLe&N>cofJJ|cM3bv*0_ zfn?0?4-CG!B7OsLWNTyZ5QN@kPEl$cZr_?biIMzWZ=l7v4)gA?iIN1*! zwoijm58NRp@R>RE0`uvGhPF<7w_xwQlP1zzy7UT4am;3eUg-p=N9vk#F7q#Tyf{&7 zz8c*3z~RKRB?Q%0DpuZo!% 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%0DvEb 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 literal 0 HcmV?d00001 diff --git a/Adobe Creative Cloud/6.4.0/PS_Deployment/Deploy-Application.exe.config b/Adobe Creative Cloud/6.4.0/PS_Deployment/Deploy-Application.exe.config new file mode 100644 index 0000000..60c786a --- /dev/null +++ b/Adobe Creative Cloud/6.4.0/PS_Deployment/Deploy-Application.exe.config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Adobe Creative Cloud/6.4.0/PS_Deployment/Deploy-Application.ps1 b/Adobe Creative Cloud/6.4.0/PS_Deployment/Deploy-Application.ps1 new file mode 100644 index 0000000..e08a7cf --- /dev/null +++ b/Adobe Creative Cloud/6.4.0/PS_Deployment/Deploy-Application.ps1 @@ -0,0 +1,358 @@ +<# +.SYNOPSIS + +PSApppDeployToolkit - This script performs the installation or uninstallation of an application(s). + +.DESCRIPTION + +- The script is provided as a template to perform an install or uninstall of an application(s). +- The script either performs an "Install" deployment type or an "Uninstall" deployment type. +- The install deployment type is broken down into 3 main sections/phases: Pre-Install, Install, and Post-Install. + +The script dot-sources the AppDeployToolkitMain.ps1 script which contains the logic and functions required to install or uninstall an application. + +PSApppDeployToolkit is licensed under the GNU LGPLv3 License - (C) 2023 PSAppDeployToolkit Team (Sean Lillis, Dan Cunningham and Muhammad Mashwani). + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the +Free Software Foundation, either version 3 of the License, or any later version. This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . + +.PARAMETER DeploymentType + +The type of deployment to perform. Default is: Install. + +.PARAMETER DeployMode + +Specifies whether the installation should be run in Interactive, Silent, or NonInteractive mode. Default is: Interactive. Options: Interactive = Shows dialogs, Silent = No dialogs, NonInteractive = Very silent, i.e. no blocking apps. NonInteractive mode is automatically set if it is detected that the process is not user interactive. + +.PARAMETER AllowRebootPassThru + +Allows the 3010 return code (requires restart) to be passed back to the parent process (e.g. SCCM) if detected from an installation. If 3010 is passed back to SCCM, a reboot prompt will be triggered. + +.PARAMETER TerminalServerMode + +Changes to "user install mode" and back to "user execute mode" for installing/uninstalling applications for Remote Desktop Session Hosts/Citrix servers. + +.PARAMETER DisableLogging + +Disables logging to file for the script. Default is: $false. + +.EXAMPLE + +powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeployMode 'Silent'; Exit $LastExitCode }" + +.EXAMPLE + +powershell.exe -Command "& { & '.\Deploy-Application.ps1' -AllowRebootPassThru; Exit $LastExitCode }" + +.EXAMPLE + +powershell.exe -Command "& { & '.\Deploy-Application.ps1' -DeploymentType 'Uninstall'; Exit $LastExitCode }" + +.EXAMPLE + +Deploy-Application.exe -DeploymentType "Install" -DeployMode "Silent" + +.INPUTS + +None + +You cannot pipe objects to this script. + +.OUTPUTS + +None + +This script does not generate any output. + +.NOTES + +Toolkit Exit Code Ranges: +- 60000 - 68999: Reserved for built-in exit codes in Deploy-Application.ps1, Deploy-Application.exe, and AppDeployToolkitMain.ps1 +- 69000 - 69999: Recommended for user customized exit codes in Deploy-Application.ps1 +- 70000 - 79999: Recommended for user customized exit codes in AppDeployToolkitExtensions.ps1 + +.LINK + +https://psappdeploytoolkit.com +#> + + +[CmdletBinding()] +Param ( + [Parameter(Mandatory = $false)] + [ValidateSet('Install', 'Uninstall', 'Repair')] + [String]$DeploymentType = 'Install', + [Parameter(Mandatory = $false)] + [ValidateSet('Interactive', 'Silent', 'NonInteractive')] + [String]$DeployMode = 'Interactive', + [Parameter(Mandatory = $false)] + [switch]$AllowRebootPassThru = $false, + [Parameter(Mandatory = $false)] + [switch]$TerminalServerMode = $false, + [Parameter(Mandatory = $false)] + [switch]$DisableLogging = $false +) + +Try { + ## Set the script execution policy for this process + Try { + Set-ExecutionPolicy -ExecutionPolicy 'ByPass' -Scope 'Process' -Force -ErrorAction 'Stop' + } + Catch { + } + + ##*=============================================== + ##* VARIABLE DECLARATION + ##*=============================================== + ## Variables: Application + [String]$appVendor = 'Adobe' + [String]$appName = 'Creative Cloud Desktop' + [String]$appVersion = '6.4.0' + [String]$appArch = 'x65' + [String]$appLang = 'EN' + [String]$appRevision = '01' + [String]$appScriptVersion = '1.0.0' + [String]$appScriptDate = '11/25/2024' + [String]$appScriptAuthor = 'John Palmer' + + ## NCH Custom Variables ## + + # Define the running executable you want to check on Install/Uninstall and prompt the user to close if active. + $ProcessName = 'RunningExecutable' + + ##*=============================================== + ## Variables: Install Titles (Only set here to override defaults set by the toolkit) + [String]$installName = '' + [String]$installTitle = '' + + ##* Do not modify section below + #region DoNotModify + + ## Variables: Exit Code + [Int32]$mainExitCode = 0 + + ## Variables: Script + [String]$deployAppScriptFriendlyName = 'Deploy Application' + [Version]$deployAppScriptVersion = [Version]'3.9.3' + [String]$deployAppScriptDate = '02/05/2023' + [Hashtable]$deployAppScriptParameters = $PsBoundParameters + + ## Variables: Environment + If (Test-Path -LiteralPath 'variable:HostInvocation') { + $InvocationInfo = $HostInvocation + } + Else { + $InvocationInfo = $MyInvocation + } + [String]$scriptDirectory = Split-Path -Path $InvocationInfo.MyCommand.Definition -Parent + + ## Dot source the required App Deploy Toolkit Functions + Try { + [String]$moduleAppDeployToolkitMain = "$scriptDirectory\AppDeployToolkit\AppDeployToolkitMain.ps1" + If (-not (Test-Path -LiteralPath $moduleAppDeployToolkitMain -PathType 'Leaf')) { + Throw "Module does not exist at the specified location [$moduleAppDeployToolkitMain]." + } + If ($DisableLogging) { + . $moduleAppDeployToolkitMain -DisableLogging + } + Else { + . $moduleAppDeployToolkitMain + } + } + Catch { + If ($mainExitCode -eq 0) { + [Int32]$mainExitCode = 60008 + } + Write-Error -Message "Module [$moduleAppDeployToolkitMain] failed to load: `n$($_.Exception.Message)`n `n$($_.InvocationInfo.PositionMessage)" -ErrorAction 'Continue' + ## Exit the script, returning the exit code to SCCM + If (Test-Path -LiteralPath 'variable:HostInvocation') { + $script:ExitCode = $mainExitCode; Exit + } + Else { + Exit $mainExitCode + } + } + + #endregion + ##* Do not modify section above + ##*=============================================== + ##* END VARIABLE DECLARATION + ##*=============================================== + + If ($deploymentType -ine 'Uninstall' -and $deploymentType -ine 'Repair') { + ##*=============================================== + ##* PRE-INSTALLATION + ##*=============================================== + [String]$installPhase = 'Pre-Installation' + + ## Show Welcome Message, close Internet Explorer if required, allow up to 3 deferrals, verify there is enough disk space to complete the install, and persist the prompt + #Show-InstallationWelcome -CloseApps 'iexplore' -AllowDefer -DeferTimes 3 -CheckDiskSpace -PersistPrompt + + ## Show Progress Message (with the default message) + #Show-InstallationProgress + + ## + + ## Remove the comments if you want to check for an active process and only prompt the close diaglog if the process is active. ## + + $ProcessActive = Get-Process $ProcessName -ErrorAction SilentlyContinue + + if($ProcessActive -eq $null) + { + Write-Log "$appName $appVersion is not currently running, continuing with the installation." + } + else + { + Write-Log "$appName $appVersion is currently running, prompting the user to close the application before continuing." + Show-InstallationWelcome -CloseApps $ProcessName -AllowDefer -DeferTimes 3 -CheckDiskSpace -PersistPrompt + } + + ##*=============================================== + ##* INSTALLATION + ##*=============================================== + [String]$installPhase = 'Installation' + + ## Handle Zero-Config MSI Installations + If ($useDefaultMsi) { + [Hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Install'; Path = $defaultMsiFile }; If ($defaultMstFile) { + $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) + } + Execute-MSI @ExecuteDefaultMSISplat; If ($defaultMspFiles) { + $defaultMspFiles | ForEach-Object { Execute-MSI -Action 'Patch' -Path $_ } + } + } + + ## + + Write-Log "Installing $appName $appVersion" + + Execute-Process -Path "$dirFiles\Build\setup.exe" -Parameters '--silent' + + + ##*=============================================== + ##* POST-INSTALLATION + ##*=============================================== + [String]$installPhase = 'Post-Installation' + + ## + + ## Display a message at the end of the install + If (-not $useDefaultMsi) { + # Show-InstallationPrompt -Message 'You can customize text to appear at the end of an install or remove it completely for unattended installations.' -ButtonRightText 'OK' -Icon Information -NoWait + } + } + ElseIf ($deploymentType -ieq 'Uninstall') { + ##*=============================================== + ##* PRE-UNINSTALLATION + ##*=============================================== + [String]$installPhase = 'Pre-Uninstallation' + + ## Show Welcome Message, close Internet Explorer with a 60 second countdown before automatically closing + #Show-InstallationWelcome -CloseApps 'iexplore' -CloseAppsCountdown 60 + + $ProcessActive = Get-Process $ProcessName -ErrorAction SilentlyContinue + + if($ProcessActive -eq $null) + { + Write-Log "$appName $appVersion is not currently running, continuing with the uninstall." + } + else + { + Write-Log "$appName $appVersion is currently running, prompting the user to close the application before continuing." + Show-InstallationWelcome -CloseApps $ProcessName -CloseAppsCountdown 60 + } + + + ## Show Progress Message (with the default message) + + # If you want the Progress, just remove the # from the Show-InstallationProgress + + #Show-InstallationProgress + + ## + + + ##*=============================================== + ##* UNINSTALLATION + ##*=============================================== + [String]$installPhase = 'Uninstallation' + + ## Handle Zero-Config MSI Uninstallations + If ($useDefaultMsi) { + [Hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Uninstall'; Path = $defaultMsiFile }; If ($defaultMstFile) { + $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) + } + Execute-MSI @ExecuteDefaultMSISplat + } + + ## + + # Uninstall Adobe Creative Cloud Desktop + + Write-Log "Uninstalling $appName $appVersion" + + Execute-MSI -Action Uninstall -Path '{B62FBF33-2638-4447-8DCD-DE51C9F68E4C}' -Parameters '/qn' + + + ##*=============================================== + ##* POST-UNINSTALLATION + ##*=============================================== + [String]$installPhase = 'Post-Uninstallation' + + ## + + + } + ElseIf ($deploymentType -ieq 'Repair') { + ##*=============================================== + ##* PRE-REPAIR + ##*=============================================== + [String]$installPhase = 'Pre-Repair' + + ## Show Welcome Message, close Internet Explorer with a 60 second countdown before automatically closing + Show-InstallationWelcome -CloseApps 'iexplore' -CloseAppsCountdown 60 + + ## Show Progress Message (with the default message) + Show-InstallationProgress + + ## + + ##*=============================================== + ##* REPAIR + ##*=============================================== + [String]$installPhase = 'Repair' + + ## Handle Zero-Config MSI Repairs + If ($useDefaultMsi) { + [Hashtable]$ExecuteDefaultMSISplat = @{ Action = 'Repair'; Path = $defaultMsiFile; }; If ($defaultMstFile) { + $ExecuteDefaultMSISplat.Add('Transform', $defaultMstFile) + } + Execute-MSI @ExecuteDefaultMSISplat + } + ## + + ##*=============================================== + ##* POST-REPAIR + ##*=============================================== + [String]$installPhase = 'Post-Repair' + + ## + + + } + ##*=============================================== + ##* END SCRIPT BODY + ##*=============================================== + + ## Call the Exit-Script function to perform final cleanup operations + Exit-Script -ExitCode $mainExitCode +} +Catch { + [Int32]$mainExitCode = 60001 + [String]$mainErrorMessage = "$(Resolve-Error)" + Write-Log -Message $mainErrorMessage -Severity 3 -Source $deployAppScriptFriendlyName + Show-DialogBox -Text $mainErrorMessage -Icon 'Stop' + Exit-Script -ExitCode $mainExitCode +}