Snippets Collections
html {
    box-sizing: border-box;
    max-width: 70ch;
    margin: auto;
    font-size: 1.25em;
    color: #333;
    line-height: 1.4;
}

* {
    box-sizing: inherit;
}

h1, h2, h3, h4, h5, h6 {
    font-family: sans-serif;
}

img {
    max-width: 100%;
    height: auto;
}

a:link {
    text-decoration: none;
}

a:hover {
    text-decoration: underline;
}
void automation.Send_Ack_Letter_Mail_Merge(Int pop_id)
{
pop_details = zoho.crm.getRecordById("POP_Requests",pop_id);
info "pop_details ==>" + pop_details;
Customer_Name = pop_details.get("Customer_Name");
info "Customer_Name ==>" + Customer_Name;
Project_owner = pop_details.get("Project");
info "Project_owner ==>" + Project_owner;
Project_name = Project_owner.get("name");
info "Project_name ==>" + Project_name;

emailData = map();
fromDetails = map();
fromDetails.put("email", zoho.loginuserid);
emailData.put("from", fromDetails);

// To
toList = list();
toUser = map();
toUser.put("email", "muhammad.kaleem@leosops.com");
toList.add(toUser);
emailData.put("to", toList);

emailData.put("org_email", false);
// emailData.put("scheduled_time", "2021-06-12T12:12:12+05:30");
emailData.put("subject", "Proof of Payment" + Customer_Name + "-" + Project_name);

// Attachments
attachmentList = list();
attachment = map();
attachment.put.put("id","kphns9739e715cf504f968324d0e7a0d362a7");
attachmentList.add(attachment);
emailData.put("attachments", attachmentList);

// Template
template = map();
template.put("id", "5971686000095227019");
emailData.put("template", template);

// Final API call
// Step 1: Create list and add emailData
emailDataList = list();
emailDataList.add(emailData);

// Step 2: Create final payload map
emailRequest = map();
emailRequest.put("data", emailDataList);

send_mail_resp = invokeurl
[
	url :"https://www.zohoapis.com/crm/v8/POP_Requests/" + pop_id + "/actions/send_mail"
	type :POST
	parameters:emailRequest.toString()
	connection:"mail_merge"
];
info send_mail_resp;
}
[{"inputs":[{"internalType":"address","name":"_jusdc","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jusdc","outputs":[{"internalType":"contract IJUSDC","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
//WordCountMapper.java
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> {

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        StringTokenizer tokenizer = new StringTokenizer(value.toString());
            while (tokenizer.hasMoreTokens()) {
            String cleanWord = tokenizer.nextToken().toLowerCase().replaceAll("[^a-zA-Z0-9]", "");
            word.set(cleanWord);
            context.write(word, one);
        }
    }
}


//WordCountReducer.java
import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

    private IntWritable result = new IntWritable();

    public void reduce(Text key, Iterable<IntWritable> values, Context context)
            throws IOException, InterruptedException {
                    int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        result.set(sum);
        context.write(key, result);
    }
}


//WordCountDriver.java
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCountDriver {
    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
 	Job job = Job.getInstance(conf, "Word Count");

        job.setJarByClass(WordCountDriver.class);

        job.setMapperClass(WordCountMapper.class);
        job.setCombinerClass(WordCountReducer.class); // optional
        job.setReducerClass(WordCountReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        System.exit(job.waitForCompletion(true) ? 0 : 1);
      }
}



Steps:
mkdir wordcount_classes
mkdir sample

cp WordCountMapper.java sample/
cp WordCountReducer.java sample/
cp WordCountDriver.java sample/


cd sample

javac -classpath $(hadoop classpath) -d ../wordcount_classes *.java

cd ..

jar -cvf wordcount.jar -C wordcount_classes/ .

echo "Hadoop is a framework for distributed Processing" > input.txt

hdfs dfs -mkdir /wordcountinput

hdfs dfs -put input.txt /wordcountinput

hadoop jar wordcount.jar WordCountDriver /wordcountinput/input.txt /wordcountoutput

hdfs dfs -ls /wordcountoutput

hdfs dfs -cat /wordcountoutput/p*
[{"inputs":[{"internalType":"address","name":"_jusdc","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jusdc","outputs":[{"internalType":"contract IJUSDC","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
void automation.OCR_001_Fetch_Reservation_Details(Int Ownership_change_request_id)
{
Owner_map = Map();
Ownership_change_request_details = zoho.crm.getRecordById("Ownership_Change_Requests",Ownership_change_request_id);
info "Ownership_change_request_details ==>" + Ownership_change_request_details;
Reservation_Owner = Ownership_change_request_details.get("Reservation_Name");
info "Reservation_Owner ==>" + Reservation_Owner;
if(!Reservation_Owner.isNull() || !Reservation_Owner.isEmpty())
{
	Reservation_naame = Reservation_Owner.get("name");
	info "Reservation_naame ==>" + Reservation_naame;
	Reservation_id = Reservation_Owner.get("id");
	info "Reservation_id ==>" + Reservation_id;
	Reservation_details = zoho.crm.getRecordById("Deals",Reservation_id);
	info "Reservation_details ==>" + Reservation_details;
	Contact_Owner = Reservation_details.get("Contact_Name");
	info "Contact_Owner ==>" + Contact_Owner;
	if(!Contact_Owner.isNull() || !Contact_Owner.isEmpty())
	{
		Contact_name = Contact_Owner.get("name");
		info "Contact_name ==>" + Contact_name;
		contact_id = Contact_Owner.get("id");
		info "contact_id ==>" + contact_id;
		Owner_map.put("Customer_Name",Contact_Owner);
		Customer_Details = zoho.crm.getRecordById("Contacts",contact_id);
		info "Customer_Details ==>" + Customer_Details;
		Email = Customer_Details.get("Email");
		Owner_map.put("Customer_Email",Email);
	}
	Joint_buyer_name_owner = Reservation_details.get("Joint_buyer_name");
	info "Joint_buyer_name_owner ==>" + Joint_buyer_name_owner;
	if(!Joint_buyer_name_owner.isNull() || !Joint_buyer_name_owner.isEmpty())
	{
		Joint_buyer_name = Joint_buyer_name_owner.get("name");
		info "Joint_buyer_name ==>" + Joint_buyer_name;
		Joint_buyer_id = Joint_buyer_name_owner.get("id");
		info "Joint_buyer_id ==>" + Joint_buyer_id;
		Owner_map.put("Joint_buyer_name",Joint_buyer_name_owner);
	}
	Project = Reservation_details.get("Property");
	info "Project ==>" + Project;
	if(!Project.isNull() || !Project.isEmpty())
	{
		Owner_map.put("Project",Project);
	}
	Project_ID = Reservation_details.get("Project_ID");
	info "Project_ID ==>" + Project_ID;
	if(!Project_ID.isNull() || !Project_ID.isEmpty())
	{
		Owner_map.put("Project_ID",Project_ID);
	}
	Unit = Reservation_details.get("Unit");
	info "Unit ==>" + Unit;
	if(!Unit.isNull() || !Unit.isEmpty())
	{
		unit_name = Unit.get("name");
		info "unit_name ==>" + unit_name;
		unit_id = Unit.get("id");
		info "unit_id ==>" + unit_id;
		Owner_map.put("Unit",Unit);
	}
	Unit_Price_At_Sale = Reservation_details.get("Unit_Price_At_Sale");
	info "Unit_Price_At_Sale ==>" + Unit_Price_At_Sale;
	if(!Unit_Price_At_Sale.isNull() || !Unit_Price_At_Sale.isEmpty())
	{
		Owner_map.put("Unit_Price_At_Sale",Unit_Price_At_Sale);
	}
	Paid_Admin_Fee = Reservation_details.get("Paid_Admin_Fee");
	info "Paid_Admin_Fee ==>" + Paid_Admin_Fee;
	if(!Paid_Admin_Fee.isNull() || !Paid_Admin_Fee.isEmpty())
	{
		Owner_map.put("Paid_Admin_Fee",Paid_Admin_Fee);
	}
	Admin_Fee = Reservation_details.get("Admin_Fee");
	info "Admin_Fee ==>" + Admin_Fee;
	if(!Admin_Fee.isNull() || !Admin_Fee.isEmpty())
	{
		Owner_map.put("Admin_Fee",Admin_Fee);
	}
	Joint_Buyers_Multiple = Reservation_details.get("Joint_Buyers_Multiple");
	info "Joint_Buyers_Multiple ==>" + Joint_Buyers_Multiple;
	info "Joint_Buyers_Multiple.size ==>" + Joint_Buyers_Multiple.size();
	// 	if(!Joint_Buyers_Multiple.isNull() || !Joint_Buyers_Multiple.isEmpty() && Joint_Buyers_Multiple.size() > 0)
	// 	{
	// 		Joint_Buyers_Multiple_list = Joint_Buyers_Multiple.toList(",");
	// 		for each  my_Joint_Buyers_Multiple in Joint_Buyers_Multiple
	// 		{
	// 			info "my_Joint_Buyers_Multiple ==>" + my_Joint_Buyers_Multiple;
	// 			search_resp = zoho.crm.searchRecords("Contacts","(Full_Name:equals:" + my_Joint_Buyers_Multiple + ")");
	// 			info "search_resp ==>" + search_resp;
	// 			// 			Lead_owner = search_resp.get("Lead");
	// 			// 					info "Lead_owner   "
	// 		}
	// 		// 			Owner_map.put("Joint_Buyers_Multiple", Joint_Buyers_Multiple);
	// 	}
	
	
	// need to put in owner map 
	Payment_Details1 = Reservation_details.get("Payment_Details1");
	info "Payment_Details1 ==>"+Payment_Details1;
	
	
	Payment_Details1_size = Payment_Details1.size();
	info "Payment_Details1_size ==>"+Payment_Details1_size;
	
	
	Total_Amount_Payablee = Reservation_details.get("Total_Amount_Payablee");
	info "Total_Amount_Payablee ==>"+Total_Amount_Payablee;
	if ( !Total_Amount_Payablee.isNull() || !Total_Amount_Payablee.isEmpty() ) 
    {
			Owner_map.put("Total_Amount_Payable", Total_Amount_Payablee);
    }
/////// From Here
	Paid_Installment_Amount = Reservation_details.get("Paid_Installment_Amount");
	info "Paid_Installment_Amount ==>"+Paid_Installment_Amount;
		if ( !Paid_Installment_Amount.isNull() || !Paid_Installment_Amount.isEmpty() ) 
    {
			Owner_map.put("Paid_Installment_Amount", Paid_Installment_Amount);
    }
	
	Registration_Fees = Reservation_details.get("Registration_Fees");
	info "Registration_Fees ==>"+Registration_Fees;
		if ( !Registration_Fees.isNull() || !Registration_Fees.isEmpty() ) 
    {
			Owner_map.put("DLD_Registration_Fees", Registration_Fees);
    }
	
	DLD_Waiver_Amount = Reservation_details.get("DLD_Waiver_Amount");
	info "DLD_Waiver_Amount ==>"+DLD_Waiver_Amount;
		if ( !DLD_Waiver_Amount.isNull() || !DLD_Waiver_Amount.isEmpty() ) 
    {
			Owner_map.put("DLD_Waiver_Amount", DLD_Waiver_Amount);
    }
	
	Paid_Registration_Fee = Reservation_details.get("Paid_Registration_Fee");
	info "Paid_Registration_Fee ==>"+Paid_Registration_Fee;
		if ( !Paid_Registration_Fee.isNull() || !Paid_Registration_Fee.isEmpty() ) 
    {
			Owner_map.put("Paid_DLD_Registration_Fee", Paid_Registration_Fee);
    }
	
	Total_Paid_Amount_Report = Reservation_details.get("Total_Paid_Amount_Report");
	info "Total_Paid_Amount_Report ==>"+Total_Paid_Amount_Report;
		if ( !Total_Paid_Amount_Report.isNull() || !Total_Paid_Amount_Report.isEmpty() ) 
    {
			Owner_map.put("Total_Paid_Amount_Report", Total_Paid_Amount_Report);
    }
	Total_Amount_Paid = Reservation_details.get("Total_Amount_Paid");
	info "Total_Amount_Paid ==>"+Total_Amount_Paid;
		if ( !Total_Amount_Paid.isNull() || !Total_Amount_Paid.isEmpty() ) 
    {
			Owner_map.put("Total_Amount_Paid_AED", Total_Amount_Paid);
    }
	DLD_Waiver = Reservation_details.get("DLD_Waiver");
	info "DLD_Waiver ==>"+DLD_Waiver;
		if ( !DLD_Waiver.isNull() || !DLD_Waiver.isEmpty() ) 
    {
			Owner_map.put("DLD_Waiver", DLD_Waiver);
			Choose_waiver = Reservation_details.get("Choose_waiver");
			info "Choose_waiver ==>"+Choose_waiver;
			if ( !Choose_waiver.isNull() || !Choose_waiver.isEmpty() ) 
            {
				Owner_map.put("Choose_waiver", Choose_waiver);
            }
    }
	DLD_Admin_fees_paid= Reservation_details.get("DLD_Admin_fees_paid");
	info "DLD_Admin_fees_paid ==>"+DLD_Admin_fees_paid;
		if ( !DLD_Admin_fees_paid.isNull() || !DLD_Admin_fees_paid.isEmpty() ) 
    {
			Owner_map.put("DLD_Admin_fees_paid", DLD_Admin_fees_paid);
    }
	DLD_Payment_Date = Reservation_details.get("DLD_Payment_Date");
	info "DLD_Payment_Date ==>"+DLD_Payment_Date;
		if ( !DLD_Payment_Date.isNull() || !DLD_Payment_Date.isEmpty() ) 
    {
			Owner_map.put("DLD_Payment_Date", DLD_Payment_Date.toDate());
    }
	SPA_Issued_Date = Reservation_details.get("SPA_Issued_Date");
	info "SPA_Issued_Date ==>"+SPA_Issued_Date;
		if ( !SPA_Issued_Date.isNull() || !SPA_Issued_Date.isEmpty() ) 
    {
			Owner_map.put("SPA_Issued_Date", SPA_Issued_Date.toDate());
    }
	
	
    }
	
update_ownership_change_request = zoho.crm.updateRecord("Ownership_Change_Requests",Ownership_change_request_id,Owner_map);
info "update_ownership_change_request ==>" + update_ownership_change_request;
}


A robust taxi booking app script is essential to scale and streamline your taxi business in an on-demand economy. It empowers you to automate ride requests and manage fleets efficiently to enhance customer satisfaction, which is controlled from a single platform. As more users rely on mobile solutions for transportation, building a customized taxi app is a key the key to staying ahead in the market. It is the right time to convert your idea of building a revenue-generating taxi platform to drive consistent business growth. Partner with Appticz leading app development company that specializes in providing taxi booking scripts, and hit the road to digital success.
var userID = $Crm.user.id;
console.log("userID==>", userID);
var userName = $Crm.user.first_name; // + " " + $Crm.user.last_name;
console.log("userName==>", userName);
var module = $Page.module;
console.log("module==>", module);
var module_recordID = $Page.record_id;
console.log("module_recordID==>", module_recordID);
var recordName = $Page.record._Full_Name;
console.log("recordName==>", recordName);
var owner = ZDK.Page.getField('Owner').getValue();
console.log("owner==>", owner);
var ownerID = ZDK.Apps.CRM.Users.fetchById(owner.id);
console.log("owner==>", owner);
// Construct the map to include both fields you want to update

created_time = ZDK.Page.getField('Created_By').getValue();
console.log("created_time==>", created_time);

var map = {
    "Last_Viewed_User_ID": userID
};

console.log("User ID: " + userID);

// Prepare data for the API call
var datalist = [];
datalist.push(map);

var param = { "data": datalist };

// API call to update the record in Zoho CRM
var response = ZDK.Apps.CRM.Connections.invoke(
    "crmconn", 
    "https://www.zohoapis.com/crm/v5/" + module + "/" + module_recordID, 
    "PUT", 
    2, 
    param, 
    {}
);

console.log("Response: ", response);
In the rapidly evolving digital finance landscape, cryptocurrency adoption is skyrocketing — and so is the need for seamless payment solutions. One such pioneer in this space is BitPay, a popular crypto payment gateway that enables businesses to accept Bitcoin and other cryptocurrencies effortlessly. Inspired by its success, entrepreneurs and startups are increasingly turning to the BitPay Clone Script — a ready-made solution that helps you launch your own crypto payment gateway like BitPay in no time.

What Is a BitPay Clone Script?
  
A BitPay Clone Script is a pre-built, white-label crypto payment gateway software that replicates the core functionalities of BitPay. It is fully customizable, allowing you to add features, change branding, integrate wallets, and more based on your business needs. This clone script is designed for businesses or developers aiming to save time and cost by avoiding development from scratch.

Key Features of BitPay Clone Script

1. Multi-Currency Support

Enable users to send and receive payments in multiple cryptocurrencies like Bitcoin (BTC), Ethereum (ETH), USDT, and more.

2. Secure Wallet Integration

Provide integrated crypto wallets for storing and managing digital assets securely.

3. Real-Time Exchange Rates

Offer accurate and up-to-date crypto-to-fiat exchange rates using reliable APIs.

4. Merchant Tools

Let merchants generate invoices, manage settlements, and view transaction history from a unified dashboard.

5. Two-Factor Authentication (2FA)

Ensure platform security with multi-layered authentication and encryption protocols.

6. Payment API & Plugins

Provide easy integration for eCommerce platforms via APIs and plugins (e.g., WooCommerce, Magento, Shopify).

7. Admin Dashboard

Control every aspect of the platform — user management, transactions, KYC, and settings — from a powerful admin panel.

Benefits of Using a BitPay Clone Script

Faster Time to Market: Get your crypto payment gateway up and running quickly.

Cost-Effective: Save on the time and money it would take to build a platform from scratch.

Scalable Architecture: Designed to support a growing user base and transaction volume.

Custom Branding: White-label nature lets you brand it as your own.

Regulatory Compliance: Integrated KYC/AML features help stay compliant with regulations.

Final Thoughts

The future of payments is decentralized — and your business can be at the forefront of this revolution. With a BitPay Clone Script, you don’t just launch a product — you step into a booming market with a solution people need.

Ready to start your crypto payment gateway business? Contact AppcloneX and get your BitPay Clone Script today!

Whatsapp Number -+91 9677713864
Telegram - http://t.me/appcloneX
Email - business@appclonex.com
Website - https://www.appclonex.com/

{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":xero-day-blue::birthday: Happy 19th Birthday Xero! :birthday::xero-day-blue:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Hey Xeros,\nToday's the day, it's time to celebrate like it's 2006! \n It’s time to celebrate *19* incredible years of Xero with fun, food, and connection across all our global offices! \n\nCheck out what's happening in Denver today! :green-partyhat:"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xero-day-white: *Denver's Party Plans* :xero-day-white:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":lunch: *Lunch:* Kick off your Xero Day with a delicious Lunch from *12pm to 1pm* in the kicthen.\n :walk:icecream: Walk with us at *12:45pm* by meeting in the 1st floor lobby to join us for a treat at *Little Mans Icecream* on us! \n:celebrate: *Social Happy Hour:* Keep the celebration going at our special Xero Day Social Happy Hour from *4 PM – 5:30 PM*! Join us for tasty bites, celebratory drinks, and fantastic tunes.\n\n:guesswho: *Games & Prizes:* Put your knowledge to the test with our *'Guess Who – Xero Edition'* quiz!\n\n:movie_camera: Don't miss the awesome highlights from our Big Love to Small Business - Xero Day Edition!:heartss:and Recreate a Xero Memory connection activities, playing on the office screens throughout the day!"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xero-love:  *Xero Day Reminders*  :xero-love:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "To make the day fun and enjoyable for everyone here are a few helpful reminders:\n\n :dot-blue: *Wear* your ID at all times\n\n:dot-blue:*Tidy as you go!* Please wash your coffee cups, put rubbish in the bins and help with stacking/unstacking the dish sanitizers!\n\n:dot-blue:*Return chairs & tables* to their usual spots after using.\n\n:dot-blue:*Have fun!* :party_wiggle:  \n\nStay tuned to this channel for more local updates and join the global party in *#xeroday25* so you don't miss a thing!  \nLove,\nWX :party-wx: :xero-love:"
			}
		},
		{
			"type": "divider"
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":xero-day-blue::birthday: Xero Day is Tomorrow! :birthday::xero-day-blue:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Hey Xeros,\nGet ready to celebrate because tomorrow is our *19th Birthday*!\n\nJoin us for a day filled with fun and festivities. Check out the awesome party plans below, and don't forget to rock your *Xero T-shirt*!:birthdaycake:"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xero-day-white: *What’s Happening in Denver on Xero Day?* :xero-day-white:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":lunch: *Breakfast:* Kick off your Xero Day with a delicious lunch from 12pm to 1pm.\n :walking::icecream: Join the weekly Wellbeing walk at *12:45 pm* to *Little Mans Icecream* for a treat on us!\n:celebrate: *Social Happy Hour:* Keep the celebration going at our special Xero Day Social Happy Hour from *4 PM – 5:30 PM*! Join us for tasty bites, celebratory drinks, and fantastic tunes.\n\n:guesswho: *Games & Prizes:* Put your knowledge to the test with our *'Guess Who – Xero Edition'* quiz!\n"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xero-love: *Xero Day - Office Etiquette Reminder* :xero-love:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "We're very excited for Xero's *19th Birthday* celebrations!\nWith all the excitement, our office will be busier than usual. To make the day fun and enjoyable for everyone here are a few helpful reminders:\n\n :dot-blue: *Wear* your ID at all times\n\n:dot-blue:*Pre-book your parking!* If your plans change, please cancel your booking to free up space. The car park will fill up fast so plan ahead. :parkable:\n\n:dot-blue:*Right size your meeting room bookings:* Consider using phone pods, flex zones, or breakout areas instead of booking a room.\n\n:dot-blue:*Tidy as you go!* Please wash your coffee cups, put rubbish in the bins and help with stacking/unstacking the dish sanitizers! \n\nStay tuned to this channel for more local updates and join the global party in *#xeroday25* so you don't miss a thing!  \nLove,\nWX :party-wx: :xero-love:"
			}
		},
		{
			"type": "divider"
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":xero-day-white: What's on this week! :xero-day-white:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Happy Monday Denver! \n\nLet's kick off another great week with our Boost Program and Xero Day on *Thursday* to celebrate our *19th Birthday*! :celebrate:\n\nCheck out this week's exciting lineup: "
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-8: Tuesday, 8th July",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n:coffee: *Xero Café*: Café-style beverages and sweet treats.\n:breakfast: *Breakfast*: Provided by *The Taqueria* from *9AM - 10AM* in the kitchen."
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-10: Thursday, 10th July",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n:coffee: *Xero Café*: Café-style beverages and sweet treats.\n:lunch: *Xero Day Lunch*: Provided by *Mile High Pho* from *12PM* in the kitchen.\n:Partying_face:*Social Happy Hour:* Enjoy tasty bites and celebratory drinks, great tunes and a special *Guess Who - Xero Edition* quiz from *4:00PM - 5:30PM*."
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "plain_text",
				"text": "Stay tuned to this channel for your local updates, and jump into #xeroday25 for all the global fun throughout the week! \n\nLove,\n\nWX  :party-wx:  ",
				"emoji": true
			}
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":xero-day-blue::birthday: Get Ready to Celebrate: Xero Day is Almost Here! :birthday::xero-day-blue:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Hey Xeros,\nGet ready to party! Our *19th Birthday* is just around the corner!\nMark your calendars for *Thursday, July 10th* because you won't want to miss what we have planned.  Keep an eye on this channel for what’s happening in New York. :partying_face:"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xeros-connect: Xero Day falls under the umbrella of *Xeros Connect*, and what better way to kick things off than with a fun connection activity!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":camera_with_flash: *Recreate A Xero Memory* :camera_with_flash:\nLet’s celebrate how far we’ve come by recreating your favourite Xero moment!\nThink back to those epic Xerocons, unforgettable End of Year Events, hilarious team offsites, or even that time your team (looking at you CX!) wore silly hats. :tophat:\nRecreate a memory solo or with your crew — the funnier, the better!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*Here’s how to join in:*\n 1. Find an old Xero photo (from any event or team moment).\n 2. Recreate the scene solo or with teammates. Match the outfit, pose, or vibe – but with a twist. \n 3. Post your recreated photo in the thread off this message in the `#XeroDay25` Slack channel.\n\n*Include this in your thread:*\n:dot-blue: *Year:* [e.g., 2016]\n:dot-blue: *Event:* [e.g., XeroCon, End of Year Event]\n:dot-blue: *Caption:* [e.g., \"Still got it!\"]\n\n:movie_camera: These recreated memories will be featured in our global Xero Day slideshow!"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xero-day-white: *What’s Happening in New York on Xero Day?* :xero-day-white:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":lunch: Join us for *Lunch* from *12 pm-1 pm* with your Grubhub credit, and please upport local small business that week. Need some ideas? List below! \n:partying_face: Along with lunch enjoy some treats that will delivered by *Bibble and Sip*! \n:tshirt: *Show Your Xero Pride!* Don’t forget to wear your Xero t-shirt! \n\n *Some Local Options*\nEmpanada Mama\nNY Grill & Deli \nMidnight Express Diner \nGracie's on 2nd Diner \nThe Kati Roll Company \nSaiTong Thai"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Let’s make Xero's *19th Birthday* a truly unforgettable one!\nLove,\nWX :party-wx: :xero-love:"
			}
		},
		{
			"type": "divider"
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":xero-day-blue::birthday: Get Ready to Celebrate: Xero Day is Almost Here! :birthday::xero-day-blue:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Hey Xeros,\nGet ready to party! Our *19th Birthday* is just around the corner!\nMark your calendars for *Thursday, July 10th* because you won't want to miss what we have planned.  Keep an eye on this channel for what’s happening in Denver. :partying_face:"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xeros-connect: Xero Day falls under the umbrella of *Xeros Connect*, and what better way to kick things off than with a fun connection activity!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":camera_with_flash: *Recreate A Xero Memory* :camera_with_flash:\nLet’s celebrate how far we’ve come by recreating your favourite Xero moment!\nThink back to those epic Xerocons, unforgettable End of Year Events, hilarious team offsites, or even that time your team (looking at you CX!) wore silly hats. :tophat:\nRecreate a memory solo or with your crew — the funnier, the better!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*Here’s how to join in:*\n 1. Find an old Xero photo (from any event or team moment).\n 2. Recreate the scene solo or with teammates. Match the outfit, pose, or vibe – but with a twist. \n 3. Post your recreated photo in the thread off this message in the `#XeroDay25` Slack channel.\n\n*Include this in your thread:*\n:dot-blue: *Year:* [e.g., 2016]\n:dot-blue: *Event:* [e.g., XeroCon, End of Year Event]\n:dot-blue: *Caption:* [e.g., \"Still got it!\"]\n\n:movie_camera: These recreated memories will be featured in our global Xero Day slideshow!"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xero-day-white: *What’s Happening in Denver on Xero Day?* :xero-day-white:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":lunch: Join us for *Lunch* from *12 pm-1 pm* in the kitchen space by local small business *Mile High Pho*.\n :walking::icecream: Join the weekly Wellbeing walk at *12:45 pm* to *Little Man's Icecream* for a free cone on us! \n:partying_face: Keep the celebration going at the *Social Happy Hour* from *4 PM – 5:30 PM* featuring treat from another small business *Kosmik Cafe* \nEnjoy tasty bites, celebratory drinks, great tunes, and a special *'Guess Who – Xero Edition'* quiz!\n:tshirt: *Show Your Xero Pride!* Don’t forget to wear your Xero t-shirt!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Let’s make Xero's *19th Birthday* a truly unforgettable one!\nLove,\nWX :party-wx: :xero-love:"
			}
		},
		{
			"type": "divider"
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":xero-day-blue::birthday: Get Ready to Celebrate: Xero Day is Almost Here! :birthday::xero-day-blue:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Hey Xeros,\nGet ready to party! Our *19th Birthday* is just around the corner!\nMark your calendars for *Thursday, July 10th* because you won't want to miss what we have planned.  Keep an eye on this channel for what’s happening in Sydney. :partying_face:"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xeros-connect: Xero Day falls under the umbrella of *Xeros Connect*, and what better way to kick things off than with a fun connection activity!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":camera_with_flash: *Recreate A Xero Memory* :camera_with_flash:\nLet’s celebrate how far we’ve come by recreating your favourite Xero moment!\nThink back to those epic Xerocons, unforgettable End of Year Events, hilarious team offsites, or even that time your team (looking at you CX!) wore silly hats. :tophat:\nRecreate a memory solo or with your crew — the funnier, the better!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*Here’s how to join in:*\n 1. Find an old Xero photo (from any event or team moment).\n 2. Recreate the scene solo or with teammates. Match the outfit, pose, or vibe – but with a twist. \n 3. Post your recreated photo in the thread off this message in the `#XeroDay25` Slack channel.\n\n*Include this in your thread:*\n:dot-blue: *Year:* [e.g., 2016]\n:dot-blue: *Event:* [e.g., XeroCon, End of Year Event]\n:dot-blue: *Caption:* [e.g., \"Still got it!\"]\n\n:movie_camera: These recreated memories will be featured in our global Xero Day slideshow!"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xero-day-white: *What’s Happening in Sydney on Xero Day?* :xero-day-white:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":lunch: Join us for *Lunch* from *12.00pm-1.00pm* in the All Hands Space.\n:partying_face: Keep the celebration going at the *Social Happy Hour* from *4 PM – 5:30 PM*! \nEnjoy tasty bites, celebratory drinks, great tunes, and a special *'Guess Who – Xero Edition'* quiz!\n:tshirt: *Show Your Xero Pride!* Don’t forget to wear your Xero t-shirt!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Let’s make Xero's *19th Birthday* a truly unforgettable one!\nLove,\nWX :party-wx: :xero-love:"
			}
		},
		{
			"type": "divider"
		}
	]
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":xero-day-blue::birthday: Get Ready to Celebrate: Xero Day is Almost Here! :birthday::xero-day-blue:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Hey Xeros,\nGet ready to party! Our *19th Birthday* is just around the corner!\nMark your calendars for *Thursday, July 10th* because you won't want to miss what we have planned.  Keep an eye on this channel for what’s happening in Brisbane. :partying_face:"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xeros-connect: Xero Day falls under the umbrella of *Xeros Connect*, and what better way to kick things off than with a fun connection activity!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":camera_with_flash: *Recreate A Xero Memory* :camera_with_flash:\nLet’s celebrate how far we’ve come by recreating your favourite Xero moment!\nThink back to those epic Xerocons, unforgettable End of Year Events, hilarious team offsites, or even that time your team (looking at you CX!) wore silly hats. :tophat:\nRecreate a memory solo or with your crew — the funnier, the better!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*Here’s how to join in:*\n 1. Find an old Xero photo (from any event or team moment).\n 2. Recreate the scene solo or with teammates. Match the outfit, pose, or vibe – but with a twist. \n 3. Post your recreated photo in the thread off this message in the `#XeroDay25` Slack channel.\n\n*Include this in your thread:*\n:dot-blue: *Year:* [e.g., 2016]\n:dot-blue: *Event:* [e.g., XeroCon, End of Year Event]\n:dot-blue: *Caption:* [e.g., \"Still got it!\"]\n\n:movie_camera: These recreated memories will be featured in our global Xero Day slideshow!"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xero-day-white: *What’s Happening in Brisbane on Xero Day?* :xero-day-white:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":lunch: Join us for *lunch* from *12.00pm- 1.00pm* in the Kitchen.\n:partying_face: Keep the celebration going at the *Social Happy Hour* from *4 PM – 5:30 PM*! \nEnjoy tasty bites, celebratory drinks, great tunes, and a special *'Guess Who – Xero Edition'* quiz!\n:tshirt: *Show Your Xero Pride!* Don’t forget to wear your Xero t-shirt!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Let’s make Xero's *19th Birthday* a truly unforgettable one!\nLove,\nWX :party-wx: :xero-love:"
			}
		},
		{
			"type": "divider"
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":xero-day-blue::birthday: Get Ready to Celebrate: Xero Day is Almost Here! :birthday::xero-day-blue:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Hey Xeros,\nGet ready to party! Our *19th Birthday* is just around the corner!\nMark your calendars for *Thursday, July 10th* because you won't want to miss what we have planned.  Keep an eye on this channel for what’s happening in Brisbane. :partying_face:"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xeros-connect: Xero Day falls under the umbrella of *Xeros Connect*, and what better way to kick things off than with a fun connection activity!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":camera_with_flash: *Recreate A Xero Memory* :camera_with_flash:\nLet’s celebrate how far we’ve come by recreating your favourite Xero moment!\nThink back to those epic Xerocons, unforgettable End of Year Events, hilarious team offsites, or even that time your team (looking at you CX!) wore silly hats. :tophat:\nRecreate a memory solo or with your crew — the funnier, the better!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*Here’s how to join in:*\n 1. Find an old Xero photo (from any event or team moment).\n 2. Recreate the scene solo or with teammates. Match the outfit, pose, or vibe – but with a twist. \n 3. Post your recreated photo in the thread off this message in the `#XeroDay25` Slack channel.\n\n*Include this in your thread:*\n:dot-blue: *Year:* [e.g., 2016]\n:dot-blue: *Event:* [e.g., XeroCon, End of Year Event]\n:dot-blue: *Caption:* [e.g., \"Still got it!\"]\n\n:movie_camera: These recreated memories will be featured in our global Xero Day slideshow!"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xero-day-white: *What’s Happening in Brisbane on Xero Day?* :xero-day-white:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":lunch: Join us for *lunch* from *12.00pm- 1.00pm* in the Kitchen.\n:partying_face: Keep the celebration going at the *Social Happy Hour* from *4 PM – 5:30 PM*! \nEnjoy tasty bites, celebratory drinks, great tunes, and a special *'Guess Who – Xero Edition'* quiz!\n:tshirt: *Show Your Xero Pride!* Don’t forget to wear your Xero t-shirt!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Let’s make Xero's *19th Birthday* a truly unforgettable one!\nLove,\nWX :party-wx: :xero-love:"
			}
		},
		{
			"type": "divider"
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":xero-day-blue::birthday: Get Ready to Celebrate: Xero Day is Almost Here! :birthday::xero-day-blue:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Hey Xeros,\nGet ready to party! Our *19th Birthday* is just around the corner!\nMark your calendars for *Thursday, July 10th* because you won't want to miss what we have planned.  Keep an eye on this channel for what’s happening in Sydney. :partying_face:"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xeros-connect: Xero Day falls under the umbrella of *Xeros Connect*, and what better way to kick things off than with a fun connection activity!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":camera_with_flash: *Recreate A Xero Memory* :camera_with_flash:\nLet’s celebrate how far we’ve come by recreating your favourite Xero moment!\nThink back to those epic Xerocons, unforgettable End of Year Events, hilarious team offsites, or even that time your team (looking at you CX!) wore silly hats. :tophat:\nRecreate a memory solo or with your crew — the funnier, the better!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*Here’s how to join in:*\n 1. Find an old Xero photo (from any event or team moment).\n 2. Recreate the scene solo or with teammates. Match the outfit, pose, or vibe – but with a twist. \n 3. Post your recreated photo in the thread off this message in the `#XeroDay25` Slack channel.\n\n*Include this in your thread:*\n:dot-blue: *Year:* [e.g., 2016]\n:dot-blue: *Event:* [e.g., XeroCon, End of Year Event]\n:dot-blue: *Caption:* [e.g., \"Still got it!\"]\n\n:movie_camera: These recreated memories will be featured in our global Xero Day slideshow!"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":xero-day-white: *What’s Happening in Sydney on Xero Day?* :xero-day-white:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":lunch: Join us for *Lunch* from *12.00pm-1.00pm* in the All Hands Space.\n:partying_face: Keep the celebration going at the *Social Happy Hour* from *4 PM – 5:30 PM*! \nEnjoy tasty bites, celebratory drinks, great tunes, and a special *'Guess Who – Xero Edition'* quiz!\n:tshirt: *Show Your Xero Pride!* Don’t forget to wear your Xero t-shirt!"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Let’s make Xero's *19th Birthday* a truly unforgettable one!\nLove,\nWX :party-wx: :xero-love:"
			}
		},
		{
			"type": "divider"
		}
	]
}
Whether you’re a casual player or a serious enthusiast, the quality of your pool table cloth is essential for ensuring a smooth, consistent playing experience. When it comes to choosing the best pool table cloth, there are numerous factors to consider: material, durability, speed, and of course, the place where you make your purchase. One of the top places to buy premium quality pool table cloth is Snooker Alley. In this blog post, we’ll delve into why Snooker Alley is a trusted source for all your pool table cloth needs and how choosing the right cloth can enhance your game.

