Snippets Collections
Sub RenameMultipleFiles()
Dim ws As Worksheet
Dim FolderPath As String
Dim oldFileName As String
Dim newFileName As String
Dim lastRow As Long
Dim i As Long
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
oldFilePath = ws.Cells(i, 1).Value & "\" & ws.Cells(i, 2).Value
newFilePath = ws.Cells(i, 1).Value & "\" & ws.Cells(i, 3).Value
If Dir(oldFilePath) <> "" Then
    Name oldFilePath As newFilePath
Else
    MsgBox "File was not found: " & oldFilePath
End If
Next i
MsgBox "Files renaming complete"
End Sub
Option Explicit
Sub CopyFilesFromSubFolders()
    Dim FSO    As Object
    Dim FromPath As String
    Dim ToPath As String
    Dim FileExt As String
    Dim SubFolder As Object
    Dim CurrentFile As Object
    FromPath = "F:\test\top\"                    '<= Change to suit
    ToPath = "F:\test\everything\"               '<= Change to suit
    Set FSO = CreateObject("Scripting.FileSystemObject")
    For Each SubFolder In FSO.GetFolder(FromPath).SubFolders
        For Each CurrentFile In SubFolder.Files
            CurrentFile.Copy (FSO.BuildPath(ToPath, CurrentFile.Name))
        Next
    Next SubFolder
    Set FSO = Nothing
    Set SubFolder = Nothing
    Set CurrentFile = Nothing
    MsgBox "Done"
End Sub
# Options
AutoCreateDatabase=true
Cached=true

# Blank: an empty project
Blank=

# WordPress
WordPress=https://wordpress.org/latest.tar.gz 

# Joomla
Joomla=https://github.com/joomla/joomla-cms/releases/download/3.8.11/Joomla_3.8.11-Stable-Full_Package.tar.gz

# Prestashop
Prestashop=https://github.com/PrestaShop/PrestaShop/releases/download/1.7.4.2/prestashop_1.7.4.2.zip

------------------------------------------------------

# Drupal
Drupal 8=https://ftp.drupal.org/files/projects/drupal-8.5.5.tar.gz
### Drupal 7=https://ftp.drupal.org/files/projects/drupal-7.59.tar.gz

------------------------------------------------------

# Laravel

Laravel=composer create-project laravel/laravel %s --prefer-dist
 
Laravel 7z=https://github.com/leokhoa/quick-create-laravel/releases/download/5.6.21/laravel-5.6.21.7z

### Laravel dev-develop=composer create-project laravel/laravel %s dev-develop
### Laravel 4=composer create-project laravel/laravel  %s 4.2 --prefer-dist	
Lumen=composer create-project laravel/lumen  %s --prefer-dist

------------------------------------------------------

# CakePHP
CakePHP=composer create-project --prefer-dist cakephp/app %s

