teleren/devto huggingface dataset:
1483. Leetcode Solution in Python3
Tags: python
Published: 2022-07-17 05:16:12

```
ROOT = 0

class TreeAncestor:

    def __init__(self, n: int, parent: List[int]):
        graph = build_graph(parent)
        
        self.ancestors = collections.defaultdict(list)
        
        def dfs(curr, path):
            i = 1
            # print(curr, path)
            while len(path) - 1 - i >= 0:
                self.ancestors[curr].append(path[len(path) - 1 - i])
                i *= 2
                
            for next_node in graph.get(curr, []):
                path.append(next_node)
                dfs(next_node, path)
                path.pop()
        
        dfs(ROOT, [0])
        
        # print(self.ancestors)
        
            
        

    def getKthAncestor(self, node: int, k: int) -> int:
        if k == 0:
            return node
        if node == ROOT:
            return -1
        leftmost_bit = min(k.bit_length() - 1, len(self.ancestors[node]) - 1)
        # print(node, k, leftmost_bit)
        # print(self.ancestors[node])
        prev = self.ancestors[node][leftmost_bit]
        return self.getKthAncestor(prev, k - (1 << leftmost_bit))
    
def build_graph(parent):
    graph = collections.defaultdict(list)
    for node, prev in enumerate(parent):
        graph[prev].append(node)
    return graph
        
```
#leetcode
#challenge
here is the link for the problem:
https://leetcode.com/problems/kth-ancestor-of-a-tree-node/
1307. Leetcode Solution in Cpp
Tags: cpp
Published: 2022-07-17 05:14:23

```
class Solution {
public:
    bool isSolvable(vector<string>& words, string result) {
        unordered_set<char> charSet;
        int charCnt[91] = {};
        bool nonLeadingZero[91] = {};
        for (string word : words) {
            int n = word.size();
            for (int i = 0; i < n; ++i) {
                if (i == 0 && n > 1) nonLeadingZero[word[i]] = true;
                charSet.insert(word[i]);
                charCnt[word[i]] += pow(10, n - 1 - i);
            }
        }
        int n = result.size();
        for (int i = 0; i < n; ++i) {
            if (i == 0 && n > 1) nonLeadingZero[result[i]] = true;
            charSet.insert(result[i]);
            charCnt[result[i]] -= pow(10, n - 1 - i);
        }
        bool used[10] = {};
        char charList[charSet.size()];
        int i = 0;
        for (char c : charSet) {
            charList[i++] = c;
        }
        return dfs(charList, charCnt, 0, 0, nonLeadingZero, used, i);
    }
    bool dfs(char* charList, int* charCnt, int cur, int sum, bool* nonLeadingZero, bool* used, int numChars) {
        if (cur == numChars) return sum == 0;
        for (int i = 0; i <= 9; ++i) {
            char c = charList[cur];
            if (used[i] || (i == 0 && nonLeadingZero[charList[cur]])) continue;
            used[i] = true;
            if (dfs(charList, charCnt, cur + 1, sum + charCnt[charList[cur]] * i, nonLeadingZero, used, numChars)) return true;
            used[i] = false;
        }
        return false;
    }
};
```
#leetcode
#challenge
here is the link for the problem:
https://leetcode.com/problems/verbal-arithmetic-puzzle/
1563. Leetcode Solution in Java
Tags: java
Published: 2022-07-17 05:09:05

```
class Solution {
  public int stoneGameV(int[] stoneValue) {
    final int n = stoneValue.length;
    // dp[i][j] := max score that Alice can obtain from stoneValue[i..j]
    dp = new int[n][n];
    Arrays.stream(dp).forEach(row -> Arrays.fill(row, Integer.MIN_VALUE));
    prefix = new int[n + 1];

    for (int i = 0; i < n; ++i)
      prefix[i + 1] = stoneValue[i] + prefix[i];

    return stoneGameV(stoneValue, 0, n - 1);
  }

  private int[][] dp;
  private int[] prefix;

  private int stoneGameV(int[] stoneValue, int i, int j) {
    if (i == j)
      return 0;
    if (dp[i][j] > 0)
      return dp[i][j];

    // try all possible partitions
    for (int p = i; p < j; ++p) {
      // sum of stoneValue[i..p]
      final int leftSum = prefix[p + 1] - prefix[i];
      final int throwRight = leftSum + stoneGameV(stoneValue, i, p);
      // sum of stoneValue[p + 1..j]
      final int rightSum = prefix[j + 1] - prefix[p + 1];
      final int throwLeft = rightSum + stoneGameV(stoneValue, p + 1, j);
      if (leftSum < rightSum) // Bob throws right row
        dp[i][j] = Math.max(dp[i][j], throwRight);
      else if (leftSum > rightSum) // Bob throws left row
        dp[i][j] = Math.max(dp[i][j], throwLeft);
      else // Alice decide which row to throw
        dp[i][j] = Math.max(dp[i][j], Math.max(throwLeft, throwRight));
    }

    return dp[i][j];
  }
}

```
#leetcode
#challenge
here is the link for the problem:
https://leetcode.com/problems/stone-game-v/
1723. Leetcode Solution in Python3
Tags: python
Published: 2022-07-17 05:07:45