The Importance of Choosing the Right Pool Table Cloth
Pool table cloths are not just about aesthetics—they have a significant impact on your game. A high-quality cloth ensures that the balls roll smoothly and predictably. On the other hand, a poor-quality cloth will affect the ball’s movement, causing it to bounce erratically or roll unevenly.

Here are some important aspects to consider when choosing pool table cloth:

Material Quality: The material used in the cloth affects the speed and durability of the game. Woolen cloths, typically made from a blend of wool and nylon, are commonly used for recreational and casual games. However, for serious players, a higher-quality cloth, such as Simonis or Hainsworth, offers superior performance and long-lasting durability.

Speed: Different cloths have different speeds. Some are faster, allowing for quicker ball movement, while others are slower, providing more control. The right speed depends on your style of play. If you're into fast-paced games, a faster cloth is ideal, while if you're looking for a more controlled experience, go for a slower cloth.

Durability: Pool table cloths undergo a lot of wear and tear, especially in high-traffic areas. Durable cloths are essential to ensure that you don’t need to replace them frequently. Cloths from reputable brands like Snooker Alley are designed for longevity and will hold up over time.

Pilling and Fraying Resistance: Over time, cheap cloths can develop pilling (tiny fabric balls) or fraying edges. High-quality cloths are resistant to this, which means they maintain their smooth, professional feel for a much longer period.