# Symfony
Symfony=composer create-project symfony/framework-standard-edition %s
- 👋 Hi, I’m @BAHATI44
<!DOCTYPE html>
<html lang="fr">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="description" content="Inscription BuloMED">
    <meta name="keywords" content="inscription, BuloMED, santé">
    <meta name="author" content="Salomo B.M">
    <title>Inscription BuloMED</title>
    <link rel="stylesheet" href="styles/style.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.8/css/intlTelInput.css">
    <link rel="icon" type="image/png" sizes="32x32" href="BuloMED.PNG">
    <!-- Sécurité supplémentaire -->
    <meta http-equiv="Content-Security-Policy" content="default-src 'self' https: 'unsafe-inline' 'unsafe-eval';">
    <meta http-equiv="X-Content-Type-Options" content="nosniff">
    <meta http-equiv="X-Frame-Options" content="DENY">

    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f8f9fa;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
        }
        
        .form-wrapper {
            position: relative;
            padding: 5px;
            border-radius: 15px;
            background: linear-gradient(45deg, #ff0000, #00ff00, #0000ff, #ff00ff, #ffff00);
            background-size: 200% 200%;
            animation: gradientAnimation 3s ease infinite;
            display: flex;
        }
        /* Exemple de media queries pour petits écrans */
        
        @media (max-width: 600px) {
            .form-container {
                width: 90%;
                /* Utiliser une largeur en pourcentage pour s'adapter */
                max-width: none;
                /* Supprimer la limite fixe */
                padding: 10px;
                /* Réduire les espaces si nécessaire */
            }
            .form-group input {
                width: 100%;
                /* Assurer que les inputs prennent toute la largeur disponible */
                font-size: 1rem;
                /* Ajuster la taille de police pour plus de lisibilité */
            }
            .button-container {
                flex-direction: column;
                /* Sur petits écrans, empiler les boutons */
                gap: 5px;
            }
        }
        /* Optionnel : règles pour les écrans moyens */
        
        @media (min-width: 601px) and (max-width: 1024px) {
            .form-container {
                width: 80%;
                padding: 12px;
            }
            .form-group input {
                font-size: 1.1rem;
            }
        }
        
        @keyframes gradientAnimation {
            0% {
                background-position: 0% 50%;
            }
            50% {
                background-position: 100% 50%;
            }
            100% {
                background-position: 0% 50%;
            }
        }
        
        .form-container {
            background-color: #7b7c7c;
            padding: 15px;
            border-radius: 8px;
            box-shadow: 0 0 7px rgba(0, 0, 0, 0.1);
            width: 100%;
            max-width: 350px;
            position: relative;
            z-index: 1;
        }
        
        .form-container h2 {
            text-align: center;
            margin-bottom: 25px;
            color: #fff;
        }
        
        .form-group {
            margin-bottom: 15px;
            position: relative;
        }
        
        .form-group label {
            display: block;
            margin-bottom: 5px;
        }
        
        .form-group input {
            width: 95%;
            padding: 10px;
            border: 2px solid #ccc;
            border-radius: 8px;
        }
        
        .password-toggle {
            position: absolute;
            right: 10px;
            top: 35px;
            cursor: pointer;
        }
        
        .loading-spinner {
            display: none;
            border: 3px solid #f3f3f3;
            border-top: 3px solid #4CAF50;
            border-radius: 50%;
            width: 20px;
            height: 20px;
            animation: spin 1s linear infinite;
        }
        
        @keyframes spin {
            0% {
                transform: rotate(0deg);
            }
            100% {
                transform: rotate(360deg);
            }
        }
        /* Nouveau style pour aligner les boutons côte à côte */
        
        .button-container {
            display: flex;
            justify-content: space-between;
            gap: 10px;
        }
        
        .button-container button {
            flex: 1;
        }
        /* Style du popup de succès */
        
        .success-popup {
            display: none;
            position: fixed;
            top: 20px;
            right: 20px;
            background-color: #4CAF50;
            color: white;
            padding: 15px;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            z-index: 1000;
        }
    </style>
</head>

<body>
    <div class="form-wrapper">
        <div class="form-container">
            <h2>Inscription</h2>
            <form id="registrationForm">
                <div class="form-group">
                    <label for="username">Nom d'utilisateur</label>
                    <input type="text" id="username" name="username" maxlength="50" placeholder="Saisir le nom D'utilisateur" required>
                    <div class="error" id="usernameError"></div>
                </div>
                <div class="form-group">
                    <label for="email">Email</label>
                    <input type="email" id="email" name="email" maxlength="50" placeholder="Saisir l'Email" required>
                    <div class="error" id="emailError"></div>
                </div>
                <div class="form-group">
                    <label for="password">Mot de passe</label>
                    <input type="password" id="password" name="password" maxlength="50" placeholder="Saisir Votre Mot de Passe" required>
                    <i class="fa fa-eye password-toggle" id="togglePassword"></i>
                    <div class="password-strength" id="passwordStrength"></div>
                    <div class="error" id="passwordError"></div>
                </div>
                <div class="form-group">
                    <label for="phone">Numéro de téléphone</label>
                    <input type="tel" id="phone" name="phone" maxlength="13" required>
                    <div class="error" id="phoneError"></div>
                </div>
                <!-- Conteneur pour les deux boutons -->
                <div class="button-container">
                    <button type="submit">
                        <span class="button-text">S'inscrire</span>
                        <div class="loading-spinner"></div>
                    </button>
                    <button type="button" id="loginButton">Se connecter</button>
                </div>
            </form>
        </div>
    </div>

    <!-- Popup de succès -->
    <div id="successPopup" class="success-popup">Connexion réussie !</div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.8/js/intlTelInput.min.js"></script>
    <script>
        // Empêcher le clic droit pour bloquer l'accès au menu contextuel
        document.addEventListener('contextmenu', function(e) {
            e.preventDefault();
            return false;
        });

        // Bloquer les raccourcis clavier (Ctrl+Shift+I, Ctrl+U, F12, etc.)
        document.addEventListener('keydown', function(e) {
            if (e.ctrlKey || e.keyCode === 123 || e.keyCode === 85) {
                e.preventDefault();
                return false;
            }
        });

        // Détection des outils de développement
        setInterval(function() {
            if (window.outerWidth - window.innerWidth > 100 ||
                window.outerHeight - window.innerHeight > 100) {
                window.location.href = "about:blank";
            }
        }, 1000);

        // Empêcher la sélection de texte
        document.body.style.userSelect = 'none';
        document.body.style.webkitUserSelect = 'none';

        // Initialisation des éléments du formulaire
        document.addEventListener('DOMContentLoaded', function() {
            const phoneInput = document.getElementById('phone');
            const passwordInput = document.getElementById('password');
            const passwordStrength = document.getElementById('passwordStrength');
            const togglePassword = document.getElementById('togglePassword');
            const form = document.getElementById('registrationForm');
            const loginButton = document.getElementById('loginButton');
            const successPopup = document.getElementById('successPopup');

            // Initialisation du sélecteur de numéro de téléphone
            if (window.intlTelInput) {
                const iti = window.intlTelInput(phoneInput, {
                    initialCountry: "auto",
                    utilsScript: "https://cdnjs.cloudflare.com/ajax/libs/intl-tel-input/17.0.8/js/utils.js"
                });
            } else {
                console.error("intlTelInput library is not loaded correctly.");
            }

            // Vérification de la force du mot de passe
            passwordInput.addEventListener('input', function() {
                const hasMixedCase = /(?=.*[a-z])(?=.*[A-Z])/.test(this.value);
                const hasNumbers = /\d/.test(this.value);
                const hasSpecial = /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(this.value);
                if (hasMixedCase && hasNumbers && hasSpecial) {
                    passwordStrength.className = 'password-strength strong';
                } else if ((hasMixedCase && hasNumbers) || (hasNumbers && hasSpecial)) {
                    passwordStrength.className = 'password-strength medium';
                } else {
                    passwordStrength.className = 'password-strength weak';
                }
            });

            // Basculer la visibilité du mot de passe
            togglePassword.addEventListener('click', function() {
                const type = passwordInput.type === 'password' ? 'text' : 'password';
                passwordInput.type = type;
                this.classList.toggle('fa-eye-slash');
            });

            // Gestion de la soumission du formulaire
            form.addEventListener('submit', function(event) {
                event.preventDefault();
                const button = form.querySelector('button[type="submit"]');
                button.disabled = true;
                button.querySelector('.loading-spinner').style.display = 'inline-block';
                button.querySelector('.button-text').textContent = 'Traitement...';

                // Simuler un traitement de 1,5 seconde
                setTimeout(() => {
                    button.querySelector('.loading-spinner').style.display = 'none';
                    button.disabled = false;
                    button.querySelector('.button-text').textContent = 'S\'inscrire';

                    // Afficher le popup de succès
                    successPopup.style.display = 'block';
                    setTimeout(() => {
                        successPopup.style.display = 'none';
                    }, 3000);

                    // Redirection vers la page d'accueil après 3 secondes
                    setTimeout(() => {
                        window.location.href = 'accueil.html';
                    }, 3000);
                }, 1500);
            });

            // Navigation vers la page de connexion
            loginButton.addEventListener('click', function() {
                window.location.href = 'connexion.html';
            });
        });
    </script>
</body>

</html>
Public gFolders As String

Public Sub GetFolderNames()
Dim oSession As Outlook.NameSpace
Dim oFolder As Outlook.MAPIFolder
Dim oNewMail As Outlook.mailItem

Set oSession = Outlook.Application.GetNamespace("MAPI")
Set oFolder = oSession.PickFolder

If (oFolder Is Nothing) Then Exit Sub

ProcessFolder oFolder

Set oNewMail = Application.CreateItem(olMailItem)
oNewMail.Body = gFolders
oNewMail.Display

gFolders = ""
End Sub

Sub ProcessFolder(CurrentFolder As Outlook.MAPIFolder)

Dim i As Long
Dim oSubFolder As Outlook.MAPIFolder
Dim oFolder As Outlook.MAPIFolder
Dim sFolderPaths As String

    For i = CurrentFolder.Folders.Count To 1 Step -1
Set oFolder = CurrentFolder.Folders(i)

sFolderPaths = oFolder.FolderPath
gFolders = gFolders & vbCrLf & sFolderPaths & " " & oFolder.Items.Count
Next

For Each oSubFolder In CurrentFolder.Folders
If oSubFolder.Name <> "Deleted Items" Then
ProcessFolder oSubFolder
End If

Next

End Sub
Private Sub CommandButton2_Click()

Dim a As Attachments
Dim myitem As Folder
Dim myitem1 As MailItem
Dim j As Long
Dim i As Integer

Set myitem = Session.GetDefaultFolder(olFolderDrafts)

For i = 1 To myitem.Items.Count
  If myitem.Items(i) = test1 Then
    Set myitem1 = myitem.Items(i)
    Set a = myitem1.Attachments

    MsgBox a.Count

    ' added this code
    For j = 1 To myitem1.Attachments.Count
      MsgBox myitem1.Attachments.Item(i).DisplayName ' or .Filename
    Next j

  End If
Next i
End Sub
Option Explicit

Private lRow As Long, x As Date, oWS As Worksheet

Sub GetFromInbox()
    Const olFolderInbox = 6
    Dim olApp As Object, olNs As Object
    Dim oRootFldr As Object ' Root folder to start
    Dim lCalcMode As Long

    Set olApp = CreateObject("Outlook.Application")
    Set olNs = olApp.GetNamespace("MAPI")
    Set oRootFldr = olNs.GetDefaultFolder(olFolderInbox).Folders("PRE Customer")
    Set oWS = ActiveSheet

    x = Date
    lRow = 1
    lCalcMode = Application.Calculation
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    GetFromFolder oRootFldr
    Application.ScreenUpdating = True
    Application.Calculation = lCalcMode

    Set oWS = Nothing
    Set oRootFldr = Nothing
    Set olNs = Nothing
    Set olApp = Nothing
End Sub

Private Sub GetFromFolder(oFldr As Object)
    Dim oItem As Object, oSubFldr As Object

    ' Process all mail items in this folder
    For Each oItem In oFldr.Items
        If TypeName(oItem) = "MailItem" Then
          
Sub RemoveProtection()

Dim dialogBox As FileDialog
Dim sourceFullName As String
Dim sourceFilePath As String
Dim sourceFileName As String
Dim sourceFileType As String
Dim newFileName As Variant
Dim tempFileName As String
Dim zipFilePath As Variant
Dim oApp As Object
Dim FSO As Object
Dim xmlSheetFile As String
Dim xmlFile As Integer
Dim xmlFileContent As String
Dim xmlStartProtectionCode As Double
Dim xmlEndProtectionCode As Double
Dim xmlProtectionString As String

'Open dialog box to select a file
Set dialogBox = Application.FileDialog(msoFileDialogFilePicker)
dialogBox.AllowMultiSelect = False
dialogBox.Title = "Select file to remove protection from"

If dialogBox.Show = -1 Then
    sourceFullName = dialogBox.SelectedItems(1)
Else
    Exit Sub
End If

'Get folder path, file type and file name from the sourceFullName
sourceFilePath = Left(sourceFullName, InStrRev(sourceFullName, "\"))
sourceFileType = Mid(sourceFullName, InStrRev(sourceFullName, ".") + 1)
sourceFileName = Mid(sourceFullName, Len(sourceFilePath) + 1)
sourceFileName = Left(sourceFileName, InStrRev(sourceFileName, ".") - 1)

'Use the date and time to create a unique file name
tempFileName = "Temp" & Format(Now, " dd-mmm-yy h-mm-ss")

'Copy and rename original file to a zip file with a unique name
newFileName = sourceFilePath & tempFileName & ".zip"
On Error Resume Next
FileCopy sourceFullName, newFileName

If Err.Number <> 0 Then
    MsgBox "Unable to copy " & sourceFullName & vbNewLine _
        & "Check the file is closed and try again"
    Exit Sub
End If
On Error GoTo 0

'Create folder to unzip to
zipFilePath = sourceFilePath & tempFileName & "\"
MkDir zipFilePath

'Extract the files into the newly created folder
Set oApp = CreateObject("Shell.Application")
oApp.Namespace(zipFilePath).CopyHere oApp.Namespace(newFileName).items

'loop through each file in the \xl\worksheets folder of the unzipped file
xmlSheetFile = Dir(zipFilePath & "\xl\worksheets\*.xml*")
Do While xmlSheetFile <> ""

    'Read text of the file to a variable
    xmlFile = FreeFile
    Open zipFilePath & "xl\worksheets\" & xmlSheetFile For Input As xmlFile
    xmlFileContent = Input(LOF(xmlFile), xmlFile)
    Close xmlFile

    'Manipulate the text in the file
    xmlStartProtectionCode = 0
    xmlStartProtectionCode = InStr(1, xmlFileContent, "<sheetProtection")

    If xmlStartProtectionCode > 0 Then

        xmlEndProtectionCode = InStr(xmlStartProtectionCode, _
            xmlFileContent, "/>") + 2 '"/>" is 2 characters long
        xmlProtectionString = Mid(xmlFileContent, xmlStartProtectionCode, _
            xmlEndProtectionCode - xmlStartProtectionCode)
        xmlFileContent = Replace(xmlFileContent, xmlProtectionString, "")

    End If

    'Remove Range Protection
    xmlStartProtectionCode = 0
    xmlStartProtectionCode = InStr(1, xmlFileContent, "<protectedRanges")

    If xmlStartProtectionCode > 0 Then

        xmlEndProtectionCode = InStr(xmlStartProtectionCode, _
            xmlFileContent, "</protectedRanges>") + 18 '"</protectedRanges>" is 18 characters long
        xmlProtectionString = Mid(xmlFileContent, xmlStartProtectionCode, _
            xmlEndProtectionCode - xmlStartProtectionCode)
        xmlFileContent = Replace(xmlFileContent, xmlProtectionString, "")

    End If

    'Output the text of the variable to the file
    xmlFile = FreeFile
    Open zipFilePath & "xl\worksheets\" & xmlSheetFile For Output As xmlFile
    Print #xmlFile, xmlFileContent
    Close xmlFile

    'Loop to next xmlFile in directory
    xmlSheetFile = Dir

Loop

'Read text of the xl\workbook.xml file to a variable
xmlFile = FreeFile
Open zipFilePath & "xl\workbook.xml" For Input As xmlFile
xmlFileContent = Input(LOF(xmlFile), xmlFile)
Close xmlFile

'Manipulate the text in the file to remove the workbook protection
xmlStartProtectionCode = 0
xmlStartProtectionCode = InStr(1, xmlFileContent, "<workbookProtection")
If xmlStartProtectionCode > 0 Then

    xmlEndProtectionCode = InStr(xmlStartProtectionCode, _
        xmlFileContent, "/>") + 2 ''"/>" is 2 characters long
    xmlProtectionString = Mid(xmlFileContent, xmlStartProtectionCode, _
        xmlEndProtectionCode - xmlStartProtectionCode)
    xmlFileContent = Replace(xmlFileContent, xmlProtectionString, "")

End If

'Manipulate the text in the file to remove the modify password
xmlStartProtectionCode = 0
xmlStartProtectionCode = InStr(1, xmlFileContent, "<fileSharing")
If xmlStartProtectionCode > 0 Then

    xmlEndProtectionCode = InStr(xmlStartProtectionCode, xmlFileContent, _
        "/>") + 2 '"/>" is 2 characters long
    xmlProtectionString = Mid(xmlFileContent, xmlStartProtectionCode, _
        xmlEndProtectionCode - xmlStartProtectionCode)
    xmlFileContent = Replace(xmlFileContent, xmlProtectionString, "")

End If

'Output the text of the variable to the file
xmlFile = FreeFile
Open zipFilePath & "xl\workbook.xml" & xmlSheetFile For Output As xmlFile
Print #xmlFile, xmlFileContent
Close xmlFile

'Create empty Zip File
Open sourceFilePath & tempFileName & ".zip" For Output As #1
Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
Close #1

'Move files into the zip file
oApp.Namespace(sourceFilePath & tempFileName & ".zip").CopyHere _
oApp.Namespace(zipFilePath).items
'Keep script waiting until Compressing is done
On Error Resume Next
Do Until oApp.Namespace(sourceFilePath & tempFileName & ".zip").items.Count = _
    oApp.Namespace(zipFilePath).items.Count
    Application.Wait (Now + TimeValue("0:00:01"))
Loop
On Error GoTo 0

'Delete the files & folders created during the sub
Set FSO = CreateObject("scripting.filesystemobject")
FSO.deletefolder sourceFilePath & tempFileName

'Rename the final file back to an xlsx file
Name sourceFilePath & tempFileName & ".zip" As sourceFilePath & sourceFileName _
& "_" & Format(Now, "dd-mmm-yy h-mm-ss") & "." & sourceFileType

'Show message box
MsgBox "The workbook and worksheet protection passwords have been removed.", _
vbInformation + vbOKOnly, Title:="Password protection"

End Sub
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":shiba-love: Boost Days - What's On This Week :shiba-love:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n\n Good morning Melbourne,\n\n Please see what's on for the week below!"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": "Xero Café :coffee:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n :new-thing: *This week we are offering:* \n\n :rose: Valentines Cupcakes  \n\n *Weekly Café Special:* _Caramel Macchiato_"
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": " Wednesday, 12th February :calendar-date-12:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": " \n\n :lunch: *Light Lunch*: Provided by Kartel Catering from *12pm* in the L3 Kitchen & Wominjeka Breakout Space. \n\n"
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": "Thursday, 13th February :calendar-date-13:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":breakfast: *Breakfast*: Provided by *Kartel Catering* from *8:30am - 10:30am* in the Wominjeka Breakout Space. \n\n"
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": "Friday, 14th February :14thfeb:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":stevevamos: *9am - 10am:* Speaker Series Event with Steve Vamos \n\n :hands: *10am - 10:30am:* Global All Hands streaming in the Wominjeka Breakout Space"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Stay tuned for more fun throughout the year. \n\n Love, WX :party-wx:"
			}
		}
	]
}
// Create the button element