```
class Solution:
    def minimumTimeRequired(self, jobs: List[int], k: int) -> int:
        def backtrack(pos, workloads, limit):
            if pos >= len(jobs): return True
            for i in range(len(workloads)):
                workload = workloads[i]
                if jobs[pos] + workload <= limit:
                    workloads[i] += jobs[pos]
                    if backtrack(pos + 1, workloads, limit): return True
                    workloads[i] -= jobs[pos]
                # 剪枝
                if workload == 0:
                    return False
            return False
        def possible(limit):
            return backtrack(0, [0] * k, limit)
        # 剪枝
        jobs.sort(reverse=True)
        l, r = jobs[0], sum(jobs)
        while l <= r:
            mid = (l + r) // 2
            if possible(mid):
                r = mid - 1
            else:
                l = mid + 1
        return l
```
#leetcode
#challenge
here is the link for the problem:
https://leetcode.com/problems/find-minimum-time-to-finish-all-jobs/
1649. Leetcode Solution in Java
Tags: java
Published: 2022-07-17 05:02:16

```
class Solution {
    final static int MODULO = 1000000007;
    final static int MAX = 100000;
    int[] segmentTree = new int[MAX * 2 + 1];

    public int createSortedArray(int[] instructions) {
        int cost = 0;
        int length = instructions.length;
        for (int i = 0; i < length; i++) {
            int num = instructions[i];
            int count = segmentTree[num + MAX] + 1;
            update(num, count);
            int sumRange1 = sumRange(1, num - 1), sumRange2 = sumRange(num + 1, MAX);
            cost = (cost + Math.min(sumRange1, sumRange2)) % MODULO;
        }
        return cost;
    }
    
    public void update(int i, int val) {
        int index = i + MAX;
        int prevVal = segmentTree[index];
        int difference = val - prevVal;
        while (index > 0) {
            segmentTree[index] = (segmentTree[index] + difference) % MODULO;
            index >>= 1;
        }
    }
    
    public int sumRange(int i, int j) {
        int sum = 0;
        int index1 = i + MAX, index2 = j + MAX;
        while (index1 <= index2) {
            if (index1 % 2 == 1) {
                sum = (sum + segmentTree[index1]) % MODULO;
                index1++;
            }
            if (index2 % 2 == 0) {
                sum = (sum + segmentTree[index2]) % MODULO;
                index2--;
            }
            index1 >>= 1;
            index2 >>= 1;
        }
        return sum;
    }
}
```

#leetcode
#challenge
here is the link for the problem:
https://leetcode.com/problems/create-sorted-array-through-instructions/
2301. Leetcode Solution in Python3
Tags: python
Published: 2022-07-17 04:56:41

```
class Solution:
  def matchReplacement(self, s: str, sub: str, mappings: List[List[str]]) -> bool:
    isMapped = [[False] * 128 for _ in range(128)]

    for old, new in mappings:
      isMapped[ord(old)][ord(new)] = True

    for i in range(len(s)):
      if self._canTransform(s, i, sub, isMapped):
        return True

    return False

  def _canTransform(self, s: str, start: int, sub: str, isMapped: List[List[bool]]) -> bool:
    if start + len(sub) > len(s):
      return False

    for i in range(len(sub)):
      a = sub[i]        # sub's char
      b = s[start + i]  # s' char
      if a != b and not isMapped[ord(a)][ord(b)]:
        return False

    return True

```
#leetcode
#challenge
here is the link for the problem:
https://leetcode.com/problems/match-substring-after-replacement/
2306. Leetcode Solution in Cpp
Tags: cpp
Published: 2022-07-17 04:51:07