Color and Aesthetic: While performance is paramount, the aesthetic of the cloth is also an important consideration. Whether you're looking for a traditional green, a striking red, or something more modern, Snooker Alley offers a variety of colors to match your space and style.

Why Buy Pool Table Cloth from Snooker Alley?
If you want Buy Pool Table Cloth that delivers both superior performance and aesthetic appeal, Snooker Alley is your go-to destination. Here are several reasons why this brand is trusted by pool table owners around the world:

Wide Range of Quality Options
Whether you’re a beginner or a professional, Snooker Alley offers a range of pool table cloths suited to your needs. Their selection includes woolen cloths for casual games, as well as premium cloths for competition-level play. Leading brands available at Snooker Alley include Simonis and Hainsworth, two names synonymous with quality in the world of pool.

Expert Knowledge and Support
Buying pool table cloth can be a daunting task for first-time buyers. With Snooker Alley, you don’t just get a product—you get the knowledge and support you need to make an informed decision. Their experts can guide you through the different cloth types, helping you choose the best option based on your table size, playing style, and budget.

Custom Fit Options
Not all pool tables are created equal, and at Snooker Alley, you’ll find cloth options that fit a variety of table sizes. Whether you’re looking for cloth for a 7-foot table or a full-size 9-foot table, Snooker Alley has custom-cut options to ensure the perfect fit.