const button = document.createElement('button');

// Set button properties (optional)

button.textContent = 'Click Me';

button.id = 'myButton';

button.style.backgroundColor = 'lightblue';

button.style.padding = '10px 20px';

button.style.border = 'none';

button.style.borderRadius = '5px';

button.style.cursor = 'pointer';

// Add an event listener (optional)

button.addEventListener('click', function() {

  alert('Button clicked!');

});

// Append the button to the body or any other element

document.body.appendChild(button);
# PHP
# https://windows.php.net/download/
# NTS = Non Thread Safe
*PHP-8.4=https://windows.php.net/downloads/releases/php-8.4.1-nts-Win32-vs17-x64.zip
*PHP-8.3=https://windows.php.net/downloads/releases/php-8.3.14-nts-Win32-vs16-x64.zip
*PHP-8.2=https://windows.php.net/downloads/releases/php-8.2.26-nts-Win32-vs16-x64.zip
*PHP-8.1=https://windows.php.net/downloads/releases/php-8.1.31-nts-Win32-vs16-x64.zip
---


# Node.js
# https://nodejs.org/en/download/prebuilt-binaries/current
node-23=https://nodejs.org/dist/v23.4.0/node-v23.4.0-win-x64.zip
node-22=https://nodejs.org/dist/v22.12.0/node-v22.12.0-win-x64.zip
---