```
class Solution {
 public:
  long long distinctNames(vector<string>& ideas) {
    long long ans = 0;
    // group strings by initials
    vector<unordered_set<string>> suffixes(26);

    for (const auto& idea : ideas)
      suffixes[idea[0] - 'a'].insert(idea.substr(1));

    for (int i = 0; i < 25; ++i)
      for (int j = i + 1; j < 26; ++j) {
        int count = 0;
        for (const auto& suffix : suffixes[i])
          if (suffixes[j].count(suffix))
            ++count;
        ans += 2 * (suffixes[i].size() - count) * (suffixes[j].size() - count);
      }

    return ans;
  }
};

```

#leetcode
#weekly contest
Here is the link for the problem.....
https://leetcode.com/contest/weekly-contest-297/problems/naming-a-company/
2305. Leetcode Solution in Java
Tags: java
Published: 2022-07-17 04:50:07

```
class Solution {

	private int ans = Integer.MAX_VALUE;
	public int distributeCookies(int[] cookies, int k) {
		backtracking(cookies, 0, k, new int[k]);
		return ans;
	}

	void backtracking(int[] cookies, int index, int k, int[] cookiesDistribution) {
		if (index == cookies.length) {
			int max = 0;
			for (int cookie : cookiesDistribution) max = Math.max(max, cookie);
			ans = Math.min(ans, max);
			return;
		}

		for (int i = 0; i < k; i++) {
			cookiesDistribution[i] += cookies[index];
			backtracking(cookies, index + 1, k, cookiesDistribution);
			cookiesDistribution[i] -= cookies[index];
		}
	}
}
```

#leetcode
#weekly contest
Here is the link for the problem.....
https://leetcode.com/contest/weekly-contest-297/problems/fair-distribution-of-cookies/
2304. Leetcode Solution in Java
Tags: java
Published: 2022-07-17 04:48:35

```
class Solution {

	// TC : O(n2*m)
	// SC O(n*m)
	public int minPathCost(int[][] grid, int[][] moveCost) {
		int m = grid.length;
		int n = grid[0].length;

		int[][] cost = new int[m][n];
		// Set cost for the Row 0
		for (int c = 0; c < n; ++c) {
			cost[0][c] = grid[0][c];
		}

		// From First row till the last
		for (int r = 1; r < m; r++) {
			for (int c = 0; c < n; c++) {

				int minCostFromPeviousRow = Integer.MAX_VALUE;

				for (int j = 0; j < n; j++) {
					// Min (Mi+Ci)
					minCostFromPeviousRow = Math.min(minCostFromPeviousRow, cost[r - 1][j] + moveCost[grid[r - 1][j]][c]);
				}

				cost[r][c] = minCostFromPeviousRow + grid[r][c];
			}
		}

		int leastCostInLastRow = Integer.MAX_VALUE;

		for(int el: cost[m-1]){
			leastCostInLastRow = Math.min(leastCostInLastRow, el);
		}
		return leastCostInLastRow;
	}
}
```

#leetcode
#weekly contest
Here is the link for the problem.....
https://leetcode.com/contest/weekly-contest-297/problems/minimum-path-cost-in-a-grid/
2303. Leetcode Solution in Cpp
Tags: cpp
Published: 2022-07-17 04:45:16

```
class Solution {
 public:
  double calculateTax(vector<vector<int>>& brackets, int income) {
    double ans = 0;
    int prev = 0;

    for (const auto& b : brackets) {
      const int upper = b[0];
      const int percent = b[1];
      if (income < upper)
        return ans + (income - prev) * percent / 100.0;
      ans += (upper - prev) * percent / 100.0;
      prev = upper;
    }

    return ans;
  }
};

```

#leetcode
#weekly contest
Here is the link for the problem.....
https://leetcode.com/contest/weekly-contest-297/problems/calculate-amount-paid-in-taxes/
Data Analyst Career Path for 2022
Tags: datascience, analyst, career, bigdata
Published: 2022-07-17 04:38:51