Affordable Prices
Snooker Alley offers high-quality cloth at competitive prices. Unlike many other suppliers, they balance affordability with quality, making them an attractive option for both recreational players and professional competitors.

Free Shipping
When you shop with Snooker Alley, you don’t need to worry about expensive shipping fees. They offer free shipping on all orders, making it even easier for you to upgrade your pool table.

Choosing the Right Cloth for Your Game
When purchasing pool table cloth, it's crucial to understand the different options available. Here are the most common types of cloth you will find:

Woolen Cloths
Woolen cloths are made from a blend of wool and synthetic fibers like nylon or polyester. They are typically the most affordable option and are great for recreational players. These cloths are ideal for home tables and casual play because they offer a good balance of speed and durability. Woolen cloths tend to be a little slower, which can help control the game better for beginners.

Felt Cloths
Felt cloths are another popular choice, especially in American-style pool tables. They are usually made from a mixture of wool and polyester, and they offer a smoother playing surface compared to woolen cloths. Felt is generally faster and more responsive, making it a better choice for players who want a quicker game.

Premium Cloths
If you’re looking for the best of the best, you’ll want to invest in premium pool table cloths, such as Simonis or Hainsworth. These cloths are typically made from 100% wool or a wool-nylon blend and are designed for professional-level play. They offer exceptional durability, smoothness, and speed, ensuring a more consistent and precise playing experience.

Speed Cloths
For competitive players, speed cloths are an essential choice. Speed cloth is engineered for minimal friction and high responsiveness, allowing balls to travel faster and roll more predictably. These cloths are ideal for professional pool and snooker tables and are a top choice for tournament venues.

Caring for Your Pool Table Cloth
Once you’ve chosen your perfect cloth from Snooker Alley, it’s important to take care of it to ensure its longevity. Here are some tips to help you maintain your pool table cloth:

Keep it Clean
Regularly brushing your pool table cloth helps prevent dirt and dust buildup. Use a soft-bristled brush, and make sure to brush in one direction to keep the fibers intact.

Protect Against Stains
Pool tables can get dirty, especially if you're playing with food or drinks nearby. It’s essential to clean up any spills immediately to prevent stains from setting into the fabric.

Avoid Sunlight Exposure
Direct sunlight can cause fading and weaken the fibers of your pool table cloth. Try to position your pool table in a room where it’s shielded from direct sunlight.

Re-cloth Your Table Regularly
Over time, the cloth will naturally wear down. If you notice the cloth is becoming damaged, it’s time to re-cloth the table. Snooker Alley offers a wide selection of replacement cloths to keep your table in top condition.