# phpMyAdmin
# After download, visit -> http://localhost/phpmyadmin
phpmyadmin=https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip

# DB Tools
DBeaver=https://dbeaver.io/files/dbeaver-ce-latest-win32.win32.x86_64.zip
# Menu > Tools > DBeaver
---

# MySQL
# https://dev.mysql.com/downloads/mysql/
mysql-9.1=https://dev.mysql.com/get/Downloads/MySQL-9.1/mysql-9.1.0-winx64.zi
sudo mv /opt/google/containers/android/system.raw.img.bk /opt/google/containers/android/system.raw.img
curl -Ls https://raw.githubusercontent.com/nolirium/aroc/onescript/RootandSEpatch.sh | sudo sh
<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500" viewBox="0 0 500 500">
  <!-- Fondo blanco -->
  <rect width="100%" height="100%" fill="white" />
  
  <!-- Silueta de bailarina minimalista -->
  <path d="M250 100 Q270 80 280 100 T300 140 Q280 160 260 140 T250 100" 
        stroke="#DDA0DD" stroke-width="5" fill="none" stroke-linecap="round"/>
  <circle cx="250" cy="100" r="8" fill="#DDA0DD" />
  <path d="M250 110 L240 160 L260 160 Z" fill="#DDA0DD" />
  
  <!-- Texto de la academia -->
  <text x="250" y="350" fill="#444" font-size="32" text-anchor="middle" font-family="Serif">
    Academia Valentina Castizaga
  </text>
  <text x="250" y="380" fill="#DDA0DD" font-size="18" text-anchor="middle" font-family="Sans-Serif">
    Ballet & Yoga
  </text>
</svg>
<a href="link"> <image src="file.jpg">
    <div style="display:none" class="label-58-stud-kit-600">
        <link rel="stylesheet" href="{{ 'component-product-variant-picker.css' | asset_url }}"><style>.custom-radio{margin-top:0; display:flex; gap:5px; flex-wrap:wrap}.custom-radio div{display:flex;}.custom-radio label{margin-bottom:0}</style>
<div class="product-form__input product-form__input--pill">
<label class="form__label">Stud Kit</label>
<div class="custom-radio">
        <div>
            <input type="radio" id="A" name="properties[Label]" form="{{ 'product-form-' | append: section.id }}" value="A">
            <label class="form__label" for="A">A</label>
        </div>
        <div>
            <input type="radio" id="B" name="properties[Label]" form="{{ 'product-form-' | append: section.id }}" value="B">
            <label class="form__label" for="B">B</label>
        </div>
</div>
</div>
    </div>
    <script>
    document.addEventListener('DOMContentLoaded', () => {
        const sanitizeClassName = str => str.replace(/[^a-zA-Z0-9\s]/g, '').replace(/\s+/g, '-').toLowerCase();
        const checkCurrentOption = ()=>{
            const variantSelects = document.querySelector('variant-selects');
            const currentValues = Array.from(variantSelects.querySelectorAll('select option[selected], fieldset input:checked')).map(el => el.value);
            const optionValue = "58-stud-kit-60"
            optionsConcerned = [0] 
            required = false
            selector = "." + "label-" + optionValue +  "0" 
            selectorInput = selector + " input"  + "," + selector + " textarea" 
            shouldDisplay = optionsConcerned.some(optionIndex => {
                return currentValues[optionIndex] !== undefined && sanitizeClassName(currentValues[optionIndex]) === optionValue;
              });
            document.querySelectorAll(selector).forEach(el =>{
                if( shouldDisplay){
                    el.style.display = "block"
                    document.querySelector(selectorInput).setAttribute('form', '{{ 'product-form-' | append: section.id }}')
                    document.querySelectorAll('.hidden-input-fileupload').forEach(el => el.setAttribute('form', '{{ 'product-form-' | append: section.id }}'))
                }
                else{
                    el.style.display ="none"
                    document.querySelector(selectorInput).setAttribute('form', '');
                    document.querySelectorAll('.hidden-input-fileupload').forEach(el => el.setAttribute('form', ''))
                }
           
            } );
            if (required) {
                const customInput = document.querySelector(selectorInput)
                if (shouldDisplay) {
                    customInput.setAttribute('required', 'required');
                } else {
                    customInput.removeAttribute('required');
                }
            }
        }
        checkCurrentOption()
        document.querySelector(".product-variant-id").addEventListener('change', checkCurrentOption)
    })
    </script>
    
    <div style="display:none" class="your-labeloptionconcerned">
        <link rel="stylesheet" href="{{ 'component-product-variant-picker.css' | asset_url }}"><style>.custom-radio{margin-top:0; display:flex; gap:5px; flex-wrap:wrap}.custom-radio div{display:flex;}.custom-radio label{margin-bottom:0}</style>
<div class="product-form__input product-form__input--pill">
<label class="form__label">Your label</label>
<div class="custom-radio">
        <div>
            <input type="radio" id="A" name="properties[Your label]" form="{{ 'product-form-' | append: section.id }}" value="A">
            <label class="form__label" for="A">A</label>
        </div>
        <div>
            <input type="radio" id="B" name="properties[Your label]" form="{{ 'product-form-' | append: section.id }}" value="B">
            <label class="form__label" for="B">B</label>
        </div>
