20 skills found
sayantann11 / All Classification Templetes For MLClassification - Machine Learning This is ‘Classification’ tutorial which is a part of the Machine Learning course offered by Simplilearn. We will learn Classification algorithms, types of classification algorithms, support vector machines(SVM), Naive Bayes, Decision Tree and Random Forest Classifier in this tutorial. Objectives Let us look at some of the objectives covered under this section of Machine Learning tutorial. Define Classification and list its algorithms Describe Logistic Regression and Sigmoid Probability Explain K-Nearest Neighbors and KNN classification Understand Support Vector Machines, Polynomial Kernel, and Kernel Trick Analyze Kernel Support Vector Machines with an example Implement the Naïve Bayes Classifier Demonstrate Decision Tree Classifier Describe Random Forest Classifier Classification: Meaning Classification is a type of supervised learning. It specifies the class to which data elements belong to and is best used when the output has finite and discrete values. It predicts a class for an input variable as well. There are 2 types of Classification: Binomial Multi-Class Classification: Use Cases Some of the key areas where classification cases are being used: To find whether an email received is a spam or ham To identify customer segments To find if a bank loan is granted To identify if a kid will pass or fail in an examination Classification: Example Social media sentiment analysis has two potential outcomes, positive or negative, as displayed by the chart given below. https://www.simplilearn.com/ice9/free_resources_article_thumb/classification-example-machine-learning.JPG This chart shows the classification of the Iris flower dataset into its three sub-species indicated by codes 0, 1, and 2. https://www.simplilearn.com/ice9/free_resources_article_thumb/iris-flower-dataset-graph.JPG The test set dots represent the assignment of new test data points to one class or the other based on the trained classifier model. Types of Classification Algorithms Let’s have a quick look into the types of Classification Algorithm below. Linear Models Logistic Regression Support Vector Machines Nonlinear models K-nearest Neighbors (KNN) Kernel Support Vector Machines (SVM) Naïve Bayes Decision Tree Classification Random Forest Classification Logistic Regression: Meaning Let us understand the Logistic Regression model below. This refers to a regression model that is used for classification. This method is widely used for binary classification problems. It can also be extended to multi-class classification problems. Here, the dependent variable is categorical: y ϵ {0, 1} A binary dependent variable can have only two values, like 0 or 1, win or lose, pass or fail, healthy or sick, etc In this case, you model the probability distribution of output y as 1 or 0. This is called the sigmoid probability (σ). If σ(θ Tx) > 0.5, set y = 1, else set y = 0 Unlike Linear Regression (and its Normal Equation solution), there is no closed form solution for finding optimal weights of Logistic Regression. Instead, you must solve this with maximum likelihood estimation (a probability model to detect the maximum likelihood of something happening). It can be used to calculate the probability of a given outcome in a binary model, like the probability of being classified as sick or passing an exam. https://www.simplilearn.com/ice9/free_resources_article_thumb/logistic-regression-example-graph.JPG Sigmoid Probability The probability in the logistic regression is often represented by the Sigmoid function (also called the logistic function or the S-curve): https://www.simplilearn.com/ice9/free_resources_article_thumb/sigmoid-function-machine-learning.JPG In this equation, t represents data values * the number of hours studied and S(t) represents the probability of passing the exam. Assume sigmoid function: https://www.simplilearn.com/ice9/free_resources_article_thumb/sigmoid-probability-machine-learning.JPG g(z) tends toward 1 as z -> infinity , and g(z) tends toward 0 as z -> infinity K-nearest Neighbors (KNN) K-nearest Neighbors algorithm is used to assign a data point to clusters based on similarity measurement. It uses a supervised method for classification. The steps to writing a k-means algorithm are as given below: https://www.simplilearn.com/ice9/free_resources_article_thumb/knn-distribution-graph-machine-learning.JPG Choose the number of k and a distance metric. (k = 5 is common) Find k-nearest neighbors of the sample that you want to classify Assign the class label by majority vote. KNN Classification A new input point is classified in the category such that it has the most number of neighbors from that category. For example: https://www.simplilearn.com/ice9/free_resources_article_thumb/knn-classification-machine-learning.JPG Classify a patient as high risk or low risk. Mark email as spam or ham. Keen on learning about Classification Algorithms in Machine Learning? Click here! Support Vector Machine (SVM) Let us understand Support Vector Machine (SVM) in detail below. SVMs are classification algorithms used to assign data to various classes. They involve detecting hyperplanes which segregate data into classes. SVMs are very versatile and are also capable of performing linear or nonlinear classification, regression, and outlier detection. Once ideal hyperplanes are discovered, new data points can be easily classified. https://www.simplilearn.com/ice9/free_resources_article_thumb/support-vector-machines-graph-machine-learning.JPG The optimization objective is to find “maximum margin hyperplane” that is farthest from the closest points in the two classes (these points are called support vectors). In the given figure, the middle line represents the hyperplane. SVM Example Let’s look at this image below and have an idea about SVM in general. Hyperplanes with larger margins have lower generalization error. The positive and negative hyperplanes are represented by: https://www.simplilearn.com/ice9/free_resources_article_thumb/positive-negative-hyperplanes-machine-learning.JPG Classification of any new input sample xtest : If w0 + wTxtest > 1, the sample xtest is said to be in the class toward the right of the positive hyperplane. If w0 + wTxtest < -1, the sample xtest is said to be in the class toward the left of the negative hyperplane. When you subtract the two equations, you get: https://www.simplilearn.com/ice9/free_resources_article_thumb/equation-subtraction-machine-learning.JPG Length of vector w is (L2 norm length): https://www.simplilearn.com/ice9/free_resources_article_thumb/length-of-vector-machine-learning.JPG You normalize with the length of w to arrive at: https://www.simplilearn.com/ice9/free_resources_article_thumb/normalize-equation-machine-learning.JPG SVM: Hard Margin Classification Given below are some points to understand Hard Margin Classification. The left side of equation SVM-1 given above can be interpreted as the distance between the positive (+ve) and negative (-ve) hyperplanes; in other words, it is the margin that can be maximized. Hence the objective of the function is to maximize with the constraint that the samples are classified correctly, which is represented as : https://www.simplilearn.com/ice9/free_resources_article_thumb/hard-margin-classification-machine-learning.JPG This means that you are minimizing ‖w‖. This also means that all positive samples are on one side of the positive hyperplane and all negative samples are on the other side of the negative hyperplane. This can be written concisely as : https://www.simplilearn.com/ice9/free_resources_article_thumb/hard-margin-classification-formula.JPG Minimizing ‖w‖ is the same as minimizing. This figure is better as it is differentiable even at w = 0. The approach listed above is called “hard margin linear SVM classifier.” SVM: Soft Margin Classification Given below are some points to understand Soft Margin Classification. To allow for linear constraints to be relaxed for nonlinearly separable data, a slack variable is introduced. (i) measures how much ith instance is allowed to violate the margin. The slack variable is simply added to the linear constraints. https://www.simplilearn.com/ice9/free_resources_article_thumb/soft-margin-calculation-machine-learning.JPG Subject to the above constraints, the new objective to be minimized becomes: https://www.simplilearn.com/ice9/free_resources_article_thumb/soft-margin-calculation-formula.JPG You have two conflicting objectives now—minimizing slack variable to reduce margin violations and minimizing to increase the margin. The hyperparameter C allows us to define this trade-off. Large values of C correspond to larger error penalties (so smaller margins), whereas smaller values of C allow for higher misclassification errors and larger margins. https://www.simplilearn.com/ice9/free_resources_article_thumb/machine-learning-certification-video-preview.jpg SVM: Regularization The concept of C is the reverse of regularization. Higher C means lower regularization, which increases bias and lowers the variance (causing overfitting). https://www.simplilearn.com/ice9/free_resources_article_thumb/concept-of-c-graph-machine-learning.JPG IRIS Data Set The Iris dataset contains measurements of 150 IRIS flowers from three different species: Setosa Versicolor Viriginica Each row represents one sample. Flower measurements in centimeters are stored as columns. These are called features. IRIS Data Set: SVM Let’s train an SVM model using sci-kit-learn for the Iris dataset: https://www.simplilearn.com/ice9/free_resources_article_thumb/svm-model-graph-machine-learning.JPG Nonlinear SVM Classification There are two ways to solve nonlinear SVMs: by adding polynomial features by adding similarity features Polynomial features can be added to datasets; in some cases, this can create a linearly separable dataset. https://www.simplilearn.com/ice9/free_resources_article_thumb/nonlinear-classification-svm-machine-learning.JPG In the figure on the left, there is only 1 feature x1. This dataset is not linearly separable. If you add x2 = (x1)2 (figure on the right), the data becomes linearly separable. Polynomial Kernel In sci-kit-learn, one can use a Pipeline class for creating polynomial features. Classification results for the Moons dataset are shown in the figure. https://www.simplilearn.com/ice9/free_resources_article_thumb/polynomial-kernel-machine-learning.JPG Polynomial Kernel with Kernel Trick Let us look at the image below and understand Kernel Trick in detail. https://www.simplilearn.com/ice9/free_resources_article_thumb/polynomial-kernel-with-kernel-trick.JPG For large dimensional datasets, adding too many polynomial features can slow down the model. You can apply a kernel trick with the effect of polynomial features without actually adding them. The code is shown (SVC class) below trains an SVM classifier using a 3rd-degree polynomial kernel but with a kernel trick. https://www.simplilearn.com/ice9/free_resources_article_thumb/polynomial-kernel-equation-machine-learning.JPG The hyperparameter coefθ controls the influence of high-degree polynomials. Kernel SVM Let us understand in detail about Kernel SVM. Kernel SVMs are used for classification of nonlinear data. In the chart, nonlinear data is projected into a higher dimensional space via a mapping function where it becomes linearly separable. https://www.simplilearn.com/ice9/free_resources_article_thumb/kernel-svm-machine-learning.JPG In the higher dimension, a linear separating hyperplane can be derived and used for classification. A reverse projection of the higher dimension back to original feature space takes it back to nonlinear shape. As mentioned previously, SVMs can be kernelized to solve nonlinear classification problems. You can create a sample dataset for XOR gate (nonlinear problem) from NumPy. 100 samples will be assigned the class sample 1, and 100 samples will be assigned the class label -1. https://www.simplilearn.com/ice9/free_resources_article_thumb/kernel-svm-graph-machine-learning.JPG As you can see, this data is not linearly separable. https://www.simplilearn.com/ice9/free_resources_article_thumb/kernel-svm-non-separable.JPG You now use the kernel trick to classify XOR dataset created earlier. https://www.simplilearn.com/ice9/free_resources_article_thumb/kernel-svm-xor-machine-learning.JPG Naïve Bayes Classifier What is Naive Bayes Classifier? Have you ever wondered how your mail provider implements spam filtering or how online news channels perform news text classification or even how companies perform sentiment analysis of their audience on social media? All of this and more are done through a machine learning algorithm called Naive Bayes Classifier. Naive Bayes Named after Thomas Bayes from the 1700s who first coined this in the Western literature. Naive Bayes classifier works on the principle of conditional probability as given by the Bayes theorem. Advantages of Naive Bayes Classifier Listed below are six benefits of Naive Bayes Classifier. Very simple and easy to implement Needs less training data Handles both continuous and discrete data Highly scalable with the number of predictors and data points As it is fast, it can be used in real-time predictions Not sensitive to irrelevant features Bayes Theorem We will understand Bayes Theorem in detail from the points mentioned below. According to the Bayes model, the conditional probability P(Y|X) can be calculated as: P(Y|X) = P(X|Y)P(Y) / P(X) This means you have to estimate a very large number of P(X|Y) probabilities for a relatively small vector space X. For example, for a Boolean Y and 30 possible Boolean attributes in the X vector, you will have to estimate 3 billion probabilities P(X|Y). To make it practical, a Naïve Bayes classifier is used, which assumes conditional independence of P(X) to each other, with a given value of Y. This reduces the number of probability estimates to 2*30=60 in the above example. Naïve Bayes Classifier for SMS Spam Detection Consider a labeled SMS database having 5574 messages. It has messages as given below: https://www.simplilearn.com/ice9/free_resources_article_thumb/naive-bayes-spam-machine-learning.JPG Each message is marked as spam or ham in the data set. Let’s train a model with Naïve Bayes algorithm to detect spam from ham. The message lengths and their frequency (in the training dataset) are as shown below: https://www.simplilearn.com/ice9/free_resources_article_thumb/naive-bayes-spam-spam-detection.JPG Analyze the logic you use to train an algorithm to detect spam: Split each message into individual words/tokens (bag of words). Lemmatize the data (each word takes its base form, like “walking” or “walked” is replaced with “walk”). Convert data to vectors using scikit-learn module CountVectorizer. Run TFIDF to remove common words like “is,” “are,” “and.” Now apply scikit-learn module for Naïve Bayes MultinomialNB to get the Spam Detector. This spam detector can then be used to classify a random new message as spam or ham. Next, the accuracy of the spam detector is checked using the Confusion Matrix. For the SMS spam example above, the confusion matrix is shown on the right. Accuracy Rate = Correct / Total = (4827 + 592)/5574 = 97.21% Error Rate = Wrong / Total = (155 + 0)/5574 = 2.78% https://www.simplilearn.com/ice9/free_resources_article_thumb/confusion-matrix-machine-learning.JPG Although confusion Matrix is useful, some more precise metrics are provided by Precision and Recall. https://www.simplilearn.com/ice9/free_resources_article_thumb/precision-recall-matrix-machine-learning.JPG Precision refers to the accuracy of positive predictions. https://www.simplilearn.com/ice9/free_resources_article_thumb/precision-formula-machine-learning.JPG Recall refers to the ratio of positive instances that are correctly detected by the classifier (also known as True positive rate or TPR). https://www.simplilearn.com/ice9/free_resources_article_thumb/recall-formula-machine-learning.JPG Precision/Recall Trade-off To detect age-appropriate videos for kids, you need high precision (low recall) to ensure that only safe videos make the cut (even though a few safe videos may be left out). The high recall is needed (low precision is acceptable) in-store surveillance to catch shoplifters; a few false alarms are acceptable, but all shoplifters must be caught. Learn about Naive Bayes in detail. Click here! Decision Tree Classifier Some aspects of the Decision Tree Classifier mentioned below are. Decision Trees (DT) can be used both for classification and regression. The advantage of decision trees is that they require very little data preparation. They do not require feature scaling or centering at all. They are also the fundamental components of Random Forests, one of the most powerful ML algorithms. Unlike Random Forests and Neural Networks (which do black-box modeling), Decision Trees are white box models, which means that inner workings of these models are clearly understood. In the case of classification, the data is segregated based on a series of questions. Any new data point is assigned to the selected leaf node. https://www.simplilearn.com/ice9/free_resources_article_thumb/decision-tree-classifier-machine-learning.JPG Start at the tree root and split the data on the feature using the decision algorithm, resulting in the largest information gain (IG). This splitting procedure is then repeated in an iterative process at each child node until the leaves are pure. This means that the samples at each node belonging to the same class. In practice, you can set a limit on the depth of the tree to prevent overfitting. The purity is compromised here as the final leaves may still have some impurity. The figure shows the classification of the Iris dataset. https://www.simplilearn.com/ice9/free_resources_article_thumb/decision-tree-classifier-graph.JPG IRIS Decision Tree Let’s build a Decision Tree using scikit-learn for the Iris flower dataset and also visualize it using export_graphviz API. https://www.simplilearn.com/ice9/free_resources_article_thumb/iris-decision-tree-machine-learning.JPG The output of export_graphviz can be converted into png format: https://www.simplilearn.com/ice9/free_resources_article_thumb/iris-decision-tree-output.JPG Sample attribute stands for the number of training instances the node applies to. Value attribute stands for the number of training instances of each class the node applies to. Gini impurity measures the node’s impurity. A node is “pure” (gini=0) if all training instances it applies to belong to the same class. https://www.simplilearn.com/ice9/free_resources_article_thumb/impurity-formula-machine-learning.JPG For example, for Versicolor (green color node), the Gini is 1-(0/54)2 -(49/54)2 -(5/54) 2 ≈ 0.168 https://www.simplilearn.com/ice9/free_resources_article_thumb/iris-decision-tree-sample.JPG Decision Boundaries Let us learn to create decision boundaries below. For the first node (depth 0), the solid line splits the data (Iris-Setosa on left). Gini is 0 for Setosa node, so no further split is possible. The second node (depth 1) splits the data into Versicolor and Virginica. If max_depth were set as 3, a third split would happen (vertical dotted line). https://www.simplilearn.com/ice9/free_resources_article_thumb/decision-tree-boundaries.JPG For a sample with petal length 5 cm and petal width 1.5 cm, the tree traverses to depth 2 left node, so the probability predictions for this sample are 0% for Iris-Setosa (0/54), 90.7% for Iris-Versicolor (49/54), and 9.3% for Iris-Virginica (5/54) CART Training Algorithm Scikit-learn uses Classification and Regression Trees (CART) algorithm to train Decision Trees. CART algorithm: Split the data into two subsets using a single feature k and threshold tk (example, petal length < “2.45 cm”). This is done recursively for each node. k and tk are chosen such that they produce the purest subsets (weighted by their size). The objective is to minimize the cost function as given below: https://www.simplilearn.com/ice9/free_resources_article_thumb/cart-training-algorithm-machine-learning.JPG The algorithm stops executing if one of the following situations occurs: max_depth is reached No further splits are found for each node Other hyperparameters may be used to stop the tree: min_samples_split min_samples_leaf min_weight_fraction_leaf max_leaf_nodes Gini Impurity or Entropy Entropy is one more measure of impurity and can be used in place of Gini. https://www.simplilearn.com/ice9/free_resources_article_thumb/gini-impurity-entrophy.JPG It is a degree of uncertainty, and Information Gain is the reduction that occurs in entropy as one traverses down the tree. Entropy is zero for a DT node when the node contains instances of only one class. Entropy for depth 2 left node in the example given above is: https://www.simplilearn.com/ice9/free_resources_article_thumb/entrophy-for-depth-2.JPG Gini and Entropy both lead to similar trees. DT: Regularization The following figure shows two decision trees on the moons dataset. https://www.simplilearn.com/ice9/free_resources_article_thumb/dt-regularization-machine-learning.JPG The decision tree on the right is restricted by min_samples_leaf = 4. The model on the left is overfitting, while the model on the right generalizes better. Random Forest Classifier Let us have an understanding of Random Forest Classifier below. A random forest can be considered an ensemble of decision trees (Ensemble learning). Random Forest algorithm: Draw a random bootstrap sample of size n (randomly choose n samples from the training set). Grow a decision tree from the bootstrap sample. At each node, randomly select d features. Split the node using the feature that provides the best split according to the objective function, for instance by maximizing the information gain. Repeat the steps 1 to 2 k times. (k is the number of trees you want to create, using a subset of samples) Aggregate the prediction by each tree for a new data point to assign the class label by majority vote (pick the group selected by the most number of trees and assign new data point to that group). Random Forests are opaque, which means it is difficult to visualize their inner workings. https://www.simplilearn.com/ice9/free_resources_article_thumb/random-forest-classifier-graph.JPG However, the advantages outweigh their limitations since you do not have to worry about hyperparameters except k, which stands for the number of decision trees to be created from a subset of samples. RF is quite robust to noise from the individual decision trees. Hence, you need not prune individual decision trees. The larger the number of decision trees, the more accurate the Random Forest prediction is. (This, however, comes with higher computation cost). Key Takeaways Let us quickly run through what we have learned so far in this Classification tutorial. Classification algorithms are supervised learning methods to split data into classes. They can work on Linear Data as well as Nonlinear Data. Logistic Regression can classify data based on weighted parameters and sigmoid conversion to calculate the probability of classes. K-nearest Neighbors (KNN) algorithm uses similar features to classify data. Support Vector Machines (SVMs) classify data by detecting the maximum margin hyperplane between data classes. Naïve Bayes, a simplified Bayes Model, can help classify data using conditional probability models. Decision Trees are powerful classifiers and use tree splitting logic until pure or somewhat pure leaf node classes are attained. Random Forests apply Ensemble Learning to Decision Trees for more accurate classification predictions. Conclusion This completes ‘Classification’ tutorial. In the next tutorial, we will learn 'Unsupervised Learning with Clustering.'
ManojKumarPatnaik / Major Project ListA list of practical projects that anyone can solve in any programming language (See solutions). These projects are divided into multiple categories, and each category has its own folder. To get started, simply fork this repo. CONTRIBUTING See ways of contributing to this repo. You can contribute solutions (will be published in this repo) to existing problems, add new projects, or remove existing ones. Make sure you follow all instructions properly. Solutions You can find implementations of these projects in many other languages by other users in this repo. Credits Problems are motivated by the ones shared at: Martyr2’s Mega Project List Rosetta Code Table of Contents Numbers Classic Algorithms Graph Data Structures Text Networking Classes Threading Web Files Databases Graphics and Multimedia Security Numbers Find PI to the Nth Digit - Enter a number and have the program generate PI up to that many decimal places. Keep a limit to how far the program will go. Find e to the Nth Digit - Just like the previous problem, but with e instead of PI. Enter a number and have the program generate e up to that many decimal places. Keep a limit to how far the program will go. Fibonacci Sequence - Enter a number and have the program generate the Fibonacci sequence to that number or to the Nth number. Prime Factorization - Have the user enter a number and find all Prime Factors (if there are any) and display them. Next Prime Number - Have the program find prime numbers until the user chooses to stop asking for the next one. Find Cost of Tile to Cover W x H Floor - Calculate the total cost of the tile it would take to cover a floor plan of width and height, using a cost entered by the user. Mortgage Calculator - Calculate the monthly payments of a fixed-term mortgage over given Nth terms at a given interest rate. Also, figure out how long it will take the user to pay back the loan. For added complexity, add an option for users to select the compounding interval (Monthly, Weekly, Daily, Continually). Change Return Program - The user enters a cost and then the amount of money given. The program will figure out the change and the number of quarters, dimes, nickels, pennies needed for the change. Binary to Decimal and Back Converter - Develop a converter to convert a decimal number to binary or a binary number to its decimal equivalent. Calculator - A simple calculator to do basic operators. Make it a scientific calculator for added complexity. Unit Converter (temp, currency, volume, mass, and more) - Converts various units between one another. The user enters the type of unit being entered, the type of unit they want to convert to, and then the value. The program will then make the conversion. Alarm Clock - A simple clock where it plays a sound after X number of minutes/seconds or at a particular time. Distance Between Two Cities - Calculates the distance between two cities and allows the user to specify a unit of distance. This program may require finding coordinates for the cities like latitude and longitude. Credit Card Validator - Takes in a credit card number from a common credit card vendor (Visa, MasterCard, American Express, Discoverer) and validates it to make sure that it is a valid number (look into how credit cards use a checksum). Tax Calculator - Asks the user to enter a cost and either a country or state tax. It then returns the tax plus the total cost with tax. Factorial Finder - The Factorial of a positive integer, n, is defined as the product of the sequence n, n-1, n-2, ...1, and the factorial of zero, 0, is defined as being 1. Solve this using both loops and recursion. Complex Number Algebra - Show addition, multiplication, negation, and inversion of complex numbers in separate functions. (Subtraction and division operations can be made with pairs of these operations.) Print the results for each operation tested. Happy Numbers - A happy number is defined by the following process. Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers, while those that do not end in 1 are unhappy numbers. Display an example of your output here. Find the first 8 happy numbers. Number Names - Show how to spell out a number in English. You can use a preexisting implementation or roll your own, but you should support inputs up to at least one million (or the maximum value of your language's default bounded integer type if that's less). Optional: Support for inputs other than positive integers (like zero, negative integers, and floating-point numbers). Coin Flip Simulation - Write some code that simulates flipping a single coin however many times the user decides. The code should record the outcomes and count the number of tails and heads. Limit Calculator - Ask the user to enter f(x) and the limit value, then return the value of the limit statement Optional: Make the calculator capable of supporting infinite limits. Fast Exponentiation - Ask the user to enter 2 integers a and b and output a^b (i.e. pow(a,b)) in O(LG n) time complexity. Classic Algorithms Collatz Conjecture - Start with a number n > 1. Find the number of steps it takes to reach one using the following process: If n is even, divide it by 2. If n is odd, multiply it by 3 and add 1. Sorting - Implement two types of sorting algorithms: Merge sort and bubble sort. Closest pair problem - The closest pair of points problem or closest pair problem is a problem of computational geometry: given n points in metric space, find a pair of points with the smallest distance between them. Sieve of Eratosthenes - The sieve of Eratosthenes is one of the most efficient ways to find all of the smaller primes (below 10 million or so). Graph Graph from links - Create a program that will create a graph or network from a series of links. Eulerian Path - Create a program that will take as an input a graph and output either an Eulerian path or an Eulerian cycle, or state that it is not possible. An Eulerian path starts at one node and traverses every edge of a graph through every node and finishes at another node. An Eulerian cycle is an eulerian Path that starts and finishes at the same node. Connected Graph - Create a program that takes a graph as an input and outputs whether every node is connected or not. Dijkstra’s Algorithm - Create a program that finds the shortest path through a graph using its edges. Minimum Spanning Tree - Create a program that takes a connected, undirected graph with weights and outputs the minimum spanning tree of the graph i.e., a subgraph that is a tree, contains all the vertices, and the sum of its weights is the least possible. Data Structures Inverted index - An Inverted Index is a data structure used to create full-text search. Given a set of text files, implement a program to create an inverted index. Also, create a user interface to do a search using that inverted index which returns a list of files that contain the query term/terms. The search index can be in memory. Text Fizz Buzz - Write a program that prints the numbers from 1 to 100. But for multiples of three print “Fizz” instead of the number and for the multiples of five print “Buzz”. For numbers which are multiples of both three and five print “FizzBuzz”. Reverse a String - Enter a string and the program will reverse it and print it out. Pig Latin - Pig Latin is a game of alterations played in the English language game. To create the Pig Latin form of an English word the initial consonant sound is transposed to the end of the word and an ay is affixed (Ex.: "banana" would yield anana-bay). Read Wikipedia for more information on rules. Count Vowels - Enter a string and the program counts the number of vowels in the text. For added complexity have it report a sum of each vowel found. Check if Palindrome - Checks if the string entered by the user is a palindrome. That is that it reads the same forwards as backward like “racecar” Count Words in a String - Counts the number of individual words in a string. For added complexity read these strings in from a text file and generate a summary. Text Editor - Notepad-style application that can open, edit, and save text documents. Optional: Add syntax highlighting and other features. RSS Feed Creator - Given a link to RSS/Atom Feed, get all posts and display them. Quote Tracker (market symbols etc) - A program that can go out and check the current value of stocks for a list of symbols entered by the user. The user can set how often the stocks are checked. For CLI, show whether the stock has moved up or down. Optional: If GUI, the program can show green up and red down arrows to show which direction the stock value has moved. Guestbook / Journal - A simple application that allows people to add comments or write journal entries. It can allow comments or not and timestamps for all entries. Could also be made into a shoutbox. Optional: Deploy it on Google App Engine or Heroku or any other PaaS (if possible, of course). Vigenere / Vernam / Ceasar Ciphers - Functions for encrypting and decrypting data messages. Then send them to a friend. Regex Query Tool - A tool that allows the user to enter a text string and then in a separate control enter a regex pattern. It will run the regular expression against the source text and return any matches or flag errors in the regular expression. Networking FTP Program - A file transfer program that can transfer files back and forth from a remote web sever. Bandwidth Monitor - A small utility program that tracks how much data you have uploaded and downloaded from the net during the course of your current online session. See if you can find out what periods of the day you use more and less and generate a report or graph that shows it. Port Scanner - Enter an IP address and a port range where the program will then attempt to find open ports on the given computer by connecting to each of them. On any successful connections mark the port as open. Mail Checker (POP3 / IMAP) - The user enters various account information include web server and IP, protocol type (POP3 or IMAP), and the application will check for email at a given interval. Country from IP Lookup - Enter an IP address and find the country that IP is registered in. Optional: Find the Ip automatically. Whois Search Tool - Enter an IP or host address and have it look it up through whois and return the results to you. Site Checker with Time Scheduling - An application that attempts to connect to a website or server every so many minute or a given time and check if it is up. If it is down, it will notify you by email or by posting a notice on the screen. Classes Product Inventory Project - Create an application that manages an inventory of products. Create a product class that has a price, id, and quantity on hand. Then create an inventory class that keeps track of various products and can sum up the inventory value. Airline / Hotel Reservation System - Create a reservation system that books airline seats or hotel rooms. It charges various rates for particular sections of the plane or hotel. For example, first class is going to cost more than a coach. Hotel rooms have penthouse suites which cost more. Keep track of when rooms will be available and can be scheduled. Company Manager - Create a hierarchy of classes - abstract class Employee and subclasses HourlyEmployee, SalariedEmployee, Manager, and Executive. Everyone's pay is calculated differently, research a bit about it. After you've established an employee hierarchy, create a Company class that allows you to manage the employees. You should be able to hire, fire, and raise employees. Bank Account Manager - Create a class called Account which will be an abstract class for three other classes called CheckingAccount, SavingsAccount, and BusinessAccount. Manage credits and debits from these accounts through an ATM-style program. Patient / Doctor Scheduler - Create a patient class and a doctor class. Have a doctor that can handle multiple patients and set up a scheduling program where a doctor can only handle 16 patients during an 8 hr workday. Recipe Creator and Manager - Create a recipe class with ingredients and put them in a recipe manager program that organizes them into categories like desserts, main courses, or by ingredients like chicken, beef, soups, pies, etc. Image Gallery - Create an image abstract class and then a class that inherits from it for each image type. Put them in a program that displays them in a gallery-style format for viewing. Shape Area and Perimeter Classes - Create an abstract class called Shape and then inherit from it other shapes like diamond, rectangle, circle, triangle, etc. Then have each class override the area and perimeter functionality to handle each shape type. Flower Shop Ordering To Go - Create a flower shop application that deals in flower objects and use those flower objects in a bouquet object which can then be sold. Keep track of the number of objects and when you may need to order more. Family Tree Creator - Create a class called Person which will have a name, when they were born, and when (and if) they died. Allow the user to create these Person classes and put them into a family tree structure. Print out the tree to the screen. Threading Create A Progress Bar for Downloads - Create a progress bar for applications that can keep track of a download in progress. The progress bar will be on a separate thread and will communicate with the main thread using delegates. Bulk Thumbnail Creator - Picture processing can take a bit of time for some transformations. Especially if the image is large. Create an image program that can take hundreds of images and converts them to a specified size in the background thread while you do other things. For added complexity, have one thread handling re-sizing, have another bulk renaming of thumbnails, etc. Web Page Scraper - Create an application that connects to a site and pulls out all links, or images, and saves them to a list. Optional: Organize the indexed content and don’t allow duplicates. Have it put the results into an easily searchable index file. Online White Board - Create an application that allows you to draw pictures, write notes and use various colors to flesh out ideas for projects. Optional: Add a feature to invite friends to collaborate on a whiteboard online. Get Atomic Time from Internet Clock - This program will get the true atomic time from an atomic time clock on the Internet. Use any one of the atomic clocks returned by a simple Google search. Fetch Current Weather - Get the current weather for a given zip/postal code. Optional: Try locating the user automatically. Scheduled Auto Login and Action - Make an application that logs into a given site on a schedule and invokes a certain action and then logs out. This can be useful for checking webmail, posting regular content, or getting info for other applications and saving it to your computer. E-Card Generator - Make a site that allows people to generate their own little e-cards and send them to other people. Do not use Flash. Use a picture library and perhaps insightful mottos or quotes. Content Management System - Create a content management system (CMS) like Joomla, Drupal, PHP Nuke, etc. Start small. Optional: Allow for the addition of modules/addons. Web Board (Forum) - Create a forum for you and your buddies to post, administer and share thoughts and ideas. CAPTCHA Maker - Ever see those images with letters numbers when you signup for a service and then ask you to enter what you see? It keeps web bots from automatically signing up and spamming. Try creating one yourself for online forms. Files Quiz Maker - Make an application that takes various questions from a file, picked randomly, and puts together a quiz for students. Each quiz can be different and then reads a key to grade the quizzes. Sort Excel/CSV File Utility - Reads a file of records, sorts them, and then writes them back to the file. Allow the user to choose various sort style and sorting based on a particular field. Create Zip File Maker - The user enters various files from different directories and the program zips them up into a zip file. Optional: Apply actual compression to the files. Start with Huffman Algorithm. PDF Generator - An application that can read in a text file, HTML file, or some other file and generates a PDF file out of it. Great for a web-based service where the user uploads the file and the program returns a PDF of the file. Optional: Deploy on GAE or Heroku if possible. Mp3 Tagger - Modify and add ID3v1 tags to MP3 files. See if you can also add in the album art into the MP3 file’s header as well as other ID3v2 tags. Code Snippet Manager - Another utility program that allows coders to put in functions, classes, or other tidbits to save for use later. Organized by the type of snippet or language the coder can quickly lookup code. Optional: For extra practice try adding syntax highlighting based on the language. Databases SQL Query Analyzer - A utility application in which a user can enter a query and have it run against a local database and look for ways to make it more efficient. Remote SQL Tool - A utility that can execute queries on remote servers from your local computer across the Internet. It should take in a remote host, user name, and password, run the query and return the results. Report Generator - Create a utility that generates a report based on some tables in a database. Generates sales reports based on the order/order details tables or sums up the day's current database activity. Event Scheduler and Calendar - Make an application that allows the user to enter a date and time of an event, event notes, and then schedule those events on a calendar. The user can then browse the calendar or search the calendar for specific events. Optional: Allow the application to create re-occurrence events that reoccur every day, week, month, year, etc. Budget Tracker - Write an application that keeps track of a household’s budget. The user can add expenses, income, and recurring costs to find out how much they are saving or losing over a period of time. Optional: Allow the user to specify a date range and see the net flow of money in and out of the house budget for that time period. TV Show Tracker - Got a favorite show you don’t want to miss? Don’t have a PVR or want to be able to find the show to then PVR it later? Make an application that can search various online TV Guide sites, locate the shows/times/channels and add them to a database application. The database/website then can send you email reminders that a show is about to start and which channel it will be on. Travel Planner System - Make a system that allows users to put together their own little travel itinerary and keep track of the airline/hotel arrangements, points of interest, budget, and schedule. Graphics and Multimedia Slide Show - Make an application that shows various pictures in a slide show format. Optional: Try adding various effects like fade in/out, star wipe, and window blinds transitions. Stream Video from Online - Try to create your own online streaming video player. Mp3 Player - A simple program for playing your favorite music files. Add features you think are missing from your favorite music player. Watermarking Application - Have some pictures you want copyright protected? Add your own logo or text lightly across the background so that no one can simply steal your graphics off your site. Make a program that will add this watermark to the picture. Optional: Use threading to process multiple images simultaneously. Turtle Graphics - This is a common project where you create a floor of 20 x 20 squares. Using various commands you tell a turtle to draw a line on the floor. You have moved forward, left or right, lift or drop the pen, etc. Do a search online for "Turtle Graphics" for more information. Optional: Allow the program to read in the list of commands from a file. GIF Creator A program that puts together multiple images (PNGs, JPGs, TIFFs) to make a smooth GIF that can be exported. Optional: Make the program convert small video files to GIFs as well. Security Caesar cipher - Implement a Caesar cipher, both encoding, and decoding. The key is an integer from 1 to 25. This cipher rotates the letters of the alphabet (A to Z). The encoding replaces each letter with the 1st to 25th next letter in the alphabet (wrapping Z to A). So key 2 encrypts "HI" to "JK", but key 20 encrypts "HI" to "BC". This simple "monoalphabetic substitution cipher" provides almost no security, because an attacker who has the encoded message can either use frequency analysis to guess the key, or just try all 25 keys.
Sfedfcv / Redesigned PancakeSkip to content github / docs Code Issues 80 Pull requests 35 Discussions Actions Projects 2 Security Insights Merge branch 'main' into 1862-Add-Travis-CI-migration-table 1862-Add-Travis-CI-migration-table (#1869, Iixixi/ZachryTylerWood#102, THEBOLCK79/docs#1, sbnbhk/docs#1) @martin389 martin389 committed on Dec 9, 2020 2 parents 2f9ec0c + 1588f50 commit 1a56ed136914e522f3a23ecc2be1c49f479a1a6a Showing 501 changed files with 5,397 additions and 1,362 deletions. 2 .github/allowed-actions.js @@ -30,7 +30,7 @@ module.exports = [ 'rachmari/labeler@832d42ec5523f3c6d46e8168de71cd54363e3e2e', 'repo-sync/github-sync@3832fe8e2be32372e1b3970bbae8e7079edeec88', 'repo-sync/pull-request@33777245b1aace1a58c87a29c90321aa7a74bd7d', 'rtCamp/action-slack-notify@e17352feaf9aee300bf0ebc1dfbf467d80438815', 'someimportantcompany/github-actions-slack-message@0b470c14b39da4260ed9e3f9a4f1298a74ccdefd', 'tjenkinson/gh-action-auto-merge-dependency-updates@cee2ac0', 'EndBug/add-and-commit@9358097a71ad9fb9e2f9624c6098c89193d83575' ] 72 .github/workflows/confirm-internal-staff-work-in-docs.yml @@ -0,0 +1,72 @@ name: Confirm internal staff meant to post in public on: issues: types: - opened - reopened - transferred pull_request_target: types: - opened - reopened jobs: check-team-membership: runs-on: ubuntu-latest continue-on-error: true if: github.repository == 'github/docs' steps: - uses: actions/github-script@626af12fe9a53dc2972b48385e7fe7dec79145c9 with: github-token: ${{ secrets.DOCUBOT_FR_PROJECT_BOARD_WORKFLOWS_REPO_ORG_READ_SCOPES }} script: | // Only perform this action with GitHub employees try { await github.teams.getMembershipForUserInOrg({ org: 'github', team_slug: 'employees', username: context.payload.sender.login, }); } catch(err) { // An error will be thrown if the user is not a GitHub employee // If a user is not a GitHub employee, we should stop here and // Not send a notification return } // Don't perform this action with Docs team members try { await github.teams.getMembershipForUserInOrg({ org: 'github', team_slug: 'docs', username: context.payload.sender.login, }); // If the user is a Docs team member, we should stop here and not send // a notification return } catch(err) { // An error will be thrown if the user is not a Docs team member // If a user is not a Docs team member we should continue and send // the notification } const issueNo = context.number || context.issue.number // Create an issue in our private repo await github.issues.create({ owner: 'github', repo: 'docs-internal', title: `@${context.payload.sender.login} confirm that \#${issueNo} should be in the public github/docs repo`, body: `@${context.payload.sender.login} opened https://github.com/github/docs/issues/${issueNo} publicly in the github/docs repo, instead of the private github/docs-internal repo.\n\n@${context.payload.sender.login}, please confirm that this belongs in the public repo and that no sensitive information was disclosed by commenting below and closing the issue.\n\nIf this was not intentional and sensitive information was shared, please delete https://github.com/github/docs/issues/${issueNo} and notify us in the \#docs-open-source channel.\n\nThanks! \n\n/cc @github/docs @github/docs-engineering` }); throw new Error('A Hubber opened an issue on the public github/docs repo'); - name: Send Slack notification if a GitHub employee who isn't on the docs team opens an issue in public if: ${{ failure() && github.repository == 'github/docs' }} uses: someimportantcompany/github-actions-slack-message@0b470c14b39da4260ed9e3f9a4f1298a74ccdefd with: channel: ${{ secrets.DOCS_OPEN_SOURCE_SLACK_CHANNEL_ID }} bot-token: ${{ secrets.SLACK_DOCS_BOT_TOKEN }} text: <@${{github.actor}}> opened https://github.com/github/docs/issues/${{ github.event.number || github.event.issue.number }} publicly on the github/docs repo instead of the private github/docs-internal repo. They have been notified via a new issue in the github/docs-internal repo to confirm this was intentional. 15 .github/workflows/js-lint.yml @@ -10,23 +10,8 @@ on: - translations jobs: see_if_should_skip: runs-on: ubuntu-latest outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check uses: fkirc/skip-duplicate-actions@36feb0d8d062137530c2e00bd278d138fe191289 with: cancel_others: 'false' github_token: ${{ github.token }} paths: '["**/*.js", "package*.json", ".github/workflows/js-lint.yml", ".eslint*"]' lint: runs-on: ubuntu-latest needs: see_if_should_skip if: ${{ needs.see_if_should_skip.outputs.should_skip != 'true' }} steps: - name: Check out repo uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f 13 .github/workflows/repo-freeze-reminders.yml @@ -14,11 +14,10 @@ jobs: if: github.repository == 'github/docs-internal' steps: - name: Send Slack notification if repo is frozen uses: someimportantcompany/github-actions-slack-message@0b470c14b39da4260ed9e3f9a4f1298a74ccdefd if: ${{ env.FREEZE == 'true' }} uses: rtCamp/action-slack-notify@e17352feaf9aee300bf0ebc1dfbf467d80438815 env: SLACK_WEBHOOK: ${{ secrets.DOCS_ALERTS_SLACK_WEBHOOK }} SLACK_USERNAME: docs-repo-sync SLACK_ICON_EMOJI: ':freezing_face:' SLACK_COLOR: '#51A0D5' # Carolina Blue SLACK_MESSAGE: All repo-sync runs will fail for ${{ github.repository }} because the repo is currently frozen! with: channel: ${{ secrets.DOCS_ALERTS_SLACK_CHANNEL_ID }} bot-token: ${{ secrets.SLACK_DOCS_BOT_TOKEN }} color: info text: All repo-sync runs will fail for ${{ github.repository }} because the repo is currently frozen! 54 .github/workflows/repo-sync-stalls.yml @@ -0,0 +1,54 @@ name: Repo Sync Stalls on: workflow_dispatch: schedule: - cron: '*/30 * * * *' jobs: check-freezer: name: Check for deployment freezes runs-on: ubuntu-latest steps: - name: Exit if repo is frozen if: ${{ env.FREEZE == 'true' }} run: | echo 'The repo is currently frozen! Exiting this workflow.' exit 1 # prevents further steps from running repo-sync-stalls: runs-on: ubuntu-latest steps: - name: Check if repo sync is stalled uses: actions/github-script@626af12fe9a53dc2972b48385e7fe7dec79145c9 with: github-token: ${{ secrets.DOCUBOT_FR_PROJECT_BOARD_WORKFLOWS_REPO_ORG_READ_SCOPES }} script: | let pulls; const owner = context.repo.owner const repo = context.repo.repo try { pulls = await github.pulls.list({ owner: owner, repo: repo, head: `${owner}:repo-sync`, state: 'open' }); } catch(err) { throw err return } pulls.data.forEach(pr => { const timeDelta = Date.now() - Date.parse(pr.created_at); const minutesOpen = timeDelta / 1000 / 60; if (minutesOpen > 30) { core.setFailed('Repo sync appears to be stalled') } }) - name: Send Slack notification if workflow fails uses: someimportantcompany/github-actions-slack-message@0b470c14b39da4260ed9e3f9a4f1298a74ccdefd if: failure() with: channel: ${{ secrets.DOCS_ALERTS_SLACK_CHANNEL_ID }} bot-token: ${{ secrets.SLACK_DOCS_BOT_TOKEN }} color: failure text: Repo sync appears to be stalled for ${{github.repository}}. See https://github.com/${{github.repository}}/pulls?q=is%3Apr+is%3Aopen+repo+sync 16 .github/workflows/repo-sync.yml @@ -7,6 +7,7 @@ name: Repo Sync on: workflow_dispatch: schedule: - cron: '*/15 * * * *' # every 15 minutes @@ -70,11 +71,10 @@ jobs: number: ${{ steps.find-pull-request.outputs.number }} - name: Send Slack notification if workflow fails uses: rtCamp/action-slack-notify@e17352feaf9aee300bf0ebc1dfbf467d80438815 if: ${{ failure() }} env: SLACK_WEBHOOK: ${{ secrets.DOCS_ALERTS_SLACK_WEBHOOK }} SLACK_USERNAME: docs-repo-sync SLACK_ICON_EMOJI: ':ohno:' SLACK_COLOR: '#B90E0A' # Crimson SLACK_MESSAGE: The last repo-sync run for ${{github.repository}} failed. See https://github.com/${{github.repository}}/actions?query=workflow%3A%22Repo+Sync%22 uses: someimportantcompany/github-actions-slack-message@0b470c14b39da4260ed9e3f9a4f1298a74ccdefd if: failure() with: channel: ${{ secrets.DOCS_ALERTS_SLACK_CHANNEL_ID }} bot-token: ${{ secrets.SLACK_DOCS_BOT_TOKEN }} color: failure text: The last repo-sync run for ${{github.repository}} failed. See https://github.com/${{github.repository}}/actions?query=workflow%3A%22Repo+Sync%22 10 .github/workflows/sync-algolia-search-indices.yml @@ -33,8 +33,10 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: npm run sync-search - name: Send slack notification if workflow run fails uses: rtCamp/action-slack-notify@e17352feaf9aee300bf0ebc1dfbf467d80438815 uses: someimportantcompany/github-actions-slack-message@0b470c14b39da4260ed9e3f9a4f1298a74ccdefd if: failure() env: SLACK_WEBHOOK: ${{ secrets.DOCS_ALERTS_SLACK_WEBHOOK }} SLACK_MESSAGE: The last Algolia workflow run for ${{github.repository}} failed. Search actions for `workflow:Algolia` with: channel: ${{ secrets.DOCS_ALERTS_SLACK_CHANNEL_ID }} bot-token: ${{ secrets.SLACK_DOCS_BOT_TOKEN }} color: failure text: The last Algolia workflow run for ${{github.repository}} failed. Search actions for `workflow:Algolia` 15 .github/workflows/yml-lint.yml @@ -10,23 +10,8 @@ on: - translations jobs: see_if_should_skip: runs-on: ubuntu-latest outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check uses: fkirc/skip-duplicate-actions@36feb0d8d062137530c2e00bd278d138fe191289 with: cancel_others: 'false' github_token: ${{ github.token }} paths: '["**/*.yml", "**/*.yaml", "package*.json", ".github/workflows/yml-lint.yml"]' lint: runs-on: ubuntu-latest needs: see_if_should_skip if: ${{ needs.see_if_should_skip.outputs.should_skip != 'true' }} steps: - name: Check out repo uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f 4 README.md @@ -28,7 +28,7 @@ If you've found a problem, you can open an issue using a [template](https://gith #### Solve an issue If you have a solution to one of the open issues, you will need to fork the repository and submit a PR using the [template](https://github.com/github/docs/blob/main/CONTRIBUTING.md#pull-request-template) that is visible automatically in the pull request body. For more details about this process, please check out [Getting Started with Contributing](/CONTRIBUTING.md). If you have a solution to one of the open issues, you will need to fork the repository and submit a pull request using the [template](https://github.com/github/docs/blob/main/CONTRIBUTING.md#pull-request-template) that is visible automatically in the pull request body. For more details about this process, please check out [Getting Started with Contributing](/CONTRIBUTING.md). #### Join us in discussions @@ -50,6 +50,8 @@ There are a few more things to know when you're getting started with this repo: In addition to the README you're reading right now, this repo includes other READMEs that describe the purpose of each subdirectory in more detail: - [content/README.md](content/README.md) - [content/graphql/README.md](content/graphql/README.md) - [content/rest/README.md](content/rest/README.md) - [contributing/README.md](contributing/README.md) - [data/README.md](data/README.md) - [data/reusables/README.md](data/reusables/README.md) BIN +164 KB assets/images/help/classroom/assignment-group-hero.png Binary file not shown. BIN +75.5 KB assets/images/help/classroom/assignment-ide-go-grant-access-button.png Binary file not shown. BIN +175 KB assets/images/help/classroom/assignment-individual-hero.png Binary file not shown. BIN +27.6 KB assets/images/help/classroom/assignment-repository-ide-button-in-readme.png Binary file not shown. BIN +83.4 KB assets/images/help/classroom/assignments-assign-deadline.png Binary file not shown. BIN +32.4 KB assets/images/help/classroom/assignments-assignment-title.png Binary file not shown. BIN +27.7 KB assets/images/help/classroom/assignments-autograding-click-pencil-or-trash.png Binary file not shown. BIN +72 KB assets/images/help/classroom/assignments-choose-repository-visibility.png Binary file not shown. BIN +20.1 KB assets/images/help/classroom/assignments-click-continue-button.png Binary file not shown. BIN +23.7 KB assets/images/help/classroom/assignments-click-create-assignment-button.png Binary file not shown. BIN +76.4 KB assets/images/help/classroom/assignments-click-grading-and-feedback.png Binary file not shown. BIN +53.1 KB assets/images/help/classroom/assignments-click-new-assignment-button.png Binary file not shown. BIN +134 KB assets/images/help/classroom/assignments-click-online-ide.png Binary file not shown. BIN +77.8 KB assets/images/help/classroom/assignments-click-pencil.png Binary file not shown. BIN +18.8 KB assets/images/help/classroom/assignments-click-review-button.png Binary file not shown. BIN +20.6 KB assets/images/help/classroom/assignments-click-save-test-case-button.png Binary file not shown. BIN +121 KB assets/images/help/classroom/assignments-click-template-repository-in-list.png Binary file not shown. BIN +21.1 KB assets/images/help/classroom/assignments-click-update-assignment.png Binary file not shown. BIN +76.9 KB assets/images/help/classroom/assignments-click-view-ide.png Binary file not shown. BIN +96.5 KB assets/images/help/classroom/assignments-click-view-test.png Binary file not shown. BIN +71.3 KB assets/images/help/classroom/assignments-define-teams.png Binary file not shown. BIN +39.4 KB assets/images/help/classroom/assignments-enable-feedback-pull-requests.png Binary file not shown. BIN +40.4 KB assets/images/help/classroom/assignments-type-protected-file-paths.png Binary file not shown. BIN +330 KB assets/images/help/classroom/autograding-actions-logs.png Binary file not shown. BIN +187 KB assets/images/help/classroom/autograding-actions-tab.png Binary file not shown. BIN +94.9 KB assets/images/help/classroom/autograding-click-grading-method.png Diff not rendered. BIN +57.5 KB assets/images/help/classroom/autograding-click-pencil.png Diff not rendered. BIN +57.7 KB assets/images/help/classroom/autograding-click-trash.png Diff not rendered. BIN +168 KB assets/images/help/classroom/autograding-hero.png Diff not rendered. BIN +154 KB assets/images/help/classroom/classroom-add-students-to-your-roster.png Diff not rendered. BIN +166 KB assets/images/help/classroom/classroom-copy-credentials.png Diff not rendered. BIN +181 KB assets/images/help/classroom/classroom-hero.png Diff not rendered. BIN +48.3 KB assets/images/help/classroom/classroom-settings-click-connection-settings.png Diff not rendered. BIN +94 KB ...ges/help/classroom/classroom-settings-click-disconnect-from-your-lms-button.png Diff not rendered. BIN +148 KB assets/images/help/classroom/classroom-settings-click-lms.png Diff not rendered. BIN +149 KB assets/images/help/classroom/click-assignment-in-list.png Diff not rendered. BIN +52.3 KB assets/images/help/classroom/click-classroom-in-list.png Diff not rendered. BIN +49.5 KB assets/images/help/classroom/click-create-classroom-button.png Diff not rendered. BIN +30 KB assets/images/help/classroom/click-create-roster-button.png Diff not rendered. BIN +78.2 KB assets/images/help/classroom/click-delete-classroom-button.png Diff not rendered. BIN +60.8 KB ...images/help/classroom/click-import-from-a-learning-management-system-button.png Diff not rendered. BIN +51.9 KB assets/images/help/classroom/click-new-classroom-button.png Diff not rendered. BIN +83.4 KB assets/images/help/classroom/click-organization.png Diff not rendered. BIN +28.4 KB assets/images/help/classroom/click-settings.png Diff not rendered. BIN +29.7 KB assets/images/help/classroom/click-students.png Diff not rendered. BIN +60 KB assets/images/help/classroom/click-update-students-button.png Diff not rendered. BIN +127 KB assets/images/help/classroom/delete-classroom-click-delete-classroom-button.png Diff not rendered. BIN +104 KB assets/images/help/classroom/delete-classroom-modal-with-warning.png Diff not rendered. BIN +264 KB assets/images/help/classroom/ide-makecode-arcade-version-control-button.png Diff not rendered. BIN +69.4 KB assets/images/help/classroom/ide-replit-version-control-button.png Diff not rendered. BIN +234 KB assets/images/help/classroom/lms-github-classroom-credentials.png Diff not rendered. BIN +955 KB assets/images/help/classroom/probot-settings.gif Diff not rendered. BIN +113 KB assets/images/help/classroom/roster-hero.png Diff not rendered. BIN +40.4 KB assets/images/help/classroom/settings-click-rename-classroom-button.png Diff not rendered. BIN +41 KB assets/images/help/classroom/settings-type-classroom-name.png Diff not rendered. BIN +140 KB assets/images/help/classroom/setup-click-authorize-github-classroom.png Diff not rendered. BIN +102 KB assets/images/help/classroom/setup-click-authorize-github.png Diff not rendered. BIN +163 KB assets/images/help/classroom/setup-click-grant.png Diff not rendered. BIN +324 KB assets/images/help/classroom/students-click-delete-roster-button-in-modal.png Diff not rendered. BIN +91.1 KB assets/images/help/classroom/students-click-delete-roster-button.png Diff not rendered. BIN +48.2 KB assets/images/help/classroom/type-classroom-name.png Diff not rendered. BIN +174 KB assets/images/help/classroom/type-or-upload-student-identifiers.png Diff not rendered. BIN +83.3 KB assets/images/help/classroom/use-drop-down-then-click-archive.png Diff not rendered. BIN +45.2 KB assets/images/help/classroom/use-drop-down-then-click-unarchive.png Diff not rendered. BIN +55.4 KB assets/images/help/discussions/choose-new-category.png Diff not rendered. BIN +56.8 KB assets/images/help/discussions/click-delete-and-move-button.png Diff not rendered. BIN +59.7 KB assets/images/help/discussions/click-delete-discussion.png Diff not rendered. BIN +65.3 KB assets/images/help/discussions/click-delete-for-category.png Diff not rendered. BIN +68.9 KB assets/images/help/discussions/click-delete-this-discussion-button.png Diff not rendered. BIN +353 KB assets/images/help/discussions/click-discussion-in-list.png Diff not rendered. BIN +41 KB assets/images/help/discussions/click-edit-categories.png Diff not rendered. BIN +64.3 KB assets/images/help/discussions/click-edit-for-category.png Diff not rendered. BIN +60.2 KB assets/images/help/discussions/click-edit-pinned-discussion.png Diff not rendered. BIN +104 KB assets/images/help/discussions/click-new-category-button.png Diff not rendered. BIN +98.2 KB assets/images/help/discussions/click-pin-discussion-button.png Diff not rendered. BIN +55.7 KB assets/images/help/discussions/click-pin-discussion.png Diff not rendered. BIN +104 KB assets/images/help/discussions/click-save.png Diff not rendered. BIN +59.9 KB assets/images/help/discussions/click-transfer-discussion-button.png Diff not rendered. BIN +60.2 KB assets/images/help/discussions/click-transfer-discussion.png Diff not rendered. BIN +63.3 KB assets/images/help/discussions/click-unpin-discussion-button.png Diff not rendered. BIN +59.8 KB assets/images/help/discussions/click-unpin-discussion.png Diff not rendered. BIN +140 KB assets/images/help/discussions/comment-mark-as-answer-button.png Diff not rendered. BIN +136 KB assets/images/help/discussions/comment-marked-as-answer.png Diff not rendered. BIN +234 KB assets/images/help/discussions/customize-pinned-discussion.png Diff not rendered. BIN +1.21 MB assets/images/help/discussions/discussons-hero.png Diff not rendered. BIN +139 KB assets/images/help/discussions/edit-category-details.png Diff not rendered. BIN +136 KB assets/images/help/discussions/edit-existing-category-details.png Diff not rendered. BIN +55.5 KB assets/images/help/discussions/existing-category-click-save-changes-button.png Diff not rendered. BIN +680 KB assets/images/help/discussions/hero.png Diff not rendered. BIN +307 KB assets/images/help/discussions/most-helpful.png Diff not rendered. BIN +52.9 KB assets/images/help/discussions/new-category-click-create-button.png Diff not rendered. BIN +132 KB assets/images/help/discussions/new-discussion-button.png Diff not rendered. BIN +140 KB assets/images/help/discussions/new-discussion-select-category-dropdown-menu.png Diff not rendered. BIN +46.7 KB assets/images/help/discussions/new-discussion-start-discussion-button.png Diff not rendered. BIN +108 KB assets/images/help/discussions/new-discussion-title-and-body-fields.png Diff not rendered. BIN +23.1 KB assets/images/help/discussions/public-repo-settings.png Diff not rendered. BIN +49.5 KB assets/images/help/discussions/repository-discussions-tab.png Diff not rendered. BIN +51.8 KB assets/images/help/discussions/search-and-filter-controls.png Diff not rendered. BIN +44.4 KB assets/images/help/discussions/search-result.png Diff not rendered. BIN +35.4 KB assets/images/help/discussions/select-discussions-checkbox.png Diff not rendered. BIN +44.8 KB assets/images/help/discussions/setup-discussions-button.png Diff not rendered. BIN +95.9 KB assets/images/help/discussions/toggle-allow-users-with-read-access-checkbox.png Diff not rendered. BIN +73 KB assets/images/help/discussions/unanswered-discussion.png Diff not rendered. BIN +81.3 KB assets/images/help/discussions/use-choose-a-repository-drop-down.png Diff not rendered. BIN +30.3 KB assets/images/help/discussions/your-discussions.png Diff not rendered. BIN +563 KB assets/images/help/education/click-get-teacher-benefits.png Diff not rendered. BIN +116 KB assets/images/help/images/overview-actions-result-navigate.png Diff not rendered. BIN +150 KB assets/images/help/images/overview-actions-result-updated-2.png Diff not rendered. BIN +128 KB assets/images/help/images/workflow-graph-job.png Diff not rendered. BIN +135 KB assets/images/help/images/workflow-graph.png Diff not rendered. BIN +5.46 KB assets/images/help/organizations/update-profile-button.png Diff not rendered. BIN +44.6 KB assets/images/help/pull_requests/dependency-review-rich-diff.png Diff not rendered. BIN +24.6 KB assets/images/help/pull_requests/dependency-review-source-diff.png Diff not rendered. BIN +214 KB assets/images/help/pull_requests/dependency-review-vulnerability.png Diff not rendered. BIN +105 KB assets/images/help/pull_requests/file-filter-menu-json.png Diff not rendered. BIN +22.5 KB (510%) assets/images/help/pull_requests/pull-request-tabs-changed-files.png Diff not rendered. BIN +45.2 KB assets/images/help/repository/actions-delete-artifact-updated.png Diff not rendered. BIN +122 KB assets/images/help/repository/actions-failed-pester-test-updated.png Diff not rendered. BIN +45.4 KB assets/images/help/repository/artifact-drop-down-updated.png Diff not rendered. BIN +54.5 KB assets/images/help/repository/cancel-check-suite-updated.png Diff not rendered. BIN +120 KB assets/images/help/repository/copy-link-button-updated-2.png Diff not rendered. BIN +77.6 KB assets/images/help/repository/delete-all-logs-updated-2.png Diff not rendered. BIN +326 KB assets/images/help/repository/docker-action-workflow-run-updated.png Diff not rendered. BIN +84.6 KB assets/images/help/repository/download-logs-drop-down-updated-2.png Diff not rendered. BIN +170 KB assets/images/help/repository/in-progress-run.png Diff not rendered. BIN +124 KB assets/images/help/repository/javascript-action-workflow-run-updated-2.png Diff not rendered. BIN +116 KB assets/images/help/repository/passing-data-between-jobs-in-a-workflow-updated.png Diff not rendered. BIN +80.8 KB assets/images/help/repository/rerun-checks-drop-down-updated.png Diff not rendered. BIN +41.2 KB assets/images/help/repository/search-log-box-updated-2.png Diff not rendered. BIN +133 KB assets/images/help/repository/super-linter-workflow-results-updated-2.png Diff not rendered. BIN +97.5 KB assets/images/help/repository/superlinter-lint-code-base-job-updated.png Diff not rendered. BIN -128 KB assets/images/help/repository/upload-build-test-artifact.png Diff not rendered. BIN +27.5 KB (170%) assets/images/help/repository/view-run-billable-time.png Diff not rendered. BIN +54.8 KB assets/images/help/repository/workflow-run-kebab-horizontal-icon-updated-2.png Diff not rendered. BIN +7.54 KB assets/images/help/settings/appearance-tab.png Diff not rendered. BIN +39.7 KB assets/images/help/settings/theme-settings-radio-buttons.png Diff not rendered. BIN +11.1 KB assets/images/help/settings/update-theme-preference-button.png Diff not rendered. BIN +22.5 KB assets/images/help/sponsors/billing-account-switcher.png Diff not rendered. BIN +6.37 KB (150%) assets/images/help/sponsors/edit-sponsorship-payment-button.png Diff not rendered. BIN +34.8 KB assets/images/help/sponsors/link-account-button.png Diff not rendered. BIN +12.8 KB (170%) assets/images/help/sponsors/manage-your-sponsorship-button.png Diff not rendered. BIN +20.6 KB assets/images/help/sponsors/organization-update-email-textbox.png Diff not rendered. BIN +13.5 KB assets/images/help/sponsors/pay-prorated-amount-link.png Diff not rendered. BIN +34.7 KB assets/images/help/sponsors/select-an-account-drop-down.png Diff not rendered. BIN +17 KB assets/images/help/sponsors/sponsor-as-drop-down-menu.png Diff not rendered. BIN +15.8 KB assets/images/help/sponsors/sponsoring-as-drop-down-menu.png Diff not rendered. BIN +16.1 KB assets/images/help/sponsors/sponsoring-settings-button.png Diff not rendered. BIN +29.5 KB assets/images/help/sponsors/sponsoring-tab.png Diff not rendered. BIN +7.91 KB assets/images/help/sponsors/update-checkbox-manage.png Diff not rendered. BIN +43 KB (160%) assets/images/marketplace/marketplace-request-button.png Diff not rendered. BIN +53.6 KB assets/images/marketplace/marketplace_verified_creator_badges_apps.png Diff not rendered. 6 content/actions/creating-actions/creating-a-docker-container-action.md @@ -226,6 +226,10 @@ jobs: ``` {% endraw %} From your repository, click the **Actions** tab, and select the latest workflow run. You should see "Hello Mona the Octocat" or the name you used for the `who-to-greet` input and the timestamp printed in the log. From your repository, click the **Actions** tab, and select the latest workflow run. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}Under **Jobs** or in the visualization graph, click **A job to say hello**. {% endif %}You should see "Hello Mona the Octocat" or the name you used for the `who-to-greet` input and the timestamp printed in the log. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} 6 content/actions/creating-actions/creating-a-javascript-action.md @@ -261,9 +261,11 @@ jobs: ``` {% endraw %} From your repository, click the **Actions** tab, and select the latest workflow run. You should see "Hello Mona the Octocat" or the name you used for the `who-to-greet` input and the timestamp printed in the log. From your repository, click the **Actions** tab, and select the latest workflow run. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}Under **Jobs** or in the visualization graph, click **A job to say hello**. {% endif %}You should see "Hello Mona the Octocat" or the name you used for the `who-to-greet` input and the timestamp printed in the log. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.22" %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% elsif currentVersion ver_gt "enterprise-server@2.22" %}  {% else %}  4 content/actions/guides/about-packaging-with-github-actions.md @@ -25,7 +25,11 @@ Creating a package at the end of a continuous integration workflow can help duri Now, when reviewing a pull request, you'll be able to look at the workflow run and download the artifact that was produced. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} This will let you run the code in the pull request on your machine, which can help with debugging or testing the pull request. 4 content/actions/guides/building-and-testing-powershell.md @@ -60,7 +60,11 @@ jobs: * `run: Test-Path resultsfile.log` - Check whether a file called `resultsfile.log` is present in the repository's root directory. * `Should -Be $true` - Uses Pester to define an expected result. If the result is unexpected, then {% data variables.product.prodname_actions %} flags this as a failed test. For example: {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} * `Invoke-Pester Unit.Tests.ps1 -Passthru` - Uses Pester to execute tests defined in a file called `Unit.Tests.ps1`. For example, to perform the same test described above, the `Unit.Tests.ps1` will contain the following: ``` 7 content/actions/guides/storing-workflow-data-as-artifacts.md @@ -108,8 +108,6 @@ jobs: path: output/test/code-coverage.html ```  {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.22" %} ### Configuring a custom artifact retention period @@ -238,7 +236,12 @@ jobs: echo The result is $value ``` The workflow run will archive any artifacts that it generated. For more information on downloading archived artifacts, see "[Downloading workflow artifacts](/actions/managing-workflow-runs/downloading-workflow-artifacts)." {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} {% if currentVersion == "free-pro-team@latest" %} 8 content/actions/index.md @@ -68,18 +68,18 @@ versions: <h2 class="mb-2 font-mktg h1">Code examples</h2> <div class="pr-lg-3 mb-5 mt-3"> <input class="js-code-example-filter input-lg py-2 px-3 col-12 col-lg-8 form-control" placeholder="Search code examples" type="search" autocomplete="off" aria-label="Search code examples"/> <input class="js-filter-card-filter input-lg py-2 px-3 col-12 col-lg-8 form-control" placeholder="Search code examples" type="search" autocomplete="off" aria-label="Search code examples"/> </div> <div class="d-flex flex-wrap gutter"> {% render 'code-example-card' for actionsCodeExamples as example %} </div> <button class="js-code-example-show-more btn btn-outline float-right">Show more {% octicon "arrow-right" %}</button> <button class="js-filter-card-show-more btn btn-outline float-right">Show more {% octicon "arrow-right" %}</button> <div class="js-code-example-no-results d-none py-4 text-center text-gray font-mktg"> <div class="js-filter-card-no-results d-none py-4 text-center text-gray font-mktg"> <div class="mb-3">{% octicon "search" width="24" %}</div> <h3 class="text-normal">Sorry, there is no result for <strong class="js-code-example-filter-value"></strong></h3> <h3 class="text-normal">Sorry, there is no result for <strong class="js-filter-card-value"></strong></h3> <p class="my-3 f4">It looks like we don't have an example that fits your filter.<br>Try another filter or add your code example</p> <a href="https://github.com/github/docs/blob/main/data/variables/action_code_examples.yml">Learn how to add a code example {% octicon "arrow-right" %}</a> </div> 11 content/actions/learn-github-actions/introduction-to-github-actions.md @@ -204,7 +204,7 @@ In this diagram, you can see the workflow file you just created and how the {% d ### Viewing the job's activity Once your job has started running, you can view each step's activity on {% data variables.product.prodname_dotcom %}. Once your job has started running, you can {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}see a visualization graph of the run's progress and {% endif %}view each step's activity on {% data variables.product.prodname_dotcom %}. {% data reusables.repositories.navigate-to-repo %} 1. Under your repository name, click **Actions**. @@ -213,7 +213,14 @@ Once your job has started running, you can view each step's activity on {% data  1. Under "Workflow runs", click the name of the run you want to see.  {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.22" %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %} 1. Under **Jobs** or in the visualization graph, click the job you want to see.  {% endif %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %} 1. View the results of each step.  {% elsif currentVersion ver_gt "enterprise-server@2.22" %} 1. Click on the job name to see the results of each step.  {% else %} 7 content/actions/managing-workflow-runs/canceling-a-workflow.md @@ -17,9 +17,14 @@ versions: {% data reusables.repositories.navigate-to-repo %} {% data reusables.repositories.actions-tab %} {% data reusables.repositories.navigate-to-workflow %} {% data reusables.repositories.view-run %} 1. From the list of workflow runs, click the name of the `queued` or `in progress` run that you want to cancel.  1. In the upper-right corner of the workflow, click **Cancel workflow**. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} ### Steps {% data variables.product.prodname_dotcom %} takes to cancel a workflow run 4 content/actions/managing-workflow-runs/downloading-workflow-artifacts.md @@ -20,4 +20,8 @@ versions: {% data reusables.repositories.navigate-to-workflow %} {% data reusables.repositories.view-run %} 1. Under **Artifacts**, click the artifact you want to download. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} 1 content/actions/managing-workflow-runs/index.md @@ -18,6 +18,7 @@ versions: {% data reusables.actions.enterprise-beta %} {% data reusables.actions.enterprise-github-hosted-runners %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}{% link_in_list /using-the-visualization-graph %}{% endif %} {% link_in_list /viewing-workflow-run-history %} {% link_in_list /using-workflow-run-logs %} {% link_in_list /manually-running-a-workflow %} 3 content/actions/managing-workflow-runs/re-running-a-workflow.md @@ -16,5 +16,4 @@ versions: {% data reusables.repositories.actions-tab %} {% data reusables.repositories.navigate-to-workflow %} {% data reusables.repositories.view-run %} 1. In the upper-right corner of the workflow, use the **Re-run jobs** drop-down menu, and select **Re-run all jobs**.  1. In the upper-right corner of the workflow, use the **Re-run jobs** drop-down menu, and select **Re-run all jobs**.{% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}{% else %}{% endif %} 4 content/actions/managing-workflow-runs/removing-workflow-artifacts.md @@ -27,7 +27,11 @@ versions: {% data reusables.repositories.navigate-to-workflow %} {% data reusables.repositories.view-run %} 1. Under **Artifacts**, click {% octicon "trashcan" aria-label="The trashcan icon" %} next to the artifact you want to remove. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.22" %} ### Setting the retention period for an artifact 23 content/actions/managing-workflow-runs/using-the-visualization-graph.md @@ -0,0 +1,23 @@ --- title: Using the visualization graph intro: Every workflow run generates a real-time graph that illustrates the run progress. You can use this graph to monitor and debug workflows. product: '{% data reusables.gated-features.actions %}' versions: free-pro-team: '*' enterprise-server: '>=3.1' --- {% data reusables.actions.enterprise-beta %} {% data reusables.actions.visualization-beta %} {% data reusables.actions.enterprise-github-hosted-runners %} {% data reusables.repositories.navigate-to-repo %} {% data reusables.repositories.actions-tab %} {% data reusables.repositories.navigate-to-workflow %} {% data reusables.repositories.view-run %} 1. The graph displays each job in the workflow. An icon to the left of the job name indicates the status of the job. Lines between jobs indicate dependencies.  2. Click on a job to view the job log.  18 content/actions/managing-workflow-runs/using-workflow-run-logs.md @@ -45,7 +45,11 @@ You can search the build logs for a particular step. When you search logs, only {% data reusables.repositories.navigate-to-job-superlinter %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.22" %} 1. In the upper-right corner of the log output, in the **Search logs** search box, type a search query. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} {% else %} 1. To expand each step you want to include in your search, click the step.  @@ -63,8 +67,12 @@ You can download the log files from your workflow run. You can also download a w {% data reusables.repositories.view-run-superlinter %} {% data reusables.repositories.navigate-to-job-superlinter %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.22" %} 1. In the upper right corner, click {% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %} and select **Download log archive**. 1. In the upper right corner, click {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}{% octicon "gear" aria-label="The gear icon" %}{% else %}{% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %}{% endif %} and select **Download log archive**. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} {% else %} 1. In the upper right corner, click {% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %} and select **Download log archive**.  @@ -80,9 +88,17 @@ You can delete the log files from your workflow run. {% data reusables.repositor {% data reusables.repositories.view-run-superlinter %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@2.22" %} 1. In the upper right corner, click {% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %}. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} 2. To delete the log files, click the **Delete all logs** button and review the confirmation prompt. {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %}  {% else %}  {% endif %} After deleting logs, the **Delete all logs** button is removed to indicate that no log files remain in the workflow run. {% else %} 1. In the upper right corner, click {% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %}. 2 content/actions/managing-workflow-runs/viewing-job-execution-time.md @@ -15,7 +15,7 @@ Billable job execution minutes are only shown for jobs run on private repositori {% data reusables.repositories.actions-tab %} {% data reusables.repositories.navigate-to-workflow %} {% data reusables.repositories.view-run %} 1. Under the job summary, you can view the job's execution time. To view the billable job execution time, click **Run and billable time details**. 1. Under the job summary, you can view the job's execution time. To view details about the billable job execution time, click the time under **Billable time**.  {% note %} 5 content/actions/quickstart.md @@ -60,8 +60,13 @@ Committing the workflow file in your repository triggers the `push` event and ru {% data reusables.repositories.actions-tab %} {% data reusables.repositories.navigate-to-workflow-superlinter %} {% data reusables.repositories.view-run-superlinter %} {% if currentVersion == "free-pro-team@latest" or currentVersion ver_gt "enterprise-server@3.0" %} 1. Under **Jobs** or in the visualization graph, click the **Lint code base** job.  {% else %} 1. In the left sidebar, click the **Lint code base** job.  {% endif %} {% data reusables.repositories.view-failed-job-results-superlinter %} ### More starter workflows 49 content/developers/github-marketplace/about-github-marketplace.md @@ -1,6 +1,6 @@ --- title: About GitHub Marketplace intro: 'Learn the basics to prepare your app for review before joining {% data variables.product.prodname_marketplace %}.' intro: 'Learn about {% data variables.product.prodname_marketplace %} where you can share your apps and actions publicly with all {% data variables.product.product_name %} users.' redirect_from: - /apps/marketplace/getting-started/ - /marketplace/getting-started @@ -14,52 +14,41 @@ versions: {% data reusables.actions.actions-not-verified %} To learn about publishing {% data variables.product.prodname_actions %} in the {% data variables.product.prodname_marketplace %}, see "[Publishing actions in GitHub Marketplace](/actions/creating-actions/publishing-actions-in-github-marketplace)." To learn about publishing {% data variables.product.prodname_actions %} in {% data variables.product.prodname_marketplace %}, see "[Publishing actions in GitHub Marketplace](/actions/creating-actions/publishing-actions-in-github-marketplace)." ### Apps You can list verified and unverified apps in {% data variables.product.prodname_marketplace %}. Unverified apps do not go through the security, testing, and verification cycle {% data variables.product.prodname_dotcom %} requires for verified apps. Anyone can share their apps with other users on {% data variables.product.prodname_marketplace %} but only listings that are verified by {% data variables.product.company_short %} can include paid plans. For more information, see "[About verified creators](/developers/github-marketplace/about-verified-creators)." Verified apps have a green badge in {% data variables.product.prodname_marketplace %}. Unverified apps have a grey badge next to their listing and are only available as free apps. If you're interested in creating an app for {% data variables.product.prodname_marketplace %}, but you're new to {% data variables.product.prodname_github_apps %} or {% data variables.product.prodname_oauth_app %}s, see "[Building {% data variables.product.prodname_github_apps %}](/developers/apps/building-github-apps)" or "[Building {% data variables.product.prodname_oauth_app %}s](/developers/apps/building-oauth-apps)."  If you're interested in creating an app for {% data variables.product.prodname_marketplace %}, but you're new to {% data variables.product.prodname_github_apps %} and {% data variables.product.prodname_oauth_app %}s, see "[Building apps](/apps/)." {% data reusables.marketplace.github_apps_preferred %}, although you can list both OAuth and {% data variables.product.prodname_github_app %}s in {% data variables.product.prodname_marketplace %}. See "[Differences between GitHub and OAuth apps](/apps/differences-between-apps/)" for more details. To learn more about switching from OAuth to {% data variables.product.prodname_github_apps %}, see [Migrating OAuth Apps to {% data variables.product.prodname_github_app %}s](/apps/migrating-oauth-apps-to-github-apps/). {% data reusables.marketplace.github_apps_preferred %}, although you can list both OAuth and {% data variables.product.prodname_github_app %}s in {% data variables.product.prodname_marketplace %}. For more information, see "[Differences between {% data variables.product.prodname_github_apps %} and {% data variables.product.prodname_oauth_app %}s](/apps/differences-between-apps/)" and "[Migrating {% data variables.product.prodname_oauth_app %}s to {% data variables.product.prodname_github_apps %}](/apps/migrating-oauth-apps-to-github-apps/)." If you have questions about {% data variables.product.prodname_marketplace %}, please contact {% data variables.contact.contact_support %} directly. #### Unverified Apps Unverified apps do not need to meet the "[Requirements for listing an app on {% data variables.product.prodname_marketplace %}](/marketplace/getting-started/requirements-for-listing-an-app-on-github-marketplace/)" or go through the "[Security review process](/marketplace/getting-started/security-review-process/)". {% data reusables.marketplace.unverified-apps %} Having a published paid plan will prevent you from being able to submit an unverified app. You must remove paid plans or keep them in draft mode before publishing an unverified app. To list your unverified app in {% data variables.product.prodname_marketplace %}, you only need to create a "[Listing on {% data variables.product.prodname_marketplace %}](/marketplace/listing-on-github-marketplace/)" and submit it as an unverified listing. {% data reusables.marketplace.launch-with-free %} ### Publishing an app to {% data variables.product.prodname_marketplace %} #### Verified Apps When you have finished creating your app, you can share it with other users by publishing it to {% data variables.product.prodname_marketplace %}. In summary, the process is: If you've already built an app and you're interested in submitting a verified listing in {% data variables.product.prodname_marketplace %}, start here: 1. Review your app carefully to ensure that it will behave as expected in other repositories and that it follows best practice guidelines. For more information, see "[Security best practices for apps](/developers/github-marketplace/security-best-practices-for-apps)" and "[Requirements for listing an app](/developers/github-marketplace/requirements-for-listing-an-app#best-practice-for-customer-experience)." 1. [Getting started with {% data variables.product.prodname_marketplace %}](/marketplace/getting-started/)<br/>Learn about requirements, guidelines, and the app submission process. 1. Add webhook events to the app to track user billing requests. For more information about the {% data variables.product.prodname_marketplace %} API, webhook events, and billing requests, see "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." 1. [Integrating with the {% data variables.product.prodname_marketplace %} API](/marketplace/integrating-with-the-github-marketplace-api/)<br/>Before you can list your app on {% data variables.product.prodname_marketplace %}, you'll need to integrate billing flows using the {% data variables.product.prodname_marketplace %} API and webhook events. 1. Create a draft {% data variables.product.prodname_marketplace %} listing. For more information, see "[Drafting a listing for your app](/developers/github-marketplace/drafting-a-listing-for-your-app)." 1. [Listing on {% data variables.product.prodname_marketplace %}](/marketplace/listing-on-github-marketplace/) <br/>Create a draft {% data variables.product.prodname_marketplace %} listing, configure webhook settings, and set up pricing plans. 1. Add a pricing plan. For more information, see "[Setting pricing plans for your listing](/developers/github-marketplace/setting-pricing-plans-for-your-listing)." 1. [Selling your app](/marketplace/selling-your-app/)<br/>Learn about pricing plans, billing cycles, and how to receive payment from {% data variables.product.prodname_dotcom %} for your app. 1. Check whether your app meets the requirements for listing on {% data variables.product.prodname_marketplace %} as a free or a paid app. For more information, see "[Requirements for listing an app](/developers/github-marketplace/requirements-for-listing-an-app)." 1. [{% data variables.product.prodname_marketplace %} Insights](/marketplace/github-marketplace-insights/)<br/>See how your app is performing in {% data variables.product.prodname_marketplace %}. You can use metrics collected by {% data variables.product.prodname_dotcom %} to guide your marketing campaign and be successful in {% data variables.product.prodname_marketplace %}. 1. Read and accept the terms of the "[{% data variables.product.prodname_marketplace %} Developer Agreement](/articles/github-marketplace-developer-agreement/)." 1. [{% data variables.product.prodname_marketplace %} transactions](/marketplace/github-marketplace-transactions/)<br/>Download and view transaction data for your {% data variables.product.prodname_marketplace %} listing. 1. Submit your listing for publication in {% data variables.product.prodname_marketplace %}, requesting verification if you want to sell the app. For more information, see "[Submitting your listing for publication](/developers/github-marketplace/submitting-your-listing-for-publication)." ### Reviewing your app An onboarding expert will contact you with any questions or further steps. For example, if you have added a paid plan, you will need to complete the verification process and complete financial onboarding. As soon as your listing is approved the app is published to {% data variables.product.prodname_marketplace %}. We want to make sure that the apps offered on {% data variables.product.prodname_marketplace %} are safe, secure, and well tested. The {% data variables.product.prodname_marketplace %} onboarding specialists will review your app to ensure that it meets all requirements. Follow the guidelines in these articles before submitting your app: ### Seeing how your app is performing You can access metrics and transactions for your listing. For more information, see: * [Requirements for listing an app on {% data variables.product.prodname_marketplace %}](/marketplace/getting-started/requirements-for-listing-an-app-on-github-marketplace/) * [Security review process](/marketplace/getting-started/security-review-process/) - "[Viewing metrics for your listing](/developers/github-marketplace/viewing-metrics-for-your-listing)" - "[Viewing transactions for your listing](/developers/github-marketplace/viewing-transactions-for-your-listing)" 43 content/developers/github-marketplace/about-verified-creators.md @@ -0,0 +1,43 @@ --- title: About verified creators intro: 'Each organization that wants to sell apps on {% data variables.product.prodname_marketplace %} must follow a verification process. Their identity is checked and their billing process reviewed.' versions: free-pro-team: '*' --- ### About verified creators A verified creator is an organization that {% data variables.product.company_short %} has checked. Anyone can share their apps with other users on {% data variables.product.prodname_marketplace %} but only organizations that are verified by {% data variables.product.company_short %} can sell apps. For more information about organizations, see "[About organizations](/github/setting-up-and-managing-organizations-and-teams/about-organizations)." The verification process aims to protect users. For example, it verifies the seller's identity, checks that their {% data variables.product.product_name %} organization is set up securely, and that they can be contacted for support. After passing the verification checks, any apps that the organization lists on {% data variables.product.prodname_marketplace %} are shown with a verified creator badge {% octicon "verified" aria-label="Verified creator badge" %}. The organization can now add paid plans to any of their apps. Each app with a paid plan also goes through a financial onboarding process to check that it's set up to handle billing correctly.  In addition to the verified creator badge, you'll also see badges for unverified and verified apps. These apps were published using the old method for verifying individual apps.  For information on finding apps to use, see "[Searching {% data variables.product.prodname_marketplace %}](/github/searching-for-information-on-github/searching-github-marketplace)." ### About the verification process The first time you request verification for a listing of one of your apps, you will enter the verification process. An onboarding expert will guide you through the process. This includes checking: - Profile information - The basic profile information is populated accurately and appropriately. - Security - The organization has enabled two-factor authentication. - Verified domain - The organization has verified the domain of the site URL. - Purchase webhook event - The event is handled correctly by the app. When your organization is verified, all your apps are shown with a verified creator badge. You are now able to offer paid plans for any of your apps. For more information about the requirements for listing an app on {% data variables.product.prodname_marketplace %}, see "[Requirements for listing an app on {% data variables.product.prodname_marketplace %}](/marketplace/getting-started/requirements-for-listing-an-app-on-github-marketplace/)." {% data reusables.marketplace.app-transfer-to-org-for-verification %} For information on how to do this, see: "[Submitting your listing for publication](/developers/github-marketplace/submitting-your-listing-for-publication#transferring-an-app-to-an-organization-before-you-submit)." {% note %} **Note:** This verification process for apps replaces the previous process where individual apps were verified. The current process is similar to the verification process for actions. If you have apps that were verified under the old process, these will not be affected by the changes. The {% data variables.product.prodname_marketplace %} team will contact you with details of how to migrate to organization-based verification. {% endnote %} 12 content/developers/github-marketplace/billing-customers.md @@ -13,17 +13,17 @@ versions: ### Understanding the billing cycle Customers can choose a monthly or yearly billing cycle when they purchase your app. All changes customers make to the billing cycle and plan selection will trigger a `marketplace_purchase` event. You can refer to the `marketplace_purchase` webhook payload to see which billing cycle a customer selects and when the next billing date begins (`effective_date`). For more information about webhook payloads, see "[{% data variables.product.prodname_marketplace %} webhook events](/marketplace/integrating-with-the-github-marketplace-api/github-marketplace-webhook-events/)." Customers can choose a monthly or yearly billing cycle when they purchase your app. All changes customers make to the billing cycle and plan selection will trigger a `marketplace_purchase` event. You can refer to the `marketplace_purchase` webhook payload to see which billing cycle a customer selects and when the next billing date begins (`effective_date`). For more information about webhook payloads, see "[Webhook events for the {% data variables.product.prodname_marketplace %} API](/developers/github-marketplace/webhook-events-for-the-github-marketplace-api)." ### Providing billing services in your app's UI Customers must be able to perform the following actions from your app's website: - Customers must be able to modify or cancel their {% data variables.product.prodname_marketplace %} plans for personal and organizational accounts separately. Customers should be able to perform the following actions from your app's website: - Customers should be able to modify or cancel their {% data variables.product.prodname_marketplace %} plans for personal and organizational accounts separately. {% data reusables.marketplace.marketplace-billing-ui-requirements %} ### Billing services for upgrades, downgrades, and cancellations Follow these guidelines for upgrades, downgrades, and cancellations to maintain a clear and consistent billing process. For more detailed instructions about the {% data variables.product.prodname_marketplace %} purchase events, see "[Billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows)." Follow these guidelines for upgrades, downgrades, and cancellations to maintain a clear and consistent billing process. For more detailed instructions about the {% data variables.product.prodname_marketplace %} purchase events, see "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." You can use the `marketplace_purchase` webhook's `effective_date` key to determine when a plan change will occur and periodically synchronize the [List accounts for a plan](/rest/reference/apps#list-accounts-for-a-plan). @@ -33,7 +33,7 @@ When a customer upgrades their pricing plan or changes their billing cycle from {% data reusables.marketplace.marketplace-failed-purchase-event %} For information about building upgrade and downgrade workflows into your app, see "[Upgrading and downgrading plans](/marketplace/integrating-with-the-github-marketplace-api/upgrading-and-downgrading-plans/)." For information about building upgrade and downgrade workflows into your app, see "[Handling plan changes](/developers/github-marketplace/handling-plan-changes)." #### Downgrades and cancellations @@ -45,4 +45,4 @@ When a customer cancels a plan, you must: {% data reusables.marketplace.cancellation-clarification %} - Enable them to upgrade the plan through GitHub if they would like to continue the plan at a later time. For information about building cancellation workflows into your app, see "[Cancelling plans](/marketplace/integrating-with-the-github-marketplace-api/cancelling-plans/)." For information about building cancellation workflows into your app, see "[Handling plan cancellations](/developers/github-marketplace/handling-plan-cancellations)." 20 ...nt/developers/github-marketplace/customer-experience-best-practices-for-apps.md @@ -0,0 +1,20 @@ --- title: Customer experience best practices for apps intro: 'Guidelines for creating an app that will be easy to use and understand.' shortTitle: Customer experience best practice versions: free-pro-team: '*' --- If you follow these best practices it will help you to provide a good customer experience. ### Customer communication - Marketing materials for the app should accurately represent the app's behavior. - Apps should include links to user-facing documentation that describe how to set up and use the app. - Customers should be able to see what type of plan they have in the billing, profile, or account settings section of the app. - Customers should be able to install and use your app on both a personal account and an organization account. They should be able to view and manage the app on those accounts separately. ### Plan management {% data reusables.marketplace.marketplace-billing-ui-requirements %} 4 content/developers/github-marketplace/drafting-a-listing-for-your-app.md @@ -59,8 +59,8 @@ Once you've created a {% data variables.product.prodname_marketplace %} draft li ### Submitting your app Once you've completed your {% data variables.product.prodname_marketplace %} listing, you can submit your listing for review from the **Overview** page. You'll need to read and accept the "[{% data variables.product.prodname_marketplace %} Developer Agreement](/articles/github-marketplace-developer-agreement/)," and then you can click **Submit for review**. After you submit your app for review, the {% data variables.product.prodname_marketplace %} onboarding team will contact you with additional information about the onboarding process. You can learn more about the onboarding and security review process in "[Getting started with {% data variables.product.prodname_marketplace %}](/marketplace/getting-started/)." Once you've completed your {% data variables.product.prodname_marketplace %} listing, you can submit your listing for review from the **Overview** page. You'll need to read and accept the "[{% data variables.product.prodname_marketplace %} Developer Agreement](/articles/github-marketplace-developer-agreement/)," and then you can click **Submit for review**. After you submit your app for review, an onboarding expert will contact you with additional information about the onboarding process. You can learn more about the onboarding and security review process in "[Getting started with {% data variables.product.prodname_marketplace %}](/marketplace/getting-started/)." ### Removing a {% data variables.product.prodname_marketplace %} listing If you no longer want to list your app in {% data variables.product.prodname_marketplace %}, contact [marketplace@github.com](mailto:marketplace@github.com) to remove your listing. If you no longer want to list your app in {% data variables.product.prodname_marketplace %}, contact {% data variables.contact.contact_support %} to remove your listing. 2 content/developers/github-marketplace/handling-new-purchases-and-free-trials.md @@ -28,7 +28,7 @@ GitHub then sends the [`marketplace_purchase`](/webhooks/event-payloads/#marketp Read the `effective_date` and `marketplace_purchase` object from the `marketplace_purchase` webhook to determine which plan the customer purchased, when the billing cycle starts, and when the next billing cycle begins. If your app offers a free trial, read the `marketplace_purchase[on_free_trial]` attribute from the webhook. If the value is `true`, your app will need to track the free trial start date (`effective_date`) and the date the free trial ends (`free_trial_ends_on`). Use the `free_trial_ends_on` date to display the remaining days left in a free trial in your app's UI. You can do this in either a banner or in your [billing UI](/marketplace/selling-your-app/billing-customers-in-github-marketplace/#providing-billing-services-in-your-apps-ui). To learn how to handle cancellations before a free trial ends, see "[Cancelling plans](/marketplace/integrating-with-the-github-marketplace-api/cancelling-plans/)." See "[Upgrading and downgrading plans](/marketplace/integrating-with-the-github-marketplace-api/upgrading-and-downgrading-plans/)" to find out how to transition a free trial to a paid plan when a free trial expires. If your app offers a free trial, read the `marketplace_purchase[on_free_trial]` attribute from the webhook. If the value is `true`, your app will need to track the free trial start date (`effective_date`) and the date the free trial ends (`free_trial_ends_on`). Use the `free_trial_ends_on` date to display the remaining days left in a free trial in your app's UI. You can do this in either a banner or in your [billing UI](/marketplace/selling-your-app/billing-customers-in-github-marketplace/#providing-billing-services-in-your-apps-ui). To learn how to handle cancellations before a free trial ends, see "[Handling plan cancellations](/developers/github-marketplace/handling-plan-cancellations)." See "[Handling plan changes](/developers/github-marketplace/handling-plan-changes)" to find out how to transition a free trial to a paid plan when a free trial expires. See "[{% data variables.product.prodname_marketplace %} webhook events](/marketplace/integrating-with-the-github-marketplace-api/github-marketplace-webhook-events/)" for an example of the `marketplace_purchase` event payload. 6 content/developers/github-marketplace/index.md @@ -11,8 +11,10 @@ versions: {% topic_link_in_list /creating-apps-for-github-marketplace %} {% link_in_list /about-github-marketplace %} {% link_in_list /about-verified-creators %} {% link_in_list /requirements-for-listing-an-app %} {% link_in_list /security-review-process-for-submitted-apps %} {% link_in_list /security-best-practices-for-apps %} {% link_in_list /customer-experience-best-practices-for-apps %} {% link_in_list /viewing-metrics-for-your-listing %} {% link_in_list /viewing-transactions-for-your-listing %} {% topic_link_in_list /using-the-github-marketplace-api-in-your-app %} @@ -27,7 +29,7 @@ versions: {% link_in_list /writing-a-listing-description-for-your-app %} {% link_in_list /setting-pricing-plans-for-your-listing %} {% link_in_list /configuring-a-webhook-to-notify-you-of-plan-changes %} {% link_in_list /submitting-your-listing-for-review %} {% link_in_list /submitting-your-listing-for-publication %} {% topic_link_in_list /selling-your-app-on-github-marketplace %} {% link_in_list /pricing-plans-for-github-marketplace-apps %} {% link_in_list /billing-customers %} 32 content/developers/github-marketplace/pricing-plans-for-github-marketplace-apps.md @@ -10,35 +10,45 @@ versions: {% data variables.product.prodname_marketplace %} pricing plans can be free, flat rate, or per-unit, and GitHub lists the price in US dollars. Customers purchase your app using a payment method attached to their {% data variables.product.product_name %} account, without having to leave GitHub.com. You don't have to write code to perform billing transactions, but you will have to handle [billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows) for purchase events. {% data variables.product.prodname_marketplace %} pricing plans can be free, flat rate, or per-unit. Prices are set, displayed, and processed in US dollars. Paid plans are restricted to verified listings. Customers purchase your app using a payment method attached to their {% data variables.product.product_name %} account, without having to leave {% data variables.product.prodname_dotcom_the_website %}. You don't have to write code to perform billing transactions, but you will have to handle events from the {% data variables.product.prodname_marketplace %} API. For more information, see "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." If the app you're listing on {% data variables.product.prodname_marketplace %} has multiple plan options, you can set up corresponding pricing plans. For example, if your app has two plan options, an open source plan and a pro plan, you can set up a free pricing plan for your open source plan and a flat pricing plan for your pro plan. Each {% data variables.product.prodname_marketplace %} listing must have an annual and a monthly price for every plan that's listed. For more information on how to create a pricing plan, see "[Setting a {% data variables.product.prodname_marketplace %} listing's pricing plan](/marketplace/listing-on-github-marketplace/setting-a-github-marketplace-listing-s-pricing-plan/)." {% note %} {% data reusables.marketplace.free-plan-note %} **Note:** If you're listing an app on {% data variables.product.prodname_marketplace %}, you can't list your app with a free pricing plan if you offer a paid service outside of {% data variables.product.prodname_marketplace %}. ### Types of pricing plans {% endnote %} #### Free pricing plans ### Types of pricing plans {% data reusables.marketplace.free-apps-encouraged %} Free plans are completely free for users. If you set up a free pricing plan, you cannot charge users that choose the free pricing plan for the use of your app. You can create both free and paid plans for your listing. All apps need to handle events for new purchases and cancellations. Apps that only have free plans do not need to handle events for free trials, upgrades, and downgrades. For more information, see: "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." If you add a paid plan to an app that you've already listed in {% data variables.product.prodname_marketplace %} as a free service, you'll need to request verification for the app and go through financial onboarding. #### Paid pricing plans **Free pricing plans** are completely free for users. If you set up a free pricing plan, you cannot charge users that choose the free pricing plan for the use of your app. You can create both free and paid plans for your listing. Unverified free apps do not need to implement any billing flows. Free apps that are verified by Github need to implement billing flows for new purchases and cancellations, but do not need to implement billing flows for free trials, upgrades, and downgrades. If you add a paid plan to an app that you've already listed in {% data variables.product.prodname_marketplace %} as a free service, you'll need to resubmit the app for review. There are two types of paid pricing plan: **Flat rate pricing plans** charge a set fee on a monthly and yearly basis. - Flat rate pricing plans charge a set fee on a monthly and yearly basis. **Per-unit pricing plans** charge a set fee on either a monthly or yearly basis for a unit that you specify. A "unit" can be anything you'd like (for example, a user, seat, or person). - Per-unit pricing plans charge a set fee on either a monthly or yearly basis for a unit that you specify. A "unit" can be anything you'd like (for example, a user, seat, or person). **Marketplace free trials** provide 14-day free trials of OAuth or GitHub Apps to customers. When you [set up a Marketplace pricing plan](/marketplace/listing-on-github-marketplace/setting-a-github-marketplace-listing-s-pricing-plan/), you can select the option to provide a free trial for flat-rate or per-unit pricing plans. You may also want to offer free trials. These provide free, 14-day trials of OAuth or GitHub Apps to customers. When you set up a Marketplace pricing plan, you can select the option to provide a free trial for flat-rate or per-unit pricing plans. ### Free trials Customers can start a free trial for any available paid plan on a Marketplace listing, but will not be able to create more than one free trial for a Marketplace product. Customers can start a free trial for any paid plan on a Marketplace listing that includes free trials. However, customers cannot create more than one free trial per marketplace product. Free trials have a fixed length of 14 days. Customers are notified 4 days before the end of their trial period (on day 11 of the free trial) that their plan will be upgraded. At the end of a free trial, customers will be auto-enrolled into the plan they are trialing if they do not cancel. See "[New purchases and free trials](/marketplace/integrating-with-the-github-marketplace-api/handling-new-purchases-and-free-trials/)" for details on how to handle free trials in your app. For more information, see: "[Handling new purchases and free trials](/developers/github-marketplace/integrating-with-the-github-marketplace-api/handling-new-purchases-and-free-trials/)." {% note %} 61 content/developers/github-marketplace/requirements-for-listing-an-app.md @@ -1,6 +1,6 @@ --- title: Requirements for listing an app intro: 'Apps on {% data variables.product.prodname_marketplace %} must meet the requirements outlined on this page before our {% data variables.product.prodname_marketplace %} onboarding specialists will approve the listing.' intro: 'Apps on {% data variables.product.prodname_marketplace %} must meet the requirements outlined on this page before the listing can be published.' redirect_from: - /apps/adding-integrations/listing-apps-on-github-marketplace/requirements-for-listing-an-app-on-github-marketplace/ - /apps/marketplace/listing-apps-on-github-marketplace/requirements-for-listing-an-app-on-github-marketplace/ @@ -12,49 +12,62 @@ versions: free-pro-team: '*' --- <!--UI-LINK: Displayed as a link on the https://github.com/marketplace/new page.--> The requirements for listing an app on {% data variables.product.prodname_marketplace %} vary according to whether you want to offer a free or a paid app. Before you submit your app for review, you must read and accept the terms of the "[{% data variables.product.prodname_marketplace %} Developer Agreement](/articles/github-marketplace-developer-agreement/)." You'll accept the terms within your [draft listing](/marketplace/listing-on-github-marketplace/creating-a-draft-github-marketplace-listing/) on {% data variables.product.product_name %}. Once you've submitted your app, one of the {% data variables.product.prodname_marketplace %} onboarding specialists will reach out to you with more information about the onboarding process, and review your app to ensure it meets these requirements: ### Requirements for all {% data variables.product.prodname_marketplace %} listings ### User experience All listings on {% data variables.product.prodname_marketplace %} should be for tools that provide value to the {% data variables.product.product_name %} community. When you submit your listing for publication, you must read and accept the terms of the "[{% data variables.product.prodname_marketplace %} Developer Agreement](/articles/github-marketplace-developer-agreement/)." - {% data variables.product.prodname_github_app %}s should have a minimum of 100 installations. - {% data variables.product.prodname_oauth_app %}s should have a minimum of 200 users. #### User experience requirements for all apps All listings should meet the following requirements, regardless of whether they are for a free or paid app. - Listings must not actively persuade users away from {% data variables.product.product_name %}. - Listings must include valid contact information for the publisher. - Listings must have a relevant description of the application. - Listings must specify a pricing plan. - Apps must provide value to customers and integrate with the platform in some way beyond authentication. - Apps must be publicly available in {% data variables.product.prodname_marketplace %} and cannot be in beta or available by invite only. - Apps cannot actively persuade users away from {% data variables.product.product_name %}. - Marketing materials for the app must accurately represent the app's behavior. - Apps must include links to user-facing documentation that describe how to set up and use the app. - When a customer purchases an app and GitHub redirects them to the app's installation URL, the app must begin the OAuth flow immediately. For details, see "[Handling new purchases and free trials](/marketplace/integrating-with-the-github-marketplace-api/handling-new-purchases-and-free-trials/#step-3-authorization)." - Apps must have webhook events set up to notify the publisher of any plan changes or cancellations using the {% data variables.product.prodname_marketplace %} API. For more information, see "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." - Customers must be able to install your app and select repositories on both a personal and organization account. They should be able to view and manage those accounts separately. For more information on providing a good customer experience, see "[Customer experience best practices for apps](/developers/github-marketplace/customer-experience-best-practices-for-apps)." ### Brand and listing #### Brand and listing requirements for all apps - Apps that use GitHub logos must follow the "[{% data variables.product.product_name %} Logos and Usage](https://github.com/logos)" guidelines. - Apps that use GitHub logos must follow the {% data variables.product.company_short %} guidelines. For more information, see "[{% data variables.product.company_short %} Logos and Usage](https://github.com/logos)." - Apps must have a logo, feature card, and screenshots images that meet the recommendations provided in "[Writing {% data variables.product.prodname_marketplace %} listing descriptions](/marketplace/listing-on-github-marketplace/writing-github-marketplace-listing-descriptions/)." - Listings must include descriptions that are well written and free of grammatical errors. For guidance in writing your listing, see "[Writing {% data variables.product.prodname_marketplace %} listing descriptions](/marketplace/listing-on-github-marketplace/writing-github-marketplace-listing-descriptions/)." ### Security To protect your customers, we recommend that you also follow security best practices. For more information, see "[Security best practices for apps](/developers/github-marketplace/security-best-practices-for-apps)." ### Considerations for free apps Apps will go through a security review before being listed on {% data variables.product.prodname_marketplace %}. A successful review will meet the requirements and follow the security best practices listed in "[Security review process](/marketplace/getting-started/security-review-process/)." For information on the review process, contact [marketplace@github.com](mailto:marketplace@github.com). {% data reusables.marketplace.free-apps-encouraged %} ### Requirements for paid apps In addition to the requirements for all apps above, each app that you offer as a paid service on {% data variables.product.prodname_marketplace %} must also meet the following requirements: - {% data variables.product.prodname_github_app %}s should have a minimum of 100 installations. - {% data variables.product.prodname_oauth_app %}s should have a minimum of 200 users. - All paid apps must handle {% data variables.product.prodname_marketplace %} purchase events for new purchases, upgrades, downgrades, cancellations, and free trials. For more information, see "[Billing requirements for paid apps](#billing-requirements-for-paid-apps)" below. - Publishing organizations must have a verified domain and must enable two-factor authentication. For more information, see "[Requiring two-factor authentication in your organization](/github/setting-up-and-managing-organizations-and-teams/requiring-two-factor-authentication-in-your-organization.") ### Billing flows When you are ready to publish the app on {% data variables.product.prodname_marketplace %} you must request verification for the listing. Your app must integrate [billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows) using the [{% data variables.product.prodname_marketplace %} webhook event](/marketplace/integrating-with-the-github-marketplace-api/github-marketplace-webhook-events/). {% note %} #### Free apps The verification process is open to organizations. {% data reusables.marketplace.app-transfer-to-org-for-verification %} For information on how to do this, see: "[Submitting your listing for publication](/developers/github-marketplace/submitting-your-listing-for-publication#transferring-an-app-to-an-organization-before-you-submit)." {% data reusables.marketplace.free-apps-encouraged %} If you are listing a free app, you'll need to meet these requirements: {% endnote %} - Customers must be able to see that they have a free plan in the billing, profile, or account settings section of the app. - When a customer cancels your app, you must follow the flow for [cancelling plans](/marketplace/integrating-with-the-github-marketplace-api/cancelling-plans/). ### Billing requirements for paid apps #### Paid apps Your app does not need to handle payments but does need to use {% data variables.product.prodname_marketplace %} purchase events to manage new purchases, upgrades, downgrades, cancellations, and free trials. For information about how integrate these events into your app, see "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." To offer your app as a paid service, you'll need to meet these requirements to list your app on {% data variables.product.prodname_marketplace %}: Using GitHub's billing API allows customers to purchase an app without leaving GitHub and to pay for the service with the payment method already attached to their {% data variables.product.product_name %} account. - To sell your app in {% data variables.product.prodname_marketplace %}, it must use GitHub's billing system. Your app does not need to handle payments but does need to use "[{% data variables.product.prodname_marketplace %} purchase events](/marketplace/integrating-with-the-github-marketplace-api/github-marketplace-webhook-events/)" to manage new purchases, upgrades, downgrades, cancellations, and free trials. See "[Billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows)" to learn about how to integrate these events into your app. Using GitHub's billing system allows customers to purchase an app without leaving GitHub and pay for the service with the payment method already attached to their {% data variables.product.product_name %} account. - Apps must support both monthly and annual billing for paid subscriptions purchases. - Listings may offer any combination of free and paid plans. Free plans are optional but encouraged. For more information, see "[Setting a {% data variables.product.prodname_marketplace %} listing's pricing plan](/marketplace/listing-on-github-marketplace/setting-a-github-marketplace-listing-s-pricing-plan/)." {% data reusables.marketplace.marketplace-billing-ui-requirements %} 60 content/developers/github-marketplace/security-best-practices-for-apps.md @@ -0,0 +1,60 @@ --- title: Security best practices for apps intro: 'Guidelines for preparing a secure app to share on {% data variables.product.prodname_marketplace %}.' redirect_from: - /apps/marketplace/getting-started/security-review-process/ - /marketplace/getting-started/security-review-process - /developers/github-marketplace/security-review-process-for-submitted-apps shortTitle: Security best practice versions: free-pro-team: '*' --- If you follow these best practices it will help you to provide a secure user experience. ### Authorization, authentication, and access control We recommend creating a GitHub App rather than an OAuth App. {% data reusables.marketplace.github_apps_preferred %}. See "[Differences between GitHub Apps and OAuth Apps](/apps/differences-between-apps/)" for more details. - Apps should use the principle of least privilege and should only request the OAuth scopes and GitHub App permissions that the app needs to perform its intended functionality. For more information, see [Principle of least privilege](https://en.wikipedia.org/wiki/Principle_of_least_privilege) in Wikipedia. - Apps should provide customers with a way to delete their account, without having to email or call a support person. - Apps should not share tokens between different implementations of the app. For example, a desktop app should have a separate token from a web-based app. Individual tokens allow each app to request the access needed for GitHub resources separately. - Design your app with different user roles, depending on the functionality needed by each type of user. For example, a standard user should not have access to admin functionality, and billing managers might not need push access to repository code. - Apps should not share service accounts such as email or database services to manage your SaaS service. - All services used in your app should have unique login and password credentials. - Admin privilege access to the production hosting infrastructure should only be given to engineers and employees with administrative duties. - Apps should not use personal access tokens to authenticate and should authenticate as an [OAuth App](/apps/about-apps/#about-oauth-apps) or a [GitHub App](/apps/about-apps/#about-github-apps): - OAuth Apps should authenticate using an [OAuth token](/apps/building-oauth-apps/authorizing-oauth-apps/). - GitHub Apps should authenticate using either a [JSON Web Token (JWT)](/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-a-github-app), [OAuth token](/apps/building-github-apps/identifying-and-authorizing-users-for-github-apps/), or [installation access token](/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-an-installation). ### Data protection - Apps should encrypt data transferred over the public internet using HTTPS, with a valid TLS certificate, or SSH for Git. - Apps should store client ID and client secret keys securely. We recommend storing them as [environmental variables](http://en.wikipedia.org/wiki/Environment_variable#Getting_and_setting_environment_variables). - Apps should delete all GitHub user data within 30 days of receiving a request from the user, or within 30 days of the end of the user's legal relationship with GitHub. - Apps should not require the user to provide their GitHub password. - Apps should encrypt tokens, client IDs, and client secrets. ### Logging and monitoring Apps should have logging and monitoring capabilities. App logs should be retained for at least 30 days and archived for at least one year. A security log should include: - Authentication and authorization events - Service configuration changes - Object reads and writes - All user and group permission changes - Elevation of role to admin - Consistent timestamping for each event - Source users, IP addresses, and/or hostnames for all logged actions ### Incident response workflow To provide a secure experience for users, you should have a clear incident response plan in place before listing your app. We recommend having a security and operations incident response team in your company rather than using a third-party vendor. You should have the capability to notify {% data variables.product.product_name %} within 24 hours of a confirmed incident. For an example of an incident response workflow, see the "Data Breach Response Policy" on the [SANS Institute website](https://www.sans.org/information-security-policy/). A short document with clear steps to take in the event of an incident is more valuable than a lengthy policy template. ### Vulnerability management and patching workflow You should conduct regular vulnerability scans of production infrastructure. You should triage the results of vulnerability scans and define a period of time in which you agree to remediate the vulnerability. If you are not ready to set up a full vulnerability management program, it's useful to start by creating a patching process. For guidance in creating a patch management policy, see this TechRepublic article "[Establish a patch management policy](https://www.techrepublic.com/blog/it-security/establish-a-patch-management-policy-87756/)." 94 ...ent/developers/github-marketplace/security-review-process-for-submitted-apps.md This file was deleted. 53 content/developers/github-marketplace/setting-pricing-plans-for-your-listing.md @@ -1,6 +1,6 @@ --- title: Setting pricing plans for your listing intro: 'When [listing your app on {% data variables.product.prodname_marketplace %}](/marketplace/listing-on-github-marketplace/), you can choose to provide your app as a free service or sell your app. If you plan to sell your app, you can create different pricing plans for different feature tiers.' intro: 'When you list your app on {% data variables.product.prodname_marketplace %}, you can choose to provide your app as a free service or sell your app. If you plan to sell your app, you can create different pricing plans for different feature tiers.' redirect_from: - /apps/adding-integrations/managing-pricing-and-payments-for-a-github-marketplace-listing/setting-a-github-marketplace-listing-s-pricing-plan/ - /apps/marketplace/managing-pricing-and-payments-for-a-github-marketplace-listing/setting-a-github-marketplace-listing-s-pricing-plan/ @@ -17,57 +17,52 @@ versions: free-pro-team: '*' --- ### About setting pricing plans If you want to sell an app on {% data variables.product.prodname_marketplace %}, you need to request verification when you publish the listing for your app. During the verification process, an onboarding expert checks the organization's identity and security settings. The onboarding expert will also take the organization through financial onboarding. For more information, see: "[Requirements for listing an app on {% data variables.product.prodname_marketplace %}](/marketplace/getting-started/requirements-for-listing-an-app-on-github-marketplace/)." ### Creating pricing plans To learn about the types of pricing plans that {% data variables.product.prodname_marketplace %} offers, see "[{% data variables.product.prodname_marketplace %} Pricing Plans](/marketplace/selling-your-app/github-marketplace-pricing-plans/)." You'll also find helpful billing guidelines in "[Selling your app](/marketplace/selling-your-app/)." Pricing plans can be in the draft or published state. If you haven't submitted your {% data variables.product.prodname_marketplace %} listing for approval, a published listing will function the same way as draft listings until your app is approved and listed on {% data variables.product.prodname_marketplace %}. Draft listings allow you to create and save new pricing plans without making them available on your {% data variables.product.prodname_marketplace %} listing page. Once you publish the pricing plan, it's available for customers to purchase immediately. You can publish up to 10 pricing plans. {% data reusables.marketplace.app-transfer-to-org-for-verification %} For information on how to do this, see: "[Submitting your listing for publication](/developers/github-marketplace/submitting-your-listing-for-publication#transferring-an-app-to-an-organization-before-you-submit)." To create a pricing plan for your {% data variables.product.prodname_marketplace %} listing, click **Plans and pricing** in the left sidebar of your [{% data variables.product.prodname_marketplace %} listing page](https://github.com/marketplace/manage). If you haven't created a {% data variables.product.prodname_marketplace %} listing yet, read "[Creating a draft {% data variables.product.prodname_marketplace %} listing](/marketplace/listing-on-github-marketplace/creating-a-draft-github-marketplace-listing/)" to learn how. When you click **New draft plan**, you'll see a form that allows you to customize your pricing plan. You'll need to configure the following fields to create a pricing plan: {% data variables.product.prodname_marketplace %} offers several different types of pricing plan. For detailed information, see "[Pricing plans for {% data variables.product.prodname_marketplace %}](/developers/github-marketplace/pricing-plans-for-github-marketplace-apps)." #### Plan name ### About saving pricing plans Your pricing plan's name will appear on your {% data variables.product.prodname_marketplace %} app's landing page. You can customize the name of your pricing plan to align to the plan's resources, the size of the company that will use the plan, or anything you'd like. You can save pricing plans in a draft or published state. If you haven't submitted your {% data variables.product.prodname_marketplace %} listing for approval, a published plan will function in the same way as a draft plan until your listing is approved and shown on {% data variables.product.prodname_marketplace %}. Draft plans allow you to create and save new pricing plans without making them available on your {% data variables.product.prodname_marketplace %} listing page. Once you publish a pricing plan on a published listing, it's available for customers to purchase immediately. You can publish up to 10 pricing plans. #### Pricing models For guidelines on billing customers, see "[Billing customers](/developers/github-marketplace/billing-customers)." ##### Free plans {% data reusables.marketplace.free-apps-encouraged %} A free plan still requires you to handle [new purchase](/marketplace/integrating-with-the-github-marketplace-api/handling-new-purchases-and-free-trials/) and [cancellation](/marketplace/integrating-with-the-github-marketplace-api/cancelling-plans/) billing flows. See "[Billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows)" for more details. ##### Flat-rate plans ### Creating pricing plans Flat-rate pricing plans allow you to offer your service to customers for a flat-rate fee. {% data reusables.marketplace.marketplace-pricing-free-trials %} To create a pricing plan for your {% data variables.product.prodname_marketplace %} listing, click **Plans and pricing** in the left sidebar of your [{% data variables.product.prodname_marketplace %} listing page](https://github.com/marketplace/manage). For more information, see "[Creating a draft {% data variables.product.prodname_marketplace %} listing](/marketplace/listing-on-github-marketplace/creating-a-draft-github-marketplace-listing/)." You must set a price for both monthly and yearly subscriptions in U.S. Dollars for flat-rate plans. When you click **New draft plan**, you'll see a form that allows you to customize your pricing plan. You'll need to configure the following fields to create a pricing plan: ##### Per-unit plans - **Plan name** - Your pricing plan's name will appear on your {% data variables.product.prodname_marketplace %} app's landing page. You can customize the name of your pricing plan to align with the plan's resources, the size of the company that will use the plan, or anything you'd like. Per-unit pricing allows you to offer your app in units. For example, a unit can be a person, seat, or user. You'll need to provide a name for the unit and set a price for both monthly and yearly subscriptions, in U.S. Dollars. - **Pricing models** - There are three types of pricing plan: free, flat-rate, and per-unit. All plans require you to process new purchase and cancellation events from the marketplace API. In addition, for paid plans: #### Available for - You must set a price for both monthly and yearly subscriptions in US dollars. - Your app must process plan change events. - You must request verification to publish a listing with a paid plan. - {% data reusables.marketplace.marketplace-pricing-free-trials %} {% data variables.product.prodname_marketplace %} pricing plans can apply to **Personal and organization accounts**, **Personal accounts only**, or **Organization accounts only**. For example, if your pricing plan is per-unit and provides multiple seats, you would select **Organization accounts only** because there is no way to assign seats to people in an organization from a personal account. For detailed information, see "[Pricing plans for {% data variables.product.prodname_marketplace %} apps](/developers/github-marketplace/pricing-plans-for-github-marketplace-apps)" and "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." #### Short description - **Available for** - {% data variables.product.prodname_marketplace %} pricing plans can apply to **Personal and organization accounts**, **Personal accounts only**, or **Organization accounts only**. For example, if your pricing plan is per-unit and provides multiple seats, you would select **Organization accounts only** because there is no way to assign seats to people in an organization from a personal account. Write a brief summary of the details of the pricing plan. The description might include the type of customer the plan is intended for or the resources the plan includes. - **Short description** - Write a brief summary of the details of the pricing plan. The description might include the type of customer the plan is intended for or the resources the plan includes. #### Bullets - **Bullets** - You can write up to four bullets that include more details about your pricing plan. The bullets might include the use cases of your app or list more detailed information about the resources or features included in the plan. You can write up to four bullets that include more details about your pricing plan. The bullets might include the use cases of your app or list more detailed information about the resources or features included in the plan. {% data reusables.marketplace.free-plan-note %} ### Changing a {% data variables.product.prodname_marketplace %} listing's pricing plan If a pricing plan for your {% data variables.product.prodname_marketplace %} plan is no longer needed or if you need to adjust pricing details, you can remove it. If a pricing plan for your {% data variables.product.prodname_marketplace %} listing is no longer needed, or if you need to adjust pricing details, you can remove it.  Once you publish a pricing plan for an app already listed in the {% data variables.product.prodname_marketplace %}, you can't make changes to the plan. Instead, you'll need to remove the pricing plan. Customers who already purchased the removed pricing plan will continue to use it until they opt out and move onto a new pricing plan. For more on pricing plans, see "[{% data variables.product.prodname_marketplace %} pricing plans](/marketplace/selling-your-app/github-marketplace-pricing-plans/)." Once you publish a pricing plan for an app that is already listed in {% data variables.product.prodname_marketplace %}, you can't make changes to the plan. Instead, you'll need to remove the pricing plan and create a new plan. Customers who already purchased the removed pricing plan will continue to use it until they opt out and move onto a new pricing plan. For more on pricing plans, see "[{% data variables.product.prodname_marketplace %} pricing plans](/marketplace/selling-your-app/github-marketplace-pricing-plans/)." Once you remove a pricing plan, users won't be able to purchase your app using that plan. Existing users on the removed pricing plan will continue to stay on the plan until they cancel their plan subscription. 37 content/developers/github-marketplace/submitting-your-listing-for-publication.md @@ -0,0 +1,37 @@ --- title: Submitting your listing for publication intro: 'You can submit your listing for the {% data variables.product.prodname_dotcom %} community to use.' redirect_from: - /marketplace/listing-on-github-marketplace/submitting-your-listing-for-review - /developers/github-marketplace/submitting-your-listing-for-review versions: free-pro-team: '*' --- Once you've completed the listing for your app, you'll see two buttons that allow you to request publication of the listing with or without verification. The **Request** button for "Publish without verification" is disabled if you have published any paid pricing plans in the listing.  {% data reusables.marketplace.launch-with-free %} After you submit your listing for review, an onboarding expert will reach out to you with additional information. For an overview of the process for creating and submitting a listing, see "[About {% data variables.product.prodname_marketplace %}](/developers/github-marketplace/about-github-marketplace#publishing-an-app-to-github-marketplace)." ### Prerequisites for publishing with verification Before you request verification of your listing, you'll need to integrate the {% data variables.product.prodname_marketplace %} billing flows and webhook into your app. For more information, see "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." If you've met the requirements for listing and you've integrated with the {% data variables.product.prodname_marketplace %} API, go ahead and submit your listing. For more information, see "[Requirements for listing an app](/developers/github-marketplace/requirements-for-listing-an-app)." {% data reusables.marketplace.app-transfer-to-org-for-verification %} For information on how to do this, see: "[Transferring an app to an organization before you submit](#transferring-an-app-to-an-organization-before-you-submit)" below. ### Transferring an app to an organization before you submit You cannot sell an app that's owned by a user account. You need to transfer the app to an organization that is already a verified creator, or that can request verification for a listing for the app. For details, see: 1. "[Creating an organization from scratch](/github/setting-up-and-managing-organizations-and-teams/creating-a-new-organization-from-scratch)" 1. "[Transferring ownership of a GitHub App](/developers/apps/transferring-ownership-of-a-github-app)" or "[Transferring ownership of an OAuth App](/developers/apps/transferring-ownership-of-an-oauth-app)" 22 content/developers/github-marketplace/submitting-your-listing-for-review.md This file was deleted. 4 content/developers/github-marketplace/testing-your-app.md @@ -1,6 +1,6 @@ --- title: Testing your app intro: 'GitHub recommends testing your app with APIs and webhooks before submitting your listing to {% data variables.product.prodname_marketplace %} so you can provide an ideal experience for customers. Before the {% data variables.product.prodname_marketplace %} onboarding team approves your app, it must adequately handle the [billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows).' intro: 'GitHub recommends testing your app with APIs and webhooks before submitting your listing to {% data variables.product.prodname_marketplace %} so you can provide an ideal experience for customers. Before an onboarding expert approves your app, it must adequately handle the billing flows.' redirect_from: - /apps/marketplace/testing-apps-apis-and-webhooks/ - /apps/marketplace/integrating-with-the-github-marketplace-api/testing-github-marketplace-apps/ @@ -13,7 +13,7 @@ versions: ### Testing apps You can use a [draft {% data variables.product.prodname_marketplace %} listing](/marketplace/listing-on-github-marketplace/creating-a-draft-github-marketplace-listing/) to simulate each of the [billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows). A listing in the draft state means that it has not been submitted for approval. Any purchases you make using a draft {% data variables.product.prodname_marketplace %} listing will _not_ create real transactions, and GitHub will not charge your credit card. You can use a draft {% data variables.product.prodname_marketplace %} listing to simulate each of the billing flows. A listing in the draft state means that it has not been submitted for approval. Any purchases you make using a draft {% data variables.product.prodname_marketplace %} listing will _not_ create real transactions, and GitHub will not charge your credit card. For more information, see "[Drafting a listing for your app](/developers/github-marketplace/drafting-a-listing-for-your-app)" and "[Using the {% data variables.product.prodname_marketplace %} API in your app](/developers/github-marketplace/using-the-github-marketplace-api-in-your-app)." #### Using a development app with a draft listing to test changes 2 .../developers/github-marketplace/webhook-events-for-the-github-marketplace-api.md @@ -1,6 +1,6 @@ --- title: Webhook events for the GitHub Marketplace API intro: 'A {% data variables.product.prodname_marketplace %} app receives information about changes to a user''s plan from the Marketplace purchase event webhook. A Marketplace purchase event is triggered when a user purchases, cancels, or changes their payment plan. For details on how to respond to each of these types of events, see "[Billing flows](/marketplace/integrating-with-the-github-marketplace-api/#billing-flows)."' intro: 'A {% data variables.product.prodname_marketplace %} app receives information about changes to a user''s plan from the Marketplace purchase event webhook. A Marketplace purchase event is triggered when a user purchases, cancels, or changes their payment plan.' redirect_from: - /apps/marketplace/setting-up-github-marketplace-webhooks/about-webhook-payloads-for-a-github-marketplace-listing/ - /apps/marketplace/integrating-with-the-github-marketplace-api/github-marketplace-webhook-events/ 4 content/developers/webhooks-and-events/webhook-events-and-payloads.md @@ -445,7 +445,7 @@ Key | Type | Description #### Webhook payload object {% data reusables.webhooks.installation_properties %} {% data reusables.webhooks.app_desc %} {% data reusables.webhooks.app_always_desc %} {% data reusables.webhooks.sender_desc %} #### Webhook payload example @@ -469,7 +469,7 @@ Key | Type | Description #### Webhook payload object {% data reusables.webhooks.installation_repositories_properties %} {% data reusables.webhooks.app_desc %} {% data reusables.webhooks.app_always_desc %} {% data reusables.webhooks.sender_desc %} #### Webhook payload example 54 ...ssions/collaborating-with-your-community-using-discussions/about-discussions.md @@ -0,0 +1,54 @@ --- title: About discussions intro: Use discussions to ask and answer questions, share information, make announcements, and conduct or participate in a conversation about a project on {% data variables.product.product_name %}. versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### About discussions With {% data variables.product.prodname_discussions %}, the community for your project can create and participate in conversations within the project's repository. Discussions empower a project's maintainers, contributors, and visitors to gather and accomplish the following goals in a central location, without third-party tools. - Share announcements and information, gather feedback, plan, and make decisions - Ask questions, discuss and answer the questions, and mark the discussions as answered - Foster an inviting atmosphere for visitors and contributors to discuss goals, development, administration, and workflows  You don't need to close a discussion like you close an issue or a pull request. If a repository administrator or project maintainer enables discussions for a repository, anyone who visits the repository can create and participate in discussions for the repository. Repository administrators and project maintainers can manage discussions and discussion categories in a repository, and pin discussions to increase the visibility of the discussion. Moderators and collaborators can mark comments as answers, lock discussions, and convert issues to discussions. For more information, see "[Repository permission levels for an organization](/github/setting-up-and-managing-organizations-and-teams/repository-permission-levels-for-an-organization)." For more information about management of discussions for your repository, see "[Managing discussions in your repository](/discussions/managing-discussions-for-your-community/managing-discussions-in-your-repository)." ### About categories and formats for discussions {% data reusables.discussions.you-can-categorize-discussions %} {% data reusables.discussions.about-categories-and-formats %} {% data reusables.discussions.repository-category-limit %} For discussions with a question/answer format, an individual comment within the discussion can be marked as the discussion's answer. {% data reusables.discussions.github-recognizes-members %} For more information, see "[Managing categories for discussions in your repository](/discussions/managing-discussions-for-your-community/managing-categories-for-discussions-in-your-repository)." ### Best practices for discussions As a community member or maintainer, start a discussion to ask a question or discuss information that affects the community. For more information, see "[Collaborating with maintainers using discussions](/discussions/collaborating-with-your-community-using-discussions/collaborating-with-maintainers-using-discussions)." Participate in a discussion to ask and answer questions, provide feedback, and engage with the project's community. For more information, see "[Participating in a discussion](/discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion)." You can spotlight discussions that contain important, useful, or exemplary conversations among members in the community. For more information, see "[Managing discussions in your repository](/discussions/managing-discussions-for-your-community/managing-discussions-in-your-repository#pinning-a-discussion)." {% data reusables.discussions.you-can-convert-an-issue %} For more information, see "[Moderating discussions in your repository](/discussions/managing-discussions-for-your-community/moderating-discussions#converting-an-issue-to-a-discussion)." ### Sharing feedback You can share your feedback about {% data variables.product.prodname_discussions %} with {% data variables.product.company_short %}. To join the conversation, see [`github/feedback`](https://github.com/github/feedback/discussions?discussions_q=category%3A%22Discussions+Feedback%22). ### Further reading - "[About writing and formatting on {% data variables.product.prodname_dotcom %}](/github/writing-on-github/about-writing-and-formatting-on-github)" - "[Searching discussions](/github/searching-for-information-on-github/searching-discussions)" - "[About notifications](/github/managing-subscriptions-and-notifications-on-github/about-notifications)" - "[Moderating comments and conversations](/github/building-a-strong-community/moderating-comments-and-conversations)" - "[Maintaining your safety on {% data variables.product.prodname_dotcom %}](/github/building-a-strong-community/maintaining-your-safety-on-github)" 50 ...community-using-discussions/collaborating-with-maintainers-using-discussions.md @@ -0,0 +1,50 @@ --- title: Collaborating with maintainers using discussions shortTitle: Collaborating with maintainers intro: You can contribute to the goals, plans, health, and community for a project on {% data variables.product.product_name %} by communicating with the maintainers of the project in a discussion. permissions: People with read permissions to a repository can start and participate in discussions in the repository. versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### About collaboration with maintainers using discussions {% data reusables.discussions.about-discussions %} If you use or contribute to a project, you can start a discussion to make suggestions and engage with maintainers and community members about your plans, questions, ideas, and feedback. For more information, see "[About discussions](/discussions/collaborating-with-your-community-using-discussions/about-discussions)." {% data reusables.discussions.about-categories-and-formats %} Repository administrators and project maintainers can delete a discussion. For more information, see "[Managing discussions in your repository](/discussions/managing-discussions-for-your-community/managing-discussions-in-your-repository#deleting-a-discussion)." {% data reusables.discussions.github-recognizes-members %} These members appear in a list of the most helpful contributors to the project's discussions. As your project grows, you can grant higher access permissions to active members of your community. For more information, see "[Granting higher permissions to top contributors](/discussions/guides/granting-higher-permissions-to-top-contributors)"  For more information about participation in discussions, see "[Participating in a discussion](/discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion)." ### Prerequisites To collaborate with maintainers using discussions, a repository administrator or project maintainer must enable discussions for the repository. For more information, see "[Enabling or disabling discussions for a repository](/github/administering-a-repository/enabling-or-disabling-github-discussions-for-a-repository)." ### Starting a discussion {% data reusables.discussions.starting-a-discussion %} ### Filtering the list of discussions You can search for discussions and filter the list of discussions in a repository. For more information, see "[Searching discussions](/github/searching-for-information-on-github/searching-discussions)." {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} 1. In the **Search all discussions** field, type a search query. Optionally, to the right of the search field, click a button to further filter the results.  1. In the list of discussions, click the discussion you want to view.  ### Converting an issue to a discussion {% data reusables.discussions.you-can-convert-an-issue %} For more information, see "[Moderating discussions in your repository](/discussions/managing-discussions-for-your-community/moderating-discussions#converting-an-issue-to-a-discussion#converting-an-issue-to-a-discussion)." ### Further reading - "[About writing and formatting on {% data variables.product.prodname_dotcom %}](/github/writing-on-github/about-writing-and-formatting-on-github)" - "[Maintaining your safety on {% data variables.product.prodname_dotcom %}](/github/building-a-strong-community/maintaining-your-safety-on-github)" 14 content/discussions/collaborating-with-your-community-using-discussions/index.md @@ -0,0 +1,14 @@ --- title: Collaborating with your community using discussions shortTitle: Collaborating using discussions intro: Gather and discuss your project with community members and other maintainers. versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} {% link_in_list /about-discussions %} {% link_in_list /participating-in-a-discussion %} {% link_in_list /collaborating-with-maintainers-using-discussions %} 31 ...borating-with-your-community-using-discussions/participating-in-a-discussion.md @@ -0,0 +1,31 @@ --- title: Participating in a discussion intro: You can converse with the community and maintainers in a forum within the repository for a project on {% data variables.product.product_name %}. permissions: People with read permissions to a repository can participate in discussions in the repository. versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### About participation in a discussion {% data reusables.discussions.about-discussions %} For more information, see "[About discussions](/discussions/collaborating-with-your-community-using-discussions/about-discussions)." In addition to starting or viewing a discussion, you can comment in response to the original comment from the author of the discussion. You can also create a comment thread by replying to an individual comment that another community member made within the discussion, and react to comments with emoji. For more information about reactions, see "[About conversations on {% data variables.product.prodname_dotcom %}](/github/collaborating-with-issues-and-pull-requests/about-conversations-on-github#reacting-to-ideas-in-comments)." You can block users and report disruptive content to maintain a safe and pleasant environment for yourself on {% data variables.product.product_name %}. For more information, see "[Maintaining your safety on {% data variables.product.prodname_dotcom %}](/github/building-a-strong-community/maintaining-your-safety-on-github)." ### Prerequisites Discussions must be enabled for the repository for you to participate in a discussion in the repository. For more information, see "[Enabling or disabling discussions for a repository](/github/administering-a-repository/enabling-or-disabling-github-discussions-for-a-repository)." ### Creating a discussion {% data reusables.discussions.starting-a-discussion %} ### Marking a comment as an answer Discussion authors and users with the triage role or greater for a repository can mark a comment as the answer to a discussion in the repository. {% data reusables.discussions.marking-a-comment-as-an-answer %} 49 content/discussions/guides/best-practices-for-community-conversations-on-github.md @@ -0,0 +1,49 @@ --- title: Best practices for community conversations on GitHub shortTitle: Best practices for community conversations intro: 'You can use discussions to brainstorm with your team, and eventually move the conversation to a discussion when you are ready to scope out the work.' versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### Community conversations in {% data variables.product.prodname_discussions %} Since {% data variables.product.prodname_discussions %} is an open forum, there is an opportunity to bring non-code collaboration into a project's repository and gather diverse feedback and ideas more quickly. You can help drive a productive conversation by: - Asking pointed questions and follow-up questions to garner specific feedback - Capture a diverse experience and distill it down to main points - Open an issue to take action based on the conversation, where applicable For more information about opening an issue and cross-referencing a discussion, see "[Opening an issue from a comment](/github/managing-your-work-on-github/opening-an-issue-from-a-comment)." ### Learning about conversations on GitHub You can create and participate in discussions, issues, and pull requests, depending on the type of conversation you'd like to have. You can use {% data variables.product.prodname_discussions %} to discuss big picture ideas, brainstorm, and spike out a project's specific details before committing it to an issue, which can then be scoped. Discussions are useful for teams if: - You are in the discovery phase of a project and are still learning which director your team wants to go in - You want to collect feedback from a wider community about a project - You want to keep bug fixes, feature requests, and general conversations separate Issues are useful for discussing specific details of a project such as bug reports and planned improvements. For more information, see "[About issues](/articles/about-issues)." Pull requests allow you to comment directly on proposed changes. For more information, see "[About pull requests](/articles/about-pull-requests)" and "[Commenting on a pull request](/articles/commenting-on-a-pull-request)." {% data reusables.organizations.team-discussions-purpose %} For more information, see "[About team discussions](/articles/about-team-discussions)." ### Following contributing guidelines Before you open a discussion, check to see if the repository has contributing guidelines. The CONTRIBUTING file includes information about how the repository maintainer would like you to contribute ideas to the project. For more information, see "[Setting up your project for healthy contributions](/github/building-a-strong-community/setting-up-your-project-for-healthy-contributions)." ### Next steps To continue learning about {% data variables.product.prodname_discussions %} and quickly create a discussion for your community, see "[Quickstart for {% data variables.product.prodname_discussions %}](/discussions/quickstart)." ### Further reading - "[Setting up your project for healthy contributions](/articles/setting-up-your-project-for-healthy-contributions)" - "[Using templates to encourage useful issues and pull requests](/github/building-a-strong-community/using-templates-to-encourage-useful-issues-and-pull-requests)" - "[Moderating comments and conversations](/articles/moderating-comments-and-conversations)" - "[Writing on {% data variables.product.prodname_dotcom %}](/articles/writing-on-github)" 21 content/discussions/guides/finding-discussions-across-multiple-repositories.md @@ -0,0 +1,21 @@ --- title: Finding discussions across multiple repositories intro: 'You can easily access every discussion you''ve created or participated in across multiple repositories.' versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### Finding discussions 1. Navigate to {% data variables.product.prodname_dotcom_the_website %}. 1. In the top-right corner of {% data variables.product.prodname_dotcom_the_website %}, click your profile photo, then click **Your enterprises**.  1. Toggle between **Created** and **Commented** to see the discussions you've created or participated in. ### Further reading - "[Searching discussions](/github/searching-for-information-on-github/searching-discussions)" - "[About discussions](/discussions/collaborating-with-your-community-using-discussions/about-discussions)" - "[Managing discussions for your community](/discussions/managing-discussions-for-your-community)" 32 content/discussions/guides/granting-higher-permissions-to-top-contributors.md @@ -0,0 +1,32 @@ --- title: Granting higher permissions to top contributors intro: 'Repository administrators can promote any community member to a moderator and maintainer.' versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### Introduction The most helpful contributors for the past 30 days are highlighted on the {% data variables.product.prodname_discussions %} dashboard, based on how many comments were marked as answers by other community members. Helpful contributors can help drive a healthy community and moderate and guide the community space in addition to maintainers. ### Step 1: Audit your discussions top contributors {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} 1. Compare the list of contributors with their access permissions to see who qualifies to moderate the discussion. ### Step 2: Review permission levels for discussions People with triage permissions for a repository can help moderate a project's discussions by marking comments as answers, locking discussions that are not longer useful or are damaging to the community, and converting issues to discussions when an idea is still in the early stages of development. For more information, see "[Moderating discussions](/discussions/managing-discussions-for-your-community/moderating-discussions)." For more information about repository permission levels and {% data variables.product.prodname_discussions %}, see "[Repository permissions levels for an organization](/github/setting-up-and-managing-organizations-and-teams/repository-permission-levels-for-an-organization)." ### Step 3: Change permissions levels for top contributors You can change a contributor's permission levels to give them more access to the tooling they need to moderate GitHub Discussions. To change a person's or team's permission levels, see "[Managing teams and people with access to your repository](/github/administering-a-repository/managing-teams-and-people-with-access-to-your-repository)." ### Step 4: Notify community members of elevated access When you change a collaborators permission level, they will receive a notification for the change. 29 content/discussions/guides/index.md @@ -0,0 +1,29 @@ --- title: Discussions guides shortTitle: Guides intro: 'Discover pathways to get started or learn best practices for participating or monitoring your community''s discussions.' versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### Getting started with discussions {% link_in_list /about-discussions %} {% link_in_list /best-practices-for-community-conversations-on-github %} {% link_in_list /finding-discussions-across-multiple-repositories %} <!-- {% link_in_list /managing-notifications-for-discussions %} --> ### Administering discussions {% link_in_list /granting-higher-permissions-to-top-contributors %} <!--<!-- Commenting out what is only nice to have for discussions release {% link_in_list /updating-your-contributing-guidelines-with-discussions %} --> <!-- ### Discussions and open source projects {% link_in_list /collaborating-on-open-source-projects-in-discussions %} {% link_in_list /welcoming-contributions-to-your-communitys-discussions %} --> 55 content/discussions/index.md @@ -0,0 +1,55 @@ --- title: GitHub Discussions Documentation beta_product: true shortTitle: GitHub Discussions intro: '{% data variables.product.prodname_discussions %} is a collaborative communication forum for the community around an open source project. Community members can ask and answer questions, share updates, have open-ended conversations, and follow along on decisions affecting the community''s way of working.' introLinks: quickstart: /discussions/quickstart featuredLinks: guides: - /discussions/collaborating-with-your-community-using-discussions/about-discussions - /discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion - /discussions/managing-discussions-for-your-community/moderating-discussions gettingStarted: - /discussions/quickstart guideCards: - /discussions/collaborating-with-your-community-using-discussions/about-discussions - /discussions/collaborating-with-your-community-using-discussions/participating-in-a-discussion - /discussions/managing-discussions-for-your-community/moderating-discussions popular: - /discussions/guides/granting-higher-permissions-to-top-contributors - /discussions/guides/best-practices-for-community-conversations-on-github - /discussions/guides/finding-discussions-across-multiple-repositories - /discussions/collaborating-with-your-community-using-discussions/collaborating-with-maintainers-using-discussions - /discussions/managing-discussions-for-your-community/managing-categories-for-discussions-in-your-repository product_video: https://www.youtube-nocookie.com/embed/DbTWBP3_RbM layout: product-landing versions: free-pro-team: '*' --- <!-- {% link_with_intro /quickstart %} --> <!-- {% link_with_intro /discussions-guides %} --> <!-- {% link_with_intro /collaborating-with-your-community-using-discussions %} --> <!-- {% link_with_intro /managing-discussions-for-your-community %} --> <!-- Community examples --> {% assign discussionsCommunityExamples = site.data.variables.discussions_community_examples %} {% if discussionsCommunityExamples %} <div class="my-6 pt-6"> <h2 class="mb-2 font-mktg h1">Communities using discussions</h2> <div class="d-flex flex-wrap gutter"> {% render 'discussions-community-card' for discussionsCommunityExamples as example %} </div> {% if discussionsCommunityExamples.length > 6 %} <button class="js-filter-card-show-more btn btn-outline float-right">Show more {% octicon "arrow-right" %}</button> {% endif %} <div class="js-filter-card-no-results d-none py-4 text-center text-gray font-mktg"> <div class="mb-3">{% octicon "search" width="24" %}</div> <h3 class="text-normal">Sorry, there is no result for <strong class="js-filter-card-value"></strong></h3> <p class="my-3 f4">It looks like we don't have an example that fits your filter.<br>Try another filter or add your code example</p> <a href="https://github.com/github/docs/blob/main/data/variables/discussions_community_examples.yml">Add your community {% octicon "arrow-right" %}</a> </div> </div> {% endif %} 13 content/discussions/managing-discussions-for-your-community/index.md @@ -0,0 +1,13 @@ --- title: Managing discussions for your community shortTitle: Managing discussions intro: 'You can enable and configure discussions for your repository, and you can use tools on {% data variables.product.product_name %} to moderate conversations among community members.' versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} {% link_in_list /managing-discussions-in-your-repository %} {% link_in_list /managing-categories-for-discussions-in-your-repository %} {% link_in_list /moderating-discussions %} 64 ...ns-for-your-community/managing-categories-for-discussions-in-your-repository.md @@ -0,0 +1,64 @@ --- title: Managing categories for discussions in your repository intro: You can categorize the discussions in your repository to organize conversations for your community members, and you can choose a format for each category. permissions: Repository administrators and people with write or greater access to a repository can enable discussions in the repository. versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### About categories for discussions {% data reusables.discussions.about-discussions %} {% data reusables.discussions.about-categories-and-formats %} Each category must have a unique name and emoji pairing, and can be accompanied by a detailed description stating its purpose. Categories help maintainers organize how conversations are filed and are customizable to help distinguish categories that are Q&A or more open-ended conversations.{% data reusables.discussions.repository-category-limit %} For more information, see "[About discussions](/discussions/collaborating-with-your-community-using-discussions/about-discussions#about-categories-and-formats-for-discussions)." ### Default categories | Category | Purpose | Type | | :- | :- | :- | | #️⃣ General | Anything and everything relevant to the project | Open-ended discussion | |💡Ideas | Ideas to change or improve the project | Open-ended discussion | | 🙏 Q&A | Questions for the community to answer, with a question/answer format | Question and Answer | | 🙌 Show and tell | Creations, experiments, or tests relevant to the project | Open-ended discussion | ### Creating a category {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} {% data reusables.discussions.edit-categories %} 1. Click **New category**.  1. Edit the emoji, title, description, and discussion format for the category. For more information about discussion formats, see "[About discussions](/discussions/collaborating-with-your-community-using-discussions/about-discussions#about-categories-and-formats-for-discussions)."  1. Click **Create**.  ### Editing a category You can edit a category to change the category's emoji, title, description, and discussion format. {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} 1. To the right of a category in the list, click {% octicon "pencil" aria-label="The pencil icon" %}.  1. {% data reusables.discussions.edit-category-details %}  1. Click **Save changes**.  ### Deleting a category When you delete a category, {% data variables.product.product_name %} will move all discussions in the deleted category to an existing category that you choose. {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} 1. To the right of a category in the list, click {% octicon "trash" aria-label="The trash icon" %}.  1. Use the drop-down menu, and choose a new category for any discussions in the category you're deleting.  1. Click **Delete & Move**.  108 ...aging-discussions-for-your-community/managing-discussions-in-your-repository.md @@ -0,0 +1,108 @@ --- title: Managing discussions in your repository intro: You can categorize, spotlight, transfer, or delete the discussions in a repository. permissions: Repository administrators and people with write or greater access to a repository can manage discussions in the repository. versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### About management of discussions {% data reusables.discussions.about-discussions %} For more information about discussions, see "[About discussions](/discussions/collaborating-with-your-community-using-discussions/about-discussions)." Organization owners can choose the permissions required to create a discussion for repositories owned by the organization. For more information, see "[Managing discussion creation for repositories in your organization](/github/setting-up-and-managing-organizations-and-teams/managing-discussion-creation-for-repositories-in-your-organization)." As a discussions maintainer, you can create community resources to encourage discussions that are aligned with the overall project goal and maintain a friendly open forum for collaborators. Creating a code of conduct or contribution guidelines for collaborators to follow will help facilitate a collaborative and productive forum. For more information on creating community resources, see "[Adding a code of conduct to your project](/github/building-a-strong-community/adding-a-code-of-conduct-to-your-project)," and "[Setting guidelines for repository contributors](/github/building-a-strong-community/setting-guidelines-for-repository-contributors)." For more information on facilitating a healthy discussion, see "[Moderating comments and conversations](/github/building-a-strong-community/moderating-comments-and-conversations)." ### Prerequisites To manage discussions in a repository, discussions must be enabled for the repository. For more information, see "[Enabling or disabling discussions for a repository](/github/administering-a-repository/enabling-or-disabling-github-discussions-for-a-repository)." ### Changing the category for a discussion You can categorize discussions to help community members find related discussions. For more information, see "[Managing categories for discussions in your repository](/discussions/managing-discussions-for-your-community/managing-categories-for-discussions-in-your-repository)" article. You can also move a discussion to a different category. {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} {% data reusables.discussions.click-discussion-in-list %} 1. In the right sidebar, click {% octicon "pencil" aria-label="The pencil icon" %} **Edit pinned discussion**.  ### Pinning a discussion You can pin up to four important discussions above the list of discussions for the repository. {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} {% data reusables.discussions.click-discussion-in-list %} 1. In the right sidebar, click {% octicon "pin" aria-label="The pin icon" %} **Pin discussion**.  1. Optionally, customize the look of the pinned discussion.  1. Click **Pin discussion**.  ### Editing a pinned discussion Editing a pinned discussion will not change the discussion's category. For more information, see "[Managing categories for discussions in your repository](/discussions/managing-discussions-for-your-community/managing-categories-for-discussions-in-your-repository)." {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} {% data reusables.discussions.click-discussion-in-list %} 1. In the right sidebar, click {% octicon "pencil" aria-label="The pencil icon" %} **Edit pinned discussion**.  1. Customize the look of the pinned discussion.  1. Click **Pin discussion**.  ### Unpinning a discussion {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} {% data reusables.discussions.click-discussion-in-list %} 1. In the right sidebar, click {% octicon "pin" aria-label="The pin icon" %} **Unpin discussion**.  1. Read the warning, then click **Unpin discussion**.  ### Transferring a discussion To transfer a discussion, you must have permissions to create discussions in the repository where you want to transfer the discussion. {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} {% data reusables.discussions.click-discussion-in-list %} 1. In the right sidebar, click {% octicon "arrow-right" aria-label="The right arrow icon" %} **Transfer discussion**.  1. Select the **Choose a repository** drop-down, and click the repository you want to transfer the discussion to.  1. Click **Transfer discussion**.  ### Deleting a discussion {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} {% data reusables.discussions.click-discussion-in-list %} 1. In the right sidebar, click {% octicon "trash" aria-label="The trash arrow icon" %} **Delete discussion**.  1. Read the warning, then click **Delete this discussion**.  ### Converting issues based on labels You can convert all issues with the same label to discussions in bulk. Future issues with this label will also automatically convert to the discussion and category you configure. {% data reusables.repositories.navigate-to-repo %} {% data reusables.repositories.sidebar-issues %} {% data reusables.project-management.labels %} 1. Next to the label you want to convert to issues, click **Convert issues**. 1. Select the **Choose a category** drop-down menu, and click a category for your discussion. 1. Click **I understand, convert this issue to a discussion**. 40 ...t/discussions/managing-discussions-for-your-community/moderating-discussions.md @@ -0,0 +1,40 @@ --- title: Moderating discussions intro: 'You can promote healthy collaboration by marking comments as answers, locking or unlocking discussions, and converting issues to discussions. and editing or deleting comments, discussions, and categories that don''t align with your community''s code of conduct to discussions.' permissions: People with triage access to a repository can moderate discussions in the repository. versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### About moderating discussions {% data reusables.discussions.about-discussions %} If you have triage permissions for a repository, you can help moderate a project's discussions by marking comments as answers, locking discussions that are not longer useful or are damaging to the community, and converting issues to discussions when an idea is still in the early stages of development. ### Marking a comment as an answer {% data reusables.discussions.marking-a-comment-as-an-answer %} ### Locking discussions It's appropriate to lock a conversation when the entire conversation is not constructive or violates your community's code of conduct or {% data variables.product.prodname_dotcom %}'s [Community Guidelines](/github/site-policy/github-community-guidelines). You can also lock a conversation to prevent comments on a discussion you want to use as an announcement to the community. When you lock a conversation, people with write access to the repository will still be able to comment on the discussion. {% data reusables.repositories.navigate-to-repo %} {% data reusables.discussions.discussions-tab %} 1. In the list of discussions, click the discussion you want to lock.  1. In the right margin of a discussion, click **Lock conversation**. 1. Read the information about locking conversations and click **Lock conversation on this discussion**. 1. When you're ready to unlock the conversation, click **Unlock conversation**, then click **Unlock conversation on this discussion**. ### Converting an issue to a discussion When you convert an issue to a discussion, the discussion is automatically created using the content from the issue. People with write access to a repository can bulk convert issues based on labels. For more information, see "[Managing discussions in your repository](/discussions/managing-discussions-for-your-community/managing-discussions-in-your-repository)." {% data reusables.repositories.navigate-to-repo %} {% data reusables.repositories.sidebar-issues %} 1. In the list of issues, click the issue you'd like to convert. 1. In the right margin of an issue, click **Convert to discussion**. 1. Select the **Choose a category** drop-down menu, and click a category for your discussion. 1. Click **I understand, convert this issue to a discussion**. 62 content/discussions/quickstart.md @@ -0,0 +1,62 @@ --- title: Quickstart for GitHub Discussions intro: 'Enable {% data variables.product.prodname_discussions %} on an existing repository and start conversations with your community.' allowTitleToDifferFromFilename: true versions: free-pro-team: '*' --- {% data reusables.discussions.beta %} ### Introduction {% data variables.product.prodname_discussions %} is a collaborative communication forum for the community around an open source project. Discussions are for conversations that need to be transparent and accessible but do not need to be tracked on a project board and are not related to code, unlike issues. Discussions enable fluid, open conversation in a public forum. Discussions give a space for more collaborative conversations by connecting and giving a more centralized area to connect and find information. ### Enabling {% data variables.product.prodname_discussions %} on your repository Repository owners and people with write access can enable {% data variables.product.prodname_discussions %} for a community on their public repositories. When you first enable a {% data variables.product.prodname_discussions %}, you will be invited to configure a welcome post. {% data reusables.repositories.navigate-to-repo %} 1. Under your repository name, click {% octicon "gear" aria-label="The gear icon" %} **Settings**.  1. Under "Features", click **Set up discussions**.  1. Under "Start a new discussion," edit the template to align with the resources and tone you want to set for your community. 1. Click **Start discussion**.  ### Welcoming contributions to your discussions You can welcome your community and introduce a new way to communicate in a repository by creating a welcome post and pin the post to your {% data variables.product.prodname_discussions %} page. Pinning and locking discussions helps people know that a post is meant as an announcement. You can use announcements as a way to link people to more resources and offer guidance for opening discussions in your community. For more information about pinning a discussion, see "[Managing discussions in your repository](/discussions/managing-discussions-for-your-community/managing-discussions-in-your-repository#pinning-a-discussion)." ### Setting up community guidelines for contributors You can set contributing guidelines to encourage collaborators to have meaningful, useful conversations that are relevant to the repository. You can also update the repository's README to communicate expectations on when collaborators should open an issue or discussion. For more information about providing guidelines for your project, see "[Adding a code of conduct to your project](/github/building-a-strong-community/adding-a-code-of-conduct-to-your-project)" and "[Setting up your project for healthy contributions](/github/building-a-strong-community/setting-up-your-project-for-healthy-contributions)." ### Creating a new discussion Anyone with access to a repository can create a discussion. {% data reusables.discussions.starting-a-discussion %} ### Organizing discussions into relevant categories Repository owners and people with write access can create new categories to keep discussions organized. Collaborators participating and creating new discussions can group discussions into the most relevant existing categories. Discussions can also be recategorized after they are created. For more information, see "[Managing categories for discussions in your repository](/discussions/managing-discussions-for-your-community/managing-categories-for-discussions-in-your-repository)" ### Promoting healthy conversations People with write permissions for a repository can help surface important conversations by pinning discussions, deleting discussions that are no longer useful or are damaging to the community, and transferring discussions to more relevant repositories owned by the organization. For more information, see "[Managing discussions in your repository](/discussions/managing-discussions-for-your-community/managing-discussions-in-your-repository)." People with triage permissions for a repository can help moderate a project's discussions by marking comments as answers, locking discussions that are not longer useful or are damaging to the community, and converting issues to discussions when an idea is still in the early stages of development. For more information, see "[Moderating discussions](/discussions/managing-discussions-for-your-community/moderating-discussions)." ### Next steps Once there is a clear path to scope work out and move an idea from concept to reality, you can create an issue and start tracking your progress. For more information on creating an issue from a discussion, see "[Moderating discussions](/discussions/managing-discussions-for-your-community/moderating-discussions)." 45 content/education/guides.md @@ -0,0 +1,45 @@ --- title: Guides for GitHub Education intro: 'These guides for {% data variables.product.prodname_education %} help you teach and learn both {% data variables.product.product_name %} and software development.' allowTitleToDifferFromFilename: true versions: free-pro-team: '*' --- ### Get started with {% data variables.product.product_name %} Teachers, students, and researchers can use tools from {% data variables.product.product_name %} to enrich a software development curriculum and develop real-world collaboration skills. - [Sign up for a new {% data variables.product.prodname_dotcom %} account](/github/getting-started-with-github/signing-up-for-a-new-github-account) - [Git and {% data variables.product.prodname_dotcom %} quickstart ](/github/getting-started-with-github/quickstart) - [Apply for an educator or researcher discount](/education/teach-and-learn-with-github-education/apply-for-an-educator-or-researcher-discount) - [Apply for a student developer pack](/education/teach-and-learn-with-github-education/apply-for-a-student-developer-pack) ### Run a software development course with {% data variables.product.company_short %} Administer a classroom, assign and review work from your students, and teach the new generation of software developers with {% data variables.product.prodname_classroom %}. - [Basics of setting up {% data variables.product.prodname_classroom %} ](/education/manage-coursework-with-github-classroom/basics-of-setting-up-github-classroom) - [Manage classrooms](/education/manage-coursework-with-github-classroom/manage-classrooms) - [Create an individual assignment](/education/manage-coursework-with-github-classroom/create-an-individual-assignment) - [Create a group assignment](/education/manage-coursework-with-github-classroom/create-a-group-assignment) - [Create an assignment from a template repository](/education/manage-coursework-with-github-classroom/create-an-assignment-from-a-template-repository) - [Leave feedback with pull requests](/education/manage-coursework-with-github-classroom/leave-feedback-with-pull-requests) - [Use autograding](/education/manage-coursework-with-github-classroom/use-autograding) ### Learn to develop software Incorporate {% data variables.product.prodname_dotcom %} into your education, and use the same tools as the professionals. - [Git and {% data variables.product.prodname_dotcom %} learning resources](/github/getting-started-with-github/git-and-github-learning-resources) - [Use {% data variables.product.prodname_dotcom %} for your schoolwork](/education/teach-and-learn-with-github-education/use-github-for-your-schoolwork) - [Try {% data variables.product.prodname_desktop %}](/desktop) - [Try {% data variables.product.prodname_cli %}](/github/getting-started-with-github/github-cli) ### Contribute to the community Participate in the community, get training from {% data variables.product.company_short %}, and learn or teach new skills. - [{% data variables.product.prodname_education_community %}](https://education.github.community) - [About Campus Experts](/education/teach-and-learn-with-github-education/about-campus-experts) - [About Campus Advisors](/education/teach-and-learn-with-github-education/about-campus-advisors) 43 content/education/index.md @@ -0,0 +1,43 @@ --- title: GitHub Education Documentation shortTitle: Education intro: "{% data variables.product.prodname_education %} helps you teach or learn software development with the tools and support of {% data variables.product.company_short %}'s platform and community." introLinks: quickstart: /education/quickstart featuredLinks: guides: - /education/teach-and-learn-with-github-education/apply-for-a-student-developer-pack - /education/teach-and-learn-with-github-education/apply-for-an-educator-or-researcher-discount - /education/teach-and-learn-with-github-education/use-github-at-your-educational-institution guideCards: - /github/getting-started-with-github/signing-up-for-a-new-github-account - /github/getting-started-with-github/git-and-github-learning-resources - /education/manage-coursework-with-github-classroom/basics-of-setting-up-github-classroom popular: - /education/teach-and-learn-with-github-education/use-github-for-your-schoolwork - /education/teach-and-learn-with-github-education/use-github-in-your-classroom-and-research - /desktop - /github/getting-started-with-github/github-cli - /education/manage-coursework-with-github-classroom/teach-with-github-classroom changelog: - title: 'Try something new at Local Hack Day: Learn' date: '2020-10-15' href: https://github.blog/2020-10-15-try-something-new-at-local-hack-day-learn/ - title: 'Remote Education: Creating community through shared experiences' date: '2020-09-24' href: https://github.blog/2020-09-24-remote-education-creating-community-through-shared-experiences/ - title: 'Remote Education: A series of best practices for online campus communities' date: '2020-09-10' href: https://github.blog/2020-09-10-remote-education-a-series-of-best-practices-for-online-campus-communities/ - title: Welcome to the inaugural class of MLH Fellows date: '2020-06-24' href: https://github.blog/2020-06-24-welcome-to-the-inaugural-class-of-mlh-fellows/ layout: product-landing versions: free-pro-team: '*' --- <!-- {% link_with_intro /teach-and-learn-with-github-education %} --> <!-- {% link_with_intro /manage-coursework-with-github-classroom %} --> 31 ...work-with-github-classroom/about-using-makecode-arcade-with-github-classroom.md @@ -0,0 +1,31 @@ --- title: About using MakeCode Arcade with GitHub Classroom shortTitle: About using MakeCode Arcade intro: You can configure MakeCode Arcade as the online IDE for assignments in {% data variables.product.prodname_classroom %}. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/student-experience-makecode --- ### About MakeCode Arcade MakeCode Arcade is an online integrated development environment (IDE) for developing retro arcade games using drag-and-drop block programming and JavaScript. Students can write, edit, run, test, and debug code in a browser with MakeCode Arcade. For more information about online IDEs and {% data variables.product.prodname_classroom %}, see "[Integrate {% data variables.product.prodname_classroom %} with an online IDE](/education/manage-coursework-with-github-classroom/integrate-github-classroom-with-an-online-ide)." {% data reusables.classroom.readme-contains-button-for-online-ide %} The first time the student clicks the button to visit MakeCode Arcade, the student must sign into MakeCode Arcade with {% data variables.product.product_name %} credentials. After signing in, the student will have access to a development environment containing the code from the assignment repository, fully configured on MakeCode Arcade. For more information about working on MakeCode Arcade, see the [MakeCode Arcade Tour](https://arcade.makecode.com/ide-tour) and [documentation](https://arcade.makecode.com/docs) on the MakeCode Arcade website. MakeCode Arcade does not support multiplayer-editing for group assignments. Instead, students can collaborate with Git and {% data variables.product.product_name %} features like branches and pull requests. ### About submission of assignments with MakeCode Arcade By default, MakeCode Arcade is configured to push to the assignment repository on {% data variables.product.product_location %}. After making progress on an assignment with MakeCode Arcade, students should push changes to {% data variables.product.product_location %} using the {% octicon "mark-github" aria-label="The GitHub mark" %}{% octicon "arrow-up" aria-label="The up arrow icon" %} button at the bottom of the screen.  ### Further reading - "[About READMEs](/github/creating-cloning-and-archiving-repositories/about-readmes)" 33 ...ge-coursework-with-github-classroom/about-using-replit-with-github-classroom.md @@ -0,0 +1,33 @@ --- title: About using Repl.it with GitHub Classroom shortTitle: About using Repl.it intro: You can configure Repl.it as the online integrated development environment (IDE) for assignments in {% data variables.product.prodname_classroom %}. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/student-experience-replit --- ### About Repl.it Repl.it is an online integrated development environment (IDE) that supports multiple programming languages. Students can write, edit, run, test, and debug code in a browser with Repl.it. For more information about online IDEs and {% data variables.product.prodname_classroom %}, see "[Integrate {% data variables.product.prodname_classroom %} with an online IDE](/education/manage-coursework-with-github-classroom/integrate-github-classroom-with-an-online-ide)." {% data reusables.classroom.readme-contains-button-for-online-ide %} The first time the student clicks the button to visit Repl.it, the student must sign into Repl.it with {% data variables.product.product_name %} credentials. After signing in, the student will have access to a development environment containing the code from the assignment repository, fully configured on Repl.it. For more information about working on Repl.it, see the [Repl.it Quickstart Guide](https://docs.repl.it/misc/quick-start#the-repl-environment). For group assignments, students can use Repl.it Multiplayer to work collaboratively. For more information, see the [Repl.it Multiplayer](https://repl.it/site/multiplayer) website. ### About submission of assignments with Repl.it By default, Repl.it is configured to push to the assignment repository on {% data variables.product.product_location %}. After making progress on an assignment with Repl.it, students should push changes to {% data variables.product.product_location %} using the version control functionality in the left sidebar.  For more information about using Git on Repl.it, see the [Repl.it + Git Tutorial](https://repl.it/talk/learn/Replit-Git-Tutorial/23331) on the Repl.it website. ### Further reading - "[About READMEs](/github/creating-cloning-and-archiving-repositories/about-readmes)" 33 ...anage-coursework-with-github-classroom/basics-of-setting-up-github-classroom.md @@ -0,0 +1,33 @@ --- title: Basics of setting up GitHub Classroom shortTitle: '{% data variables.product.prodname_classroom %} basics' intro: Learn how to set up your classroom, manage assignments, and configure time-saving automation. versions: free-pro-team: '*' --- ### Videos about {% data variables.product.prodname_classroom %} You can watch a series of short video tutorials about the configuration and use of {% data variables.product.prodname_classroom %}. To watch all videos as part of a continuous playlist, see the [{% data variables.product.prodname_classroom %} Getting Started Guide](https://www.youtube.com/playlist?list=PLIRjfNq867bewk3ZGV6Z7a16YDNRCpK3u) on YouTube. For more information about terminology for {% data variables.product.prodname_classroom %}, see "[Glossary](/education/manage-coursework-with-github-classroom/glossary)". 1. <a href="https://youtu.be/xVVeqIDgCvM" target="_blank">Getting started</a> {% octicon "link-external" aria-label="The external link icon" %} 2. <a href="https://youtu.be/DTzrKduaHj8" target="_blank">Adding your student roster</a> {% octicon "link-external" aria-label="The external link icon" %} 3. Creating assignments - <a href="https://youtu.be/6QzKZ63KLss" target="_blank">Creating an assignment using a {% data variables.product.prodname_dotcom %} repository</a> {% octicon "link-external" aria-label="The external link icon" %} - <a href="https://youtu.be/Qmwh6ijsQJU" target="_blank">Creating an assignment using Microsoft MakeCode as your online IDE</a> {% octicon "link-external" aria-label="The external link icon" %} - <a href="https://youtu.be/p_g5sQ7hUis" target="_blank">Creating an assignment using Repl.it as your online IDE</a> {% octicon "link-external" aria-label="The external link icon" %} 4. <a href="https://youtu.be/ObaFRGp_Eko" target="_blank">How students complete assignments</a> {% octicon "link-external" aria-label="The external link icon" %} 5. <a href="https://youtu.be/g45OJn3UyCU" target="_blank">How teachers review assignments</a> {% octicon "link-external" aria-label="The external link icon" %} 6. <a href="https://youtu.be/QxrA3taZdNM" target="_blank">Creating group assignments</a> {% octicon "link-external" aria-label="The external link icon" %} 7. <a href="https://youtu.be/tJK2cmoh1KM" target="_blank">Next steps to get started</a> {% octicon "link-external" aria-label="The external link icon" %} 8. <a href="https://youtu.be/X87v3SFQxLU" target="_blank">{% data variables.product.prodname_dotcom %} Teacher Toolbox</a> {% octicon "link-external" aria-label="The external link icon" %} ### Next steps For more information about teaching with {% data variables.product.prodname_classroom %}, see "[Teach with {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/teach-with-github-classroom)." ### Further reading - "[Teach and learn with {% data variables.product.prodname_education %}](/education/teach-and-learn-with-github-education)" 51 ...with-github-classroom/configure-default-settings-for-assignment-repositories.md @@ -0,0 +1,51 @@ --- title: Configure default settings for assignment repositories shortTitle: Configure defaults for assignment repositories intro: You can use the Probot Settings app to configure the default settings for repositories that {% data variables.product.prodname_classroom %} creates for an assignment. permissions: Organization owners can configure default settings for assignment repositories by installing a {% data variables.product.prodname_github_app %} for the organization. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/probot-settings --- ### About configuration of defaults for assignment repositories {% data variables.product.prodname_classroom %} creates a repository that belongs for each student or team that accepts an assignment. The repository belongs to the organization that you use for {% data variables.product.prodname_classroom %}. Assignment repositories can be empty, or you can use a template repository. For more information, see "[Create an assignment from a template repository](/education/manage-coursework-with-github-classroom/create-an-assignment-from-a-template-repository)." {% data reusables.classroom.you-may-want-to-predefine-repository-settings %} With the Probot Settings app, you can create a file named _.github/settings.yml_ in a repository that contains a list of settings for the repository, and then install a {% data variables.product.prodname_github_app %} for your organization that automatically applies the settings to the repository. You can include _.github/settings.yml_ in a template repository that you use for an assignment in {% data variables.product.prodname_classroom %}. When an individual or team accepts the assignment, {% data variables.product.prodname_classroom %} creates the assignment repository, and the Settings app automatically applies the settings from _.github/settings.yml_. Probot is a a project, framework, and collection of free apps to automate {% data variables.product.product_name %}. A Probot app can listen to repository events, like the creation of new commits, comments, and issues, and automatically respond to the event. For more information, see the [Probot website](https://probot.github.io) and the [Settings app website](https://probot.github.io/apps/settings/). For more information about {% data variables.product.prodname_github_apps %}, see "[About apps](/developers/apps/about-apps)." ### Adding the Settings app to your organization After you install the Probot Settings app for your organization, the app will apply the settings that you define in _.github/settings.yml_ for any repository in your organization, including new assignment repositories that {% data variables.product.prodname_classroom %} creates. 1. Navigate to the [Settings app page](https://github.com/apps/settings). 1. Click **Install**, then click the organization that you use for {% data variables.product.prodname_classroom %}. Provide the app full access to all repositories owned by the organization.  ### Configuring default settings for an assignment repository 1. Create a template repository that contains a _.github/settings.yml_ file. For a complete list of settings, see the [README](https://github.com/probot/settings#github-settings) for the `probot/settings` repository. For more information about using a template repository for starter code in {% data variables.product.prodname_classroom %}, see "[Create an assignment from a template repository](/education/manage-coursework-with-github-classroom/create-an-assignment-from-a-template-repository)." {% warning %} **Warning:** Do not define `collaborators` in the _.github/settings.yml_ file for your template repository. {% data variables.product.prodname_classroom %} automatically grants teachers and teaching assistants access to assignment repositories. {% endwarning %} 1. Create an assignment using the template repository containing _.github/settings.yml_ as the starter code. {% data reusables.classroom.for-more-information-about-assignment-creation %} The Probot Settings app for your organization will now apply the settings you define in _.github/settings.yml_ within the template repository to every assignment repository that {% data reusables.classroom.you-may-want-to-predefine-repository-settings %} creates for a student or team. ### Further reading - [Probot apps](https://probot.github.io/apps/) - [Probot documentation](https://probot.github.io/docs/) 142 ...th-github-classroom/connect-a-learning-management-system-to-github-classroom.md @@ -0,0 +1,142 @@ --- title: Connect a learning management system to GitHub Classroom intro: You can configure an LTI-compliant learning management system (LMS) to connect to {% data variables.product.prodname_classroom %} so that you can import a roster for your classroom. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/configuring-a-learning-management-system-for-github-classroom - /education/manage-coursework-with-github-classroom/connect-to-lms - /education/manage-coursework-with-github-classroom/generate-lms-credentials - /education/manage-coursework-with-github-classroom/setup-canvas - /education/manage-coursework-with-github-classroom/setup-generic-lms - /education/manage-coursework-with-github-classroom/setup-moodle --- ### About configuration of your LMS You can connect a learning management system (LMS) to {% data variables.product.prodname_classroom %}, and {% data variables.product.prodname_classroom %} can import a roster of student identifiers from the LMS. To connect your LMS to {% data variables.product.prodname_classroom %}, you must enter configuration credentials for {% data variables.product.prodname_classroom %} in your LMS. ### Prerequisites To configure an LMS to connect to {% data variables.product.prodname_classroom %}, you must first create a classroom. For more information, see "[Manage classrooms](/education/manage-coursework-with-github-classroom/manage-classrooms#creating-a-classroom)." ### Supported LMSes {% data variables.product.prodname_classroom %} supports import of roster data from LMSes that implement Learning Tools Interoperability (LTI) standards. - LTI version 1.0 and/or 1.1 - LTI Names and Roles Provisioning 1.X Using LTI helps keep your information safe and secure. LTI is an industry-standard protocol and GitHub Classroom's use of LTI is certified by the Instructional Management System (IMS) Global Learning Consortium. For more information, see [Learning Tools Interoperability](https://www.imsglobal.org/activity/learning-tools-interoperability) and [About IMS Global Learning Consortium](http://www.imsglobal.org/aboutims.html) on the IMS Global Learning Consortium website. {% data variables.product.company_short %} has tested import of roster data from the following LMSes into {% data variables.product.prodname_classroom %}. - Canvas - Google Classroom - Moodle - Sakai Currently, {% data variables.product.prodname_classroom %} doesn't support import of roster data from Blackboard or Brightspace ### Generating configuration credentials for your classroom {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-students %} 1. If your classroom already has a roster, you can either update the roster or delete the roster and create a new roster. - For more information about deleting and creating a roster, see "[Deleting a roster for a classroom](/education/manage-coursework-with-github-classroom/manage-classrooms#deleting-a-roster-for-a-classroom)" and "[Creating a roster for your classroom](/education/manage-coursework-with-github-classroom/manage-classrooms#creating-a-roster-for-your-classroom)." - For more information about updating a roster, see "[Adding students to the roster for your classroom](/education/manage-coursework-with-github-classroom/manage-classrooms#adding-students-to-the-roster-for-your-classroom)." 1. In the list of LMSes, click your LMS. If your LMS is not supported, click **Other LMS**.  1. Read about connecting your LMS, then click **Connect to _LMS_**. 1. Copy the "Consumer Key", "Shared Secret", and "Launch URL" for the connection to the classroom.  ### Configuring a generic LMS You must configure the privacy settings for your LMS to allow external tools to receive roster information. 1. Navigate to your LMS. 1. Configure an external tool. 1. Provide the configuration credentials you generated in {% data variables.product.prodname_classroom %}. - Consumer key - Shared secret - Launch URL (sometimes called "tool URL" or similar) ### Configuring Canvas You can configure {% data variables.product.prodname_classroom %} as an external app for Canvas to import roster data into your classroom. For more information about Canvas, see the [Canvas website](https://www.instructure.com/canvas/). 1. Sign into [Canvas](https://www.instructure.com/canvas/#login). 1. Select the Canvas course to integrate with {% data variables.product.prodname_classroom %}. 1. In the left sidebar, click **Settings**. 1. Click the **Apps** tab. 1. Click **View app configurations**. 1. Click **+App**. 1. Select the **Configuration Type** drop-down menu, and click **By URL**. 1. Paste the configuration credentials from {% data variables.product.prodname_classroom %}. For more information, see "[Generating configuration credentials for your classroom](#generating-configuration-credentials-for-your-classroom)." | Field in Canvas app configuration | Value or setting | | :- | :- | | **Consumer Key** | Consumer key from {% data variables.product.prodname_classroom %} | | **Shared Secret** | Shared secret from {% data variables.product.prodname_classroom %} | | **Allow this tool to access the IMS Names and Role Provisioning Service** | Enabled | | **Configuration URL** | Launch URL from {% data variables.product.prodname_classroom %} | {% note %} **Note**: If you don't see a checkbox in Canvas labeled "Allow this tool to access the IMS Names and Role Provisioning Service", then your Canvas administrator must contact Canvas support to enable membership service configuration for your Canvas account. Without enabling this feature, you won't be able to sync the roster from Canvas. For more information, see [How do I contact Canvas Support?](https://community.canvaslms.com/t5/Canvas-Basics-Guide/How-do-I-contact-Canvas-Support/ta-p/389767) on the Canvas website. {% endnote %} 1. Click **Submit**. 1. In the left sidebar, click **Home**. 1. To prompt Canvas to send a confirmation email, in the left sidebar, click **GitHub Classroom**. Follow the instructions in the email to finish linking {% data variables.product.prodname_classroom %}. ### Configuring Moodle You can configure {% data variables.product.prodname_classroom %} as an activity for Moodle to import roster data into your classroom. For more information about Moodle, see the [Moodle website](https://moodle.org). You must be using Moodle version 3.0 or greater. 1. Sign into [Moodle](https://moodle.org/login/index.php). 1. Select the Moodle course to integrate with {% data variables.product.prodname_classroom %}. 1. Click **Turn editing on**. 1. Wherever you'd like {% data variables.product.prodname_classroom %} to be available in Moodle, click **Add an activity or resource**. 1. Choose **External tool** and click **Add**. 1. In the "Activity name" field, type "GitHub Classroom". 1. In the **Preconfigured tool** field, to the right of the drop-down menu, click **+**. 1. Under "External tool configuration", paste the configuration credentials from {% data variables.product.prodname_classroom %}. For more information, see "[Generating configuration credentials for your classroom](#generating-configuration-credentials-for-your-classroom)." | Field in Moodle app configuration | Value or setting | | :- | :- | | **Tool name** | {% data variables.product.prodname_classroom %} - _YOUR CLASSROOM NAME_<br/><br/>**Note**: You can use any name, but we suggest this value for clarity. | | **Tool URL** | Launch URL from {% data variables.product.prodname_classroom %} | | **LTI version** | LTI 1.0/1.1 | | **Default launch container** | New window | | **Consumer key** | Consumer key from {% data variables.product.prodname_classroom %} | | **Shared secret** | Shared secret from {% data variables.product.prodname_classroom %} | 1. Scroll to and click **Services**. 1. To the right of "IMS LTI Names and Role Provisioning", select the drop-down menu and click **Use this service to retrieve members' information as per privacy settings**. 1. Scroll to and click **Privacy**. 1. To the right of **Share launcher's name with tool** and **Share launcher's email with tool**, select the drop-down menus to click **Always**. 1. At the bottom of the page, click **Save changes**. 1. In the **Preconfigure tool** menu, click **GitHub Classroom - _YOUR CLASSROOM NAME_**. 1. Under "Common module settings", to the right of "Availability", select the drop-down menu and click **Hide from students**. 1. At the bottom of the page, click **Save and return to course**. 1. Navigate to anywhere you chose to display {% data variables.product.prodname_classroom %}, and click the {% data variables.product.prodname_classroom %} activity. ### Importing a roster from your LMS For more information about importing the roster from your LMS into {% data variables.product.prodname_classroom %}, see "[Manage classrooms](/education/manage-coursework-with-github-classroom/manage-classrooms#creating-a-roster-for-your-classroom)." ### Disconnecting your LMS {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-settings %} 1. Under "Connect to a learning management system (LMS)", click **Connection Settings**.  1. Under "Delete Connection to your learning management system", click **Disconnect from your learning management system**.  145 .../education/manage-coursework-with-github-classroom/create-a-group-assignment.md @@ -0,0 +1,145 @@ --- title: Create a group assignment intro: 'You can create a collaborative assignment for teams of students who participate in your course.' versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/create-group-assignments --- ### About group assignments {% data reusables.classroom.assignments-group-definition %} Students can work together on a group assignment in a shared repository, like a team of professional developers. When a student accepts a group assignment, the student can create a new team or join an existing team. {% data variables.product.prodname_classroom %} saves the teams for an assignment as a set. You can name the set of teams for a specific assignment when you create the assignment, and you can reuse that set of teams for a later assignment. {% data reusables.classroom.classroom-creates-group-repositories %} {% data reusables.classroom.about-assignments %} You can decide how many teams one assignment can have, and how many members each team can have. Each team that a student creates for an assignment is a team within your organization on {% data variables.product.product_name %}. The visibility of the team is secret. Teams that you create on {% data variables.product.product_name %} will not appear in {% data variables.product.prodname_classroom %}. For more information, see "[About teams](/github/setting-up-and-managing-organizations-and-teams/about-teams)." For a video demonstration of the creation of a group assignment, see "[Basics of setting up {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/basics-of-setting-up-github-classroom)." ### Prerequisites {% data reusables.classroom.assignments-classroom-prerequisite %} ### Creating an assignment {% data reusables.classroom.assignments-guide-create-the-assignment %} ### Setting up the basics for an assignment Name your assignment, decide whether to assign a deadline, define teams, and choose the visibility of assignment repositories. - [Naming an assignment](#naming-an-assignment) - [Assigning a deadline for an assignment](#assigning-a-deadline-for-an-assignment) - [Choosing an assignment type](#choosing-an-assignment-type) - [Defining teams for an assignment](#defining-teams-for-an-assignment) - [Choosing a visibility for assignment repositories](#choosing-a-visibility-for-assignment-repositories) #### Naming an assignment For a group assignment, {% data variables.product.prodname_classroom %} names repositories by the repository prefix and the name of the team. By default, the repository prefix is the assignment title. For example, if you name an assignment "assignment-1" and the team's name on {% data variables.product.product_name %} is "student-team", the name of the assignment repository for members of the team will be `assignment-1-student-team`. {% data reusables.classroom.assignments-type-a-title %} #### Assigning a deadline for an assignment {% data reusables.classroom.assignments-guide-assign-a-deadline %} #### Choosing an assignment type Under "Individual or group assignment", select the drop-down menu, then click **Group assignment**. You can't change the assignment type after you create the assignment. If you'd rather create a individual assignment, see "[Create an individual assignment](/education/manage-coursework-with-github-classroom/create-an-individual-assignment)." #### Defining teams for an assignment If you've already created a group assignment for the classroom, you can reuse a set of teams for the new assignment. To create a new set with the teams that your students create for the assignment, type the name for the set. Optionally, type the maximum number of team members and total teams. {% tip %} **Tips**: - We recommend including details about the set of teams in the name for the set. For example, if you want to use the set of teams for one assignment, name the set after the assignment. If you want to reuse the set throughout a semester or course, name the set after the semester or course. - If you'd like to assign students to a specific team, give your students a name for the team and provide a list of members. {% endtip %}  #### Choosing a visibility for assignment repositories {% data reusables.classroom.assignments-guide-choose-visibility %} {% data reusables.classroom.assignments-guide-click-continue-after-basics %} ### Adding starter code and configuring a development environment {% data reusables.classroom.assignments-guide-intro-for-environment %} - [Choosing a template repository](#choosing-a-template-repository) - [Choosing an online integrated development environment (IDE)](#choosing-an-online-integrated-development-environment-ide) #### Choosing a template repository By default, a new assignment will create an empty repository for each team that a student creates. {% data reusables.classroom.you-can-choose-a-template-repository %} For more information about template repositories, see "[Creating a template repository](/github/creating-cloning-and-archiving-repositories/creating-a-template-repository)." {% data reusables.classroom.assignments-guide-choose-template-repository %} #### Choosing an online integrated development environment (IDE) {% data reusables.classroom.about-online-ides %} For more information, see "[Integrate {% data variables.product.prodname_classroom %} with an IDE](/education/manage-coursework-with-github-classroom/integrate-github-classroom-with-an-ide)." {% data reusables.classroom.assignments-guide-choose-an-online-ide %} {% data reusables.classroom.assignments-guide-click-continue-after-starter-code-and-feedback %} ### Providing feedback Optionally, you can automatically grade assignments and create a space for discussing each submission with the team. - [Testing assignments automatically](#testing-assignments-automatically) - [Preventing changes to important files](#preventing-changes-to-important-files) - [Creating a pull request for feedback](#creating-a-pull-request-for-feedback) #### Testing assignments automatically {% data reusables.classroom.assignments-guide-using-autograding %} #### Preventing changes to important files {% data reusables.classroom.assignments-guide-prevent-changes %} #### Creating a pull request for feedback {% data reusables.classroom.you-can-create-a-pull-request-for-feedback %} {% data reusables.classroom.assignments-guide-create-review-pull-request %} {% data reusables.classroom.assignments-guide-click-create-assignment-button %} ### Inviting students to an assignment {% data reusables.classroom.assignments-guide-invite-students-to-assignment %} You can see the teams that are working on or have submitted an assignment in the **Teams** tab for the assignment. {% data reusables.classroom.assignments-to-prevent-submission %} <div class="procedural-image-wrapper"> <img alt="Group assignment" class="procedural-image-wrapper" src="/assets/images/help/classroom/assignment-group-hero.png"> </div> ### Next steps - After you create the assignment and your students form teams, team members can start work on the assignment using Git and {% data variables.product.product_name %}'s features. Students can clone the repository, push commits, manage branches, create and review pull requests, address merge conflicts, and discuss changes with issues. Both you and the team can review the commit history for the repository. For more information, see "[Getting started with {% data variables.product.prodname_dotcom %}](/github/getting-started-with-github)," "[Creating, cloning, and archiving repositories](/github/creating-cloning-and-archiving-repositories)," "[Using Git](/github/using-git)," and "[Collaborating with issues and pull requests](/github/collaborating-with-issues-and-pull-requests)," and the free course on [managing merge conflicts](https://lab.github.com/githubtraining/managing-merge-conflicts) from {% data variables.product.prodname_learning %}. - When a team finishes an assignment, you can review the files in the repository, or you can review the history and visualizations for the repository to better understand how the team collaborated. For more information, see "[Visualizing repository data with graphs](/github/visualizing-repository-data-with-graphs)." - You can provide feedback for an assignment by commenting on individual commits or lines in a pull request. For more information, see "[Commenting on a pull request](/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request)" and "[Opening an issue from code](/github/managing-your-work-on-github/opening-an-issue-from-code)." For more information about creating saved replies to provide feedback for common errors, see "[About saved replies](/github/writing-on-github/about-saved-replies)." ### Further reading - "[Use {% data variables.product.prodname_dotcom %} in your classroom and research](/education/teach-and-learn-with-github-education/use-github-in-your-classroom-and-research)" - "[Connect a learning management system to {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/connect-a-learning-management-system-to-github-classroom)" - [Using Existing Teams in Group Assignments?](https://education.github.community/t/using-existing-teams-in-group-assignments/6999) in the {% data variables.product.prodname_education %} Community 19 ...sework-with-github-classroom/create-an-assignment-from-a-template-repository.md @@ -0,0 +1,19 @@ --- title: Create an assignment from a template repository intro: You can create an assignment from a template repository to provide starter code, documentation, and other resources to your students. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/using-template-repos-for-assignments --- You can use a template repository on {% data variables.product.product_name %} as starter code for an assignment on {% data variables.product.prodname_classroom %}. Your template repository can contain boilerplate code, documentation, and other resources for your students. For more information, see "[Creating a template repository](/github/creating-cloning-and-archiving-repositories/creating-a-template-repository)." To use the template repository for your assignment, the template repository must be owned by your organization, or the visibility of the template repository must be public. {% data reusables.classroom.you-may-want-to-predefine-repository-settings %} For more information, see "[Configure default settings for assignment repositories](/education/manage-coursework-with-github-classroom/configure-default-settings-for-assignment-repositories)." ### Further reading - "[Create an individual assignment](/education/manage-coursework-with-github-classroom/create-an-individual-assignment)" - "[Create a group assignment](/education/manage-coursework-with-github-classroom/create-a-group-assignment)" 124 ...tion/manage-coursework-with-github-classroom/create-an-individual-assignment.md @@ -0,0 +1,124 @@ --- title: Create an individual assignment intro: You can create an assignment for students in your course to complete individually. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/creating-an-individual-assignment - /education/manage-coursework-with-github-classroom/create-an-individual-assignment --- ### About individual assignments {% data reusables.classroom.assignments-individual-definition %} {% data reusables.classroom.classroom-creates-individual-repositories %} {% data reusables.classroom.about-assignments %} For a video demonstration of the creation of an individual assignment, see "[Basics of setting up {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/basics-of-setting-up-github-classroom)." ### Prerequisites {% data reusables.classroom.assignments-classroom-prerequisite %} ### Creating an assignment {% data reusables.classroom.assignments-guide-create-the-assignment %} ### Setting up the basics for an assignment Name your assignment, decide whether to assign a deadline, and choose the visibility of assignment repositories. - [Naming an assignment](#naming-an-assignment) - [Assigning a deadline for an assignment](#assigning-a-deadline-for-an-assignment) - [Choosing an assignment type](#choosing-an-assignment-type) - [Choosing a visibility for assignment repositories](#choosing-a-visibility-for-assignment-repositories) #### Naming an assignment For an individual assignment, {% data variables.product.prodname_classroom %} names repositories by the repository prefix and the student's {% data variables.product.product_name %} username. By default, the repository prefix is the assignment title. For example, if you name an assignment "assignment-1" and the student's username on {% data variables.product.product_name %} is @octocat, the name of the assignment repository for @octocat will be `assignment-1-octocat`. {% data reusables.classroom.assignments-type-a-title %} #### Assigning a deadline for an assignment {% data reusables.classroom.assignments-guide-assign-a-deadline %} #### Choosing an assignment type Under "Individual or group assignment", select the drop-down menu, and click **Individual assignment**. You can't change the assignment type after you create the assignment. If you'd rather create a group assignment, see "[Create a group assignment](/education/manage-coursework-with-github-classroom/create-a-group-assignment)." #### Choosing a visibility for assignment repositories {% data reusables.classroom.assignments-guide-choose-visibility %} {% data reusables.classroom.assignments-guide-click-continue-after-basics %} ### Adding starter code and configuring a development environment {% data reusables.classroom.assignments-guide-intro-for-environment %} - [Choosing a template repository](#choosing-a-template-repository) - [Choosing an online integrated development environment (IDE)](#choosing-an-online-integrated-development-environment-ide) #### Choosing a template repository By default, a new assignment will create an empty repository for each student on the roster for the classroom. {% data reusables.classroom.you-can-choose-a-template-repository %} For more information about template repositories, see "[Creating a template repository](/github/creating-cloning-and-archiving-repositories/creating-a-template-repository)." {% data reusables.classroom.assignments-guide-choose-template-repository %} {% data reusables.classroom.assignments-guide-click-continue-after-starter-code-and-feedback %} #### Choosing an online integrated development environment (IDE) {% data reusables.classroom.about-online-ides %} For more information, see "[Integrate {% data variables.product.prodname_classroom %} with an IDE](/education/manage-coursework-with-github-classroom/integrate-github-classroom-with-an-ide)." {% data reusables.classroom.assignments-guide-choose-an-online-ide %} ### Providing feedback for an assignment Optionally, you can automatically grade assignments and create a space for discussing each submission with the student. - [Testing assignments automatically](#testing-assignments-automatically) - [Preventing changes to important files](#preventing-changes-to-important-files) - [Creating a pull request for feedback](#creating-a-pull-request-for-feedback) #### Testing assignments automatically {% data reusables.classroom.assignments-guide-using-autograding %} #### Preventing changes to important files {% data reusables.classroom.assignments-guide-prevent-changes %} #### Creating a pull request for feedback {% data reusables.classroom.you-can-create-a-pull-request-for-feedback %} {% data reusables.classroom.assignments-guide-create-review-pull-request %} {% data reusables.classroom.assignments-guide-click-create-assignment-button %} ### Inviting students to an assignment {% data reusables.classroom.assignments-guide-invite-students-to-assignment %} You can see whether a student has joined the classroom and accepted or submitted an assignment in the **All students** tab for the assignment. {% data reusables.classroom.assignments-to-prevent-submission %} <div class="procedural-image-wrapper"> <img alt="Individual assignment" class="procedural-image-wrapper" src="/assets/images/help/classroom/assignment-individual-hero.png"> </div> ### Next steps - Once you create the assignment, students can start work on the assignment using Git and {% data variables.product.product_name %}'s features. Students can clone the repository, push commits, manage branches, create and review pull requests, address merge conflicts, and discuss changes with issues. Both you and student can review the commit history for the repository. For more information, see "[Getting started with {% data variables.product.prodname_dotcom %}](/github/getting-started-with-github)," "[Creating, cloning, and archiving repositories](/github/creating-cloning-and-archiving-repositories)," "[Using Git](/github/using-git)," and "[Collaborating with issues and pull requests](/github/collaborating-with-issues-and-pull-requests)." - When a student finishes an assignment, you can review the files in the repository, or you can review the history and visualizations for the repository to better understand the student's work. For more information, see "[Visualizing repository data with graphs](/github/visualizing-repository-data-with-graphs)." - You can provide feedback for an assignment by commenting on individual commits or lines in a pull request. For more information, see "[Commenting on a pull request](/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request)" and "[Opening an issue from code](/github/managing-your-work-on-github/opening-an-issue-from-code)." For more information about creating saved replies to provide feedback for common errors, see "[About saved replies](/github/writing-on-github/about-saved-replies)." ### Further reading - "[Use {% data variables.product.prodname_dotcom %} in your classroom and research](/education/teach-and-learn-with-github-education/use-github-in-your-classroom-and-research)" - "[Connect a learning management system to {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/connect-a-learning-management-system-to-github-classroom)" 9 ...on/manage-coursework-with-github-classroom/get-started-with-github-classroom.md @@ -0,0 +1,9 @@ --- title: Get started with GitHub Classroom shortTitle: Get started intro: Learn how to configure and use {% data variables.product.prodname_classroom %} to administer your course. mapTopic: true versions: free-pro-team: '*' --- 52 content/education/manage-coursework-with-github-classroom/glossary.md @@ -0,0 +1,52 @@ --- title: Glossary intro: You can review explanations of terminology for {% data variables.product.prodname_classroom %}. versions: free-pro-team: '*' --- ### assignment An assignment is coursework in {% data variables.product.prodname_classroom %}. A teacher can assign an assignment to an individual student or a group of students. Teachers can import starter code for the assignment, assign students, and create a deadline for each assignment. For more information, see the definitions for "[individual assignment](#individual-assignment)" and "[group assignment](#group-assignment)." --- ### classroom A classroom is the basic unit of {% data variables.product.prodname_classroom %}. Teachers can use a classroom to organize and manage students, teaching assistants, and assignments for a single course. A classroom belongs to an organization on {% data variables.product.prodname_dotcom_the_website %}. To administer a classroom, you must be an organization owner for the organization on {% data variables.product.prodname_dotcom %}. For more information, see "[Manage classrooms](/education/manage-coursework-with-github-classroom/manage-classrooms)." --- ### {% data variables.product.prodname_classroom %} {% data variables.product.prodname_classroom %} is a web application for educators that provides course administration tools integrated with {% data variables.product.prodname_dotcom %}. For more information, see the [{% data variables.product.prodname_classroom %}](https://classroom.github.com/) website. --- ### group assignment {% data reusables.classroom.assignments-group-definition %} For more information, see "[Create a group assignment](/education/manage-coursework-with-github-classroom/create-a-group-assignment)." --- ### identifier An identifier in {% data variables.product.prodname_classroom %} is a unique ID for a student participating in a course. For example, an identifier can be a student name, alphanumeric ID, or email address. --- ### individual assignment {% data reusables.classroom.assignments-individual-definition %} For more information, see "[Create an individual assignment](/education/manage-coursework-with-github-classroom/create-an-individual-assignment)." --- ### roster A roster allows a teacher to manage students and assignment submissions in a classroom on {% data variables.product.prodname_classroom %}. Teachers can create a roster by entering a list of student identifiers, or by connecting {% data variables.product.prodname_classroom %} to a learning management system (LMS). For more information about identifiers, see the definition of "[identifier](#identifier)." For more information about connecting {% data variables.product.prodname_classroom %} to an LMS, see "[Connect a learning management system to {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/connect-a-learning-management-system-to-github-classroom)." --- ### Further reading - "[{% data variables.product.prodname_dotcom %} glossary](/github/getting-started-with-github/github-glossary)" 32 content/education/manage-coursework-with-github-classroom/index.md @@ -0,0 +1,32 @@ --- title: Manage coursework with GitHub Classroom shortTitle: '{% data variables.product.prodname_classroom %}' intro: With {% data variables.product.prodname_classroom %}, you can use {% data variables.product.product_name %} to administer or participate in a course about software development. versions: free-pro-team: '*' --- ### Table of Contents {% topic_link_in_list /get-started-with-github-classroom %} {% link_in_list /basics-of-setting-up-github-classroom %} {% link_in_list /glossary %} {% topic_link_in_list /teach-with-github-classroom %} {% link_in_list /manage-classrooms %} {% link_in_list /create-an-individual-assignment %} {% link_in_list /create-a-group-assignment %} {% link_in_list /create-an-assignment-from-a-template-repository %} {% link_in_list /leave-feedback-with-pull-requests %} {% link_in_list /use-autograding %} {% link_in_list /configure-default-settings-for-assignment-repositories %} {% link_in_list /connect-a-learning-management-system-to-github-classroom %} {% topic_link_in_list /integrate-github-classroom-with-an-ide %} {% link_in_list /integrate-github-classroom-with-an-online-ide %} {% link_in_list /about-using-makecode-arcade-with-github-classroom %} {% link_in_list /about-using-replit-with-github-classroom %} {% link_in_list /run-student-code-in-an-online-ide %} {% topic_link_in_list /learn-with-github-classroom %} {% link_in_list /view-autograding-results %} 8 ...nage-coursework-with-github-classroom/integrate-github-classroom-with-an-ide.md @@ -0,0 +1,8 @@ --- title: Integrate GitHub Classroom with an IDE shortTitle: Integrate with an IDE intro: You can help your students write, test, and debug code by preconfiguring a development environment for assignment repositories on {% data variables.product.prodname_classroom %}. mapTopic: true versions: free-pro-team: '*' --- 42 ...ursework-with-github-classroom/integrate-github-classroom-with-an-online-ide.md @@ -0,0 +1,42 @@ --- title: Integrate GitHub Classroom with an online IDE shortTitle: Integrate with an online IDE intro: You can preconfigure a supported online integrated development environment (IDE) for assignments you create in {% data variables.product.prodname_classroom %}. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/online-ide-integrations --- ### About integration with an online IDE {% data reusables.classroom.about-online-ides %} After a student accepts an assignment with an online IDE, the README file in the student's assignment repository will contain a button to open the assignment in the IDE. The student can begin working immediately, and no additional configuration is necessary.  ### Supported online IDEs {% data variables.product.prodname_classroom %} supports the following online IDEs. You can learn more about the student experience for each IDE. | IDE | More information | | :- | :- | | Microsoft MakeCode Arcade | "[About using MakeCode Arcade with {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/about-using-makecode-arcade-with-github-classroom)" | | Repl.it | "[About using Repl.it with GitHub Classroom](/education/manage-coursework-with-github-classroom/about-using-replit-with-github-classroom)" | ### Configuring an online IDE for an assignment You can choose the online IDE you'd like to use for an assignment when you create an assignment. To learn how to create a new assignment that uses an online IDE, see "[Create an individual assignment](/education/manage-coursework-with-github-classroom/create-an-individual-assignment)" or "[Create a group assignment](/education/manage-coursework-with-github-classroom/create-a-group-assignment)." ### Authorizing the OAuth app for an online IDE The first time you configure an assignment with an online IDE, you must authorize the OAuth app for the online IDE for your organization.  For all repositories, grant the app **read** access to metadata, administration, and code, and **write** access to administration and code. For more information, see "[Authorizing OAuth Apps](/github/authenticating-to-github/authorizing-oauth-apps)." ### Further reading - "[About READMEs](/github/creating-cloning-and-archiving-repositories/about-readmes)" 7 ...ducation/manage-coursework-with-github-classroom/learn-with-github-classroom.md @@ -0,0 +1,7 @@ --- title: Learn with GitHub Classroom intro: You can participate in coursework in {% data variables.product.prodname_classroom %} and see results from your teacher. mapTopic: true versions: free-pro-team: '*' --- 33 ...on/manage-coursework-with-github-classroom/leave-feedback-with-pull-requests.md @@ -0,0 +1,33 @@ --- title: Leave feedback with pull requests intro: You can leave feedback for your students in a special pull request within the repository for each assignment. permissions: People with read permissions to a repository can leave feedback in a pull request for the repository. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/leaving-feedback-in-github --- ### About feedback pull requests for assignments {% data reusables.classroom.you-can-create-a-pull-request-for-feedback %} When you enable the pull request for feedback for an assignment, {% data variables.product.prodname_classroom %} will create a special pull request titled **Feedback** in the assignment repository for each student or team. The pull request automatically shows every commit that a student pushed to the assignment repository's default branch. ### Prerequisites To create and access the feedback pull request, you must enable the feedback pull request when you create the assignment. {% data reusables.classroom.for-more-information-about-assignment-creation %} ### Leaving feedback in a pull request for an assignment {% data reusables.classroom.sign-into-github-classroom %} 1. In the list of classrooms, click the classroom with the assignment you want to review.  {% data reusables.classroom.click-assignment-in-list %} 1. To the right of the submission, click **Review**.  1. Review the pull request. For more information, see "[Commenting on a pull request](/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request)." ### Further reading - "[Integrate {% data variables.product.prodname_classroom %} with an IDE](http://localhost:4000/en/free-pro-team@latest/education/manage-coursework-with-github-classroom/integrate-github-classroom-with-an-ide)" 121 content/education/manage-coursework-with-github-classroom/manage-classrooms.md @@ -0,0 +1,121 @@ --- title: Manage classrooms intro: You can create and manage a classroom for each course that you teach using {% data variables.product.prodname_classroom %}. permissions: Organization owners can manage a classroom for an organization. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/archive-a-classroom --- ### About classrooms {% data reusables.classroom.about-classrooms %}  ### About management of classrooms {% data variables.product.prodname_classroom %} uses organization accounts on {% data variables.product.product_name %} to manage permissions, administration, and security for each classroom that you create. Each organization can have multiple classrooms. After you create a classroom, {% data variables.product.prodname_classroom %} will prompt you to invite teaching assistants (TAs) and admins to the classroom. Each classroom can have one or more admins. Admins can be teachers, TAs, or any other course administrator who you'd like to have control over your classrooms on {% data variables.product.prodname_classroom %}. Invite TAs and admins to your classroom by inviting the user accounts on {% data variables.product.product_name %} to your organization as organization owners and sharing the URL for your classrom. Organization owners can administer any classroom for the organization. For more information, see "[Permission levels for an organization](/github/setting-up-and-managing-organizations-and-teams/permission-levels-for-an-organization)" and "[Inviting users to join your organization](/github/setting-up-and-managing-organizations-and-teams/inviting-users-to-join-your-organization)." When you're done using a classroom, you can archive the classroom and refer to the classroom, roster, and assignments later, or you can delete the classroom if you no longer need the classroom. ### About classroom rosters Each classroom has a roster. A roster is a list of identifiers for the students who participate in your course. When you first share the URL for an assignment with a student, the student must sign into {% data variables.product.product_name %} with a user account to link the user account to an identifier for the classroom. After the student links a user account, you can see the associated user account in the roster. You can also see when the student accepts or submits an assignment.  ### Prerequisites You must have an organization account on {% data variables.product.product_name %} to manage classrooms on {% data variables.product.prodname_classroom %}. For more information, see "[Types of {% data variables.product.company_short %} accounts](/github/getting-started-with-github/types-of-github-accounts#organization-accounts)" and "[Creating a new organization from scratch](/github/setting-up-and-managing-organizations-and-teams/creating-a-new-organization-from-scratch)." You must authorize the OAuth app for {% data variables.product.prodname_classroom %} for your organization to manage classrooms for your organization account. For more information, see "[Authorizing OAuth Apps](/github/authenticating-to-github/authorizing-oauth-apps)." ### Creating a classroom {% data reusables.classroom.sign-into-github-classroom %} 1. Click **New classroom**.  {% data reusables.classroom.guide-create-new-classroom %} After you create a classroom, you can begin creating assignments for students. For more information, see "[Create an individual assignment](/education/manage-coursework-with-github-classroom/create-an-individual-assignment)" or "[Create a group assignment](/education/manage-coursework-with-github-classroom/create-a-group-assignment)." ### Creating a roster for your classroom You can create a roster of the students who participate in your course. If your course already has a roster, you can update the students on the roster or delete the roster. For more information, see "[Adding a student to the roster for your classroom](#adding-students-to-the-roster-for-your-classroom)" or "[Deleting a roster for a classroom](#deleting-a-roster-for-a-classroom)." {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-students %} 1. To connect {% data variables.product.prodname_classroom %} to your LMS and import a roster, click {% octicon "mortar-board" aria-label="The mortar board icon" %} **Import from a learning management system** and follow the instructions. For more information, see "[Connect a learning management system to {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/connect-a-learning-management-system-to-github-classroom)."  1. To create a roster manually, type your student identifiers. Optionally, click **Upload a CSV or text file** to upload a file containing the identifiers.  1. Click **Create roster**.  ### Adding students to the roster for your classroom Your classroom must have an existing roster to add students to the roster. For more information about creating a roster, see "[Creating a roster for your classrom](#creating-a-roster-for-your-classroom)." {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-students %} 1. To the right of "Classroom roster", click **Update students**.  1. Follow the instructions to add students to the roster. - To import students from an LMS, click **Sync from a learning management system**. For more information about importing a roster from an LMS, see "[Connect a learning management system to {% data variables.product.prodname_classroom %}](/education/manage-coursework-with-github-classroom/connect-a-learning-management-system-to-github-classroom)." - To manually add students, under "Manually add students", click **Upload a CSV or text file** or type the identifiers for the students, then click **Add roster entries**.  ### Renaming a classroom {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-settings %} 1. Under "Classroom name", type a new name for the classroom.  1. Click **Rename classroom**.  ### Archiving or unarchiving a classroom You can archive a classroom that you no longer use on {% data variables.product.prodname_classroom %}. When you archive a classroom, you can't create new assignments or edit existing assignments for the classroom. Students can't accept invitations to assignments in archived classrooms. {% data reusables.classroom.sign-into-github-classroom %} 1. To the right of a classroom's name, select the {% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %} drop-down menu, then click **Archive**.  1. To unarchive a classroom, to the right of a classroom's name, select the {% octicon "kebab-horizontal" aria-label="The horizontal kebab icon" %} drop-down menu, then click **Unarchive**.  ### Deleting a roster for a classroom {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-students %} 1. Under "Delete this roster", click **Delete roster**.  1. Read the warnings, then click **Delete roster**.  ### Deleting a classroom {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-settings %} 1. To the right of "Delete this classroom", click **Delete classroom**.  1. **Read the warnings**. 1. To verify that you're deleting the correct classroom, type the name of the classroom you want to delete.  1. Click **Delete classroom**.  22 ...on/manage-coursework-with-github-classroom/run-student-code-in-an-online-ide.md @@ -0,0 +1,22 @@ --- title: Run student code in an online IDE intro: You can run the code from a student assignment within the online integrated development environment (IDE) that you configured for the assignment. versions: free-pro-team: '*' redirect_from: - /education/manage-coursework-with-github-classroom/running-student-code --- ### About student code and online IDEs If you configure an online integrated development environment (IDE) for an assignment, you can run the code within the online IDE. You don't need to clone the assignment repository to your computer. For more information about online IDEs, see "[Integrate {% data variables.product.prodname_classroom %} with an online IDE](/education/manage-coursework-with-github-classroom/integrate-github-classroom-with-an-online-ide)." ### Running student code in the online IDE {% data reusables.classroom.sign-into-github-classroom %} {% data reusables.classroom.click-classroom-in-list %} {% data reusables.classroom.click-assignment-in-list %} 1. To the right of the submission, click **View IDE**.  8 ...ducation/manage-coursework-with-github-classroom/teach-with-github-classroom.md @@ -0,0 +1,8 @@ --- title: Teach with GitHub Classroom intro: Learn how to set up your classroom and assignments. mapTopic: true versions: free-pro-team: '*' --- 93 content/education/manage-coursework-with-github-classroom/use-autograding.md 30 ...t/education/manage-coursework-with-github-classroom/view-autograding-results.md 90 content/education/quickstart.md 1 ...github-education/about-campus-advisors.md → ...github-education/about-campus-advisors.md 1 ...-github-education/about-campus-experts.md → ...-github-education/about-campus-experts.md 1 ...ducation-for-educators-and-researchers.md → ...ducation-for-educators-and-researchers.md 5 ...on/about-github-education-for-students.md → ...on/about-github-education-for-students.md 9 ...ithub-education/about-github-education.md → ...ithub-education/about-github-education.md 5 .../applying-for-a-student-developer-pack.md → ...ion/apply-for-a-student-developer-pack.md 14 ...for-an-educator-or-researcher-discount.md → ...for-an-educator-or-researcher-discount.md 26 content/education/teach-and-learn-with-github-education/index.md 3 ...github-at-your-educational-institution.md → ...github-at-your-educational-institution.md 3 ...ation/using-github-for-your-schoolwork.md → ...ucation/use-github-for-your-schoolwork.md 3 ...-github-in-your-classroom-and-research.md → ...-github-in-your-classroom-and-research.md 5 ...-for-a-student-developer-pack-approved.md → ...-for-a-student-developer-pack-approved.md 3 ...ucator-or-researcher-discount-approved.md → ...ucator-or-researcher-discount-approved.md 20 ...ering-a-repository/enabling-or-disabling-github-discussions-for-a-repository.md 5 content/github/administering-a-repository/index.md 2 content/github/authenticating-to-github/reviewing-your-security-log.md 1 content/github/collaborating-with-issues-and-pull-requests/index.md 74 ...with-issues-and-pull-requests/reviewing-dependency-changes-in-a-pull-request.md 19 ...g-with-issues-and-pull-requests/reviewing-proposed-changes-in-a-pull-request.md 10 content/github/creating-cloning-and-archiving-repositories/about-repositories.md 15 content/github/customizing-your-github-workflow/about-github-marketplace.md 2 content/github/getting-started-with-github/git-and-github-learning-resources.md 4 content/github/getting-started-with-github/github-glossary.md 6 content/github/getting-started-with-github/signing-up-for-a-new-github-account.md 1 content/github/index.md 2 ...b/managing-security-vulnerabilities/about-alerts-for-vulnerable-dependencies.md 25 ...hub/managing-security-vulnerabilities/about-managing-vulnerable-dependencies.md 1 content/github/managing-security-vulnerabilities/index.md 4 ...nerabilities/viewing-and-updating-vulnerable-dependencies-in-your-repository.md 3 ...criptions-and-notifications-on-github/managing-notifications-from-your-inbox.md 6 content/github/managing-your-work-on-github/about-issues.md 3 content/github/searching-for-information-on-github/about-searching-on-github.md 5 content/github/searching-for-information-on-github/index.md 114 content/github/searching-for-information-on-github/searching-discussions.md 2 ...ithub/searching-for-information-on-github/searching-issues-and-pull-requests.md 2 ...nd-managing-billing-and-payments-on-github/about-billing-for-github-sponsors.md 4 ...-billing-and-payments-on-github/discounted-subscriptions-for-github-accounts.md 19 ...ing-up-and-managing-billing-and-payments-on-github/downgrading-a-sponsorship.md 16 ...tting-up-and-managing-billing-and-payments-on-github/upgrading-a-sponsorship.md 4 content/github/setting-up-and-managing-organizations-and-teams/index.md 27 ...and-teams/managing-discussion-creation-for-repositories-in-your-organization.md 25 ...izations-and-teams/managing-updates-from-accounts-your-organization-sponsors.md 3 ...p-and-managing-organizations-and-teams/permission-levels-for-an-organization.md 14 ...ing-organizations-and-teams/repository-permission-levels-for-an-organization.md 86 ...naging-organizations-and-teams/reviewing-the-audit-log-for-your-organization.md 1 content/github/setting-up-and-managing-your-github-user-account/index.md 24 ...etting-up-and-managing-your-github-user-account/managing-your-theme-settings.md 12 content/github/site-policy/github-additional-product-terms.md 8 ...porting-the-open-source-community-with-github-sponsors/about-github-sponsors.md 17 ...community-with-github-sponsors/attributing-sponsorships-to-your-organization.md 28 ...e-open-source-community-with-github-sponsors/changing-your-sponsorship-tiers.md 22 ...th-github-sponsors/configuring-webhooks-for-events-in-your-sponsored-account.md 17 ...ting-the-open-source-community-with-github-sponsors/contacting-your-sponsors.md 25 ...munity-with-github-sponsors/editing-your-profile-details-for-github-sponsors.md 1 content/github/supporting-the-open-source-community-with-github-sponsors/index.md 12 ...ce-community-with-github-sponsors/managing-your-payouts-from-github-sponsors.md 18 ...he-open-source-community-with-github-sponsors/managing-your-sponsorship-goal.md 39 ...ing-the-open-source-community-with-github-sponsors/managing-your-sponsorship.md 10 ...munity-with-github-sponsors/setting-up-github-sponsors-for-your-organization.md 10 ...munity-with-github-sponsors/setting-up-github-sponsors-for-your-user-account.md 62 ...-source-community-with-github-sponsors/sponsoring-an-open-source-contributor.md 27 ...source-community-with-github-sponsors/viewing-your-sponsors-and-sponsorships.md 23 content/github/teaching-and-learning-with-github-education/index.md This file was deleted. 7 ...nt/github/visualizing-repository-data-with-graphs/about-the-dependency-graph.md 1 content/github/working-with-github-support/index.md 10 content/graphql/README.md 58 ...tting-started-with-github-container-registry/about-github-container-registry.md This file was deleted. 15 content/packages/getting-started-with-github-container-registry/index.md This file was deleted. 95 content/packages/guides/about-github-container-registry.md 2 ...ol-and-visibility-for-container-images.md → ...ol-and-visibility-for-container-images.md 5 ...che-maven-for-use-with-github-packages.md → ...che-maven-for-use-with-github-packages.md 1 ...ng-docker-for-use-with-github-packages.md → ...ng-docker-for-use-with-github-packages.md 1 ...otnet-cli-for-use-with-github-packages.md → ...otnet-cli-for-use-with-github-packages.md 1 ...ng-gradle-for-use-with-github-packages.md → ...ng-gradle-for-use-with-github-packages.md 1 ...uring-npm-for-use-with-github-packages.md → ...uring-npm-for-use-with-github-packages.md 1 ...-rubygems-for-use-with-github-packages.md → ...-rubygems-for-use-with-github-packages.md 2 ...ting-a-repository-to-a-container-image.md → ...ting-a-repository-to-a-container-image.md 10 content/packages/guides/container-guides-for-github-packages.md 2 ...er-registry/deleting-a-container-image.md → ...ages/guides/deleting-a-container-image.md 2 ...ry/enabling-improved-container-support.md → ...es/enabling-improved-container-support.md 33 content/packages/guides/index.md 2 ...b-container-registry-for-docker-images.md → ...b-container-registry-for-docker-images.md 10 content/packages/guides/package-client-guides-for-github-packages.md 2 ...stry/pushing-and-pulling-docker-images.md → ...ides/pushing-and-pulling-docker-images.md 1 ...ng-github-packages-with-github-actions.md → ...ng-github-packages-with-github-actions.md 46 content/packages/index.md 60 ...anaging-packages/about-github-packages.md → ...-github-packages/about-github-packages.md 13 ...concepts-for-github-container-registry.md → ...ages/core-concepts-for-github-packages.md 16 content/packages/learn-github-packages/index.md 1 ...managing-packages/publishing-a-package.md → ...n-github-packages/publishing-a-package.md 3 ...d-managing-packages/deleting-a-package.md → ...ges/manage-packages/deleting-a-package.md 8 ...publishing-and-managing-packages/index.md → content/packages/manage-packages/index.md 1 ...managing-packages/installing-a-package.md → ...s/manage-packages/installing-a-package.md 1 ...and-managing-packages/viewing-packages.md → ...kages/manage-packages/viewing-packages.md 11 content/packages/managing-container-images-with-github-container-registry/index.md This file was deleted. 109 content/packages/quickstart.md 20 content/packages/using-github-packages-with-your-projects-ecosystem/index.md This file was deleted. 10 content/rest/README.md 18 content/rest/overview/resources-in-the-rest-api.md 2 content/rest/overview/troubleshooting.md 10 content/rest/reference/enterprise-admin.md 2 data/products.yml 2 data/reusables/accounts/create-account.md 2 data/reusables/actions/actions-not-verified.md 7 data/reusables/actions/visualization-beta.md 5 data/reusables/audit_log/audit-log-api-info.md 1 data/reusables/audit_log/audit-log-git-events-retention.md 1 data/reusables/classroom/about-assignments.md 1 data/reusables/classroom/about-autograding.md 1 data/reusables/classroom/about-classrooms.md 1 data/reusables/classroom/about-online-ides.md 1 data/reusables/classroom/assignments-classroom-prerequisite.md 2 data/reusables/classroom/assignments-click-pencil.md 1 data/reusables/classroom/assignments-group-definition.md 5 data/reusables/classroom/assignments-guide-assign-a-deadline.md 5 data/reusables/classroom/assignments-guide-choose-an-online-ide.md 5 data/reusables/classroom/assignments-guide-choose-template-repository.md 9 data/reusables/classroom/assignments-guide-choose-visibility.md 7 data/reusables/classroom/assignments-guide-click-continue-after-basics.md 7 ...s/classroom/assignments-guide-click-continue-after-starter-code-and-feedback.md 5 data/reusables/classroom/assignments-guide-click-create-assignment-button.md 5 data/reusables/classroom/assignments-guide-create-review-pull-request.md 5 data/reusables/classroom/assignments-guide-create-the-assignment.md 1 data/reusables/classroom/assignments-guide-intro-for-environment.md 3 data/reusables/classroom/assignments-guide-invite-students-to-assignment.md 7 data/reusables/classroom/assignments-guide-prevent-changes.md 23 data/reusables/classroom/assignments-guide-using-autograding.md 1 data/reusables/classroom/assignments-individual-definition.md 1 data/reusables/classroom/assignments-to-prevent-submission.md 5 data/reusables/classroom/assignments-type-a-title.md 1 data/reusables/classroom/classroom-creates-group-repositories.md 1 data/reusables/classroom/classroom-creates-individual-repositories.md 1 data/reusables/classroom/classroom-enables-invitation-urls.md 2 data/reusables/classroom/click-assignment-in-list.md 2 data/reusables/classroom/click-classroom-in-list.md 2 data/reusables/classroom/click-settings.md 2 data/reusables/classroom/click-students.md 1 data/reusables/classroom/for-more-information-about-assignment-creation.md 6 data/reusables/classroom/guide-create-new-classroom.md 5 data/reusables/classroom/invitation-url-warning.md 1 data/reusables/classroom/readme-contains-button-for-online-ide.md 1 data/reusables/classroom/sign-into-github-classroom.md 1 data/reusables/classroom/use-add-test-drop-down-to-click-grading-method.md 1 data/reusables/classroom/you-can-choose-a-template-repository.md 1 data/reusables/classroom/you-can-create-a-pull-request-for-feedback.md 1 data/reusables/classroom/you-may-want-to-predefine-repository-settings.md 1 data/reusables/discussions/about-categories-and-formats.md 1 data/reusables/discussions/about-discussions.md 5 data/reusables/discussions/beta.md 2 data/reusables/discussions/click-discussion-in-list.md 2 data/reusables/discussions/discussions-tab.md 2 data/reusables/discussions/edit-categories.md 1 data/reusables/discussions/edit-category-details.md 8 ...les/discussions/enabling-or-disabling-github-discussions-for-your-repository.md 1 data/reusables/discussions/github-recognizes-members.md 16 data/reusables/discussions/marking-a-comment-as-an-answer.md 1 data/reusables/discussions/repository-category-limit.md 10 data/reusables/discussions/starting-a-discussion.md 1 data/reusables/discussions/you-can-categorize-discussions.md 1 data/reusables/discussions/you-can-convert-an-issue.md 1 data/reusables/discussions/you-can-use-discussions.md 1 data/reusables/discussions/you-cannot-convert-a-discussion.md 2 data/reusables/education/about-github-education-link.md 2 data/reusables/education/apply-for-team.md 2 data/reusables/education/click-get-teacher-benefits.md 6 data/reusables/education/educator-requirements.md 1 data/reusables/gated-features/discussions.md 1 data/reusables/marketplace/app-transfer-to-org-for-verification.md 5 data/reusables/marketplace/free-plan-note.md 2 data/reusables/marketplace/launch-with-free.md 8 data/reusables/marketplace/marketplace-billing-ui-requirements.md 2 data/reusables/package_registry/billing-for-container-registry.md 2 data/reusables/package_registry/container-registry-beta-billing-note.md 2 data/reusables/package_registry/container-registry-beta.md 2 data/reusables/package_registry/docker_registry_deprecation_status.md 2 data/reusables/package_registry/feature-preview-for-container-registry.md 2 data/reusables/package_registry/required-scopes.md 2 data/reusables/package_registry/viewing-packages.md 3 data/reusables/repositories/dependency-review.md 7 data/reusables/repositories/navigate-to-job-superlinter.md 4 data/reusables/repositories/view-failed-job-results-superlinter.md 4 data/reusables/repositories/view-specific-line-superlinter.md 2 data/reusables/search/date_gt_lt.md 2 data/reusables/sponsors/billing-switcher.md 2 data/reusables/sponsors/change-tier.md 2 data/reusables/sponsors/choose-updates.md 2 data/reusables/sponsors/developer-sponsored-choose-updates.md This file was deleted. 4 data/reusables/sponsors/manage-developer-sponsorship.md This file was deleted. 4 data/reusables/sponsors/manage-org-sponsorship.md This file was deleted. 2 data/reusables/sponsors/manage-sponsorship.md 1 data/reusables/sponsors/manage-updates-for-orgs.md 2 data/reusables/sponsors/maximum-tier.md 4 data/reusables/sponsors/navigate-to-org-sponsors-dashboard.md This file was deleted. 2 ...onsors/navigate-to-sponsored-developer.md → ...sponsors/navigate-to-sponsored-account.md 1 data/reusables/sponsors/navigate-to-sponsored-org.md This file was deleted. 2 ...ors/navigate-to-dev-sponsors-dashboard.md → ...ponsors/navigate-to-sponsors-dashboard.md 2 data/reusables/sponsors/no-fees.md 5 data/reusables/sponsors/org-sponsors-release-phase.md 2 data/reusables/sponsors/pay-prorated-amount.md 2 data/reusables/sponsors/prorated-sponsorship.md 2 data/reusables/sponsors/sponsor-account.md 7 data/reusables/sponsors/sponsorship-dashboard.md 2 data/reusables/sponsors/sponsorship-details.md 1 data/reusables/webhooks/app_always_desc.md 3 data/ui.yml 7 data/variables/action_code_examples.yml 37 data/variables/discussions_community_examples.yml 6 data/variables/product.yml 21 includes/all-articles.html 4 includes/breadcrumbs.html 2 includes/code-example-card.html 14 includes/discussions-community-card.html 2 includes/header-notification.html 90 javascripts/filter-cards.js 92 javascripts/filter-code-examples.js This file was deleted. 4 javascripts/index.js 64 layouts/product-landing.html 68 lib/data-directory.js 28 lib/filename-to-key.js 7 lib/frontmatter.js 2 lib/liquid-tags/data.js 25 lib/page.js 54 lib/pages.js 21 lib/redirects/get-docs-path-from-developer-path.js 41 lib/redirects/precompile.js 231 lib/rest/static/decorated/api.github.com.json 495 lib/rest/static/dereferenced/api.github.com.deref.json 17 lib/rewrite-local-links.js 10 lib/site-data.js 24 lib/warm-server.js 5 middleware/breadcrumbs.js 38 middleware/categories-for-support-team.js 6 middleware/contextualizers/early-access-links.js 103 middleware/csp.js 69 middleware/early-access-breadcrumbs.js 1 middleware/index.js 45 package-lock.json 3 package.json 4 script/check-s3-images.js 4 script/early-access/clone-locally 41 script/early-access/create-branch 7 server.js 2 stylesheets/article.scss 4 tests/browser/browser.js 10 tests/content/category-pages.js 2 tests/content/crowdin-config.js 3 tests/content/featured-links.js 5 tests/content/glossary.js 42 tests/content/remove-liquid-statements.js 39 tests/content/site-data-references.js 4 tests/content/site-data.js 22 tests/fixtures/rest-redirects.json 10 tests/graphql/build-changelog-test.js 9 tests/helpers/conditional-runs.js 20 tests/meta/orphan-tests.js 23 tests/rendering/breadcrumbs.js 4 tests/rendering/rest.js 3 tests/rendering/server.js 47 tests/routing/developer-site-redirects.js 10 tests/routing/redirects.js 15 tests/unit/data-directory/filename-to-key.js 1 tests/unit/data-directory/fixtures/README.md 1 tests/unit/data-directory/fixtures/bar.yaml 1 tests/unit/data-directory/fixtures/foo.json 1 tests/unit/data-directory/fixtures/nested/baz.md 40 tests/unit/data-directory/index.js 19 tests/unit/early-access.js 4 tests/unit/find-page.js 57 tests/unit/liquid-helpers.js 140 tests/unit/page.js 2 tests/unit/pages.js 0 comments on commit 1a56ed1 Leave a comment You’re not receiving notifications from this thread. © 2021 GitHub, Inc. Terms Privacy Security Status Docs Contact GitHub Pricing API Training Blog About
Rastaman4e / 1NICEHASH PLATFORM TERMS OF USE AND NICEHASH MINING TERMS OF SERVICE PLEASE READ THESE NICEHASH PLATFORM TERMS OF USE AND NICEHASH MINING TERMS OF SERVICE (“Terms”) CAREFULLY BEFORE USING THE THE PLATFORM OR SERVICES DESCRIBED HEREIN. BY SELECTING “I AGREE”, ACCESSING THE PLATFORM, USING NICEHASH MINING SERVICES OR DOWNLOADING OR USING NICEHASH MINING SOFTWARE, YOU ARE ACKNOWLEDGING THAT YOU HAVE READ THESE TERMS, AS AMENDED FROM TIME TO TIME, AND YOU ARE AGREEING TO BE BOUND BY THEM. IF YOU DO NOT AGREE TO THESE TERMS, OR ANY SUBSEQUENT AMENDMENTS, CHANGES OR UPDATES, DO NOT ACCESS THE PLATFORM, USE NICEHASH MINING SERVICES OR USE THE NICEHASH MINING SOFTWARE. GENERAL These Terms apply to users of the NiceHash Platform (“Platform” and NiceHash Mining Services (“Services”) which are provided to you by NICEHASH Ltd, company organized and existing under the laws of the British Virgin Islands, with registered address at Intershore Chambers, Road Town, Tortola, British Virgin Islands, registration number: 2048669, hereinafter referred to as “NiceHash, as well as “we” or “us”. ELIGIBILITY By using the NiceHash platform and NiceHash Mining Services, you represent and warrant that you: are at least Minimum Age and have capacity to form a binding contract; have not previously been suspended or removed from the NiceHash Platform; have full power and authority to enter into this agreement and in doing so will not violate any other agreement to which you are a party; are not not furthering, performing, undertaking, engaging in, aiding, or abetting any unlawful activity through your relationship with us, through your use of NiceHash Platform or use of NiceHash Mining Services; will not use NiceHash Platform or NiceHash Mining Services if any applicable laws in your country prohibit you from doing so in accordance with these Terms. We reserve the right to terminate your access to the NiceHash Platform and Mining Services for any reason and in our sole and absolute discretion. Use of NiceHash Platform and Mining Services is void where prohibited by applicable law. Depending on your country of residence or incorporation or registered office, you may not be able to use all the functions of the NiceHash Platform or services provided therein. It is your responsibility to follow the rules and laws in your country of residence and/or country from which you access the NiceHash Platform. DEFINITIONS NiceHash Platform means a website located on the following web address: www.nicehash.com. NiceHash Mining Services mean all services provided by NiceHash, namely the provision of the NiceHash Platform, NiceHash Hashing power marketplace, NiceHash API, NiceHash OS, NiceHash Mining Software including licence for NiceHash Miner, NiceHash Private Endpoint, NiceHash Account, NiceHash mobile apps, and all other software products, applications and services associated with these products, except for the provision of NiceHash Exchange Services. NiceHash Exchange Service means a service which allows trading of digital assets in the form of digital tokens or cryptographic currency for our users by offering them a trading venue, helping them find a trading counterparty and providing the means for transaction execution. NiceHash Exchange Services are provided by NICEX Ltd and accessible at the NiceHash Platform under NiceHash Exchange Terms of Service. Hashing power marketplace means an infrastructure provided by the NiceHash which enables the Hashing power providers to point their rigs towards NiceHash stratum servers where Hashing power provided by different Hashing power providers is gathered and sold as generic Hashing power to the Hashing power buyers. Hashing power buyer means a legal entity or individual who buys the gathered and generic hashing power on the Hashing power marketplace from undefined Hashing power providers. Hashing power provider means a legal entity or individual who sells his hashing power on the Hashing power marketplace to undefined Hashing power buyers. NiceHash Mining Software means NiceHash Miner and any other software available via the NiceHash Platform. NiceHash Miner means a comprehensive software with graphical user interface and web interface, owned by NiceHash. NiceHash Miner is a process manager software which enables the Hashing power providers to point their rigs towards NiceHash stratum servers and sell their hashing power to the Hashing power buyers. NiceHash Miner also means any and all of its code, compilations, updates, upgrades, modifications, error corrections, patches and bug fixes and similar. NiceHash Miner does not mean third party software compatible with NiceHash Miner (Third Party Plugins and Miners). NiceHash QuickMiner means a software accessible at https://www.nicehash.com/quick-miner which enables Hashing power providers to point their PCs or rigs towards NiceHash stratum servers and sell their hashing power to the Hashing power buyers. NiceHash QuickMiner is intended as a tryout tool. Hashing power rig means all hardware which produces hashing power that represents computation power which is required to calculate the hash function of different type of cryptocurrency. Secondary account is an account managed by third party from which the Account holder deposits funds to his NiceHash Wallet or/and to which the Account holder withdraws funds from his NiceHash Wallet. Stratum is a lightweight mining protocol: https://slushpool.com/help/manual/stratum-protocol. NiceHash Account means an online account available on the NiceHash Platform and created by completing the registration procedure on the NiceHash Platform. Account holder means an individual or legal entity who completes the registration procedure and successfully creates the NiceHash Account. Minimum Age means 18 years old or older, if in order for NiceHash to lawfully provide the Services to you without parental consent (including using your personal data). NiceHash Wallet means a wallet created automatically for the Account holder and provided by the NiceHash Wallet provider. NiceHash does not hold funds on behalf of the Account holder but only transfers Account holder’s requests regarding the NiceHash Wallet transaction to the NiceHash Wallet provider who executes the requested transactions. In this respect NiceHash only processes and performs administrative services related to the payments regarding the NiceHash Mining Services and NiceHash Exchange Services, if applicable. NiceHash Wallet provider is a third party which on the behalf of the Account holder provides and manages the NiceHash Wallet, holds, stores and transfers funds and hosts NiceHash Wallet. For more information about the NiceHash Wallet provider, see the following website: https://www.bitgo.com/. Blockchain network is a distributed database that is used to maintain a continuously growing list of records, called blocks. Force Majeure Event means any governmental or relevant regulatory regulations, acts of God, war, riot, civil commotion, fire, flood, or any disaster or an industrial dispute of workers unrelated to you or NiceHash. Any act, event, omission, happening or non-happening will only be considered Force Majeure if it is not attributable to the wilful act, neglect or failure to take reasonable precautions of the affected party, its agents, employees, consultants, contractors and sub-contractors. SALE AND PURCHASE OF HASHING POWER Hashing power providers agree to sell and NiceHash agrees to proceed Hashing power buyers’ payments for the provided hashing power on the Hashing power marketplace, on the Terms set forth herein. According to the applicable principle get-paid-per-valid-share (pay as you go principle) Hashing power providers will be paid only for validated and accepted hashing power to their NiceHash Wallet or other wallet, as indicated in Account holder’s profile settings or in stratum connection username. In some cases, no Hashing power is sent to Hashing power buyers or is accepted by NiceHash Services, even if Hashing power is generated on the Hashing power rigs. These cases include usage of slower hardware as well as software, hardware or network errors. In these cases, Hashing power providers are not paid for such Hashing power. Hashing power buyers agree to purchase and NiceHash agrees to process the order and forward the purchased hashing power on the Hashing power marketplace, on the Terms set forth herein. According to the applicable principle pay-per-valid-share (pay as you go principle) Hashing power buyers will pay from their NiceHash Wallet only for the hashing power that was validated by our engine. When connection to the mining pool which is selected on the Hashing power order is lost or when an order is cancelled during its lifetime, Hashing power buyer pays for additional 10 seconds worth of hashing power. Hashing power order is charged for extra hashing power when mining pool which is selected on the Hashing power order, generates rapid mining work changes and/or rapid mining job switching. All payments including any fees will be processed in crypto currency and NiceHash does not provide an option to sale and purchase of the hashing power in fiat currency. RISK DISCLOSURE If you choose to use NiceHash Platform, Services and NiceHash Wallet, it is important that you remain aware of the risks involved, that you have adequate technical resources and knowledge to bear such risks and that you monitor your transactions carefully. General risk You understand that NiceHash Platform and Services, blockchain technology, Bitcoin, all other cryptocurrencies and cryptotokens, proof of work concept and other associated and related technologies are new and untested and outside of NiceHash’s control. You acknowledge that there are major risks associated with these technologies. In addition to the risks disclosed below, there are risks that NiceHash cannot foresee and it is unreasonable to believe that such risk could have been foreseeable. The performance of NiceHash’s obligation under these Terms will terminate if market or technology circumstances change to such an extent that (i) these Terms clearly no longer comply with NiceHash’s expectations, (ii) it would be unjust to enforce NiceHash’s obligations in the general opinion or (iii) NiceHash’s obligation becomes impossible. NiceHash Account abuse You acknowledge that there is risk associated with the NiceHash Account abuse and that you have been fully informed and warned about it. The funds stored in the NiceHash Wallet may be disposed by third party in case the third party obtains the Account holder’s login credentials. The Account holder shall protect his login credentials and his electronic devices where the login credentials are stored against unauthorized access. Regulatory risks You acknowledge that there is risk associated with future legislation which may restrict, limit or prohibit certain aspects of blockchain technology which may also result in restriction, limitation or prohibition of NiceHash Services and that you have been fully informed and warned about it. Risk of hacking You acknowledge that there is risk associated with hacking NiceHash Services and NiceHash Wallet and that you have been fully informed and warned about it. Hacker or other groups or organizations may attempt to interfere with NiceHash Services or NiceHash Wallet in any way, including without limitation denial of services attacks, Sybil attacks, spoofing, smurfing, malware attacks, mining attacks or consensus-based attacks. Cryptocurrency risk You acknowledge that there is risk associated with the cryptocurrencies which are used as payment method and that you have been fully informed and warned about it. Cryptocurrencies are prone to, but not limited to, value volatility, transaction costs and times uncertainty, lack of liquidity, availability, regulatory restrictions, policy changes and security risks. NiceHash Wallet risk You acknowledge that there is risk associated with funds held on the NiceHash Wallet and that you have been fully informed and warned about it. You acknowledge that NiceHash Wallet is provided by NiceHash Wallet provider and not NiceHash. You acknowledge and agree that NiceHash shall not be responsible for any NiceHash Wallet provider’s services, including their accuracy, completeness, timeliness, validity, copyright compliance, legality, decency, quality or any other aspect thereof. NiceHash does not assume and shall not have any liability or responsibility to you or any other person or entity for any Hash Wallet provider’s services. Hash Wallet provider’s services and links thereto are provided solely as a convenience to you and you access and use them entirely at your own risk and subject to NiceHash Wallet provider’s terms and conditions. Since the NiceHash Wallet is a cryptocurrency wallet all funds held on it are entirely uninsured in contrast to the funds held on the bank account or other financial institutions which are insured. Connection risk You acknowledge that there are risks associated with usage of NiceHash Services which are provided through the internet including, but not limited to, the failure of hardware, software, configuration and internet connections and that you have been fully informed and warned about it. You acknowledge that NiceHash will not be responsible for any configuration, connection or communication failures, disruptions, errors, distortions or delays you may experience when using NiceHash Services, however caused. Hashing power provision risk You acknowledge that there are risks associated with the provisions of the hashing power which is provided by the Hashing power providers through the Hashing power marketplace and that you have been fully informed and warned about it. You acknowledge that NiceHash does not provide the hashing power but only provides the Hashing power marketplace as a service. Hashing power providers’ Hashing power rigs are new and untested and outside of NiceHash’s control. There is a major risk that the Hashing power rigs (i) will stop providing hashing power, (ii) will provide hashing power in an unstable way, (iii) will be wrongly configured or (iv) provide insufficient speed of the hashing power. Hashing power rigs as hardware could be subject of damage, errors, electricity outage, misconfiguration, connection or communication failures and other malfunctions. NiceHash will not be responsible for operation of Hashing power rigs and its provision of hashing power. By submitting a Hashing power order you agree to Hashing power no-refund policy – all shares forwarded to mining pool, selected on the Hashing power order are final and non-refundable. Hashing power profitability risk You acknowledge that there is risk associated with the profitability of the hashing power provision and that you have been fully informed and warned about it. You acknowledge that all Hashing power rig’s earning estimates and profitability calculations on NiceHash Platform are only for informational purposes and were made based on the Hashing power rigs set up in the test environments. NiceHash does not warrant that your Hashing power rigs would achieve the same profitability or earnings as calculated on NiceHash Platform. There is risk that your Hashing power rig would not produce desired hashing power quantity and quality and that your produced hashing power would differentiate from the hashing power produced by our Hashing power rigs set up in the test environments. There is risk that your Hashing power rigs would not be as profitable as our Hashing power rigs set up in the test environments or would not be profitable at all. WARRANTIES NiceHash Platform and Mining Services are provided on the “AS IS” and “AS AVAILABLE” basis, including all faults and defects. To the maximum extent permitted by applicable law, NiceHash makes no representations and warranties and you waive all warranties of any kind. Particularly, without limiting the generality of the foregoing, the NiceHash makes no representations and warranties, whether express, implied, statutory or otherwise regarding NiceHash Platform and Mining Services or other services related to NiceHash Platform and provided by third parties, including any warranty that such services will be uninterrupted, harmless, secure or not corrupt or damaged, meet your requirements, achieve any intended results, be compatible or work with any other software, applications, systems or services, meet any performance or error free or that any errors or defects can or will be corrected. Additionally NiceHash makes no representations and warranties, whether express, implied, statutory or otherwise of merchantability, suitability, reliability, availability, timeliness, accuracy, satisfactory quality, fitness for a particular purpose or quality, title and non-infringement with respect to any of the Mining Services or other services related to NiceHash Platform and provided by third parties, or quiet enjoyment and any warranties arising out of any course of dealing, course of performance, trade practice or usage of NiceHash Platform and Mining Services including information, content and material contained therein. Especially NiceHash makes no representations and warranties, whether express, implied, statutory or otherwise regarding any payment services and systems, NiceHash Wallet which is provided by third party or any other financial services which might be related to the NiceHash Platform and Mining Services. You acknowledge that you do not rely on and have not been induced to accept the NiceHash Platform and Mining Services according to these Terms on the basis of any warranties, representations, covenants, undertakings or any other statement whatsoever, other than expressly set out in these Terms that neither the NiceHash nor any of its respective agents, officers, employees or advisers have given any such warranties, representations, covenants, undertakings or other statements. LIABILITY NiceHash and their respective officers, employees or agents will not be liable to you or anyone else, to the maximum extent permitted by applicable law, for any damages of any kind, including, but not limited to, direct, consequential, incidental, special or indirect damages (including but not limited to lost profits, trading losses or damages that result from use or loss of use of NiceHash Services or NiceHash Wallet), even if NiceHash has been advised of the possibility of such damages or losses, including, without limitation, from the use or attempted use of NiceHash Platform and Mining Services, NiceHash Wallet or other related websites or services. NiceHash does not assume any obligations to users in connection with the unlawful alienation of Bitcoins, which occurred on 6. 12. 2017 with NICEHASH, d. o. o., and has been fully reimbursed with the completion of the NiceHash Repayment Program. NiceHash will not be responsible for any compensation, reimbursement, or damages arising in connection with: (i) your inability to use the NiceHash Platform and Mining Services, including without limitation as a result of any termination or suspension of the NiceHash Platform or these Terms, power outages, maintenance, defects, system failures, mistakes, omissions, errors, defects, viruses, delays in operation or transmission or any failure of performance, (ii) the cost of procurement of substitute goods or services, (iii) any your investments, expenditures, or commitments in connection with these Terms or your use of or access to the NiceHash Platform and Mining Services, (iv) your reliance on any information obtained from NiceHash, (v) Force Majeure Event, communications failure, theft or other interruptions or (vi) any unauthorized access, alteration, deletion, destruction, damage, loss or failure to store any data, including records, private key or other credentials, associated with NiceHash Platform and Mining Services or NiceHash Wallet. Our aggregate liability (including our directors, members, employees and agents), whether in contract, warranty, tort (including negligence, whether active, passive or imputed), product liability, strict liability or other theory, arising out of or relating to the use of NiceHash Platform and Mining Services, or inability to use the Platform and Services under these Terms or under any other document or agreement executed and delivered in connection herewith or contemplated hereby, shall in any event not exceed 100 EUR per user. You will defend, indemnify, and hold NiceHash harmless and all respective employees, officers, directors, and representatives from and against any claims, demand, action, damages, loss, liabilities, costs and expenses (including reasonable attorney fees) arising out of or relating to (i) any third-party claim concerning these Terms, (ii) your use of, or conduct in connection with, NiceHash Platform and Mining Services, (iii) any feedback you provide, (iv) your violation of these Terms, (v) or your violation of any rights of any other person or entity. If you are obligated to indemnify us, we will have the right, in our sole discretion, to control any action or proceeding (at our expense) and determine whether we wish to settle it. If we are obligated to respond to a third-party subpoena or other compulsory legal order or process described above, you will also reimburse us for reasonable attorney fees, as well as our employees’ and contractors’ time and materials spent responding to the third-party subpoena or other compulsory legal order or process at reasonable hourly rates. The Services and the information, products, and services included in or available through the NiceHash Platform may include inaccuracies or typographical errors. Changes are periodically added to the information herein. Improvements or changes on the NiceHash Platform can be made at any time. NICEHASH ACCOUNT The registration of the NiceHash Account is made through the NiceHash Platform, where you are required to enter your email address and password in the registration form. After successful completion of registration, the confirmation email is sent to you. After you confirm your registration by clicking on the link in the confirmation email the NiceHash Account is created. NiceHash will send you proof of completed registration once the process is completed. When you create NiceHash Account, you agree to (i) create a strong password that you change frequently and do not use for any other website, (ii) implement reasonable and appropriate measures designed to secure access to any device which has access to your email address associated with your NiceHash Account and your username and password for your NiceHash Account, (iii) maintain the security of your NiceHash Account by protecting your password and by restricting access to your NiceHash Account; (iv) promptly notify us if you discover or otherwise suspect any security breaches related to your NiceHash Account so we can take all required and possible measures to secure your NiceHash Account and (v) take responsibility for all activities that occur under your NiceHash Account and accept all risks of any authorized or unauthorized access to your NiceHash Account, to the maximum extent permitted by law. Losing access to your email, registered at NiceHash Platform, may also mean losing access to your NiceHash Account. You may not be able to use the NiceHash Platform or Mining Services, execute withdrawals and other security sensitive operations until you regain access to your email address, registered at NiceHash Platform. If you wish to change the email address linked to your NiceHash Account, we may ask you to complete a KYC procedure for security purposes. This step serves solely for the purpose of identification in the process of regaining access to your NiceHash Account. Once the NiceHash Account is created a NiceHash Wallet is automatically created for the NiceHash Account when the request for the first deposit to the NiceHash Wallet is made by the user. Account holder’s NiceHash Wallet is generated by NiceHash Wallet provider. Account holder is strongly suggested to enhance the security of his NiceHash Account by adding an additional security step of Two-factor authentication (hereinafter “2FA”) when logging into his account, withdrawing funds from his NiceHash Wallet or placing a new order. Account holder can enable this security feature in the settings of his NiceHash Account. In the event of losing or changing 2FA code, we may ask the Account holder to complete a KYC procedure for security reasons. This step serves solely for the purpose of identification in the process of reactivating Account holders 2FA and it may be subject to an a In order to use certain functionalities of the NiceHash Platform, such as paying for the acquired hashing power, users must deposit funds to the NiceHash Wallet, as the payments for the hashing power could be made only through NiceHash Wallet. Hashing power providers have two options to get paid for the provided hashing power: (i) by using NiceHash Wallet to receive the payments or (ii) by providing other Bitcoin address where the payments shall be received to. Hashing power providers provide their Bitcoin address to NiceHash by providing such details via Account holder’s profile settings or in a form of a stratum username while connecting to NiceHash stratum servers. Account holder may load funds on his NiceHash Wallet from his Secondary account. Account holder may be charged fees by the Secondary account provider or by the blockchain network for such transaction. NiceHash is not responsible for any fees charged by Secondary account providers or by the blockchain network or for the management and security of the Secondary accounts. Account holder is solely responsible for his use of Secondary accounts and Account holder agrees to comply with all terms and conditions applicable to any Secondary accounts. The timing associated with a load transaction will depend in part upon the performance of Secondary accounts providers, the performance of blockchain network and performance of the NiceHash Wallet provider. NiceHash makes no guarantee regarding the amount of time it may take to load funds on to NiceHash Wallet. NiceHash Wallet shall not be used by Account holders to keep, save and hold funds for longer period and also not for executing other transactions which are not related to the transactions regarding the NiceHash Platform. The NiceHash Wallet shall be used exclusively and only for current and ongoing transactions regarding the NiceHash Platform. Account holders shall promptly withdraw any funds kept on the NiceHash Wallet that will not be used and are not intended for the reasons described earlier. Commission fees may be charged by the NiceHash Wallet provider, by the blockchain network or by NiceHash for any NiceHash Wallet transactions. Please refer to the NiceHash Platform, for more information about the commission fees for NiceHash Wallet transactions which are applicable at the time of the transaction. NiceHash reserves the right to change these commission fees according to the provisions to change these Terms at any time for any reason. You have the right to use the NiceHash Account only in compliance with these Terms and other commercial terms and principles published on the NiceHash Platform. In particular, you must observe all regulations aimed at ensuring the security of funds and financial transactions. Provided that the balance of funds in your NiceHash Wallet is greater than any minimum balance requirements needed to satisfy any of your open orders, you may withdraw from your NiceHash Wallet any amount of funds, up to the total amount of funds in your NiceHash Wallet in excess of such minimum balance requirements, to Secondary Account, less any applicable withdrawal fees charged by NiceHash or by the blockchain network for such transaction. Withdrawals are not processed instantly and may be grouped with other withdrawal requests. Some withdrawals may require additional verification information which you will have to provide in order to process the withdrawal. It may take up to 24 hours before withdrawal is fully processed and distributed to the Blockchain network. Please refer to the NiceHash Platform for more information about the withdrawal fees and withdrawal processing. NiceHash reserves the right to change these fees according to the provisions to change these Terms at any time for any reason. You have the right to close the NiceHash Account. In case you have funds on your NiceHash Wallet you should withdraw funds from your account prior to requesting NiceHash Account closure. After we receive your NiceHash Account closure request we will deactivate your NiceHash Account. You can read more about closing the NiceHash Account in our Privacy Policy. Your NiceHash Account may be deactivated due to your inactivity. Your NiceHash account may be locked and a mandatory KYC procedure is applied for security reasons, if it has been more than 6 month since your last login. NiceHash or any of its partners or affiliates are not responsible for the loss of the funds, stored on or transferred from the NiceHash Wallet, as well as for the erroneous implementation of the transactions made via NiceHash Wallet, where such loss or faulty implementation of the transaction are the result of a malfunction of the NiceHash Wallet and the malfunction was caused by you or the NiceHash Wallet provider. You are obliged to inform NiceHash in case of loss or theft, as well as in the case of any possible misuse of the access data to your NiceHash Account, without any delay, and demand change of access data or closure of your existing NiceHash Account and submit a request for new access data. NiceHash will execute the change of access data or closure of the NiceHash Account and the opening of new NiceHash Account as soon as technically possible and without any undue delay. All information pertaining to registration, including a registration form, generation of NiceHash Wallet and detailed instructions on the use of the NiceHash Account and NiceHash Wallet are available at NiceHash Platform. The registration form as well as the entire system is properly protected from unwanted interference by third parties. KYC PROCEDURE NiceHash is appropriately implementing AML/CTF and security measures to diligently detect and prevent any malicious or unlawful use of NiceHash Services or use, which is strictly prohibited by these Terms, which are deemed as your agreement to provide required personal information for identity verification. Security measures include a KYC procedure, which is aimed at determining the identity of an individual user or an organisation. We may ask you to complete this procedure before enabling some or all functionalities of the NiceHash platform and provide its services. A KYC procedure might be applied as a security measure when: changing the email address linked to your NiceHash Account, losing or changing your 2FA code; logging in to your NiceHash Account for the first time after the launch of the new NiceHash Platform in August 2019, gaining access to all or a portion of NiceHash Services, NiceHash Wallet and its related services or any portion thereof if they were disabled due to and activating your NiceHash Account if it has been deactivated due to its inactivity and/or security or other reasons. HASHING POWER TRANSACTIONS General NiceHash may, at any time and in our sole discretion, (i) refuse any order submitted or provided hashing power, (ii) cancel an order or part of the order before it is executed, (iii) impose limits on the order amount permitted or on provided hashing power or (iv) impose any other conditions or restrictions upon your use of the NiceHash Platform and Mining Services without prior notice. For example, but not limited to, NiceHash may limit the number of open orders that you may establish or limit the type of supported Hashing power rigs and mining algorithms or NiceHash may restrict submitting orders or providing hashing power from certain locations. Please refer to the NiceHash Platform, for more information about terminology, hashing power transactions’ definitions and descriptions, order types, order submission, order procedure, order rules and other restrictions and limitations of the hashing power transactions. NiceHash reserves the right to change any transaction, definitions, description, order types, procedure, rules, restrictions and limitations at any time for any reason. Orders, provision of hashing power, payments, deposits, withdrawals and other transactions are accepted only through the interface of the NiceHash Platform, NiceHash API and NiceHash Account and are fixed by the software and hardware tools of the NiceHash Platform. If you do not understand the meaning of any transaction option, NiceHash strongly encourages you not to utilize any of those options. Hashing Power Order In order to submit an Hashing Power Order via the NiceHash Account, the Hashing power buyer must have available funds in his NiceHash Wallet. Hashing power buyer submits a new order to buy hashing power via the NiceHash Platform or via the NiceHash API by setting the following parameters in the order form: NiceHash service server location, third-party mining pool, algorithm to use, order type, set amount he is willing to spend on this order, set price per hash he is willing to pay, optionally approximate limit maximum hashing power for his order and other parameters as requested and by confirming his order. Hashing power buyer may submit an order in maximum amount of funds available on his NiceHash Wallet at the time of order submission. Order run time is only approximate since order’s lifetime is based on the number of hashes that it delivers. Particularly during periods of high volume, illiquidity, fast movement or volatility in the marketplace for any digital assets or hashing power, the actual price per hash at which some of the orders are executed may be different from the prevailing price indicated on NiceHash Platform at the time of your order. You understand that NiceHash is not liable for any such price fluctuations. In the event of market disruption, NiceHash Services disruption, NiceHash Hashing Power Marketplace disruption or manipulation or Force Majeure Event, NiceHash may do one or more of the following: (i) suspend access to the NiceHash Account or NiceHash Platform, or (ii) prevent you from completing any actions in the NiceHash Account, including closing any open orders. Following any such event, when trading resumes, you acknowledge that prevailing market prices may differ significantly from the prices available prior to such event. When Hashing power buyer submits an order for purchasing of the Hashing power via NiceHash Platform or via the NiceHash API he authorizes NiceHash to execute the order on his behalf and for his account in accordance with such order. Hashing power buyer acknowledges and agrees that NiceHash is not acting as his broker, intermediary, agent or advisor or in any fiduciary capacity. NiceHash executes the order in set order amount minus NiceHash’s processing fee. Once the order is successfully submitted the order amount starts to decrease in real time according to the payments for the provided hashing power. Hashing power buyer agrees to pay applicable processing fee to NiceHash for provided services. The NiceHash’s fees are deducted from Hashing power buyer’s NiceHash Wallet once the whole order is exhausted and completed. Please refer to the NiceHash Platform, for more information about the fees which are applicable at the time of provision of services. NiceHash reserves the right to change these fees according to the provisions to change these Terms at any time for any reason. The changed fees will apply only for the NiceHash Services provided after the change of the fees. All orders submitted prior the fee change but not necessary completed prior the fee change will be charged according to the fees applicable at the time of the submission of the order. NiceHash will attempt, on a commercially reasonable basis, to execute the Hashing power buyer’s purchase of the hashing power on the Hashing power marketplace under these Terms according to the best-effort delivery approach. In this respect NiceHash does not guarantee that the hashing power will actually be delivered or verified and does not guarantee any quality of the NiceHash Services. Hashing power buyer may cancel a submitted order during order’s lifetime. If an order has been partially executed, Hashing power buyer may cancel the unexecuted remainder of the order. In this case the NiceHash’s processing fee will apply only for the partially executed order. NiceHash reserves the right to refuse any order cancellation request once the order has been submitted. Selling Hashing Power and the Provision of Hashing Power In order to submit the hashing power to the NiceHash stratum server the Hashing power provider must first point its Hashing power rig to the NiceHash stratum server. Hashing power provider is solely responsible for configuration of his Hashing power rig. The Hashing power provider gets paid by Hashing power buyers for all validated and accepted work that his Hashing power rig has produced. The provided hashing power is validated by NiceHash’s stratum engine and validator. Once the hashing power is validated the Hashing power provider is entitled to receive the payment for his work. NiceHash logs all validated hashing power which was submitted by the Hashing power provider. The Hashing power provider receives the payments of current globally weighted average price on to his NiceHash Wallet or his selected personal Bitcoin address. The payments are made periodically depending on the height of payments. NiceHash reserves the right to hold the payments any time and for any reason by indicating the reason, especially if the payments represent smaller values. Please refer to the NiceHash Platform, for more information about the height of payments for provided hashing power, how the current globally weighted average price is calculated, payment periods, payment conditions and conditions for detention of payments. NiceHash reserves the right to change this payment policy according to the provisions to change these Terms at any time for any reason. All Hashing power rig’s earnings and profitability calculations on NiceHash Platform are only for informational purposes. NiceHash does not warrant that your Hashing power rigs would achieve the same profitability or earnings as calculated on NiceHash Platform. You hereby acknowledge that it is possible that your Hashing power rigs would not be as profitable as indicated in our informational calculations or would not be profitable at all. Hashing power provider agrees to pay applicable processing fee to NiceHash for provided Services. The NiceHash’s fees are deducted from all the payments made to the Hashing power provider for his provided work. Please refer to the NiceHash Platform, for more information about the fees which are applicable at the time of provision of services. Hashing power provider which has not submitted any hashing power to the NiceHash stratum server for a period of 90 days agrees that a processing fee of 0.00001000 BTC or less, depending on the unpaid mining balance, will be deducted from his unpaid mining balance. NiceHash reserves the right to change these fees according to the provisions to change these Terms at any time for any reason. The changed fees will apply only for the NiceHash Services provided after the change of the fees. NiceHash will attempt, on a commercially reasonable basis, to execute the provision of Hashing power providers’ hashing power on the Hashing power marketplace under these Terms according to the best-effort delivery approach. In this respect NiceHash does not guarantee that the hashing power will actually be delivered or verified and does not guarantee any quality of the NiceHash Services. Hashing power provider may disconnect the Hashing power rig from the NiceHash stratum server any time. NiceHash reserves the right to refuse any Hashing power rig once the Hashing power rig has been pointed towards NiceHash stratum server. RESTRICTIONS When accessing the NiceHash Platform or using the Mining Services or NiceHash Wallet, you warrant and agree that you: will not use the Services for any purpose that is unlawful or prohibited by these Terms, will not violate any law, contract, intellectual property or other third-party right or commit a tort, are solely responsible for your conduct while accessing the NiceHash Platform or using the Mining Services or NiceHash Wallet, will not access the NiceHash Platform or use the Mining Services in any manner that could damage, disable, overburden, or impair the provision of the Services or interfere with any other party's use and enjoyment of the Services, will not misuse and/or maliciously use Hashing power rigs, you will particularly refrain from using network botnets or using NiceHash Platform or Mining Services with Hashing power rigs without the knowledge or awareness of Hashing power rig owner(s), will not perform or attempt to perform any kind of malicious attacks on blockchains with the use of the NiceHash Platform or Mining Services, intended to maliciously gain control of more than 50% of the network's mining hash rate, will not use the NiceHash Platform or Mining Services for any kind of market manipulation or disruption, such as but not limited to NiceHash Mining Services disruption and NiceHash Hashing Power Marketplace manipulation. In case of any of the above mentioned events, NiceHash reserves the right to immediately suspend your NiceHash Account, freeze or block the funds in the NiceHash Wallet, and suspend your access to NiceHash Platform, particularly if NiceHash believes that such NiceHash Account are in violation of these Terms or Privacy Policy, or any applicable laws and regulation. RIGHTS AND OBLIGATIONS In the event of disputes with you, NiceHash is obliged to prove that the NiceHash service which is the subject of the dispute was not influenced by technical or other failure. You will have possibility to check at any time, subject to technical availability, the transactions details, statistics and available balance of the funds held on the NiceHash Wallet, through access to the NiceHash Account. You may not obtain or attempt to obtain any materials or information through any means not intentionally made available or provided to you or public through the NiceHash Platform or Mining Services. We may, in our sole discretion, at any time, for any or no reason and without liability to you, with prior notice (i) terminate all rights and obligations between you and NiceHash derived from these Terms, (ii) suspend your access to all or a portion of NiceHash Services, NiceHash Wallet and its related services or any portion thereof and delete or deactivate your NiceHash Account and all related information and files in such account (iii) modify, suspend or discontinue, temporarily or permanently, any portion of NiceHash Platform or (iv) provide enhancements or improvements to the features and functionality of the NiceHash Platform, which may include patches, bug fixes, updates, upgrades and other modifications. Any such change may modify or delete certain portion, features or functionalities of the NiceHash Services. You agree that NiceHash has no obligation to (i) provide any updates, or (ii) continue to provide or enable any particular portion, features or functionalities of the NiceHash Services to you. You further agree that all changes will be (i) deemed to constitute an integral part of the NiceHash Platform, and (ii) subject to these Terms. In the event of your breach of these Terms, including but not limited to, for instance, in the event that you breach any term of these Terms, due to legal grounds originating in anti-money laundering and know your client regulation and procedures, or any other relevant applicable regulation, all right and obligations between you and NiceHash derived from these Terms terminate automatically if you fail to comply with these Terms within the notice period of 8 days after you have been warned by NiceHash about the breach and given 8 days period to cure the breaches. NiceHash reserves the right to keep these rights and obligations in force despite your breach of these Terms. In the event of termination, NiceHash will attempt to return you any funds stored on your NiceHash Wallet not otherwise owed to NiceHash, unless NiceHash believes you have committed fraud, negligence or other misconduct. You acknowledge that the NiceHash Services and NiceHash Wallet may be suspended for maintenance. Technical information about the hashing power transactions, including information about chosen server locations, algorithms used, selected mining pools, your business or activities, including all financial and technical information, specifications, technology together with all details of prices, current transaction performance and future business strategy represent confidential information and trade secrets. NiceHash shall, preserve the confidentiality of all before mentioned information and shall not disclose or cause or permit to be disclosed without your permission any of these information to any person save to the extent that such disclosure is strictly to enable you to perform or comply with any of your obligations under these Terms, or to the extent that there is an irresistible legal requirement on you or NiceHash to do so; or where the information has come into the public domain otherwise than through a breach of any of the terms of these Terms. NiceHash shall not be entitled to make use of any of these confidential information and trade secrets other than during the continuance of and pursuant to these Terms and then only for the purpose of carrying out its obligations pursuant to these Terms. NICEHASH MINER LICENSE (NICEHASH MINING SOFTWARE LICENSE) NiceHash Mining Software whether on disk, in read only memory, or any other media or in any other form is licensed, not sold, to you by NiceHash for use only under these Terms. NiceHash retains ownership of the NiceHash Mining Software itself and reserves all rights not expressly granted to you. Subject to these Terms, you are granted a limited, non-transferable, non-exclusive and a revocable license to download, install and use the NiceHash Mining Software. You may not distribute or make the NiceHash Mining Software available over a network where it could be used by multiple devices at the same time. You may not rent, lease, lend, sell, redistribute, assign, sublicense host, outsource, disclose or otherwise commercially exploit the NiceHash Mining Software or make it available to any third party. There is no license fee for the NiceHash Mining Software. NiceHash reserves the right to change the license fee policy according to the provisions to change these Terms any time and for any reason, including to decide to start charging the license fee for the NiceHash Mining Software. You are responsible for any and all applicable taxes. You may not, and you agree not to or enable others to, copy, decompile, reverse engineer, reverse compile, disassemble, attempt to derive the source code of, decrypt, modify, or create derivative works of the NiceHash Mining Software or any services provided by the NiceHash Mining Software, or any part thereof (except as and only to the extent any foregoing restriction is prohibited by applicable law or to the extent as may be permitted by the licensing terms governing use of open-sourced components included with the NiceHash Mining Software). If you choose to allow automatic updates, your device will periodically check with NiceHash for updates and upgrades to the NiceHash Mining Software and, if an update or upgrade is available, the update or upgrade will automatically download and install onto your device and, if applicable, your peripheral devices. You can turn off the automatic updates altogether at any time by changing the automatic updates settings found within the NiceHash Mining Software. You agree that NiceHash may collect and use technical and related information, including but not limited to technical information about your computer, system and application software, and peripherals, that is gathered periodically to facilitate the provision of software updates, product support and other services to you (if any) related to the NiceHash Mining Software and to verify compliance with these Terms. NiceHash may use this information, as long as it is in a form that does not personally identify you, to improve our NiceHash Services. NiceHash Mining Software contains features that rely upon information about your selected mining pools. You agree to our transmission, collection, maintenance, processing, and use of all information obtained from you about your selected mining pools. You can opt out at any time by going to settings in the NiceHash Mining Software. NiceHash may provide interest-based advertising to you. If you do not want to receive relevant ads in the NiceHash Mining Software, you can opt out at any time by going to settings in the NiceHash Mining Software. If you opt out, you will continue to receive the same number of ads, but they may be less relevant because they will not be based on your interest. NiceHash Mining Software license is effective until terminated. All provisions of these Terms regarding the termination apply also for the NiceHash Mining Software license. Upon the termination of NiceHash Mining Software license, you shall cease all use of the NiceHash Mining Software and destroy or delete all copies, full or partial, of the NiceHash Mining Software. THIRD PARTY MINERS AND PLUGINS Third Party Miners and Plugins are a third party software which enables the best and most efficient mining operations. NiceHash Miner integrates third party mining software using a third party miner plugin system. Third Party Mining Software is a closed source software which supports mining algorithms for cryptocurrencies and can be integrated into NiceHash Mining Software. Third Party Miner Plugin enables the connection between NiceHash Mining Software and Third Party Mining Software and it can be closed, as well as open sourced. NiceHash Mining Software user interface enables the user to manually select which available Third Party Miners and Plugins will be downloaded and integrated. Users can select or deselect Third Party Miners and Plugins found in the Plugin Manager window. Some of the available Third Party Miners and Plugins which are most common are preselected by NiceHash, but can be deselected, depending on users' needs. The details of the Third Party Miners and Plugins available for NiceHash Mining Software are accessible within the NiceHash Mining Software user interface. The details include, but not limited to, the author of the software and applicable license information, if applicable information about developer fee for Third Party Miners, software version etc. Developer fees may apply to the use of Third Party Miners and Plugins. NiceHash will not be liable, to the maximum extent permitted by applicable law, for any damages of any kind, including, but not limited to, direct, consequential, incidental, special or indirect damages, arising out of using Third Party Miners and Plugins. The latter includes, but is not limited to: i) any power outages, maintenance, defects, system failures, mistakes, omissions, errors, defects, viruses, delays in operation or transmission or any failure of performance; ii) any unauthorized access, alteration, deletion, destruction, damage, loss or failure to store any data, including records, private key or other credentials, associated with usage of Third Party Miners and Plugins and ii) Force Majeure Event, communications failure, theft or other interruptions. If you choose to allow automatic updates, your device will periodically check with NiceHash for updates and upgrades to the installed Third Party Miners and Plugins, if an update or upgrade is available, the update or upgrade will automatically download and install onto your device and, if applicable, your peripheral devices. You can turn off the automatic updates altogether at any time by changing the automatic updates settings found within the NiceHash Mining Software. NICEHASH QUICKMINER NiceHash QuickMiner is a software application that allows the visitors of the NiceHash Quick Miner web page, accessible athttps://www.nicehash.com/quick-miner, to connect their PC or a mining rig to the NiceHash Hashing Power Marketplace. Visitors of the NiceHash Quick Miner web page can try out and experience crypto currency mining without having to register on the NiceHash Platform and create a NiceHash Account. Users are encouraged to do so as soon as possible in order to collect the funds earned using NiceHash Quick Miner. Users can download NiceHash QuickMiner free of charge. In order to operate NiceHash QuickMiner software needs to automatically detect technical information about users' computer hardware. You agree that NiceHash may collect and use technical and related information. For more information please refer to NiceHash Privacy Policy. Funds arising from the usage of NiceHash QuickMiner are transferred to a dedicated cryptocurrency wallet owned and managed by NiceHash. NiceHash QuickMiner Users expressly agree and acknowledge that completing the registration process and creating a NiceHash Account is necessary in order to collect the funds arising from the usage of NiceHash QuickMiner. Users of NiceHash QuickMiner who do not successfully register a NiceHash Account will lose their right to claim funds arising from their usage of NiceHash QuickMiner. Those funds, in addition to the condition that the user has not been active on the NiceHash QuickMiner web page for consecutive 7 days, will be donated to the charity of choice. NICEHASH PRIVATE ENDPOINT NiceHash Private Endpoint is a network interface that connects users privately and securely to NiceHash Stratum servers. Private Endpoint uses a private IP address and avoids additional latency caused by DDOS protection. All NiceHash Private Mining Proxy servers are managed by NiceHash and kept up-to-date. Users can request a dedicated private access endpoint by filling in the form for NiceHash Private Endpoint Solution available at the NiceHash Platform. In the form the user specifies the email address, country, number of connections and locations and algorithms used. Based on the request NiceHash prepares an individualized offer based on the pricing stipulated on the NiceHash Platform, available at https://www.nicehash.com/private-endpoint-solution. NiceHash may request additional information from the users of the Private Endpoint Solution in order to determine whether we are obligated to collect VAT from you, including your VAT identification number. INTELLECTUAL PROPERTY NiceHash retains all copyright and other intellectual property rights, including inventions, discoveries, knowhow, processes, marks, methods, compositions, formulae, techniques, information and data, whether or not patentable, copyrightable or protectable in trademark, and any trademarks, copyrights or patents based thereon over all content and other materials contained on NiceHash Platform or provided in connection with the Services, including, without limitation, the NiceHash logo and all designs, text, graphics, pictures, information, data, software, source code, as well as the compilation thereof, sound files, other files and the selection and arrangement thereof. This material is protected by international copyright laws and other intellectual property right laws, namely trademark. These Terms shall not be understood and interpreted in a way that they would mean assignment of copyright or other intellectual property rights, unless it is explicitly defined so in these Terms. NiceHash hereby grants you a limited, nonexclusive and non-sublicensable license to access and use NiceHash’s copyrighted work and other intellectual property for your personal or internal business use. Such license is subject to these Terms and does not permit any resale, the distribution, public performance or public display, modifying or otherwise making any derivative uses, use, publishing, transmission, reverse engineering, participation in the transfer or sale, or any way exploit any of the copyrighted work and other intellectual property other than for their intended purposes. This granted license will automatically terminate if NiceHash suspends or terminates your access to the Services, NiceHash Wallet or closes your NiceHash Account. NiceHash will own exclusive rights, including all intellectual property rights, to any feedback including, but not limited to, suggestions, ideas or other information or materials regarding NiceHash Services or related products that you provide, whether by email, posting through our NiceHash Platform, NiceHash Account or otherwise and you irrevocably assign any and all intellectual property rights on such feedback unlimited in time, scope and territory. Any Feedback you submit is non-confidential and shall become the sole property of NiceHash. NiceHash will be entitled to the unrestricted use, modification or dissemination of such feedback for any purpose, commercial or otherwise, without acknowledgment or compensation to you. You waive any rights you may have to the feedback. We have the right to remove any posting you make on NiceHash Platform if, in our opinion, your post does not comply with the content standards defined by these Terms. PRIVACY POLICY Please refer to our NiceHash Platform and Mining Services Privacy Policy published on the NiceHash Platform for information about how we collect, use and share your information, as well as what options do you have with regards to your personal information. COMMUNICATION AND SUPPORT You agree and consent to receive electronically all communications, agreements, documents, receipts, notices and disclosures that NiceHash provides in connection with your NiceHash Account or use of the NiceHash Platform and Services. You agree that NiceHash may provide these communications to you by posting them via the NiceHash Account or by emailing them to you at the email address you provide. You should maintain copies of electronic communications by printing a paper copy or saving an electronic copy. It is your responsibility to keep your email address updated in the NiceHash Account so that NiceHash can communicate with you electronically. You understand and agree that if NiceHash sends you an electronic communication but you do not receive it because your email address is incorrect, out of date, blocked by your service provider, or you are otherwise unable to receive electronic communications, it will be deemed that you have been provided with the communication. You can update your NiceHash Account preferences at any time by logging into your NiceHash Account. If your email address becomes invalid such that electronic communications sent to you by NiceHash are returned, NiceHash may deem your account to be inactive and close it. You may give NiceHash a notice under these Terms by sending an email to support@nicehash.com or contact NiceHash through support located on the NiceHash Platform. All communication and notices pursuant to these Terms must be given in English language. FEES Please refer to the NiceHash Platform for more information about the fees or administrative costs which are applicable at the time of provision of services. NiceHash reserves the right to change these fees according to the provisions to change these Terms at any time for any reason. The changed fees will apply only for the Services provided after the change of the fees. You authorize us, or our designated payment processor, to charge or deduct your NiceHash Account for any applicable fees in connection with the transactions completed via the Services. TAX It is your responsibility to determine what, if any, taxes apply to the transactions you complete or services you provide via the NiceHash Platform, Mining Services and NiceHash Wallet, it is your responsibility to report and remit the correct tax to the appropriate tax authority and all your factual and potential tax obligations are your concern. You agree that NiceHash is not in any case and under no conditions responsible for determining whether taxes apply to your transactions or services or for collecting, reporting, withholding or remitting any taxes arising from any transactions or services. You also agree that NiceHash is not in any case and under no conditions bound to compensate for your tax obligation or give you any advice related to tax issues. All fees and charges payable by you to NiceHash are exclusive of any taxes, and shall certain taxes be applicable, they shall be added on top of the payable amounts. Upon our request, you will provide to us any information that we reasonably request to determine whether we are obligated to collect VAT from you, including your VAT identification number. If any deduction or withholding is required by law, you will notify NiceHash and will pay NiceHash any additional amounts necessary to ensure that the net amount received by NiceHash, after any deduction and withholding, equals the amount NiceHash would have received if no deduction or withholding had been required. Additionally, you will provide NiceHash with documentation showing that the withheld and deducted amounts have been paid to the relevant taxing authority. FINAL PROVISIONS Natural persons and legal entities that are not capable of holding legal rights and obligations are not allowed to create NiceHash Account and use NiceHash Platform or other related services. If NiceHash becomes aware that such natural person or legal entity has created the NiceHash Account or has used NiceHash Services, NiceHash will delete such NiceHash Account and disable any Services and block access to NiceHash Account and NiceHash Services to such natural person or legal entity. If you register to use the NiceHash Services on behalf of a legal entity, you represent and warrant that (i) such legal entity is duly organized and validly existing under the applicable laws of the jurisdiction of its organization; and (ii) you are duly authorized by such legal entity to act on its behalf. These Terms do not create any third-party beneficiary rights in any individual or entity. These Terms forms the entire agreement and understanding relating to the subject matter hereof and supersede any previous and contemporaneous agreements, arrangements or understandings relating to the subject matter hereof to the exclusion of any terms implied by law that may be excluded by contract. If at any time any provision of these Terms is or becomes illegal, invalid or unenforceable, the legality, validity and enforceability of every other provisions will not in any way be impaired. Such illegal, invalid or unenforceable provision of these Terms shall be deemed to be modified and replaced by such legal, valid and enforceable provision or arrangement, which corresponds as closely as possible to our and your will and business purpose pursued and reflected in these Terms. Headings of sections are for convenience only and shall not be used to limit or construe such sections. No failure to enforce nor delay in enforcing, on our side to the Terms, any right or legal remedy shall function as a waiver thereof, nor shall any individual or partial exercise of any right or legal remedy prevent any further or other enforcement of these rights or legal remedies or the enforcement of any other rights or legal remedies. NiceHash reserves the right to make changes, amendments, supplementations or modifications from time to time to these Terms including but not limited to changes of licence agreement for NiceHash Mining Software and of any fees and compensations policies, in its sole discretion and for any reason. We suggest that you review these Terms periodically for changes. If we make changes to these Terms, we will provide you with notice of such changes, such as by sending an email, providing notice on the NiceHash Platform, placing a popup window after login to the NiceHash Account or by posting the amended Terms on the NiceHash Platform and updating the date at the top of these Terms. The amended Terms will be deemed effective immediately upon posting for any new users of the NiceHash Services. In all other cases, the amended Terms will become effective for preexisting users upon the earlier of either: (i) the date users click or press a button to accept such changes in their NiceHash Account, or (ii) continued use of NiceHash Services 30 days after NiceHash provides notice of such changes. Any amended Terms will apply prospectively to use of the NiceHash Services after such changes become effective. The notice of change of these Terms is considered as notice of termination of all rights and obligations between you and NiceHash derived from these Terms with notice period of 30 days, if you do not accept the amended Terms. If you do not agree to any amended Terms, (i) the agreement between you and NiceHash is terminated by expiry of 30 days period which starts after NiceHash provides you a notice of change of these Terms, (ii) you must discontinue using NiceHash Services and (iii) you must inform us regarding your disagreement with the changes and request closure of your NiceHash Account. If you do not inform us regarding your disagreement and do not request closure of you NiceHash Account, we will deem that you agree with the changed Terms. You may not assign or transfer your rights or obligations under these Terms without the prior written consent of NiceHash. NiceHash may assign or transfer any or all of its rights under these Terms, in whole or in part, without obtaining your consent or approval. These Terms shall be governed by and construed and enforced in accordance with the Laws of the British Virgin Islands, and shall be interpreted in all respects as a British Virgin Islands contract. Any transaction, dispute, controversy, claim or action arising from or related to your access or use of the NiceHash Platform or these Terms of Service likewise shall be governed by the Laws of the British Virgin Islands, exclusive of choice-of-law principles. The rights and remedies conferred on NiceHash by, or pursuant to, these Terms are cumulative and are in addition, and without prejudice, to all other rights and remedies otherwise available to NiceHash at law. NiceHash may transfer its rights and obligations under these Terms to other entities which include, but are not limited to H-BIT, d.o.o. and NICEX Ltd, or any other firm or business entity that directly or indirectly acquires all or substantially all of the assets or business of NICEHASH Ltd. If you do not consent to any transfer, you may terminate this agreement and close your NiceHash Account. These Terms are not boilerplate. If you disagree with any of them, believe that any should not apply to you, or wish to negotiate these Terms, please contact NiceHash and immediately navigate away from the NiceHash Platform. Do not use the NiceHash Mining Services, NiceHash Wallet or other related services until you and NiceHash have agreed upon new terms of service. Last updated: March 1, 2021
Geng-Hao / Robust Model Free Iterative Learning Control With Convergence Rate AccelerationA novel model-free iterative learning control algorithm is presented in this project to improve both the robustness against output disturbances and the tracking performance in steady-state. For model-free ILC, several methods have been investigated, such as the time- reversal error filtering, the Model-Free Inversion-based Iterative Control (MFIIC), and the Non- Linear Inversion-based Iterative Control (NLIIC). However, the time-reversal error filtering has a conservative learning rate. Other two methods, although with much faster error convergence, have either a high noise sensitivity or a non-optimized steady-state. To improve the performance and robustness of model-free ILC, in this project we apply the time-reversal based ILC algorithm and recursively accelerate its error convergence using the online identified learning filter. The effectiveness of the proposed algorithm has been validated from a numerical simulation. The proposed approach not only improves the transient response of the MFIIC, but also achieves lower tracking error in steady-state compared to that of the NLIIC.
vohidjon123 / Google(function(sttc){/* Copyright The Closure Library Authors. SPDX-License-Identifier: Apache-2.0 */ var n;function aa(a){var b=0;return function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}}}var ba="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a}; function ca(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var da=ca(this),ea="function"===typeof Symbol&&"symbol"===typeof Symbol("x"),p={},fa={};function r(a,b){var c=fa[b];if(null==c)return a[b];c=a[c];return void 0!==c?c:a[b]} function ha(a,b,c){if(b)a:{var d=a.split(".");a=1===d.length;var e=d[0],f;!a&&e in p?f=p:f=da;for(e=0;e<d.length-1;e++){var g=d[e];if(!(g in f))break a;f=f[g]}d=d[d.length-1];c=ea&&"es6"===c?f[d]:null;b=b(c);null!=b&&(a?ba(p,d,{configurable:!0,writable:!0,value:b}):b!==c&&(void 0===fa[d]&&(a=1E9*Math.random()>>>0,fa[d]=ea?da.Symbol(d):"$jscp$"+a+"$"+d),ba(f,fa[d],{configurable:!0,writable:!0,value:b})))}} ha("Symbol",function(a){function b(f){if(this instanceof b)throw new TypeError("Symbol is not a constructor");return new c(d+(f||"")+"_"+e++,f)}function c(f,g){this.h=f;ba(this,"description",{configurable:!0,writable:!0,value:g})}if(a)return a;c.prototype.toString=function(){return this.h};var d="jscomp_symbol_"+(1E9*Math.random()>>>0)+"_",e=0;return b},"es6"); ha("Symbol.iterator",function(a){if(a)return a;a=(0,p.Symbol)("Symbol.iterator");for(var b="Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "),c=0;c<b.length;c++){var d=da[b[c]];"function"===typeof d&&"function"!=typeof d.prototype[a]&&ba(d.prototype,a,{configurable:!0,writable:!0,value:function(){return ia(aa(this))}})}return a},"es6"); function ia(a){a={next:a};a[r(p.Symbol,"iterator")]=function(){return this};return a}function ja(a){return a.raw=a}function u(a){var b="undefined"!=typeof p.Symbol&&r(p.Symbol,"iterator")&&a[r(p.Symbol,"iterator")];return b?b.call(a):{next:aa(a)}}function ka(a){if(!(a instanceof Array)){a=u(a);for(var b,c=[];!(b=a.next()).done;)c.push(b.value);a=c}return a}function la(a,b){return Object.prototype.hasOwnProperty.call(a,b)} var ma=ea&&"function"==typeof r(Object,"assign")?r(Object,"assign"):function(a,b){for(var c=1;c<arguments.length;c++){var d=arguments[c];if(d)for(var e in d)la(d,e)&&(a[e]=d[e])}return a};ha("Object.assign",function(a){return a||ma},"es6");var na="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},oa; if(ea&&"function"==typeof Object.setPrototypeOf)oa=Object.setPrototypeOf;else{var pa;a:{var qa={a:!0},ra={};try{ra.__proto__=qa;pa=ra.a;break a}catch(a){}pa=!1}oa=pa?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var sa=oa; function v(a,b){a.prototype=na(b.prototype);a.prototype.constructor=a;if(sa)sa(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.Ub=b.prototype}function ta(){for(var a=Number(this),b=[],c=a;c<arguments.length;c++)b[c-a]=arguments[c];return b} ha("Promise",function(a){function b(g){this.h=0;this.j=void 0;this.i=[];this.G=!1;var h=this.l();try{g(h.resolve,h.reject)}catch(k){h.reject(k)}}function c(){this.h=null}function d(g){return g instanceof b?g:new b(function(h){h(g)})}if(a)return a;c.prototype.i=function(g){if(null==this.h){this.h=[];var h=this;this.j(function(){h.m()})}this.h.push(g)};var e=da.setTimeout;c.prototype.j=function(g){e(g,0)};c.prototype.m=function(){for(;this.h&&this.h.length;){var g=this.h;this.h=[];for(var h=0;h<g.length;++h){var k= g[h];g[h]=null;try{k()}catch(l){this.l(l)}}}this.h=null};c.prototype.l=function(g){this.j(function(){throw g;})};b.prototype.l=function(){function g(l){return function(m){k||(k=!0,l.call(h,m))}}var h=this,k=!1;return{resolve:g(this.P),reject:g(this.m)}};b.prototype.P=function(g){if(g===this)this.m(new TypeError("A Promise cannot resolve to itself"));else if(g instanceof b)this.U(g);else{a:switch(typeof g){case "object":var h=null!=g;break a;case "function":h=!0;break a;default:h=!1}h?this.O(g):this.A(g)}}; b.prototype.O=function(g){var h=void 0;try{h=g.then}catch(k){this.m(k);return}"function"==typeof h?this.ga(h,g):this.A(g)};b.prototype.m=function(g){this.C(2,g)};b.prototype.A=function(g){this.C(1,g)};b.prototype.C=function(g,h){if(0!=this.h)throw Error("Cannot settle("+g+", "+h+"): Promise already settled in state"+this.h);this.h=g;this.j=h;2===this.h&&this.R();this.H()};b.prototype.R=function(){var g=this;e(function(){if(g.N()){var h=da.console;"undefined"!==typeof h&&h.error(g.j)}},1)};b.prototype.N= function(){if(this.G)return!1;var g=da.CustomEvent,h=da.Event,k=da.dispatchEvent;if("undefined"===typeof k)return!0;"function"===typeof g?g=new g("unhandledrejection",{cancelable:!0}):"function"===typeof h?g=new h("unhandledrejection",{cancelable:!0}):(g=da.document.createEvent("CustomEvent"),g.initCustomEvent("unhandledrejection",!1,!0,g));g.promise=this;g.reason=this.j;return k(g)};b.prototype.H=function(){if(null!=this.i){for(var g=0;g<this.i.length;++g)f.i(this.i[g]);this.i=null}};var f=new c; b.prototype.U=function(g){var h=this.l();g.ia(h.resolve,h.reject)};b.prototype.ga=function(g,h){var k=this.l();try{g.call(h,k.resolve,k.reject)}catch(l){k.reject(l)}};b.prototype.then=function(g,h){function k(t,y){return"function"==typeof t?function(F){try{l(t(F))}catch(z){m(z)}}:y}var l,m,q=new b(function(t,y){l=t;m=y});this.ia(k(g,l),k(h,m));return q};b.prototype.catch=function(g){return this.then(void 0,g)};b.prototype.ia=function(g,h){function k(){switch(l.h){case 1:g(l.j);break;case 2:h(l.j); break;default:throw Error("Unexpected state: "+l.h);}}var l=this;null==this.i?f.i(k):this.i.push(k);this.G=!0};b.resolve=d;b.reject=function(g){return new b(function(h,k){k(g)})};b.race=function(g){return new b(function(h,k){for(var l=u(g),m=l.next();!m.done;m=l.next())d(m.value).ia(h,k)})};b.all=function(g){var h=u(g),k=h.next();return k.done?d([]):new b(function(l,m){function q(F){return function(z){t[F]=z;y--;0==y&&l(t)}}var t=[],y=0;do t.push(void 0),y++,d(k.value).ia(q(t.length-1),m),k=h.next(); while(!k.done)})};return b},"es6");ha("Array.prototype.find",function(a){return a?a:function(b,c){a:{var d=this;d instanceof String&&(d=String(d));for(var e=d.length,f=0;f<e;f++){var g=d[f];if(b.call(c,g,f,d)){b=g;break a}}b=void 0}return b}},"es6"); ha("WeakMap",function(a){function b(g){this.h=(f+=Math.random()+1).toString();if(g){g=u(g);for(var h;!(h=g.next()).done;)h=h.value,this.set(h[0],h[1])}}function c(){}function d(g){var h=typeof g;return"object"===h&&null!==g||"function"===h}if(function(){if(!a||!Object.seal)return!1;try{var g=Object.seal({}),h=Object.seal({}),k=new a([[g,2],[h,3]]);if(2!=k.get(g)||3!=k.get(h))return!1;k.delete(g);k.set(h,4);return!k.has(g)&&4==k.get(h)}catch(l){return!1}}())return a;var e="$jscomp_hidden_"+Math.random(), f=0;b.prototype.set=function(g,h){if(!d(g))throw Error("Invalid WeakMap key");if(!la(g,e)){var k=new c;ba(g,e,{value:k})}if(!la(g,e))throw Error("WeakMap key fail: "+g);g[e][this.h]=h;return this};b.prototype.get=function(g){return d(g)&&la(g,e)?g[e][this.h]:void 0};b.prototype.has=function(g){return d(g)&&la(g,e)&&la(g[e],this.h)};b.prototype.delete=function(g){return d(g)&&la(g,e)&&la(g[e],this.h)?delete g[e][this.h]:!1};return b},"es6"); ha("Map",function(a){function b(){var h={};return h.L=h.next=h.head=h}function c(h,k){var l=h.h;return ia(function(){if(l){for(;l.head!=h.h;)l=l.L;for(;l.next!=l.head;)return l=l.next,{done:!1,value:k(l)};l=null}return{done:!0,value:void 0}})}function d(h,k){var l=k&&typeof k;"object"==l||"function"==l?f.has(k)?l=f.get(k):(l=""+ ++g,f.set(k,l)):l="p_"+k;var m=h.i[l];if(m&&la(h.i,l))for(h=0;h<m.length;h++){var q=m[h];if(k!==k&&q.key!==q.key||k===q.key)return{id:l,list:m,index:h,B:q}}return{id:l,list:m, index:-1,B:void 0}}function e(h){this.i={};this.h=b();this.size=0;if(h){h=u(h);for(var k;!(k=h.next()).done;)k=k.value,this.set(k[0],k[1])}}if(function(){if(!a||"function"!=typeof a||!a.prototype.entries||"function"!=typeof Object.seal)return!1;try{var h=Object.seal({x:4}),k=new a(u([[h,"s"]]));if("s"!=k.get(h)||1!=k.size||k.get({x:4})||k.set({x:4},"t")!=k||2!=k.size)return!1;var l=k.entries(),m=l.next();if(m.done||m.value[0]!=h||"s"!=m.value[1])return!1;m=l.next();return m.done||4!=m.value[0].x|| "t"!=m.value[1]||!l.next().done?!1:!0}catch(q){return!1}}())return a;var f=new p.WeakMap;e.prototype.set=function(h,k){h=0===h?0:h;var l=d(this,h);l.list||(l.list=this.i[l.id]=[]);l.B?l.B.value=k:(l.B={next:this.h,L:this.h.L,head:this.h,key:h,value:k},l.list.push(l.B),this.h.L.next=l.B,this.h.L=l.B,this.size++);return this};e.prototype.delete=function(h){h=d(this,h);return h.B&&h.list?(h.list.splice(h.index,1),h.list.length||delete this.i[h.id],h.B.L.next=h.B.next,h.B.next.L=h.B.L,h.B.head=null,this.size--, !0):!1};e.prototype.clear=function(){this.i={};this.h=this.h.L=b();this.size=0};e.prototype.has=function(h){return!!d(this,h).B};e.prototype.get=function(h){return(h=d(this,h).B)&&h.value};e.prototype.entries=function(){return c(this,function(h){return[h.key,h.value]})};e.prototype.keys=function(){return c(this,function(h){return h.key})};e.prototype.values=function(){return c(this,function(h){return h.value})};e.prototype.forEach=function(h,k){for(var l=this.entries(),m;!(m=l.next()).done;)m=m.value, h.call(k,m[1],m[0],this)};e.prototype[r(p.Symbol,"iterator")]=e.prototype.entries;var g=0;return e},"es6");function ua(a,b){a instanceof String&&(a+="");var c=0,d=!1,e={next:function(){if(!d&&c<a.length){var f=c++;return{value:b(f,a[f]),done:!1}}d=!0;return{done:!0,value:void 0}}};e[r(p.Symbol,"iterator")]=function(){return e};return e} ha("String.prototype.startsWith",function(a){return a?a:function(b,c){if(null==this)throw new TypeError("The 'this' value for String.prototype.startsWith must not be null or undefined");if(b instanceof RegExp)throw new TypeError("First argument to String.prototype.startsWith must not be a regular expression");var d=this.length,e=b.length;c=Math.max(0,Math.min(c|0,this.length));for(var f=0;f<e&&c<d;)if(this[c++]!=b[f++])return!1;return f>=e}},"es6");ha("globalThis",function(a){return a||da},"es_2020"); ha("Set",function(a){function b(c){this.h=new p.Map;if(c){c=u(c);for(var d;!(d=c.next()).done;)this.add(d.value)}this.size=this.h.size}if(function(){if(!a||"function"!=typeof a||!a.prototype.entries||"function"!=typeof Object.seal)return!1;try{var c=Object.seal({x:4}),d=new a(u([c]));if(!d.has(c)||1!=d.size||d.add(c)!=d||1!=d.size||d.add({x:4})!=d||2!=d.size)return!1;var e=d.entries(),f=e.next();if(f.done||f.value[0]!=c||f.value[1]!=c)return!1;f=e.next();return f.done||f.value[0]==c||4!=f.value[0].x|| f.value[1]!=f.value[0]?!1:e.next().done}catch(g){return!1}}())return a;b.prototype.add=function(c){c=0===c?0:c;this.h.set(c,c);this.size=this.h.size;return this};b.prototype.delete=function(c){c=this.h.delete(c);this.size=this.h.size;return c};b.prototype.clear=function(){this.h.clear();this.size=0};b.prototype.has=function(c){return this.h.has(c)};b.prototype.entries=function(){return this.h.entries()};b.prototype.values=function(){return r(this.h,"values").call(this.h)};b.prototype.keys=r(b.prototype, "values");b.prototype[r(p.Symbol,"iterator")]=r(b.prototype,"values");b.prototype.forEach=function(c,d){var e=this;this.h.forEach(function(f){return c.call(d,f,f,e)})};return b},"es6");ha("Array.prototype.keys",function(a){return a?a:function(){return ua(this,function(b){return b})}},"es6");ha("Array.prototype.values",function(a){return a?a:function(){return ua(this,function(b,c){return c})}},"es8");ha("Number.isNaN",function(a){return a?a:function(b){return"number"===typeof b&&isNaN(b)}},"es6"); ha("Promise.prototype.finally",function(a){return a?a:function(b){return this.then(function(c){return p.Promise.resolve(b()).then(function(){return c})},function(c){return p.Promise.resolve(b()).then(function(){throw c;})})}},"es9");var w=this||self;function va(a){a=a.split(".");for(var b=w,c=0;c<a.length;c++)if(b=b[a[c]],null==b)return null;return b}function wa(a){var b=typeof a;return"object"!=b?b:a?Array.isArray(a)?"array":b:"null"} function xa(a){var b=wa(a);return"array"==b||"object"==b&&"number"==typeof a.length}function ya(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}function za(a){return Object.prototype.hasOwnProperty.call(a,Aa)&&a[Aa]||(a[Aa]=++Ba)}var Aa="closure_uid_"+(1E9*Math.random()>>>0),Ba=0;function Ca(a,b,c){return a.call.apply(a.bind,arguments)} function Da(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);return function(){var e=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(e,d);return a.apply(b,e)}}return function(){return a.apply(b,arguments)}}function Ea(a,b,c){Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?Ea=Ca:Ea=Da;return Ea.apply(null,arguments)} function Fa(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function Ga(a){var b=["__uspapi"],c=w;b[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+b[0]);for(var d;b.length&&(d=b.shift());)b.length||void 0===a?c[d]&&c[d]!==Object.prototype[d]?c=c[d]:c=c[d]={}:c[d]=a}function Ha(a){return a};var Ia=(new Date).getTime();function Ja(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]} function Ka(a,b){var c=0;a=Ja(String(a)).split(".");b=Ja(String(b)).split(".");for(var d=Math.max(a.length,b.length),e=0;0==c&&e<d;e++){var f=a[e]||"",g=b[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;c=La(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt(g[1],10))||La(0==f[2].length,0==g[2].length)||La(f[2],g[2]);f=f[3];g=g[3]}while(0==c)}return c}function La(a,b){return a<b?-1:a>b?1:0};function Ma(){var a=w.navigator;return a&&(a=a.userAgent)?a:""}function x(a){return-1!=Ma().indexOf(a)};function Na(){return x("Trident")||x("MSIE")}function Oa(){return(x("Chrome")||x("CriOS"))&&!x("Edge")||x("Silk")}function Pa(a){var b={};a.forEach(function(c){b[c[0]]=c[1]});return function(c){return b[r(c,"find").call(c,function(d){return d in b})]||""}} function Qa(){var a=Ma();if(Na()){var b=/rv: *([\d\.]*)/.exec(a);if(b&&b[1])a=b[1];else{b="";var c=/MSIE +([\d\.]+)/.exec(a);if(c&&c[1])if(a=/Trident\/(\d.\d)/.exec(a),"7.0"==c[1])if(a&&a[1])switch(a[1]){case "4.0":b="8.0";break;case "5.0":b="9.0";break;case "6.0":b="10.0";break;case "7.0":b="11.0"}else b="7.0";else b=c[1];a=b}return a}c=RegExp("([A-Z][\\w ]+)/([^\\s]+)\\s*(?:\\((.*?)\\))?","g");b=[];for(var d;d=c.exec(a);)b.push([d[1],d[2],d[3]||void 0]);a=Pa(b);return x("Opera")?a(["Version","Opera"]): x("Edge")?a(["Edge"]):x("Edg/")?a(["Edg"]):x("Silk")?a(["Silk"]):Oa()?a(["Chrome","CriOS","HeadlessChrome"]):(a=b[2])&&a[1]||""};function Ra(a,b){for(var c=a.length,d="string"===typeof a?a.split(""):a,e=0;e<c;e++)e in d&&b.call(void 0,d[e],e,a)}function Sa(a,b){for(var c=a.length,d=[],e=0,f="string"===typeof a?a.split(""):a,g=0;g<c;g++)if(g in f){var h=f[g];b.call(void 0,h,g,a)&&(d[e++]=h)}return d}function Ta(a,b){for(var c=a.length,d=Array(c),e="string"===typeof a?a.split(""):a,f=0;f<c;f++)f in e&&(d[f]=b.call(void 0,e[f],f,a));return d} function Ua(a,b){for(var c=a.length,d="string"===typeof a?a.split(""):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!0;return!1}function Va(a,b){a:{for(var c=a.length,d="string"===typeof a?a.split(""):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a)){b=e;break a}b=-1}return 0>b?null:"string"===typeof a?a.charAt(b):a[b]} function Wa(a,b){a:{for(var c="string"===typeof a?a.split(""):a,d=a.length-1;0<=d;d--)if(d in c&&b.call(void 0,c[d],d,a)){b=d;break a}b=-1}return 0>b?null:"string"===typeof a?a.charAt(b):a[b]}function Xa(a,b){a:if("string"===typeof a)a="string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);else{for(var c=0;c<a.length;c++)if(c in a&&a[c]===b){a=c;break a}a=-1}return 0<=a}function Ya(a){var b=a.length;if(0<b){for(var c=Array(b),d=0;d<b;d++)c[d]=a[d];return c}return[]};function Za(a){Za[" "](a);return a}Za[" "]=function(){};var $a=Na();!x("Android")||Oa();Oa();!x("Safari")||Oa();var ab={},bb=null;var cb="undefined"!==typeof Uint8Array;var db="function"===typeof p.Symbol&&"symbol"===typeof(0,p.Symbol)()?(0,p.Symbol)(void 0):void 0;function eb(a,b){Object.isFrozen(a)||(db?a[db]|=b:void 0!==a.ma?a.ma|=b:Object.defineProperties(a,{ma:{value:b,configurable:!0,writable:!0,enumerable:!1}}))}function fb(a){var b;db?b=a[db]:b=a.ma;return null==b?0:b}function gb(a){eb(a,1);return a}function hb(a){return Array.isArray(a)?!!(fb(a)&2):!1}function ib(a){if(!Array.isArray(a))throw Error("cannot mark non-array as immutable");eb(a,2)};function jb(a){return null!==a&&"object"===typeof a&&!Array.isArray(a)&&a.constructor===Object}var kb,lb=Object.freeze(gb([]));function mb(a){if(hb(a.v))throw Error("Cannot mutate an immutable Message");}var nb="undefined"!=typeof p.Symbol&&"undefined"!=typeof p.Symbol.hasInstance;function ob(a){return{value:a,configurable:!1,writable:!1,enumerable:!1}};function pb(a){switch(typeof a){case "number":return isFinite(a)?a:String(a);case "object":if(a&&!Array.isArray(a)&&cb&&null!=a&&a instanceof Uint8Array){var b;void 0===b&&(b=0);if(!bb){bb={};for(var c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),d=["+/=","+/","-_=","-_.","-_"],e=0;5>e;e++){var f=c.concat(d[e].split(""));ab[e]=f;for(var g=0;g<f.length;g++){var h=f[g];void 0===bb[h]&&(bb[h]=g)}}}b=ab[b];c=Array(Math.floor(a.length/3));d=b[64]||"";for(e=f=0;f<a.length- 2;f+=3){var k=a[f],l=a[f+1];h=a[f+2];g=b[k>>2];k=b[(k&3)<<4|l>>4];l=b[(l&15)<<2|h>>6];h=b[h&63];c[e++]=g+k+l+h}g=0;h=d;switch(a.length-f){case 2:g=a[f+1],h=b[(g&15)<<2]||d;case 1:a=a[f],c[e]=b[a>>2]+b[(a&3)<<4|g>>4]+h+d}return c.join("")}}return a};function qb(a){var b=sb;b=void 0===b?tb:b;return ub(a,b)}function vb(a,b){if(null!=a){if(Array.isArray(a))a=ub(a,b);else if(jb(a)){var c={},d;for(d in a)Object.prototype.hasOwnProperty.call(a,d)&&(c[d]=vb(a[d],b));a=c}else a=b(a);return a}}function ub(a,b){for(var c=a.slice(),d=0;d<c.length;d++)c[d]=vb(c[d],b);Array.isArray(a)&&fb(a)&1&&gb(c);return c}function sb(a){if(a&&"object"==typeof a&&a.toJSON)return a.toJSON();a=pb(a);return Array.isArray(a)?qb(a):a} function tb(a){return cb&&null!=a&&a instanceof Uint8Array?new Uint8Array(a):a};function A(a,b,c){return-1===b?null:b>=a.l?a.i?a.i[b]:void 0:(void 0===c?0:c)&&a.i&&(c=a.i[b],null!=c)?c:a.v[b+a.j]}function B(a,b,c,d,e){d=void 0===d?!1:d;(void 0===e?0:e)||mb(a);b<a.l&&!d?a.v[b+a.j]=c:(a.i||(a.i=a.v[a.l+a.j]={}))[b]=c;return a}function wb(a,b,c,d){c=void 0===c?!0:c;d=void 0===d?!1:d;var e=A(a,b,d);null==e&&(e=lb);if(hb(a.v))c&&(ib(e),Object.freeze(e));else if(e===lb||hb(e))e=gb(e.slice()),B(a,b,e,d);return e}function xb(a,b){a=A(a,b);return null==a?a:!!a} function C(a,b,c){a=A(a,b);return null==a?c:a}function D(a,b,c){a=xb(a,b);return null==a?void 0===c?!1:c:a}function yb(a,b){a=A(a,b);a=null==a?a:+a;return null==a?0:a}function zb(a,b,c){var d=void 0===d?!1:d;return B(a,b,null==c?gb([]):Array.isArray(c)?gb(c):c,d)}function Ab(a,b,c){mb(a);0!==c?B(a,b,c):B(a,b,void 0,!1,!1);return a}function Bb(a,b,c,d){mb(a);(c=Cb(a,c))&&c!==b&&null!=d&&(a.h&&c in a.h&&(a.h[c]=void 0),B(a,c));return B(a,b,d)}function Db(a,b,c){return Cb(a,b)===c?c:-1} function Cb(a,b){for(var c=0,d=0;d<b.length;d++){var e=b[d];null!=A(a,e)&&(0!==c&&B(a,c,void 0,!1,!0),c=e)}return c}function G(a,b,c){if(-1===c)return null;a.h||(a.h={});var d=a.h[c];if(d)return d;var e=A(a,c,!1);if(null==e)return d;b=new b(e);hb(a.v)&&ib(b.v);return a.h[c]=b}function H(a,b,c){a.h||(a.h={});var d=hb(a.v),e=a.h[c];if(!e){var f=wb(a,c,!0,!1);e=[];d=d||hb(f);for(var g=0;g<f.length;g++)e[g]=new b(f[g]),d&&ib(e[g].v);d&&(ib(e),Object.freeze(e));a.h[c]=e}return e} function Eb(a,b,c){var d=void 0===d?!1:d;mb(a);a.h||(a.h={});var e=c?c.v:c;a.h[b]=c;return B(a,b,e,d)}function Fb(a,b,c,d){mb(a);a.h||(a.h={});var e=d?d.v:d;a.h[b]=d;return Bb(a,b,c,e)}function Gb(a,b,c){var d=void 0===d?!1:d;mb(a);if(c){var e=gb([]);for(var f=0;f<c.length;f++)e[f]=c[f].v;a.h||(a.h={});a.h[b]=c}else a.h&&(a.h[b]=void 0),e=lb;return B(a,b,e,d)}function I(a,b){return C(a,b,"")}function Hb(a,b,c){return C(a,Db(a,c,b),0)}function Ib(a,b,c,d){return G(a,b,Db(a,d,c))};function Jb(a,b,c){a||(a=Kb);Kb=null;var d=this.constructor.messageId;a||(a=d?[d]:[]);this.j=(d?0:-1)-(this.constructor.h||0);this.h=void 0;this.v=a;a:{d=this.v.length;a=d-1;if(d&&(d=this.v[a],jb(d))){this.l=a-this.j;this.i=d;break a}void 0!==b&&-1<b?(this.l=Math.max(b,a+1-this.j),this.i=void 0):this.l=Number.MAX_VALUE}if(c)for(b=0;b<c.length;b++)if(a=c[b],a<this.l)a+=this.j,(d=this.v[a])?Array.isArray(d)&&gb(d):this.v[a]=lb;else{d=this.i||(this.i=this.v[this.l+this.j]={});var e=d[a];e?Array.isArray(e)&& gb(e):d[a]=lb}}Jb.prototype.toJSON=function(){var a=this.v;return kb?a:qb(a)};function Lb(a){kb=!0;try{return JSON.stringify(a.toJSON(),Mb)}finally{kb=!1}}function Nb(a,b){if(null==b||""==b)return new a;b=JSON.parse(b);if(!Array.isArray(b))throw Error("Expected to deserialize an Array but got "+wa(b)+": "+b);Kb=b;a=new a(b);Kb=null;return a}function Mb(a,b){return pb(b)}var Kb;function Ob(){Jb.apply(this,arguments)}v(Ob,Jb);if(nb){var Pb={};Object.defineProperties(Ob,(Pb[p.Symbol.hasInstance]=ob(function(){throw Error("Cannot perform instanceof checks for MutableMessage");}),Pb))};function J(){Ob.apply(this,arguments)}v(J,Ob);if(nb){var Qb={};Object.defineProperties(J,(Qb[p.Symbol.hasInstance]=ob(Object[p.Symbol.hasInstance]),Qb))};function Rb(a){J.call(this,a,-1,Sb)}v(Rb,J);function Tb(a){J.call(this,a)}v(Tb,J);var Sb=[2,3];function Ub(a,b){this.i=a===Vb&&b||"";this.h=Wb}var Wb={},Vb={};function Xb(a,b){var c={},d;for(d in a)b.call(void 0,a[d],d,a)&&(c[d]=a[d]);return c}function Yb(a,b){for(var c in a)if(b.call(void 0,a[c],c,a))return!0;return!1}function Zb(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b}function $b(a){var b={},c;for(c in a)b[c]=a[c];return b};var ac;function bc(){if(void 0===ac){var a=null,b=w.trustedTypes;if(b&&b.createPolicy){try{a=b.createPolicy("goog#html",{createHTML:Ha,createScript:Ha,createScriptURL:Ha})}catch(c){w.console&&w.console.error(c.message)}ac=a}else ac=a}return ac};function cc(a,b){this.h=b===dc?a:""}function ec(a,b){a=fc.exec(gc(a).toString());var c=a[3]||"";return hc(a[1]+ic("?",a[2]||"",b)+ic("#",c))}cc.prototype.toString=function(){return this.h+""};function gc(a){return a instanceof cc&&a.constructor===cc?a.h:"type_error:TrustedResourceUrl"}var fc=/^([^?#]*)(\?[^#]*)?(#[\s\S]*)?/,dc={};function hc(a){var b=bc();a=b?b.createScriptURL(a):a;return new cc(a,dc)} function ic(a,b,c){if(null==c)return b;if("string"===typeof c)return c?a+encodeURIComponent(c):"";for(var d in c)if(Object.prototype.hasOwnProperty.call(c,d)){var e=c[d];e=Array.isArray(e)?e:[e];for(var f=0;f<e.length;f++){var g=e[f];null!=g&&(b||(b=a),b+=(b.length>a.length?"&":"")+encodeURIComponent(d)+"="+encodeURIComponent(String(g)))}}return b};function jc(a,b){this.h=b===kc?a:""}jc.prototype.toString=function(){return this.h.toString()};var kc={};/* SPDX-License-Identifier: Apache-2.0 */ var lc={};function mc(){}function nc(a){this.h=a}v(nc,mc);nc.prototype.toString=function(){return this.h.toString()};function oc(a){var b,c=null==(b=bc())?void 0:b.createScriptURL(a);return new nc(null!=c?c:a,lc)}function pc(a){if(a instanceof nc)return a.h;throw Error("");};function qc(a){return a instanceof mc?pc(a):gc(a)}function rc(a){return a instanceof jc&&a.constructor===jc?a.h:"type_error:SafeUrl"}function sc(a){return a instanceof mc?pc(a).toString():gc(a).toString()};var tc="alternate author bookmark canonical cite help icon license next prefetch dns-prefetch prerender preconnect preload prev search subresource".split(" ");function uc(a){return function(){return!a.apply(this,arguments)}}function vc(a){var b=!1,c;return function(){b||(c=a(),b=!0);return c}}function wc(a){var b=a;return function(){if(b){var c=b;b=null;c()}}};function xc(a,b,c){a.addEventListener&&a.addEventListener(b,c,!1)}function yc(a,b){a.removeEventListener&&a.removeEventListener("message",b,!1)};function zc(a){return String(a).replace(/\-([a-z])/g,function(b,c){return c.toUpperCase()})};function Ac(a,b,c){function d(h){h&&b.appendChild("string"===typeof h?a.createTextNode(h):h)}for(var e=1;e<c.length;e++){var f=c[e];if(!xa(f)||ya(f)&&0<f.nodeType)d(f);else{a:{if(f&&"number"==typeof f.length){if(ya(f)){var g="function"==typeof f.item||"string"==typeof f.item;break a}if("function"===typeof f){g="function"==typeof f.item;break a}}g=!1}Ra(g?Ya(f):f,d)}}}function Bc(a){this.h=a||w.document||document}n=Bc.prototype;n.getElementsByTagName=function(a,b){return(b||this.h).getElementsByTagName(String(a))}; n.createElement=function(a){var b=this.h;a=String(a);"application/xhtml+xml"===b.contentType&&(a=a.toLowerCase());return b.createElement(a)};n.createTextNode=function(a){return this.h.createTextNode(String(a))};n.append=function(a,b){Ac(9==a.nodeType?a:a.ownerDocument||a.document,a,arguments)}; n.contains=function(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if("undefined"!=typeof a.compareDocumentPosition)return a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a};function Cc(){return!Dc()&&(x("iPod")||x("iPhone")||x("Android")||x("IEMobile"))}function Dc(){return x("iPad")||x("Android")&&!x("Mobile")||x("Silk")};var Ec=RegExp("^(?:([^:/?#.]+):)?(?://(?:([^\\\\/?#]*)@)?([^\\\\/?#]*?)(?::([0-9]+))?(?=[\\\\/?#]|$))?([^?#]+)?(?:\\?([^#]*))?(?:#([\\s\\S]*))?$"),Fc=/#|$/;function Gc(a){var b=a.search(Fc),c;a:{for(c=0;0<=(c=a.indexOf("client",c))&&c<b;){var d=a.charCodeAt(c-1);if(38==d||63==d)if(d=a.charCodeAt(c+6),!d||61==d||38==d||35==d)break a;c+=7}c=-1}if(0>c)return null;d=a.indexOf("&",c);if(0>d||d>b)d=b;c+=7;return decodeURIComponent(a.substr(c,d-c).replace(/\+/g," "))};function Hc(a){try{var b;if(b=!!a&&null!=a.location.href)a:{try{Za(a.foo);b=!0;break a}catch(c){}b=!1}return b}catch(c){return!1}}function Ic(a){return Hc(a.top)?a.top:null} function Lc(a,b){var c=Mc("SCRIPT",a);c.src=qc(b);var d,e;(d=(b=null==(e=(d=(c.ownerDocument&&c.ownerDocument.defaultView||window).document).querySelector)?void 0:e.call(d,"script[nonce]"))?b.nonce||b.getAttribute("nonce")||"":"")&&c.setAttribute("nonce",d);return(a=a.getElementsByTagName("script")[0])&&a.parentNode?(a.parentNode.insertBefore(c,a),c):null}function Nc(a,b){return b.getComputedStyle?b.getComputedStyle(a,null):a.currentStyle} function Oc(a,b){if(!Pc()&&!Qc()){var c=Math.random();if(c<b)return c=Rc(),a[Math.floor(c*a.length)]}return null}function Rc(){if(!p.globalThis.crypto)return Math.random();try{var a=new Uint32Array(1);p.globalThis.crypto.getRandomValues(a);return a[0]/65536/65536}catch(b){return Math.random()}}function Sc(a,b){if(a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&b(a[c],c,a)} function Tc(a){var b=a.length;if(0==b)return 0;for(var c=305419896,d=0;d<b;d++)c^=(c<<5)+(c>>2)+a.charCodeAt(d)&4294967295;return 0<c?c:4294967296+c}var Qc=vc(function(){return Ua(["Google Web Preview","Mediapartners-Google","Google-Read-Aloud","Google-Adwords"],Uc)||1E-4>Math.random()});function Vc(a,b){var c=-1;try{a&&(c=parseInt(a.getItem(b),10))}catch(d){return null}return 0<=c&&1E3>c?c:null} function Wc(a,b){var c=Qc()?null:Math.floor(1E3*Rc());var d;if(d=null!=c&&a)a:{var e=String(c);try{if(a){a.setItem(b,e);d=e;break a}}catch(f){}d=null}return d?c:null}var Pc=vc(function(){return Uc("MSIE")});function Uc(a){return-1!=Ma().indexOf(a)}var Xc=/^([0-9.]+)px$/,Yc=/^(-?[0-9.]{1,30})$/;function Zc(a){var b=void 0===b?null:b;if(!Yc.test(a))return b;a=Number(a);return isNaN(a)?b:a}function K(a){return(a=Xc.exec(a))?+a[1]:null} function $c(a,b){for(var c=0;50>c;++c){try{var d=!(!a.frames||!a.frames[b])}catch(g){d=!1}if(d)return a;a:{try{var e=a.parent;if(e&&e!=a){var f=e;break a}}catch(g){}f=null}if(!(a=f))break}return null}var ad=vc(function(){return Cc()?2:Dc()?1:0});function bd(a){Sc({display:"none"},function(b,c){a.style.setProperty(c,b,"important")})}var cd=[];function dd(){var a=cd;cd=[];a=u(a);for(var b=a.next();!b.done;b=a.next()){b=b.value;try{b()}catch(c){}}} function ed(a,b){0!=a.length&&b.head&&a.forEach(function(c){if(c&&c&&b.head){var d=Mc("META");b.head.appendChild(d);d.httpEquiv="origin-trial";d.content=c}})}function fd(a){if("number"!==typeof a.goog_pvsid)try{Object.defineProperty(a,"goog_pvsid",{value:Math.floor(Math.random()*Math.pow(2,52)),configurable:!1})}catch(b){}return Number(a.goog_pvsid)||-1} function gd(a){var b=hd;"complete"===b.readyState||"interactive"===b.readyState?(cd.push(a),1==cd.length&&(p.Promise?p.Promise.resolve().then(dd):window.setImmediate?setImmediate(dd):setTimeout(dd,0))):b.addEventListener("DOMContentLoaded",a)}function Mc(a,b){b=void 0===b?document:b;return b.createElement(String(a).toLowerCase())};var id=null;var hd=document,L=window;var jd=null;function kd(a,b){b=void 0===b?[]:b;var c=!1;w.google_logging_queue||(c=!0,w.google_logging_queue=[]);w.google_logging_queue.push([a,b]);if(a=c){if(null==jd){jd=!1;try{var d=Ic(w);d&&-1!==d.location.hash.indexOf("google_logging")&&(jd=!0);w.localStorage.getItem("google_logging")&&(jd=!0)}catch(e){}}a=jd}a&&(d=w.document,a=new Ub(Vb,"https://pagead2.googlesyndication.com/pagead/js/logging_library.js"),a=hc(a instanceof Ub&&a.constructor===Ub&&a.h===Wb?a.i:"type_error:Const"),Lc(d,a))};function ld(a){a=void 0===a?w:a;var b=a.context||a.AMP_CONTEXT_DATA;if(!b)try{b=a.parent.context||a.parent.AMP_CONTEXT_DATA}catch(c){}try{if(b&&b.pageViewId&&b.canonicalUrl)return b}catch(c){}return null}function md(a){return(a=a||ld())?Hc(a.master)?a.master:null:null};function nd(a){var b=ta.apply(1,arguments);if(0===b.length)return oc(a[0]);for(var c=[a[0]],d=0;d<b.length;d++)c.push(encodeURIComponent(b[d])),c.push(a[d+1]);return oc(c.join(""))};function od(a){var b=void 0===b?1:b;a=md(ld(a))||a;a.google_unique_id=(a.google_unique_id||0)+b;return a.google_unique_id}function pd(a){a=a.google_unique_id;return"number"===typeof a?a:0}function qd(){var a=void 0===a?L:a;if(!a)return!1;try{return!(!a.navigator.standalone&&!a.top.navigator.standalone)}catch(b){return!1}}function rd(a){if(!a)return"";a=a.toLowerCase();"ca-"!=a.substring(0,3)&&(a="ca-"+a);return a};function sd(){this.i=new td(this);this.h=0}sd.prototype.resolve=function(a){ud(this);this.h=1;this.l=a;vd(this.i)};sd.prototype.reject=function(a){ud(this);this.h=2;this.j=a;vd(this.i)};function ud(a){if(0!=a.h)throw Error("Already resolved/rejected.");}function td(a){this.h=a}td.prototype.then=function(a,b){if(this.i)throw Error("Then functions already set.");this.i=a;this.j=b;vd(this)}; function vd(a){switch(a.h.h){case 0:break;case 1:a.i&&a.i(a.h.l);break;case 2:a.j&&a.j(a.h.j);break;default:throw Error("Unhandled deferred state.");}};function wd(a){this.h=a.slice(0)}n=wd.prototype;n.forEach=function(a){var b=this;this.h.forEach(function(c,d){return void a(c,d,b)})};n.filter=function(a){return new wd(Sa(this.h,a))};n.apply=function(a){return new wd(a(this.h.slice(0)))};n.sort=function(a){return new wd(this.h.slice(0).sort(a))};n.get=function(a){return this.h[a]};n.add=function(a){var b=this.h.slice(0);b.push(a);return new wd(b)};function xd(a,b){for(var c=[],d=a.length,e=0;e<d;e++)c.push(a[e]);c.forEach(b,void 0)};function yd(){this.h={};this.i={}}yd.prototype.set=function(a,b){var c=zd(a);this.h[c]=b;this.i[c]=a};yd.prototype.get=function(a,b){a=zd(a);return void 0!==this.h[a]?this.h[a]:b};yd.prototype.clear=function(){this.h={};this.i={}};function zd(a){return a instanceof Object?String(za(a)):a+""};function Ad(a,b){this.h=a;this.i=b}function Bd(a){return null!=a.h?a.h.value:null}function Cd(a,b){null!=a.h&&b(a.h.value);return a}Ad.prototype.map=function(a){return null!=this.h?(a=a(this.h.value),a instanceof Ad?a:Dd(a)):this};function Ed(a,b){null!=a.h||b(a.i);return a}function Dd(a){return new Ad({value:a},null)}function Fd(a){return new Ad(null,a)}function Gd(a){try{return Dd(a())}catch(b){return Fd(b)}};function Hd(a){this.h=new yd;if(a)for(var b=0;b<a.length;++b)this.add(a[b])}Hd.prototype.add=function(a){this.h.set(a,!0)};Hd.prototype.contains=function(a){return void 0!==this.h.h[zd(a)]};function Id(){this.h=new yd}Id.prototype.set=function(a,b){var c=this.h.get(a);c||(c=new Hd,this.h.set(a,c));c.add(b)};function Jd(a){J.call(this,a,-1,Kd)}v(Jd,J);Jd.prototype.getId=function(){return A(this,3)};var Kd=[4];function Ld(a){var b=void 0===a.Ga?void 0:a.Ga,c=void 0===a.gb?void 0:a.gb,d=void 0===a.Ra?void 0:a.Ra;this.h=void 0===a.bb?void 0:a.bb;this.l=new wd(b||[]);this.j=d;this.i=c};function Md(a){var b=[],c=a.l;c&&c.h.length&&b.push({X:"a",ca:Nd(c)});null!=a.h&&b.push({X:"as",ca:a.h});null!=a.i&&b.push({X:"i",ca:String(a.i)});null!=a.j&&b.push({X:"rp",ca:String(a.j)});b.sort(function(d,e){return d.X.localeCompare(e.X)});b.unshift({X:"t",ca:"aa"});return b}function Nd(a){a=a.h.slice(0).map(Od);a=JSON.stringify(a);return Tc(a)}function Od(a){var b={};null!=A(a,7)&&(b.q=A(a,7));null!=A(a,2)&&(b.o=A(a,2));null!=A(a,5)&&(b.p=A(a,5));return b};function Pd(a){J.call(this,a)}v(Pd,J);Pd.prototype.setLocation=function(a){return B(this,1,a)};function Qd(a,b){this.Ja=a;this.Qa=b}function Rd(a){var b=[].slice.call(arguments).filter(uc(function(e){return null===e}));if(!b.length)return null;var c=[],d={};b.forEach(function(e){c=c.concat(e.Ja||[]);d=r(Object,"assign").call(Object,d,e.Qa)});return new Qd(c,d)} function Sd(a){switch(a){case 1:return new Qd(null,{google_ad_semantic_area:"mc"});case 2:return new Qd(null,{google_ad_semantic_area:"h"});case 3:return new Qd(null,{google_ad_semantic_area:"f"});case 4:return new Qd(null,{google_ad_semantic_area:"s"});default:return null}} function Td(a){if(null==a)a=null;else{var b=Md(a);a=[];b=u(b);for(var c=b.next();!c.done;c=b.next()){c=c.value;var d=String(c.ca);a.push(c.X+"."+(20>=d.length?d:d.slice(0,19)+"_"))}a=new Qd(null,{google_placement_id:a.join("~")})}return a};var Ud={},Vd=new Qd(["google-auto-placed"],(Ud.google_reactive_ad_format=40,Ud.google_tag_origin="qs",Ud));function Wd(a){J.call(this,a)}v(Wd,J);function Xd(a){J.call(this,a)}v(Xd,J);Xd.prototype.getName=function(){return A(this,4)};function Yd(a){J.call(this,a)}v(Yd,J);function Zd(a){J.call(this,a)}v(Zd,J);function $d(a){J.call(this,a)}v($d,J);var ae=[1,2,3];function be(a){J.call(this,a)}v(be,J);function ce(a){J.call(this,a,-1,de)}v(ce,J);var de=[6,7,9,10,11];function ee(a){J.call(this,a,-1,fe)}v(ee,J);function ge(a){J.call(this,a)}v(ge,J);function he(a){J.call(this,a)}v(he,J);var fe=[1],ie=[1,2];function je(a){J.call(this,a,-1,ke)}v(je,J);function le(a){J.call(this,a)}v(le,J);function me(a){J.call(this,a,-1,ne)}v(me,J);function oe(a){J.call(this,a)}v(oe,J);function pe(a){J.call(this,a)}v(pe,J);function qe(a){J.call(this,a)}v(qe,J);function re(a){J.call(this,a)}v(re,J);var ke=[1,2,5,7],ne=[2,5,6,11];function se(a){J.call(this,a)}v(se,J);function te(a){if(1!=a.nodeType)var b=!1;else if(b="INS"==a.tagName)a:{b=["adsbygoogle-placeholder"];a=a.className?a.className.split(/\s+/):[];for(var c={},d=0;d<a.length;++d)c[a[d]]=!0;for(d=0;d<b.length;++d)if(!c[b[d]]){b=!1;break a}b=!0}return b};function ue(a,b,c){switch(c){case 0:b.parentNode&&b.parentNode.insertBefore(a,b);break;case 3:if(c=b.parentNode){var d=b.nextSibling;if(d&&d.parentNode!=c)for(;d&&8==d.nodeType;)d=d.nextSibling;c.insertBefore(a,d)}break;case 1:b.insertBefore(a,b.firstChild);break;case 2:b.appendChild(a)}te(b)&&(b.setAttribute("data-init-display",b.style.display),b.style.display="block")};function M(a,b){this.h=a;this.defaultValue=void 0===b?!1:b}function N(a,b){this.h=a;this.defaultValue=void 0===b?0:b}function ve(a,b){b=void 0===b?[]:b;this.h=a;this.defaultValue=b};var we=new M(1084),xe=new M(1082,!0),ye=new N(62,.001),ze=new N(1130,100),Ae=new function(a,b){this.h=a;this.defaultValue=void 0===b?"":b}(14),Be=new N(1114,1),Ce=new N(1110),De=new N(1111),Ee=new N(1112),Fe=new N(1113),Ge=new N(1104),He=new N(1108),Ie=new N(1106),Je=new N(1107),Ke=new N(1105),Le=new N(1115,1),Me=new M(1121),Ne=new M(1144),Oe=new M(1143),Pe=new M(316),Qe=new M(313),Re=new M(369),Se=new M(1093),Te=new N(1098),Ue=new M(1129),Ve=new M(1128),We=new M(1026),Xe=new M(1090),Ye=new M(1053, !0),Ze=new M(1162),$e=new M(1120),af=new M(1100,!0),bf=new N(1046),cf=new M(1102,!0),df=new M(218),ef=new M(217),ff=new M(227),gf=new M(208),hf=new M(282),jf=new M(1086),kf=new N(1079,5),lf=new M(1141),mf=new ve(1939),nf=new ve(1934,["A8FHS1NmdCwGqD9DwOicnHHY+y27kdWfxKa0YHSGDfv0CSpDKRHTQdQmZVPDUdaFWUsxdgVxlwAd6o+dhJykPA0AAACWeyJvcmlnaW4iOiJodHRwczovL2RvdWJsZWNsaWNrLm5ldDo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjQzMTU1MTk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlLCJ1c2FnZSI6InN1YnNldCJ9", "A8zdXi6dr1hwXEUjQrYiyYQGlU3557y5QWDnN0Lwgj9ePt66XMEvNkVWOEOWPd7TP9sBQ25X0Q15Lr1Nn4oGFQkAAACceyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXN5bmRpY2F0aW9uLmNvbTo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjQzMTU1MTk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlLCJ1c2FnZSI6InN1YnNldCJ9","A4/Htern2udN9w3yJK9QgWQxQFruxOXsXL7cW60DyCl0EZFGCSme/J33Q/WzF7bBkVvhEWDlcBiUyZaim5CpFQwAAACceyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXRhZ3NlcnZpY2VzLmNvbTo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjQzMTU1MTk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlLCJ1c2FnZSI6InN1YnNldCJ9"]), of=new M(203),pf=new M(434462125),qf=new M(84),rf=new M(1928),sf=new M(1941),tf=new M(370946349),uf=new M(392736476,!0),vf=new N(406149835),wf=new ve(1932,["AxujKG9INjsZ8/gUq8+dTruNvk7RjZQ1oFhhgQbcTJKDnZfbzSTE81wvC2Hzaf3TW4avA76LTZEMdiedF1vIbA4AAABueyJvcmlnaW4iOiJodHRwczovL2ltYXNkay5nb29nbGVhcGlzLmNvbTo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2NTI3NzQ0MDAsImlzVGhpcmRQYXJ0eSI6dHJ1ZX0=","Azuce85ORtSnWe1MZDTv68qpaW3iHyfL9YbLRy0cwcCZwVnePnOmkUJlG8HGikmOwhZU22dElCcfrfX2HhrBPAkAAAB7eyJvcmlnaW4iOiJodHRwczovL2RvdWJsZWNsaWNrLm5ldDo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2NTI3NzQ0MDAsImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9", "A16nvcdeoOAqrJcmjLRpl1I6f3McDD8EfofAYTt/P/H4/AWwB99nxiPp6kA0fXoiZav908Z8etuL16laFPUdfQsAAACBeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXRhZ3NlcnZpY2VzLmNvbTo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2NTI3NzQ0MDAsImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9","AxBHdr0J44vFBQtZUqX9sjiqf5yWZ/OcHRcRMN3H9TH+t90V/j3ENW6C8+igBZFXMJ7G3Pr8Dd13632aLng42wgAAACBeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXN5bmRpY2F0aW9uLmNvbTo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2NTI3NzQ0MDAsImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9", "A88BWHFjcawUfKU3lIejLoryXoyjooBXLgWmGh+hNcqMK44cugvsI5YZbNarYvi3roc1fYbHA1AVbhAtuHZflgEAAAB2eyJvcmlnaW4iOiJodHRwczovL2dvb2dsZS5jb206NDQzIiwiZmVhdHVyZSI6IlRydXN0VG9rZW5zIiwiZXhwaXJ5IjoxNjUyNzc0NDAwLCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlfQ=="]),xf=new N(1935);function O(a){var b="sa";if(a.sa&&a.hasOwnProperty(b))return a.sa;b=new a;return a.sa=b};function yf(){var a={};this.i=function(b,c){return null!=a[b]?a[b]:c};this.j=function(b,c){return null!=a[b]?a[b]:c};this.l=function(b,c){return null!=a[b]?a[b]:c};this.h=function(b,c){return null!=a[b]?a[b]:c};this.m=function(){}}function P(a){return O(yf).i(a.h,a.defaultValue)}function Q(a){return O(yf).j(a.h,a.defaultValue)}function zf(){return O(yf).l(Ae.h,Ae.defaultValue)};function Af(a,b,c){function d(f){f=Bf(f);return null==f?!1:c>f}function e(f){f=Bf(f);return null==f?!1:c<f}switch(b){case 0:return{init:Cf(a.previousSibling,e),ja:function(f){return Cf(f.previousSibling,e)},na:0};case 2:return{init:Cf(a.lastChild,e),ja:function(f){return Cf(f.previousSibling,e)},na:0};case 3:return{init:Cf(a.nextSibling,d),ja:function(f){return Cf(f.nextSibling,d)},na:3};case 1:return{init:Cf(a.firstChild,d),ja:function(f){return Cf(f.nextSibling,d)},na:3}}throw Error("Un-handled RelativePosition: "+ b);}function Bf(a){return a.hasOwnProperty("google-ama-order-assurance")?a["google-ama-order-assurance"]:null}function Cf(a,b){return a&&b(a)?a:null};var Df={rectangle:1,horizontal:2,vertical:4};function Ef(a,b){a.google_image_requests||(a.google_image_requests=[]);var c=Mc("IMG",a.document);c.src=b;a.google_image_requests.push(c)}function Ff(a){var b="https://pagead2.googlesyndication.com/pagead/gen_204?id=dtt_err";Sc(a,function(c,d){c&&(b+="&"+d+"="+encodeURIComponent(c))});Gf(b)}function Gf(a){var b=window;b.fetch?b.fetch(a,{keepalive:!0,credentials:"include",redirect:"follow",method:"get",mode:"no-cors"}):Ef(b,a)};function Hf(){this.j="&";this.i={};this.l=0;this.h=[]}function If(a,b){var c={};c[a]=b;return[c]}function Jf(a,b,c,d,e){var f=[];Sc(a,function(g,h){(g=Kf(g,b,c,d,e))&&f.push(h+"="+g)});return f.join(b)} function Kf(a,b,c,d,e){if(null==a)return"";b=b||"&";c=c||",$";"string"==typeof c&&(c=c.split(""));if(a instanceof Array){if(d=d||0,d<c.length){for(var f=[],g=0;g<a.length;g++)f.push(Kf(a[g],b,c,d+1,e));return f.join(c[d])}}else if("object"==typeof a)return e=e||0,2>e?encodeURIComponent(Jf(a,b,c,d,e+1)):"...";return encodeURIComponent(String(a))} function Lf(a,b){var c="https://pagead2.googlesyndication.com"+b,d=Mf(a)-b.length;if(0>d)return"";a.h.sort(function(m,q){return m-q});b=null;for(var e="",f=0;f<a.h.length;f++)for(var g=a.h[f],h=a.i[g],k=0;k<h.length;k++){if(!d){b=null==b?g:b;break}var l=Jf(h[k],a.j,",$");if(l){l=e+l;if(d>=l.length){d-=l.length;c+=l;e=a.j;break}b=null==b?g:b}}a="";null!=b&&(a=e+"trn="+b);return c+a}function Mf(a){var b=1,c;for(c in a.i)b=c.length>b?c.length:b;return 3997-b-a.j.length-1};function Nf(){this.h=Math.random()}function Of(){var a=Pf,b=w.google_srt;0<=b&&1>=b&&(a.h=b)}function Qf(a,b,c,d,e){if((d?a.h:Math.random())<(e||.01))try{if(c instanceof Hf)var f=c;else f=new Hf,Sc(c,function(h,k){var l=f,m=l.l++;h=If(k,h);l.h.push(m);l.i[m]=h});var g=Lf(f,"/pagead/gen_204?id="+b+"&");g&&Ef(w,g)}catch(h){}};var Rf={overlays:1,interstitials:2,vignettes:2,inserts:3,immersives:4,list_view:5};function Sf(){this.wasPlaTagProcessed=!1;this.wasReactiveAdConfigReceived={};this.adCount={};this.wasReactiveAdVisible={};this.stateForType={};this.reactiveTypeEnabledInAsfe={};this.wasReactiveTagRequestSent=!1;this.reactiveTypeDisabledByPublisher={};this.tagSpecificState={};this.messageValidationEnabled=!1;this.floatingAdsStacking=new Tf;this.sideRailProcessedFixedElements=new p.Set;this.sideRailAvailableSpace=new p.Map} function Uf(a){a.google_reactive_ads_global_state?(null==a.google_reactive_ads_global_state.sideRailProcessedFixedElements&&(a.google_reactive_ads_global_state.sideRailProcessedFixedElements=new p.Set),null==a.google_reactive_ads_global_state.sideRailAvailableSpace&&(a.google_reactive_ads_global_state.sideRailAvailableSpace=new p.Map)):a.google_reactive_ads_global_state=new Sf;return a.google_reactive_ads_global_state} function Tf(){this.maxZIndexRestrictions={};this.nextRestrictionId=0;this.maxZIndexListeners=[]};function Vf(a){a=a.document;var b={};a&&(b="CSS1Compat"==a.compatMode?a.documentElement:a.body);return b||{}}function Wf(a){return Vf(a).clientWidth};function Xf(a){return null!==a&&void 0!==a}function Yf(a,b){if(!b(a))throw Error(String(a));};function Zf(a){return"string"===typeof a}function $f(a){return void 0===a};function ag(a){J.call(this,a,-1,bg)}v(ag,J);var bg=[2,8],cg=[3,4,5],dg=[6,7];var eg;eg={Kb:0,Ya:3,Za:4,$a:5};var fg=eg.Ya,gg=eg.Za,hg=eg.$a;function ig(a){return null!=a?!a:a}function jg(a,b){for(var c=!1,d=0;d<a.length;d++){var e=a[d]();if(e===b)return e;null==e&&(c=!0)}if(!c)return!b}function kg(a,b){var c=H(a,ag,2);if(!c.length)return lg(a,b);a=C(a,1,0);if(1===a)return ig(kg(c[0],b));c=Ta(c,function(d){return function(){return kg(d,b)}});switch(a){case 2:return jg(c,!1);case 3:return jg(c,!0)}} function lg(a,b){var c=Cb(a,cg);a:{switch(c){case fg:var d=Hb(a,3,cg);break a;case gg:d=Hb(a,4,cg);break a;case hg:d=Hb(a,5,cg);break a}d=void 0}if(d&&(b=(b=b[c])&&b[d])){try{var e=b.apply(null,ka(wb(a,8)))}catch(f){return}b=C(a,1,0);if(4===b)return!!e;d=null!=e;if(5===b)return d;if(12===b)a=I(a,Db(a,dg,7));else a:{switch(c){case gg:a=yb(a,Db(a,dg,6));break a;case hg:a=I(a,Db(a,dg,7));break a}a=void 0}if(null!=a){if(6===b)return e===a;if(9===b)return null!=e&&0===Ka(String(e),a);if(d)switch(b){case 7:return e< a;case 8:return e>a;case 12:return Zf(a)&&Zf(e)&&(new RegExp(a)).test(e);case 10:return null!=e&&-1===Ka(String(e),a);case 11:return null!=e&&1===Ka(String(e),a)}}}}function mg(a,b){return!a||!(!b||!kg(a,b))};function ng(a){J.call(this,a,-1,og)}v(ng,J);var og=[4];function pg(a){J.call(this,a)}v(pg,J);function qg(a){J.call(this,a,-1,rg)}v(qg,J);var rg=[5],sg=[1,2,3,6,7];function tg(a){a.Sa.apply(a,ka(ta.apply(1,arguments).map(function(b){return{Xa:4,message:b}})))}function ug(a){a.Sa.apply(a,ka(ta.apply(1,arguments).map(function(b){return{Xa:7,message:b}})))};function vg(a){return function(){var b=ta.apply(0,arguments);try{return a.apply(this,b)}catch(c){}}}var wg=vg(function(a){var b=[],c={};a=u(a);for(var d=a.next();!d.done;c={ea:c.ea},d=a.next())c.ea=d.value,vg(function(e){return function(){b.push('[{"'+e.ea.Xa+'":'+Lb(e.ea.message)+"}]")}}(c))();return"[["+b.join(",")+"]]"});function xg(a,b){if(p.globalThis.fetch)p.globalThis.fetch(a,{method:"POST",body:b,keepalive:65536>b.length,credentials:"omit",mode:"no-cors",redirect:"follow"});else{var c=new XMLHttpRequest;c.open("POST",a,!0);c.send(b)}};function yg(a){var b=void 0===b?xg:b;this.l=void 0===a?1E3:a;this.j=b;this.i=[];this.h=null}yg.prototype.Sa=function(){var a=ta.apply(0,arguments),b=this;vg(function(){b.i.push.apply(b.i,ka(a));var c=vg(function(){var d=wg(b.i);b.j("https://pagead2.googlesyndication.com/pagead/ping?e=1",d);b.i=[];b.h=null});100<=b.i.length?(null!==b.h&&clearTimeout(b.h),b.h=setTimeout(c,0)):null===b.h&&(b.h=setTimeout(c,b.l))})()};function zg(a){J.call(this,a,-1,Ag)}v(zg,J);function Bg(a,b){return Eb(a,1,b)}function Cg(a,b){return Gb(a,2,b)}function Dg(a,b){return zb(a,4,b)}function Eg(a,b){return Gb(a,5,b)}function Fg(a,b){return Ab(a,6,b)}function Gg(a){J.call(this,a)}v(Gg,J);Gg.prototype.V=function(){return C(this,1,0)};function Hg(a,b){return Ab(a,1,b)}function Ig(a,b){return Ab(a,2,b)}function Jg(a){J.call(this,a)}v(Jg,J);var Ag=[2,4,5],Kg=[1,2];function Lg(a){J.call(this,a,-1,Mg)}v(Lg,J);function Ng(a){J.call(this,a,-1,Og)}v(Ng,J);var Mg=[2,3],Og=[5],Pg=[1,2,3,4];function Qg(a){J.call(this,a)}v(Qg,J);Qg.prototype.getTagSessionCorrelator=function(){return C(this,2,0)};function Rg(a){var b=new Qg;return Fb(b,4,Sg,a)}var Sg=[4,5,7];function Tg(a,b,c){var d=void 0===d?new yg(b):d;this.i=a;this.m=c;this.j=d;this.h=[];this.l=0<this.i&&Rc()<1/this.i}function Yg(a,b,c,d,e,f){var g=Ig(Hg(new Gg,b),c);b=Fg(Cg(Bg(Eg(Dg(new zg,d),e),g),a.h),f);b=Rg(b);a.l&&tg(a.j,Zg(a,b));if(1===f||3===f||4===f&&!a.h.some(function(h){return h.V()===g.V()&&C(h,2,0)===c}))a.h.push(g),100<a.h.length&&a.h.shift()}function $g(a,b,c,d){if(a.m){var e=new Lg;b=Gb(e,2,b);c=Gb(b,3,c);d&&Ab(c,1,d);d=new Qg;d=Fb(d,7,Sg,c);a.l&&tg(a.j,Zg(a,d))}} function Zg(a,b){b=Ab(b,1,Date.now());var c=fd(window);b=Ab(b,2,c);return Ab(b,6,a.i)};function ah(){var a={};this.h=(a[fg]={},a[gg]={},a[hg]={},a)};var bh=/^true$/.test("false");function ch(a,b){switch(b){case 1:return Hb(a,1,sg);case 2:return Hb(a,2,sg);case 3:return Hb(a,3,sg);case 6:return Hb(a,6,sg);default:return null}}function dh(a,b){if(!a)return null;switch(b){case 1:return D(a,1);case 7:return I(a,3);case 2:return yb(a,2);case 3:return I(a,3);case 6:return wb(a,4);default:return null}}var eh=vc(function(){if(!bh)return{};try{var a=window.sessionStorage&&window.sessionStorage.getItem("GGDFSSK");if(a)return JSON.parse(a)}catch(b){}return{}}); function fh(a,b,c,d){var e=d=void 0===d?0:d,f,g;O(gh).j[e]=null!=(g=null==(f=O(gh).j[e])?void 0:f.add(b))?g:(new p.Set).add(b);e=eh();if(null!=e[b])return e[b];b=hh(d)[b];if(!b)return c;b=new qg(b);b=ih(b);a=dh(b,a);return null!=a?a:c}function ih(a){var b=O(ah).h;if(b){var c=Wa(H(a,pg,5),function(d){return mg(G(d,ag,1),b)});if(c)return G(c,ng,2)}return G(a,ng,4)}function gh(){this.i={};this.l=[];this.j={};this.h=new p.Map}function jh(a,b,c){return!!fh(1,a,void 0===b?!1:b,c)} function kh(a,b,c){b=void 0===b?0:b;a=Number(fh(2,a,b,c));return isNaN(a)?b:a}function lh(a,b,c){return fh(3,a,void 0===b?"":b,c)}function mh(a,b,c){b=void 0===b?[]:b;return fh(6,a,b,c)}function hh(a){return O(gh).i[a]||(O(gh).i[a]={})}function nh(a,b){var c=hh(b);Sc(a,function(d,e){return c[e]=d})} function oh(a,b,c,d,e){e=void 0===e?!1:e;var f=[],g=[];Ra(b,function(h){var k=hh(h);Ra(a,function(l){var m=Cb(l,sg),q=ch(l,m);if(q){var t,y,F;var z=null!=(F=null==(t=O(gh).h.get(h))?void 0:null==(y=t.get(q))?void 0:y.slice(0))?F:[];a:{t=new Ng;switch(m){case 1:Bb(t,1,Pg,q);break;case 2:Bb(t,2,Pg,q);break;case 3:Bb(t,3,Pg,q);break;case 6:Bb(t,4,Pg,q);break;default:m=void 0;break a}zb(t,5,z);m=t}if(z=m){var E;z=!(null==(E=O(gh).j[h])||!E.has(q))}z&&f.push(m);if(E=m){var S;E=!(null==(S=O(gh).h.get(h))|| !S.has(q))}E&&g.push(m);e||(S=O(gh),S.h.has(h)||S.h.set(h,new p.Map),S.h.get(h).has(q)||S.h.get(h).set(q,[]),d&&S.h.get(h).get(q).push(d));k[q]=l.toJSON()}})});(f.length||g.length)&&$g(c,f,g,null!=d?d:void 0)}function ph(a,b){var c=hh(b);Ra(a,function(d){var e=new qg(d),f=Cb(e,sg);(e=ch(e,f))&&(c[e]||(c[e]=d))})}function qh(){return Ta(r(Object,"keys").call(Object,O(gh).i),function(a){return Number(a)})}function rh(a){Xa(O(gh).l,a)||nh(hh(4),a)};function sh(a){this.methodName=a}var th=new sh(1),uh=new sh(16),vh=new sh(15),wh=new sh(2),xh=new sh(3),yh=new sh(4),zh=new sh(5),Ah=new sh(6),Bh=new sh(7),Ch=new sh(8),Dh=new sh(9),Eh=new sh(10),Fh=new sh(11),Gh=new sh(12),Hh=new sh(13),Ih=new sh(14);function Jh(a,b,c){c.hasOwnProperty(a.methodName)||Object.defineProperty(c,String(a.methodName),{value:b})}function Kh(a,b,c){return b[a.methodName]||c||function(){}} function Lh(a){Jh(zh,jh,a);Jh(Ah,kh,a);Jh(Bh,lh,a);Jh(Ch,mh,a);Jh(Hh,ph,a);Jh(vh,rh,a)}function Mh(a){Jh(yh,function(b){O(ah).h=b},a);Jh(Dh,function(b,c){var d=O(ah);d.h[fg][b]||(d.h[fg][b]=c)},a);Jh(Eh,function(b,c){var d=O(ah);d.h[gg][b]||(d.h[gg][b]=c)},a);Jh(Fh,function(b,c){var d=O(ah);d.h[hg][b]||(d.h[hg][b]=c)},a);Jh(Ih,function(b){for(var c=O(ah),d=u([fg,gg,hg]),e=d.next();!e.done;e=d.next())e=e.value,r(Object,"assign").call(Object,c.h[e],b[e])},a)} function Nh(a){a.hasOwnProperty("init-done")||Object.defineProperty(a,"init-done",{value:!0})};function Oh(){this.l=function(){};this.i=function(){};this.j=function(){};this.h=function(){return[]}}function Ph(a,b,c){a.l=Kh(th,b,function(){});a.j=function(d){Kh(wh,b,function(){return[]})(d,c)};a.h=function(){return Kh(xh,b,function(){return[]})(c)};a.i=function(d){Kh(uh,b,function(){})(d,c)}};function Qh(a,b){var c=void 0===c?{}:c;this.error=a;this.context=b.context;this.msg=b.message||"";this.id=b.id||"jserror";this.meta=c}function Rh(a){return!!(a.error&&a.meta&&a.id)};var Sh=RegExp("^https?://(\\w|-)+\\.cdn\\.ampproject\\.(net|org)(\\?|/|$)");function Th(a,b){this.h=a;this.i=b}function Uh(a,b,c){this.url=a;this.u=b;this.La=!!c;this.depth=null};var Vh=null;function Wh(){if(null===Vh){Vh="";try{var a="";try{a=w.top.location.hash}catch(c){a=w.location.hash}if(a){var b=a.match(/\bdeid=([\d,]+)/);Vh=b?b[1]:""}}catch(c){}}return Vh};function Xh(){var a=void 0===a?w:a;return(a=a.performance)&&a.now&&a.timing?Math.floor(a.now()+a.timing.navigationStart):Date.now()}function Yh(){var a=void 0===a?w:a;return(a=a.performance)&&a.now?a.now():null};function Zh(a,b){var c=Yh()||Xh();this.label=a;this.type=b;this.value=c;this.duration=0;this.uniqueId=Math.random();this.slotId=void 0};var $h=w.performance,ai=!!($h&&$h.mark&&$h.measure&&$h.clearMarks),bi=vc(function(){var a;if(a=ai)a=Wh(),a=!!a.indexOf&&0<=a.indexOf("1337");return a});function ci(){this.i=[];this.j=w||w;var a=null;w&&(w.google_js_reporting_queue=w.google_js_reporting_queue||[],this.i=w.google_js_reporting_queue,a=w.google_measure_js_timing);this.h=bi()||(null!=a?a:1>Math.random())} function di(a){a&&$h&&bi()&&($h.clearMarks("goog_"+a.label+"_"+a.uniqueId+"_start"),$h.clearMarks("goog_"+a.label+"_"+a.uniqueId+"_end"))}ci.prototype.start=function(a,b){if(!this.h)return null;a=new Zh(a,b);b="goog_"+a.label+"_"+a.uniqueId+"_start";$h&&bi()&&$h.mark(b);return a};ci.prototype.end=function(a){if(this.h&&"number"===typeof a.value){a.duration=(Yh()||Xh())-a.value;var b="goog_"+a.label+"_"+a.uniqueId+"_end";$h&&bi()&&$h.mark(b);!this.h||2048<this.i.length||this.i.push(a)}};function ei(){var a=fi;this.m=Pf;this.i=null;this.l=this.I;this.h=void 0===a?null:a;this.j=!1}n=ei.prototype;n.Ua=function(a){this.l=a};n.Ta=function(a){this.i=a};n.Va=function(a){this.j=a};n.oa=function(a,b,c){try{if(this.h&&this.h.h){var d=this.h.start(a.toString(),3);var e=b();this.h.end(d)}else e=b()}catch(h){b=!0;try{di(d),b=this.l(a,new Qh(h,{message:gi(h)}),void 0,c)}catch(k){this.I(217,k)}if(b){var f,g;null==(f=window.console)||null==(g=f.error)||g.call(f,h)}else throw h;}return e}; n.Oa=function(a,b){var c=this;return function(){var d=ta.apply(0,arguments);return c.oa(a,function(){return b.apply(void 0,d)})}}; n.I=function(a,b,c,d,e){e=e||"jserror";try{var f=new Hf;f.h.push(1);f.i[1]=If("context",a);Rh(b)||(b=new Qh(b,{message:gi(b)}));if(b.msg){var g=b.msg.substring(0,512);f.h.push(2);f.i[2]=If("msg",g)}var h=b.meta||{};if(this.i)try{this.i(h)}catch(Jc){}if(d)try{d(h)}catch(Jc){}b=[h];f.h.push(3);f.i[3]=b;d=w;b=[];g=null;do{var k=d;if(Hc(k)){var l=k.location.href;g=k.document&&k.document.referrer||null}else l=g,g=null;b.push(new Uh(l||"",k));try{d=k.parent}catch(Jc){d=null}}while(d&&k!=d);l=0;for(var m= b.length-1;l<=m;++l)b[l].depth=m-l;k=w;if(k.location&&k.location.ancestorOrigins&&k.location.ancestorOrigins.length==b.length-1)for(m=1;m<b.length;++m){var q=b[m];q.url||(q.url=k.location.ancestorOrigins[m-1]||"",q.La=!0)}var t=new Uh(w.location.href,w,!1);k=null;var y=b.length-1;for(q=y;0<=q;--q){var F=b[q];!k&&Sh.test(F.url)&&(k=F);if(F.url&&!F.La){t=F;break}}F=null;var z=b.length&&b[y].url;0!=t.depth&&z&&(F=b[y]);var E=new Th(t,F);if(E.i){var S=E.i.url||"";f.h.push(4);f.i[4]=If("top",S)}var rb= {url:E.h.url||""};if(E.h.url){var Kc=E.h.url.match(Ec),Ug=Kc[1],Vg=Kc[3],Wg=Kc[4];t="";Ug&&(t+=Ug+":");Vg&&(t+="//",t+=Vg,Wg&&(t+=":"+Wg));var Xg=t}else Xg="";rb=[rb,{url:Xg}];f.h.push(5);f.i[5]=rb;Qf(this.m,e,f,this.j,c)}catch(Jc){try{Qf(this.m,e,{context:"ecmserr",rctx:a,msg:gi(Jc),url:E&&E.h.url},this.j,c)}catch(zp){}}return!0};n.Pa=function(a,b){var c=this;b.catch(function(d){d=d?d:"unknown rejection";c.I(a,d instanceof Error?d:Error(d))})}; function gi(a){var b=a.toString();a.name&&-1==b.indexOf(a.name)&&(b+=": "+a.name);a.message&&-1==b.indexOf(a.message)&&(b+=": "+a.message);if(a.stack){a=a.stack;try{-1==a.indexOf(b)&&(a=b+"\n"+a);for(var c;a!=c;)c=a,a=a.replace(/((https?:\/..*\/)[^\/:]*:\d+(?:.|\n)*)\2/,"$1");b=a.replace(/\n */g,"\n")}catch(d){}}return b};var hi=ja(["https://www.googletagservices.com/console/host/host.js"]),ii=ja(["https://www.googletagservices.com/console/panel/index.html"]),ji=ja(["https://www.googletagservices.com/console/overlay/index.html"]);nd(hi);nd(ii);nd(ji);function ki(a,b){do{var c=Nc(a,b);if(c&&"fixed"==c.position)return!1}while(a=a.parentElement);return!0};function li(a,b){for(var c=["width","height"],d=0;d<c.length;d++){var e="google_ad_"+c[d];if(!b.hasOwnProperty(e)){var f=K(a[c[d]]);f=null===f?null:Math.round(f);null!=f&&(b[e]=f)}}}function mi(a,b){return!((Yc.test(b.google_ad_width)||Xc.test(a.style.width))&&(Yc.test(b.google_ad_height)||Xc.test(a.style.height)))}function ni(a,b){return(a=oi(a,b))?a.y:0} function oi(a,b){try{var c=b.document.documentElement.getBoundingClientRect(),d=a.getBoundingClientRect();return{x:d.left-c.left,y:d.top-c.top}}catch(e){return null}}function pi(a){var b=0,c;for(c in Df)-1!=a.indexOf(c)&&(b|=Df[c]);return b} function qi(a,b,c,d,e){if(a!==a.top)return Ic(a)?3:16;if(!(488>Wf(a)))return 4;if(!(a.innerHeight>=a.innerWidth))return 5;var f=Wf(a);if(!f||(f-c)/f>d)a=6;else{if(c="true"!=e.google_full_width_responsive)a:{c=Wf(a);for(b=b.parentElement;b;b=b.parentElement)if((d=Nc(b,a))&&(e=K(d.width))&&!(e>=c)&&"visible"!=d.overflow){c=!0;break a}c=!1}a=c?7:!0}return a} function ri(a,b,c,d){var e=qi(b,c,a,.3,d);!0!==e?a=e:"true"==d.google_full_width_responsive||ki(c,b)?(b=Wf(b),a=b-a,a=b&&0<=a?!0:b?-10>a?11:0>a?14:12:10):a=9;return a}function si(a,b,c){a=a.style;"rtl"==b?a.marginRight=c:a.marginLeft=c} function ti(a,b){if(3==b.nodeType)return/\S/.test(b.data);if(1==b.nodeType){if(/^(script|style)$/i.test(b.nodeName))return!1;try{var c=Nc(b,a)}catch(d){}return!c||"none"!=c.display&&!("absolute"==c.position&&("hidden"==c.visibility||"collapse"==c.visibility))}return!1}function ui(a,b,c){a=oi(b,a);return"rtl"==c?-a.x:a.x} function vi(a,b){var c;c=(c=b.parentElement)?(c=Nc(c,a))?c.direction:"":"";if(c){b.style.border=b.style.borderStyle=b.style.outline=b.style.outlineStyle=b.style.transition="none";b.style.borderSpacing=b.style.padding="0";si(b,c,"0px");b.style.width=Wf(a)+"px";if(0!==ui(a,b,c)){si(b,c,"0px");var d=ui(a,b,c);si(b,c,-1*d+"px");a=ui(a,b,c);0!==a&&a!==d&&si(b,c,d/(a-d)*d+"px")}b.style.zIndex=30}};function wi(a,b){this.l=a;this.j=b}wi.prototype.minWidth=function(){return this.l};wi.prototype.height=function(){return this.j};wi.prototype.h=function(a){return 300<a&&300<this.j?this.l:Math.min(1200,Math.round(a))};wi.prototype.i=function(){};function xi(a,b,c,d){d=void 0===d?function(f){return f}:d;var e;return a.style&&a.style[c]&&d(a.style[c])||(e=Nc(a,b))&&e[c]&&d(e[c])||null}function yi(a){return function(b){return b.minWidth()<=a}}function zi(a,b,c,d){var e=a&&Ai(c,b),f=Bi(b,d);return function(g){return!(e&&g.height()>=f)}}function Ci(a){return function(b){return b.height()<=a}}function Ai(a,b){return ni(a,b)<Vf(b).clientHeight-100} function Di(a,b){var c=xi(b,a,"height",K);if(c)return c;var d=b.style.height;b.style.height="inherit";c=xi(b,a,"height",K);b.style.height=d;if(c)return c;c=Infinity;do(d=b.style&&K(b.style.height))&&(c=Math.min(c,d)),(d=xi(b,a,"maxHeight",K))&&(c=Math.min(c,d));while((b=b.parentElement)&&"HTML"!=b.tagName);return c}function Bi(a,b){var c=0==pd(a);return b&&c?Math.max(250,2*Vf(a).clientHeight/3):250};var R={},Ei=(R.google_ad_channel=!0,R.google_ad_client=!0,R.google_ad_host=!0,R.google_ad_host_channel=!0,R.google_adtest=!0,R.google_tag_for_child_directed_treatment=!0,R.google_tag_for_under_age_of_consent=!0,R.google_tag_partner=!0,R.google_restrict_data_processing=!0,R.google_page_url=!0,R.google_debug_params=!0,R.google_adbreak_test=!0,R.google_ad_frequency_hint=!0,R.google_admob_interstitial_slot=!0,R.google_admob_rewarded_slot=!0,R.google_max_ad_content_rating=!0,R.google_traffic_source=!0, R),Fi=RegExp("(^| )adsbygoogle($| )");function Gi(a,b){for(var c=0;c<b.length;c++){var d=b[c],e=zc(d.Rb);a[e]=d.value}};function Hi(a,b,c,d){this.l=a;this.i=b;this.j=c;this.h=d}function Ii(a,b){var c=[];try{c=b.querySelectorAll(a.l)}catch(g){}if(!c.length)return[];b=Ya(c);b=Ji(a,b);"number"===typeof a.i&&(c=a.i,0>c&&(c+=b.length),b=0<=c&&c<b.length?[b[c]]:[]);if("number"===typeof a.j){c=[];for(var d=0;d<b.length;d++){var e=Ki(b[d]),f=a.j;0>f&&(f+=e.length);0<=f&&f<e.length&&c.push(e[f])}b=c}return b} Hi.prototype.toString=function(){return JSON.stringify({nativeQuery:this.l,occurrenceIndex:this.i,paragraphIndex:this.j,ignoreMode:this.h})};function Ji(a,b){if(null==a.h)return b;switch(a.h){case 1:return b.slice(1);case 2:return b.slice(0,b.length-1);case 3:return b.slice(1,b.length-1);case 0:return b;default:throw Error("Unknown ignore mode: "+a.h);}}function Ki(a){var b=[];xd(a.getElementsByTagName("p"),function(c){100<=Li(c)&&b.push(c)});return b} function Li(a){if(3==a.nodeType)return a.length;if(1!=a.nodeType||"SCRIPT"==a.tagName)return 0;var b=0;xd(a.childNodes,function(c){b+=Li(c)});return b}function Mi(a){return 0==a.length||isNaN(a[0])?a:"\\"+(30+parseInt(a[0],10))+" "+a.substring(1)};function Ni(a){if(!a)return null;var b=A(a,7);if(A(a,1)||a.getId()||0<wb(a,4).length){var c=a.getId();b=wb(a,4);var d=A(a,1),e="";d&&(e+=d);c&&(e+="#"+Mi(c));if(b)for(c=0;c<b.length;c++)e+="."+Mi(b[c]);a=(b=e)?new Hi(b,A(a,2),A(a,5),Oi(A(a,6))):null}else a=b?new Hi(b,A(a,2),A(a,5),Oi(A(a,6))):null;return a}var Pi={1:1,2:2,3:3,0:0};function Oi(a){return null==a?a:Pi[a]}var Qi={1:0,2:1,3:2,4:3};function Ri(a){return a.google_ama_state=a.google_ama_state||{}} function Si(a){a=Ri(a);return a.optimization=a.optimization||{}};function Ti(a){switch(A(a,8)){case 1:case 2:if(null==a)var b=null;else b=G(a,Jd,1),null==b?b=null:(a=A(a,2),b=null==a?null:new Ld({Ga:[b],Ra:a}));return null!=b?Dd(b):Fd(Error("Missing dimension when creating placement id"));case 3:return Fd(Error("Missing dimension when creating placement id"));default:return Fd(Error("Invalid type: "+A(a,8)))}};function T(a){a=void 0===a?"":a;var b=Error.call(this);this.message=b.message;"stack"in b&&(this.stack=b.stack);this.name="TagError";this.message=a?"adsbygoogle.push() error: "+a:"";Error.captureStackTrace?Error.captureStackTrace(this,T):this.stack=Error().stack||""}v(T,Error);var Pf,Ui,fi=new ci;function Vi(a){null!=a&&(w.google_measure_js_timing=a);w.google_measure_js_timing||(a=fi,a.h=!1,a.i!=a.j.google_js_reporting_queue&&(bi()&&Ra(a.i,di),a.i.length=0))}(function(a){Pf=a||new Nf;"number"!==typeof w.google_srt&&(w.google_srt=Math.random());Of();Ui=new ei;Ui.Va(!0);"complete"==w.document.readyState?Vi():fi.h&&xc(w,"load",function(){Vi()})})();function Wi(a,b,c){return Ui.oa(a,b,c)}function Xi(a,b){return Ui.Oa(a,b)} function Yi(a,b,c){var d=O(Oh).h();!b.eid&&d.length&&(b.eid=d.toString());Qf(Pf,a,b,!0,c)}function Zi(a,b){Ui.Pa(a,b)}function $i(a,b,c,d){var e;Rh(b)?e=b.msg||gi(b.error):e=gi(b);return 0==e.indexOf("TagError")?(c=b instanceof Qh?b.error:b,c.pbr||(c.pbr=!0,Ui.I(a,b,.1,d,"puberror")),!1):Ui.I(a,b,c,d)};function aj(a){a=void 0===a?window:a;a=a.googletag;return(null==a?0:a.apiReady)?a:void 0};function bj(a){var b=aj(a);return b?Sa(Ta(b.pubads().getSlots(),function(c){return a.document.getElementById(c.getSlotElementId())}),function(c){return null!=c}):null}function cj(a,b){return Ya(a.document.querySelectorAll(b))}function dj(a){var b=[];a=u(a);for(var c=a.next();!c.done;c=a.next()){c=c.value;for(var d=!0,e=0;e<b.length;e++){var f=b[e];if(f.contains(c)){d=!1;break}if(c.contains(f)){d=!1;b[e]=c;break}}d&&b.push(c)}return b};function ej(a,b){function c(){d.push({anchor:e.anchor,position:e.position});return e.anchor==b.anchor&&e.position==b.position}for(var d=[],e=a;e;){switch(e.position){case 1:if(c())return d;e.position=2;case 2:if(c())return d;if(e.anchor.firstChild){e={anchor:e.anchor.firstChild,position:1};continue}else e.position=3;case 3:if(c())return d;e.position=4;case 4:if(c())return d}for(;e&&!e.anchor.nextSibling&&e.anchor.parentNode!=e.anchor.ownerDocument.body;){e={anchor:e.anchor.parentNode,position:3}; if(c())return d;e.position=4;if(c())return d}e&&e.anchor.nextSibling?e={anchor:e.anchor.nextSibling,position:1}:e=null}return d};function fj(a,b){this.i=a;this.h=b} function gj(a,b){var c=new Id,d=new Hd;b.forEach(function(e){if(Ib(e,Yd,1,ae)){e=Ib(e,Yd,1,ae);if(G(e,Wd,1)&&G(G(e,Wd,1),Jd,1)&&G(e,Wd,2)&&G(G(e,Wd,2),Jd,1)){var f=hj(a,G(G(e,Wd,1),Jd,1)),g=hj(a,G(G(e,Wd,2),Jd,1));if(f&&g)for(f=u(ej({anchor:f,position:A(G(e,Wd,1),2)},{anchor:g,position:A(G(e,Wd,2),2)})),g=f.next();!g.done;g=f.next())g=g.value,c.set(za(g.anchor),g.position)}G(e,Wd,3)&&G(G(e,Wd,3),Jd,1)&&(f=hj(a,G(G(e,Wd,3),Jd,1)))&&c.set(za(f),A(G(e,Wd,3),2))}else Ib(e,Zd,2,ae)?ij(a,Ib(e,Zd,2,ae), c):Ib(e,$d,3,ae)&&jj(a,Ib(e,$d,3,ae),d)});return new fj(c,d)}function ij(a,b,c){G(b,Jd,1)&&(a=kj(a,G(b,Jd,1)))&&a.forEach(function(d){d=za(d);c.set(d,1);c.set(d,4);c.set(d,2);c.set(d,3)})}function jj(a,b,c){G(b,Jd,1)&&(a=kj(a,G(b,Jd,1)))&&a.forEach(function(d){c.add(za(d))})}function hj(a,b){return(a=kj(a,b))&&0<a.length?a[0]:null}function kj(a,b){return(b=Ni(b))?Ii(b,a):null};function lj(){this.h=new p.Set}function mj(a){a=nj(a);return a.has("all")||a.has("after")}function oj(a){a=nj(a);return a.has("all")||a.has("before")}function pj(a,b,c){switch(c){case 2:case 3:break;case 1:case 4:b=b.parentElement;break;default:throw Error("Unknown RelativePosition: "+c);}for(c=[];b;){if(qj(b))return!0;if(a.h.has(b))break;c.push(b);b=b.parentElement}c.forEach(function(d){return a.h.add(d)});return!1} function qj(a){var b=nj(a);return a&&("AUTO-ADS-EXCLUSION-AREA"===a.tagName||b.has("inside")||b.has("all"))}function nj(a){return(a=a&&a.getAttribute("data-no-auto-ads"))?new p.Set(a.split("|")):new p.Set};function rj(a,b){if(!a)return!1;a=Nc(a,b);if(!a)return!1;a=a.cssFloat||a.styleFloat;return"left"==a||"right"==a}function sj(a){for(a=a.previousSibling;a&&1!=a.nodeType;)a=a.previousSibling;return a?a:null}function tj(a){return!!a.nextSibling||!!a.parentNode&&tj(a.parentNode)};function uj(a){var b={};a&&wb(a,6).forEach(function(c){b[c]=!0});return b}function vj(a,b,c,d,e){this.h=a;this.H=b;this.j=c;this.m=e||null;this.A=(this.C=d)?gj(a.document,H(d,Xd,5)):gj(a.document,[]);this.G=new lj;this.i=0;this.l=!1} function wj(a,b){if(a.l)return!0;a.l=!0;var c=H(a.j,ce,1);a.i=0;var d=uj(a.C);var e=a.h;try{var f=e.localStorage.getItem("google_ama_settings");var g=f?Nb(se,f):null}catch(S){g=null}var h=null!==g&&D(g,2,!1);g=Ri(e);h&&(g.eatf=!0,kd(7,[!0,0,!1]));var k=P(Ve)||P(Ue);f=P(Ue);if(k){b:{var l={fb:!1},m=cj(e,".google-auto-placed"),q=cj(e,'ins.adsbygoogle[data-anchor-shown="true"]'),t=cj(e,"ins.adsbygoogle[data-ad-format=autorelaxed]");var y=(bj(e)||cj(e,"div[id^=div-gpt-ad]")).concat(cj(e,"iframe[id^=google_ads_iframe]")); var F=cj(e,"div.trc_related_container,div.OUTBRAIN,div[id^=rcjsload],div[id^=ligatusframe],div[id^=crt-],iframe[id^=cto_iframe],div[id^=yandex_], div[id^=Ya_sync],iframe[src*=adnxs],div.advertisement--appnexus,div[id^=apn-ad],div[id^=amzn-native-ad],iframe[src*=amazon-adsystem],iframe[id^=ox_],iframe[src*=openx],img[src*=openx],div[class*=adtech],div[id^=adtech],iframe[src*=adtech],div[data-content-ad-placement=true],div.wpcnt div[id^=atatags-]"),z=cj(e,"ins.adsbygoogle-ablated-ad-slot"),E=cj(e,"div.googlepublisherpluginad"); k=[].concat(cj(e,"iframe[id^=aswift_],iframe[id^=google_ads_frame]"),cj(e,"ins.adsbygoogle"));h=[];l=u([[l.Mb,m],[l.fb,q],[l.Pb,t],[l.Nb,y],[l.Qb,F],[l.Lb,z],[l.Ob,E]]);for(m=l.next();!m.done;m=l.next())q=u(m.value),m=q.next().value,q=q.next().value,!1===m?h=h.concat(q):k=k.concat(q);k=dj(k);l=dj(h);h=k.slice(0);k=u(l);for(l=k.next();!l.done;l=k.next())for(l=l.value,m=0;m<h.length;m++)(l.contains(h[m])||h[m].contains(l))&&h.splice(m,1);e=Vf(e).clientHeight;for(k=0;k<h.length;k++)if(l=h[k].getBoundingClientRect(), !(0===l.height&&!f||l.top>e)){e=!0;break b}e=!1}g=e?g.eatfAbg=!0:!1}else g=h;if(g)return!0;g=new Hd([2]);for(e=0;e<c.length;e++){f=a;k=c[e];h=e;l=b;if(!G(k,Pd,4)||!g.contains(A(G(k,Pd,4),1))||1!==A(k,8)||k&&null!=A(k,4)&&d[A(G(k,Pd,4),2)])f=null;else{f.i++;if(k=xj(f,k,l,d))l=Ri(f.h),l.numAutoAdsPlaced||(l.numAutoAdsPlaced=0),null==l.placed&&(l.placed=[]),l.numAutoAdsPlaced++,l.placed.push({index:h,element:k.ha}),kd(7,[!1,f.i,!0]);f=k}if(f)return!0}kd(7,[!1,a.i,!1]);return!1} function xj(a,b,c,d){if(b&&null!=A(b,4)&&d[A(G(b,Pd,4),2)]||1!=A(b,8))return null;d=G(b,Jd,1);if(!d)return null;d=Ni(d);if(!d)return null;d=Ii(d,a.h.document);if(0==d.length)return null;d=d[0];var e=Qi[A(b,2)];e=void 0===e?null:e;var f;if(!(f=null==e)){a:{f=a.h;switch(e){case 0:f=rj(sj(d),f);break a;case 3:f=rj(d,f);break a;case 2:var g=d.lastChild;f=rj(g?1==g.nodeType?g:sj(g):null,f);break a}f=!1}if(c=!f&&!(!c&&2==e&&!tj(d)))c=1==e||2==e?d:d.parentNode,c=!(c&&!te(c)&&0>=c.offsetWidth);f=!c}if(!(c= f)){c=a.A;f=A(b,2);g=za(d);g=c.i.h.get(g);if(!(g=g?g.contains(f):!1))a:{if(c.h.contains(za(d)))switch(f){case 2:case 3:g=!0;break a;default:g=!1;break a}for(f=d.parentElement;f;){if(c.h.contains(za(f))){g=!0;break a}f=f.parentElement}g=!1}c=g}if(!c){c=a.G;f=A(b,2);a:switch(f){case 1:g=mj(d.previousElementSibling)||oj(d);break a;case 4:g=mj(d)||oj(d.nextElementSibling);break a;case 2:g=oj(d.firstElementChild);break a;case 3:g=mj(d.lastElementChild);break a;default:throw Error("Unknown RelativePosition: "+ f);}c=g||pj(c,d,f)}if(c)return null;c=G(b,be,3);f={};c&&(f.Wa=A(c,1),f.Ha=A(c,2),f.cb=!!xb(c,3));c=G(b,Pd,4)&&A(G(b,Pd,4),2)?A(G(b,Pd,4),2):null;c=Sd(c);g=null!=A(b,12)?A(b,12):null;g=null==g?null:new Qd(null,{google_ml_rank:g});b=yj(a,b);b=Rd(a.m,c,g,b);c=a.h;a=a.H;var h=c.document,k=f.cb||!1;g=(new Bc(h)).createElement("DIV");var l=g.style;l.width="100%";l.height="auto";l.clear=k?"both":"none";k=g.style;k.textAlign="center";f.lb&&Gi(k,f.lb);h=(new Bc(h)).createElement("INS");k=h.style;k.display= "block";k.margin="auto";k.backgroundColor="transparent";f.Wa&&(k.marginTop=f.Wa);f.Ha&&(k.marginBottom=f.Ha);f.ab&&Gi(k,f.ab);g.appendChild(h);f={ra:g,ha:h};f.ha.setAttribute("data-ad-format","auto");g=[];if(h=b&&b.Ja)f.ra.className=h.join(" ");h=f.ha;h.className="adsbygoogle";h.setAttribute("data-ad-client",a);g.length&&h.setAttribute("data-ad-channel",g.join("+"));a:{try{var m=f.ra;var q=void 0===q?0:q;if(P(Qe)){q=void 0===q?0:q;var t=Af(d,e,q);if(t.init){var y=t.init;for(d=y;d=t.ja(d);)y=d;var F= {anchor:y,position:t.na}}else F={anchor:d,position:e};m["google-ama-order-assurance"]=q;ue(m,F.anchor,F.position)}else ue(m,d,e);b:{var z=f.ha;z.dataset.adsbygoogleStatus="reserved";z.className+=" adsbygoogle-noablate";m={element:z};var E=b&&b.Qa;if(z.hasAttribute("data-pub-vars")){try{E=JSON.parse(z.getAttribute("data-pub-vars"))}catch(S){break b}z.removeAttribute("data-pub-vars")}E&&(m.params=E);(c.adsbygoogle=c.adsbygoogle||[]).push(m)}}catch(S){(z=f.ra)&&z.parentNode&&(E=z.parentNode,E.removeChild(z), te(E)&&(E.style.display=E.getAttribute("data-init-display")||"none"));z=!1;break a}z=!0}return z?f:null}function yj(a,b){return Bd(Ed(Ti(b).map(Td),function(c){Ri(a.h).exception=c}))};function zj(a){if(P(Pe))var b=null;else try{b=a.getItem("google_ama_config")}catch(d){b=null}try{var c=b?Nb(je,b):null}catch(d){c=null}return c};function Aj(a){J.call(this,a)}v(Aj,J);function Bj(a){try{var b=a.localStorage.getItem("google_auto_fc_cmp_setting")||null}catch(d){b=null}var c=b;return c?Gd(function(){return Nb(Aj,c)}):Dd(null)};function Cj(){this.S={}}function Dj(){if(Ej)return Ej;var a=md()||window,b=a.google_persistent_state_async;return null!=b&&"object"==typeof b&&null!=b.S&&"object"==typeof b.S?Ej=b:a.google_persistent_state_async=Ej=new Cj}function Fj(a){return Gj[a]||"google_ps_"+a}function Hj(a,b,c){b=Fj(b);a=a.S;var d=a[b];return void 0===d?a[b]=c:d}var Ej=null,Ij={},Gj=(Ij[8]="google_prev_ad_formats_by_region",Ij[9]="google_prev_ad_slotnames_by_region",Ij);function Jj(a){this.h=a||{cookie:""}} Jj.prototype.set=function(a,b,c){var d=!1;if("object"===typeof c){var e=c.Sb;d=c.Tb||!1;var f=c.domain||void 0;var g=c.path||void 0;var h=c.jb}if(/[;=\s]/.test(a))throw Error('Invalid cookie name "'+a+'"');if(/[;\r\n]/.test(b))throw Error('Invalid cookie value "'+b+'"');void 0===h&&(h=-1);this.h.cookie=a+"="+b+(f?";domain="+f:"")+(g?";path="+g:"")+(0>h?"":0==h?";expires="+(new Date(1970,1,1)).toUTCString():";expires="+(new Date(Date.now()+1E3*h)).toUTCString())+(d?";secure":"")+(null!=e?";samesite="+ e:"")};Jj.prototype.get=function(a,b){for(var c=a+"=",d=(this.h.cookie||"").split(";"),e=0,f;e<d.length;e++){f=Ja(d[e]);if(0==f.lastIndexOf(c,0))return f.substr(c.length);if(f==a)return""}return b};Jj.prototype.isEmpty=function(){return!this.h.cookie}; Jj.prototype.clear=function(){for(var a=(this.h.cookie||"").split(";"),b=[],c=[],d,e,f=0;f<a.length;f++)e=Ja(a[f]),d=e.indexOf("="),-1==d?(b.push(""),c.push(e)):(b.push(e.substring(0,d)),c.push(e.substring(d+1)));for(a=b.length-1;0<=a;a--)c=b[a],this.get(c),this.set(c,"",{jb:0,path:void 0,domain:void 0})};function Kj(a){J.call(this,a)}v(Kj,J);function Lj(a){var b=new Kj;return B(b,5,a)};function Mj(){this.A=this.A;this.G=this.G}Mj.prototype.A=!1;Mj.prototype.j=function(){if(this.G)for(;this.G.length;)this.G.shift()()};function Nj(a){void 0!==a.addtlConsent&&"string"!==typeof a.addtlConsent&&(a.addtlConsent=void 0);void 0!==a.gdprApplies&&"boolean"!==typeof a.gdprApplies&&(a.gdprApplies=void 0);return void 0!==a.tcString&&"string"!==typeof a.tcString||void 0!==a.listenerId&&"number"!==typeof a.listenerId?2:a.cmpStatus&&"error"!==a.cmpStatus?0:3}function Oj(a,b){b=void 0===b?500:b;Mj.call(this);this.h=a;this.i=null;this.m={};this.H=0;this.C=b;this.l=null}v(Oj,Mj); Oj.prototype.j=function(){this.m={};this.l&&(yc(this.h,this.l),delete this.l);delete this.m;delete this.h;delete this.i;Mj.prototype.j.call(this)};function Pj(a){return"function"===typeof a.h.__tcfapi||null!=Qj(a)} Oj.prototype.addEventListener=function(a){function b(f,g){clearTimeout(e);f?(c=f,c.internalErrorState=Nj(c),g&&0===c.internalErrorState||(c.tcString="tcunavailable",g||(c.internalErrorState=3))):(c.tcString="tcunavailable",c.internalErrorState=3);a(c)}var c={},d=wc(function(){return a(c)}),e=0;-1!==this.C&&(e=setTimeout(function(){c.tcString="tcunavailable";c.internalErrorState=1;d()},this.C));try{Rj(this,"addEventListener",b)}catch(f){c.tcString="tcunavailable",c.internalErrorState=3,e&&(clearTimeout(e), e=0),d()}};Oj.prototype.removeEventListener=function(a){a&&a.listenerId&&Rj(this,"removeEventListener",null,a.listenerId)};function Rj(a,b,c,d){c||(c=function(){});if("function"===typeof a.h.__tcfapi)a=a.h.__tcfapi,a(b,2,c,d);else if(Qj(a)){Sj(a);var e=++a.H;a.m[e]=c;a.i&&(c={},a.i.postMessage((c.__tcfapiCall={command:b,version:2,callId:e,parameter:d},c),"*"))}else c({},!1)}function Qj(a){if(a.i)return a.i;a.i=$c(a.h,"__tcfapiLocator");return a.i} function Sj(a){a.l||(a.l=function(b){try{var c=("string"===typeof b.data?JSON.parse(b.data):b.data).__tcfapiReturn;a.m[c.callId](c.returnValue,c.success)}catch(d){}},xc(a.h,"message",a.l))};function Tj(a){var b=a.u,c=a.ta,d=a.Ia;a=Uj({u:b,Z:a.Z,ka:void 0===a.ka?!1:a.ka,la:void 0===a.la?!1:a.la});null!=a.h||"tcunav"!=a.i.message?d(a):Vj(b,c).then(function(e){return e.map(Wj)}).then(function(e){return e.map(function(f){return Xj(b,f)})}).then(d)} function Uj(a){var b=a.u,c=a.Z,d=void 0===a.ka?!1:a.ka;if(!(a=!(void 0===a.la?0:a.la)&&Pj(new Oj(b)))){if(d=!d){if(c){c=Bj(b);if(null==c.h)Ui.I(806,c.i,void 0,void 0),c=!1;else if((c=c.h.value)&&null!=A(c,1))b:switch(c=A(c,1),c){case 1:c=!0;break b;default:throw Error("Unhandled AutoGdprFeatureStatus: "+c);}else c=!1;c=!c}d=c}a=d}if(!a)return Xj(b,Lj(!0));c=Dj();return(c=Hj(c,24))?Xj(b,Wj(c)):Fd(Error("tcunav"))}function Vj(a,b){return p.Promise.race([Yj(),Zj(a,b)])} function Yj(){return(new p.Promise(function(a){var b=Dj();a={resolve:a};var c=Hj(b,25,[]);c.push(a);b.S[Fj(25)]=c})).then(ak)}function Zj(a,b){return new p.Promise(function(c){a.setTimeout(c,b,Fd(Error("tcto")))})}function ak(a){return a?Dd(a):Fd(Error("tcnull"))} function Wj(a){var b=void 0===b?!1:b;if(!1===a.gdprApplies)var c=!0;else void 0===a.internalErrorState&&(a.internalErrorState=Nj(a)),c="error"===a.cmpStatus||0!==a.internalErrorState||"loaded"===a.cmpStatus&&("tcloaded"===a.eventStatus||"useractioncomplete"===a.eventStatus)?!0:!1;if(c)if(!1===a.gdprApplies||"tcunavailable"===a.tcString||void 0===a.gdprApplies&&!b||"string"!==typeof a.tcString||!a.tcString.length)a=!0;else{var d=void 0===d?"755":d;b:{if(a.publisher&&a.publisher.restrictions&&(b=a.publisher.restrictions["1"], void 0!==b)){b=b[void 0===d?"755":d];break b}b=void 0}0===b?a=!1:a.purpose&&a.vendor?(b=a.vendor.consents,(d=!(!b||!b[void 0===d?"755":d]))&&a.purposeOneTreatment&&"CH"===a.publisherCC?a=!0:(d&&(a=a.purpose.consents,d=!(!a||!a["1"])),a=d)):a=!0}else a=!1;return Lj(a)}function Xj(a,b){a:{a=void 0===a?window:a;if(xb(b,5))try{var c=a.localStorage;break a}catch(d){}c=null}return(b=c)?Dd(b):Fd(Error("unav"))};function bk(a){J.call(this,a)}v(bk,J);function ck(a){J.call(this,a,-1,dk)}v(ck,J);var dk=[1,2];function ek(a){this.exception=a}function fk(a,b,c){this.j=a;this.h=b;this.i=c}fk.prototype.start=function(){this.l()};fk.prototype.l=function(){try{switch(this.j.document.readyState){case "complete":case "interactive":wj(this.h,!0);gk(this);break;default:wj(this.h,!1)?gk(this):this.j.setTimeout(Ea(this.l,this),100)}}catch(a){gk(this,a)}};function gk(a,b){try{var c=a.i,d=c.resolve,e=a.h;Ri(e.h);H(e.j,ce,1);d.call(c,new ek(b))}catch(f){a.i.reject(f)}};function hk(a){J.call(this,a,-1,ik)}v(hk,J);function jk(a){J.call(this,a)}v(jk,J);function kk(a){J.call(this,a)}v(kk,J);var ik=[7];function lk(a){a=(a=(new Jj(a)).get("FCCDCF",""))?a:null;try{return a?Nb(hk,a):null}catch(b){return null}};Zb({Gb:0,Fb:1,Cb:2,xb:3,Db:4,yb:5,Eb:6,Ab:7,Bb:8,wb:9,zb:10}).map(function(a){return Number(a)});Zb({Ib:0,Jb:1,Hb:2}).map(function(a){return Number(a)});function mk(a){function b(){if(!a.frames.__uspapiLocator)if(c.body){var d=Mc("IFRAME",c);d.style.display="none";d.style.width="0px";d.style.height="0px";d.style.border="none";d.style.zIndex="-1000";d.style.left="-1000px";d.style.top="-1000px";d.name="__uspapiLocator";c.body.appendChild(d)}else a.setTimeout(b,5)}var c=a.document;b()};function nk(a){this.h=a;this.i=a.document;this.j=(a=(a=lk(this.i))?G(a,kk,5)||null:null)?A(a,2):null;(a=lk(this.i))&&G(a,jk,4);(a=lk(this.i))&&G(a,jk,4)}function ok(){var a=window;a.__uspapi||a.frames.__uspapiLocator||(a=new nk(a),pk(a))}function pk(a){!a.j||a.h.__uspapi||a.h.frames.__uspapiLocator||(a.h.__uspapiManager="fc",mk(a.h),Ga(function(){return a.l.apply(a,ka(ta.apply(0,arguments)))}))} nk.prototype.l=function(a,b,c){"function"===typeof c&&"getUSPData"===a&&c({version:1,uspString:this.j},!0)};function qk(a){J.call(this,a)}v(qk,J);qk.prototype.getWidth=function(){return C(this,1,0)};qk.prototype.getHeight=function(){return C(this,2,0)};function rk(a){J.call(this,a)}v(rk,J);function sk(a){J.call(this,a)}v(sk,J);var tk=[4,5];function uk(a){var b=/[a-zA-Z0-9._~-]/,c=/%[89a-zA-Z]./;return a.replace(/(%[a-zA-Z0-9]{2})/g,function(d){if(!d.match(c)){var e=decodeURIComponent(d);if(e.match(b))return e}return d.toUpperCase()})}function vk(a){for(var b="",c=/[/%?&=]/,d=0;d<a.length;++d){var e=a[d];b=e.match(c)?b+e:b+encodeURIComponent(e)}return b};function wk(a,b){a=vk(uk(a.location.pathname)).replace(/(^\/)|(\/$)/g,"");var c=Tc(a),d=xk(a);return r(b,"find").call(b,function(e){var f=null!=A(e,7)?A(G(e,oe,7),1):A(e,1);e=null!=A(e,7)?A(G(e,oe,7),2):2;if("number"!==typeof f)return!1;switch(e){case 1:return f==c;case 2:return d[f]||!1}return!1})||null}function xk(a){for(var b={};;){b[Tc(a)]=!0;if(!a)return b;a=a.substring(0,a.lastIndexOf("/"))}};var yk={},zk=(yk.google_ad_channel=!0,yk.google_ad_host=!0,yk);function Ak(a,b){a.location.href&&a.location.href.substring&&(b.url=a.location.href.substring(0,200));Yi("ama",b,.01)}function Bk(a){var b={};Sc(zk,function(c,d){d in a&&(b[d]=a[d])});return b};function Ck(a){a=G(a,le,3);return!a||A(a,1)<=Date.now()?!1:!0}function Dk(a){return(a=zj(a))?Ck(a)?a:null:null}function Ek(a,b){try{b.removeItem("google_ama_config")}catch(c){Ak(a,{lserr:1})}};function Fk(a){J.call(this,a)}v(Fk,J);function Gk(a){J.call(this,a,-1,Hk)}v(Gk,J);var Hk=[1];function Ik(a){J.call(this,a,-1,Jk)}v(Ik,J);Ik.prototype.getId=function(){return C(this,1,0)};Ik.prototype.V=function(){return C(this,7,0)};var Jk=[2];function Kk(a){J.call(this,a,-1,Lk)}v(Kk,J);Kk.prototype.V=function(){return C(this,5,0)};var Lk=[2];function Mk(a){J.call(this,a,-1,Nk)}v(Mk,J);function Ok(a){J.call(this,a,-1,Pk)}v(Ok,J);Ok.prototype.V=function(){return C(this,1,0)};function Qk(a){J.call(this,a)}v(Qk,J);var Nk=[1,4,2,3],Pk=[2];function Rk(a){J.call(this,a,-1,Sk)}v(Rk,J);function Tk(a){return Ib(a,Gk,14,Uk)}var Sk=[19],Uk=[13,14];var Vk=void 0;function Wk(){Yf(Vk,Xf);return Vk}function Xk(a){Yf(Vk,$f);Vk=a};function Yk(a,b,c,d){c=void 0===c?"":c;return 1===b&&Zk(c,void 0===d?null:d)?!0:$k(a,c,function(e){return Ua(H(e,Tb,2),function(f){return A(f,1)===b})})}function Zk(a,b){return b?13===Cb(b,Uk)?D(Ib(b,Fk,13,Uk),1):14===Cb(b,Uk)&&""!==a&&1===wb(Tk(b),1).length&&wb(Tk(b),1)[0]===a?D(G(Tk(b),Fk,2),1):!1:!1}function al(a,b){b=C(b,18,0);-1!==b&&(a.tmod=b)}function bl(a){var b=void 0===b?"":b;var c=Ic(L)||L;return cl(c,a)?!0:$k(L,b,function(d){return Ua(wb(d,3),function(e){return e===a})})} function dl(a){return $k(w,void 0===a?"":a,function(){return!0})}function cl(a,b){a=(a=(a=a.location&&a.location.hash)&&a.match(/forced_clientside_labs=([\d,]+)/))&&a[1];return!!a&&Xa(a.split(","),b.toString())}function $k(a,b,c){a=Ic(a)||a;var d=el(a);b&&(b=rd(String(b)));return Yb(d,function(e,f){return Object.prototype.hasOwnProperty.call(d,f)&&(!b||b===f)&&c(e)})}function el(a){a=fl(a);var b={};Sc(a,function(c,d){try{var e=new Rb(c);b[d]=e}catch(f){}});return b} function fl(a){return P(xe)?(a=Uj({u:a,Z:Wk()}),null!=a.h?(gl("ok"),a=hl(a.h.value)):(gl(a.i.message),a={}),a):hl(a.localStorage)}function hl(a){try{var b=a.getItem("google_adsense_settings");if(!b)return{};var c=JSON.parse(b);return c!==Object(c)?{}:Xb(c,function(d,e){return Object.prototype.hasOwnProperty.call(c,e)&&"string"===typeof e&&Array.isArray(d)})}catch(d){return{}}}function gl(a){P(we)&&Yi("abg_adsensesettings_lserr",{s:a,g:P(xe),c:Wk(),r:.01},.01)};function il(a,b,c,d){jl(new kl(a,b,c,d))}function kl(a,b,c,d){this.u=a;this.i=b;this.j=c;this.h=d}function jl(a){Ed(Cd(Uj({u:a.u,Z:D(a.i,6)}),function(b){ll(a,b,!0)}),function(){ml(a)})}function ll(a,b,c){Ed(Cd(nl(b),function(d){ol("ok");a.h(d)}),function(){Ek(a.u,b);c?ml(a):a.h(null)})}function ml(a){Ed(Cd(pl(a),a.h),function(){ql(a)})}function ql(a){Tj({u:a.u,Z:D(a.i,6),ta:50,Ia:function(b){rl(a,b)}})}function nl(a){return(a=Dk(a))?Dd(a):Fd(Error("invlocst"))} function pl(a){a:{var b=a.u;var c=a.j;a=a.i;if(13===Cb(a,Uk))b=(b=G(G(Ib(a,Fk,13,Uk),bk,2),ck,2))&&0<H(b,ce,1).length?b:null;else{if(14===Cb(a,Uk)){var d=wb(Tk(a),1),e=G(G(G(Tk(a),Fk,2),bk,2),ck,2);if(1===d.length&&d[0]===c&&e&&0<H(e,ce,1).length&&I(a,17)===b.location.host){b=e;break a}}b=null}}b?(c=new je,a=H(b,ce,1),c=Gb(c,1,a),b=H(b,me,2),b=Gb(c,7,b),b=Dd(b)):b=Fd(Error("invtag"));return b}function rl(a,b){Ed(Cd(b,function(c){ll(a,c,!1)}),function(c){ol(c.message);a.h(null)})} function ol(a){Yi("abg::amalserr",{status:a,guarding:"true",timeout:50,rate:.01},.01)};function sl(a){Ak(a,{atf:1})}function tl(a,b){(a.google_ama_state=a.google_ama_state||{}).exception=b;Ak(a,{atf:0})};function U(a){a.google_ad_modifications||(a.google_ad_modifications={});return a.google_ad_modifications}function ul(a){a=U(a);var b=a.space_collapsing||"none";return a.remove_ads_by_default?{Fa:!0,tb:b,qa:a.ablation_viewport_offset}:null}function vl(a,b){a=U(a);a.had_ads_ablation=!0;a.remove_ads_by_default=!0;a.space_collapsing="slot";a.ablation_viewport_offset=b}function wl(a){U(L).allow_second_reactive_tag=a} function xl(){var a=U(window);a.afg_slotcar_vars||(a.afg_slotcar_vars={});return a.afg_slotcar_vars};function yl(a,b){if(!a)return!1;a=a.hash;if(!a||!a.indexOf)return!1;if(-1!=a.indexOf(b))return!0;b=zl(b);return"go"!=b&&-1!=a.indexOf(b)?!0:!1}function zl(a){var b="";Sc(a.split("_"),function(c){b+=c.substr(0,2)});return b};$a||!x("Safari")||Oa();function Al(){var a=this;this.promise=new p.Promise(function(b,c){a.resolve=b;a.reject=c})};function Bl(){var a=new Al;return{promise:a.promise,resolve:a.resolve}};function Cl(a){a=void 0===a?function(){}:a;w.google_llp||(w.google_llp={});var b=w.google_llp,c=b[7];if(c)return c;c=Bl();b[7]=c;a();return c}function Dl(a){return Cl(function(){Lc(w.document,a)}).promise};function El(a){var b={};return{enable_page_level_ads:(b.pltais=!0,b),google_ad_client:a}};function Fl(a){if(w.google_apltlad||w!==w.top||!a.google_ad_client)return null;w.google_apltlad=!0;var b=El(a.google_ad_client),c=b.enable_page_level_ads;Sc(a,function(d,e){Ei[e]&&"google_ad_client"!==e&&(c[e]=d)});c.google_pgb_reactive=7;if("google_ad_section"in a||"google_ad_region"in a)c.google_ad_section=a.google_ad_section||a.google_ad_region;return b}function Gl(a){return ya(a.enable_page_level_ads)&&7===a.enable_page_level_ads.google_pgb_reactive};function Hl(a,b){this.h=w;this.i=a;this.j=b}function Il(a){P(lf)?il(a.h,a.j,a.i.google_ad_client||"",function(b){var c=a.h,d=a.i;U(L).ama_ran_on_page||b&&Jl(c,d,b)}):Tj({u:a.h,Z:D(a.j,6),ta:50,Ia:function(b){return Kl(a,b)}})}function Kl(a,b){Ed(Cd(b,function(c){Ll("ok");var d=a.h,e=a.i;if(!U(L).ama_ran_on_page){var f=Dk(c);f?Jl(d,e,f):Ek(d,c)}}),function(c){return Ll(c.message)})}function Ll(a){Yi("abg::amalserr",{status:a,guarding:!0,timeout:50,rate:.01},.01)} function Jl(a,b,c){if(null!=A(c,24)){var d=Si(a);d.availableAbg=!0;var e,f;d.ablationFromStorage=!!(null==(e=G(c,ee,24))?0:null==(f=G(e,ge,3))?0:Ib(f,he,2,ie))}if(Gl(b)&&(d=wk(a,H(c,me,7)),!d||!xb(d,8)))return;U(L).ama_ran_on_page=!0;var g;if(null==(g=G(c,re,15))?0:xb(g,23))U(a).enable_overlap_observer=!0;if((g=G(c,pe,13))&&1===A(g,1)){var h=0,k=G(g,qe,6);k&&A(k,3)&&(h=A(k,3)||0);vl(a,h)}else if(null==(h=G(c,ee,24))?0:null==(k=G(h,ge,3))?0:Ib(k,he,2,ie))Si(a).ablatingThisPageview=!0,vl(a,1);kd(3, [c.toJSON()]);var l=b.google_ad_client||"";b=Bk(ya(b.enable_page_level_ads)?b.enable_page_level_ads:{});var m=Rd(Vd,new Qd(null,b));Wi(782,function(){var q=m;try{var t=wk(a,H(c,me,7)),y;if(y=t)a:{var F=wb(t,2);if(F)for(var z=0;z<F.length;z++)if(1==F[z]){y=!0;break a}y=!1}if(y){if(A(t,4)){y={};var E=new Qd(null,(y.google_package=A(t,4),y));q=Rd(q,E)}var S=new vj(a,l,c,t,q),rb=new sd;(new fk(a,S,rb)).start();rb.i.then(Fa(sl,a),Fa(tl,a))}}catch(Kc){Ak(a,{atf:-1})}})};/* Copyright The Closure Library Authors. SPDX-License-Identifier: Apache-2.0 */ var Ml=ja(["https://fonts.googleapis.com/css2?family=Google+Material+Icons:wght@400;500;700"]);function Nl(a,b){return a instanceof HTMLScriptElement&&b.test(a.src)?0:1}function Ol(a){var b=L.document;if(b.currentScript)return Nl(b.currentScript,a);b=u(b.scripts);for(var c=b.next();!c.done;c=b.next())if(0===Nl(c.value,a))return 0;return 1};function Pl(a,b){var c={},d={},e={},f={};return f[fg]=(c[55]=function(){return 0===a},c[23]=function(g){return Yk(L,Number(g))},c[24]=function(g){return bl(Number(g))},c[61]=function(){return D(b,6)},c[63]=function(){return D(b,6)||".google.ch"===I(b,8)},c),f[gg]=(d[7]=function(g){try{var h=window.localStorage}catch(l){h=null}g=Number(g);g=void 0===g?0:g;g=0!==g?"google_experiment_mod"+g:"google_experiment_mod";var k=Vc(h,g);h=null===k?Wc(h,g):k;return null!=h?h:void 0},d),f[hg]=(e[6]=function(){return I(b, 15)},e),f};function Ql(a){a=void 0===a?w:a;return a.ggeac||(a.ggeac={})};function Rl(a,b){try{var c=a.split(".");a=w;for(var d=0,e;null!=a&&d<c.length;d++)e=a,a=a[c[d]],"function"===typeof a&&(a=e[c[d]]());var f=a;if(typeof f===b)return f}catch(g){}} function Sl(){var a={};this[fg]=(a[8]=function(b){try{return null!=va(b)}catch(c){}},a[9]=function(b){try{var c=va(b)}catch(d){return}if(b="function"===typeof c)c=c&&c.toString&&c.toString(),b="string"===typeof c&&-1!=c.indexOf("[native code]");return b},a[10]=function(){return window==window.top},a[6]=function(b){return Xa(O(Oh).h(),parseInt(b,10))},a[27]=function(b){b=Rl(b,"boolean");return void 0!==b?b:void 0},a[60]=function(b){try{return!!w.document.querySelector(b)}catch(c){}},a);a={};this[gg]= (a[3]=function(){return ad()},a[6]=function(b){b=Rl(b,"number");return void 0!==b?b:void 0},a[11]=function(b){b=void 0===b?"":b;var c=w;b=void 0===b?"":b;c=void 0===c?window:c;b=(c=(c=c.location.href.match(Ec)[3]||null)?decodeURI(c):c)?Tc(c+b):null;return null==b?void 0:b%1E3},a);a={};this[hg]=(a[2]=function(){return window.location.href},a[3]=function(){try{return window.top.location.hash}catch(b){return""}},a[4]=function(b){b=Rl(b,"string");return void 0!==b?b:void 0},a[10]=function(){try{var b= w.document;return b.visibilityState||b.webkitVisibilityState||b.mozVisibilityState||""}catch(c){return""}},a[11]=function(){try{var b,c,d,e,f;return null!=(f=null==(d=null==(b=va("google_tag_data"))?void 0:null==(c=b.uach)?void 0:c.fullVersionList)?void 0:null==(e=r(d,"find").call(d,function(g){return"Google Chrome"===g.brand}))?void 0:e.version)?f:""}catch(g){return""}},a)};var Tl=[12,13,20];function Ul(){}Ul.prototype.init=function(a,b,c,d){var e=this;d=void 0===d?{}:d;var f=void 0===d.Ka?!1:d.Ka,g=void 0===d.kb?{}:d.kb;d=void 0===d.mb?[]:d.mb;this.l=a;this.A={};this.G=f;this.m=g;a={};this.i=(a[b]=[],a[4]=[],a);this.j={};(b=Wh())&&Ra(b.split(",")||[],function(h){(h=parseInt(h,10))&&(e.j[h]=!0)});Ra(d,function(h){e.j[h]=!0});this.h=c;return this}; function Vl(a,b,c){var d=[],e=Wl(a.l,b),f;if(f=9!==b)a.A[b]?f=!0:(a.A[b]=!0,f=!1);if(f){var g;null==(g=a.h)||Yg(g,b,c,d,[],4);return d}if(!e.length){var h;null==(h=a.h)||Yg(h,b,c,d,[],3);return d}var k=Xa(Tl,b),l=[];Ra(e,function(q){var t=new Jg;if(q=Xl(a,q,c,t))0!==Cb(t,Kg)&&l.push(t),t=q.getId(),d.push(t),Yl(a,t,k?4:c),(q=H(q,qg,2))&&(k?oh(q,qh(),a.h,t):oh(q,[c],a.h,t))});var m;null==(m=a.h)||Yg(m,b,c,d,l,1);return d}function Yl(a,b,c){a.i[c]||(a.i[c]=[]);a=a.i[c];Xa(a,b)||a.push(b)} function Zl(a,b){a.l.push.apply(a.l,ka(Sa(Ta(b,function(c){return new Ok(c)}),function(c){return!Xa(Tl,c.V())})))} function Xl(a,b,c,d){var e=O(ah).h;if(!mg(G(b,ag,3),e))return null;var f=H(b,Ik,2),g=C(b,6,0);if(g){Bb(d,1,Kg,g);f=e[gg];switch(c){case 2:var h=f[8];break;case 1:h=f[7]}c=void 0;if(h)try{c=h(g),Ab(d,3,c)}catch(k){}return(b=$l(b,c))?am(a,[b],1):null}if(g=C(b,10,0)){Bb(d,2,Kg,g);h=null;switch(c){case 1:h=e[gg][9];break;case 2:h=e[gg][10];break;default:return null}c=h?h(String(g)):void 0;if(void 0===c&&1===C(b,11,0))return null;void 0!==c&&Ab(d,3,c);return(b=$l(b,c))?am(a,[b],1):null}d=e?Sa(f,function(k){return mg(G(k, ag,3),e)}):f;if(!d.length)return null;c=d.length*C(b,1,0);return(b=C(b,4,0))?bm(a,b,c,d):am(a,d,c/1E3)}function bm(a,b,c,d){var e=null!=a.m[b]?a.m[b]:1E3;if(0>=e)return null;d=am(a,d,c/e);a.m[b]=d?0:e-c;return d}function am(a,b,c){var d=a.j,e=Va(b,function(f){return!!d[f.getId()]});return e?e:a.G?null:Oc(b,c)} function cm(a,b){Jh(th,function(c){a.j[c]=!0},b);Jh(wh,function(c,d){return Vl(a,c,d)},b);Jh(xh,function(c){return(a.i[c]||[]).concat(a.i[4])},b);Jh(Gh,function(c){return Zl(a,c)},b);Jh(uh,function(c,d){return Yl(a,c,d)},b)}function Wl(a,b){return(a=Va(a,function(c){return c.V()==b}))&&H(a,Kk,2)||[]}function $l(a,b){var c=H(a,Ik,2),d=c.length,e=C(a,8,0);a=d*C(a,1,0)-1;b=void 0!==b?b:Math.floor(1E3*Rc());d=(b-e)%d;if(b<e||b-e-d>=a)return null;c=c[d];e=O(ah).h;return!c||e&&!mg(G(c,ag,3),e)?null:c};function dm(){this.h=function(){}}function em(a){O(dm).h(a)};var fm,gm,hm,im,jm,km; function lm(a,b,c,d){var e=1;d=void 0===d?Ql():d;e=void 0===e?0:e;var f=void 0===f?new Tg(null!=(im=null==(fm=G(a,Qk,5))?void 0:C(fm,2,0))?im:0,null!=(jm=null==(gm=G(a,Qk,5))?void 0:C(gm,4,0))?jm:0,null!=(km=null==(hm=G(a,Qk,5))?void 0:D(hm,3))?km:!1):f;d.hasOwnProperty("init-done")?(Kh(Gh,d)(Ta(H(a,Ok,2),function(g){return g.toJSON()})),Kh(Hh,d)(Ta(H(a,qg,1),function(g){return g.toJSON()}),e),b&&Kh(Ih,d)(b),mm(d,e)):(cm(O(Ul).init(H(a,Ok,2),e,f,c),d),Lh(d),Mh(d),Nh(d),mm(d,e),oh(H(a,qg,1),[e],f, void 0,!0),bh=bh||!(!c||!c.hb),em(O(Sl)),b&&em(b))}function mm(a,b){a=void 0===a?Ql():a;b=void 0===b?0:b;var c=a,d=b;d=void 0===d?0:d;Ph(O(Oh),c,d);nm(a,b);O(dm).h=Kh(Ih,a);O(yf).m()}function nm(a,b){var c=O(yf);c.i=function(d,e){return Kh(zh,a,function(){return!1})(d,e,b)};c.j=function(d,e){return Kh(Ah,a,function(){return 0})(d,e,b)};c.l=function(d,e){return Kh(Bh,a,function(){return""})(d,e,b)};c.h=function(d,e){return Kh(Ch,a,function(){return[]})(d,e,b)};c.m=function(){Kh(vh,a)(b)}};function om(a,b,c){var d=U(a);if(d.plle)mm(Ql(a),1);else{d.plle=!0;try{var e=a.localStorage}catch(f){e=null}d=e;null==Vc(d,"goog_pem_mod")&&Wc(d,"goog_pem_mod");d=G(b,Mk,12);e=D(b,9);lm(d,Pl(c,b),{Ka:e&&!!a.google_disable_experiments,hb:e},Ql(a));if(c=I(b,15))c=Number(c),O(Oh).l(c);if(c=I(b,10))c=Number(c),O(Oh).i(c);b=u(wb(b,19));for(c=b.next();!c.done;c=b.next())c=c.value,O(Oh).i(c);O(Oh).j(12);O(Oh).j(10);a=Ic(a)||a;yl(a.location,"google_mc_lab")&&O(Oh).i(44738307)}};function pm(a,b,c){a=a.style;a.border="none";a.height=c+"px";a.width=b+"px";a.margin=0;a.padding=0;a.position="relative";a.visibility="visible";a.backgroundColor="transparent"};var qm={"120x90":!0,"160x90":!0,"180x90":!0,"200x90":!0,"468x15":!0,"728x15":!0};function rm(a,b){if(15==b){if(728<=a)return 728;if(468<=a)return 468}else if(90==b){if(200<=a)return 200;if(180<=a)return 180;if(160<=a)return 160;if(120<=a)return 120}return null};function V(a,b,c,d){d=void 0===d?!1:d;wi.call(this,a,b);this.da=c;this.ib=d}v(V,wi);V.prototype.pa=function(){return this.da};V.prototype.i=function(a,b,c){b.google_ad_resize||(c.style.height=this.height()+"px",b.rpe=!0)};function sm(a){return function(b){return!!(b.da&a)}};var tm={},um=(tm.image_stacked=1/1.91,tm.image_sidebyside=1/3.82,tm.mobile_banner_image_sidebyside=1/3.82,tm.pub_control_image_stacked=1/1.91,tm.pub_control_image_sidebyside=1/3.82,tm.pub_control_image_card_stacked=1/1.91,tm.pub_control_image_card_sidebyside=1/3.74,tm.pub_control_text=0,tm.pub_control_text_card=0,tm),vm={},wm=(vm.image_stacked=80,vm.image_sidebyside=0,vm.mobile_banner_image_sidebyside=0,vm.pub_control_image_stacked=80,vm.pub_control_image_sidebyside=0,vm.pub_control_image_card_stacked= 85,vm.pub_control_image_card_sidebyside=0,vm.pub_control_text=80,vm.pub_control_text_card=80,vm),xm={},ym=(xm.pub_control_image_stacked=100,xm.pub_control_image_sidebyside=200,xm.pub_control_image_card_stacked=150,xm.pub_control_image_card_sidebyside=250,xm.pub_control_text=100,xm.pub_control_text_card=150,xm); function zm(a){var b=0;a.T&&b++;a.J&&b++;a.K&&b++;if(3>b)return{M:"Tags data-matched-content-ui-type, data-matched-content-columns-num and data-matched-content-rows-num should be set together."};b=a.T.split(",");var c=a.K.split(",");a=a.J.split(",");if(b.length!==c.length||b.length!==a.length)return{M:'Lengths of parameters data-matched-content-ui-type, data-matched-content-columns-num and data-matched-content-rows-num must match. Example: \n data-matched-content-rows-num="4,2"\ndata-matched-content-columns-num="1,6"\ndata-matched-content-ui-type="image_stacked,image_card_sidebyside"'}; if(2<b.length)return{M:"The parameter length of attribute data-matched-content-ui-type, data-matched-content-columns-num and data-matched-content-rows-num is too long. At most 2 parameters for each attribute are needed: one for mobile and one for desktop, while you are providing "+(b.length+' parameters. Example: \n data-matched-content-rows-num="4,2"\ndata-matched-content-columns-num="1,6"\ndata-matched-content-ui-type="image_stacked,image_card_sidebyside".')};for(var d=[],e=[],f=0;f<b.length;f++){var g= Number(c[f]);if(r(Number,"isNaN").call(Number,g)||0===g)return{M:"Wrong value '"+c[f]+"' for data-matched-content-rows-num."};d.push(g);g=Number(a[f]);if(r(Number,"isNaN").call(Number,g)||0===g)return{M:"Wrong value '"+a[f]+"' for data-matched-content-columns-num."};e.push(g)}return{K:d,J:e,Na:b}} function Am(a){return 1200<=a?{width:1200,height:600}:850<=a?{width:a,height:Math.floor(.5*a)}:550<=a?{width:a,height:Math.floor(.6*a)}:468<=a?{width:a,height:Math.floor(.7*a)}:{width:a,height:Math.floor(3.44*a)}};var Bm=Za("script");function Cm(a,b,c,d,e,f,g,h,k,l,m,q){this.A=a;this.U=b;this.da=void 0===c?null:c;this.h=void 0===d?null:d;this.P=void 0===e?null:e;this.i=void 0===f?null:f;this.j=void 0===g?null:g;this.H=void 0===h?null:h;this.N=void 0===k?null:k;this.l=void 0===l?null:l;this.m=void 0===m?null:m;this.O=void 0===q?null:q;this.R=this.C=this.G=null}Cm.prototype.size=function(){return this.U}; function Dm(a,b,c){null!=a.da&&(c.google_responsive_formats=a.da);null!=a.P&&(c.google_safe_for_responsive_override=a.P);null!=a.i&&(!0===a.i?c.google_full_width_responsive_allowed=!0:(c.google_full_width_responsive_allowed=!1,c.gfwrnwer=a.i));null!=a.j&&!0!==a.j&&(c.gfwrnher=a.j);var d=a.m||c.google_ad_width;null!=d&&(c.google_resizing_width=d);d=a.l||c.google_ad_height;null!=d&&(c.google_resizing_height=d);d=a.size().h(b);var e=a.size().height();if(!c.google_ad_resize){c.google_ad_width=d;c.google_ad_height= e;var f=a.size();b=f.h(b)+"x"+f.height();c.google_ad_format=b;c.google_responsive_auto_format=a.A;null!=a.h&&(c.armr=a.h);c.google_ad_resizable=!0;c.google_override_format=1;c.google_loader_features_used=128;!0===a.i&&(c.gfwrnh=a.size().height()+"px")}null!=a.H&&(c.gfwroml=a.H);null!=a.N&&(c.gfwromr=a.N);null!=a.l&&(c.gfwroh=a.l);null!=a.m&&(c.gfwrow=a.m);null!=a.O&&(c.gfwroz=a.O);null!=a.G&&(c.gml=a.G);null!=a.C&&(c.gmr=a.C);null!=a.R&&(c.gzi=a.R);b=Ic(window)||window;yl(b.location,"google_responsive_dummy_ad")&& (Xa([1,2,3,4,5,6,7,8],a.A)||1===a.h)&&2!==a.h&&(a=JSON.stringify({googMsgType:"adpnt",key_value:[{key:"qid",value:"DUMMY_AD"}]}),c.dash="<"+Bm+">window.top.postMessage('"+a+"', '*');\n </"+Bm+'>\n <div id="dummyAd" style="width:'+d+"px;height:"+e+'px;\n background:#ddd;border:3px solid #f00;box-sizing:border-box;\n color:#000;">\n <p>Requested size:'+d+"x"+e+"</p>\n <p>Rendered size:"+d+"x"+e+"</p>\n </div>")};var Em=["google_content_recommendation_ui_type","google_content_recommendation_columns_num","google_content_recommendation_rows_num"];function Fm(a,b){wi.call(this,a,b)}v(Fm,wi);Fm.prototype.h=function(a){return Math.min(1200,Math.max(this.minWidth(),Math.round(a)))}; function Gm(a,b){Hm(a,b);if("pedestal"==b.google_content_recommendation_ui_type)return new Cm(9,new Fm(a,Math.floor(a*b.google_phwr)));var c=Cc();468>a?c?(c=a-8-8,c=Math.floor(c/1.91+70)+Math.floor(11*(c*um.mobile_banner_image_sidebyside+wm.mobile_banner_image_sidebyside)+96),a={aa:a,$:c,J:1,K:12,T:"mobile_banner_image_sidebyside"}):(a=Am(a),a={aa:a.width,$:a.height,J:1,K:13,T:"image_sidebyside"}):(a=Am(a),a={aa:a.width,$:a.height,J:4,K:2,T:"image_stacked"});Im(b,a);return new Cm(9,new Fm(a.aa,a.$))} function Jm(a,b){Hm(a,b);var c=zm({K:b.google_content_recommendation_rows_num,J:b.google_content_recommendation_columns_num,T:b.google_content_recommendation_ui_type});if(c.M)a={aa:0,$:0,J:0,K:0,T:"image_stacked",M:c.M};else{var d=2===c.Na.length&&468<=a?1:0;var e=c.Na[d];e=0===e.indexOf("pub_control_")?e:"pub_control_"+e;var f=ym[e];for(var g=c.J[d];a/g<f&&1<g;)g--;f=g;c=c.K[d];d=Math.floor(((a-8*f-8)/f*um[e]+wm[e])*c+8*c+8);a=1500<a?{width:0,height:0,rb:"Calculated slot width is too large: "+a}: 1500<d?{width:0,height:0,rb:"Calculated slot height is too large: "+d}:{width:a,height:d};a={aa:a.width,$:a.height,J:f,K:c,T:e}}if(a.M)throw new T(a.M);Im(b,a);return new Cm(9,new Fm(a.aa,a.$))}function Hm(a,b){if(0>=a)throw new T("Invalid responsive width from Matched Content slot "+b.google_ad_slot+": "+a+". Please ensure to put this Matched Content slot into a non-zero width div container.");} function Im(a,b){a.google_content_recommendation_ui_type=b.T;a.google_content_recommendation_columns_num=b.J;a.google_content_recommendation_rows_num=b.K};function Km(a,b){wi.call(this,a,b)}v(Km,wi);Km.prototype.h=function(){return this.minWidth()};Km.prototype.i=function(a,b,c){vi(a,c);b.google_ad_resize||(c.style.height=this.height()+"px",b.rpe=!0)};var Lm={"image-top":function(a){return 600>=a?284+.414*(a-250):429},"image-middle":function(a){return 500>=a?196-.13*(a-250):164+.2*(a-500)},"image-side":function(a){return 500>=a?205-.28*(a-250):134+.21*(a-500)},"text-only":function(a){return 500>=a?187-.228*(a-250):130},"in-article":function(a){return 420>=a?a/1.2:460>=a?a/1.91+130:800>=a?a/4:200}};function Mm(a,b){wi.call(this,a,b)}v(Mm,wi);Mm.prototype.h=function(){return Math.min(1200,this.minWidth())}; function Nm(a,b,c,d,e){var f=e.google_ad_layout||"image-top";if("in-article"==f){var g=a;if("false"==e.google_full_width_responsive)a=g;else if(a=qi(b,c,g,.2,e),!0!==a)e.gfwrnwer=a,a=g;else if(a=Wf(b))if(e.google_full_width_responsive_allowed=!0,c.parentElement){b:{g=c;for(var h=0;100>h&&g.parentElement;++h){for(var k=g.parentElement.childNodes,l=0;l<k.length;++l){var m=k[l];if(m!=g&&ti(b,m))break b}g=g.parentElement;g.style.width="100%";g.style.height="auto"}}vi(b,c)}else a=g;else a=g}if(250>a)throw new T("Fluid responsive ads must be at least 250px wide: availableWidth="+ a);a=Math.min(1200,Math.floor(a));if(d&&"in-article"!=f){f=Math.ceil(d);if(50>f)throw new T("Fluid responsive ads must be at least 50px tall: height="+f);return new Cm(11,new wi(a,f))}if("in-article"!=f&&(d=e.google_ad_layout_key)){f=""+d;b=Math.pow(10,3);if(d=(c=f.match(/([+-][0-9a-z]+)/g))&&c.length){e=[];for(g=0;g<d;g++)e.push(parseInt(c[g],36)/b);b=e}else b=null;if(!b)throw new T("Invalid data-ad-layout-key value: "+f);f=(a+-725)/1E3;c=0;d=1;e=b.length;for(g=0;g<e;g++)c+=b[g]*d,d*=f;f=Math.ceil(1E3* c- -725+10);if(isNaN(f))throw new T("Invalid height: height="+f);if(50>f)throw new T("Fluid responsive ads must be at least 50px tall: height="+f);if(1200<f)throw new T("Fluid responsive ads must be at most 1200px tall: height="+f);return new Cm(11,new wi(a,f))}d=Lm[f];if(!d)throw new T("Invalid data-ad-layout value: "+f);c=Ai(c,b);b=Wf(b);b="in-article"!==f||c||a!==b?Math.ceil(d(a)):Math.ceil(1.25*d(a));return new Cm(11,"in-article"==f?new Mm(a,b):new wi(a,b))};function Om(a){return function(b){for(var c=a.length-1;0<=c;--c)if(!a[c](b))return!1;return!0}}function Pm(a,b){for(var c=Qm.slice(0),d=c.length,e=null,f=0;f<d;++f){var g=c[f];if(a(g)){if(!b||b(g))return g;null===e&&(e=g)}}return e};var W=[new V(970,90,2),new V(728,90,2),new V(468,60,2),new V(336,280,1),new V(320,100,2),new V(320,50,2),new V(300,600,4),new V(300,250,1),new V(250,250,1),new V(234,60,2),new V(200,200,1),new V(180,150,1),new V(160,600,4),new V(125,125,1),new V(120,600,4),new V(120,240,4),new V(120,120,1,!0)],Qm=[W[6],W[12],W[3],W[0],W[7],W[14],W[1],W[8],W[10],W[4],W[15],W[2],W[11],W[5],W[13],W[9],W[16]];function Rm(a,b,c,d,e){"false"==e.google_full_width_responsive?c={D:a,F:1}:"autorelaxed"==b&&e.google_full_width_responsive||Sm(b)||e.google_ad_resize?(b=ri(a,c,d,e),c=!0!==b?{D:a,F:b}:{D:Wf(c)||a,F:!0}):c={D:a,F:2};b=c.F;return!0!==b?{D:a,F:b}:d.parentElement?{D:c.D,F:b}:{D:a,F:b}} function Tm(a,b,c,d,e){var f=Wi(247,function(){return Rm(a,b,c,d,e)}),g=f.D;f=f.F;var h=!0===f,k=K(d.style.width),l=K(d.style.height),m=Um(g,b,c,d,e,h);g=m.Y;h=m.W;var q=m.pa;m=m.Ma;var t=Vm(b,q),y,F=(y=xi(d,c,"marginLeft",K))?y+"px":"",z=(y=xi(d,c,"marginRight",K))?y+"px":"";y=xi(d,c,"zIndex")||"";return new Cm(t,g,q,null,m,f,h,F,z,l,k,y)}function Sm(a){return"auto"==a||/^((^|,) *(horizontal|vertical|rectangle) *)+$/.test(a)} function Um(a,b,c,d,e,f){b="auto"==b?.25>=a/Math.min(1200,Wf(c))?4:3:pi(b);var g=!1,h=!1;if(488>Wf(c)){var k=ki(d,c);var l=Ai(d,c);g=!l&&k;h=l&&k}l=[yi(a),sm(b)];l.push(zi(488>Wf(c),c,d,h));null!=e.google_max_responsive_height&&l.push(Ci(e.google_max_responsive_height));var m=[function(t){return!t.ib}];if(g||h)g=Di(c,d),m.push(Ci(g));var q=Pm(Om(l),Om(m));if(!q)throw new T("No slot size for availableWidth="+a);l=Wi(248,function(){var t;a:if(f){if(e.gfwrnh&&(t=K(e.gfwrnh))){t={Y:new Km(a,t),W:!0}; break a}t=a/1.2;var y=Math;var F=y.min;if(e.google_resizing_allowed||"true"==e.google_full_width_responsive)var z=Infinity;else{z=d;var E=Infinity;do{var S=xi(z,c,"height",K);S&&(E=Math.min(E,S));(S=xi(z,c,"maxHeight",K))&&(E=Math.min(E,S))}while((z=z.parentElement)&&"HTML"!=z.tagName);z=E}y=F.call(y,t,z);if(y<.5*t||100>y)y=t;P(hf)&&!Ai(d,c)&&(y=Math.max(y,.5*Vf(c).clientHeight));t={Y:new Km(a,Math.floor(y)),W:y<t?102:!0}}else t={Y:q,W:100};return t});g=l.Y;l=l.W;return"in-article"===e.google_ad_layout&& Wm(c)?{Y:Xm(a,c,d,g,e),W:!1,pa:b,Ma:k}:{Y:g,W:l,pa:b,Ma:k}}function Vm(a,b){if("auto"==a)return 1;switch(b){case 2:return 2;case 1:return 3;case 4:return 4;case 3:return 5;case 6:return 6;case 5:return 7;case 7:return 8}throw Error("bad mask");}function Xm(a,b,c,d,e){var f=e.google_ad_height||xi(c,b,"height",K);b=Nm(a,b,c,f,e).size();return b.minWidth()*b.height()>a*d.height()?new V(b.minWidth(),b.height(),1):d}function Wm(a){return P(ff)||a.location&&"#hffwroe2etoq"==a.location.hash};function Ym(a,b,c,d,e){var f;(f=Wf(b))?488>Wf(b)?b.innerHeight>=b.innerWidth?(e.google_full_width_responsive_allowed=!0,vi(b,c),f={D:f,F:!0}):f={D:a,F:5}:f={D:a,F:4}:f={D:a,F:10};var g=f;f=g.D;g=g.F;if(!0!==g||a==f)return new Cm(12,new wi(a,d),null,null,!0,g,100);a=Um(f,"auto",b,c,e,!0);return new Cm(1,a.Y,a.pa,2,!0,g,a.W)};function Zm(a,b){var c=b.google_ad_format;if("autorelaxed"==c){a:{if("pedestal"!=b.google_content_recommendation_ui_type)for(a=u(Em),c=a.next();!c.done;c=a.next())if(null!=b[c.value]){b=!0;break a}b=!1}return b?9:5}if(Sm(c))return 1;if("link"===c)return 4;if("fluid"==c){if(c="in-article"===b.google_ad_layout)c=P(gf)||P(ff)||a.location&&("#hffwroe2etop"==a.location.hash||"#hffwroe2etoq"==a.location.hash);return c?($m(b),1):8}if(27===b.google_reactive_ad_format)return $m(b),1} function an(a,b,c,d,e){e=b.offsetWidth||(c.google_ad_resize||(void 0===e?!1:e))&&xi(b,d,"width",K)||c.google_ad_width||0;4===a&&(c.google_ad_format="auto",a=1);var f=(f=bn(a,e,b,c,d))?f:Tm(e,c.google_ad_format,d,b,c);f.size().i(d,c,b);Dm(f,e,c);1!=a&&(a=f.size().height(),b.style.height=a+"px")} function bn(a,b,c,d,e){var f=d.google_ad_height||xi(c,e,"height",K);switch(a){case 5:return f=Wi(247,function(){return Rm(b,d.google_ad_format,e,c,d)}),a=f.D,f=f.F,!0===f&&b!=a&&vi(e,c),!0===f?d.google_full_width_responsive_allowed=!0:(d.google_full_width_responsive_allowed=!1,d.gfwrnwer=f),Gm(a,d);case 9:return Jm(b,d);case 8:return Nm(b,e,c,f,d);case 10:return Ym(b,e,c,f,d)}}function $m(a){a.google_ad_format="auto";a.armr=3};function cn(a,b){var c=Ic(b);if(c){c=Wf(c);var d=Nc(a,b)||{},e=d.direction;if("0px"===d.width&&"none"!==d.cssFloat)return-1;if("ltr"===e&&c)return Math.floor(Math.min(1200,c-a.getBoundingClientRect().left));if("rtl"===e&&c)return a=b.document.body.getBoundingClientRect().right-a.getBoundingClientRect().right,Math.floor(Math.min(1200,c-a-Math.floor((c-b.document.body.clientWidth)/2)))}return-1};var dn=ja(["https://pagead2.googlesyndication.com/pagead/managed/js/adsense/","/slotcar_library",".js"]),en=ja(["https://googleads.g.doubleclick.net/pagead/html/","/","/zrt_lookup.html"]),fn=ja(["https://pagead2.googlesyndication.com/pagead/managed/js/adsense/","/show_ads_impl",".js"]),gn=ja(["https://pagead2.googlesyndication.com/pagead/managed/js/adsense/","/show_ads_impl_with_ama",".js"]),hn=ja(["https://pagead2.googlesyndication.com/pagead/managed/js/adsense/","/show_ads_impl_instrumented",".js"]);function jn(a){Ui.Ta(function(b){b.shv=String(a);b.mjsv="m202204040101";var c=O(Oh).h(),d=U(w);d.eids||(d.eids=[]);b.eid=c.concat(d.eids).join(",")})};function kn(a){var b=a.nb;return a.eb||("dev"===b?"dev":"")};var ln={},mn=(ln.google_ad_modifications=!0,ln.google_analytics_domain_name=!0,ln.google_analytics_uacct=!0,ln.google_pause_ad_requests=!0,ln.google_user_agent_client_hint=!0,ln);function nn(a){return(a=a.innerText||a.innerHTML)&&(a=a.replace(/^\s+/,"").split(/\r?\n/,1)[0].match(/^\x3c!--+(.*?)(?:--+>)?\s*$/))&&RegExp("google_ad_client").test(a[1])?a[1]:null} function on(a){if(a=a.innerText||a.innerHTML)if(a=a.replace(/^\s+|\s+$/g,"").replace(/\s*(\r?\n)+\s*/g,";"),(a=a.match(/^\x3c!--+(.*?)(?:--+>)?$/)||a.match(/^\/*\s*<!\[CDATA\[(.*?)(?:\/*\s*\]\]>)?$/i))&&RegExp("google_ad_client").test(a[1]))return a[1];return null} function pn(a){switch(a){case "true":return!0;case "false":return!1;case "null":return null;case "undefined":break;default:try{var b=a.match(/^(?:'(.*)'|"(.*)")$/);if(b)return b[1]||b[2]||"";if(/^[-+]?\d*(\.\d+)?$/.test(a)){var c=parseFloat(a);return c===c?c:void 0}}catch(d){}}};function qn(a){if(a.google_ad_client)return String(a.google_ad_client);var b,c,d,e,f;if(null!=(e=null!=(d=null==(b=U(a).head_tag_slot_vars)?void 0:b.google_ad_client)?d:null==(c=a.document.querySelector(".adsbygoogle[data-ad-client]"))?void 0:c.getAttribute("data-ad-client")))b=e;else{b:{b=a.document.getElementsByTagName("script");a=a.navigator&&a.navigator.userAgent||"";a=RegExp("appbankapppuzdradb|daumapps|fban|fbios|fbav|fb_iab|gsa/|messengerforios|naver|niftyappmobile|nonavigation|pinterest|twitter|ucbrowser|yjnewsapp|youtube", "i").test(a)||/i(phone|pad|pod)/i.test(a)&&/applewebkit/i.test(a)&&!/version|safari/i.test(a)&&!qd()?nn:on;for(c=b.length-1;0<=c;c--)if(d=b[c],!d.google_parsed_script_for_pub_code&&(d.google_parsed_script_for_pub_code=!0,d=a(d))){b=d;break b}b=null}if(b){a=/(google_\w+) *= *(['"]?[\w.-]+['"]?) *(?:;|$)/gm;for(c={};d=a.exec(b);)c[d[1]]=pn(d[2]);b=c.google_ad_client?c.google_ad_client:""}else b=""}return null!=(f=b)?f:""};var rn="undefined"===typeof sttc?void 0:sttc;function sn(a){var b=Ui;try{return Yf(a,Zf),new Rk(JSON.parse(a))}catch(c){b.I(838,c instanceof Error?c:Error(String(c)),void 0,function(d){d.jspb=String(a)})}return new Rk};var tn=O(yf).h(mf.h,mf.defaultValue);function un(){var a=L.document;a=void 0===a?window.document:a;ed(tn,a)};var vn=O(yf).h(nf.h,nf.defaultValue);function wn(){var a=L.document;a=void 0===a?window.document:a;ed(vn,a)};var xn=ja(["https://pagead2.googlesyndication.com/pagead/js/err_rep.js"]);function yn(){this.h=null;this.j=!1;this.l=Math.random();this.i=this.I;this.m=null}n=yn.prototype;n.Ta=function(a){this.h=a};n.Va=function(a){this.j=a};n.Ua=function(a){this.i=a}; n.I=function(a,b,c,d,e){if((this.j?this.l:Math.random())>(void 0===c?.01:c))return!1;Rh(b)||(b=new Qh(b,{context:a,id:void 0===e?"jserror":e}));if(d||this.h)b.meta={},this.h&&this.h(b.meta),d&&d(b.meta);w.google_js_errors=w.google_js_errors||[];w.google_js_errors.push(b);if(!w.error_rep_loaded){a=nd(xn);var f;Lc(w.document,null!=(f=this.m)?f:hc(qc(a).toString()));w.error_rep_loaded=!0}return!1};n.oa=function(a,b,c){try{return b()}catch(d){if(!this.i(a,d,.01,c,"jserror"))throw d;}}; n.Oa=function(a,b){var c=this;return function(){var d=ta.apply(0,arguments);return c.oa(a,function(){return b.apply(void 0,d)})}};n.Pa=function(a,b){var c=this;b.catch(function(d){d=d?d:"unknown rejection";c.I(a,d instanceof Error?d:Error(d))})};function zn(a,b,c){var d=window;return function(){var e=Yh(),f=3;try{var g=b.apply(this,arguments)}catch(h){f=13;if(c)return c(a,h),g;throw h;}finally{d.google_measure_js_timing&&e&&(e={label:a.toString(),value:e,duration:(Yh()||0)-e,type:f},f=d.google_js_reporting_queue=d.google_js_reporting_queue||[],2048>f.length&&f.push(e))}return g}}function An(a,b){return zn(a,b,function(c,d){(new yn).I(c,d)})};function Bn(a,b){return null==b?"&"+a+"=null":"&"+a+"="+Math.floor(b)}function Cn(a,b){return"&"+a+"="+b.toFixed(3)}function Dn(){var a=new p.Set,b=aj();try{if(!b)return a;for(var c=b.pubads(),d=u(c.getSlots()),e=d.next();!e.done;e=d.next())a.add(e.value.getSlotId().getDomId())}catch(f){}return a}function En(a){a=a.id;return null!=a&&(Dn().has(a)||r(a,"startsWith").call(a,"google_ads_iframe_")||r(a,"startsWith").call(a,"aswift"))} function Fn(a,b,c){if(!a.sources)return!1;switch(Gn(a)){case 2:var d=Hn(a);if(d)return c.some(function(f){return In(d,f)});case 1:var e=Jn(a);if(e)return b.some(function(f){return In(e,f)})}return!1}function Gn(a){if(!a.sources)return 0;a=a.sources.filter(function(b){return b.previousRect&&b.currentRect});if(1<=a.length){a=a[0];if(a.previousRect.top<a.currentRect.top)return 2;if(a.previousRect.top>a.currentRect.top)return 1}return 0}function Jn(a){return Kn(a,function(b){return b.currentRect})} function Hn(a){return Kn(a,function(b){return b.previousRect})}function Kn(a,b){return a.sources.reduce(function(c,d){d=b(d);return c?d&&0!==d.width*d.height?d.top<c.top?d:c:c:d},null)} function Ln(){Mj.call(this);this.i=this.h=this.P=this.O=this.H=0;this.Ba=this.ya=Number.NEGATIVE_INFINITY;this.ua=this.wa=this.xa=this.za=this.Ea=this.m=this.Da=this.U=0;this.va=!1;this.R=this.N=this.C=0;var a=document.querySelector("[data-google-query-id]");this.Ca=a?a.getAttribute("data-google-query-id"):null;this.l=null;this.Aa=!1;this.ga=function(){}}v(Ln,Mj); function Mn(){var a=new Ln;if(P(of)){var b=window;if(!b.google_plmetrics&&window.PerformanceObserver){b.google_plmetrics=!0;b=u(["layout-shift","largest-contentful-paint","first-input","longtask"]);for(var c=b.next();!c.done;c=b.next())c=c.value,Nn(a).observe({type:c,buffered:!0});On(a)}}} function Nn(a){a.l||(a.l=new PerformanceObserver(An(640,function(b){var c=Pn!==window.scrollX||Qn!==window.scrollY?[]:Rn,d=Sn();b=u(b.getEntries());for(var e=b.next();!e.done;e=b.next())switch(e=e.value,e.entryType){case "layout-shift":var f=a;if(!e.hadRecentInput){f.H+=Number(e.value);Number(e.value)>f.O&&(f.O=Number(e.value));f.P+=1;var g=Fn(e,c,d);g&&(f.m+=e.value,f.za++);if(5E3<e.startTime-f.ya||1E3<e.startTime-f.Ba)f.ya=e.startTime,f.h=0,f.i=0;f.Ba=e.startTime;f.h+=e.value;g&&(f.i+=e.value); f.h>f.U&&(f.U=f.h,f.Ea=f.i,f.Da=e.startTime+e.duration)}break;case "largest-contentful-paint":a.xa=Math.floor(e.renderTime||e.loadTime);a.wa=e.size;break;case "first-input":a.ua=Number((e.processingStart-e.startTime).toFixed(3));a.va=!0;break;case "longtask":e=Math.max(0,e.duration-50),a.C+=e,a.N=Math.max(a.N,e),a.R+=1}})));return a.l} function On(a){var b=An(641,function(){var d=document;2==(d.prerendering?3:{visible:1,hidden:2,prerender:3,preview:4,unloaded:5}[d.visibilityState||d.webkitVisibilityState||d.mozVisibilityState||""]||0)&&Tn(a)}),c=An(641,function(){return void Tn(a)});document.addEventListener("visibilitychange",b);document.addEventListener("unload",c);a.ga=function(){document.removeEventListener("visibilitychange",b);document.removeEventListener("unload",c);Nn(a).disconnect()}} Ln.prototype.j=function(){Mj.prototype.j.call(this);this.ga()}; function Tn(a){if(!a.Aa){a.Aa=!0;Nn(a).takeRecords();var b="https://pagead2.googlesyndication.com/pagead/gen_204?id=plmetrics";window.LayoutShift&&(b+=Cn("cls",a.H),b+=Cn("mls",a.O),b+=Bn("nls",a.P),window.LayoutShiftAttribution&&(b+=Cn("cas",a.m),b+=Bn("nas",a.za)),b+=Cn("wls",a.U),b+=Cn("tls",a.Da),window.LayoutShiftAttribution&&(b+=Cn("was",a.Ea)));window.LargestContentfulPaint&&(b+=Bn("lcp",a.xa),b+=Bn("lcps",a.wa));window.PerformanceEventTiming&&a.va&&(b+=Bn("fid",a.ua));window.PerformanceLongTaskTiming&& (b+=Bn("cbt",a.C),b+=Bn("mbt",a.N),b+=Bn("nlt",a.R));for(var c=0,d=u(document.getElementsByTagName("iframe")),e=d.next();!e.done;e=d.next())En(e.value)&&c++;b+=Bn("nif",c);b+=Bn("ifi",pd(window));c=O(Oh).h();b+="&eid="+encodeURIComponent(c.join());b+="&top="+(w===w.top?1:0);b+=a.Ca?"&qqid="+encodeURIComponent(a.Ca):Bn("pvsid",fd(w));window.googletag&&(b+="&gpt=1");window.fetch(b,{keepalive:!0,credentials:"include",redirect:"follow",method:"get",mode:"no-cors"});a.A||(a.A=!0,a.j())}} function In(a,b){var c=Math.min(a.right,b.right)-Math.max(a.left,b.left);a=Math.min(a.bottom,b.bottom)-Math.max(a.top,b.top);return 0>=c||0>=a?!1:50<=100*c*a/((b.right-b.left)*(b.bottom-b.top))} function Sn(){var a=[].concat(ka(document.getElementsByTagName("iframe"))).filter(En),b=[].concat(ka(Dn())).map(function(c){return document.getElementById(c)}).filter(function(c){return null!==c});Pn=window.scrollX;Qn=window.scrollY;return Rn=[].concat(ka(a),ka(b)).map(function(c){return c.getBoundingClientRect()})}var Pn=void 0,Qn=void 0,Rn=[];var X={issuerOrigin:"https://attestation.android.com",issuancePath:"/att/i",redemptionPath:"/att/r"},Y={issuerOrigin:"https://pagead2.googlesyndication.com",issuancePath:"/dtt/i",redemptionPath:"/dtt/r",getStatePath:"/dtt/s"};var Un=O(yf).h(wf.h,wf.defaultValue); function Vn(a,b,c){Mj.call(this);var d=this;this.i=a;this.h=[];b&&Wn()&&this.h.push(X);c&&this.h.push(Y);if(document.hasTrustToken&&!P(tf)){var e=new p.Map;this.h.forEach(function(f){e.set(f.issuerOrigin,{issuerOrigin:f.issuerOrigin,state:d.i?1:12,hasRedemptionRecord:!1})});window.goog_tt_state_map=window.goog_tt_state_map&&window.goog_tt_state_map instanceof p.Map?new p.Map([].concat(ka(e),ka(window.goog_tt_state_map))):e;window.goog_tt_promise_map&&window.goog_tt_promise_map instanceof p.Map||(window.goog_tt_promise_map= new p.Map)}}v(Vn,Mj);function Wn(){var a=void 0===a?window:a;a=a.navigator.userAgent;var b=/Chrome/.test(a);return/Android/.test(a)&&b}function Xn(){var a=void 0===a?window.document:a;ed(Un,a)}function Yn(a,b){return a||".google.ch"===b||"function"===typeof L.__tcfapi}function Z(a,b,c){var d,e=null==(d=window.goog_tt_state_map)?void 0:d.get(a);e&&(e.state=b,void 0!=c&&(e.hasRedemptionRecord=c))} function Zn(){var a=X.issuerOrigin+X.redemptionPath,b={keepalive:!0,trustToken:{type:"token-redemption",issuer:X.issuerOrigin,refreshPolicy:"none"}};Z(X.issuerOrigin,2);return window.fetch(a,b).then(function(c){if(!c.ok)throw Error(c.status+": Network response was not ok!");Z(X.issuerOrigin,6,!0)}).catch(function(c){c&&"NoModificationAllowedError"===c.name?Z(X.issuerOrigin,6,!0):Z(X.issuerOrigin,5)})} function $n(){var a=X.issuerOrigin+X.issuancePath;Z(X.issuerOrigin,8);return window.fetch(a,{keepalive:!0,trustToken:{type:"token-request"}}).then(function(b){if(!b.ok)throw Error(b.status+": Network response was not ok!");Z(X.issuerOrigin,10);return Zn()}).catch(function(b){if(b&&"NoModificationAllowedError"===b.name)return Z(X.issuerOrigin,10),Zn();Z(X.issuerOrigin,9)})}function ao(){Z(X.issuerOrigin,13);return document.hasTrustToken(X.issuerOrigin).then(function(a){return a?Zn():$n()})} function bo(){Z(Y.issuerOrigin,13);if(p.Promise){var a=document.hasTrustToken(Y.issuerOrigin).then(function(e){return e}).catch(function(e){return p.Promise.reject({state:19,error:e})}),b=Y.issuerOrigin+Y.redemptionPath,c={keepalive:!0,trustToken:{type:"token-redemption",refreshPolicy:"none"}};Z(Y.issuerOrigin,16);a=a.then(function(e){return window.fetch(b,c).then(function(f){if(!f.ok)throw Error(f.status+": Network response was not ok!");Z(Y.issuerOrigin,18,!0)}).catch(function(f){if(f&&"NoModificationAllowedError"=== f.name)Z(Y.issuerOrigin,18,!0);else{if(e)return p.Promise.reject({state:17,error:f});Z(Y.issuerOrigin,17)}})}).then(function(){return document.hasTrustToken(Y.issuerOrigin).then(function(e){return e}).catch(function(e){return p.Promise.reject({state:19,error:e})})}).then(function(e){var f=Y.issuerOrigin+Y.getStatePath;Z(Y.issuerOrigin,20);return window.fetch(f+"?ht="+e,{trustToken:{type:"send-redemption-record",issuers:[Y.issuerOrigin]}}).then(function(g){if(!g.ok)throw Error(g.status+": Network response was not ok!"); Z(Y.issuerOrigin,22);return g.text().then(function(h){return JSON.parse(h)})}).catch(function(g){return p.Promise.reject({state:21,error:g})})});var d=fd(window);return a.then(function(e){var f=Y.issuerOrigin+Y.issuancePath;return e&&e.srqt&&e.cs?(Z(Y.issuerOrigin,23),window.fetch(f+"?cs="+e.cs+"&correlator="+d,{keepalive:!0,trustToken:{type:"token-request"}}).then(function(g){if(!g.ok)throw Error(g.status+": Network response was not ok!");Z(Y.issuerOrigin,25);return e}).catch(function(g){return p.Promise.reject({state:24, error:g})})):e}).then(function(e){if(e&&e.srdt&&e.cs)return Z(Y.issuerOrigin,26),window.fetch(b+"?cs="+e.cs+"&correlator="+d,{keepalive:!0,trustToken:{type:"token-redemption",refreshPolicy:"refresh"}}).then(function(f){if(!f.ok)throw Error(f.status+": Network response was not ok!");Z(Y.issuerOrigin,28,!0)}).catch(function(f){return p.Promise.reject({state:27,error:f})})}).then(function(){Z(Y.issuerOrigin,29)}).catch(function(e){if(e instanceof Object&&e.hasOwnProperty("state")&&e.hasOwnProperty("error"))if("number"=== typeof e.state&&e.error instanceof Error){Z(Y.issuerOrigin,e.state);var f=Q(vf);Math.random()<=f&&Ff({state:e.state,err:e.error.toString()})}else throw Error(e);else throw e;})}} function co(a){if(document.hasTrustToken&&!P(tf)&&a.i){var b=window.goog_tt_promise_map;if(b&&b instanceof p.Map){var c=[];if(a.h.some(function(e){return e.issuerOrigin===X.issuerOrigin})){var d=b.get(X.issuerOrigin);d||(d=ao(),b.set(X.issuerOrigin,d));c.push(d)}a.h.some(function(e){return e.issuerOrigin===Y.issuerOrigin})&&(a=b.get(Y.issuerOrigin),a||(a=bo(),b.set(Y.issuerOrigin,a)),c.push(a));if(0<c.length&&p.Promise&&p.Promise.all)return p.Promise.all(c)}}};function eo(a){J.call(this,a,-1,fo)}v(eo,J);function go(a,b){return B(a,2,b)}function ho(a,b){return B(a,3,b)}function io(a,b){return B(a,4,b)}function jo(a,b){return B(a,5,b)}function ko(a,b){return B(a,9,b)}function lo(a,b){return Gb(a,10,b)}function mo(a,b){return B(a,11,b)}function no(a,b){return B(a,1,b)}function oo(a){J.call(this,a)}v(oo,J);oo.prototype.getVersion=function(){return I(this,2)};var fo=[10,6];var po="platform platformVersion architecture model uaFullVersion bitness fullVersionList wow64".split(" ");function qo(){var a;return null!=(a=L.google_tag_data)?a:L.google_tag_data={}} function ro(){var a,b;if("function"!==typeof(null==(a=L.navigator)?void 0:null==(b=a.userAgentData)?void 0:b.getHighEntropyValues))return null;var c=qo();if(c.uach_promise)return c.uach_promise;a=L.navigator.userAgentData.getHighEntropyValues(po).then(function(d){null!=c.uach||(c.uach=d);return d});return c.uach_promise=a} function so(a){var b;return mo(lo(ko(jo(io(ho(go(no(new eo,a.platform||""),a.platformVersion||""),a.architecture||""),a.model||""),a.uaFullVersion||""),a.bitness||""),(null==(b=a.fullVersionList)?void 0:b.map(function(c){var d=new oo;d=B(d,1,c.brand);return B(d,2,c.version)}))||[]),a.wow64||!1)} function to(){if(P(pf)){var a,b;return null!=(b=null==(a=ro())?void 0:a.then(function(f){return so(f)}))?b:null}var c,d;if("function"!==typeof(null==(c=L.navigator)?void 0:null==(d=c.userAgentData)?void 0:d.getHighEntropyValues))return null;var e;return null!=(e=L.navigator.userAgentData.getHighEntropyValues(po).then(function(f){return so(f)}))?e:null};function uo(a,b){b.google_ad_host||(a=vo(a))&&(b.google_ad_host=a)}function wo(a,b,c){c=void 0===c?"":c;L.google_sa_impl&&!L.document.getElementById("google_shimpl")&&(delete L.google_sa_queue,delete L.google_sa_impl);L.google_sa_queue||(L.google_sa_queue=[],L.google_process_slots=Xi(215,function(){return xo(L.google_sa_queue)}),a=yo(c,a,b),Lc(L.document,a).id="google_shimpl")} function xo(a){var b=a.shift();"function"===typeof b&&Wi(216,b);a.length&&w.setTimeout(Xi(215,function(){return xo(a)}),0)}function zo(a,b,c){a.google_sa_queue=a.google_sa_queue||[];a.google_sa_impl?c(b):a.google_sa_queue.push(b)} function yo(a,b,c){var d=Math.random()<Q(bf)?hc(qc(b.pb).toString()):null;b=D(c,4)?b.ob:b.qb;d=d?d:hc(qc(b).toString());b={};a:{if(D(c,4)){if(c=a||qn(L)){var e={};c=(e.client=c,e.plah=L.location.host,e);break a}throw Error("PublisherCodeNotFoundForAma");}c={}}Ao(c,b);a:{if(P($e)||P(Oe)){a=a||qn(L);var f;var g=(c=null==(g=U(L))?void 0:null==(f=g.head_tag_slot_vars)?void 0:f.google_ad_host)?c:vo(L);if(a){f={};g=(f.client=a,f.plah=L.location.host,f.ama_t="adsense",f.asntp=Q(Ge),f.asntpv=Q(Ke),f.asntpl= Q(Ie),f.asntpm=Q(Je),f.asntpc=Q(He),f.asna=Q(Ce),f.asnd=Q(De),f.asnp=Q(Ee),f.asns=Q(Fe),f.asmat=Q(Be),f.asptt=Q(Le),f.easpi=P($e),f.asro=P(Me),f.host=g,f.easai=P(Ze),f);break a}}g={}}Ao(g,b);Ao(zf()?{bust:zf()}:{},b);return ec(d,b)}function Ao(a,b){Sc(a,function(c,d){void 0===b[d]&&(b[d]=c)})}function vo(a){if(a=a.document.querySelector('meta[name="google-adsense-platform-account"]'))return a.getAttribute("content")} function Bo(a){a:{var b=void 0===b?!1:b;var c=void 0===c?1024:c;for(var d=[w.top],e=[],f=0,g;g=d[f++];){b&&!Hc(g)||e.push(g);try{if(g.frames)for(var h=0;h<g.frames.length&&d.length<c;++h)d.push(g.frames[h])}catch(l){}}for(b=0;b<e.length;b++)try{var k=e[b].frames.google_esf;if(k){id=k;break a}}catch(l){}id=null}if(id)return null;e=Mc("IFRAME");e.id="google_esf";e.name="google_esf";e.src=sc(a.vb);e.style.display="none";return e} function Co(a,b,c,d){Do(a,b,c,d,function(e,f){e=e.document;for(var g=void 0,h=0;!g||e.getElementById(g+"_anchor");)g="aswift_"+h++;e=g;g=Number(f.google_ad_width||0);f=Number(f.google_ad_height||0);h=Mc("INS");h.id=e+"_anchor";pm(h,g,f);h.style.display="block";var k=Mc("INS");k.id=e+"_expand";pm(k,g,f);k.style.display="inline-table";k.appendChild(h);c.appendChild(k);return e})} function Do(a,b,c,d,e){e=e(a,b);Eo(a,c,b);c=Ia;var f=(new Date).getTime();b.google_lrv=I(d,2);b.google_async_iframe_id=e;b.google_start_time=c;b.google_bpp=f>c?f-c:1;a.google_sv_map=a.google_sv_map||{};a.google_sv_map[e]=b;d=a.document.getElementById(e+"_anchor")?function(h){return h()}:function(h){return window.setTimeout(h,0)};var g={pubWin:a,vars:b};zo(a,function(){var h=a.google_sa_impl(g);h&&h.catch&&Zi(911,h)},d)} function Eo(a,b,c){var d=c.google_ad_output,e=c.google_ad_format,f=c.google_ad_width||0,g=c.google_ad_height||0;e||"html"!=d&&null!=d||(e=f+"x"+g);d=!c.google_ad_slot||c.google_override_format||!qm[c.google_ad_width+"x"+c.google_ad_height]&&"aa"==c.google_loader_used;e&&d?e=e.toLowerCase():e="";c.google_ad_format=e;if("number"!==typeof c.google_reactive_sra_index||!c.google_ad_unit_key){e=[c.google_ad_slot,c.google_orig_ad_format||c.google_ad_format,c.google_ad_type,c.google_orig_ad_width||c.google_ad_width, c.google_orig_ad_height||c.google_ad_height];d=[];f=0;for(g=b;g&&25>f;g=g.parentNode,++f)9===g.nodeType?d.push(""):d.push(g.id);(d=d.join())&&e.push(d);c.google_ad_unit_key=Tc(e.join(":")).toString();var h=void 0===h?!1:h;e=[];for(d=0;b&&25>d;++d){f="";void 0!==h&&h||(f=(f=9!==b.nodeType&&b.id)?"/"+f:"");a:{if(b&&b.nodeName&&b.parentElement){g=b.nodeName.toString().toLowerCase();for(var k=b.parentElement.childNodes,l=0,m=0;m<k.length;++m){var q=k[m];if(q.nodeName&&q.nodeName.toString().toLowerCase()=== g){if(b===q){g="."+l;break a}++l}}}g=""}e.push((b.nodeName&&b.nodeName.toString().toLowerCase())+f+g);b=b.parentElement}h=e.join()+":";b=[];if(a)try{var t=a.parent;for(e=0;t&&t!==a&&25>e;++e){var y=t.frames;for(d=0;d<y.length;++d)if(a===y[d]){b.push(d);break}a=t;t=a.parent}}catch(F){}c.google_ad_dom_fingerprint=Tc(h+b.join()).toString()}}function Fo(){var a=Ic(w);a&&(a=Uf(a),a.tagSpecificState[1]||(a.tagSpecificState[1]={debugCard:null,debugCardRequested:!1}))} function Go(a){Xn();Yn(Wk(),I(a,8))||Xi(779,function(){var b=window;b=void 0===b?window:b;b=P(b.PeriodicSyncManager?rf:sf);var c=P(uf);b=new Vn(!0,b,c);0<Q(xf)?L.google_trust_token_operation_promise=co(b):co(b)})();a=to();null!=a&&a.then(function(b){L.google_user_agent_client_hint=Lb(b)});wn();un()};function Ho(a,b){switch(a){case "google_reactive_ad_format":return a=parseInt(b,10),isNaN(a)?0:a;case "google_allow_expandable_ads":return/^true$/.test(b);default:return b}} function Io(a,b){if(a.getAttribute("src")){var c=a.getAttribute("src")||"";(c=Gc(c))&&(b.google_ad_client=Ho("google_ad_client",c))}a=a.attributes;c=a.length;for(var d=0;d<c;d++){var e=a[d];if(/data-/.test(e.name)){var f=Ja(e.name.replace("data-matched-content","google_content_recommendation").replace("data","google").replace(/-/g,"_"));b.hasOwnProperty(f)||(e=Ho(f,e.value),null!==e&&(b[f]=e))}}} function Jo(a){if(a=ld(a))switch(a.data&&a.data.autoFormat){case "rspv":return 13;case "mcrspv":return 15;default:return 14}else return 12} function Ko(a,b,c,d){Io(a,b);if(c.document&&c.document.body&&!Zm(c,b)&&!b.google_reactive_ad_format){var e=parseInt(a.style.width,10),f=cn(a,c);if(0<f&&e>f){var g=parseInt(a.style.height,10);e=!!qm[e+"x"+g];var h=f;if(e){var k=rm(f,g);if(k)h=k,b.google_ad_format=k+"x"+g+"_0ads_al";else throw new T("No slot size for availableWidth="+f);}b.google_ad_resize=!0;b.google_ad_width=h;e||(b.google_ad_format=null,b.google_override_format=!0);f=h;a.style.width=f+"px";g=Tm(f,"auto",c,a,b);h=f;g.size().i(c,b, a);Dm(g,h,b);g=g.size();b.google_responsive_formats=null;g.minWidth()>f&&!e&&(b.google_ad_width=g.minWidth(),a.style.width=g.minWidth()+"px")}}e=a.offsetWidth||xi(a,c,"width",K)||b.google_ad_width||0;f=Fa(Tm,e,"auto",c,a,b,!1,!0);if(!P(Xe)&&488>Wf(c)){g=Ic(c)||c;h=b.google_ad_client;d=g.location&&"#ftptohbh"===g.location.hash?2:yl(g.location,"google_responsive_slot_preview")||P(ef)?1:P(df)?2:Yk(g,1,h,d)?1:0;if(g=0!==d)b:if(b.google_reactive_ad_format||Zm(c,b)||mi(a,b))g=!1;else{for(g=a;g;g=g.parentElement){h= Nc(g,c);if(!h){b.gfwrnwer=18;g=!1;break b}if(!Xa(["static","relative"],h.position)){b.gfwrnwer=17;g=!1;break b}}g=qi(c,a,e,.3,b);!0!==g?(b.gfwrnwer=g,g=!1):g=c===c.top?!0:!1}g?(b.google_resizing_allowed=!0,b.ovlp=!0,2===d?(d={},Dm(f(),e,d),b.google_resizing_width=d.google_ad_width,b.google_resizing_height=d.google_ad_height,b.iaaso=!1):(b.google_ad_format="auto",b.iaaso=!0,b.armr=1),d=!0):d=!1}else d=!1;if(e=Zm(c,b))an(e,a,b,c,d);else{if(mi(a,b)){if(d=Nc(a,c))a.style.width=d.width,a.style.height= d.height,li(d,b);b.google_ad_width||(b.google_ad_width=a.offsetWidth);b.google_ad_height||(b.google_ad_height=a.offsetHeight);b.google_loader_features_used=256;b.google_responsive_auto_format=Jo(c)}else li(a.style,b);c.location&&"#gfwmrp"==c.location.hash||12==b.google_responsive_auto_format&&"true"==b.google_full_width_responsive?an(10,a,b,c,!1):.01>Math.random()&&12===b.google_responsive_auto_format&&(a=ri(a.offsetWidth||parseInt(a.style.width,10)||b.google_ad_width,c,a,b),!0!==a?(b.efwr=!1,b.gfwrnwer= a):b.efwr=!0)}};function Lo(a){this.j=new p.Set;this.u=md()||window;this.h=Q(ze);var b=0<this.h&&Rc()<1/this.h;this.A=(this.i=!!Hj(Dj(),30,b))?fd(this.u):0;this.m=this.i?qn(this.u):"";this.l=null!=a?a:new yg(100)}function Mo(){var a=O(Lo);var b=new qk;b=B(b,1,Vf(a.u).scrollWidth);b=B(b,2,Vf(a.u).scrollHeight);var c=new qk;c=B(c,1,Wf(a.u));c=B(c,2,Vf(a.u).clientHeight);var d=new sk;d=B(d,1,a.A);d=B(d,2,a.m);d=B(d,3,a.h);var e=new rk;b=Eb(e,2,b);b=Eb(b,1,c);b=Fb(d,4,tk,b);a.i&&!a.j.has(1)&&(a.j.add(1),ug(a.l,b))};function No(a){var b=window;var c=void 0===c?null:c;xc(b,"message",function(d){try{var e=JSON.parse(d.data)}catch(f){return}!e||"sc-cnf"!==e.googMsgType||c&&/[:|%3A]javascript\(/i.test(d.data)&&!c(e,d)||a(e,d)})};function Oo(a,b){b=void 0===b?500:b;Mj.call(this);this.i=a;this.ta=b;this.h=null;this.m={};this.l=null}v(Oo,Mj);Oo.prototype.j=function(){this.m={};this.l&&(yc(this.i,this.l),delete this.l);delete this.m;delete this.i;delete this.h;Mj.prototype.j.call(this)};function Po(a){Mj.call(this);this.h=a;this.i=null;this.l=!1}v(Po,Mj);var Qo=null,Ro=[],So=new p.Map,To=-1;function Uo(a){return Fi.test(a.className)&&"done"!=a.dataset.adsbygoogleStatus}function Vo(a,b,c){a.dataset.adsbygoogleStatus="done";Wo(a,b,c)} function Wo(a,b,c){var d=window;d.google_spfd||(d.google_spfd=Ko);var e=b.google_reactive_ads_config;e||Ko(a,b,d,c);uo(d,b);if(!Xo(a,b,d)){e||(d.google_lpabyc=ni(a,d)+xi(a,d,"height",K));if(e){e=e.page_level_pubvars||{};if(U(L).page_contains_reactive_tag&&!U(L).allow_second_reactive_tag){if(e.pltais){wl(!1);return}throw new T("Only one 'enable_page_level_ads' allowed per page.");}U(L).page_contains_reactive_tag=!0;wl(7===e.google_pgb_reactive)}b.google_unique_id=od(d);Sc(mn,function(f,g){b[g]=b[g]|| d[g]});b.google_loader_used="aa";b.google_reactive_tag_first=1===(U(L).first_tag_on_page||0);Wi(164,function(){Co(d,b,a,c)})}} function Xo(a,b,c){var d=b.google_reactive_ads_config,e="string"===typeof a.className&&RegExp("(\\W|^)adsbygoogle-noablate(\\W|$)").test(a.className),f=ul(c);if(f&&f.Fa&&"on"!=b.google_adtest&&!e){e=ni(a,c);var g=Vf(c).clientHeight;if(!f.qa||f.qa&&((0==g?null:e/g)||0)>=f.qa)return a.className+=" adsbygoogle-ablated-ad-slot",c=c.google_sv_map=c.google_sv_map||{},d=za(a),b.google_element_uid=d,c[b.google_element_uid]=b,a.setAttribute("google_element_uid",d),"slot"==f.tb&&(null!==Zc(a.getAttribute("width"))&& a.setAttribute("width",0),null!==Zc(a.getAttribute("height"))&&a.setAttribute("height",0),a.style.width="0px",a.style.height="0px"),!0}if((f=Nc(a,c))&&"none"==f.display&&!("on"==b.google_adtest||0<b.google_reactive_ad_format||d))return c.document.createComment&&a.appendChild(c.document.createComment("No ad requested because of display:none on the adsbygoogle tag")),!0;a=null==b.google_pgb_reactive||3===b.google_pgb_reactive;return 1!==b.google_reactive_ad_format&&8!==b.google_reactive_ad_format|| !a?!1:(w.console&&w.console.warn("Adsbygoogle tag with data-reactive-ad-format="+b.google_reactive_ad_format+" is deprecated. Check out page-level ads at https://www.google.com/adsense"),!0)}function Yo(a){var b=document.getElementsByTagName("INS");for(var c=0,d=b[c];c<b.length;d=b[++c]){var e=d;if(Uo(e)&&"reserved"!=e.dataset.adsbygoogleStatus&&(!a||d.id==a))return d}return null} function Zo(a,b,c){if(a&&a.shift)for(var d=20;0<a.length&&0<d;){try{$o(a.shift(),b,c)}catch(e){setTimeout(function(){throw e;})}--d}}function ap(){var a=Mc("INS");a.className="adsbygoogle";a.className+=" adsbygoogle-noablate";bd(a);return a} function bp(a,b){var c={};Sc(Rf,function(f,g){!1===a.enable_page_level_ads?c[g]=!1:a.hasOwnProperty(g)&&(c[g]=a[g])});ya(a.enable_page_level_ads)&&(c.page_level_pubvars=a.enable_page_level_ads);var d=ap();hd.body.appendChild(d);var e={};e=(e.google_reactive_ads_config=c,e.google_ad_client=a.google_ad_client,e);e.google_pause_ad_requests=!!U(L).pause_ad_requests;Vo(d,e,b)} function cp(a,b){function c(){return bp(a,b)}Uf(w).wasPlaTagProcessed=!0;var d=w.document;if(d.body||"complete"==d.readyState||"interactive"==d.readyState)c();else{var e=wc(Xi(191,c));xc(d,"DOMContentLoaded",e);(new w.MutationObserver(function(f,g){d.body&&(e(),g.disconnect())})).observe(d,{childList:!0,subtree:!0})}} function $o(a,b,c){var d={};Wi(165,function(){dp(a,d,b,c)},function(e){e.client=e.client||d.google_ad_client||a.google_ad_client;e.slotname=e.slotname||d.google_ad_slot;e.tag_origin=e.tag_origin||d.google_tag_origin})}function ep(a){delete a.google_checked_head;Sc(a,function(b,c){Ei[c]||(delete a[c],w.console.warn("AdSense head tag doesn't support "+c.replace("google","data").replace(/_/g,"-")+" attribute."))})} function fp(a,b){var c=L.document.querySelector('script[src*="/pagead/js/adsbygoogle.js?client="]:not([data-checked-head])')||L.document.querySelector('script[src*="/pagead/js/adsbygoogle.js"][data-ad-client]:not([data-checked-head])');if(c){c.setAttribute("data-checked-head","true");var d=U(window);if(d.head_tag_slot_vars)gp(c);else{var e={};Io(c,e);ep(e);var f=$b(e);d.head_tag_slot_vars=f;c={google_ad_client:e.google_ad_client,enable_page_level_ads:e};L.adsbygoogle||(L.adsbygoogle=[]);d=L.adsbygoogle; d.loaded?d.push(c):d.splice(0,0,c);var g;e.google_adbreak_test||(null==(g=Ib(b,Fk,13,Uk))?0:D(g,3))&&P(jf)?hp(f,a):No(function(){hp(f,a)})}}}function gp(a){var b=U(window).head_tag_slot_vars,c=a.getAttribute("src")||"";if((a=Gc(c)||a.getAttribute("data-ad-client")||"")&&a!==b.google_ad_client)throw new T("Warning: Do not add multiple property codes with AdSense tag to avoid seeing unexpected behavior. These codes were found on the page "+a+", "+b.google_ad_client);} function ip(a){if("object"===typeof a&&null!=a){if("string"===typeof a.type)return 2;if("string"===typeof a.sound||"string"===typeof a.preloadAdBreaks)return 3}return 0} function dp(a,b,c,d){if(null==a)throw new T("push() called with no parameters.");14===Cb(d,Uk)&&jp(a,wb(Tk(d),1),I(d,2));var e=ip(a);if(0!==e)P(af)&&(d=xl(),d.first_slotcar_request_processing_time||(d.first_slotcar_request_processing_time=Date.now(),d.adsbygoogle_execution_start_time=Ia)),null==Qo?(kp(a),Ro.push(a)):3===e?Wi(787,function(){Qo.handleAdConfig(a)}):Zi(730,Qo.handleAdBreak(a));else{Ia=(new Date).getTime();wo(c,d,lp(a));mp();a:{if(void 0!=a.enable_page_level_ads){if("string"===typeof a.google_ad_client){e= !0;break a}throw new T("'google_ad_client' is missing from the tag config.");}e=!1}if(e)np(a,d);else if((e=a.params)&&Sc(e,function(g,h){b[h]=g}),"js"===b.google_ad_output)console.warn("Ads with google_ad_output='js' have been deprecated and no longer work. Contact your AdSense account manager or switch to standard AdSense ads.");else{e=op(a.element);Io(e,b);c=U(w).head_tag_slot_vars||{};Sc(c,function(g,h){b.hasOwnProperty(h)||(b[h]=g)});if(e.hasAttribute("data-require-head")&&!U(w).head_tag_slot_vars)throw new T("AdSense head tag is missing. AdSense body tags don't work without the head tag. You can copy the head tag from your account on https://adsense.com."); if(!b.google_ad_client)throw new T("Ad client is missing from the slot.");b.google_apsail=dl(b.google_ad_client);var f=(c=0===(U(L).first_tag_on_page||0)&&Fl(b))&&Gl(c);c&&!f&&(np(c,d),U(L).skip_next_reactive_tag=!0);0===(U(L).first_tag_on_page||0)&&(U(L).first_tag_on_page=2);b.google_pause_ad_requests=!!U(L).pause_ad_requests;Vo(e,b,d);c&&f&&pp(c)}}}var qp=!1;function jp(a,b,c){P(Ye)&&!qp&&(qp=!0,a=lp(a)||qn(L),Yi("predictive_abg",{a_c:a,p_c:b,b_v:c},.01))} function lp(a){return a.google_ad_client?a.google_ad_client:(a=a.params)&&a.google_ad_client?a.google_ad_client:""}function mp(){if(P(Re)){var a=ul(L);if(!(a=a&&a.Fa)){try{var b=L.localStorage}catch(c){b=null}b=b?zj(b):null;a=!(b&&Ck(b)&&b)}a||vl(L,1)}}function pp(a){gd(function(){Uf(w).wasPlaTagProcessed||w.adsbygoogle&&w.adsbygoogle.push(a)})} function np(a,b){if(U(L).skip_next_reactive_tag)U(L).skip_next_reactive_tag=!1;else{0===(U(L).first_tag_on_page||0)&&(U(L).first_tag_on_page=1);if(a.tag_partner){var c=a.tag_partner,d=U(w);d.tag_partners=d.tag_partners||[];d.tag_partners.push(c)}U(L).ama_ran_on_page||Il(new Hl(a,b));cp(a,b)}} function op(a){if(a){if(!Uo(a)&&(a.id?a=Yo(a.id):a=null,!a))throw new T("'element' has already been filled.");if(!("innerHTML"in a))throw new T("'element' is not a good DOM element.");}else if(a=Yo(),!a)throw new T("All ins elements in the DOM with class=adsbygoogle already have ads in them.");return a} function rp(){var a=new Oj(L),b=new Oo(L),c=new Po(L),d=L.__cmp?1:0;a=Pj(a)?1:0;var e,f;(f="function"===typeof(null==(e=b.i)?void 0:e.__uspapi))||(b.h?b=b.h:(b.h=$c(b.i,"__uspapiLocator"),b=b.h),f=null!=b);c.l||(c.i||(c.i=c.h.googlefc?c.h:$c(c.h,"googlefcPresent")),c.l=!0);Yi("cmpMet",{tcfv1:d,tcfv2:a,usp:f?1:0,fc:c.i?1:0,ptt:9},Q(ye))}function sp(a){a={value:D(a,16)};var b=.01;Q(Te)&&(a.eid=Q(Te),b=1);a.frequency=b;Yi("new_abg_tag",a,b)}function tp(a){Dj().S[Fj(26)]=!!Number(a)} function up(a){Number(a)?U(L).pause_ad_requests=!0:(U(L).pause_ad_requests=!1,a=function(){if(!U(L).pause_ad_requests){var b=void 0===b?{}:b;if("function"===typeof window.CustomEvent)var c=new CustomEvent("adsbygoogle-pub-unpause-ad-requests-event",b);else c=document.createEvent("CustomEvent"),c.initCustomEvent("adsbygoogle-pub-unpause-ad-requests-event",!!b.bubbles,!!b.cancelable,b.detail);L.dispatchEvent(c)}},w.setTimeout(a,0),w.setTimeout(a,1E3))} function vp(a){Yi("adsenseGfpKnob",{value:a,ptt:9},.1);switch(a){case 0:case 2:a=!0;break;case 1:a=!1;break;default:throw Error("Illegal value of cookieOptions: "+a);}L._gfp_a_=a}function wp(a){a&&a.call&&"function"===typeof a&&window.setTimeout(a,0)} function hp(a,b){b=Dl(ec(hc(qc(b.sb).toString()),zf()?{bust:zf()}:{})).then(function(c){null==Qo&&(c.init(a),Qo=c,xp())});Zi(723,b);r(b,"finally").call(b,function(){Ro.length=0;Yi("slotcar",{event:"api_ld",time:Date.now()-Ia,time_pr:Date.now()-To})})} function xp(){for(var a=u(r(So,"keys").call(So)),b=a.next();!b.done;b=a.next()){b=b.value;var c=So.get(b);-1!==c&&(w.clearTimeout(c),So.delete(b))}a={};for(b=0;b<Ro.length;a={fa:a.fa,ba:a.ba},b++)So.has(b)||(a.ba=Ro[b],a.fa=ip(a.ba),Wi(723,function(d){return function(){3===d.fa?Qo.handleAdConfig(d.ba):2===d.fa&&Zi(730,Qo.handleAdBreakBeforeReady(d.ba))}}(a)))} function kp(a){var b=Ro.length;if(2===ip(a)&&"preroll"===a.type&&null!=a.adBreakDone){-1===To&&(To=Date.now());var c=w.setTimeout(function(){try{(0,a.adBreakDone)({breakType:"preroll",breakName:a.name,breakFormat:"preroll",breakStatus:"timeout"}),So.set(b,-1),Yi("slotcar",{event:"pr_to",source:"adsbygoogle"})}catch(d){console.error("[Ad Placement API] adBreakDone callback threw an error:",d instanceof Error?d:Error(String(d)))}},1E3*Q(kf));So.set(b,c)}} function yp(){if(P(Ne)&&!P(Me)){var a=L.document,b=a.createElement("LINK"),c=nd(Ml);if(c instanceof cc||c instanceof mc)b.href=sc(c);else{if(-1===tc.indexOf("stylesheet"))throw Error('TrustedResourceUrl href attribute required with rel="stylesheet"');b.href=rc(c)}b.rel="stylesheet";a.head.appendChild(b)}};(function(a,b,c,d){d=void 0===d?function(){}:d;Ui.Ua($i);Wi(166,function(){var e=sn(b);jn(I(e,2));Xk(D(e,6));d();kd(16,[1,e.toJSON()]);var f=md(ld(L))||L,g=c(kn({eb:a,nb:I(e,2)}),e);P(cf)&&al(f,e);om(f,e,null===L.document.currentScript?1:Ol(g.ub));Mo();if((!Na()||0<=Ka(Qa(),11))&&(null==(L.Prototype||{}).Version||!P(We))){Vi(P(qf));Go(e);ok();try{Mn()}catch(q){}Fo();fp(g,e);f=window;var h=f.adsbygoogle;if(!h||!h.loaded){if(P(Se)&&!D(e,16))try{if(L.document.querySelector('script[src*="/pagead/js/adsbygoogle.js?client="]'))return}catch(q){}yp(); sp(e);Q(ye)&&rp();var k={push:function(q){$o(q,g,e)},loaded:!0};try{Object.defineProperty(k,"requestNonPersonalizedAds",{set:tp}),Object.defineProperty(k,"pauseAdRequests",{set:up}),Object.defineProperty(k,"cookieOptions",{set:vp}),Object.defineProperty(k,"onload",{set:wp})}catch(q){}if(h)for(var l=u(["requestNonPersonalizedAds","pauseAdRequests","cookieOptions"]),m=l.next();!m.done;m=l.next())m=m.value,void 0!==h[m]&&(k[m]=h[m]);"_gfp_a_"in window||(window._gfp_a_=!0);Zo(h,g,e);f.adsbygoogle=k;h&& (k.onload=h.onload);(f=Bo(g))&&document.documentElement.appendChild(f)}}})})("m202204040101",rn,function(a,b){var c=2012<C(b,1,0)?"_fy"+C(b,1,0):"",d=I(b,3),e=I(b,2);b=nd(dn,a,c);d=nd(en,e,d);return{sb:b,qb:nd(fn,a,c),ob:nd(gn,a,c),pb:nd(hn,a,c),vb:d,ub:/^(?:https?:)?\/\/(?:pagead2\.googlesyndication\.com|securepubads\.g\.doubleclick\.net)\/pagead\/(?:js\/)?(?:show_ads|adsbygoogle)\.js(?:[?#].*)?$/}}); }).call(this,"[2019,\"r20220406\",\"r20190131\",null,null,null,null,\".google.co.uz\",null,null,null,[[[1082,null,null,[1]],[null,62,null,[null,0.001]],[383,null,null,[1]],[null,1130,null,[null,100]],[null,1126,null,[null,5000]],[1132,null,null,[1]],[1131,null,null,[1]],[null,1142,null,[null,2]],[null,1165,null,[null,1000]],[null,1114,null,[null,1]],[null,1116,null,[null,300]],[null,1117,null,[null,100]],[null,1115,null,[null,1]],[null,1159,null,[null,500]],[1145,null,null,[1]],[1021,null,null,[1]],[null,66,null,[null,-1]],[null,65,null,[null,-1]],[1087,null,null,[1]],[1053,null,null,[1]],[1100,null,null,[1]],[1102,null,null,[1]],[1149,null,null,[1]],[null,1072,null,[null,0.75]],[1101,null,null,[1]],[1036,null,null,[1]],[null,1085,null,[null,5]],[null,63,null,[null,30]],[null,1080,null,[null,5]],[1054,null,null,[1]],[null,1027,null,[null,10]],[null,57,null,[null,120]],[null,1079,null,[null,5]],[null,1050,null,[null,30]],[null,58,null,[null,120]],[381914117,null,null,[1]],[null,null,null,[null,null,null,[\"A8FHS1NmdCwGqD9DwOicnHHY+y27kdWfxKa0YHSGDfv0CSpDKRHTQdQmZVPDUdaFWUsxdgVxlwAd6o+dhJykPA0AAACWeyJvcmlnaW4iOiJodHRwczovL2RvdWJsZWNsaWNrLm5ldDo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjQzMTU1MTk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlLCJ1c2FnZSI6InN1YnNldCJ9\",\"A8zdXi6dr1hwXEUjQrYiyYQGlU3557y5QWDnN0Lwgj9ePt66XMEvNkVWOEOWPd7TP9sBQ25X0Q15Lr1Nn4oGFQkAAACceyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXN5bmRpY2F0aW9uLmNvbTo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjQzMTU1MTk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlLCJ1c2FnZSI6InN1YnNldCJ9\",\"A4\/Htern2udN9w3yJK9QgWQxQFruxOXsXL7cW60DyCl0EZFGCSme\/J33Q\/WzF7bBkVvhEWDlcBiUyZaim5CpFQwAAACceyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXRhZ3NlcnZpY2VzLmNvbTo0NDMiLCJmZWF0dXJlIjoiQ29udmVyc2lvbk1lYXN1cmVtZW50IiwiZXhwaXJ5IjoxNjQzMTU1MTk5LCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlLCJ1c2FnZSI6InN1YnNldCJ9\"]],null,1934],[1953,null,null,[1]],[1947,null,null,[1]],[434462125,null,null,[1]],[1938,null,null,[1]],[1948,null,null,[1]],[392736476,null,null,[1]],[null,null,null,[null,null,null,[\"AxujKG9INjsZ8\/gUq8+dTruNvk7RjZQ1oFhhgQbcTJKDnZfbzSTE81wvC2Hzaf3TW4avA76LTZEMdiedF1vIbA4AAABueyJvcmlnaW4iOiJodHRwczovL2ltYXNkay5nb29nbGVhcGlzLmNvbTo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2NTI3NzQ0MDAsImlzVGhpcmRQYXJ0eSI6dHJ1ZX0=\",\"Azuce85ORtSnWe1MZDTv68qpaW3iHyfL9YbLRy0cwcCZwVnePnOmkUJlG8HGikmOwhZU22dElCcfrfX2HhrBPAkAAAB7eyJvcmlnaW4iOiJodHRwczovL2RvdWJsZWNsaWNrLm5ldDo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2NTI3NzQ0MDAsImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9\",\"A16nvcdeoOAqrJcmjLRpl1I6f3McDD8EfofAYTt\/P\/H4\/AWwB99nxiPp6kA0fXoiZav908Z8etuL16laFPUdfQsAAACBeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXRhZ3NlcnZpY2VzLmNvbTo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2NTI3NzQ0MDAsImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9\",\"AxBHdr0J44vFBQtZUqX9sjiqf5yWZ\/OcHRcRMN3H9TH+t90V\/j3ENW6C8+igBZFXMJ7G3Pr8Dd13632aLng42wgAAACBeyJvcmlnaW4iOiJodHRwczovL2dvb2dsZXN5bmRpY2F0aW9uLmNvbTo0NDMiLCJmZWF0dXJlIjoiVHJ1c3RUb2tlbnMiLCJleHBpcnkiOjE2NTI3NzQ0MDAsImlzU3ViZG9tYWluIjp0cnVlLCJpc1RoaXJkUGFydHkiOnRydWV9\",\"A88BWHFjcawUfKU3lIejLoryXoyjooBXLgWmGh+hNcqMK44cugvsI5YZbNarYvi3roc1fYbHA1AVbhAtuHZflgEAAAB2eyJvcmlnaW4iOiJodHRwczovL2dvb2dsZS5jb206NDQzIiwiZmVhdHVyZSI6IlRydXN0VG9rZW5zIiwiZXhwaXJ5IjoxNjUyNzc0NDAwLCJpc1N1YmRvbWFpbiI6dHJ1ZSwiaXNUaGlyZFBhcnR5Ijp0cnVlfQ==\"]],null,1932],[null,397907552,null,[null,500]],[432938498,null,null,[1]]],[[10,[[1,[[21066108],[21066109,[[316,null,null,[1]]]]],null,null,null,34,18,1],[1,[[21066110],[21066111]],null,null,null,34,18,1],[1,[[42530528],[42530529,[[368,null,null,[1]]]],[42530530,[[369,null,null,[1]],[368,null,null,[1]]]]]],[1,[[42531496],[42531497,[[1161,null,null,[1]]]]]],[1,[[42531513],[42531514,[[316,null,null,[1]]]]]],[1,[[44719338],[44719339,[[334,null,null,[1]],[null,54,null,[null,100]],[null,66,null,[null,10]],[null,65,null,[null,1000]]]]]],[200,[[44760474],[44760475,[[1129,null,null,[1]]]]]],[10,[[44760911],[44760912,[[1160,null,null,[1]]]]]],[100,[[44761043],[44761044]]],[1,[[44752536,[[1122,null,null,[1]],[1033,null,null,[1]]]],[44753656]]],[null,[[44755592],[44755593,[[1122,null,null,[1]],[1033,null,null,[1]]]],[44755594,[[1122,null,null,[1]],[1033,null,null,[1]]]],[44755653,[[1122,null,null,[1]],[1033,null,null,[1]]]]]],[10,[[44762453],[44762454,[[1122,null,null,[1]],[1033,null,null,[1]]]]]],[20,[[182982000,[[218,null,null,[1]]],[1,[[12,null,null,null,2,null,\"\\\\.wiki(dogs|how)(-fun)?\\\\.\"]]]],[182982100,[[217,null,null,[1]]],[1,[[12,null,null,null,2,null,\"\\\\.wiki(dogs|how)(-fun)?\\\\.\"]]]]],null,null,null,36,8,1],[20,[[182982200,null,[1,[[12,null,null,null,2,null,\"\\\\.wiki(dogs|how)(-fun)?\\\\.\"]]]],[182982300,null,[1,[[12,null,null,null,2,null,\"\\\\.wiki(dogs|how)(-fun)?\\\\.\"]]]]],null,null,null,36,8,1],[10,[[182984000,null,[4,null,23,null,null,null,null,[\"1\"]]],[182984100,[[218,null,null,[1]]],[4,null,23,null,null,null,null,[\"1\"]]]],null,null,null,36,10,101],[10,[[182984200,null,[4,null,23,null,null,null,null,[\"1\"]]],[182984300,null,[4,null,23,null,null,null,null,[\"1\"]]]],null,null,null,36,10,101],[10,[[21066428],[21066429]]],[10,[[21066430],[21066431],[21066432],[21066433]],null,null,null,44,22],[10,[[21066434],[21066435]],null,null,null,44,null,500],[10,[[31065342],[31065343,[[1147,null,null,[1]]]]]],[50,[[31065544],[31065545,[[1154,null,null,[1]]]]]],[50,[[31065741],[31065742,[[1134,null,null,[1]]]]]],[1,[[31065944,[[null,1103,null,[null,31065944]],[1121,null,null,[1]],[null,1119,null,[null,300]]]],[31065945,[[null,1103,null,[null,31065945]],[1121,null,null,[1]],[1143,null,null,[1]],[null,1119,null,[null,300]]]],[31065946,[[null,1103,null,[null,31065946]],[1121,null,null,[1]],[null,1119,null,[null,300]],[1120,null,null,[1]]]],[31065950,[[null,1103,null,[null,31065950]],[null,1114,null,[null,0.9]],[null,1112,null,[null,5]],[null,1113,null,[null,5]],[null,1104,null,[null,100]],[null,1115,null,[null,0.8]],[1121,null,null,[1]],[null,1119,null,[null,300]],[1120,null,null,[1]]]],[31065951,[[null,1103,null,[null,31065951]],[null,1114,null,[null,0.9]],[null,1110,null,[null,1]],[null,1104,null,[null,100]],[null,1115,null,[null,0.8]],[1121,null,null,[1]],[null,1119,null,[null,300]],[1120,null,null,[1]]]],[31065952,[[null,1103,null,[null,31065952]],[null,1114,null,[null,0.9]],[null,1110,null,[null,5]],[null,1104,null,[null,100]],[null,1115,null,[null,0.8]],[1121,null,null,[1]],[null,1119,null,[null,300]],[1120,null,null,[1]]]],[31065953,[[null,1103,null,[null,31065953]],[null,1114,null,[null,0.9]],[null,1110,null,[null,5]],[null,1111,null,[null,5]],[null,1112,null,[null,5]],[null,1113,null,[null,5]],[null,1104,null,[null,100]],[null,1115,null,[null,0.8]],[1121,null,null,[1]],[null,1119,null,[null,300]],[1120,null,null,[1]]]],[44762492,[[null,1103,null,[null,44762492]],[null,1114,null,[null,0.9]],[null,1104,null,[null,100]],[null,1106,null,[null,10]],[null,1107,null,[null,10]],[null,1105,null,[null,10]],[null,1115,null,[null,-1]],[1121,null,null,[1]],[null,1119,null,[null,300]],[1120,null,null,[1]]]]],[6,null,null,3,null,2],49],[1,[[31066496,[[null,1103,null,[null,31066496]],[1121,null,null,[1]],[null,1119,null,[null,300]]]],[31066497,[[null,1158,null,[null,45]],[null,1157,null,[null,400]],[null,1103,null,[null,31066497]],[null,1114,null,[null,-1]],[null,1104,null,[null,100]],[null,1106,null,[null,10]],[null,1107,null,[null,10]],[null,1105,null,[null,10]],[null,1115,null,[null,-1]],[1121,null,null,[1]],[null,1119,null,[null,300]],[1162,null,null,[1]],[1155,null,null,[1]],[1120,null,null,[1]]]]],null,49],[1000,[[31067051,[[null,null,14,[null,null,\"31067051\"]]],[6,null,null,null,6,null,\"31067051\"]],[31067052,[[null,null,14,[null,null,\"31067052\"]]],[6,null,null,null,6,null,\"31067052\"]]],[4,null,55]],[1000,[[31067063,[[null,null,14,[null,null,\"31067063\"]]],[6,null,null,null,6,null,\"31067063\"]],[31067064,[[null,null,14,[null,null,\"31067064\"]]],[6,null,null,null,6,null,\"31067064\"]]],[4,null,55]],[10,[[31067067],[31067068,[[1148,null,null,[1]]]]]],[1000,[[31067083,[[null,null,14,[null,null,\"31067083\"]]],[6,null,null,null,6,null,\"31067083\"]],[31067084,[[null,null,14,[null,null,\"31067084\"]]],[6,null,null,null,6,null,\"31067084\"]]],[4,null,55]],[1,[[44736076],[44736077,[[null,1046,null,[null,0.1]]]]]],[1,[[44761631,[[null,1103,null,[null,44761631]]]],[44761632,[[null,1103,null,[null,44761632]],[1143,null,null,[1]]]],[44761633,[[null,1142,null,[null,2]],[null,1103,null,[null,44761633]],[null,1119,null,[null,300]],[1120,null,null,[1]]]],[44761634,[[null,1142,null,[null,2]],[null,1103,null,[null,44761634]],[null,1114,null,[null,0.9]],[null,1104,null,[null,100]],[null,1115,null,[null,0.8]],[null,1119,null,[null,300]],[1120,null,null,[1]]]],[44761635,[[null,1142,null,[null,2]],[null,1103,null,[null,44761635]],[null,1114,null,[null,0.9]],[null,1106,null,[null,10]],[null,1115,null,[null,0.8]],[null,1119,null,[null,300]],[1120,null,null,[1]]]],[44761636,[[null,1142,null,[null,2]],[null,1103,null,[null,44761636]],[null,1114,null,[null,0.9]],[null,1107,null,[null,10]],[null,1115,null,[null,0.8]],[null,1119,null,[null,300]],[1120,null,null,[1]]]],[44761637,[[null,1142,null,[null,2]],[null,1103,null,[null,44761637]],[null,1114,null,[null,0.9]],[null,1105,null,[null,10]],[null,1115,null,[null,0.8]],[null,1119,null,[null,300]],[1120,null,null,[1]]]],[44762110,[[null,1142,null,[null,2]],[null,1103,null,[null,44762110]],[null,1114,null,[null,0.9]],[null,1104,null,[null,100]],[null,1115,null,[null,-1]],[null,1119,null,[null,300]],[1120,null,null,[1]]]]],[6,null,null,3,null,2],49],[500,[[44761838,[[null,1142,null,[null,2]],[null,1103,null,[null,44761838]],[null,1114,null,[null,0.9]],[null,1104,null,[null,100]],[null,1115,null,[null,-1]],[null,1119,null,[null,300]],[1120,null,null,[1]]]]],[2,[[6,null,null,3,null,2],[12,null,null,null,2,null,\"smitmehta\\\\.com\/\"]]],49],[null,[[44762338],[44762339,[[380254521,null,null,[1]]]]],[1,[[4,null,63]]],null,null,56],[150,[[31061760],[31063913,[[null,1126,null,[null,5000],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,5500]]]],[null,1032,null,[null,200],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,500]]]]]],[31065341,[[1150,null,null,[1]],[null,1126,null,[null,5000],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,5500]]]],[null,1032,null,[null,200],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,500]]]]]]],[3,[[4,null,8,null,null,null,null,[\"gmaSdk.getQueryInfo\"]],[4,null,8,null,null,null,null,[\"webkit.messageHandlers.getGmaQueryInfo.postMessage\"]],[4,null,8,null,null,null,null,[\"webkit.messageHandlers.getGmaSig.postMessage\"]]]],15],[50,[[31061761,[[null,1126,null,[null,5000],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,5500]]]],[null,1032,null,[null,200],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,500]]]]]],[31062202,[[null,1126,null,[null,5000],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,5500]]]],[null,1032,null,[null,200],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,500]]]]]],[31063912],[44756455,[[null,1126,null,[null,5000],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,5500]]]],[null,1032,null,[null,200],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,500]]]]]]],[3,[[4,null,8,null,null,null,null,[\"gmaSdk.getQueryInfo\"]],[4,null,8,null,null,null,null,[\"webkit.messageHandlers.getGmaQueryInfo.postMessage\"]],[4,null,8,null,null,null,null,[\"webkit.messageHandlers.getGmaSig.postMessage\"]]]],15],[null,[[31063202,[[null,1126,null,[null,5000],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,5500]]]],[null,1032,null,[null,200],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,500]]]]]]],[3,[[4,null,8,null,null,null,null,[\"gmaSdk.getQueryInfo\"]],[4,null,8,null,null,null,null,[\"webkit.messageHandlers.getGmaQueryInfo.postMessage\"]],[4,null,8,null,null,null,null,[\"webkit.messageHandlers.getGmaSig.postMessage\"]]]],15],[null,[[44753753,[[null,1126,null,[null,5000],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,5500]]]],[null,1032,null,[null,200],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,500]]]]]]],[3,[[4,null,8,null,null,null,null,[\"gmaSdk.getQueryInfo\"]],[4,null,8,null,null,null,null,[\"webkit.messageHandlers.getGmaQueryInfo.postMessage\"]],[4,null,8,null,null,null,null,[\"webkit.messageHandlers.getGmaSig.postMessage\"]]]],15]]],[20,[[50,[[31062930],[31062931,[[380025941,null,null,[1]]]]],null,null,null,null,null,101,null,102]]],[13,[[10,[[44759847],[44759848,[[1947,null,null,[]]]]]],[10,[[44759849],[44759850]]],[1,[[31065824],[31065825,[[424117738,null,null,[1]]]]]],[10,[[31066184],[31066185,[[436251930,null,null,[1]]]]]],[1000,[[21067496]],[4,null,9,null,null,null,null,[\"document.hasTrustToken\"]]],[1000,[[31060475,null,[2,[[1,[[4,null,9,null,null,null,null,[\"window.PeriodicSyncManager\"]]]],[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]]]]]]],[500,[[31061692],[31061693,[[77,null,null,[1]],[78,null,null,[1]],[85,null,null,[1]],[80,null,null,[1]],[76,null,null,[1]]]]],[4,null,6,null,null,null,null,[\"31061691\"]]],[1,[[31062890],[31062891,[[397841828,null,null,[1]]]]]],[1,[[31062946]],[4,null,27,null,null,null,null,[\"document.prerendering\"]]],[1,[[31062947]],[1,[[4,null,27,null,null,null,null,[\"document.prerendering\"]]]]],[50,[[31064018],[31064019,[[1961,null,null,[1]]]]]],[1,[[31065981,null,[2,[[6,null,null,3,null,0],[12,null,null,null,4,null,\"Chrome\/(9[23456789]|\\\\d{3,})\",[\"navigator.userAgent\"]],[4,null,27,null,null,null,null,[\"crossOriginIsolated\"]]]]]]]]],[11,[[10,[[44760494],[44760495,[[1957,null,null,[1]]]]],null,48],[1,[[44760496],[44760497,[[1957,null,null,[1]]]],[44760498,[[1957,null,null,[1]]]]],null,48],[2,[[44761535],[44761536,[[1957,null,null,[1]],[1963,null,null,[1]]]],[44761537,[[1957,null,null,[1]],[1964,null,null,[1]]]],[44761538,[[1957,null,null,[1]],[1965,null,null,[1]]]],[44761539,[[1957,null,null,[1]]]]],null,48]]],[17,[[10,[[31060047]],null,null,null,44,null,900],[10,[[31060048],[31060049]],null,null,null,null,null,null,null,101],[10,[[31060566]]]]],[12,[[50,[[31061828],[31061829,[[null,1126,null,[null,5000],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,5500]]]],[null,1032,null,[null,200],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,500]]]],[360245597,null,null,[1]],[null,494,null,[null,5000],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,5500]]]]]],[31065659,[[1150,null,null,[1]],[null,1126,null,[null,5000],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,5500]]]],[null,1032,null,[null,10000]],[427841102,null,null,[1]],[360245597,null,null,[1]],[null,494,null,[null,5000],[[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[null,5500]]]]]],[31065787]],null,15],[20,[[21065724],[21065725,[[203,null,null,[1]]]]],[4,null,9,null,null,null,null,[\"LayoutShift\"]]],[50,[[31060006,null,[2,[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[12,null,null,null,4,null,\"Chrome\/(89|9\\\\d|\\\\d{3,})\",[\"navigator.userAgent\"]],[4,null,9,null,null,null,null,[\"window.PeriodicSyncManager\"]]]]],[31060007,[[1928,null,null,[1]]],[2,[[12,null,null,null,4,null,\"Android\",[\"navigator.userAgent\"]],[12,null,null,null,4,null,\"Chrome\/(89|9\\\\d|\\\\d{3,})\",[\"navigator.userAgent\"]],[4,null,9,null,null,null,null,[\"window.PeriodicSyncManager\"]]]]]],null,21],[10,[[31060032],[31060033,[[1928,null,null,[1]]]]],null,21],[10,[[31061690],[31061691,[[83,null,null,[1]],[84,null,null,[1]]]]]],[1,[[31065721],[31065722,[[432946749,null,null,[1]]]]]]]]],null,null,[0.001,\"1000\",1,\"1000\"]],[null,[]],null,null,1,\"github.com\",309779023,[44759876,44759927,44759842]]");
Gabriel1231n2j3n / Hacks Para Krunker// ==UserScript== // @name aimbot gratis para krunker.io // @description Este es el mejor aimbot mod menuq puedas obtener // @version 2.19 // @author Gabriel - // @iconURL 31676a4e532e706e673f7261773d74727565.png // @match *://krunker.io/* // @exclude *://krunker.io/editor* // @exclude *://krunker.io/social* // @run-at document-start // @grant none // @noframes // ==/UserScript== /* eslint-env es6 */ /* eslint-disable no-caller, no-undef, no-loop-func */ var CRC2d = CanvasRenderingContext2D.prototype; var skid, skidStr = [...Array(8)].map(_ => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'[~~(Math.random()*52)]).join(''); class Skid { constructor() { skid = this; this.downKeys = new Set(); this.settings = null; this.vars = {}; this.playerMaps = []; this.skinCache = {}; this.inputFrame = 0; this.renderFrame = 0; this.fps = 0; this.lists = { renderESP: { off: "Off", walls: "Walls", twoD: "2d", full: "Full" }, renderChams: { off: "Off", white: "White", blue: "Blue", teal: "Teal", purple: "Purple", green: "Green", yellow: "Yellow", red: "Red", }, autoBhop: { off: "Off", autoJump: "Auto Jump", keyJump: "Key Jump", autoSlide: "Auto Slide", keySlide: "Key Slide" }, autoAim: { off: "Off", correction: "Aim Correction", assist: "Legit Aim Assist", easyassist: "Easy Aim Assist", silent: "Silent Aim", trigger: "Trigger Bot", quickScope: "Quick Scope" }, audioStreams: { off: 'Off', _2000s: 'General German/English', _HipHopRNB: 'Hip Hop / RNB', _Oldskool: 'Hip Hop Oldskool', _Country: 'Country', _Pop: 'Pop', _Dance: 'Dance', _Dubstep: 'DubStep', _Lowfi: 'LoFi HipHop', _Jazz: 'Jazz', _Oldies: 'Golden Oldies', _Club: 'Club', _Folk: 'Folk', _ClassicRock: 'Classic Rock', _Metal: 'Heavy Metal', _DeathMetal: 'Death Metal', _Classical: 'Classical', _Alternative: 'Alternative', }, } this.consts = { twoPI: Math.PI * 2, halfPI: Math.PI / 2, playerHeight: 11, cameraHeight: 1.5, headScale: 2, armScale: 1.3, armInset: 0.1, chestWidth: 2.6, hitBoxPad: 1, crouchDst: 3, recoilMlt: 0.3, nameOffset: 0.6, nameOffsetHat: 0.8, }; this.key = { frame: 0, delta: 1, xdir: 2, ydir: 3, moveDir: 4, shoot: 5, scope: 6, jump: 7, reload: 8, crouch: 9, weaponScroll: 10, weaponSwap: 11, moveLock: 12 }; this.css = { noTextShadows: `*, .button.small, .bigShadowT { text-shadow: none !important; }`, hideAdverts: `#aMerger, #endAMerger { display: none !important }`, hideSocials: `.headerBarRight > .verticalSeparator, .imageButton { display: none }`, cookieButton: `#onetrust-consent-sdk { display: none !important }`, newsHolder: `#newsHolder { display: none !important }`, }; this.isProxy = Symbol("isProxy"); this.spinTimer = 1800; let wait = setInterval(_ => { this.head = document.head||document.getElementsByTagName('head')[0] if (this.head) { clearInterval(wait); Object.entries(this.css).forEach(entry => { this.css[entry[0]] = this.createElement("style", entry[1]); }) this.onLoad(); } }, 100); } canStore() { return this.isDefined(Storage); } saveVal(name, val) { if (this.canStore()) localStorage.setItem("kro_utilities_"+name, val); } deleteVal(name) { if (this.canStore()) localStorage.removeItem("kro_utilities_"+name); } getSavedVal(name) { if (this.canStore()) return localStorage.getItem("kro_utilities_"+name); return null; } isType(item, type) { return typeof item === type; } isDefined(object) { return !this.isType(object, "undefined") && object !== null; } isNative(fn) { return (/^function\s*[a-z0-9_\$]*\s*\([^)]*\)\s*\{\s*\[native code\]\s*\}/i).test('' + fn) } getStatic(s, d) { return this.isDefined(s) ? s : d } crossDomain(url) { return "https://crossorigin.me/" + url; } async waitFor(test, timeout_ms = 20000, doWhile = null) { let sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); return new Promise(async (resolve, reject) => { if (typeof timeout_ms != "number") reject("Timeout argument not a number in waitFor(selector, timeout_ms)"); let result, freq = 100; while (result === undefined || result === false || result === null || result.length === 0) { if (doWhile && doWhile instanceof Function) doWhile(); if (timeout_ms % 1000 < freq) console.log("waiting for: ", test); if ((timeout_ms -= freq) < 0) { console.log( "Timeout : ", test ); resolve(false); return; } await sleep(freq); result = typeof test === "string" ? Function(test)() : test(); } console.log("Passed : ", test); resolve(result); }); }; createSettings() { this.settings = { //Rendering showSkidBtn: { pre: "<div class='setHed'>Rendering</div>", name: "Show Skid Button", val: true, html: () => this.generateSetting("checkbox", "showSkidBtn", this), set: (value, init) => { let button = document.getElementById("mainButton"); if (!button) { button = this.createButton("5k1D", "https://i.imgur.com/1tWAEJx.gif", this.toggleMenu, value) } else button.style.display = value ? "inherit" : "none"; } }, hideAdverts: { name: "Hide Advertisments", val: true, html: () => this.generateSetting("checkbox", "hideAdverts", this), set: (value, init) => { if (value) this.head.appendChild(this.css.hideAdverts) else if (!init) this.css.hideAdverts.remove() } }, hideStreams: { name: "Hide Streams", val: false, html: () => this.generateSetting("checkbox", "hideStreams", this), set: (value) => { window.streamContainer.style.display = value ? "none" : "inherit" } }, hideMerch: { name: "Hide Merch", val: false, html: () => this.generateSetting("checkbox", "hideMerch", this), set: value => { window.merchHolder.style.display = value ? "none" : "inherit" } }, hideNewsConsole: { name: "Hide News Console", val: false, html: () => this.generateSetting("checkbox", "hideNewsConsole", this), set: value => { window.newsHolder.style.display = value ? "none" : "inherit" } }, hideCookieButton: { name: "Hide Security Manage Button", val: false, html: () => this.generateSetting("checkbox", "hideCookieButton", this), set: value => { window['onetrust-consent-sdk'].style.display = value ? "none" : "inherit" } }, noTextShadows: { name: "Remove Text Shadows", val: false, html: () => this.generateSetting("checkbox", "noTextShadows", this), set: (value, init) => { if (value) this.head.appendChild(this.css.noTextShadows) else if (!init) this.css.noTextShadows.remove() } }, customCSS: { name: "Custom CSS", val: "", html: () => this.generateSetting("url", "customCSS", "URL to CSS file"), resources: { css: document.createElement("link") }, set: (value, init) => { if (value.startsWith("http")&&value.endsWith(".css")) { //let proxy = 'https://cors-anywhere.herokuapp.com/'; this.settings.customCSS.resources.css.href = value } if (init) { this.settings.customCSS.resources.css.rel = "stylesheet" try { this.head.appendChild(this.settings.customCSS.resources.css) } catch(e) { alert(e) this.settings.customCSS.resources.css = null } } } }, renderESP: { name: "Player ESP Type", val: "off", html: () => this.generateSetting("select", "renderESP", this.lists.renderESP), }, renderTracers: { name: "Player Tracers", val: false, html: () => this.generateSetting("checkbox", "renderTracers"), }, rainbowColor: { name: "Rainbow ESP", val: false, html: () => this.generateSetting("checkbox", "rainbowColor"), }, renderChams: { name: "Player Chams", val: "off", html: () => this.generateSetting( "select", "renderChams", this.lists.renderChams ), }, renderWireFrame: { name: "Player Wireframe", val: false, html: () => this.generateSetting("checkbox", "renderWireFrame"), }, customBillboard: { name: "Custom Billboard Text", val: "", html: () => this.generateSetting( "text", "customBillboard", "Custom Billboard Text" ), }, //Weapon autoReload: { pre: "<br><div class='setHed'>Weapon</div>", name: "Auto Reload", val: false, html: () => this.generateSetting("checkbox", "autoReload"), }, autoAim: { name: "Auto Aim Type", val: "off", html: () => this.generateSetting("select", "autoAim", this.lists.autoAim), }, frustrumCheck: { name: "Line of Sight Check", val: false, html: () => this.generateSetting("checkbox", "frustrumCheck"), }, wallPenetrate: { name: "Aim through Penetratables", val: false, html: () => this.generateSetting("checkbox", "wallPenetrate"), }, weaponZoom: { name: "Weapon Zoom", val: 1.0, min: 0, max: 50.0, step: 0.01, html: () => this.generateSetting("slider", "weaponZoom"), set: (value) => { if (this.renderer) this.renderer.adsFovMlt = value;} }, weaponTrails: { name: "Weapon Trails", val: false, html: () => this.generateSetting("checkbox", "weaponTrails"), set: (value) => { if (this.me) this.me.weapon.trail = value;} }, //Player autoBhop: { pre: "<br><div class='setHed'>Player</div>", name: "Auto Bhop Type", val: "off", html: () => this.generateSetting("select", "autoBhop", this.lists.autoBhop), }, thirdPerson: { name: "Third Person", val: false, html: () => this.generateSetting("checkbox", "thirdPerson"), set: (value, init) => { if (value) this.thirdPerson = 1; else if (!init) this.thirdPerson = undefined; } }, skinUnlock: { name: "Unlock Skins", val: false, html: () => this.generateSetting("checkbox", "skinUnlock", this), }, //GamePlay disableWpnSnd: { pre: "<br><div class='setHed'>GamePlay</div>", name: "Disable Players Weapon Sounds", val: false, html: () => this.generateSetting("checkbox", "disableWpnSnd", this), }, disableHckSnd: { name: "Disable Hacker Fart Sounds", val: false, html: () => this.generateSetting("checkbox", "disableHckSnd", this), }, autoActivateNuke: { name: "Auto Activate Nuke", val: false, html: () => this.generateSetting("checkbox", "autoActivateNuke", this), }, autoFindNew: { name: "New Lobby Finder", val: false, html: () => this.generateSetting("checkbox", "autoFindNew", this), }, autoClick: { name: "Auto Start Game", val: false, html: () => this.generateSetting("checkbox", "autoClick", this), }, inActivity: { name: "No InActivity Kick", val: true, html: () => this.generateSetting("checkbox", "autoClick", this), }, //Radio Stream Player playStream: { pre: "<br><div class='setHed'>Radio Stream Player</div>", name: "Stream Select", val: "off", html: () => this.generateSetting("select", "playStream", this.lists.audioStreams), set: (value) => { if (value == "off") { if ( this.settings.playStream.audio ) { this.settings.playStream.audio.pause(); this.settings.playStream.audio.currentTime = 0; this.settings.playStream.audio = null; } return; } let url = this.settings.playStream.urls[value]; if (!this.settings.playStream.audio) { this.settings.playStream.audio = new Audio(url); this.settings.playStream.audio.volume = this.settings.audioVolume.val||0.5 } else { this.settings.playStream.audio.src = url; } this.settings.playStream.audio.load(); this.settings.playStream.audio.play(); }, urls: { _2000s: 'http://0n-2000s.radionetz.de/0n-2000s.aac', _HipHopRNB: 'https://stream-mixtape-geo.ntslive.net/mixtape2', _Country: 'https://live.wostreaming.net/direct/wboc-waaifmmp3-ibc2', _Dance: 'http://streaming.radionomy.com/A-RADIO-TOP-40', _Pop: 'http://bigrradio.cdnstream1.com/5106_128', _Jazz: 'http://strm112.1.fm/ajazz_mobile_mp3', _Oldies: 'http://strm112.1.fm/60s_70s_mobile_mp3', _Club: 'http://strm112.1.fm/club_mobile_mp3', _Folk: 'https://freshgrass.streamguys1.com/irish-128mp3', _ClassicRock: 'http://1a-classicrock.radionetz.de/1a-classicrock.mp3', _Metal: 'http://streams.radiobob.de/metalcore/mp3-192', _DeathMetal: 'http://stream.laut.fm/beatdownx', _Classical: 'http://live-radio01.mediahubaustralia.com/FM2W/aac/', _Alternative: 'http://bigrradio.cdnstream1.com/5187_128', _Dubstep: 'http://streaming.radionomy.com/R1Dubstep?lang=en', _Lowfi: 'http://streams.fluxfm.de/Chillhop/mp3-256', _Oldskool: 'http://streams.90s90s.de/hiphop/mp3-128/', }, audio: null, }, audioVolume: { name: "Radio Volume", val: 0.5, min: 0, max: 1, step: 0.01, html: () => this.generateSetting("slider", "audioVolume"), set: (value) => { if (this.settings.playStream.audio) this.settings.playStream.audio.volume = value;} }, }; // Inject Html let waitForWindows = setInterval(_ => { if (window.windows) { const menu = window.windows[11]; menu.header = "Settings"; menu.gen = _ => { var tmpHTML = `<div style='text-align:center'> <a onclick='window.open("https://skidlamer.github.io/")' class='menuLink'>SkidFest Settings</center></a> <hr> </div>`; for (const key in this.settings) { if (this.settings[key].pre) tmpHTML += this.settings[key].pre; tmpHTML += "<div class='settName' id='" + key + "_div' style='display:" + (this.settings[key].hide ? 'none' : 'block') + "'>" + this.settings[key].name + " " + this.settings[key].html() + "</div>"; } tmpHTML += `<br><hr><a onclick='${skidStr}.resetSettings()' class='menuLink'>Reset Settings</a> | <a onclick='${skidStr}.saveScript()' class='menuLink'>Save GameScript</a>` return tmpHTML; }; clearInterval(waitForWindows); //this.createButton("5k1D", "https://i.imgur.com/1tWAEJx.gif", this.toggleMenu) } }, 100); // setupSettings for (const key in this.settings) { this.settings[key].def = this.settings[key].val; if (!this.settings[key].disabled) { let tmpVal = this.getSavedVal(key); this.settings[key].val = tmpVal !== null ? tmpVal : this.settings[key].val; if (this.settings[key].val == "false") this.settings[key].val = false; if (this.settings[key].val == "true") this.settings[key].val = true; if (this.settings[key].val == "undefined") this.settings[key].val = this.settings[key].def; if (this.settings[key].set) this.settings[key].set(this.settings[key].val, true); } } } generateSetting(type, name, extra) { switch (type) { case 'checkbox': return `<label class="switch"><input type="checkbox" onclick="${skidStr}.setSetting('${name}', this.checked)" ${this.settings[name].val ? 'checked' : ''}><span class="slider"></span></label>`; case 'slider': return `<span class='sliderVal' id='slid_utilities_${name}'>${this.settings[name].val}</span><div class='slidecontainer'><input type='range' min='${this.settings[name].min}' max='${this.settings[name].max}' step='${this.settings[name].step}' value='${this.settings[name].val}' class='sliderM' oninput="${skidStr}.setSetting('${name}', this.value)"></div>` case 'select': { let temp = `<select onchange="${skidStr}.setSetting(\x27${name}\x27, this.value)" class="inputGrey2">`; for (let option in extra) { temp += '<option value="' + option + '" ' + (option == this.settings[name].val ? 'selected' : '') + '>' + extra[option] + '</option>'; } temp += '</select>'; return temp; } default: return `<input type="${type}" name="${type}" id="slid_utilities_${name}"\n${'color' == type ? 'style="float:right;margin-top:5px"' : `class="inputGrey2" placeholder="${extra}"`}\nvalue="${this.settings[name].val}" oninput="${skidStr}.setSetting(\x27${name}\x27, this.value)"/>`; } } resetSettings() { if (confirm("Are you sure you want to reset all your settings? This will also refresh the page")) { Object.keys(localStorage).filter(x => x.includes("kro_utilities_")).forEach(x => localStorage.removeItem(x)); location.reload(); } } setSetting(t, e) { this.settings[t].val = e; this.saveVal(t, e); if (document.getElementById(`slid_utilities_${t}`)) document.getElementById(`slid_utilities_${t}`).innerHTML = e; if (this.settings[t].set) this.settings[t].set(e); } createObserver(elm, check, callback, onshow = true) { return new MutationObserver((mutationsList, observer) => { if (check == 'src' || onshow && mutationsList[0].target.style.display == 'block' || !onshow) { callback(mutationsList[0].target); } }).observe(elm, check == 'childList' ? {childList: true} : {attributes: true, attributeFilter: [check]}); } createListener(elm, type, callback = null) { if (!this.isDefined(elm)) { alert("Failed creating " + type + "listener"); return } elm.addEventListener(type, event => callback(event)); } createElement(element, attribute, inner) { if (!this.isDefined(element)) { return null; } if (!this.isDefined(inner)) { inner = ""; } let el = document.createElement(element); if (this.isType(attribute, 'object')) { for (let key in attribute) { el.setAttribute(key, attribute[key]); } } if (!Array.isArray(inner)) { inner = [inner]; } for (let i = 0; i < inner.length; i++) { if (inner[i].tagName) { el.appendChild(inner[i]); } else { el.appendChild(document.createTextNode(inner[i])); } } return el; } createButton(name, iconURL, fn, visible) { visible = visible ? "inherit":"none"; let menu = document.querySelector("#menuItemContainer"); let icon = this.createElement("div",{"class":"menuItemIcon", "style":`background-image:url("${iconURL}");display:inherit;`}); let title= this.createElement("div",{"class":"menuItemTitle", "style":`display:inherit;`}, name); let host = this.createElement("div",{"id":"mainButton", "class":"menuItem", "onmouseenter":"playTick()", "onclick":"showWindow(12)", "style":`display:${visible};`},[icon, title]); if (menu) menu.append(host) } objectHas(obj, arr) { return arr.some(prop => obj.hasOwnProperty(prop)); } getVersion() { const elems = document.getElementsByClassName('terms'); const version = elems[elems.length - 1].innerText; return version; } saveAs(name, data) { let blob = new Blob([data], {type: 'text/plain'}); let el = window.document.createElement("a"); el.href = window.URL.createObjectURL(blob); el.download = name; window.document.body.appendChild(el); el.click(); window.document.body.removeChild(el); } saveScript() { this.fetchScript().then(script => { this.saveAs("game_" + this.getVersion() + ".js", script) }) } isKeyDown(key) { return this.downKeys.has(key); } simulateKey(keyCode) { var oEvent = document.createEvent('KeyboardEvent'); // Chromium Hack Object.defineProperty(oEvent, 'keyCode', { get : function() { return this.keyCodeVal; } }); Object.defineProperty(oEvent, 'which', { get : function() { return this.keyCodeVal; } }); if (oEvent.initKeyboardEvent) { oEvent.initKeyboardEvent("keypress", true, true, document.defaultView, keyCode, keyCode, "", "", false, ""); } else { oEvent.initKeyEvent("keypress", true, true, document.defaultView, false, false, false, false, keyCode, 0); } oEvent.keyCodeVal = keyCode; if (oEvent.keyCode !== keyCode) { alert("keyCode mismatch " + oEvent.keyCode + "(" + oEvent.which + ")"); } document.body.dispatchEvent(oEvent); } toggleMenu() { let lock = document.pointerLockElement || document.mozPointerLockElement; if (lock) document.exitPointerLock(); window.showWindow(12); if (this.isDefined(window.SOUND)) window.SOUND.play(`tick_0`,0.1) } onLoad() { this.createSettings(); this.createObservers(); this.waitFor(_=>this.isDefined(this.exports)).then(_=> { if (!this.isDefined(this.exports)) { alert("This Mod Needs To Be Updated Please Try Agian Later"); return; } //console.dir(this.exports); let toFind = { overlay: ["render", "canvas"], config: ["accAnnounce", "availableRegions", "assetCat"], three: ["ACESFilmicToneMapping", "TextureLoader", "ObjectLoader"], ws: ["socketReady", "ingressPacketCount", "ingressPacketCount", "egressDataSize"], utility: ["VectorAdd", "VectorAngleSign"], //colors: ["challLvl", "getChallCol"], //ui: ["showEndScreen", "toggleControlUI", "toggleEndScreen", "updatePlayInstructions"], //events: ["actions", "events"], } for (let rootKey in this.exports) { let exp = this.exports[rootKey].exports; for (let name in toFind) { if (this.objectHas(exp, toFind[name])) { console.log("Found Export ", name); delete toFind[name]; this[name] = exp; } } } if (!(Object.keys(toFind).length === 0 && toFind.constructor === Object)) { for (let name in toFind) { alert("Failed To Find Export " + name); } } else { Object.defineProperty(this.config, "nameVisRate", { value: 0, writable: false, configurable: true, }) this.ctx = this.overlay.canvas.getContext('2d'); this.overlay.render = new Proxy(this.overlay.render, { apply: function(target, that, args) { return [target.apply(that, args), render.apply(that, args)] } }) function render(scale, game, controls, renderer, me) { let width = skid.overlay.canvas.width / scale; let height = skid.overlay.canvas.height / scale; const renderArgs = [scale, game, controls, renderer, me]; if (renderArgs && void 0 !== skid) { ["scale", "game", "controls", "renderer", "me"].forEach((item, index)=>{ skid[item] = renderArgs[index]; }); if (me) { skid.ctx.save(); skid.ctx.scale(scale, scale); //this.ctx.clearRect(0, 0, width, height); skid.onRender(); //window.requestAnimationFrame.call(window, renderArgs.callee.caller.bind(this)); skid.ctx.restore(); } if(skid.settings && skid.settings.autoClick.val && window.endUI.style.display == "none" && window.windowHolder.style.display == "none") { controls.toggle(true); } } } // Skins const $skins = Symbol("skins"); Object.defineProperty(Object.prototype, "skins", { set: function(fn) { this[$skins] = fn; if (void 0 == this.localSkins || !this.localSkins.length) { this.localSkins = Array.apply(null, Array(5e3)).map((x, i) => { return { ind: i, cnt: 0x1, } }) } return fn; }, get: function() { return skid.settings.skinUnlock.val && this.stats ? this.localSkins : this[$skins]; } }) this.waitFor(_=>this.ws.connected === true, 40000).then(_=> { this.ws.__event = this.ws._dispatchEvent.bind(this.ws); this.ws.__send = this.ws.send.bind(this.ws); this.ws.send = new Proxy(this.ws.send, { apply: function(target, that, args) { if (args[0] == "ah2") return; try { var original_fn = Function.prototype.apply.apply(target, [that, args]); } catch (e) { e.stack = e.stack = e.stack.replace(/\n.*Object\.apply.*/, ''); throw e; } if (args[0] === "en") { skid.skinCache = { main: args[1][2][0], secondary: args[1][2][1], hat: args[1][3], body: args[1][4], knife: args[1][9], dye: args[1][14], waist: args[1][17], } } return original_fn; } }) this.ws._dispatchEvent = new Proxy(this.ws._dispatchEvent, { apply: function(target, that, [type, event]) { if (type =="init") { if(event[10] && event[10].length && event[10].bill && skid.settings.customBillboard.val.length > 1) { event[10].bill.txt = skid.settings.customBillboard.val; } } if (skid.settings.skinUnlock.val && skid.skinCache && type === "0") { let skins = skid.skinCache; let pInfo = event[0]; let pSize = 38; while (pInfo.length % pSize !== 0) pSize++; for(let i = 0; i < pInfo.length; i += pSize) { if (pInfo[i] === skid.ws.socketId||0) { pInfo[i + 12] = [skins.main, skins.secondary]; pInfo[i + 13] = skins.hat; pInfo[i + 14] = skins.body; pInfo[i + 19] = skins.knife; pInfo[i + 24] = skins.dye; pInfo[i + 33] = skins.waist; } } } return target.apply(that, arguments[2]); } }) }) if (this.isDefined(window.SOUND)) { window.SOUND.play = new Proxy(window.SOUND.play, { apply: function(target, that, [src, vol, loop, rate]) { if ( src.startsWith("fart_") && skid.settings.disableHckSnd.val ) return; return target.apply(that, [src, vol, loop, rate]); } }) } AudioParam.prototype.setValueAtTime = new Proxy(AudioParam.prototype.setValueAtTime, { apply: function(target, that, [value, startTime]) { return target.apply(that, [value, 0]); } }) this.rayC = new this.three.Raycaster(); this.vec2 = new this.three.Vector2(0, 0); } }) } gameJS(script) { let entries = { // Deobfu inView: { regex: /(\w+\['(\w+)']\){if\(\(\w+=\w+\['\w+']\['position']\['clone']\(\))/, index: 2 }, spectating: { regex: /\['team']:window\['(\w+)']/, index: 1 }, //inView: { regex: /\]\)continue;if\(!\w+\['(.+?)\']\)continue;/, index: 1 }, //canSee: { regex: /\w+\['(\w+)']\(\w+,\w+\['x'],\w+\['y'],\w+\['z']\)\)&&/, index: 1 }, //procInputs: { regex: /this\['(\w+)']=function\((\w+),(\w+),\w+,\w+\){(this)\['recon']/, index: 1 }, aimVal: { regex: /this\['(\w+)']-=0x1\/\(this\['weapon']\['\w+']\/\w+\)/, index: 1 }, pchObjc: { regex: /0x0,this\['(\w+)']=new \w+\['Object3D']\(\),this/, index: 1 }, didShoot: { regex: /--,\w+\['(\w+)']=!0x0/, index: 1 }, nAuto: { regex: /'Single\\x20Fire','varN':'(\w+)'/, index: 1 }, crouchVal: { regex: /this\['(\w+)']\+=\w\['\w+']\*\w+,0x1<=this\['\w+']/, index: 1 }, recoilAnimY: { regex: /\+\(-Math\['PI']\/0x4\*\w+\+\w+\['(\w+)']\*\w+\['\w+']\)\+/, index: 1 }, //recoilAnimY: { regex: /this\['recoilAnim']=0x0,this\[(.*?\(''\))]/, index: 1 }, ammos: { regex: /\['length'];for\(\w+=0x0;\w+<\w+\['(\w+)']\['length']/, index: 1 }, weaponIndex: { regex: /\['weaponConfig']\[\w+]\['secondary']&&\(\w+\['(\w+)']==\w+/, index: 1 }, isYou: { regex: /0x0,this\['(\w+)']=\w+,this\['\w+']=!0x0,this\['inputs']/, index: 1 }, objInstances: { regex: /\w+\['\w+']\(0x0,0x0,0x0\);if\(\w+\['(\w+)']=\w+\['\w+']/, index: 1 }, getWorldPosition: { regex: /{\w+=\w+\['camera']\['(\w+)']\(\);/, index: 1 }, //mouseDownL: { regex: /this\['\w+'\]=function\(\){this\['(\w+)'\]=\w*0,this\['(\w+)'\]=\w*0,this\['\w+'\]={}/, index: 1 }, mouseDownR: { regex: /this\['(\w+)']=0x0,this\['keys']=/, index: 1 }, //reloadTimer: { regex: /this\['(\w+)']&&\(\w+\['\w+']\(this\),\w+\['\w+']\(this\)/, index: 1 }, maxHealth: { regex: /this\['health']\/this\['(\w+)']\?/, index: 1 }, xDire: { regex: /this\['(\w+)']=Math\['lerpAngle']\(this\['xDir2']/, index: 1 }, yDire: { regex: /this\['(\w+)']=Math\['lerpAngle']\(this\['yDir2']/, index: 1 }, //xVel: { regex: /this\['x']\+=this\['(\w+)']\*\w+\['map']\['config']\['speedX']/, index: 1 }, yVel: { regex: /this\['y']\+=this\['(\w+)']\*\w+\['map']\['config']\['speedY']/, index: 1 }, //zVel: { regex: /this\['z']\+=this\['(\w+)']\*\w+\['map']\['config']\['speedZ']/, index: 1 }, // Patches exports: {regex: /(this\['\w+']\['\w+']\(this\);};},function\(\w+,\w+,(\w+)\){)/, patch: `$1 ${skidStr}.exports=$2.c; ${skidStr}.modules=$2.m;`}, inputs: {regex: /(\w+\['\w+']\[\w+\['\w+']\['\w+']\?'\w+':'push']\()(\w+)\),/, patch: `$1${skidStr}.onInput($2)),`}, inView: {regex: /&&(\w+\['\w+'])\){(if\(\(\w+=\w+\['\w+']\['\w+']\['\w+'])/, patch: `){if(!$1&&void 0 !== ${skidStr}.nameTags)continue;$2`}, thirdPerson:{regex: /(\w+)\[\'config\'\]\[\'thirdPerson\'\]/g, patch: `void 0 !== ${skidStr}.thirdPerson`}, isHacker:{regex: /(window\['\w+']=)!0x0\)/, patch: `$1!0x1)`}, fixHowler:{regex: /(Howler\['orientation'](.+?)\)\),)/, patch: ``}, respawnT:{regex: /'\w+':0x3e8\*/g, patch: `'respawnT':0x0*`}, anticheat1:{regex: /&&\w+\(\),window\['utilities']&&\(\w+\(null,null,null,!0x0\),\w+\(\)\)/, patch: ""}, anticheat2:{regex: /(\[]instanceof Array;).*?(var)/, patch: "$1 $2"}, anticheat3:{regex: /windows\['length'\]>\d+.*?0x25/, patch: `0x25`}, commandline:{regex: /Object\['defineProperty']\(console.*?\),/, patch: ""}, writeable:{regex: /'writeable':!0x1/g, patch: "writeable:true"}, configurable:{regex: /'configurable':!0x1/g, patch: "configurable:true"}, typeError:{regex: /throw new TypeError/g, patch: "console.error"}, error:{regex: /throw new Error/g, patch: "console.error"}, }; for(let name in entries) { let object = entries[name]; let found = object.regex.exec(script); if (object.hasOwnProperty('index')) { if (!found) { object.val = null; alert("Failed to Find " + name); } else { object.val = found[object.index]; console.log ("Found ", name, ":", object.val); } Object.defineProperty(skid.vars, name, { configurable: false, value: object.val }); } else if (found) { script = script.replace(object.regex, object.patch); console.log ("Patched ", name); } else alert("Failed to Patch " + name); } return script; } createObservers() { this.createObserver(window.instructionsUpdate, 'style', (target) => { if (this.settings.autoFindNew.val) { console.log(target) if (['Kicked', 'Banned', 'Disconnected', 'Error', 'Game is full'].some(text => target && target.innerHTML.includes(text))) { location = document.location.origin; } } }); this.createListener(document, "keyup", event => { if (this.downKeys.has(event.code)) this.downKeys.delete(event.code) }) this.createListener(document, "keydown", event => { if (event.code == "F1") { event.preventDefault(); this.toggleMenu(); } if ('INPUT' == document.activeElement.tagName || !window.endUI && window.endUI.style.display) return; switch (event.code) { case 'NumpadSubtract': document.exitPointerLock(); //console.log(document.exitPointerLock) console.dirxml(this) break; default: if (!this.downKeys.has(event.code)) this.downKeys.add(event.code); break; } }) this.createListener(document, "mouseup", event => { switch (event.button) { case 1: event.preventDefault(); this.toggleMenu(); break; default: break; } }) } onRender() { /* hrt / ttap - https://github.com/hrt */ this.renderFrame ++; if (this.renderFrame >= 100000) this.renderFrame = 0; let scaledWidth = this.ctx.canvas.width / this.scale; let scaledHeight = this.ctx.canvas.height / this.scale; let playerScale = (2 * this.consts.armScale + this.consts.chestWidth + this.consts.armInset) / 2 let worldPosition = this.renderer.camera[this.vars.getWorldPosition](); let espVal = this.settings.renderESP.val; if (espVal ==="walls"||espVal ==="twoD") this.nameTags = undefined; else this.nameTags = true; if (this.settings.autoActivateNuke.val && this.me && Object.keys(this.me.streaks).length) { /*chonker*/ this.ws.__send("k", 0); } if (espVal !== "off") { this.overlay.healthColE = this.settings.rainbowColor.val ? this.overlay.rainbow.col : "#eb5656"; } for (let iter = 0, length = this.game.players.list.length; iter < length; iter++) { let player = this.game.players.list[iter]; if (player[this.vars.isYou] || !player.active || !this.isDefined(player[this.vars.objInstances]) || this.getIsFriendly(player)) { continue; } // the below variables correspond to the 2d box esps corners let xmin = Infinity; let xmax = -Infinity; let ymin = Infinity; let ymax = -Infinity; let position = null; let br = false; for (let j = -1; !br && j < 2; j+=2) { for (let k = -1; !br && k < 2; k+=2) { for (let l = 0; !br && l < 2; l++) { if (position = player[this.vars.objInstances].position.clone()) { position.x += j * playerScale; position.z += k * playerScale; position.y += l * (player.height - player[this.vars.crouchVal] * this.consts.crouchDst); if (!this.containsPoint(position)) { br = true; break; } position.project(this.renderer.camera); xmin = Math.min(xmin, position.x); xmax = Math.max(xmax, position.x); ymin = Math.min(ymin, position.y); ymax = Math.max(ymax, position.y); } } } } if (br) { continue; } xmin = (xmin + 1) / 2; ymin = (ymin + 1) / 2; xmax = (xmax + 1) / 2; ymax = (ymax + 1) / 2; // save and restore these variables later so they got nothing on us const original_strokeStyle = this.ctx.strokeStyle; const original_lineWidth = this.ctx.lineWidth; const original_font = this.ctx.font; const original_fillStyle = this.ctx.fillStyle; //Tracers if (this.settings.renderTracers.val) { CRC2d.save.apply(this.ctx, []); let screenPos = this.world2Screen(player[this.vars.objInstances].position); this.ctx.lineWidth = 4.5; this.ctx.beginPath(); this.ctx.moveTo(this.ctx.canvas.width/2, this.ctx.canvas.height - (this.ctx.canvas.height - scaledHeight)); this.ctx.lineTo(screenPos.x, screenPos.y); this.ctx.strokeStyle = "rgba(0, 0, 0, 0.25)"; this.ctx.stroke(); this.ctx.lineWidth = 2.5; this.ctx.strokeStyle = this.settings.rainbowColor.val ? this.overlay.rainbow.col : "#eb5656" this.ctx.stroke(); CRC2d.restore.apply(this.ctx, []); } CRC2d.save.apply(this.ctx, []); if (espVal == "twoD" || espVal == "full") { // perfect box esp this.ctx.lineWidth = 5; this.ctx.strokeStyle = this.settings.rainbowColor.val ? this.overlay.rainbow.col : "#eb5656" let distanceScale = Math.max(.3, 1 - this.getD3D(worldPosition.x, worldPosition.y, worldPosition.z, player.x, player.y, player.z) / 600); CRC2d.scale.apply(this.ctx, [distanceScale, distanceScale]); let xScale = scaledWidth / distanceScale; let yScale = scaledHeight / distanceScale; CRC2d.beginPath.apply(this.ctx, []); ymin = yScale * (1 - ymin); ymax = yScale * (1 - ymax); xmin = xScale * xmin; xmax = xScale * xmax; CRC2d.moveTo.apply(this.ctx, [xmin, ymin]); CRC2d.lineTo.apply(this.ctx, [xmin, ymax]); CRC2d.lineTo.apply(this.ctx, [xmax, ymax]); CRC2d.lineTo.apply(this.ctx, [xmax, ymin]); CRC2d.lineTo.apply(this.ctx, [xmin, ymin]); CRC2d.stroke.apply(this.ctx, []); if (espVal == "full") { // health bar this.ctx.fillStyle = "#000000"; let barMaxHeight = ymax - ymin; CRC2d.fillRect.apply(this.ctx, [xmin - 7, ymin, -10, barMaxHeight]); this.ctx.fillStyle = player.health > 75 ? "green" : player.health > 40 ? "orange" : "red"; CRC2d.fillRect.apply(this.ctx, [xmin - 7, ymin, -10, barMaxHeight * (player.health / player[this.vars.maxHealth])]); // info this.ctx.font = "48px Sans-serif"; this.ctx.fillStyle = "white"; this.ctx.strokeStyle='black'; this.ctx.lineWidth = 1; let x = xmax + 7; let y = ymax; CRC2d.fillText.apply(this.ctx, [player.name||player.alias, x, y]); CRC2d.strokeText.apply(this.ctx, [player.name||player.alias, x, y]); this.ctx.font = "30px Sans-serif"; y += 35; CRC2d.fillText.apply(this.ctx, [player.weapon.name, x, y]); CRC2d.strokeText.apply(this.ctx, [player.weapon.name, x, y]); y += 35; CRC2d.fillText.apply(this.ctx, [player.health + ' HP', x, y]); CRC2d.strokeText.apply(this.ctx, [player.health + ' HP', x, y]); } } CRC2d.restore.apply(this.ctx, []); this.ctx.strokeStyle = original_strokeStyle; this.ctx.lineWidth = original_lineWidth; this.ctx.font = original_font; this.ctx.fillStyle = original_fillStyle; // skelly chams if (this.isDefined(player[this.vars.objInstances])) { let obj = player[this.vars.objInstances]; if (!obj.visible) { Object.defineProperty(player[this.vars.objInstances], 'visible', { value: true, writable: false }); } obj.traverse((child) => { let chamColor = this.settings.renderChams.val; let chamsEnabled = chamColor !== "off"; if (child && child.type == "Mesh" && child.material) { child.material.depthTest = chamsEnabled ? false : true; //if (this.isDefined(child.material.fog)) child.material.fog = chamsEnabled ? false : true; if (child.material.emissive) { child.material.emissive.r = chamColor == 'off' || chamColor == 'teal' || chamColor == 'green' || chamColor == 'blue' ? 0 : 0.55; child.material.emissive.g = chamColor == 'off' || chamColor == 'purple' || chamColor == 'blue' || chamColor == 'red' ? 0 : 0.55; child.material.emissive.b = chamColor == 'off' || chamColor == 'yellow' || chamColor == 'green' || chamColor == 'red' ? 0 : 0.55; } child.material.wireframe = this.settings.renderWireFrame.val ? true : false } }) } } } spinTick(input) { //this.game.players.getSpin(this.self); //this.game.players.saveSpin(this.self, angle); const angle = this.getAngleDst(input[2], this.me[this.vars.xDire]); this.spins = this.getStatic(this.spins, new Array()); this.spinTimer = this.getStatic(this.spinTimer, this.config.spinTimer); this.serverTickRate = this.getStatic(this.serverTickRate, this.config.serverTickRate); (this.spins.unshift(angle), this.spins.length > this.spinTimer / this.serverTickRate && (this.spins.length = Math.round(this.spinTimer / this.serverTickRate))) for (var e = 0, i = 0; i < this.spins.length; ++i) e += this.spins[i]; return Math.abs(e * (180 / Math.PI)); } raidBot(input) { let target = this.game.AI.ais.filter(enemy => { return undefined !== enemy.mesh && enemy.mesh && enemy.mesh.children[0] && enemy.canBSeen && enemy.health > 0 }).sort((p1, p2) => this.getD3D(this.me.x, this.me.z, p1.x, p1.z) - this.getD3D(this.me.x, this.me.z, p2.x, p2.z)).shift(); if (target) { let canSee = this.containsPoint(target.mesh.position) let yDire = (this.getDir(this.me.z, this.me.x, target.z, target.x) || 0) let xDire = ((this.getXDire(this.me.x, this.me.y, this.me.z, target.x, target.y + target.mesh.children[0].scale.y * 0.85, target.z) || 0) - this.consts.recoilMlt * this.me[this.vars.recoilAnimY]) if (this.me.weapon[this.vars.nAuto] && this.me[this.vars.didShoot]) { input[this.key.shoot] = 0; input[this.key.scope] = 0; this.me.inspecting = false; this.me.inspectX = 0; } else { if (!this.me.aimDir && canSee) { input[this.key.scope] = 1; if (!this.me[this.vars.aimVal]||this.me.weapon.noAim) { input[this.key.shoot] = 1; input[this.key.ydir] = yDire * 1e3 input[this.key.xdir] = xDire * 1e3 this.lookDir(xDire, yDire); } } } } else { this.resetLookAt(); } return input; } onInput(input) { if (this.isDefined(this.config) && this.config.aimAnimMlt) this.config.aimAnimMlt = 1; if (this.isDefined(this.controls) && this.isDefined(this.config) && this.settings.inActivity.val) { this.controls.idleTimer = 0; this.config.kickTimer = Infinity } if (this.me) { this.inputFrame ++; if (this.inputFrame >= 100000) this.inputFrame = 0; if (!this.game.playerSound[this.isProxy]) { this.game.playerSound = new Proxy(this.game.playerSound, { apply: function(target, that, args) { if (skid.settings.disableWpnSnd.val && args[0] && typeof args[0] == "string" && args[0].startsWith("weapon_")) return; return target.apply(that, args); }, get: function(target, key) { return key === skid.isProxy ? true : Reflect.get(target, key); }, }) } let isMelee = this.isDefined(this.me.weapon.melee)&&this.me.weapon.melee||this.isDefined(this.me.weapon.canThrow)&&this.me.weapon.canThrow; let ammoLeft = this.me[this.vars.ammos][this.me[this.vars.weaponIndex]]; // autoReload if (this.settings.autoReload.val) { //let capacity = this.me.weapon.ammo; //if (ammoLeft < capacity) if (isMelee) { if (!this.me.canThrow) { //this.me.refillKnife(); } } else if (!ammoLeft) { this.game.players.reload(this.me); input[this.key.reload] = 1; // this.me[this.vars.reloadTimer] = 1; //this.me.resetAmmo(); } } //Auto Bhop let autoBhop = this.settings.autoBhop.val; if (autoBhop !== "off") { if (this.isKeyDown("Space") || autoBhop == "autoJump" || autoBhop == "autoSlide") { this.controls.keys[this.controls.binds.jumpKey.val] ^= 1; if (this.controls.keys[this.controls.binds.jumpKey.val]) { this.controls.didPressed[this.controls.binds.jumpKey.val] = 1; } if (this.isKeyDown("Space") || autoBhop == "autoSlide") { if (this.me[this.vars.yVel] < -0.03 && this.me.canSlide) { setTimeout(() => { this.controls.keys[this.controls.binds.crouchKey.val] = 0; }, this.me.slideTimer||325); this.controls.keys[this.controls.binds.crouchKey.val] = 1; this.controls.didPressed[this.controls.binds.crouchKey.val] = 1; } } } } //Autoaim if (this.settings.autoAim.val !== "off") { this.playerMaps.length = 0; this.rayC.setFromCamera(this.vec2, this.renderer.fpsCamera); let target = this.game.players.list.filter(enemy => { let hostile = undefined !== enemy[this.vars.objInstances] && enemy[this.vars.objInstances] && !enemy[this.vars.isYou] && !this.getIsFriendly(enemy) && enemy.health > 0 && this.getInView(enemy); if (hostile) this.playerMaps.push( enemy[this.vars.objInstances] ); return hostile }).sort((p1, p2) => this.getD3D(this.me.x, this.me.z, p1.x, p1.z) - this.getD3D(this.me.x, this.me.z, p2.x, p2.z)).shift(); if (target) { //let count = this.spinTick(input); //if (count < 360) { // input[2] = this.me[this.vars.xDire] + Math.PI; //} else console.log("spins ", count); //target.jumpBobY * this.config.jumpVel let canSee = this.containsPoint(target[this.vars.objInstances].position); let inCast = this.rayC.intersectObjects(this.playerMaps, true).length; let yDire = (this.getDir(this.me.z, this.me.x, target.z, target.x) || 0); let xDire = ((this.getXDire(this.me.x, this.me.y, this.me.z, target.x, target.y - target[this.vars.crouchVal] * this.consts.crouchDst + this.me[this.vars.crouchVal] * this.consts.crouchDst, target.z) || 0) - this.consts.recoilMlt * this.me[this.vars.recoilAnimY]) if (this.me.weapon[this.vars.nAuto] && this.me[this.vars.didShoot]) { input[this.key.shoot] = 0; input[this.key.scope] = 0; this.me.inspecting = false; this.me.inspectX = 0; } else if (!canSee && this.settings.frustrumCheck.val) this.resetLookAt(); else if (ammoLeft||isMelee) { input[this.key.scope] = this.settings.autoAim.val === "assist"||this.settings.autoAim.val === "correction"||this.settings.autoAim.val === "trigger" ? this.controls[this.vars.mouseDownR] : 0; switch (this.settings.autoAim.val) { case "quickScope": input[this.key.scope] = 1; if (!this.me[this.vars.aimVal]||this.me.weapon.noAim) { if (!this.me.canThrow||!isMelee) input[this.key.shoot] = 1; input[this.key.ydir] = yDire * 1e3 input[this.key.xdir] = xDire * 1e3 this.lookDir(xDire, yDire); } break; case "assist": case "easyassist": if (input[this.key.scope] || this.settings.autoAim.val === "easyassist") { if (!this.me.aimDir && canSee || this.settings.autoAim.val === "easyassist") { input[this.key.ydir] = yDire * 1e3 input[this.key.xdir] = xDire * 1e3 this.lookDir(xDire, yDire); } } break; case "silent": if (!this.me[this.vars.aimVal]||this.me.weapon.noAim) { if (!this.me.canThrow||!isMelee) input[this.key.shoot] = 1; } else input[this.key.scope] = 1; input[this.key.ydir] = yDire * 1e3 input[this.key.xdir] = xDire * 1e3 break; case "trigger": if (input[this.key.scope] && canSee && inCast) { input[this.key.shoot] = 1; input[this.key.ydir] = yDire * 1e3 input[this.key.xdir] = xDire * 1e3 } break; case "correction": if (input[this.key.shoot] == 1) { input[this.key.ydir] = yDire * 1e3 input[this.key.xdir] = xDire * 1e3 } break; default: this.resetLookAt(); break; } } } else { this.resetLookAt(); //input = this.raidBot(input); } } } //else if (this.settings.autoClick.val && !this.ui.hasEndScreen) { //this.config.deathDelay = 0; //this.controls.toggle(true); //} //this.game.config.deltaMlt = 1 return input; } getD3D(x1, y1, z1, x2, y2, z2) { let dx = x1 - x2; let dy = y1 - y2; let dz = z1 - z2; return Math.sqrt(dx * dx + dy * dy + dz * dz); } getAngleDst(a, b) { return Math.atan2(Math.sin(b - a), Math.cos(a - b)); } getXDire(x1, y1, z1, x2, y2, z2) { let h = Math.abs(y1 - y2); let dst = this.getD3D(x1, y1, z1, x2, y2, z2); return (Math.asin(h / dst) * ((y1 > y2)?-1:1)); } getDir(x1, y1, x2, y2) { return Math.atan2(y1 - y2, x1 - x2); } getDistance(x1, y1, x2, y2) { return Math.sqrt((x2 -= x1) * x2 + (y2 -= y1) * y2); } containsPoint(point) { let planes = this.renderer.frustum.planes; for (let i = 0; i < 6; i ++) { if (planes[i].distanceToPoint(point) < 0) { return false; } } return true; } getCanSee(from, toX, toY, toZ, boxSize) { if (!from) return 0; boxSize = boxSize||0; for (let obj, dist = this.getD3D(from.x, from.y, from.z, toX, toY, toZ), xDr = this.getDir(from.z, from.x, toZ, toX), yDr = this.getDir(this.getDistance(from.x, from.z, toX, toZ), toY, 0, from.y), dx = 1 / (dist * Math.sin(xDr - Math.PI) * Math.cos(yDr)), dz = 1 / (dist * Math.cos(xDr - Math.PI) * Math.cos(yDr)), dy = 1 / (dist * Math.sin(yDr)), yOffset = from.y + (from.height || 0) - this.consts.cameraHeight, aa = 0; aa < this.game.map.manager.objects.length; ++aa) { if (!(obj = this.game.map.manager.objects[aa]).noShoot && obj.active && !obj.transparent && (!this.settings.wallPenetrate.val || (!obj.penetrable || !this.me.weapon.pierce))) { let tmpDst = this.lineInRect(from.x, from.z, yOffset, dx, dz, dy, obj.x - Math.max(0, obj.width - boxSize), obj.z - Math.max(0, obj.length - boxSize), obj.y - Math.max(0, obj.height - boxSize), obj.x + Math.max(0, obj.width - boxSize), obj.z + Math.max(0, obj.length - boxSize), obj.y + Math.max(0, obj.height - boxSize)); if (tmpDst && 1 > tmpDst) return tmpDst; } } /* let terrain = this.game.map.terrain; if (terrain) { let terrainRaycast = terrain.raycast(from.x, -from.z, yOffset, 1 / dx, -1 / dz, 1 / dy); if (terrainRaycast) return utl.getD3D(from.x, from.y, from.z, terrainRaycast.x, terrainRaycast.z, -terrainRaycast.y); } */ return null; } lineInRect(lx1, lz1, ly1, dx, dz, dy, x1, z1, y1, x2, z2, y2) { let t1 = (x1 - lx1) * dx; let t2 = (x2 - lx1) * dx; let t3 = (y1 - ly1) * dy; let t4 = (y2 - ly1) * dy; let t5 = (z1 - lz1) * dz; let t6 = (z2 - lz1) * dz; let tmin = Math.max(Math.max(Math.min(t1, t2), Math.min(t3, t4)), Math.min(t5, t6)); let tmax = Math.min(Math.min(Math.max(t1, t2), Math.max(t3, t4)), Math.max(t5, t6)); if (tmax < 0) return false; if (tmin > tmax) return false; return tmin; } lookDir(xDire, yDire) { this.controls.object.rotation.y = yDire this.controls[this.vars.pchObjc].rotation.x = xDire; this.controls[this.vars.pchObjc].rotation.x = Math.max(-this.consts.halfPI, Math.min(this.consts.halfPI, this.controls[this.vars.pchObjc].rotation.x)); this.controls.yDr = (this.controls[this.vars.pchObjc].rotation.x % Math.PI).round(3); this.controls.xDr = (this.controls.object.rotation.y % Math.PI).round(3); this.renderer.camera.updateProjectionMatrix(); this.renderer.updateFrustum(); } resetLookAt() { this.controls.yDr = this.controls[this.vars.pchObjc].rotation.x; this.controls.xDr = this.controls.object.rotation.y; this.renderer.camera.updateProjectionMatrix(); this.renderer.updateFrustum(); } world2Screen (position) { let pos = position.clone(); let scaledWidth = this.ctx.canvas.width / this.scale; let scaledHeight = this.ctx.canvas.height / this.scale; pos.project(this.renderer.camera); pos.x = (pos.x + 1) / 2; pos.y = (-pos.y + 1) / 2; pos.x *= scaledWidth; pos.y *= scaledHeight; return pos; } getInView(entity) { return null == this.getCanSee(this.me, entity.x, entity.y, entity.z); } getIsFriendly(entity) { return (this.me && this.me.team ? this.me.team : this.me.spectating ? 0x1 : 0x0) == entity.team } } function loadWASM() { window.Function = new Proxy(window.Function, { construct(target, args) { const original = new target(...args); if (args.length) { let body = args[args.length - 1]; if (body.length > 38e5) { // game.js at game loader Easy Method //console.log(body) } else if (args[0] == "requireRegisteredType") { return (function(...fnArgs){ // Expose WASM functions if (!window.hasOwnProperty("WASM")) { window.Object.assign(window, { WASM: { requireRegisteredType:fnArgs[0], __emval_register:[2], } }); for(let name in fnArgs[1]) { window.WASM[name] = fnArgs[1][name]; switch (name) { case "__Z01dynCall_fijfiv": //game.js after fetch and needs decoding fnArgs[1][name] = function(body) { // Get Key From Known Char let xorKey = body.charCodeAt() ^ '!'.charCodeAt(), str = "", ret =""; // Decode Mangled String for (let i = 0, strLen = body.length; i < strLen; i++) { str += String.fromCharCode(body.charCodeAt(i) ^ xorKey); } // Manipulate String //console.log(str) window[skidStr] = new Skid(); str = skid.gameJS(str); //ReEncode Mangled String for (let i = 0, strLen = str.length; i < strLen; i++) { ret += String.fromCharCode(str[i].charCodeAt() ^ xorKey); } // Return With Our Manipulated Code return window.WASM[name].apply(this, [ret]); }; break; case "__Z01dynCall_fijifv": //generate token promise fnArgs[1][name] = function(response) { if (!response.ok) { throw new window.Error("Network response from " + response.url + " was not ok") } let promise = window.WASM[name].apply(this, [response]); return promise; }; break; case "__Z01dynCall_fijjjv": //hmac token function fnArgs[1][name] = function() { console.log(arguments[0]); return window.WASM[name].apply(this, arguments); }; break; } } } return new target(...args).apply(this, fnArgs); }) } // If changed return with spoofed toString(); if (args[args.length - 1] !== body) { args[args.length - 1] = body; let patched = new target(...args); patched.toString = () => original.toString(); return patched; } } return original; } }) function onPageLoad() { window.instructionHolder.style.display = "block"; window.instructions.innerHTML = `<div id="settHolder"><img src="https://i.imgur.com/yzb2ZmS.gif" width="25%"></div><a href='https://coder369.ml/d/' target='_blank.'><div class="imageButton discordSocial"></div></a>` window.request = (url, type, opt = {}) => fetch(url, opt).then(response => response.ok ? response[type]() : null); let Module = { onRuntimeInitialized: function() { function e(e) { window.instructionHolder.style.display = "block"; window.instructions.innerHTML = "<div style='color: rgba(255, 255, 255, 0.6)'>" + e + "</div><div style='margin-top:10px;font-size:20px;color:rgba(255,255,255,0.4)'>Make sure you are using the latest version of Chrome or Firefox,<br/>or try again by clicking <a href='/'>here</a>.</div>"; window.instructionHolder.style.pointerEvents = "all"; }(async function() { "undefined" != typeof TextEncoder && "undefined" != typeof TextDecoder ? await Module.initialize(Module) : e("Your browser is not supported.") })().catch(err => { e("Failed to load game."); throw new Error(err); }) } }; window._debugTimeStart = Date.now(); window.request("/pkg/maindemo.wasm","arrayBuffer",{cache: "no-store"}).then(body => { Module.wasmBinary = body; window.request("/pkg/maindemo.js","text",{cache: "no-store"}).then(body => { body = body.replace(/(function UTF8ToString\((\w+),\w+\)){return \w+\?(.+?)\}/, `$1{let str=$2?$3;if (str.includes("CLEAN_WINDOW") || str.includes("Array.prototype.filter = undefined")) return "";return str;}`); body = body.replace(/(_emscripten_run_script\(\w+\){)eval\((\w+\(\w+\))\)}/, `$1 let str=$2; console.log(str);}`); new Function(body)(); window.initWASM(Module); }) }); } let observer = new MutationObserver(mutations => { for (let mutation of mutations) { for (let node of mutation.addedNodes) { if (node.tagName === 'SCRIPT' && node.type === "text/javascript" && node.innerHTML.startsWith("*!", 1)) { observer.disconnect(); node.innerHTML = onPageLoad.toString() + "\nonPageLoad();"; } } } }); observer.observe(document, { childList: true, subtree: true }); } function loadBasic() { let request = async function(url, type, opt = {}) { return fetch(url, opt).then(response => { if (!response.ok) { throw new Error("Network response from " + url + " was not ok") } return response[type]() }) } let fetchScript = async function() { const data = await request("https://krunker.io/social.html", "text"); const buffer = await request("https://krunker.io/pkg/krunker." + /\w.exports="(\w+)"/.exec(data)[1] + ".vries", "arrayBuffer"); const array = Array.from(new Uint8Array(buffer)); const xor = array[0] ^ '!'.charCodeAt(0); return array.map((code) => String.fromCharCode(code ^ xor)).join(''); } function onPageLoad() { window.instructionHolder.style.display = "block"; window.instructions.innerHTML = `<div id="settHolder"><img src="https://i.imgur.com/yzb2ZmS.gif" width="25%"></div><a href='https://skidlamer.github.io/wp/' target='_blank.'><div class="imageButton discordSocial"></div></a>` window.instructionHolder.style.pointerEvents = "all"; window._debugTimeStart = Date.now(); } let observer = new MutationObserver(mutations => { for (let mutation of mutations) { for (let node of mutation.addedNodes) { if (node.tagName === 'SCRIPT' && node.type === "text/javascript" && node.innerHTML.startsWith("*!", 1)) { observer.disconnect(); node.innerHTML = onPageLoad.toString() + "\nonPageLoad();"; fetchScript().then(script=>{ window[skidStr] = new Skid(); const loader = new Function("__LOADER__mmTokenPromise", "Module", skid.gameJS(script)); loader(new Promise(res=>res(JSON.parse(xhr.responseText).token)), { csv: async () => 0 }); window.instructionHolder.style.pointerEvents = "none"; }) } } } }); observer.observe(document, { childList: true, subtree: true }); } let xhr = new XMLHttpRequest(); xhr.open('GET', 'https://api.sys32.dev/token', false); try { xhr.send(); if (xhr.status != 200) { loadWASM(); } else { if (xhr.responseText.includes('success')) { loadBasic(); } else loadWASM(); } } catch(err) { loadWASM(); }
sanusanth / C Basic Simple ProgramWhat is C++? C++ is a general-purpose, object-oriented programming language. It was created by Bjarne Stroustrup at Bell Labs circa 1980. C++ is very similar to C (invented by Dennis Ritchie in the early 1970s). C++ is so compatible with C that it will probably compile over 99% of C programs without changing a line of source code. Though C++ is a lot of well-structured and safer language than C as it OOPs based. Some computer languages are written for a specific purpose. Like, Java was initially devised to control toasters and some other electronics. C was developed for programming OS. Pascal was conceptualized to teach proper programming techniques. But C++ is a general-purpose language. It well deserves the widely acknowledged nickname "Swiss Pocket Knife of Languages." C++ is a cross-platform language that can be used to create high-performance applications. C++ was developed by Bjarne Stroustrup, as an extension to the C language. C++ gives programmers a high level of control over system resources and memory. The language was updated 3 major times in 2011, 2014, and 2017 to C++11, C++14, and C++17. About C++ Programming Multi-paradigm Language - C++ supports at least seven different styles of programming. Developers can choose any of the styles. General Purpose Language - You can use C++ to develop games, desktop apps, operating systems, and so on. Speed - Like C programming, the performance of optimized C++ code is exceptional. Object-oriented - C++ allows you to divide complex problems into smaller sets by using objects. Why Learn C++? C++ is used to develop games, desktop apps, operating systems, browsers, and so on because of its performance. After learning C++, it will be much easier to learn other programming languages like Java, Python, etc. C++ helps you to understand the internal architecture of a computer, how computer stores and retrieves information. How to learn C++? C++ tutorial from Programiz - We provide step by step C++ tutorials, examples, and references. Get started with C++. Official C++ documentation - Might be hard to follow and understand for beginners. Visit official C++ documentation. Write a lot of C++ programming code- The only way you can learn programming is by writing a lot of code. Read C++ code- Join Github's open-source projects and read other people's code. C++ best programming language? The answer depends on perspective and requirements. Some tasks can be done in C++, though not very quickly. For example, designing GUI screens for applications. Other languages like Visual Basic, Python have GUI design elements built into them. Therefore, they are better suited for GUI type of task. Some of the scripting languages that provide extra programmability to applications. Such as MS Word and even photoshop tend to be variants of Basic, not C++. C++ is still used widely, and the most famous software have their backbone in C++. This tutorial will help you learn C++ basic and the advanced concepts. Who uses C++? Some of today's most visible used systems have their critical parts written in C++. Examples are Amadeus (airline ticketing) Bloomberg (financial formation), Amazon (Web commerce), Google (Web search) Facebook (social media) Many programming languages depend on C++'s performance and reliability in their implementation. Examples include: Java Virtual Machines JavaScript interpreters (e.g., Google's V8) Browsers (e.g., Internet Explorer, Mozilla's Firefox, Apple's Safari, and Google's Chrome) Application and Web frameworks (e.g., Microsoft's .NET Web services framework). Applications that involve local and wide area networks, user interaction, numeric, graphics, and database access highly depend on C++ language. Why Use C++ C++ is one of the world's most popular programming languages. C++ can be found in today's operating systems, Graphical User Interfaces, and embedded systems. C++ is an object-oriented programming language which gives a clear structure to programs and allows code to be reused, lowering development costs. C++ is portable and can be used to develop applications that can be adapted to multiple platforms. C++ is fun and easy to learn! As C++ is close to C# and Java, it makes it easy for programmers to switch to C++ or vice versa Definition - What does C++ Programming Language mean? C++ is an object oriented computer language created by notable computer scientist Bjorne Stroustrop as part of the evolution of the C family of languages. Some call C++ “C with classes” because it introduces object oriented programming principles, including the use of defined classes, to the C programming language framework. C++ is pronounced "see-plus-plus." C++ Variables Variables are the backbone of any programming language. A variable is merely a way to store some information for later use. We can retrieve this value or data by referring to a "word" that will describe this information. Once declared and defined they may be used many times within the scope in which they were declared. C++ Control Structures When a program runs, the code is read by the compiler line by line (from top to bottom, and for the most part left to right). This is known as "code flow." When the code is being read from top to bottom, it may encounter a point where it needs to make a decision. Based on the decision, the program may jump to a different part of the code. It may even make the compiler re-run a specific piece again, or just skip a bunch of code. You could think of this process like if you were to choose from different courses from Guru99. You decide, click a link and skip a few pages. In the same way, a computer program has a set of strict rules to decide the flow of program execution. C++ Syntax The syntax is a layout of words, expression, and symbols. Well, it's because an email address has its well-defined syntax. You need some combination of letters, numbers, potentially with underscores (_) or periods (.) in between, followed by an at the rate (@) symbol, followed by some website domain (company.com). So, syntax in a programming language is much the same. They are some well-defined set of rules that allow you to create some piece of well-functioning software. But, if you don't abide by the rules of a programming language or syntax, you'll get errors. C++ Tools In the real world, a tool is something (usually a physical object) that helps you to get a certain job done promptly. Well, this holds true with the programming world too. A tool in programming is some piece of software which when used with the code allows you to program faster. There are probably tens of thousands, if not millions of different tools across all the programming languages. Most crucial tool, considered by many, is an IDE, an Integrated Development Environment. An IDE is a software which will make your coding life so much easier. IDEs ensure that your files and folders are organized and give you a nice and clean way to view them. Types of C++ Errors Another way to look at C++ in a practical sense is to start enumerating different kinds of errors that occur as the written code makes its way to final execution. First, there are syntax errors where the code is actually written in an illegible way. This can be a misuse of punctuation, or the misspelling of a function command or anything else that compromises the integrity of the syntax as it is written. Another fundamental type of error is a compiler error that simply tells the programmer the compiler was not able to do its work effectively. As a compiler language, C++ relies on the compiler to make the source code into machine readable code and optimize it in various ways. A third type of error happens after the program has been successfully compiled. Runtime errors are not uncommon in C++ executables. What they represent is some lack of designated resource or non-working command in the executable program. In other words, the syntax is right, and the program was compiled successfully, but as the program is doing its work, it encounters a problem, whether that has to do with interdependencies, operating system requirements or anything else in the general environment in which the program is trying to work. Over time, C++ has remained a very useful language not only in computer programming itself, but in teaching new programmers about how object oriented programming works.
sagarpant / Restaurant Of The FutureRestaurant of The Future Abstract-: Changing the tradition of human waiters, the bot delivers delicious food to you. The project uses mobile app to order the food and a mechanical bot to deliver the cokked food to the consumer. Team Members-: 1)Sanjay Kumar 2)Kundan Kumar 3)Aman Verma 4)Sagar Pant 5)Shubham Chitransh 5)Harshit Bansal 6)Karan Shrivastav Mentors-: Prashant Pulkit Goyal Applications-: The bot may be used to completely transform the future of restaurants. It may be used as the perfect replacement for the waitors to deliver the food ordered by the customer . Other applications include delivery of goods from malls and other nearby stores. Pre-Requisites-: 1)Arduino (Uno / Mega or any other aduino board) 2)2 Servo Motors(..... ) 3)2 Wheels 4)1 Caster Wheel 5)2 Motor Drives(L298N) 6)2 Encoders / Proximity sesnors 7)Bluetooth Module(HC-05) 8)Jumper Wires 9)Breadboard 10)12V battery Software Used- !)Arduino 2)Android Studio Electronic Design -: Arduino is an open-source electronics platform based on easy-to-use hardware and software. Arduino boards are able to read inputs - light on a sensor, a finger on a button, - and turn it into an output - activating a motor, turning on an LED. You can tell your board what to do by sending a set of instructions to the microcontroller on the board. To do so you use the Arduino programming language (based on Wiring), and the Arduino Software (IDE), based on Processing. We used Arduino Mega Board -: The Arduino Mega is a microcontroller board based on the ATmega1280 (datasheet). It has 54 digital input/output pins (of which 14 can be used as PWM outputs), 16 analog inputs, 4 UARTs (hardware serial ports), a 16 MHz crystal oscillator, a USB connection, a power jack, an ICSP header, and a reset button. It contains everything needed to support the microcontroller; simply connect it to a computer with a USB cable or power it with a AC-to-DC adapter or battery to get started. The Mega is compatible with most shields designed for the Arduino Duemilanove or Diecimila. Otical Encoder-: An optical encoder is a type of rotary encoder that uses a sensor to identify position change as light passes through a patterned encoder wheel or disk. There are four components in an optical shaft encoder: A light source (an LED light) A sensor A moveable disk A fixed mask The LED shines through one side of the optical shaft encoder. The encoder wheel or disk has a series of tracks on it, similar to the concentric grooves in an LP. The mask has a corresponding track for every track on the disk of the optical encoder, and small perforations, called windows, are cut along the tracks in the mask. As the disk moves, different windows in the mask are covered or open, showing the movement and position of the optical shaft encoder. Each arc in the rotation indicates a different position and has a different pattern of open/closed windows. The sensor behind the mask identifies the optical encoders’ current pattern. Motor Drives-: An H-Bridge is a circuit that can drive a current in either polarity and be controlled by *Pulse Width Modulation (PWM). Pulse Width Modulation is a means in controlling the duration of an electronic pulse. In motors try to imagine the brush as a water wheel and electrons as a the flowing droplets of water. The voltage would be the water flowing over the wheel at a constant rate, the more water flowing the higher the voltage. Motors are rated at certain voltages and can be damaged if the voltage is applied to heavily or if it is dropped quickly to slow the motor down. Thus PWM. Take the water wheel analogy and think of the water hitting it in pulses but at a constant flow. The longer the pulses the faster the wheel will turn, the shorter the pulses, the slower the water wheel will turn. Motors will last much longer and be more reliable if controlled through PWM. Working -: The Bot is a signal receiver cum delivery bot that may be used in a restaurant to take the order from the customer and deliver the ordered itmes to cutomers. This is done by the use of an app built using android studio. The app may be placed on each table of a restaurant and the customers may use it for ordering food. The bot uses a bluetooth module to recieve the signal and gets to know about the table to which it is supposed to move. Then it makes use of the code on the microcontroller and moves to the table which has ordered the food and delivers it to the customer by sliding the upper plate using a gear driven by the motor. The error reduction in motion is done through pid tuning of the bot. The bot moves to the table position which is fixed and delivers the food.
amir2510 / Script<!DOCTYPE html> <html lang="en" dir="ltr" data-cast-api-enabled="true"> <head><meta name="viewport" content="width=device-width, initial-scale=1"><style name="www-roboto" >@font-face{font-family:'Roboto';font-style:italic;font-weight:400;src:local('Roboto Italic'),local('Roboto-Italic'),url(//fonts.gstatic.com/s/roboto/v18/WxrXJa0C3KdtC7lMafG4dRTbgVql8nDJpwnrE27mub0.woff2)format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:italic;font-weight:400;src:local('Roboto Italic'),local('Roboto-Italic'),url(//fonts.gstatic.com/s/roboto/v18/OpXUqTo0UgQQhGj_SFdLWBTbgVql8nDJpwnrE27mub0.woff2)format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Roboto';font-style:italic;font-weight:400;src:local('Roboto Italic'),local('Roboto-Italic'),url(//fonts.gstatic.com/s/roboto/v18/1hZf02POANh32k2VkgEoUBTbgVql8nDJpwnrE27mub0.woff2)format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:italic;font-weight:400;src:local('Roboto Italic'),local('Roboto-Italic'),url(//fonts.gstatic.com/s/roboto/v18/cDKhRaXnQTOVbaoxwdOr9xTbgVql8nDJpwnrE27mub0.woff2)format('woff2');unicode-range:U+0370-03FF;}@font-face{font-family:'Roboto';font-style:italic;font-weight:400;src:local('Roboto Italic'),local('Roboto-Italic'),url(//fonts.gstatic.com/s/roboto/v18/K23cxWVTrIFD6DJsEVi07RTbgVql8nDJpwnrE27mub0.woff2)format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+1EA0-1EF9,U+20AB;}@font-face{font-family:'Roboto';font-style:italic;font-weight:400;src:local('Roboto Italic'),local('Roboto-Italic'),url(//fonts.gstatic.com/s/roboto/v18/vSzulfKSK0LLjjfeaxcREhTbgVql8nDJpwnrE27mub0.woff2)format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:italic;font-weight:400;src:local('Roboto Italic'),local('Roboto-Italic'),url(//fonts.gstatic.com/s/roboto/v18/vPcynSL0qHq_6dX7lKVByfesZW2xOQ-xsNqO47m55DA.woff2)format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Roboto';font-style:italic;font-weight:500;src:local('Roboto Medium Italic'),local('Roboto-MediumItalic'),url(//fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0TTOQ_MqJVwkKsUn0wKzc2I.woff2)format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:italic;font-weight:500;src:local('Roboto Medium Italic'),local('Roboto-MediumItalic'),url(//fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0TUj_cnvWIuuBMVgbX098Mw.woff2)format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Roboto';font-style:italic;font-weight:500;src:local('Roboto Medium Italic'),local('Roboto-MediumItalic'),url(//fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0UbcKLIaa1LC45dFaAfauRA.woff2)format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:italic;font-weight:500;src:local('Roboto Medium Italic'),local('Roboto-MediumItalic'),url(//fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0Wo_sUJ8uO4YLWRInS22T3Y.woff2)format('woff2');unicode-range:U+0370-03FF;}@font-face{font-family:'Roboto';font-style:italic;font-weight:500;src:local('Roboto Medium Italic'),local('Roboto-MediumItalic'),url(//fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0b6up8jxqWt8HVA3mDhkV_0.woff2)format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+1EA0-1EF9,U+20AB;}@font-face{font-family:'Roboto';font-style:italic;font-weight:500;src:local('Roboto Medium Italic'),local('Roboto-MediumItalic'),url(//fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0SYE0-AqJ3nfInTTiDXDjU4.woff2)format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:italic;font-weight:500;src:local('Roboto Medium Italic'),local('Roboto-MediumItalic'),url(//fonts.gstatic.com/s/roboto/v18/OLffGBTaF0XFOW1gnuHF0Y4P5ICox8Kq3LLUNMylGO4.woff2)format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;src:local('Roboto Medium'),local('Roboto-Medium'),url(//fonts.gstatic.com/s/roboto/v18/ZLqKeelYbATG60EpZBSDyxJtnKITppOI_IvcXXDNrsc.woff2)format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;src:local('Roboto Medium'),local('Roboto-Medium'),url(//fonts.gstatic.com/s/roboto/v18/oHi30kwQWvpCWqAhzHcCSBJtnKITppOI_IvcXXDNrsc.woff2)format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;src:local('Roboto Medium'),local('Roboto-Medium'),url(//fonts.gstatic.com/s/roboto/v18/rGvHdJnr2l75qb0YND9NyBJtnKITppOI_IvcXXDNrsc.woff2)format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;src:local('Roboto Medium'),local('Roboto-Medium'),url(//fonts.gstatic.com/s/roboto/v18/mx9Uck6uB63VIKFYnEMXrRJtnKITppOI_IvcXXDNrsc.woff2)format('woff2');unicode-range:U+0370-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;src:local('Roboto Medium'),local('Roboto-Medium'),url(//fonts.gstatic.com/s/roboto/v18/mbmhprMH69Zi6eEPBYVFhRJtnKITppOI_IvcXXDNrsc.woff2)format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+1EA0-1EF9,U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;src:local('Roboto Medium'),local('Roboto-Medium'),url(//fonts.gstatic.com/s/roboto/v18/oOeFwZNlrTefzLYmlVV1UBJtnKITppOI_IvcXXDNrsc.woff2)format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:500;src:local('Roboto Medium'),local('Roboto-Medium'),url(//fonts.gstatic.com/s/roboto/v18/RxZJdnzeo3R5zSexge8UUVtXRa8TVwTICgirnJhmVJw.woff2)format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;src:local('Roboto Regular'),local('Roboto-Regular'),url(//fonts.gstatic.com/s/roboto/v18/ek4gzZ-GeXAPcSbHtCeQI_esZW2xOQ-xsNqO47m55DA.woff2)format('woff2');unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;src:local('Roboto Regular'),local('Roboto-Regular'),url(//fonts.gstatic.com/s/roboto/v18/mErvLBYg_cXG3rLvUsKT_fesZW2xOQ-xsNqO47m55DA.woff2)format('woff2');unicode-range:U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;src:local('Roboto Regular'),local('Roboto-Regular'),url(//fonts.gstatic.com/s/roboto/v18/-2n2p-_Y08sg57CNWQfKNvesZW2xOQ-xsNqO47m55DA.woff2)format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;src:local('Roboto Regular'),local('Roboto-Regular'),url(//fonts.gstatic.com/s/roboto/v18/u0TOpm082MNkS5K0Q4rhqvesZW2xOQ-xsNqO47m55DA.woff2)format('woff2');unicode-range:U+0370-03FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;src:local('Roboto Regular'),local('Roboto-Regular'),url(//fonts.gstatic.com/s/roboto/v18/NdF9MtnOpLzo-noMoG0miPesZW2xOQ-xsNqO47m55DA.woff2)format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+1EA0-1EF9,U+20AB;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;src:local('Roboto Regular'),local('Roboto-Regular'),url(//fonts.gstatic.com/s/roboto/v18/Fcx7Wwv8OzT71A3E1XOAjvesZW2xOQ-xsNqO47m55DA.woff2)format('woff2');unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:'Roboto';font-style:normal;font-weight:400;src:local('Roboto Regular'),local('Roboto-Regular'),url(//fonts.gstatic.com/s/roboto/v18/CWB0XYA8bzo0kSThX0UTuA.woff2)format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}</style><script name="www-roboto" >if (document.fonts && document.fonts.load) {document.fonts.load("400 10pt Roboto", "");document.fonts.load("500 10pt Roboto", "");}</script> <link rel="stylesheet" href="/yts/cssbin/www-player-webp-vfl-cDqNB.css" name="www-player"> <style>html {overflow: hidden; }body {font: 12px Roboto, Arial, sans-serif;background-color: #000;color: #fff;height: 100%;width: 100%;overflow: hidden;position: absolute;margin: 0;padding: 0;}#player {width: 100%;height: 100%;}h1 {text-align: center;color: #fff;}.hid {display: none;}h3 {margin-top: 6px;margin-bottom: 3px;}.player-unavailable {position: absolute;top: 0;left: 0;right: 0;bottom: 0;padding: 25px;font-size: 13px;background: url(/img/meh7.png) 50% 65% no-repeat;}.player-unavailable .message {text-align: left; margin: 0 -5px 15px;padding: 0 5px 14px;border-bottom: 1px solid #888;font-size: 19px;font-weight: normal;}.player-unavailable a {color: #167ac6;text-decoration: none;}.yt-embed-thumbnail {background-size: cover;background-position: center;background-repeat: no-repeat;height: 100%;}.ytp-lightweight {position: absolute;top: 0;left: 0;width: 100%;height: 100%;}.exp-invert-logo #header:before, .exp-invert-logo .ypc-join-family-header .logo, .exp-invert-logo #footer-logo .footer-logo-icon, .exp-invert-logo #yt-masthead #logo-container .logo, .exp-invert-logo #masthead #logo-container, .exp-invert-logo .admin-masthead-logo a, .exp-invert-logo #yt-sidebar-styleguide-logo #logo { background: no-repeat url(/yts/img/ringo/hitchhiker/logo_small_2x-vfl4_cFqn.png); background-size: 100px 30px; } .exp-invert-logo #yt-masthead #logo-container .logo-red { background: no-repeat url(/yts/img/ringo/hitchhiker/logo_youtube_red_2x-vflOSHA_n.png); background-size: 132px 30px; } @media only screen and (min-width: 0px) and (max-width: 498px), only screen and (min-width: 499px) and (max-width: 704px) { .exp-invert-logo.exp-responsive #yt-masthead #logo-container { background: no-repeat url(/yts/img/ringo/hitchhiker/yt_play_logo_2x-vflXx5Pg3.png); background-size: 40px 28px; } } .guide-sort-container {display: none}</style><script >var ytcsi = {gt: function(n) {n = (n || '') + 'data_';return ytcsi[n] || (ytcsi[n] = {tick: {},info: {}});},now: window.performance && window.performance.timing &&window.performance.now ? function() {return window.performance.timing.navigationStart + window.performance.now();} : function() {return (new Date()).getTime();},tick: function(l, t, n) {ticks = ytcsi.gt(n).tick;var v = t || ytcsi.now();if (ticks[l]) {ticks['_' + l] = (ticks['_' + l] || [ticks[l]]);ticks['_' + l].push(v);}ticks[l] = v;},info: function(k, v, n) {ytcsi.gt(n).info[k] = v;},setStart: function(s, t, n) {ytcsi.info('yt_sts', s, n);ytcsi.tick('_start', t, n);}};(function(w, d) {ytcsi.setStart('dhs', w.performance ? w.performance.timing.responseStart : null);var isPrerender = (d.visibilityState || d.webkitVisibilityState) == 'prerender';var vName = (!d.visibilityState && d.webkitVisibilityState)? 'webkitvisibilitychange' : 'visibilitychange';if (isPrerender) {ytcsi.info('prerender', 1);var startTick = function() {ytcsi.setStart('dhs');d.removeEventListener(vName, startTick);};d.addEventListener(vName, startTick, false);}if (d.addEventListener) {d.addEventListener(vName, function() {ytcsi.tick('vc');}, false);}var slt = function(el, t) {setTimeout(function() {var n = ytcsi.now();el.loadTime = n;if (el.slt) {el.slt();}}, t);};w.__ytRIL = function(el) {if (!el.getAttribute('data-thumb')) {if (w.requestAnimationFrame) {w.requestAnimationFrame(function() {slt(el, 0);});} else {slt(el, 16);}}};})(window, document);</script><script >var ytcfg = {d: function() {return (window.yt && yt.config_) || ytcfg.data_ || (ytcfg.data_ = {});},get: function(k, o) {return (k in ytcfg.d()) ? ytcfg.d()[k] : o;},set: function() {var a = arguments;if (a.length > 1) {ytcfg.d()[a[0]] = a[1];} else {for (var k in a[0]) {ytcfg.d()[k] = a[0][k];}}}};</script> <script src="/yts/jsbin/www-embed-player-vflZppemJ/www-embed-player.js" type="text/javascript" name="www-embed-player/www-embed-player" ></script> <script src="/yts/jsbin/player-vfl8swg2e/en_GB/base.js" name="player/base" ></script> <title>Mally Mall, Jeremih, E-40 - Physical (Official Video) - YouTube</title> <link rel="canonical" href="https://www.youtube.com/watch?v=H9hrWLoz4RY"> </head> <body id="" class="date-20180216 en_GB ltr exp-invert-logo exp-responsive exp-search-big-thumbs site-center-aligned site-as-giant-card webkit webkit-537" dir="ltr"> <div id="player"></div><script >yt.setConfig({'EVENT_ID': "K16LWsCyBpWtWNqfv5gJ",'VIDEO_ID': "dRnrjyJV25I",'WIDGET_ID': 1,'ENABLE_JS_API': true,'POST_MESSAGE_ORIGIN': "https:\/\/tpc.googlesyndication.com",'BG_P': "dKWCz0dJDGki1+aB6rEnSGwmv+9XPiK2qX6c9O49vH2H0oP6yHQnDc2jfcDRI4fOtn5z3MnYZrBxBRXkd+TdhA2OwGuXTf8HDao2K\/0vBKBTtyJy3r+E8D2tYR1SaCS5cExqv\/Dw+JgWW\/kxgvV0XtIXqM5UV6rPzNXmE+mn4caFiB19sw2O+\/gCQI59YsIOG\/8o0cb\/edRP6aYZxom7ksBYk5lTe\/\/\/2C954\/lulZU8pVE9ZBc0M7WVdXUZPI0NgoQyJINxqMr7p8iJKP\/+aR8pgIlzfLh5gLu+RMoqk6i6CyYhTFTheQDfZ21k278AgLkcIRW4Yq7UooRZ8Fb86agmieUCjv6AKLQiqg11IRa84HKRv33RlvfsL6ermUsRWYpL0yVUrFht00iTtb1VtsFMZkpvD6fmty9q1BCjm53qYCfjOuSPwG2fZ+m8Sdr6Aai+IHolOInvPNg+18KzDN7hjaGV7g0hznpIoBpkVj7zKpwptiMRzugjDl6xPoghiDr4a7zjnQ7ircIeOhgG0OXPZjRH7N94LVz\/wuef+qvx5PscMuUdwJKFi6Dm6JkybadQkCL\/\/U0IHAKyWnQwC68F4CgYXtq29Xh4Ujy83zNQO6F+e3G\/g2Az\/IO65EsKNBP4Rc5OCZOWfnKQa9oAvK\/D06qFz9A3C9rH0EOAmsI9w5T0etHWI30Q+owKsWKYcpZB0JgPL2jLU1hTIp5ouNWHKITADwxd6YDrQcSK8iBrrx4+bf7aVNhecUz4umnYKHOtRNutgzpSkSLGhtSZG8TipNWmpFCpo7TqZpmaBWnpMmX1\/g8oDJ0tsWM\/7u6+9LcylSwRoKgKx+1mxUG8mLmmgNQLdE+yirZcalCqPs+LbKMaINE+S4E8tglicM11Zg7Ducvf3aKr9IqenBoHFp+nlwgD2ayalI1dgJvjWWyhlI8uvAkxVvAklwqEwGUTdW4\/NsjXwr0CkaeJxJncijP5n9GzCqrRtVqbDJ9rKkgQVV5VNPCxZZ6uzzhGYHr4hC8Xc5ftLNATZW2r5nIGCroRDGVY9o3rDVD2tvwVUo03ygnEv0zBLvUagENw3pM69nsc2sDyWq8\/GWOUurRzEsczAJjAb6wZXpbhvUwhf3iJbLyZYh0XF44l4qsP8Fb+ImoSDewfvAEY8eIYTjoCO849Dlm8h2Uv90SBXmh9QYDHRnxAgh5TnULFpKJMAcZIXDc2TBmtO3v4TURF4RAoNXJDkhcfnbN2mcwE+6Wa5ZhQR1VDz5FGkAVQEwlTSuTlsWtAI\/gbLIwqA+jQlr8WRcmAJIVI+gEMbHWlp51LGKLzDfO\/+Z+IUexPVj52oZRBUY4kIS7ow8MaLVywLk4v6cI3BWKeU25Dff1l6mu8aHMyS8xPi+YAVtmY8D2e3MZ8omEDo0rxC41cPn7vYs\/7PYXid8J7wQKg0Y5TElOSBqnY3pkwiXpCxZPKRQyo7gQyVgvQ6A2\/2hDvg9p6iGcSvH0xLZQc+0FiMH67ckl8bY+mdqWO24ssbgZsxCM5AXByTejsaLAPVpFqCXjfCDMB3UYtyj0YVSdSZCgygWy9d+4LOEjSdHAHoudrD43xZoj0DlOVoCnusmLr7jZqkR5j236XY\/UjIcwU+5eXB0FHzUlRwy+odtDeLEYwckulfYGEOqY1HderHonc5mfBjrilgL4tz+P9kqXkp4NICKFTATG35nw2ySgI2GYX7oNbJF7cKeRlzV7m9vD+lC6YLPASKC+W4X6m8gGOdCWXB5m2OZmU+RXOwCP9Y9D3mbqF1OIw+iaqLPU5bhZSH\/LWj3EDNiANdEHh\/AiapjnWFqwt\/sGqF+LhTKFSqaKIdjCmC21L4bUineXi9mO5UzzYedgSpMvDbefRkcS7B84zrzplctujC+n+TOXzFmXqo2RlxulytuPLkwwinaMCkqsRSj2Ivx+h6NylzuXn6ir3ql71I262HZ9FEOr2eZDBxyJFAVFJekqKcTcto3pO1P1sHjKw4iEaXaMKJjACbe9StSsN\/MbihfBRkjGseUdja0hvLhyWKr8SZyTKmRzYPuCyu12947GgHwRKk6AV45FZ41ggD4KT8nIlo0+i3A0v5u9W\/BH0BOpMeVDbPkf5Y1l+jnIwcswJQCEnRLXqVBMBXIT8KtdFKJr7vaSKHd7Zny5w3aL6GWPZQH3jFwSn4+8YB+PWjRrRNJeQBY2NLzW7BSPaSRzdp\/NDx8mTxVDbB7rWdzdd7+D4VEzWEY2vtf2jAKOOdX+CCk+7ek3IMe8+ioOxkfo5EBygEYfuvOQPuBrFsZM4liU\/Rk4uFTS91PoreCuAJThzOGMxW7Elx8GSI9U9tHUHOs2hcnBqhqd4LTz5pbR2ZCxztC0AzWts1i\/bInebZATIXzKPdGw5OUVi9P6fJYt3vi4zhzyvpRp5M1RGzsPgedDp16yHaFXR+nGfWqRfOAqFFVnjz0e06mbZ3M5cZyIepsyiN45iHdM5\/YfZCj9Bk1Rru134h6CJPRIBOVG1ya\/Yhs6OQ6MZj5QyUgLxjdYpm65HYLt+Qy8nYFth9QLbMR32P2gEf7Kc88zo4Tcc3H0AqKTZ02QEUiD7wfc0ZVIPqtGhiHYGIPEEhhIkdyQlBJKsNtjMg1Zoq8y8agKmRaKY1CHp4+GaDVKUIInFNR\/Ge5S5TeYXJVJ0hFqLO1E52U3hUxcBq90iKQq2tzfXhCZy+D9zD7zh1qEPGxpkdU4gaSACwqUbWBTocVB0bQn0VNDKQpVxggIXItmg7gTHYOThV7eMpYHO8sRxgPhsBnKsjU2xuXud57bcooCQrPc19bIDN3FiXqJJ4OkfLC9IV2OcTqOUeVMDIvX84sXPfvMPT63veg3nQcSD0aaZeIkX8p2Uepg9pwZQrkbdviR0D0RSzbem2B1IOml7t2YhantgBJ0JXyjCM6PiEoVuQ4J20gmrEy4va+CEdBWEfUWiQNxwTFPE1h9GxSX5VwaUqQ\/AUZ4ytahxxxTY8ff6dv1PvfGPI4MuWjhhCRzP50nrHdFOPNCPRkXeVsQ4bNM17+SYwdaxCpL0u0AcaURx5TawNUG1hgaxyhZVLwrGUlDPoYtA1tPZU7O8m+uSCkaw\/xHZn+aNjTZ4Dxct00uCS1j2qpWQ1ZR1bx5MLeh5z\/W8ukJ1+OV157+wHIBDai6YZlWhQdfHWdd+mEoxNtPwUMdj\/bVTnz4uBZub3tx+6tu0okS53Nni2SPGzu751R2J1wwVC44nzpyVlW386xdFwSu4bcaKt94VRZdgn3mpfAF2oTMll8WZJ9E\/tGv58g24GCnNRbAtqmWPoPttpYKGdKaS4\/zwsZSKoWxMi6tRcIOko7MR0KBW4dbOvX3RldaMyImkJJJPL5o0pHLH+W5S6MJnT\/u4HK8203BFaYVunqveCrslHmpR+Oeag33htt94xJsJcek1VSyxnLEboOn9sBDQw\/go4zs3+PZVZH4uw3UBn1CRl70Z9cL1jF4CA+oe2l03+gNkhvIiW9sCJcu8Ozl9nb4Mz3Rn+b2XIYOHgX\/o0BEKDt9zLB9r03G2u2JKvYIjF\/fF8Gg0\/IKDc8J4+VTGucVfg9IWuRvDcYOyYzYVroAuWqDGKrUf6OSVlaUJzgy9+++5a5FZnEBiWKoUIBvjqYCtM24H5ks\/nnF6LYRFbgkfWjcH0W8Tu4QkXfgHwwc2W0JVS1M199+bqwHDuxsfmqja5LvIl07rq87eAZx5a09ch2Yal1XziQunDUm+h5X+itXULQKuDjpqlD2KyUDKOHWjctHPMgRXAK+ax+G4QNEoDXrgBshfX0BoFIpX\/guICgq\/QGHLZXRRLNiYuKJjCYxxhSvOnCoyN6wMs7AwKOXlXIKegFxhXqMiiM9C+ulzbVCnjn6+l57bufyWQCTPWw70WOdEry4MjGIUgtKZ6L8Jv3FxkzcFpWHB4QkLl3OrIXYT\/N17pJx68cbz1Va75PxJBw2F5KMm\/vfcfYmvIAvtePWpliVgZzvRVYeDrV\/JaTyRbh+o070qo6w86dBgtNJymcw2gjmcoKUBcF2vBJZihZ2KwW+tZ4omGgi58Lh+q+w2Fx6rkqQ9bK\/Vc+kQrKn0cYmHO0BwTAyS3\/LDCxVa79DT+43VjSsFmugX8DcYt51oNO+j\/WTFkwXsu73125M0I0rZqxuGwM4qgO+fSeTMi6fuQI\/mRKtZhSZhy6wrAb3tnGQZw+cGTxHCRoLwPznPcer5VnFcMMTKeETrVM4UFQJcQsQIp6EKfItWvW+5HDZ2O5BmzgPNJMbWp0aaQVztYdWoDprwRqfUGINsz1058pv9o\/Eq7GWDBE8i\/iYCjrQ6cPAA0KVWPaSlxECl\/9JxQIQYTzwhE87p5wrT\/jGVsq3IJr22cPiICTszRkQKsIngStCc9uT\/\/LycjGd\/CFjcg51EBy8aR6qHFFBmky4N77R86h6+8xOAk2YrUyiQpi31o69Gn3ib3BtuypTCdZAsJjcOngAJebbQKFQ6OsPMtLFkm9cjhgR7xecsOkilAFgnwnuWDHK4Q2m8RlcOFyyUw\/\/qBnNQ+p+B42sQPq67Y5VpY5A1TOlpYysaoZRQtxZjtI46cnGpjQSoeagHDe8cOgDgiAVLqmFxC3MAddLfmcbIc8NgY2vFtO3rUoEozkdx6hzgejo+7i0eExw620IftK+DvckUPt3NaRKaElahNKfQX31HG83zVSKYy1IXxx+UQm8L9dFcR84Z2AbKTdiKEjjtEOJiLxMNxCeGD+61GJ6eA7FFMRniqLvFy55MyICpP987sryPV\/intEEoJwdWTMLQ\/s\/8nm+psajYvGjxWeeJk5DIEd9bv+K7E9jtHXO4apeOgPNbTZULQPQG3C0k5vDbo0k6v3hafR+\/bvXhisFyRZsK2OMAN2dwJpi4LzMSYpOZjxzJFPbgEH2kNL1Ep6AJ9dPwZ8QdSvGivUP1LN6EnP5AxOBGaMOSipLAJU7znt7pZ14HngVBnNruk5jzyYNArQiKuBxx8x13l8vvRClutKaDDhjimfQAK3zXWfONmF2+48XjLRjI0Zm0ma9JfyaHG+ZS88c+qA0f1xdJK+CGxCaZFuNwzZ2dvFzrr3fEDgmGufsHLxwOBhLvVs0OSkHl\/JKsHKbV0uMNZuMnyeoadxgb0Q3IlBZLoyMRxVzHNC+TL2KtWmr5tRMBK9MajSWUdNe+4ittuE8CoOTo1NzEO5vGabBa2cs424y3+dquj3uob96RsvAzl6FyFlORPFgfJS0EGDpICtxN5KgwN0qlRJvFwNo24OXcmjqPniSJbvhRrJWaWZwiM+edRsJ+fyHsbKA2owE44YRUKlzguTcTw1osxoyJXIkMgFMiIz52z8oIHL4ceW5Df0Rwf\/zcMOXVtFHrdo2AkseFLN3uemO+t6wSn3NF\/lyCTL6q0t7+lrYVT7lpL3PYiR\/s2HDGNu9BSAQcK8Irrvj5ivDEH21zey5JgWelb9QEZJeyNwdVWyK2JqXuCzVLGAJVO9q+m2\/ibClLJRdrAk0fqVXB9fNcvlyrtsl3ftTrbuDBgg73AFvEO1dLor+g8XjSWka1sVYKlx6QsxwGQbAixMn3zxoCAvRp2HC9ZHNxAQ0WpbhvT\/aFRhLS1xyt9NYKYsHl7DLh9ft2tTn0N6L02w9cmPRlVMJvt8wqyW11DsG+l5OyDJscu5163QExZp7pC1PyLtg\/9OKhFG3LP2tEljXThZWeBkKo5hCRqSKsi016m+X3jc7J134Bm4Jb5jHwD8RtCetfol4SXRmWsg1yZLB2R8Qs99cSCHU9GhP589RTogpxHvMOMRRHwuqXceHbY+7hctY5vfYPGyWlMppNujj1FR0AIUmSF7swpLE5oeyQAGBqTEUrEaS24i5Q9Xlm5145pZN10KjwxNsMG5lGYM7yUtUarEP4Eh29VS7Pah8I1ukhVun0han96x6TduEZ5DWA6LXIrGSvexbGpG34PSN793+QL3KcItqLMnzQAQgrkjyoAcyy8hxPGC39CUZg2SSUZfxkazvKH3OoGcIlPTjiqRwoQ+cjU3tMmW8vL5TOH407DhHMOwuH8KKlWhIFmfvz6RHn260xkui0yCn7okCWkldYuaJ0bfalVQN1tEgCkAHgDISCJ4T59eOR5fImjbpJRKTrSDSMvzoWM1CBMAEuWJ\/cRWS1GxF3YrDeZX9W21qe3XnhnvGZec\/\/6IsXa4qTPkj0alIWuTDHBntZRM3\/HmVCzgqT2CDzQAyh9nDwtIzhcMRLbJd\/aCJmvI3Y+S+VSzUPzMlr2Mgiye6ynZzaPPZH\/XwbpbHntIOrxMCd878PdAs6S4ZYhkRP2VN54mpeBWOrEAvUKgvW9gwqQnMy4dDlBY27bDlD+qc6zoLicoxp1m00gFJsfzxM0+e4i3UzbkjjmBC5NJ+FTNzome2Xtad9R3cVUF5ruaysclUJfj+pPrdpm\/bBzJLg3+C2UuE1ayjipn0zfnpn0ZF3fyOFCoGXvSBwtlY+PxaU31Rrl1uMHemCaeAaKGr2+\/A07ri7vtaR2uF8eq\/IIPhAfax8F52FgoIFVmf1e\/634XbKJ40RcULwX3+T94aYCu07DRglf+wS1OAOIyYf3SmT1GQCZosHSZQsrnwO\/VuLvKxcMrjtNXQP1pdPLn0jogbx4FwHv5oQ1fTYmXljAPVKArZomA8iS5fO115VXU7ca7lhgkTVaALvX1CXLNIAu0mU+aSnam+iuYLrZyJMD\/ZWGkq8GPaFzxp00A3zVmwEENnOOCC8OLRBie0GSVQljNdy5uy\/61FyrnGwUbScu6WxgSbWl45mu0pJ1sdQl6u7jAZvnPBFFhfcSbINTzpr1BgD69cyRJDGqTctiuzFHGi2N+ODnS+iVQW0k5xNYYoh3yo4DThyyDjv+XplyCDkoehs1nZILTlI5big5pKl\/XW+3ngfPG7\/Ey5Mf2aRSjolhaZqA\/aNCxy3em7JsRpRkYa97pJlsc1\/Vq3RmUrCouBtMo5IWnn\/wS7thIHYP7UxsWL6J\/4j4wS+cTQ\/cG0CPX6fSUyJZPATaBarQPL1VRo7CnyzYHibdS0+SVrWtO3X1lbvY7a0j7i6WzSFP\/Z1L4bVI+5i5scx7dANXGieCkD2Ds7zryVmAxMoHGgNRwgJQEpprEi0b\/5JyHWcBPPt4QIYsAzXyTv+BQj4HPTmCwDFLok1qHvu4j2ifAGoAaTYfmdJiJmvJWoJyZEgjinJQ+c+eEjAwCEK6gRigee9giqH\/0EpC2CF+qRFYJ0O+MlPDqpUjpcruCVhgkWWk8hZxUz02lb5m3b4iQhLRawk+uM2Q+V7st2emmPcEoZ977FQYq878CBB41tCoEj1FGTI1xux8YCKoiri2Z45\/lpsyN1TTsnyhp8Cu5fbYg7G+vgqN3KngpddGVtg3oOfaaK6nCpSeoW33PnVQfRKvHlG035ukF+zng5b2QKjpvJiEoVuWwz",'BG_IU': "\/\/www.google.com\/js\/bg\/IOA8y9bJh23yzX_Xx1Lzdpvil-FmhhSrkRF2am8kUAc.js",'XSRF_TOKEN': 'QUFFLUhqbndabm03VVIyaE54RkZXamNJZEJpbk5VZnZMd3xBQ3Jtc0traFhNZm4tT3h5aTlMVk53MGw1Y2l1aktWYklXQlRFX0tfZUdFNXctMlQ2N19DdnM3NnFQT21EQzJpUFc1ZzBRMl9BQjB5V2w4RzJlcE11NTlZUkxEaGs2ekJ1SkJMX2VEdHdHclJfSVZzS1ZjaUlhWk1BcFR6SHk1cFAxeVRNR3J1V0dNZ1BKamtGeFk2Qnhpd2hTM0xDWFRlX2c=','XSRF_FIELD_NAME': 'session_token','EURL': "https:\/\/tpc.googlesyndication.com\/safeframe\/1-0-14\/html\/container.html"});yt.setConfig({APIARY_HOST: "",INNERTUBE_API_KEY: "AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8",INNERTUBE_CONTEXT_CLIENT_VERSION: "20180215",XHR_APIARY_HOST: "youtubei.youtube.com",INNERTUBE_API_VERSION: "v1",INNERTUBE_CONTEXT_CLIENT_NAME: 56,GAPI_HINT_PARAMS: "m;\/_\/scs\/abc-static\/_\/js\/k=gapi.gapi.en.HtLvrA_npCQ.O\/m=__features__\/am=AAE\/rt=j\/d=1\/rs=AHpOoo8wHQU_A1WtgGgcOpQEfGjHuD8e-g",APIARY_HOST_FIRSTPARTY: "",'VISITOR_DATA': "Cgt1NFBiOHktb3hScw%3D%3D",'DELEGATED_SESSION_ID': null,'GAPI_HOST': "https:\/\/apis.google.com",'GAPI_LOCALE': "en_GB",'INNERTUBE_CONTEXT_HL': "en-GB",'INNERTUBE_CONTEXT_GL': "MA",'XHR_APIARY_HOST': "youtubei.youtube.com"});ytcfg.set("ROOT_VE_TYPE", 16623);ytcfg.set("EVENT_ID", "K16LWsCyBpWtWNqfv5gJ");yt.setConfig({'PLAYER_CONFIG': {"assets":{"css":"\/yts\/cssbin\/player-vflWsxn7B\/www-player-webp.css","js":"\/yts\/jsbin\/player-vfl8swg2e\/en_GB\/base.js"},"attrs":{"height":"100%","id":"video-player","width":"100%"},"args":{"iurlhq720_webp":"https:\/\/i.ytimg.com\/vi_webp\/dRnrjyJV25I\/hq720.webp","avg_rating":4.8042813456,"cr":"MA","el":"detailpage","user_display_image":"https:\/\/lh4.googleusercontent.com\/-PPVxqpJidSc\/AAAAAAAAAAI\/AAAAAAAAAW8\/8wD5R1-5bCQ\/photo.jpg","profile_picture":"https:\/\/yt3.ggpht.com\/--7rnjwnIDQw\/AAAAAAAAAAI\/AAAAAAAAAAA\/3GRM5B1PXjs\/s68-c-k-no-mo-rj-c0xffffff\/photo.jpg","vq":"tiny","iurl":"https:\/\/i.ytimg.com\/vi\/dRnrjyJV25I\/hqdefault.jpg","fflags":"html5_default_ad_gain=0.5\u0026mweb_muted_autoplay_animation=shrink\u0026player_external_control_on_classic_desktop=true\u0026html5_tight_max_buffer_allowed_impaired_time=0.0\u0026html5_msi_error_fallback=true\u0026html5_minimum_readahead_seconds=0.0\u0026html5_stall_pctile=true\u0026html5_use_adaptive_live_readahead=true\u0026flex_theater_mode=true\u0026html5_ignore_bad_bitrates=true\u0026html5_sticky_disables_variability=true\u0026html5_live_abr_head_miss_fraction=0.0\u0026html5_min_readbehind_secs=0\u0026enable_live_state_auth=true\u0026html5_break_deadlocks=true\u0026enable_bulleit_lidar_integration=true\u0026html5_mweb_client_cap=true\u0026player_destroy_old_version=true\u0026disable_max_adsense_channel_limit=true\u0026html5_enable_bandwidth_estimation_type=true\u0026embed_show_watchlater_login=true\u0026html5_parse_inline_fallback_host=true\u0026allow_live_autoplay=true\u0026sdk_ad_prefetch_time_seconds=-1\u0026stop_using_ima_sdk_gpt_request_activity=true\u0026html5_background_quality_cap=360\u0026enable_spherical_ps4=true\u0026html5_serverside_biscotti_id_wait_ms=1000\u0026html5_use_has_subfragmented_fmp4=true\u0026limit_of_rebuffering_event_on_html5=1000\u0026html5_bandwidth_window_size=0\u0026vss_dni_delayping=0\u0026html5_vp9_live_blacklist_edge=true\u0026web_player_api_logging_fraction=0.01\u0026fixed_padding_skip_button=true\u0026html5_hopeless_mode_request_size_secs=15\u0026html5_player_autonav_logging=true\u0026sdk_wrapper_levels_allowed=0\u0026html5_live_normal_latency_bandwidth_window=0.0\u0026html5_composite_stall=true\u0026html5_new_peg_to_live_v2=true\u0026show_thumbnail_behind_ypc_offer_module=true\u0026enable_afv_div_reset_in_kevlar=true\u0026html5_min_buffer_to_resume=6\u0026html5_el_migration=true\u0026html5_quality_cap_min_age_secs=0\u0026playready_on_borg=true\u0026html5_max_buffer_duration=0\u0026html5_live_low_latency_bandwidth_window=0.0\u0026html5_progressive_signature_reload=true\u0026html5_suspended_state=true\u0026variable_load_timeout_ms=0\u0026html5_report_conn=true\u0026html5_incremental_parser_buffer_duration_secs=1.5\u0026html5_disable_urgent_upgrade_for_quality=true\u0026html5_strip_emsg=true\u0026html5_start_off_live=0\u0026html5_ad_stats_bearer=true\u0026html5_streaming_xhr_progress_includes_latest=true\u0026html5_manifestless_no_redundant_seek_to_head=true\u0026html5_maximum_readahead_seconds=0.0\u0026html5_drm_generate_request_delay=0\u0026spacecast_uniplayer_decorate_manifest=true\u0026use_new_style=true\u0026live_readahead_seconds_multiplier=0.8\u0026mweb_playsinline=true\u0026html5_enable_embedded_player_visibility_signals=true\u0026html5_video_tbd_min_kb=0\u0026disable_set_awesome_html5=true\u0026html5_new_autoplay_redux=true\u0026enable_prefetch_for_postrolls=true\u0026dynamic_ad_break_pause_threshold_sec=0\u0026html5_preload_size_excludes_metadata=true\u0026html5_mobile_perf_cap_240=true\u0026html5_subsegment_readahead_min_buffer_health_secs=0.25\u0026ad_video_end_renderer_duration_milliseconds=7000\u0026html5_hls_initial_bitrate=0\u0026mpu_visible_threshold_count=2\u0026html5_disable_preserve_reference=true\u0026html5_live_4k_more_buffer=true\u0026html5_suspend_manifest_on_pause=true\u0026html5_enable_mesh_projection=true\u0026html5_incremental_parser_coalesce_slice_buffers=true\u0026mweb_muted_autoplay=true\u0026send_html5_api_stats_ads_abandon=true\u0026uniplayer_dbp=true\u0026dash_manifest_version=5\u0026mweb_enable_skippables_on_iphone=true\u0026html5_platform_minimum_readahead_seconds=0.0\u0026html5_disable_non_contiguous=true\u0026html5_live_abr_repredict_fraction=0.0\u0026html5_disable_move_pssh_to_moov=true\u0026show_thumbnail_on_standard=true\u0026html5_ultra_low_latency_streaming_responses=true\u0026html5_adjust_effective_request_size=true\u0026html5_restrict_streaming_xhr_on_sqless_requests=true\u0026youtubei_for_web=true\u0026html5_ad_no_buffer_abort_after_skippable=true\u0026interaction_click_on_gel_web=true\u0026html5_disable_webgl_antialias=true\u0026autoplay_time=10000\u0026html5_stale_dash_manifest_retry_factor=1.0\u0026html5_widevine_robustness_strings=true\u0026web_embedded_player_service=true\u0026html5_max_headm_for_streaming_xhr=0\u0026kevlar_allow_multistep_video_init=true\u0026deprecate_get_video_metadata=true\u0026html5_enable_ms_playready_hd=true\u0026html5_qoe_unstarted_in_initialization=true\u0026lightweight_watch_video_swf=true\u0026disable_mweb_iphone_ad_click_handling_functionality=true\u0026live_fresca_v2=true\u0026mweb_cougar_big_controls=true\u0026html5_serverside_call_server_on_biscotti_timeout=true\u0026html5_request_sizing_multiplier=0.8\u0026disable_set_awesome_mweb=true\u0026html5_live_probe_primary_host=true\u0026html5_connect_timeout_secs=7.0\u0026html5_min_readbehind_cap_secs=0\u0026player_unified_fullscreen_transitions=true\u0026html5_qoe_intercept=\u0026postroll_notify_time_seconds=5\u0026mweb_cougar_ads_backend=true\u0026html5_allowable_liveness_drift_chunks=2\u0026html5_suspend_loader=true\u0026html5_stop_video_in_cancel_playback=true\u0026html5_live_only_disable_loader=true\u0026live_chunk_readahead=3\u0026html5_prefer_server_bwe3=true\u0026disable_new_pause_state3=true\u0026html5_get_video_info_timeout_ms=0\u0026html5_new_fallback=true\u0026legacy_autoplay_flag=true\u0026html5_post_interrupt_readahead=20\u0026fix_gpt_pos_params=true\u0026persist_text_on_preview_button=true\u0026forced_brand_precap_duration_ms=2000\u0026html5_min_startup_smooth_target=10.0\u0026dynamic_ad_break_seek_threshold_sec=0\u0026html5_min_secs_over_max_bytes=true\u0026disable_client_side_midroll_freq_capping=true\u0026html5_subsegment_readahead_timeout_secs=2.0\u0026html5_ignore_public_setPlaybackQuality=true\u0026html5_vp9_live_whitelist=true\u0026html5_subsegment_readahead_min_buffer_health_secs_on_timeout=0.1\u0026html5_variability_discount=0.5\u0026html5_subsegment_readahead_progress_timeout_fraction=0.8\u0026html5_request_size_min_secs=0.0\u0026fast_autonav_in_background=true\u0026website_actions_throttle_percentage=1.0\u0026html5_streaming_xhr_optimize_lengthless_mp4=true\u0026disable_trusted_ad_domains_player_check=true\u0026html5_live_pin_to_tail=true\u0026mweb_autonav=true\u0026use_fast_fade_in_0s=true\u0026html5_jumbo_ull_subsegment_readahead_target=1.0\u0026html5_error_reload_cooldown_ms=30000\u0026html5_deadzone_multiplier=1.0\u0026html5_min_secs_between_format_selections=8.0\u0026html5_streaming_xhr_buffer_mdat=true\u0026html5_get_video_info_promiseajax=true\u0026html5_subsegment_readahead_always_delay_appends=true\u0026skip_restore_on_abandon_in_bulleit=true\u0026html5_license_constraint_delay=5000\u0026html5_max_av_sync_drift=50\u0026html5_manifestless_accurate_sliceinfo=true\u0026html5_repredict_interval_secs=0.0\u0026html5_new_e2e_latency_tracking=true\u0026html5_subsegment_readahead_tail_margin_secs=0.2\u0026disable_indisplay_adunit_on_embedded=true\u0026playready_first_play_expiration=-1\u0026html5_max_buffer_health_for_downgrade=15\u0026html5_throttle_rate=0.0\u0026html5_aspect_from_adaptive_format=true\u0026html5_live_ultra_low_latency_bandwidth_window=0.0\u0026tvhtml5_background_su=true\u0026html5_elbow_tracking_tweaks=true\u0026mweb_cougar=true\u0026html5_min_upgrade_health=0\u0026html5_adunit_from_adformat=true\u0026html5_serverside_call_server_on_biscotti_error=true\u0026web_player_disable_flash_playerproxy=true\u0026disable_reporting_html5_no_vast_ads_as_error=true\u0026html5_env_data_update_app_only=true\u0026html5_incremental_parser_buffer_extra_bytes=16384\u0026web_player_edge_autohide_killswitch2=true\u0026html5_reselect_bandwidth_factor=3.0\u0026web_player_tabindex_killswitch=true\u0026html5_reattach_resource_after_timeout_limit=0\u0026html5_subsegment_readahead_target_buffer_health_secs=0.5\u0026html5_throttle_burst_secs=15.0\u0026html5_fludd_suspend=true\u0026html5_tight_max_buffer_allowed_bandwidth_stddevs=0.0\u0026safari_enable_spherical=true\u0026html5_observe_live_start_seconds=true\u0026call_release_video_in_bulleit=true\u0026html5_variability_full_discount_thresh=3.0\u0026html5_pipeline_manifestless=true\u0026use_new_skip_icon=true\u0026html5_spherical_bicubic_mode=1\u0026html5_aux_pctile=true\u0026ad_duration_threshold_for_showing_endcap_seconds=15\u0026html5_subsegment_readahead_controlled_by_buffer_health=true\u0026html5_always_enable_timeouts=true\u0026doubleclick_gpt_retagging=true\u0026use_forced_linebreak_preskip_text=true\u0026midroll_notify_time_seconds=5\u0026max_resolution_for_white_noise=360\u0026html5_no_shadow_env_data_redux=true\u0026html5_default_quality_cap=0\u0026html5_max_readahead_bandwidth_cap=0\u0026use_html5_player_event_timeout=true\u0026html5_sticky_ignore_capped=true\u0026enable_mesh_ps4=true\u0026king_crimson_player_redux=true\u0026mweb_autonav_paddles=true\u0026html5_deferred_source_buffer_creation=true\u0026html5_live_disable_dg_pacing=true\u0026desktop_cleanup_companion_on_instream_begin=true\u0026html5_pipeline_ultra_low_latency=true\u0026html5_disable_audio_slicing=true\u0026html5_clearance_fix=true\u0026show_countdown_on_bumper=true\u0026segment_volume_reporting=true\u0026www_for_videostats=true\u0026html5_pause_video_fix=true\u0026html5_sticky_reduces_discount_by=0.0\u0026html5_request_size_max_secs=31\u0026mweb_playsinline_webview=true\u0026html5_background_cap_idle_secs=60\u0026html5_nnr_downgrade_adjacency=true\u0026html5_variability_no_discount_thresh=1.0\u0026html5_local_max_byterate_lookahead=15\u0026website_actions_cta_redesign=true\u0026html5_readahead_ratelimit=3000\u0026html5_nnr_downgrade_count=4\u0026html5_defer_background_errors=true","ucid":"UCCLZfZNgKxUQsCbPod7iVpw","channel_path":"\/channel\/UCCLZfZNgKxUQsCbPod7iVpw","iurlhq_webp":"https:\/\/i.ytimg.com\/vi_webp\/dRnrjyJV25I\/hqdefault.webp","cosver":"6.1","iurlmaxres":"https:\/\/i.ytimg.com\/vi\/dRnrjyJV25I\/maxresdefault.jpg","enablejsapi":"1","rel":"0","author":"EMPIRE","eventid":"K16LWsCyBpWtWNqfv5gJ","short_view_count_text":"549K views • 15 comments","innertube_api_key":"AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8","embed_config":"{}","iurlmq_webp":"htt
dsrobertson / OnlineFDRClone of the Bioconductor repository for the onlineFDR package. See https://bioconductor.org/packages/devel/bioc/html/onlineFDR.html for the official development version, and https://dsrobertson.github.io/onlineFDR/ for easy access to documentation.
concorde-speed / ConcordeDate of Concorde In January of the year 1976 after 29 years of the first to penetrate to the speed of sound military aircraft jet - Two Concord took off together at the same time, one from London and one from Paris, the first airline service ultrasound for travelers. The aircraft Almottaghtan has looked towards the west as if they were Tgaraan - even Tsabakan - the sun. Where they arrived as if they did not Taathrca, in terms of time, in a new event launches air transport stage supersonic passenger wealthy people who do not allow them to narrow their time to stay in the air for long periods. How the project began and evolved, and how the outcome of the remaining Concorde lounges to museums ... This is what Santapah in the following lines: The emergence of the Concorde The deal "supersonic" between England and France was signed in 1962, for the design and construction of the first civilian supersonic plane manufactured by Airbus for them. After long years of arduous efforts and research strenuous, in addition to more than 5,000 hours in the air tunnels, proved to be a form of equity Almstrq with the body long cylinder for aircraft relatively large passengers, it is the best form executable command and control speeds ultrasound. The first two aircraft of this type making and Tjeribhma in 1969, and since then about 20 aircraft of this model, called the "Concord" was produced (the only civilian aircraft that exceed the speed of sound speed), and who serve in the British Airways and Air France in income 1976, the rate of seven aircraft of the British lines and five lines in French. The first fly line is the London - Singapore via Bahrain. In 1976 received Bahrain Airport very important event, which is to start regular flights between Bahrain and London, the fastest of the British Airways sound Concorde, the airport first and the only one who was receiving this type of aircraft in the Middle East, given that the Concorde need to Airports women with special specifications, so they need to take-off and landing runways longer than the regular airports runways, and the noise from the power of their engines leads to smash windows of buildings ordinary airports, and the speed has a crush Madarjha. What Concorde is distinct from other aircraft?Characterized by Concorde slim form in the form of a triangle (delta). And fly faster and higher than other aircraft altitudes, using the "upward vortex" method to accomplish extraordinary mission. For example, while the "Boeing 747" aircraft speed, better known as "jumbo" around 900 km / h (about 84.0 Mach) at an altitude of 35 thousand feet, the Concorde fly quickly 2172 km / h (Mach 2) at an altitude of 60 thousand Foot. It is known that Almaj is the real rate of speed compared to the speed of sound, and is equivalent to an average of 1225 kilometers per hour, so that the speed of sound changes with temperature change, which moves rapidly 1190 km / h at sea level, but it drops to 1060 km / h at an altitude of 36,000 feet above the ground, where the air temperature drops. Because the Place de la Concorde to fly faster than the speed of sound, they differ from the rest of the aircraft on several characteristics. First, in terms of the flow of the fuselage, where you need to own dynamic shape to face severe air resistance at these high speeds, and it is achieved by taking the body form of a high pin tapered, triangular wings tilted back, my head and a tail, and an introduction brushes can be moved to the bottom of takeoffs and landings to be able to see the pilot of the corridor, to the top during flight to improve the flow of the fuselage. Amounting to 83 feet and 8 inches tall plane wings in the company "Oarossbesiak" has produced and supplied surfaces work together Kdvh depth, also works differentially Kjnahat. There is no tip installed inside the concavity of the wing, but no spire parties descend and spin at the same time. The second difference is related engines, where the Concorde's engines proved directly in the wings to avoid the use of any parts of the conductive would crash at high speeds, and the engine fitted with a special friendly hotel to exploit the resulting exhaust for initial combustion cycle combustion again mixing with more new fuel to increase efficient engines and power, where this process provides the engine in the final stage of heating fuel for the production of the required additional power for takeoff and the transition from one phase to the heating of supersonic flight, allowing aircraft takeoff speed of 360 km / h. The useful load carried by the Concorde's less than a third of what was done other than in the weight of the jets under the sound, so it was no reduction in the efficiency of the engine, it is actually the difference between profit and loss. Every Concorde has supplied four-engine aircraft, "Snecma Olympus DS 593," the momentum of 17259 kg. The company "Rolls Royce" design engines, which provided all Dagtin separate engine in order to fuel economy. Each engine and also provided additional Aq. Engine reverse payment system is also equipped. On the other hand, the Concorde is distinct from other aircraft fuel tanks and the presence of more and larger, with four engines burn a tremendous amount of kerosene has more than 25 thousand liters per flight hour. However, the fuel tanks lead a purpose whatever else, which is to maintain the equilibrium plane, where the center to raise the plane travels at high speeds for its center of gravity and then you move amounts of fuel between private additional tanks at the front of the plane and the rear to offset that effect, and returned those quantities at low speed in preparation for landing to bring the situation back to its origin. For example, a flight plan requires the distance between Paris and the French coast on the Atlantic equator at less than the speed of sound speed is determined to 0.93 Mach, to be at the height of about 9000 meters, after which the plane begins to jump quickly to reach the speed of take-off and altitude wanted, it performs speed between the two situations difference to a change in the dynamics of the plane to move from the airline less than the sound quickly to other higher speed of sound, and to overcome this situation, the transfer of fuel in an aircraft using a payment of reservoirs located in the introduction to the reservoirs in the system rear. During the transitional situation between the two modes of ex (between Mach 1 and Mach 1.6) increases air resistance sharply, and at this moment is to break the sound barrier. Once access to 1.7 Mach the captain to stop the internal combustion process, after more than a very plane speed of up to Mach 2, or 2200 km / h, more than twice the speed of sound, which represent the target aircraft speed, while the estimated target of 16000 and 18000 meters altitude. But when approaching landing, the fuel will move to the front of the plane, and the concomitant rise in the plane's nose, to land the plane in a scene it looks like a bird landing on the surface of the water. Finally remains the difference in the fuselage coating, where the Concorde is exposed at high speeds to a very large rise in body temperature as a result of increased friction of air molecules, so they coated special material properties and reflective stronger than those in the other aircraft, capable of dispersing such high temperatures . The fuselage itself is made from a special metal is characterized by a greater capacity to withstand the heat and stress resistance resulting from inflation fuselage resulting in turn from high temperature. The speed of the plane have been identified in the horizontal flight Mach 2.2, which is just before the thermal barrier (which is the speed at which if exceeded temperature increases dramatically), but it has identified the chronological age of the structure of 60,000 flight hours. And making the structure of the aluminum-alloy steel by thermal changes from -35 degrees to +120 degrees, as the flight above the speed limit of the plane requires that the structure is made with a mixture of steel and titanium, which means more weight. Fly the Concorde at the highest altitudes of 50,000 feet, where the air is equal to a tenth of what Tsawiyeh at sea density, and the temperature at that very low altitude, and despite all this work ultrasonic motors with high efficiency. According to reports of the pilots can handle the plane easily. The acceleration of the aircraft and transit speeds TransitionAnd what is characterized travel Balkounkord from other aircraft? Accommodate the Concorde for a hundred passengers and crew consists of a pilot and a flight engineer and his assistant in addition to the six hosts. When quitting, the passenger feels strongly pay back as a result of the launch aircraft from sleep to the speed of 362 km / h in just 30 seconds, which is called the Earth's gravitational force, and quickly reach the maximum height of the plane and penetrate the speed of the sound barrier. In all the flight times travelers can know the speed, through a private display panel installed in front of them, and are entitled to see the curve of the globe and Northern Lights because of the high altitude, which is flying the plane. Travelers can also watch the first layer colors of the atmosphere, where the height of the plane boundary between the first two Tbaktah. It takes Atlantic crossing Balkounkord three and a half hours only, while the that time about nine hours in the other underneath the aircraft sounds. And up the Concorde passengers who starts his journey from London at ten thirty in the morning to New York at nine thirty in the morning, before the date of its launch radios. This of course does not mean a retreat in time, but due to time differences and the short flight time! Over the last quarter-century, Concorde was the five weekly flights between Paris and New York in a record speed of less than 4 hours, at which time it cut the best of conventional aircraft, the same distance in 8 hours. He was landing at Kennedy Airport (according to US time) at eight in the morning, and exiting back to France at the eleventh hour before noon, where businessmen French used to negotiate with the Americans their customers at the airport Salons, without having to go to the business and financial district in Manhattan, and then return to Paris the same day. And to what the fate of the Concorde? I tried both the US and Soviet governments (former) develop similar Balkounkord aircraft, but those attempts ended in retreat, either because the magnitude of the required expenditures on the American side, or the occurrence of accidents due to human error on the Soviet side. Some of these Soviet aircraft had stayed (model "T U-144"), as amended to date, but used in air mail services, also placed some of them in museums, while one of them devoted to project Russian joint US. And remained the Concorde, solo travel of passengers faster than the speed of sound even temporarily suspended service to make adjustments after the accident led to an explosion killed one of them and all of them were. In addition, the high run that made the ticket price between Paris, London and New York round-trip $ 10,000, which led to limited use of the rich and famous costs, as well as what caused the noise and pollution, suffered Concorde most suffered from weak passenger demand for flights, in Following the incident, which came under the air France one in Paris in July 2000 to a near Charles de Gaulle airport hotels, which led to the deaths of 109 people on board and four people on the ground. Consequently After some major attended by experts and investigators, scientists, lawyers, artists, religious leaders and industrialists from different generations, between believers technology and Muslims in terms of authority to the modern age and among those who believe that it is necessary to rein in scientific progress and the development of ethical and legal controls him, took the final decision to stop flights Place de la Concorde. In July of 2003, tens of thousands of lovers of the Concorde gathered along the road to Heathrow Airport in the fog of London, the capital, in a bid farewell final before this model withdraw aircraft from service, after it made its first commercial flight in 1976. This has three Concorde planes reviewing the air before landing at Heathrow Airport in a reference to the termination of commercial flights known aircraft at supersonic speed. And charged the British Airways Concorde plane carrying 100 special guest at the final flight, which launched from Kennedy Airport in New York towards London, penetrated the sound barrier for the last time. Upon entering British airspace acceded Two Concord British Airways, one coming from the city of Edinburgh in Scotland, and the other from the Bay of Biscay west of France. Lovers plane Odalla in July of 2003 in Paris, as well as a pool, in the last trip out between Paris and New York, after a 27-year-old was cut where the distance between the two cities in a matter of three hours and a half. Where he lined up more than 250 workers from the maintenance workers bodyguards honor of the plane at Charles de Gaulle airport, with thousands of French gathered on the edge of the airport to see the plane taking off, holding a banner reading "We love you, Concord." The French lines: that the plane Concorde belong to the humanitarian aviation heritage and must therefore provide an opportunity for more people to see it, and added that it would apply to all of the fleet of Air France Concorde aircraft, which will be displayed every aircraft in museums in France, Germany and the United States, such as the Museum aviation and aerospace in the suburb of "Le Bourget" Paris, the Museum of Aviation near the Scottish capital "Edinburgh". Parts of the plane crashed as sold at Christie's for souvenirs to those who died to travel out, varied between the nose of the plane and the door of cabin leadership and a seat pilot and antenna radar warning in which the two motors of the engines and parts of the dashboard to the instructions and cutlery dishwasher ceramic spoons and silver booklet, worth total amounted to 3.29 million euros, went in favor of a charitable institution of the air France is working in the field of care for the poor children. Last auction for the sale of pieces of a British Airways Concorde has also been established. The British and French companies have announced at the beginning of the month of April of the same year 2003, he stopped Concorde flights after the company "Airbus" that produced externa announced: What's next in the field of transport ultrasonic? American company, "Boeing" is currently working on the supersonic jet, is supposed to be placed in service during the coming years, while filling the attention of European rival, "Airbus" accomplish its flagship aircraft, "Airbus A380 (superjumbo) capable of carrying about 800 passengers, which had been achieved in 2007, while scientists tried to Japanese to develop a model of the plane was enable fly twice as fast as the Concorde, but their experience after the plane landed long model briefly after take-off from the site "Woomera" to launch rockets in the desert south of Australia, and it failed within the project included my company, "Mitsubishi heavy Industries" and "Nissan Motor." He held this paradigm of a length of 11 meters on a rocket, Plans for him to be separated from the booster rocket above the ground, and falling faster than twice the speed of sound, but it got out of control since it was launched. It was supposed to reach the aircraft remotely piloted altitude of 20 thousand meters, before Taud.aly ground faster than twice the speed of sound. The goal was to become a plane "NeXT 1" transport aircraft the fastest in the world to succeed Concorde, with the difference that it will be less noise and damaging to the environment and can accommodate up to 300 passengers: Thus crossed another Concorde SST recent trip mounted aboard a ship in the River Thames sailing from London to the Museum of Flight in Edinburgh, after he has made more than eight thousand flight during which 22 thousand and 768 hours and 56 cut-minute flight, the folded thereby separating mythic unique and important commercial aviation history, a supersonic flight, waiting for what the future holds for us of new inventions ?!
GoogleAppsBackup / Google Apps Backup SoftwareEffective Way to Procure Data with Google Apps Backup Software Google Apps is a collection of tools for organizations worldwide; covering all the aspects like Emails, Calendars, Documents, Google spreadsheets, Google Drive, etc. One of the greatest advantages of using Google Apps is the competency to work with your data from anywhere. The data of Google Apps is stored in Google cloud storage which lets users to save and control their data comfortably on Google's infrastructure. However, there stands a risk of storing data in the cloud owing to the probability of data loss. What if something goes faulty and all of your emails unexpectedly become inaccessible? Here’s what you can do to backup your Google Apps data. Why should a User Backup Data? Google Apps data is liable to data loss because of malicious destruction in case of intentional wiping, or due to some error in the software. If you have stored any important data and you don’t have its backup, then it can possibly lead to loss of access to your messages permanently. To mitigate the risk of losing your data, you can take the help of third-party solutions like Google Apps Backup software which helps you to backup from all the aspects like Drive, Gmail, Calendars, and Contacts in bulk. Absolute Backup of Google Apps Account You can have a complete backup of all the data of Google Apps account including emails, documents, calendars, and contacts on your hard drive. The items are saved in file formats like PST, EML, MBOX, ICS, and VCF depending upon type of data. Support for Multiple File Formats You can backup Google Apps emails in three different file formats i.e. EML, MSG, PST, and MBOX. This option allows the user to backup Emails, Calendars and Contacts in PST file format and only emails in MSG/EML/MBOX file formats. Backup of Contacts and Calendars The user can also backup contacts and calendars of Google Apps user account. The backup of contacts is taken in vCard (.vcf) so as to support large number of devices using VCF format to save contacts. Backup of calendars is taken in ICS (.ics) file formats. Option to Backup in Three Ways Google Apps provides the option to backup in three different ways: Backup of single user Account: In this case, the user needs to provide the details of login: username & password of any user account to backup the data of Google Apps. Backup of Multiple User Account: For this, the user has to add CSV file where all the credentials of multiple users are saved .Then the user can backup all the data in a bulk. Domain User Backup: Here, the user is required to provide the credentials of the associated administrator to backup data from user accounts of any single domain. Option to Backup and Delete Mails The software offers you an option to clear up the unnecessary data in your Gmail account. It comes with a handy option ‘delete after Download’ which lets you to delete the emails after they are safely backed up on your hard drive. Retains the Original Folder Structure Google Apps Backup software keeps the original folder structure unchanged. It creates a separate folder for each label like Inbox, sent items, Drafts etc in the defined location on your system. Pause And Resume Feature Of Backup If your internet connection gets disrupted in the middle of backup process, then you have the option to ‘pause’ and then ‘resume’ the process. When the internet connection gets smooth, then you can once again resume the process by changing the mode to ‘resume’. Displays a Progress Report of Backup The utility provides a complete summary report of Backup process. It shows the working progress status with fields mentioning the email counts, calendar & contact count, etc. Using this report, you can easily keep a track of the process. Get the Benefit of Free Trial Version For the interest of users, there is free trial version of Google Apps Backup software. With the freeware, you can have the backup of 25 items per folder. If you’re satisfied with the working of the product then you can download the licensed version of the Google Apps Backup Software. The licensed version of the tool is available at an economical rate and it provides unlimited data backup.
reifjulian / WyoungControl the family-wise error rate when performing multiple hypothesis tests
AyushmanTyagi / Decentralized Finance It S Use CasesDecentralized Finance & It's use cases- DeFi (Decentralized Finance) Another open-world approach to the current financial system. Products that allow you to borrow, save, invest, trade, and more. Based on open source technology anyone can plan with. DeFi is an open and global financial system that has been built for years - another way of being a sharp, tightly managed, and cohesive system of decades-old infrastructure and processes. It gives you more control and visibility than your money. It gives you exposure to global markets and other options for your local currency or banking options. DeFi products open financial services to anyone with an internet connection and are highly managed and maintained by their users. To date, tens of billions of dollars worth of crypto have gone through DeFi applications and is growing every day. What is DeFi? DeFi is an integrated name for financial products and services accessible to anyone who can use Ethereum - anyone with an Internet connection. With DeFi, markets remain open and no central authorities can block payments or deny you access to anything. Services that used to be slow and vulnerable to human error are now automated and secure as they are governed by a code that anyone can check and evaluate. There is a thriving crypto-economy out there, where you can borrow, borrow, length / short, earn interest, and more. Crypto-savvy Argentinians have used DeFi to escape inflation. Companies have begun distributing their pay to their employees in real-time. Some people even withdraw and repay loans worth millions of dollars without the need for personal information. DeFi vs Traditional Finance One of the best ways to see the power of DeFi is to understand the problems that exist today. Some people are not given access to setting up a bank account or using financial services. Lack of access to financial services can prevent people from being employed. Financial services can prevent you from paying. Hidden payment for financial services is your data. Governments and private institutions can close markets at will. Trading hours are usually limited to one-hour business hours. Transfers may take days due to personal processes. There is a premium for financial services because mediation institutions require their cutting. DeFi Use Cases DeFi has revolutionized the financial world over the past few years. This new approach to financial planning can transcend asset systems through efficiency and security. It is true that there are certain dangers in DeFi but those are within the concrete limits. Let's take a look at the most effective DeFi usage cases - Asset Management One of DeFi's biggest effects is that users can now enjoy more control over their assets. Many DeFi projects provide solutions that allow users to manage their assets, including - buying, selling, and transferring digital assets. Therefore, users can also earn interest on their digital assets. Contrary to the traditional financial system, DeFi allows users to maintain the privacy of their sensitive information. Think of the secret keys or passwords of your financial accounts - you should have shared that information with the appropriate organizations beforehand. Now, different DeFi projects, such as Metamask, Argent, or Gnosis Safe help users encrypt and store those pieces of information on their devices. This ensures that only users have access to their accounts and can manage their assets. Therefore, asset management is one of the most widely used financial services cases for users. Compliance with AML and CFT Rates through the KYT Mechanism Traditional financial systems focus heavily on Know-Your-Customer (KYC) agreements. KYC Guidelines are its major law enforcement tool for using Anti-Money Laundering (AML) and Countering-the-Financing-of-Terrorism (CFT) standards. However, KYC guidelines often conflict with DeFi's privacy efforts. DeFi responds to this problem with a new concept called the Know-Your-Transaction (KYT) mechanism. This approach suggests that low-level infrastructure will focus on ethical behavior for digital addresses rather than user considerations. Therefore, KYT solves two issues simultaneously - monitoring real-time operations and ensuring user privacy. This makes KYT one of the biggest gaps in low-cost cases. Non-Governmental Organizations or DAOs The DAOs are partners of the central financial institutions of DeFi - making it one of the pillars of low-income finance cases. In the traditional system, central financial institutions play a major role. These organizations operate as administrative institutions that regulate basic financial operations, such as monetization, asset management, administrative utilization, etc. The Ethereum blockchain echerestem has introduced empowered organizations to achieve the same goals. However, DAOs are naturally empowered and do not conform to the limits set by central governments or authorities. Analysis and Risk Tools Transparency and redistribution of world power have opened the way for the discovery and analysis of unprecedented user data. With access to this information, users can make informed business decisions, discover new financial opportunities, and implement better risk management strategies. A new type of data analytics with useful blockchain tools and dashboards has emerged in this industry trend. DeFi projects such as DeFi Pulse or CoDeFi Data bring an impressive amount of analytics and risk management tool. Now, businesses are moving faster as they enjoy unpredictable competitive advantages. This is certainly one of the most widely used financial cases. Receivables and Manufacturing Goods Smart contracts allow for the receipt of token receipts and have become one of the most distinctive scenarios for DeFi use. Making a token further means setting a contract value based on the underlying financial asset or set of assets. This underlying financial asset acts as a security measure, which means it can include - bonds, fiat currencies, commodities, market indicators, interest rates, or stock prices. Now, the issuance of outgoing tokens is a secondary security and their value varies with the number of key securities (bonds or fiat money). Thus, the output actually creates artificial goods. Synthetix and dYdX are some of the leading DeFi projects focused on token acquisitions. Network Infrastructure Effect In a DeFi ecosystem, objects within the system can connect and interact. This design feature is known as integration and serves as a protocol for infrastructure development. As a result, DeFi projects are continuously integrated with the network result. Infrastructure tools for use of DeFi applications are remarkable. Various DeFi projects, such as TruffleSuite or InfuraAPI, are good examples in this case. Enhanced Digital ID Blockchain-based identity system systems are already gaining a lot of attention in recent times. Pairing DeFi programs with these patent systems can help people access the global economic system. The traditional method rewards personal income or assets collected as credit providers. With digital identity paired with DeFi, you may be looking for other practical attributes, such as - financial services or professional ability. This new type of digital ID can help the poor to access DeFi apps from any internet connection. It can certainly be one of the cases of possible use. Insurance Insurance is one of the largest financial institutions and has already been proven to be one of the biggest charges for using DeFi. The current insurance system is crowded with paperwork, old audit plans, and bureaucratic insurance claim processes. With the successful implementation of smart contracts, all these problems with the current system can be solved. Many DeFi projects (Nexus Mutual, Opyn, and VouchForMe) provide blockchain access to insurance against DeFi or contract risk. P2P borrowing and borrowing As DeFi bids farewell to traditional banking systems, a space for the lending and lending market has emerged. Therefore, borrowing and lending is one of the most important aspects of using DeFi. However, the DeFi ecosystem is well suited for peer-to-peer (P2P) borrowing and lending efforts. Many DeFi projects have already entered the market focusing on this particular application case. Among these programs, Compound and PoolTogether are two well-known names. These projects have independent policies for lending and lending. Payment Solutions One of DeFi's top drivers was serving non-bankers or understated banks from the get-go. DeFi's natural features make it ideal for solving the problems of current global payment systems. DeFi provides fast, secure, and transparent solutions compared to asset systems. As DeFi lowers the demand for intermediaries, making payments easier and more transparent, DeFi-based blockchain-based payment solutions can appeal to non-bankers.
chaohstat / FGWASFGWAS (Functional Genome Wide Association analysiS) is a Python coding based package for imaging genetic analysis. Functional phenotypes (e.g., subcortical surface representation), which commonly arise in imaging genetic studies, have been used to detect putative genes for complexly inherited neuropsychiatric and neurodegenerative disorders. However, existing statistical methods largely ignore the functional features (e.g., functional smoothness and correlation). The aim of this toolbox is to develop a functional genome-wide association analysis framework to efficiently carry out whole-genome analyses of functional phenotypes. FGWAS consists of three components: a multivariate varying coefficient model, a global sure independence screening procedure, and a test procedure. Compared with the standard multivariate regression model, the multivariate varying coefficient model explicitly models the functional features of functional phenotypes through the integration of smooth coefficient functions and functional principal component analysis. Statistically, compared with existing methods for genomewide association studies (GWAS), FGWAS can substantially boost the detection power for discovering important genetic variants influencing brain structure and function. Simulation studies show that FGWAS outperforms existing GWAS methods for searching sparse signals in an extremely large search space, while controlling for the family-wise error rate.
sanusanth / C English Letters Disign Pattan A To Z Part 2What is C++? C++ is a general-purpose, object-oriented programming language. It was created by Bjarne Stroustrup at Bell Labs circa 1980. C++ is very similar to C (invented by Dennis Ritchie in the early 1970s). C++ is so compatible with C that it will probably compile over 99% of C programs without changing a line of source code. Though C++ is a lot of well-structured and safer language than C as it OOPs based. Some computer languages are written for a specific purpose. Like, Java was initially devised to control toasters and some other electronics. C was developed for programming OS. Pascal was conceptualized to teach proper programming techniques. But C++ is a general-purpose language. It well deserves the widely acknowledged nickname "Swiss Pocket Knife of Languages." C++ is a cross-platform language that can be used to create high-performance applications. C++ was developed by Bjarne Stroustrup, as an extension to the C language. C++ gives programmers a high level of control over system resources and memory. The language was updated 3 major times in 2011, 2014, and 2017 to C++11, C++14, and C++17. About C++ Programming Multi-paradigm Language - C++ supports at least seven different styles of programming. Developers can choose any of the styles. General Purpose Language - You can use C++ to develop games, desktop apps, operating systems, and so on. Speed - Like C programming, the performance of optimized C++ code is exceptional. Object-oriented - C++ allows you to divide complex problems into smaller sets by using objects. Why Learn C++? C++ is used to develop games, desktop apps, operating systems, browsers, and so on because of its performance. After learning C++, it will be much easier to learn other programming languages like Java, Python, etc. C++ helps you to understand the internal architecture of a computer, how computer stores and retrieves information. How to learn C++? C++ tutorial from Programiz - We provide step by step C++ tutorials, examples, and references. Get started with C++. Official C++ documentation - Might be hard to follow and understand for beginners. Visit official C++ documentation. Write a lot of C++ programming code- The only way you can learn programming is by writing a lot of code. Read C++ code- Join Github's open-source projects and read other people's code. C++ best programming language? T he answer depends on perspective and requirements. Some tasks can be done in C++, though not very quickly. For example, designing GUI screens for applications. Other languages like Visual Basic, Python have GUI design elements built into them. Therefore, they are better suited for GUI type of task. Some of the scripting languages that provide extra programmability to applications. Such as MS Word and even photoshop tend to be variants of Basic, not C++. C++ is still used widely, and the most famous software have their backbone in C++. This tutorial will help you learn C++ basic and the advanced concepts. Who uses C++? Some of today's most visible used systems have their critical parts written in C++. Examples are Amadeus (airline ticketing) Bloomberg (financial formation), Amazon (Web commerce), Google (Web search) Facebook (social media) Many programming languages depend on C++'s performance and reliability in their implementation. Examples include: Java Virtual Machines JavaScript interpreters (e.g., Google's V8) Browsers (e.g., Internet Explorer, Mozilla's Firefox, Apple's Safari, and Google's Chrome) Application and Web frameworks (e.g., Microsoft's .NET Web services framework). Applications that involve local and wide area networks, user interaction, numeric, graphics, and database access highly depend on C++ language. Why Use C++ C++ is one of the world's most popular programming languages. C++ can be found in today's operating systems, Graphical User Interfaces, and embedded systems. C++ is an object-oriented programming language which gives a clear structure to programs and allows code to be reused, lowering development costs. C++ is portable and can be used to develop applications that can be adapted to multiple platforms. C++ is fun and easy to learn! As C++ is close to C# and Java, it makes it easy for programmers to switch to C++ or vice versa Definition - What does C++ Programming Language mean? C++ is an object oriented computer language created by notable computer scientist Bjorne Stroustrop as part of the evolution of the C family of languages. Some call C++ “C with classes” because it introduces object oriented programming principles, including the use of defined classes, to the C programming language framework. C++ is pronounced "see-plus-plus." C++ Variables Variables are the backbone of any programming language. A variable is merely a way to store some information for later use. We can retrieve this value or data by referring to a "word" that will describe this information. Once declared and defined they may be used many times within the scope in which they were declared. C++ Control Structures When a program runs, the code is read by the compiler line by line (from top to bottom, and for the most part left to right). This is known as "code flow." When the code is being read from top to bottom, it may encounter a point where it needs to make a decision. Based on the decision, the program may jump to a different part of the code. It may even make the compiler re-run a specific piece again, or just skip a bunch of code. You could think of this process like if you were to choose from different courses from Guru99. You decide, click a link and skip a few pages. In the same way, a computer program has a set of strict rules to decide the flow of program execution. C++ Syntax The syntax is a layout of words, expression, and symbols. Well, it's because an email address has its well-defined syntax. You need some combination of letters, numbers, potentially with underscores (_) or periods (.) in between, followed by an at the rate (@) symbol, followed by some website domain (company.com). So, syntax in a programming language is much the same. They are some well-defined set of rules that allow you to create some piece of well-functioning software. But, if you don't abide by the rules of a programming language or syntax, you'll get errors. C++ Tools In the real world, a tool is something (usually a physical object) that helps you to get a certain job done promptly. Well, this holds true with the programming world too. A tool in programming is some piece of software which when used with the code allows you to program faster. There are probably tens of thousands, if not millions of different tools across all the programming languages. Most crucial tool, considered by many, is an IDE, an Integrated Development Environment. An IDE is a software which will make your coding life so much easier. IDEs ensure that your files and folders are organized and give you a nice and clean way to view them. Types of C++ Errors Another way to look at C++ in a practical sense is to start enumerating different kinds of errors that occur as the written code makes its way to final execution. First, there are syntax errors where the code is actually written in an illegible way. This can be a misuse of punctuation, or the misspelling of a function command or anything else that compromises the integrity of the syntax as it is written. Another fundamental type of error is a compiler error that simply tells the programmer the compiler was not able to do its work effectively. As a compiler language, C++ relies on the compiler to make the source code into machine readable code and optimize it in various ways. A third type of error happens after the program has been successfully compiled. Runtime errors are not uncommon in C++ executables. What they represent is some lack of designated resource or non-working command in the executable program. In other words, the syntax is right, and the program was compiled successfully, but as the program is doing its work, it encounters a problem, whether that has to do with interdependencies, operating system requirements or anything else in the general environment in which the program is trying to work. Over time, C++ has remained a very useful language not only in computer programming itself, but in teaching new programmers about how object oriented programming works.
Trip12 / Chris Fps// [2011-04-05] Major issues reported on some (NOT all) PCs when specifying mat_antialias directly. Try removing it if you have problems. // As an alternative, you can try adding +mat_antialias 1 to your launch options. // NOTE: If you experience crashes out of the blue, put all of the cvars in the threading section to "0". // --------------------------------------------------------------------------------------------------------------------------------- // Chris' maxframes config, designed to get you a large performance boost // v1.083 | 22 May 2011 | fakkelbrigade.eu/chris/configs/ // --------------------------------------------------------------------------------------------------------------------------------- // Problems or questions? Contact me at #christf2 on QuakeNet. // --------------------------------------------------------------------------------------------------------------------------------- // Some of the commands in here are redundant to others, they are failsafes for server-side variable locks. // // Launch options: // FOR FULLSCREEN: -dxlevel 81 -full -w WIDTH -h HEIGHT -console -novid -useforcedmparms -noforcemaccel -noforcemspd // FOR WINDOWED MODE: -dxlevel 81 -sw -w WIDTH -h HEIGHT -console -noborder -novid -useforcedmparms -noforcemaccel -noforcemspd // // --------------------------------------------------------------------------------------------------------------------------------- // CONFIG BEGINS // --------------------------------------------------------------------------------------------------------------------------------- sv_cheats "1" // To change vars that require a sv_cheats enabled server without error // --------------------------------------------------------------------------------------------------------------------------------- // SETTINGS THAT YOU MAY WISH TO CUSTOMISE // --------------------------------------------------------------------------------------------------------------------------------- // To uncomment a section, remove the // from all but the description line. // ------- // FPS CAP // ------- fps_max "121" // Caps fps to improve performance. The best value for this is freq * 2 + 1. Do not set lower than cl_cmdrate or you will experience hitreg issues. // ------------ // NET SETTINGS // ------------ // Net settings for good connections -- UNCOMMENT THIS SECTION IF YOU WANT THESE SETTINGS //cl_cmdrate "66" //cl_interp "0.016" // Change to 0.024 for hitscan //cl_interp_ratio "1" //cl_lagcompensation "1" //cl_pred_optimize "2" //cl_smooth "0" //cl_smoothtime "0.01" //cl_updaterate "66" //rate "60000" // Net settings for moderate or bad internet connections -- UNCOMMENT THIS SECTION IF YOU WANT THESE SETTINGS //cl_cmdrate "40" //cl_interp "0.025" // Change to 0.0375 for hitscan //cl_interp_ratio "1" //cl_lagcompensation "1" //cl_pred_optimize "2" //cl_smooth "0" //cl_smoothtime "0.01" //cl_updaterate "40" //rate "35000" // ------ // SPRAYS // ------ // Enable sprays -- not enabled by default cl_playerspraydisable "0" r_decals "200" r_spray_lifetime "2" // Disable sprays -- DELETE THIS SECTION IF YOU WANT SPRAYS ENABLED cl_playerspraydisable "1" r_decals "0" r_spray_lifetime "0" // ------- // SHADOWS // ------- // Enable shadows -- not enabled by default mat_shadowstate "1" r_shadowmaxrendered "11" r_shadowrendertotexture "0" // Set this to 1 for high definition shadows r_shadows "1" // Disable shadows -- DELETE THIS SECTION IF YOU WANT SHADOWS ENABLED mat_shadowstate "0" r_shadowmaxrendered "0" r_shadowrendertotexture "0" r_shadows "0" // --------------- // FACIAL FEATURES // --------------- // Enable facial features -- not enabled by default blink_duration "0.2" r_eyes "1" r_flex "1" r_lod "1" r_rootlod "1" r_teeth "1" flex_rules "1" flex_smooth "1" // Disable facial features -- DELETE THIS SECTION IF YOU WANT FACIAL FEATURES ENABLED blink_duration "0" r_eyes "0" r_flex "0" r_lod "2" r_rootlod "2" r_teeth "0" flex_rules "0" flex_smooth "0" // -------- // RAGDOLLS // -------- // Enable ragdolls -- not enabled by default cl_ragdoll_fade_time "15" cl_ragdoll_forcefade "0" cl_ragdoll_physics_enable "1" g_ragdoll_fadespeed "600" g_ragdoll_lvfadespeed "100" ragdoll_sleepaftertime "5.0f" // Disable ragdolls -- DELETE THIS SECTION IF YOU WANT RAGDOLLS ENABLED cl_ragdoll_fade_time "0" cl_ragdoll_forcefade "1" cl_ragdoll_physics_enable "0" g_ragdoll_fadespeed "0" g_ragdoll_lvfadespeed "0" ragdoll_sleepaftertime "0" // ---- // GIBS // ---- // Enable gibs -- not enabled by default cl_phys_props_enable "1" cl_phys_props_max "128" props_break_max_pieces "-1" r_propsmaxdist "1000" violence_ablood "1" violence_agibs "1" violence_hblood "1" violence_hgibs "1" // Disable gibs -- DELETE THIS SECTION IF YOU WANT GIBS ENABLED cl_phys_props_enable "0" cl_phys_props_max "0" props_break_max_pieces "0" r_propsmaxdist "1" violence_ablood "0" violence_agibs "0" violence_hblood "0" violence_hgibs "0" // --------------------------------------------------------------------------------------------------------------------------------- // END OF CUSTOMISATION // --------------------------------------------------------------------------------------------------------------------------------- // Cleaning up and stopping debug flooding adsp_debug "0" cl_clearhinthistory "1" cl_debugrumble "0" cl_rumblescale "0" mat_debugdepthval "0" mat_debugdepthvalmax "0" mat_debug_postprocessing_effects "0" // Graphical cl_burninggibs "0" cl_detaildist "0" cl_detailfade "0" cl_drawmonitors "0" cl_ejectbrass "0" cl_muzzleflash_dlight_1st "0" cl_ragdoll_collide "0" cl_show_splashes "0" func_break_max_pieces "0" glow_outline_effect_enable "0" lod_transitiondist "0" mat_aaquality "0" mat_alphacoverage "0" mat_antialias "1" mat_autoexposure_max "0" mat_autoexposure_min "0" mat_bloomscale "0" mat_bloom_scalefactor_scalar "0" mat_bumpmap "0" mat_colcorrection_disableentities "1" mat_colorcorrection "0" mat_compressedtextures "1" mat_disable_bloom "1" mat_disable_fancy_blending "1" mat_disable_lightwarp "1" mat_envmapsize "0" mat_envmaptgasize "0" mat_excludetextures "1" mat_fastnobump "0" mat_fastspecular "1" mat_filterlightmaps "0" mat_filtertextures "0" mat_forceaniso "0" mat_hdr_level "0" mat_max_worldmesh_vertices "0" mat_mipmaptextures "1" mat_monitorgamma "2.0" // Controls brightness, try 1.8 to get it brighter or 2.2 to get it darker. Only works in fullscreen. mat_motion_blur_enabled "0" mat_non_hdr_bloom_scalefactor "0" mat_parallaxmap "0" mat_picmip "2" mat_postprocess_x "0" mat_postprocess_y "0" mat_reducefillrate "1" mat_reduceparticles "1" mat_softwarelighting "0" mat_software_aa_blur_one_pixel_lines "0" mat_software_aa_strength "0" mat_software_aa_strength_vgui "0" mat_software_aa_tap_offset "0" mat_specular "0" // Set to 1 for shiny ubers mat_trilinear "0" mat_wateroverlaysize "0" mp_usehwmmodels "0" mp_usehwmvcds "0" muzzleflash_light "0" rope_averagelight "0" rope_collide "0" rope_rendersolid "0" rope_shake "0" rope_smooth "0" rope_smooth_enlarge "0" rope_smooth_maxalpha "0" rope_smooth_maxalphawidth "0" rope_smooth_minalpha "0" rope_smooth_minwidth "0" rope_solid_maxalpha "0" rope_solid_maxwidth "0" rope_solid_minalpha "0" rope_solid_minwidth "0" rope_subdiv "0" rope_wind_dist "0" r_3dsky "0" r_ambientboost "0" r_ambientfactor "0" r_ambientmin "0" r_avglight "0" r_bloomtintb "0" r_bloomtintexponent "0" r_bloomtintg "0" r_bloomtintr "0" r_cheapwaterend "1" r_cheapwaterstart "1" r_decalstaticprops "0" r_decal_cullsize "0" r_dopixelvisibility "0" r_drawbatchdecals "0" r_drawdetailprops "0" r_drawflecks "0" r_drawmodeldecals "0" r_drawspecificstaticprop "0" r_dynamic "0" r_eyemove "0" r_flashlightdepthtexture "0" r_flashlightrendermodels "0" r_flashlightrenderworld "0" r_forcewaterleaf "1" r_lightaverage "0" r_maxdlights "0" r_maxmodeldecal "0" r_maxnewsamples "0" r_maxsampledist "0" r_minnewsamples "0" r_physpropstaticlighting "0" r_pixelfog "0" r_radiosity "0" r_renderoverlayfragment "0" r_ropetranslucent "0" r_staticprop_lod "4" r_updaterefracttexture "0" r_visualizeproplightcaching "1" r_waterdrawreflection "0" r_waterdrawrefraction "1" r_waterforceexpensive "0" r_waterforcereflectentities "0" r_worldlights "0" tf_particles_disable_weather "1" // Set to 0 to enable weather effects on maps like Viaduct and Sawmill // Misc cl_predict "1" cl_predictweapons "1" cl_showfps "1" // Show unsmoothed FPS meter cl_showpluginmessages "0" // Performance cl_forcepreload "1" // Preloads maps, may cause a few seconds more loading the map at the benefit of a more consistent FPS (because the whole map is preloaded) cl_soundemitter_flush "1" //m_rawinput "1" // Uncomment to enable raw mouse input -- DO NOT ENABLE IF YOU ARE USING XFIRE OVERLAY mat_bufferprimitives "1" mat_clipz "1" // FX owners should set this to 0 mat_disablehwmorph "0" mat_disable_ps_patch "1" mat_forcehardwaresync "0" mat_forcemanagedtextureintohardware "0" mat_framebuffercopyoverlaysize "0" mat_levelflush "0" mat_maxframelatency "0" mat_postprocessing_combine "1" mat_vsync "0" r_fastzreject "-1" // Some ATI cards aren't autodetected, if you know that your card supports it, try setting it to 1. r_hunkalloclightmaps "0" r_lightcache_zbuffercache "0" r_occlusion "1" r_unloadlightmaps "0" soundscape_flush "1" // Sound dsp_enhance_stereo "0" dsp_slow_cpu "1" snd_async_fullyasync "1" // Can help stop freezes and sound looping snd_pitchquality "0" snd_spatialize_roundrobin "1" // Threading cl_threaded_bone_setup "0" cl_threaded_client_leaf_system "0" mat_queue_mode "-1" r_threaded_client_shadow_manager "1" r_threaded_particles "1" r_threaded_renderables "1" r_queued_decals "0" r_queued_post_processing "0" r_queued_ropes "1" sv_cheats "0" // Console printout clear echo "-------------------------------------------------------" echo " Chris' maxframes config loaded. " echo "-------------------------------------------------------" echo "Please direct all comments/queries/whatnot to" echo "#christf2 on QuakeNet." echo " " echo "-------------------------------------------------------" echo " Memory stats " echo "-------------------------------------------------------" memory echo " " echo "-------------------------------------------------------" echo " Code support " echo "-------------------------------------------------------" r_3dnow r_sse2 echo "-------------------------------------------------------"
dsrobertson / Graphical ApproachCode for the paper "Graphical approaches for the control of generalised error rates", available at https://arxiv.org/abs/2004.01759
Seid-21 / Model Identification Adaptive Control MIAC Of Aircraft Roll DynamicsDesigned and implemented a Model-Identification Adaptive Control (MIAC) system for aircraft roll dynamics to track reference roll rate under uncertain and varying parameters. Validated via Matlab-Simulink simulations, ensuring zero steady-state error, fast settling time, and robustness to uncertainties.