Conclusion
Buying the right pool table cloth is essential for maintaining the quality of your game. Whether you're upgrading your current cloth or replacing an old one, Snooker Alley is the ideal destination for all your pool table cloth needs. With their wide selection, expert advice, and competitive pricing, you can be sure that you’re making the right choice for your game.

Visit Snooker Alley today to browse their extensive range of high-quality pool table cloth options. With their free shipping and customer support, you can enjoy a seamless shopping experience and elevate your pool-playing experience.
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":star: Xero Boost Days! :star:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Please see below for what's on this week! "
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-2: Wednesday, 2nd July",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n:coffee: *Café Partnership*: Enjoy free coffee and café-style beverages from our partner, *Naked  Duck*.\n:breakfast: *Morning Tea*: Provided by *Naked Duck* from *9am* in the All Hands."
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-22: Thursday, 3rd July",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":coffee: *Café Partnership*: Café Partnership: Enjoy coffee and café-style beverages from our partner, *Naked Duck*.\n:lunch: *Lunch*: Provided by *Naked Duck* from *12pm* in the All Hands."
			}
		},
		{
			"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/r?cid=Y185aW90ZWV0cXBiMGZwMnJ0YmtrOXM2cGFiZ0Bncm91cC5jYWxlbmRhci5nb29nbGUuY29t|*Sydney Social Calendar*>, and get ready to Boost your workdays!\n\nLove,\nWX Team :party-wx:"
			}
		}
	]
}
function getNumbers() {
    for ($i = 1; $i <= 1000000; $i++) {
        yield $i;
    }
}

foreach (getNumbers() as $number) {
    if ($number > 5) break;
    echo "$number\n";
}
  document.addEventListener("DOMContentLoaded", function () {
    const easeInOutQuad = function (t) {
      return t < 0.5 ? 2 * t * t
        : -1 + (4 - 2 * t) * t;
    };

    function smoothScrollTo(targetEl, duration = 500, offset = 80) {
      const startY = window.pageYOffset;
      const targetY = targetEl.getBoundingClientRect().top + startY - offset;
      const diff = targetY - startY;
      let startTime;

      function scrollStep(timestamp) {
        if (!startTime) startTime = timestamp;
        const time = timestamp - startTime;
        const percent = Math.min(time / duration, 1);
        window.scrollTo(0, startY + diff * easeInOutQuad(percent));
        if (time < duration) {
          window.requestAnimationFrame(scrollStep);
        }
      }

      window.requestAnimationFrame(scrollStep);
    }

    document.querySelectorAll('a[href^="#"]').forEach(link => {
      link.addEventListener("click", function (e) {
        const hash = this.getAttribute("href");
        const target = document.querySelector(hash);
        if (target) {
          e.preventDefault();
          smoothScrollTo(target, 5000, 80); // 500ms duration, 80px offset
        }
      });
    });
  });

Buồn cười là thế hệ trước ôm hết tài nguyên vào tay, rồi cơ số lão lên chê trách thế hệ sau, tới lúc bị bọn trẻ nó vặn ngược lại cho thì dãy nảy lên
Thời các bác khôn chết mọe , buôn lậu , trốn thuế , phân lô bán nền , học cấp 2 ra làm chủ tịch huyện , làm việc thì đéo có kinh nghiệm ,. Sau khi vơ vét đủ thì ra luật để các cháu khỏi xài mánh cũ .
/*pristupnost:zvetseni moznost priblizeni v mobilu, vlozit do functions.php*/
function remove_my_action() {
remove_action('wp_head', 'et_add_viewport_meta');
}
function custom_et_add_viewport_meta(){
echo '<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=10.0, user-scalable=1" />';
}
add_action( 'init', 'remove_my_action');
add_action( 'wp_head', 'custom_et_add_viewport_meta' );

// smazat Divi nástěnku // 
add_action( 'init', function() {
    // Restrict Page to access using direct link
    global $pagenow;
    $page = ! empty( $_GET['page'] ) ? $_GET['page'] : '';
    if (!empty($page) && $page === 'et_onboarding' && !empty($pagenow) && $pagenow === 'admin.php') {
        wp_die( esc_attr( "You don't have permission to access this page"));
    }
    // Enqueue CSS To Hide Divi Dashboard Option & Enqueue JS To Change Tab When Click Divi in Dashboard
    add_action('admin_enqueue_scripts', function() {
        // CSS
        $hideDiviDashboardCSS = "#toplevel_page_et_divi_options ul.wp-submenu li a[href='admin.php?page=et_onboarding'] {display: none!important;}";
        wp_register_style('pac-da-hide-divi-dashboard-option', false, [], '1.0.0');
        wp_enqueue_style('pac-da-hide-divi-dashboard-option');
        wp_add_inline_style('pac-da-hide-divi-dashboard-option', $hideDiviDashboardCSS);
        // JS
        ob_start();
        ?> jQuery(document).ready(function(){jQuery('a.wp-has-submenu[href="admin.php?page=et_onboarding"]').attr("href","admin.php?page=et_divi_options")}); <?php
        $hideDiviDashboardJS = ob_get_contents();
        ob_end_clean();
        wp_register_script('pac-da-change-divi-dashboard-option', '', ['jquery'], '1.0.0', true);
        wp_enqueue_script('pac-da-change-divi-dashboard-option');
        wp_add_inline_script('pac-da-change-divi-dashboard-option', $hideDiviDashboardJS);
    });
});

// povolit infinite scroll v Mediich
add_filter( 'media_library_infinite_scrolling', '__return_true' );


// Zmena vysky css blocku v nastaveni sablony