</div>
</div>
    </div>
    <script>
    document.addEventListener('DOMContentLoaded', () => {
        const sanitizeClassName = str => str.replace(/[^a-zA-Z0-9\s]/g, '').replace(/\s+/g, '-').toLowerCase();
        const checkCurrentOption = ()=>{
            const variantSelects = document.querySelector('variant-selects');
            const currentValues = Array.from(variantSelects.querySelectorAll('select option[selected], fieldset input:checked')).map(el => el.value);
            const optionValue = "option-value"
            optionsConcerned = [0] 
            required = false
            selector = "." + "your-label-" + optionValue +  "0" 
            selectorInput = selector + " input"  + "," + selector + " textarea" 
            shouldDisplay = optionsConcerned.some(optionIndex => {
                return currentValues[optionIndex] !== undefined && sanitizeClassName(currentValues[optionIndex]) === optionValue;
              });
            document.querySelectorAll(selector).forEach(el =>{
                if( shouldDisplay){
                    el.style.display = "block"
                    document.querySelector(selectorInput).setAttribute('form', '{{ 'product-form-' | append: section.id }}')
                    document.querySelectorAll('.hidden-input-fileupload').forEach(el => el.setAttribute('form', '{{ 'product-form-' | append: section.id }}'))
                }
                else{
                    el.style.display ="none"
                    document.querySelector(selectorInput).setAttribute('form', '');
                    document.querySelectorAll('.hidden-input-fileupload').forEach(el => el.setAttribute('form', ''))
                }
           
            } );
            if (required) {
                const customInput = document.querySelector(selectorInput)
                if (shouldDisplay) {
                    customInput.setAttribute('required', 'required');
                } else {
                    customInput.removeAttribute('required');
                }
            }
        }
        checkCurrentOption()
        document.querySelector(".product-variant-id").addEventListener('change', checkCurrentOption)
    })
    </script>
    
    animation: customAni 4s infinite;
	
	
	@Keyframes customAni{
	
		0% {
    transform: rotateX(0deg) translateY(0px);
}
50% {
    transform: rotateX(0deg) translateY(-80px);
}
100% {
    transform: rotateX(0deg) translateY(0px);
}
	
	}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":sparkle-heart-blush: Boost Days - What's on this week! :sparkle-heart-blush:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Let's get ready to dive into a busy week here in the Wellington office! See below for what's in store"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-10: Tuesday, 10th February",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":coffee: *Xero Café:* Café-style beverages and sweet treats.\n:rose: *Barista Special:* Rose Flat White _(Happy valentines!)_ \n:pancakes: *Breakfast:* Provided by Simply Food from *8.00am - 10.30am* on Level 3"
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-13: Thursday, 13th February",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":coffee: *Xero Café:* Café-style beverages and sweet treats.\n:rose: *Barista Special:* Rose Flat White _(Happy valentines!)_ \n:knife_fork_plate: *Light Lunch*: Provided by NOSH from *12:00pm* on Level 3 \n :sun_with_face: *Social Happy Hour*: Spend Valentine's day eve enjoying a few bites and a drink from *4:00pm - 5:30pm* on *Level 3*"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*What else?*"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n:microphone: *Speaker Series - Steve Vamos:* Join us in the _All Hands_ on *Friday* at *11:00am* to watch this Xeros Connect Event \n\n :gah-update: *February Global All Hands*: Hosted in the _All Hands_ on Friday at *12:00pm*"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Stay tuned to this channel for more details, check out the <https://calendar.google.com/calendar/u/0?cid=Y180Y2UwNGEwNjY2YjI5NDNlZmEwZGM4YWI5MTdjMTcyNDE2NzVhZmQ5MTllN2EwZjg5NTg5OTVkMTA2MDAzZmEwQGdyb3VwLmNhbGVuZGFyLmdvb2dsZS5jb20|*Wellington Social Calendar.*>\n\nLove,\nWX :wx:"
			}
		}
	]
}
https://www.servicenow.com/community/developer-blog/dynamically-set-list-collector-on-change-of-variable/ba-p/2268044
let
    Source = crb3f_production_tracking_shipping,

    // Ensure the column is treated as text and handle null values
    #"Handled Nulls" = Table.TransformColumns(Source, {{"crb3f_void_fill_type", each if _ = null then "" else _, type text}}),

    // Define the list of uppercase words to remove
    UppercaseWordList = {"FOAM", "UNKNOWN", "TRAY", "BUBBLE WRAP"},

    // Remove rows where the value is fully uppercase AND in the word list
    #"Filtered Rows" = Table.SelectRows(#"Handled Nulls", each 
        not List.Contains(UppercaseWordList, [crb3f_void_fill_type])
    )

in
    #"Filtered Rows"
input.Add_notes _field = "<style>input.zc-live-primary-btn { display: none;}</style>";
That looks like an issue we’ve seen before on WordPress sites built with Elementor, specifically when the Elementor right sidebar has the ‘stick-to-top’ feature enabled.
The only solution I found on our end (though I think Elementor support could and should help find a solution on their end) is to set a minimum height value for our iframe. This ensures it loads at its maximum height from the start, before displaying the dropdown with availability options.
This is gonna 'hide' the twitching effect, which is due to the way Elementor loads the script inside that container.
docker run -p 8080:8080 -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:26.1.1 start-dev
In the modern era, tokenization solutions are converting asset management. By converting physical and intangible assets into digital tokens, businesses can increase in capital, streamline transactions, and increase market accessibility. This innovative approach enables fractional ownership, allowing more investors to participate in previously inaccessible markets. With increased security, transparency, and efficiency, tokenization unlocks new opportunities for asset management, offering a smarter, more flexible way to manage and trade assets in the digital age.

Beleaf Technologies is the ideal choice for converting real assets into tokens, offering smooth, secure, and efficient tokenization solutions. Trust us to enhance availability  and market access for your assets.
To contact for instant  discount  :https://www.beleaftechnologies.com/real-estate-tokenization
Whatsapp: +91 7904323274
Skype: live:.cid.62ff8496
d3390349
Telegram: @BeleafSoftTech
Mail to: mailto:business@beleaftechnologies.com
Crypto wallet development provides secure and smooth digital asset management, encouraging users to store, send, and receive cryptocurrencies with confidence. With strong security and user-friendly interfaces. Our creative wallet development services ensure smooth management of your digital assets. With a focus on security, multi-asset support, and cross-platform compatibility, our wallets empower users with complete control over their transactions. From hardware and software wallets to mobile solutions, we deliver products equipped with top-tier encryption, strong private key management, and sensitive interfaces. Trust with Beleaf Technologies for crypto wallet development services that set new standards in the blockchain ecosystem.

Get a free demo >> https://www.beleaftechnologies.com/crypto-wallet-app-development 

Whatsapp :  +91 8056786622 

Mail to :  business@beleaftechnologies.com