Skills you need to become data analyst
*  Knowledge of Programming Languages (Python/R)
*  SQL
*  Data Visualization
*  Machine Learning and Natural Language Processing
*  Microsoft Excel

Read full detailed guide [The Ultimate Data Analyst Career Path You Need in 2022](https://www.projectpro.io/article/data-analyst-career-path/604?utm_source=Social&utm_medium=DevTo&utm_campaign=spaceShare) to become a Ultimate Data Analyst.
How to setup supabase authentication in a flutter app with deep linking|| 🔴 Part — 2
Tags: flutter, supabase, nextdev
Published: 2022-07-17 04:38:16

Welcome friends to this blog post where you will learn how to set up the supabase authentication in the flutter app. Moreover, the deep link is also available.

The people who understand Hindi 👇

{% embed https://youtu.be/DLyp4g4yvwY %}

If you didn’t setup the supabase in your app, then follow this previous blog where you learn how to setup supabase 👇
[**How to use supabase database in flutter || 🔴 Part — 1**](https://medium.com/@nextdevelopment1111/how-to-use-supabase-database-in-flutter-part-1-56c87668d0f0)

You can follow this GitHub repository
[**GitHub - nextdev1111/flutter-supabase-authentication**](https://github.com/nextdev1111/flutter-supabase-authentication)

So, let us come to the app.
{% gist https://gist.github.com/studywithdesign/7466559589bbcf18c22e976ede623318.js %}
Now we will make the screens in screens folder

First we need to auth manager, auth state, auth required state in **utils folder**.
{% gist https://gist.github.com/studywithdesign/4bbb04cc408810311ce32a8ae6dc2e07.js %}
This is auth state 👇 which you can use to load the data of the user from supabase. If you face any problem, feel free to ask me at discord. Link at the last.
{% gist https://gist.github.com/studywithdesign/81b81ce2c6994aceda95722e25429762.js %}{% gist https://gist.github.com/studywithdesign/e668209478a981a0b6ab76b5eff06b16.js %}
There are 3screens in **screens **folder.

 1. Home screen (user should be authenticated)

 2. Login Screen

 3. Splash Screen



This is the splash screen 👇 which will initilize when the user opens the app.
{% gist https://gist.github.com/studywithdesign/c823b7e7c74e63f7b9dd94f09181f427.js %}{% gist https://gist.github.com/studywithdesign/40c7e9efb4de096284a20a29ed29f75f.js %}{% gist https://gist.github.com/studywithdesign/31dcd87783d59596efc80c0babbc4fba.js %}
Now, you need to add snack bars for notifying user.

make this constants.dart in [contstants ](https://gist.github.com/studywithdesign/e3b72ad62145760367fb8ccd872db180)folder.
{% gist https://gist.github.com/studywithdesign/e3b72ad62145760367fb8ccd872db180.js %}
Now, let’s go to android manifest for adding deep link.

Add this **full **code in the file. Don’t just copy the data line, but copy full intent filter.
{% gist https://gist.github.com/studywithdesign/06d2c87bb4ffc7cdf5ea9aa8b1937f3c.js %}
In IOS, add this **full **code.
{% gist https://gist.github.com/studywithdesign/9e0cbd22ee78e99c44668e0a1c35a795.js %}
Now, the last step is left

go to your supabase project.

![](https://cdn-images-1.medium.com/max/3840/1*gpGyArGKFxcwMz7ZQTD6TQ.jpeg)

Now, first close your app and then re run it. Your deep link will work only then.

Feel free to ask your questions here 👇
[**Join the Next Dev Discord Server!**](https://discord.com/invite/hN4Wc5VR4M)
417. Leetcode Solution in Java
Tags: java
Published: 2022-07-17 04:37:06

```
class Solution {
    static void dfs(int i, int j, int w, int h, int[][] M, byte[] dp, List<List<Integer>> ans) {
        int ij = i * M[0].length + j;
        if ((dp[ij] & w) > 0 || M[i][j] < h) return;
        dp[ij] += w;
        h = M[i][j];
        if (dp[ij] == 3) ans.add(Arrays.asList(i,j));
        if (i + 1 < M.length) dfs(i+1, j, w, h, M, dp, ans);
        if (i > 0) dfs(i-1, j, w, h, M, dp, ans);
        if (j + 1 < M[0].length) dfs(i, j+1, w, h, M, dp, ans);
        if (j > 0) dfs(i, j-1, w, h, M, dp, ans);
    }
    public List<List<Integer>> pacificAtlantic(int[][] M) {
        List<List<Integer>> ans = new ArrayList<>();
        if (M.length == 0) return ans;
        int y = M.length, x = M[0].length;
        byte[] dp = new byte[x * y];
        for (int i = 0; i < x; i++) {
            dfs(0, i, 1, M[0][i], M, dp, ans);
            dfs(y-1, i, 2, M[y-1][i], M, dp, ans);
        }   
        for (int i = 0; i < y; i++) {
            dfs(i, 0, 1, M[i][0], M, dp, ans);
            dfs(i, x-1, 2, M[i][x-1], M, dp, ans);
        }
        return ans;
    }
}
```

#leetcode
#challenge
here is the link for the problem:
https://leetcode.com/problems/pacific-atlantic-water-flow/
417. Leetcode Solution in Python3
Tags: python
Published: 2022-07-17 04:36:26

```
class Solution:
    def pacificAtlantic(self, M: List[List[int]]) -> List[List[int]]:
        if not M: return M
        x, y = len(M[0]), len(M)
        ans, dp = [], [0] * (x * y)
        def dfs(i: int, j: int, w: int, h: int):
            ij = i * x + j
            if dp[ij] & w or M[i][j] < h: return
            dp[ij] += w
            h = M[i][j]
            if dp[ij] == 3: ans.append([i,j])
            if i + 1 < y: dfs(i+1, j, w, h)
            if i > 0: dfs(i-1, j, w, h)
            if j + 1 < x: dfs(i, j+1, w, h)
            if j > 0: dfs(i, j-1, w, h)
        for i in range(y):
            dfs(i, 0, 1, M[i][0])
            dfs(i, x-1, 2, M[i][x-1])
        for j in range(x):
            dfs(0, j, 1, M[0][j])
            dfs(y-1, j, 2, M[y-1][j])
        return ans
```

#leetcode
#challenge
here is the link for the problem:
https://leetcode.com/problems/pacific-atlantic-water-flow/
417. Leetcode Solution in Javascript
Tags: javascript
Published: 2022-07-17 04:35:18

```
var pacificAtlantic = function(M) {
    if (!M.length) return M
    let y = M.length, x = M[0].length, ans = [],
        dp = new Uint8Array(x * y)
    const dfs = (i, j, w, h) => {
        let ij = i * x + j
        if ((dp[ij] & w) || M[i][j] < h) return
        dp[ij] += w, h = M[i][j]
        if (dp[ij] === 3) ans.push([i,j])
        if (i + 1 < y) dfs(i+1, j, w, h)
        if (i > 0) dfs(i-1, j, w, h)
        if (j + 1 < x) dfs(i, j+1, w, h)
        if (j > 0) dfs(i, j-1, w, h)
    }   
    for (let i = 0; i < y; i++) {
        dfs(i, 0, 1, M[i][0])
        dfs(i, x-1, 2, M[i][x-1])
    }
    for (let j = 0; j < x; j++) {
        dfs(0, j, 1, M[0][j])
        dfs(y-1, j, 2, M[y-1][j])
    }
    return ans
};
```
#leetcode
#challenge
here is the link for the problem:
https://leetcode.com/problems/pacific-atlantic-water-flow/
994. Leetcode Solution in CPP
Tags: cpp
Published: 2022-07-17 04:33:41

```
class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        int n =grid.size();
        int m= grid[0].size();
        //4- directionally
        int dx[4]={0,1,0,-1};
        int dy[4]={-1,0,1,0};
        queue<pair<int,int>>q;
        int fresh=0;
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid[i].size();j++){
                // Push Rottan oranges into queue to do BFS(Layer by Layer)
                if(grid[i][j]==2)     q.push({i,j});
                //Counting number of fresh oranges.
                if(grid[i][j]==1) fresh++;      
            }
        }
        int days=0;
        while(!q.empty() and fresh){
            days++;
            int levelNodes=q.size();
            while(levelNodes--){
                pair<int,int> f=q.front();
                q.pop();
                int x=f.first,y=f.second;
                for(int i=0;i<4;i++){
               int     X=x+dx[i],Y=y+dy[i];
                    if((X>=0 and X<n) and (Y>=0 and Y<m) and grid[X][Y]==1){
                        fresh--;
                        grid[X][Y]=2;
                        q.push({X,Y});
                    }
              }
            }
            
        }
        //If you made all fresh oranges to rotten, return days or -1
        return (fresh==0)?days:-1;
    }
};
```

#leetcode
#challenge
here is the link for the problem:
https://leetcode.com/problems/rotting-oranges/
My GitHub ReadMe
Tags: webdev, discuss, git, programming
Published: 2022-07-17 04:32:53

**Hello Everyone**
**I want some suggestions on how to improve my GitHub Profile ReadMe.**

**Some features of my GitHub ReadMe are:**

- Syncing of Blog Posts
- Syncing of Twitter posts and replies
- New Quotes Daily
- Live Stats

**If you want to create a readme like this checkout: https://dev.to/krishnaagarwal/hey-47n1**

**Give me suggestions by creating an issue.**
**Link: https://github.com/MrKrishnaAgarwal**


**Thanks for Reading till here.**
What is the significance of, and reason for, wrapping the entire content of a JavaScript source file in a function block?
Tags: javascript, webdev, node, npm
Published: 2022-07-17 04:03:22

In JavaScript, wrapping the entire content of a source file generally comes with **immediately invoking** it. The function is called an **Immediately Invoked Function Expression**, or **IIFE**. It is also called a **Self-Executing Anonymous Function**.

```JavaScript
(function () {
  /* … */
})();
```

It's a design pattern commonly used in the ~~ES6~~ Module Pattern before ES6 modules were introduced. It helps us **encapsulate** data and functionality inside a module. jQuery plugins were usually created with IIFEs.

IIFEs are significant because:
- they help with namespacing functions and variables in a library. Namespacing helps us prevent polluting the global namespace.
- they help us control privacy of variables and functions. With an IIFE, we are able to expose only the APIs that we want to -- by returning them in an object, and hide the rest.

---
References

1. [IIFE](https://developer.mozilla.org/en-US/docs/Glossary/IIFE)
2. [Does the module pattern require the use of an IIFE?](https://stackoverflow.com/questions/51182478/does-the-module-pattern-require-the-use-of-an-iife)
3. [Modules (Stateful Access Control)](https://github.com/getify/You-Dont-Know-JS/blob/2nd-ed/scope-closures/ch8.md#modules-stateful-access-control)
4. [The Power of the Module Pattern in JavaScript](https://jsmanifest.com/power-of-the-module-pattern-in-javascript/)
629. Leetcode solution in CPP
Tags: cpp
Published: 2022-07-17 02:44:36

```
class Solution {
public:
int kInversePairs(int n, int k) {
int mod = 1000000007;
if (k > n*(n-1)/2 || k < 0) return 0;
vector<vector<long long>> dp(n+1, vector<long long>(k+1, 0));
for (int i = 1; i <= n; i++) {
dp[i][0] = 1;
if (i + 1 <= n) dp[i + 1][0] = 1;
for (int j = 1; j <= min(k, i*(i-1)/2); j++) {
dp[i][j] = dp[i][j-1] + dp[i-1][j];
if (j >= i) dp[i][j] -= dp[i-1][j-i];
dp[i][j] = (dp[i][j]+mod) % mod;
}
}
return (int) dp[n][k];
}
};
```



#leetcode
#challenge
here is the link for the problem: 
https://leetcode.com/problems/k-inverse-pairs-array/
sk-auth redirect https... ...
Tags: svelte, webdev, oauth, google
Published: 2022-07-17 02:25:24

I tried to develop authrization with Google Oauth via [sk-auth](https://github.com/Dan6erbond/sk-auth). sk-auth is library of SvelteKit like NextAuth.

If we wanna change redirect url from https to http, we can use below code.

```
export const appAuth = new SvelteKitAuth({
    // We can change that by protocol property.
    protocol: 'http',
    jwtSecret: import.meta.env.VITE_JWT_SECRET,
    providers: [
        new Providers.GoogleOAuth2Provider({
            clientId: import.meta.env.VITE_GOOGLE_OAUTH_CLIENT_ID,
            clientSecret: import.meta.env.VITE_GOOGLE_OAUTH_CLIENT_SECRET,
            profile(profile) {
                return { ...profile, provider: 'google' };
            },
        })
    ],
});

```