add_action( 'init', function() {
    add_action('admin_enqueue_scripts', 'pac_divi_code_editor_resize_and_min_height');
});
function pac_divi_code_editor_resize_and_min_height()
{
	$css_admin_side = "";
	
    // For Custom CSS code editor in Divi Theme Options
    $css_admin_side .= "#divi_custom_css + .CodeMirror-wrap { min-height:600px;resize: vertical;}";


    // Register Inline CSS
    wp_register_style('pac-divi-code-editor-resize-and-min-height', false, [], '1.0.0');
    wp_enqueue_style('pac-divi-code-editor-resize-and-min-height');
    wp_add_inline_style('pac-divi-code-editor-resize-and-min-height', $css_admin_side);
//////////////////////////////////
orgId = "667823888";
workspaceId = "1724734000003983010";
viewId = "1724734000019844002";
headersMap = Map();
headersMap.put("ZANALYTICS-ORGID",orgId);
config = Map();
config.put("responseFormat","json");
paramsMap = Map();
paramsMap.put("CONFIG",config.toString());
email = "zoho@rebiz.com";
WS_name = "Zoho One Analytics";
///////////////////Get Analytics table data////////v2 api/////////
Get_Analytics_Data = invokeurl
[
    url :"https://analyticsapi.zoho.com/restapi/v2/bulk/workspaces/" + workspaceId + "/views/" + viewId + "/data"
    type :GET
    parameters:paramsMap
    headers:headersMap
    connection:"zoho_analytics"
];
//info Get_Analytics_Data;
if(Get_Analytics_Data != "" && Get_Analytics_Data.get("status") == "success")
{
    jobId = Get_Analytics_Data.get("data").get("jobId");
}
getUrl("https://httpstat.us/200?sleep=10000");
download_Data = invokeurl
[
    url :"https://analyticsapi.zoho.com/restapi/v2/bulk/workspaces/" + workspaceId + "/exportjobs/" + jobId + "/data"
    type :GET
    headers:headersMap
    connection:"zoho_analytics"
];
//info download_Data;
get_download_Data = download_Data.get("data");
//info get_download_Data;
Expense_Data_Analytics_List = List();
Expense_id_list = List();
All_Expense_Data = List();
counter = 0;
for each  expense in get_download_Data
{
    Expense_ID = expense.get("Expense ID");
    Date = expense.get("Date");
    Expense_Date = expense.get("Expense Date");
    Vendor = expense.get("Vendor");
    customer = expense.get("Customer");
    Expense_Category_Account_ID = expense.get("Expense Category Account ID");
    Paid_through_Account_ID = expense.get("Account ID");
    Paid_through_Account_Name = expense.get("Account");
    Expense_No = expense.get("Expense #");
    Expense_Description = expense.get("Expense Description");
    Product_Category = expense.get("Product Category");
    Department = expense.get("Department");
    Amount = expense.get("Amount");
    New_Amount = toDecimal(expense.get("New Amount")).round(2);
    info New_Amount;
    Employee_Paid_Through = expense.get("Employee Paid Through");
    Department_Tag_Option_ID = expense.get("Department Tag Option ID");
    Product_Category_Tag_Option_ID = expense.get("Product Category Tag Option ID");
    ////////////////// Tags List ///////////////////////////
    Tags_list = list();
    dep_tags_map = Map();
    dep_tags_map.put("tag_id",1398255000000000333);
    dep_tags_map.put("tag_option_id",Department_Tag_Option_ID);
    Tags_list.add(dep_tags_map);
    ////////////////////////////////////////////
    Prod_tags_map = Map();
    Prod_tags_map.put("tag_id",1398255000000000339);
    Prod_tags_map.put("tag_option_id",Product_Category_Tag_Option_ID);
    Tags_list.add(Prod_tags_map);
    /////////////////////////////////////////
    if(!Expense_id_list.contains(Expense_ID))
    {
        Expense_id_list.add(Expense_ID);
        expenseMap = Map();
        expenseMap.put("expense_id",Expense_ID);
        line_item = list();
        line_item_map = Map();
        line_item_map.put("account_id",Expense_Category_Account_ID);
        line_item_map.put("amount",New_Amount);
        line_item_map.put("tags",Tags_list);
        //add new amount variable 
        expenseMap.put("account_id",Expense_Category_Account_ID);
        expenseMap.put("date",Expense_Date);
        expenseMap.put("amount",toDecimal(New_Amount));
        expenseMap.put("Employee Paid Through",Employee_Paid_Through);
        expenseMap.put("Line_Items",line_item);
        All_Expense_Data.add(expenseMap);
        if(toDecimal(New_Amount) > 0)
        {
            line_item.add(line_item_map);
        }
        ////////////
    }
    else
    {
        line_item_map = Map();
        line_item_map.put("account_id",Expense_Category_Account_ID);
        line_item_map.put("amount",toDecimal(New_Amount));
        line_item_map.put("tags",Tags_list);
        // add new amount column
        indexFound = Expense_id_list.indexOf(Expense_ID);
        Line_item_list = All_Expense_Data.get(indexFound).get("Line_Items");
        if(toDecimal(New_Amount) > 0.0)
        {
            Line_item_list.add(line_item_map);
        }
    }
}
//info "Size of expense" + All_Expense_Data.size();
for each  expense in All_Expense_Data
{
    update_Map = Map();
    update_Map.put("line_items",expense.get("Line_Items"));
    update_Map.put("account_id",expense.get("account_id"));
    new_exp_date = expense.get("date").toDate().toString("yyyy-MM-dd");
    update_Map.put("date",new_exp_date);
    total_amount = 0.0;
    for each  line_item in expense.get("Line_Items")
    {
        total_amount = total_amount + toDecimal(line_item.get("amount"));
    }
    info "Total Amount" + total_amount.round(1);
    update_Map.put("amount",total_amount.round(1));
    update_Map.put("paid_through_account_id",expense.get("paid_through_account_id"));
    //////////////////////////////////
    Update_Expense = invokeurl
    [
        url :"https://www.zohoapis.com/books/v3/expenses/" + Expense_ID + "?organization_id=669825616"
        type :PUT
        parameters:update_Map.toString()
        connection:"zoho_books"
    ];
    info "Update_Expense Response:" + Update_Expense;
    checkCode = Update_Expense.get("code");
    if(checkCode == 0)
    {
        /////////////////////Update the data on zoho analytics///////////
        columnsMap = Map();
        columnsMap.put("Expense ID",Expense_ID);
        columnsMap.put("Is Updated","Yes");
        columnsMap.put("Expense Details",Line_item_list.toString());
        columns = Map();
        columns.put("columns",columnsMap);
        paramsMap = Map();
        paramsMap.put("CONFIG",columns.toString());
        headersMap = Map();
        headersMap.put("ZANALYTICS-ORGID",orgId);
        response = invokeurl
        [
            url :"https://analyticsapi.zoho.com/restapi/v2/workspaces/" + workspaceId + "/views/1724734000020312044/rows"
            type :POST
            parameters:paramsMap
            headers:headersMap
            connection:"zoho_analytics"
        ];
        //info response;
    }
}
/** 
 * log("sample logging statement") --> can be used to print any data in the browser console.
 * ZDK module can be used for customising the UI and other functionalities.
 * return false to prevent <SAVE> action
**/
var account_name = ZDK.Page.getField('Account_Name').getValue();
console.log("Account name value: ", account_name);
var contactnamefield= ZDK.Page.getField("Contact_Name").getValue();
console.log("Value of Contact name Field is ", contactnamefield);

var Show_Number_of_Unit=ZDK.Page.getField("Show_Number_of_Unit");
console.log("Show_Number_of_Unit = ", Show_Number_of_Unit);

var Show_Number_of_Unit_Vaule=ZDK.Page.getField("Show_Number_of_Unit").getValue();
console.log("Show_Number_of_Unit_value = ", Show_Number_of_Unit_Vaule);

if (account_name != null)
{
    console.log("Account Name is not Equal to Null");
var accountnameid = account_name['id'];
console.log("account name id: ", accountnameid);

var related_records = ZDK.Apps.CRM.Accounts.fetchRelatedRecords(accountnameid, "Contacts");
for (var i = 0; i < related_records.length; i++)
{
    console.log("related_records [i]", related_records[i]);
    console.log("related_records[i].Primary_Contact", related_records[i].Primary_Contact);
    if(related_records[i].Primary_Contact==true)
    {
        true_related_record = related_records[i];
        console.log("true_related_record",true_related_record);
    }
    else
    {
        true_related_record=related_records[0];
        console.log("true_related_record [0]",true_related_record);
        
    }
}

console.log("true_related_record Email",true_related_record.Email);
console.log("true_related_record Full_Name",true_related_record.Full_Name);
console.log("true_related_record id",true_related_record.id);

var emailfield = ZDK.Page.getField('Email');
console.log("email field value: ",emailfield);
console.log("set email address");
//emailfield.setValue(true_related_record.Email);
var contactnamefield= ZDK.Page.getField("Contact_Name");
//contactnamefield.setValue({ "id": true_related_record.id, "name": true_related_record.Full_Name });
console.log("set contact name");
console.log("id is :",true_related_record.id,"name is ",true_related_record.Full_Name);

var accounts = ZDK.Apps.CRM.Accounts.fetchById(accountnameid);
console.log("accounts: ", accounts);

var numofemployeesfield = ZDK.Page.getField("Number_of_Employees");
console.log("num of employees field: ",numofemployeesfield);
    var foundingyearfield = ZDK.Page.getField("Founding_Year");
var websitee = ZDK.Page.getField("Website");
websitee.setValue(accounts.Website);
console.log("foundingyearfield", foundingyearfield);
if (accounts.Founding_Year == null)
{
    console.log("if condition Founding_Year");
    foundingyearfield.setValue(0);
}
else
{
    console.log("else condition Founding_Year");
    foundingyearfield.setValue(accounts.Founding_Year);
}

if (accounts.Number_of_Employees == null)
{
    console.log("if condition Number_of_Employees",accounts.Number_of_Employees);
    numofemployeesfield.setValue("-None-");
}
else
{
    console.log("else condition Number_of_Employees",accounts.Number_of_Employees);
    numofemployeesfield.setValue(accounts.Number_of_Employees);
}

var client_typefield = ZDK.Page.getField("Client_Type");
console.log("client_typefield = ", client_typefield);
if (accounts.Client_Type==null)
{
    console.log("if condition client_typefield is null",accounts.Client_Type);
    client_typefield.setValue("-None-");
}
else
{
    console.log("else condition in Client_type",accounts.Client_Type);
    client_typefield.setValue(accounts.Client_Type);
}



var industryfield = ZDK.Page.getField('Industry');
console.log("industryfield", industryfield);
if (accounts.Industry == null)
{
    console.log("if condition Industry");
    industryfield.setValue("-None-");
}
else
{
    console.log("else condition Industry");
    industryfield.setValue(accounts.Industry);
}


var serviceintrestedfield= ZDK.Page.getField("Services_Interested").getValue();
console.log("serviceintrestedfield",serviceintrestedfield);

    if (serviceintrestedfield=="Property Management Solution")
    {
        console.log("True");
        Show_Number_of_Unit.setValue(true);
    }
    else {
        console.log("False");
        Show_Number_of_Unit.setValue(false);
}
var client_tpye_value=ZDK.Page.getField("Client_Type").getValue();
console.log("client_tpye_value",client_tpye_value);

}
else
{
    console.log("Account Name is Equal to Null");
    var emailfield = ZDK.Page.getField('Email');
    //emailfield.setValue(null);

    var contactnamefield= ZDK.Page.getField("Contact_Name");
    //contactnamefield.setValue(null);

    var numofemployeesfield = ZDK.Page.getField("Number_of_Employees");
    numofemployeesfield.setValue("-None-");

    var foundingyearfield = ZDK.Page.getField("Founding_Year");
    foundingyearfield.setValue(null);

    var client_typefield = ZDK.Page.getField("Client_Type");
    client_typefield.setValue("-None-");
    
    var industryfield = ZDK.Page.getField('Industry');
    industryfield.setValue("-None-");
}


var userID = $Crm.user.id;
var userName = $Crm.user.first_name; // + " " + $Crm.user.last_name;
var module = $Page.module;
var module_recordID = $Page.record_id;
var recordName = $Page.record._Full_Name;
/*var currentdate = new Date();

var timesettings = {  year: 'numeric',  month: 'long',  day: 'numeric',  hour: 'numeric',minute: 'numeric',  second: 'numeric',hour12: true, timeZoneName: 'short' };var formattedDateTime = currentdate.toLocaleTimeString('en-US',timesettings);    console.log("time ::::::: ", formattedDateTime);   */

var map = { "Viewed_By": "Last Viewed by - " + userName + " \n " };
var map = { "Last_Viewed_User_ID": +userID};
console.log("User id new : " +userID)
// + formattedDateTime 

//console.log(map); 

var datalist = [];datalist.push(map);var param = { "data": datalist };

//console.log("param: ", param); 

var response = ZDK.Apps.CRM.Connections.invoke("crmconn", "https://zohoapis.com/crm/v5/"+module+"/"+module_recordID, "PUT", 2, param, {});

//console.log("Response : ", response);

var userID = $Crm.user.id;
var userName = $Crm.user.first_name; // + " " + $Crm.user.last_name;
var module = $Page.module;
var module_recordID = $Page.record_id;
var recordName = $Page.record._Full_Name;
var userIDString = String(userID);

console.log("This is string:" +userIDString); 
console.log( "This is user id: "+userID); 
/*var currentdate = new Date();

var timesettings = {  year: 'numeric',  month: 'long',  day: 'numeric',  hour: 'numeric',minute: 'numeric',  second: 'numeric',hour12: true, timeZoneName: 'short' };var formattedDateTime = currentdate.toLocaleTimeString('en-US',timesettings);    console.log("time ::::::: ", formattedDateTime);   */

var map = { "Viewed_By": "Last Viewed by - " + userName + " \n " };
var map = { "Last_Viewed_User_ID": +userIDString + " \n "};

// + formattedDateTime 

//console.log(map); 

var datalist = [];datalist.push(map);var param = { "data": datalist };

//console.log("param: ", param); 

var response = ZDK.Apps.CRM.Connections.invoke("crmconn", "https://zohoapis.com/crm/v5/"+module+"/"+module_recordID, "PUT", 2, param, {});

//console.log("Response : ", response);
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":x-connect: Boost Days: What's on in Melbourne this week! :x-connect:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n\n Hey Melbourne, happy Monday! \n\n Please see below for what's on this week as there is a Change in dates to the Boost Programme. "
			}
		},
		{
			"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 :caramel-slice: Classic Slices \n\n :coffee: *Weekly Café Special*: Vanilla Bean Latte"
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": " Monday, 30th June :calendar-date-30:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": " :suit-up: *Wear your suit to work Day* - In Honour of the long-standing tradition in Australia :australia: Today we encourage you to come dressed in your sharpest suit or corporate attire. Think of it has the nod to our old-school accountants and bookeepers our partners would have worn back in the day! \n\n *10.30am*: Join us everyone for a photo in the Breakout Space followed by a delicious morning tea :croissant::suit-up:  "
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": " Wednesday, 2nd July :calendar-date-2:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":breakfast: *Breakfast*: from *8:30am - 10:30am* in the Level 3 Breakout Space. "
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": "Thursday, 3rd July :calendar-date-3: \n ",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "plain_text",
				"text": " :Lunch: :flag-gr: 12.00pm - Greek themed Lunch in the breakout Space on L-3. Menu in the :thread: \n :HANDS: 12.30pm - Please join us for the Australia All Hands screening in the breakout space on Level 3. ",
				"emoji": true
			}
		},
		{
			"type": "divider"
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":star: Xero Boost Days! :star:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Canberra! Please see below for what's on this week! "
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-2: Wednesday, 2nd July",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n:Lunch: *Lunch*: Provided in our suite from *12pm*."
			}
		},
		{
			"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=Y19jYzU3YWJkZTE4ZTE0YzVlYTYxMGU4OThjZjRhYWQ0MTNhYmIzMDBjZjBkMzVlNDg0M2M5NDQ4NDk3NDAyYjkyQGdyb3VwLmNhbGVuZGFyLmdvb2dsZS5jb20|*Canberra Social Calendar*>, and get ready to Boost your workdays!\n\nLove,\nWX Team :party-wx:"
			}
		}
	]
}
ssh -L <localport>:localhost:<host2port> -J user1@host1 user2@host2
function slow_down_site() {
    sleep(35);
}
add_action('wp', 'slow_down_site');