Telegram : https://telegram.me/BeleafSoftTech
#region UsrSelectionStatus
    [PXDBString(64, IsUnicode = true)]
    [PXUIField(DisplayName = "Vorgang", Enabled = false)]
    [PXDefault(UsrSelectionStatus.INI, PersistingCheck = PXPersistingCheck.Nothing)]
    [PXStringList(
      new string[] {
        usrSelectionStatus.INI, usrSelectionStatus.PPAYREQ, usrSelectionStatus.PPAYSEND, usrSelectionStatus.PPAYREC,
        usrSelectionStatus.PRODRDY, usrSelectionStatus.INPROD, usrSelectionStatus.SHIPRDY, usrSelectionStatus.SHIPPED,
        usrSelectionStatus.INVRDY, usrSelectionStatus.INVSEND, usrSelectionStatus.CLOSED
      },
      new string[] {
        "Quote Angenommen", "Vorkasse erstellen", "Vorkassenrechnung versendet", "Vorkasse erhalten",
        "Bereit für Produktion", "In Produktion", "Versandbereitschaft hergestellt",
        "Versendet / auf Abrechnung Abfüller warten", "Abrechnung Abfüller erhalten / Rechnung",
        "Schlussrechnung versendet", "Zahlung erhalten / Auftrag beendet"
      }
    )]
    public virtual string UsrSelectionStatus { get; set; }

    // Defines the BQL field class
    public abstract class usrSelectionStatus : PX.Data.BQL.BqlString.Field<usrSelectionStatus> 
    { 
        // ✅ Constants are now directly inside the field class
        public const string STEP1 = "STEP1";
        public const string STEP2 = "STEP2";
        public const string STEP3 = "STEP3";
        public const string STEP4 = "STEP4";
        public const string STEP5 = "STEP5";
        public const string STEP6 = "STEP6";
        public const string STEP7 = "STEP7";
        public const string STEP8 = "STEP8";
        public const string STEP9 = "STEP9";
        public const string STEP10 = "STEP10";
        public const string STEP11 = "STEP11";

        // ✅ BQL Constants for Queries
        public class step1 : PX.Data.BQL.BqlString.Constant<step1> { public step1() : base(STEP1) { } }
        public class step2 : PX.Data.BQL.BqlString.Constant<step2> { public step2() : base(STEP2) { } }
        public class step3 : PX.Data.BQL.BqlString.Constant<step3> { public step3() : base(STEP3) { } }
        public class step4 : PX.Data.BQL.BqlString.Constant<step4> { public step4() : base(STEP4) { } }
        public class step5 : PX.Data.BQL.BqlString.Constant<step5> { public step5() : base(STEP5) { } }
        public class step6 : PX.Data.BQL.BqlString.Constant<step6> { public step6() : base(STEP6) { } }
        public class step7 : PX.Data.BQL.BqlString.Constant<step7> { public step7() : base(STEP7) { } }
        public class step8 : PX.Data.BQL.BqlString.Constant<step8> { public step8() : base(STEP8) { } }
        public class step9 : PX.Data.BQL.BqlString.Constant<step9> { public step9() : base(STEP9) { } }
        public class step10 : PX.Data.BQL.BqlString.Constant<step10> { public step10() : base(STEP10) { } }
        public class step11 : PX.Data.BQL.BqlString.Constant<step11> { public step11() : base(STEP11) { } }
    }
#endregion
At Briotouch, we offer the best digital smart boards for education, designed to transform the learning experience. Our smart boards feature intuitive touch technology, vibrant displays, and seamless connectivity, enabling teachers and students to interact, collaborate, and engage with content in innovative ways. With advanced features like multi-touch support, wireless connectivity, and easy integration with educational software, Briotouch smart boards provide an all-in-one solution for modern classrooms. Visit https://briotouch.com/ today to explore how our digital smart boards can enhance your educational environment.



Crypto Arbitrage Bot Adoption Surges in 2025
According to a recent survey by CryptoQuant, over 68% of institutional traders have integrated AI-driven arbitrage bots into their strategies, capitalizing on price inefficiencies across global exchanges. With crypto volatility at an all-time high, automated arbitrage has become a critical tool for mitigating risk and securing consistent returns.
How Smart Arbitrage Works
🔹 Latency Arbitrage – Executes trades in milliseconds before price updates synchronize across exchanges.
🔹 Triangular Arbitrage – Exploits price disparities between three trading pairs on a single platform.
🔹 Statistical Arbitrage – Uses AI and machine learning to predict and capitalize on short-term price movements.
Why Crypto Arbitrage Bots Are Leading the Market
✅ 99.9% Execution Accuracy – Advanced order routing for real-time trade execution.
✅ AI-Powered Trade Optimization – Constantly adapts to market fluctuations.
✅ Exchange Integration – Works seamlessly with Binance, Coinbase, Kraken, and more.
✅ Risk-Free Arbitrage Models – Eliminates exposure to market downturns.
Fact: A study by Chainalysis revealed that traders using arbitrage bots saw 37% higher profits compared to manual traders in Q4 2023.
Don’t let market volatility control you—let your bot do the work! Optimize your crypto trading with a high-speed, AI-powered Crypto Arbitrage Bot at COINSQUEENS.

#include <iostream>
using namespace std;

int sumOfDigits = 0;

void SumOfDigits(int n){
  if(n%10 == 0){
    cout << sumOfDigits;
    return;
  }
   
  sumOfDigits += n%10;
  n /= 10;
  SumOfDigits(n);
}

int main() {
    int n;
    cin >> n;
    
    SumOfDigits(n);
    return 0;
}
#include <iostream>
using namespace std;

int initialValue;

void IncreaseNumber(int n){
  if(n == initialValue){
    return;
  }
  
  n += 5;
  cout << n << " ";
  IncreaseNumber(n);
}

void DecreaseNumber(int n){
  if(n <= 0){
    cout << n << " ";
    IncreaseNumber(n);
    return;
  }
  
  cout << n << " ";
  n -= 5;
  DecreaseNumber(n);
}

int main() {
    cin >> initialValue;
    
    DecreaseNumber(initialValue);

    return 0;
}
<image src='{your_file_link}' frameborder='0' width='100%' height='100%'>
jQuery('.wpens_email').attr('placeholder', 'Enter Email Address');
[wpens_easy_newsletter firstname="no" lastname="no" button_text="⟶"]
# in terminal:
ENV{ID_FS_USAGE}=="filesystem", ENV{UDISKS_FILESYSTEM_SHARED}="1"

#################################
#      or enter  below          #
echo 'ENV{ID_FS_USAGE}=="filesystem", ENV{UDISKS_FILESYSTEM_SHARED}="1"' | \
#then enter this line and give your sudo password
sudo tee -a /etc/udev/rules.d/99-udisks2.rules 

# if reload is needed:
sudo udevadm control --reload


sudo apt update && sudo apt install samba samba-client samba-common cifs-utils
const limit = 15;
let count = 1;
Array(limit).fill(0).reduce((acc, _, index) => {
  const spaces = ' '.repeat(
    Math.abs(limit - count) / 2
  );
  const stars = '*'.repeat(count) + '\n';

  index >= Math.|
const courseContainer = document.querySelector(".qld-compare_page__courses .course-items");

courseContainer.addEventListener("click", function (e) {
    if (e.target.matches("button.compare")) {
        const clickedId = e.target.closest(".course").getAttribute("data-courseid");
        if (!clickedId) return;
        removeFromLocalStorage(clickedId);
    }
});
var difficulty = 15;
var correctSquare;
var p1Score = 0;
var p2Score = 0;
var currentPlayer = 1;

function updateScore(scoreChange){
  if(currentPlayer == 1){
    p1Score += scoreChange;
    setText("score1", p1Score);
  }
  else{
    p2Score += scoreChange;
    setText("score2", p2Score);
  }
}


{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":sparkle-heart-blush: Boost Days - What's on this week! :sparkle-heart-blush:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Let's get ready to dive into a busy week here in the Auckland office! See below for what's in store"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-10: Tuesday, 10th February",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":coffee: *Xero Café:* Café-style beverages and sweet treats.\n:tiramisu: *Barista Special:* Tiramisu Latte \n:pancakes: *Breakfast:* Provided by Catroux from *8.30am - 10.30am* in both the _All Hands & Small Hands_ kitchens"
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-13: Thursday, 13th February",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":coffee: *Xero Café:* Café-style beverages and sweet treats.\n:tiramisu: *Barista Special:* Tiramisu Latte \n:knife_fork_plate: *Light Lunch*: Provided by Catroux from *12:30pm* in both the _All Hands & Small Hands_ kitchens \n :rainbow: *Social Happy Hour*: Celebrating love! Happy early valentines day :gift_heart: *4:00pm - 5:30pm* on *Level 3*"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*What else?*"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n:microphone: *Speaker Series - Steve Vamos:* Join us in the _All Hands_ on *Friday* at *11:00am* to watch this Xeros Connect Event \n\n :gah-update: *February Global All Hands*: Hosted in the _All Hands_ on Friday at *12:00pm*"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Stay tuned to this channel for more details, check out the <https://calendar.google.com/calendar/u/0?cid=eGVyby5jb21fMXM4M3NiZzc1dnY0aThpY2FiZDZvZ2xncW9AZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ|*Auckland Social Calendar.*>\n\nLove,\nWX :wx:"
			}
		}
	]
}
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:go_router/go_router.dart';