function slow_down_sitenocache() {
    if (!isset($_GET['nocache'])) {
        wp_redirect(add_query_arg('nocache', time())); // Force reload with new URL
        exit;
    }
    sleep(35);
}
add_action('init', 'slow_down_sitenocache');

function slow_down_site_wpdb() {
    global $wpdb;
    $wpdb->query("SELECT SLEEP(35)"); // MySQL delay
}
add_action('init', 'slow_down_site_wpdb');
function create_testimonial() {

    $labels = array(
        'name' => _x( 'Testimonial', 'Post Type General Name'),
        'singular_name' => _x( 'Testimonial', 'Post Type Singular Name'),
        'menu_name' => _x( 'Testimonial', 'Admin Menu text'),
        'name_admin_bar' => _x( 'Testimonial', 'Add New on Toolbar'),
        'archives' => __( 'Testimonial Archives'),
        'attributes' => __( 'Testimonial Attributes'),
        'parent_item_colon' => __( 'Parent Testimonial:'),
        'all_items' => __( 'All Testimonial'),
        'add_new_item' => __( 'Add New Testimonial'),
        'add_new' => __( 'Add New'),
        'new_item' => __( 'New Testimonial'),
        'edit_item' => __( 'Edit Testimonial'),
        'update_item' => __( 'Update Testimonial'),
        'view_item' => __( 'View Testimonial'),
        'view_items' => __( 'View Testimonial'),
        'search_items' => __( 'Search Testimonial'),
        'not_found' => __( 'Not found'),
        'not_found_in_trash' => __( 'Not found in Trash'),
        'featured_image' => __( 'Featured Image'),
        'set_featured_image' => __( 'Set featured image'),
        'remove_featured_image' => __( 'Remove featured image'),
        'use_featured_image' => __( 'Use as featured image'),
        'insert_into_item' => __( 'Insert into Testimonial'),
        'uploaded_to_this_item' => __( 'Uploaded to this Testimonial'),
        'items_list' => __( 'Testimonial list'),
        'items_list_navigation' => __( 'Testimonial list navigation'),
        'filter_items_list' => __( 'Filter Testimonial list'),
    );
    $rewrite = array(
        'slug' => 'testimonial',
        'with_front' => true,
        'pages' => true,
        'feeds' => true,
    );
    $args = array(
        'label' => __( 'Testimonial'),
        'description' => __( ''),
        'labels' => $labels,
        'menu_icon' => 'dashicons-admin-appearance',
        'supports' => array('title', 'editor', 'excerpt', 'thumbnail', 'page-attributes', 'post-formats'),
        'taxonomies' => array(),
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'menu_position' => 5,
        'show_in_admin_bar' => true,
        'show_in_nav_menus' => true,
        'can_export' => true,
        'has_archive' => true,
        'hierarchical' => true,
        'exclude_from_search' => true,
        'show_in_rest' => true,
        'publicly_queryable' => true,
        'capability_type' => 'post',
        'rewrite' => $rewrite,
    );
    register_post_type( 'testimonial', $args );
    
    }
    add_action( 'init', 'create_testimonial', 0 );
    
    function testimonial_loop(){
    ob_start();
    wp_reset_postdata();
    ?>
    
        <div id="slick-slides" class="owl-carousel services-sec">
    <?php 
        $arg = array(
            'post_type' => 'testimonial',
            'posts_per_page' =>-1, 
        );
    $testimonialPost = new WP_Query($arg);
    ?>
            <?php if ($testimonialPost->have_posts() ): ?>
                <?php while ($testimonialPost->have_posts() ) : ?>
                    <?php $testimonialPost->the_post(); ?>
                    
                        <div class="col-md-3 content">
                            <div class="testi_wrapper">
                                <div class="test_img">
                                    <?php the_post_thumbnail() ?>
                                </div>
                                <div class="test_content">
                                    <p><?php the_content() ?></p>
                                </div>
                                <div class="test_detail">
									<h4><?php the_title() ?></h4>
									<small><?php the_field('designation') ?></small>
                                </div>	
                            </div>
                        </div>
                    <?php endwhile; ?>
                <?php endif;?>
            </div>

    <?php
    wp_reset_postdata();
    return ''.ob_get_clean();
    }
    add_shortcode('testimonial_code', 'testimonial_loop');
function product_custom_loop(){
        ob_start();
        
         $args = array(
            'post_type' => ' product',
            'posts_per_page' => 6,
        ); 
    
        $results = new WP_Query($args);
        // echo '<pre>';
        // var_dump($atts['category']);
        ?>
<section id="home">
     
        
            <div class="container-fluid">
             
                    <div class="row ser-content product-slider">
                        <?php
                            if($results->have_posts()):
                                while($results->have_posts()):
                                    $results->the_post();
                                    global $product;
                                    // $categories = get_the_terms(get_the_ID(), 'product_cat');
                            ?>
                        <div class="col-md-4">
                           <div class="product_col">
                            <div class="product_inner">
                                <div class="product_top">
                        			<a class="prCart" href="<?php echo esc_url( get_site_url() . '/cart/?add-to-cart=' . $product->get_id() ); ?>"><span class="list-icon wd-icon fas fa-shopping-bag"></span></a>
                                    <div class="price_product">
                                    <?php 
                            			  if ($product->is_type( 'simple' )) { ?>
                            			<?php echo $product->get_price_html(); ?>
                            			<?php } ?>
                            			<?php 
                                		  if($product->get_type()=='variable') {
                                		      $available_variations = $product->get_available_variations();
                                		      $variation_id=$available_variations[0]['variation_id'];
                                		      $variable_product1= new WC_Product_Variation( $variation_id );
                                		      $regular_price = $variable_product1 ->regular_price;
                                		      $sales_price = $variable_product1 -> sale_price;
                                		      if (empty($sales_price)) {
                                		      $sales_price = 0;
                                		        }
                                		      }
                            			  ?>
                                </div>
                			    </div>
                                <div class="product_img">
                                    <?php the_post_thumbnail('full'); ?>
                                </div>
                                <div class="product_title">
                                    <h4><?php echo esc_html(get_the_title()); ?></h4>
                                </div>
                            </div>
                        </div>
                        </div>
                        <?php
                            endwhile;
                            endif;
                            ?>
                    </div>
                
            </div>
         
     
</section>

<?php
    wp_reset_postdata();
    return ob_get_clean();
    }
add_shortcode('wp-product','product_custom_loop');



from flask import Blueprint, jsonify, request
import pandas as pd
import os
from datetime import timedelta
from statsmodels.tsa.statespace.sarimax import SARIMAX
from models import SensorData, User, session
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import login_user, logout_user, login_required, current_user

bp = Blueprint('api', __name__)

# --- AUTHENTICATION & PASSWORD RECOVERY ROUTES (Unchanged) ---

@bp.route('/api/signup', methods=['POST'])
def signup():
    data = request.get_json()
    if session.query(User).filter_by(username=data.get('username')).first():
        return jsonify({"message": "Username already exists."}), 409
    if session.query(User).filter_by(email=data.get('email')).first():
        return jsonify({"message": "Email already registered."}), 409
        
    new_user = User(
        username=data.get('username'), 
        email=data.get('email'), 
        security_question_1=data.get('security_question_1'), 
        security_answer_1_hash=generate_password_hash(data.get('security_answer_1')), 
        security_question_2=data.get('security_question_2'), 
        security_answer_2_hash=generate_password_hash(data.get('security_answer_2'))
    )
    new_user.set_password(data.get('password'))
    session.add(new_user)
    session.commit()
    return jsonify({"message": "Account created successfully."}), 201

@bp.route('/api/login', methods=['POST'])
def login():
    data = request.get_json()
    user = session.query(User).filter_by(username=data.get('username')).first()
    if not user or not user.check_password(data.get('password')):
        return jsonify({"message": "Invalid username or password."}), 401
    login_user(user)
    return jsonify({"message": "Logged in successfully."}), 200

@bp.route('/api/logout', methods=['POST'])
@login_required
def logout():
    logout_user()
    return jsonify({"message": "You have been logged out."}), 200

@bp.route('/api/check_session', methods=['GET'])
def check_session():
    if current_user.is_authenticated:
        return jsonify({"loggedIn": True, "username": current_user.username}), 200
    return jsonify({"loggedIn": False}), 401

@bp.route('/api/get-security-questions', methods=['POST'])
def get_security_questions():
    data = request.get_json()
    user = session.query(User).filter_by(username=data.get('username')).first()
    if not user or not user.security_question_1:
        return jsonify({"message": "Unable to retrieve security questions for this user."}), 404
    return jsonify({"question1": user.security_question_1, "question2": user.security_question_2}), 200

@bp.route('/api/reset-password', methods=['POST'])
def reset_password():
    data = request.get_json()
    user = session.query(User).filter_by(username=data.get('username')).first()
    if not user:
        return jsonify({"message": "Invalid credentials."}), 401
    
    answer1_correct = check_password_hash(user.security_answer_1_hash, data.get('answer1'))
    answer2_correct = check_password_hash(user.security_answer_2_hash, data.get('answer2'))

    if not (answer1_correct and answer2_correct):
        return jsonify({"message": "One or more security answers are incorrect."}), 401
    
    user.set_password(data.get('newPassword'))
    session.commit()
    return jsonify({"message": "Password has been reset successfully. Please log in."}), 200


# --- DATA ROUTES (Unchanged) ---
@bp.route('/status', methods=['GET'])
def status():
    return jsonify({'status': 'API is running'})

@bp.route('/api/upload-mock-data', methods=['POST'])
def upload_mock_data():
    file_path = "mock_sensor_data.csv"
    if not os.path.exists(file_path):
        return jsonify({"error": "Mock file not found"}), 404
    df = pd.read_csv(file_path)
    df["timestamp"] = pd.to_datetime(df["timestamp"])
    for _, row in df.iterrows():
        entry = SensorData(
            timestamp=row["timestamp"],
            sensor_id=row["sensor_id"],
            rainfall_mm=row["rainfall_mm"],
            water_level_cm=row["water_level_cm"],
            flow_rate_lps=row["flow_rate_lps"]
        )
        session.add(entry)
    session.commit()
    return jsonify({"message": "Mock data uploaded successfully!"})

@bp.route('/api/get-sensor-data', methods=['GET'])
@login_required
def get_sensor_data():
    try:
        data = session.query(SensorData).all()
        result = [
            {
                "timestamp": entry.timestamp.strftime("%Y-%m-%d %H:%M:%S"), 
                "sensor_id": entry.sensor_id, 
                "rainfall_mm": entry.rainfall_mm, 
                "water_level_cm": entry.water_level_cm, 
                "flow_rate_lps": entry.flow_rate_lps
            } for entry in data
        ]
        return jsonify(result)
    except Exception as e:
        return jsonify({"error": f"An internal error occurred: {str(e)}"}), 500

# --- UPDATED FORECASTING ROUTE ---

@bp.route('/api/forecast', methods=['GET'])
@login_required
def forecast():
    try:
        query = session.query(SensorData).statement
        df = pd.read_sql(query, session.bind)

        if df.empty or len(df) < 24: # Need enough data to forecast
            return jsonify({"error": "Not enough data to create a forecast."}), 400

        df['timestamp'] = pd.to_datetime(df['timestamp'])
        df = df.set_index('timestamp').sort_index()
        
        forecast_results = {}
        metrics_to_forecast = {
            "waterLevel": "water_level_cm",
            "flowRate": "flow_rate_lps",
            "rainfall": "rainfall_mm"
        }
        
        last_timestamp = df.index[-1]
        forecast_steps = 24
        future_dates = pd.date_range(start=last_timestamp + timedelta(hours=1), periods=forecast_steps, freq='H')
        
        for key, column_name in metrics_to_forecast.items():
            # Resample series for stability
            series = df[column_name].resample('H').mean().fillna(method='ffill')
            
            # Simple check to avoid trying to forecast flat-line data (common with rainfall)
            if series.nunique() < 2:
                predicted_mean = [series.iloc[-1]] * forecast_steps
            else:
                # Define and train the SARIMAX model
                model = SARIMAX(series, order=(1, 1, 1), seasonal_order=(1, 1, 0, 12), enforce_stationarity=False, enforce_invertibility=False)
                results = model.fit(disp=False)
                prediction = results.get_forecast(steps=forecast_steps)
                predicted_mean = prediction.predicted_mean.tolist()

            # Format the prediction for this metric
            forecast_results[key] = {
                "timestamps": [d.strftime("%Y-%m-%d %H:%M:%S") for d in future_dates],
                "predicted_values": predicted_mean
            }
            # Ensure rainfall forecast does not predict negative values
            if key == 'rainfall':
                forecast_results[key]['predicted_values'] = [max(0, val) for val in forecast_results[key]['predicted_values']]

        return jsonify(forecast_results)
        
    except Exception as e:
        return jsonify({"error": f"Failed to generate forecast: {str(e)}"}), 500

var userID = $Crm.user.id;
var userName = $Crm.user.first_name; // + " " + $Crm.user.last_name;
var module = $Page.module;
var module_recordID = $Page.record_id;
var recordName = $Page.record._Full_Name;



/*var currentdate = new Date();

var timesettings = {  year: 'numeric',  month: 'long',  day: 'numeric',  hour: 'numeric',minute: 'numeric',  second: 'numeric',hour12: true, timeZoneName: 'short' };var formattedDateTime = currentdate.toLocaleTimeString('en-US',timesettings);    console.log("time ::::::: ", formattedDateTime);   */

var map = { "Viewed_By": "Last Viewed by - " + userName + " \n " };
// + formattedDateTime 

//console.log(map); 

var datalist = [];datalist.push(map);var param = { "data": datalist };

//console.log("param: ", param); 

var response = ZDK.Apps.CRM.Connections.invoke("crmconn", "https://zohoapis.com/crm/v5/"+module+"/"+module_recordID, "PUT", 2, param, {});

//console.log("Response : ", response);
star

Wed Jul 02 2025 20:26:10 GMT+0000 (Coordinated Universal Time) https://www.howtogeek.com/get-a-clean-attractive-site-with-lines-of-css/?utm_source

@darkoeller

star

Wed Jul 02 2025 11:23:57 GMT+0000 (Coordinated Universal Time)

@Peaky ##pagination ##zoho ##crm ##zohocrm ##zoho_crm ##deluge

star

Wed Jul 02 2025 10:36:11 GMT+0000 (Coordinated Universal Time) https://www.firebeetechnoservices.com/uniswap-clone-script

@aanaethan #uniswap #uniswapclonescript

star

Wed Jul 02 2025 10:05:15 GMT+0000 (Coordinated Universal Time) https://www.trioangle.com/cryptocurrency-exchange-development-company/

@aaronjeffrey

star

Wed Jul 02 2025 09:40:57 GMT+0000 (Coordinated Universal Time) https://www.trioangle.com/binance-clone/

@aaronjeffrey

star

Wed Jul 02 2025 08:58:46 GMT+0000 (Coordinated Universal Time) https://jusdc.io

@mathewmerlin72

star

Wed Jul 02 2025 06:13:01 GMT+0000 (Coordinated Universal Time)

@signup #java

star

Wed Jul 02 2025 05:30:13 GMT+0000 (Coordinated Universal Time) https://jusdc.io/mint

@mathewmerlin72 #vaultmint

star

Tue Jul 01 2025 12:11:19 GMT+0000 (Coordinated Universal Time) https://appticz.com/taxi-booking-script

@davidscott

star

Tue Jul 01 2025 11:34:05 GMT+0000 (Coordinated Universal Time) https://github.com/shookthacr3ator777/sandpack

@Shookthadev999

star

Tue Jul 01 2025 08:51:45 GMT+0000 (Coordinated Universal Time) https://rishikeshyogkendra.com/200-hour-yoga-teacher-training-india.php

@rishikeshyogk6 ##bestyttcinrishikesh ##yogainrishikesh ##200hoursyttcinrishikesh ##yogaschoolinrishikesh

star

Tue Jul 01 2025 07:37:07 GMT+0000 (Coordinated Universal Time)

@Peaky ##pagination ##zoho ##crm ##zohocrm ##zoho_crm ##deluge

star

Tue Jul 01 2025 07:05:12 GMT+0000 (Coordinated Universal Time) https://www.appclonex.com/bitpay-clone-script

@riyageorge0895 #bitpay

star

Tue Jul 01 2025 06:56:29 GMT+0000 (Coordinated Universal Time) https://www.trioangle.com/copy-trading-clone-script/

@aaronjeffrey

star

Tue Jul 01 2025 06:40:00 GMT+0000 (Coordinated Universal Time) https://www.trioangle.com/binance-clone/

@aaronjeffrey

star

Mon Jun 30 2025 21:34:56 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Mon Jun 30 2025 21:26:01 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Mon Jun 30 2025 21:22:28 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Mon Jun 30 2025 21:12:29 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Mon Jun 30 2025 21:06:18 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Mon Jun 30 2025 12:12:07 GMT+0000 (Coordinated Universal Time) https://www.coinsclone.com/crypto-wallet-development

@CharleenStewar #cryptowalletdevelopmentcost #costof crypto wallet development #howmuch does it cost to develop a crypto wallet

star

Mon Jun 30 2025 08:57:56 GMT+0000 (Coordinated Universal Time) https://www.trioangle.com/remitano-clone/

@aaronjeffrey

star

Mon Jun 30 2025 06:14:28 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Mon Jun 30 2025 06:13:12 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Mon Jun 30 2025 05:27:11 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Mon Jun 30 2025 05:16:10 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Sun Jun 29 2025 15:59:09 GMT+0000 (Coordinated Universal Time) https://snookeralley.com/category/table-cloth/

@dollypartonn ##lawessaywriter

star

Sun Jun 29 2025 01:38:31 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Sat Jun 28 2025 13:32:12 GMT+0000 (Coordinated Universal Time) https://flatcoding.com/tutorials/php/foreach-loop-in-php/

@Samuel88 #php

star

Fri Jun 27 2025 23:55:09 GMT+0000 (Coordinated Universal Time)

@riyadhbin

star

Fri Jun 27 2025 17:20:42 GMT+0000 (Coordinated Universal Time) https://voz.vn/t/ts-nguyen-tri-hieu-gia-nha-se-tang-chu-khong-giam.1116987/

@abcabcabc

star

Fri Jun 27 2025 14:00:19 GMT+0000 (Coordinated Universal Time)

@hedviga

star

Fri Jun 27 2025 11:21:24 GMT+0000 (Coordinated Universal Time)

@usman13

star

Fri Jun 27 2025 11:18:52 GMT+0000 (Coordinated Universal Time)

@usman13

star

Fri Jun 27 2025 07:02:08 GMT+0000 (Coordinated Universal Time)

@Peaky ##pagination ##zoho ##crm ##zohocrm ##zoho_crm ##deluge

star

Fri Jun 27 2025 06:31:56 GMT+0000 (Coordinated Universal Time)

@usman13

star

Fri Jun 27 2025 06:26:02 GMT+0000 (Coordinated Universal Time) https://www.trioangle.com/kucoin-clone-script/

@aaronjeffrey

star

Fri Jun 27 2025 06:24:08 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Fri Jun 27 2025 06:19:19 GMT+0000 (Coordinated Universal Time)

@FOHWellington

star

Fri Jun 27 2025 06:03:48 GMT+0000 (Coordinated Universal Time) https://www.addustechnologies.com/1inch-exchange-clone-script

@Seraphina

star

Fri Jun 27 2025 05:59:13 GMT+0000 (Coordinated Universal Time) https://www.trioangle.com/binance-clone/

@aaronjeffrey

star

Thu Jun 26 2025 19:41:55 GMT+0000 (Coordinated Universal Time)

@marcopinero #bash

star

Thu Jun 26 2025 19:26:35 GMT+0000 (Coordinated Universal Time)

@Muhammad_Waqar

star

Thu Jun 26 2025 19:20:15 GMT+0000 (Coordinated Universal Time)

@Muhammad_Waqar

star

Thu Jun 26 2025 19:14:16 GMT+0000 (Coordinated Universal Time)

@Muhammad_Waqar

star

Thu Jun 26 2025 19:03:23 GMT+0000 (Coordinated Universal Time)

@AKAMAY001

star

Thu Jun 26 2025 13:03:44 GMT+0000 (Coordinated Universal Time)

@usman13

Save snippets that work with our extensions

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