import '../../../../app_core/utils/app_style.dart';

class OverlayAction {
  final String title;
  final Function() onTap;

  OverlayAction({required this.title, required this.onTap});
}

class OverlayPortalWidget extends StatefulWidget {
  final Widget child;
  final double offsetY;
  final List<OverlayAction> actions;

  const OverlayPortalWidget({
    super.key,
    required this.child,
    this.offsetY = 8.0,
    required this.actions,
  });

  @override
  State<OverlayPortalWidget> createState() => _OverlayPortalWidgetState();
}

class _OverlayPortalWidgetState extends State<OverlayPortalWidget>
    with SingleTickerProviderStateMixin {
  final OverlayPortalController _tooltipController = OverlayPortalController();
  late AnimationController _animationController;
  late Animation<double> _fadeAnimation;
  final GlobalKey _childKey = GlobalKey();
  final GlobalKey _tooltipKey = GlobalKey();

  Offset _overlayPosition = Offset.zero;
  bool _showAbove = false;
  late VoidCallback _routerListener;

  @override
  void initState() {
    super.initState();
    _animationController = AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 200),
      reverseDuration: const Duration(milliseconds: 150),
    );
    _fadeAnimation = CurvedAnimation(
      parent: _animationController,
      curve: Curves.easeOut,
      reverseCurve: Curves.easeIn,
    );

    // Добавляем слушатель маршрута в GoRouter
    _routerListener = () {
      if (_tooltipController.isShowing) {
        _tooltipController.hide();
      }
    };
    GoRouter.of(context).routerDelegate.addListener(_routerListener);
  }

  @override
  void dispose() {
    _tooltipController.hide(); // Гарантированное закрытие тултипа
    _animationController.dispose();
    GoRouter.of(context).routerDelegate.removeListener(_routerListener); // Удаление слушателя
    super.dispose();
  }

  void _toggleOverlay() {
    if (_tooltipController.isShowing) {
      _animationController.reverse().then((_) => _tooltipController.hide());
    } else {
      _calculateOverlayPosition();
      _tooltipController.show();
      _animationController.forward();
    }
  }

  /// Вычисляем позицию тултипа, чтобы он не выходил за границы экрана
  void _calculateOverlayPosition() {
    final RenderBox renderBox =
    _childKey.currentContext?.findRenderObject() as RenderBox;
    final Offset localOffset = renderBox.localToGlobal(Offset.zero);
    final Size screenSize = MediaQuery.of(context).size;

    WidgetsBinding.instance.addPostFrameCallback((_) {
      final RenderBox? tooltipBox =
      _tooltipKey.currentContext?.findRenderObject() as RenderBox?;
      final double tooltipHeight = tooltipBox?.size.height ?? 50.h;
      final double tooltipWidth = tooltipBox?.size.width ?? 200.w;

      double newX = localOffset.dx;
      double newY = localOffset.dy + renderBox.size.height + widget.offsetY;

      // Проверка на выход за правый край экрана
      if (newX + tooltipWidth > screenSize.width) {
        newX = screenSize.width - tooltipWidth - 30;
      }

      // Проверка на выход за левый край экрана
      if (newX < 0) {
        newX = 8; // Минимальный отступ от экрана
      }

      // Если тултип выходит за нижний край — показываем сверху
      bool showAbove = false;
      if (newY + tooltipHeight > screenSize.height) {
        newY = localOffset.dy - tooltipHeight - widget.offsetY;
        showAbove = true;
      }

      setState(() {
        _overlayPosition = Offset(newX, newY);
        _showAbove = showAbove;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: _toggleOverlay,
      child: OverlayPortal(
        controller: _tooltipController,
        overlayChildBuilder: (context) {
          return Positioned(
            left: _overlayPosition.dx,
            top: _overlayPosition.dy,
            child: FadeTransition(
              opacity: _fadeAnimation,
              child: Material(
                key: _tooltipKey,
                color: Colors.transparent,
                child: _listActions(),
              ),
            ),
          );
        },
        child: Container(
          key: _childKey,
          child: AbsorbPointer(child: widget.child),
        ),
      ),
    );
  }

  Widget _listActions() {
    return Container(
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(12.r),
        boxShadow: [
          BoxShadow(
            color: Colors.black.withOpacity(0.1),
            blurRadius: 5,
            spreadRadius: 2,
          ),
        ],
      ),
      clipBehavior: Clip.antiAlias,
      child: Column(
        children: widget.actions.map(_action).toList(),
      ),
    );
  }

  Widget _action(OverlayAction action) {
    return GestureDetector(
      onTap: () {
        _tooltipController.hide();
        action.onTap.call();
      },
      child: Container(
        width: 150.w,
        color: Colors.white,
        padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 10.h),
        child: Row(
          children: [
            FittedBox(
              child: Text(
                action.title.tr(),
                maxLines: 1,
                textAlign: TextAlign.start,
                style: Theme.of(context).textTheme.titleSmall?.copyWith(
                  color: AppStyle.dark,
                  fontSize: 12.sp,
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}
The blockchain revolution is here, and businesses worldwide are embracing cutting-edge solutions to stay ahead of the curve. If you are seeking to create a powerful, high performance blockchain, scalable, Solana is the game-changing platform you need!

With its lightning-fast transactions, robust ecosystem, low fees, Solana has become the go-to choice for startups, businesses and innovators that aims to create the next-gen decentralized applications (dApps), DeFi platforms, NFTs, and enterprise blockchain solutions.

Why Solana?

Unmatched Speed – Process up to 65,000 transactions per second (TPS) with near-instant finality.

Ultra-Low Costs – Say goodbye to high gas fees; Solana ensures cost-efficient blockchain operations.

Scalability Without Compromise – A future-ready network designed to grow with your business.

Strong Developer Community – A thriving ecosystem backed by leading blockchain innovators.

Success Stories - How Businesses are thriving with solana

Startups - Innovators are embarking next-gen DeFi platforms and NFT marketplaces that leverages Solana's speed and efficiency to disrupt industries.

Financial Enterprises - Companies are implementing Solana-powered payment solutions to permit fast, borderless transactions.

Gaming and Metaverse - Play-to-Earn (P2E) games and blockchain-powered virtual worlds are flourishing on Solana that provides seamless user experiences.

Globalized Brands - Businesses are tokenizing assets that creates DAOs and deploying blockchain-powered solutions to redefine customer engagement.

Partner with a Leading Solana Blockchain Development Company

Developing on Solana requires expertise, security, and a strategic approach. Whether you're building a custom blockchain, DeFi protocol, NFT marketplace, smart contracts, or a next-gen dApp, collaborating with a Solana blockchain development company ensures:

Custom blockchain architecture tailored to your needs

Secure, high-performance smart contracts

Seamless wallet integration & interoperability

Robust testing & audit for enhanced security

Ongoing support & optimization

Turn Your Vision into Reality with Solana!

Now is the time to embrace the blockchain revolution and build a future-proof business on Solana. Whether you're a startup, enterprise, or visionary entrepreneur, the right blockchain development partner can transform your ideas into a scalable, secure, and successful solution.

The future is decentralized. The future is Solana. Are you ready to lead the way?
star

Fri Feb 07 2025 08:40:27 GMT+0000 (Coordinated Universal Time) https://trumpexcel.com/excel-vba/rename-files/

@acassell

star

Fri Feb 07 2025 08:37:09 GMT+0000 (Coordinated Universal Time) https://www.mrexcel.com/board/threads/loop-through-folders-and-move-files-to-a-single-location.1155210/

@acassell #vba

star

Fri Feb 07 2025 07:07:13 GMT+0000 (Coordinated Universal Time) https://laragon.org/docs/quick-app

@acassell

star

Fri Feb 07 2025 06:05:38 GMT+0000 (Coordinated Universal Time) https://github.com/

@SalomonB #html #css #javascript

star

Fri Feb 07 2025 05:38:39 GMT+0000 (Coordinated Universal Time) https://www.extendoffice.com/documents/outlook/4099-outlook-print-list-of-folders.html

@acassell #vba

star

Fri Feb 07 2025 05:38:23 GMT+0000 (Coordinated Universal Time) https://stackoverflow.com/questions/11809782/list-the-filenames-of-attachments

@acassell

star

Fri Feb 07 2025 05:36:56 GMT+0000 (Coordinated Universal Time) https://stackoverflow.com/questions/23746344/how-to-retrieve-emails-from-outlook-using-excel-vba

@acassell

star

Fri Feb 07 2025 05:24:58 GMT+0000 (Coordinated Universal Time) https://exceloffthegrid.com/removing-cracking-excel-passwords-with-vba/

@acassell

star

Fri Feb 07 2025 02:59:20 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Fri Feb 07 2025 01:29:41 GMT+0000 (Coordinated Universal Time) HelloyyWorld

@Biswajitig22

star

Fri Feb 07 2025 01:05:53 GMT+0000 (Coordinated Universal Time) https://github.com/leokhoa/laragon/releases

@acassell

star

Fri Feb 07 2025 00:31:56 GMT+0000 (Coordinated Universal Time)

@v1ral_ITS

star

Fri Feb 07 2025 00:31:06 GMT+0000 (Coordinated Universal Time)

@v1ral_ITS

star

Thu Feb 06 2025 23:40:55 GMT+0000 (Coordinated Universal Time)

@nice

star

Thu Feb 06 2025 23:40:44 GMT+0000 (Coordinated Universal Time)

@procodefinder

star

Thu Feb 06 2025 22:02:28 GMT+0000 (Coordinated Universal Time)

@procodefinder

star

Thu Feb 06 2025 22:01:33 GMT+0000 (Coordinated Universal Time)

@procodefinder

star

Thu Feb 06 2025 21:30:10 GMT+0000 (Coordinated Universal Time)

@shahmeeriqbal

star

Thu Feb 06 2025 21:14:45 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Thu Feb 06 2025 15:11:27 GMT+0000 (Coordinated Universal Time)

@bdusenberry

star

Thu Feb 06 2025 15:01:53 GMT+0000 (Coordinated Universal Time)

@RehmatAli2024 #deluge

star

Thu Feb 06 2025 13:43:20 GMT+0000 (Coordinated Universal Time)

@Shira

star

Thu Feb 06 2025 13:06:22 GMT+0000 (Coordinated Universal Time) https://www.magnonprisma.com/services/brand-awareness/

@magnonprismapr

star

Thu Feb 06 2025 11:58:14 GMT+0000 (Coordinated Universal Time) https://edistrict.up.gov.in/eDistrict/certificate/Domicile/Forms/DisplayDomicilCert.aspx

@VLECEBAH01393

star

Thu Feb 06 2025 11:46:42 GMT+0000 (Coordinated Universal Time) https://www.keycloak.org/getting-started/getting-started-docker

@akashpeter3

star

Thu Feb 06 2025 11:34:13 GMT+0000 (Coordinated Universal Time) https://www.beleaftechnologies.com/real-estate-tokenization

@stvejhon #crypto #cryptocurrency #exchange #meme

star

Thu Feb 06 2025 11:27:29 GMT+0000 (Coordinated Universal Time) https://www.beleaftechnologies.com/crypto-wallet-app-development

@Alwinedson

star

Thu Feb 06 2025 09:19:51 GMT+0000 (Coordinated Universal Time) https://www.magnongroup.com/

@magnongroup996

star

Thu Feb 06 2025 08:26:24 GMT+0000 (Coordinated Universal Time)

@SDureck #c#

star

Thu Feb 06 2025 07:46:57 GMT+0000 (Coordinated Universal Time) https://briotouch.com/

@britouch07

star

Thu Feb 06 2025 07:45:11 GMT+0000 (Coordinated Universal Time) https://briotouch.com/

@britouch07

star

Thu Feb 06 2025 07:26:39 GMT+0000 (Coordinated Universal Time) https://www.coinsqueens.com/blog/crypto-arbitrage-trading-bot

@athenapetridis

star

Thu Feb 06 2025 05:09:43 GMT+0000 (Coordinated Universal Time)

@Rohan@99

star

Thu Feb 06 2025 04:37:18 GMT+0000 (Coordinated Universal Time) https://nimbus.org.in/course/ssc-je-electrical-engineering

@nimbusindia ##sscje ##sscjeonlineclasses #sscje2025

star

Thu Feb 06 2025 04:29:03 GMT+0000 (Coordinated Universal Time) https://www.eapublications.org/category-product/ssc-je-books

@eapublication ##mcq ##books ##rrbje ##sscje

star

Thu Feb 06 2025 02:36:31 GMT+0000 (Coordinated Universal Time)

@procodefinder

star

Wed Feb 05 2025 19:44:33 GMT+0000 (Coordinated Universal Time)

@shahmeeriqbal

star

Wed Feb 05 2025 16:44:41 GMT+0000 (Coordinated Universal Time) https://sites.google.com/site/installationubuntu/home/ubuntu-17-10/change-mountpoint-of-usb-drives

@shawngibson #ubuntu #media

star

Wed Feb 05 2025 15:46:34 GMT+0000 (Coordinated Universal Time) https://www.tecmint.com/setup-samba-file-sharing-for-linux-windows-clients/

@shawngibson #ubuntu #samba

star

Wed Feb 05 2025 13:10:29 GMT+0000 (Coordinated Universal Time) https://runjs.app/

@redflashcode

star

Wed Feb 05 2025 09:34:51 GMT+0000 (Coordinated Universal Time) https://www.kryptobees.com/blog/triangular-arbitrage-bot

@Rick_Grimes #crypto #blockchain

star

Wed Feb 05 2025 05:49:29 GMT+0000 (Coordinated Universal Time)

@davidmchale

star

Wed Feb 05 2025 04:27:57 GMT+0000 (Coordinated Universal Time) https://codeprint.org/

@2025arjonaj

star

Wed Feb 05 2025 04:27:03 GMT+0000 (Coordinated Universal Time) https://codeprint.org/

@2025arjonaj #javascript

star

Wed Feb 05 2025 02:48:11 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Tue Feb 04 2025 12:13:47 GMT+0000 (Coordinated Universal Time) https://maticz.com/baccarat-game-development

@austinparker

star

Tue Feb 04 2025 10:50:00 GMT+0000 (Coordinated Universal Time)

@Samuel1347 #dart

star

Tue Feb 04 2025 10:20:42 GMT+0000 (Coordinated Universal Time) https://maticz.com/solana-blockchain-development

@jamielucas #solana #solanablockchaindevelopment

Save snippets that work with our extensions

Available in the Chrome Web Store Get Firefox Add-on Get VS Code extension