regd | Decorators trace meta-info for Python

 by   Mikhus Python Version: 1.3.1b License: MIT

kandi X-RAY | regd Summary

kandi X-RAY | regd Summary

regd is a Python library. regd has no bugs, it has no vulnerabilities, it has build file available, it has a Permissive License and it has low support. You can install using 'pip install regd' or download it from GitHub, PyPI.

RegD is a small library for Python which adds ability to trace decorators and decorated functions in Python with meta-information. It work well with both - Python 2.x and Python 3.x. Nevertheless it was designed under Python 3, so it uses __annotations__ functions attribute specially introduced to store function meta. It allows to trace your own and third-party decorators as well. All is required is just to register any existing decorator with DecoratorRegistry, like.
Support
    Quality
      Security
        License
          Reuse

            kandi-support Support

              regd has a low active ecosystem.
              It has 4 star(s) with 0 fork(s). There are 1 watchers for this library.
              OutlinedDot
              It had no major release in the last 12 months.
              regd has no issues reported. There are no pull requests.
              It has a neutral sentiment in the developer community.
              The latest version of regd is 1.3.1b

            kandi-Quality Quality

              regd has no bugs reported.

            kandi-Security Security

              regd has no vulnerabilities reported, and its dependent libraries have no vulnerabilities reported.

            kandi-License License

              regd is licensed under the MIT License. This license is Permissive.
              Permissive licenses have the least restrictions, and you can use them in most projects.

            kandi-Reuse Reuse

              regd releases are not available. You will need to build from source code and install.
              Deployable package is available in PyPI.
              Build file is available. You can build the component from source.
              Installation instructions, examples and code snippets are available.

            Top functions reviewed by kandi - BETA

            kandi has reviewed regd and discovered the below as its top functions. This is intended to give you an instant insight into regd implemented functionality, and help decide if they suit your requirements.
            • Decorator to convert a function into a decorator
            • Get the native function for fn
            • Makes a callable
            • Convert fn to portable
            • Set a decorator
            • Set the native function
            • Appends a decorator to fn
            • Find all packages in a directory
            • Check if given path is a package
            • Generator that yields all functions decorated with a given decorator
            • Generator that yields all decorated functions
            • Iterate over decorated methods
            • Get decorators
            • Decorator for a decorator
            • Returns True if fn is decorated with the given decorator
            • Get the decorator for the given function
            • Get a real function
            Get all kandi verified functions for this library.

            regd Key Features

            No Key Features are available at this moment for regd.

            regd Examples and Code Snippets

            Description
            Pythondot img1Lines of Code : 16dot img1License : Permissive (MIT)
            copy iconCopy
            from regd import DecoratorRegistry
            
            # create simple decorator which does nothing
            def mydecorator( fn) :
                # do your decorator stuff here...
                def wrapper( *args, **kwargs)
                    # ... and here ... all you need
                    return fn( *args, **kwargs  
            Installation
            Pythondot img2Lines of Code : 5dot img2License : Permissive (MIT)
            copy iconCopy
            > pip install regd
            
            > easy_install regd
            
            > git clone git://github.com/Mikhus/regd.git
            > cd regd
            > python setup.py install
              

            Community Discussions

            QUESTION

            when Hadoop DataNode is down
            Asked 2021-Jun-04 at 18:17

            Regd below statement can anyone clarify below questions ?

            Satement: When a DataNode is down, it does not affect the availability of data or the cluster. NameNode will arrange for replication for the blocks managed by the DataNode that is not available

            Questions:

            1. When datanode(d1) is down will namenode blindly start replicating blocks(B1,B2..Bn) on other nodes(d2)?
            2. But when datanode(d1) is up , what happens to the same existing blocks(B1,B2...Bn) on datanode(d1)?

            Explanation:

            Lets say datanode d1 has blocks b1 ,b2..Bn Since it is down namenode will start replicating them on to datanode d2 or other. But when d1 is up what happens to the d1 blocks ?

            ...

            ANSWER

            Answered 2021-Jun-04 at 18:17

            DataNodes notice NameNode about receiving or deletion of blocks or they send over list of their replicas periodically. Moreover, NameNode has one still­running thread namely ReplicationMonitor to get under­replication and over­replication under its radar and plans for deletion/replication accordingly

            source

            Source https://stackoverflow.com/questions/67840778

            QUESTION

            sort return data with SQL in SQLite order by row
            Asked 2021-May-02 at 11:38

            I have a DB which has 8 columns, all are integers range 1~99:

            ...

            ANSWER

            Answered 2021-May-02 at 11:11

            Fix your data model! You should not be storing values in columns. You should be storing them in rows.

            That is, SQL doesn't "sort columns". It deals with data in rows!

            You can do what you want by unpivoting the data into rows, calculating the new order, and then reaggregating:

            Source https://stackoverflow.com/questions/67355593

            QUESTION

            Count occurance in a row in SQLite just by SQL?
            Asked 2021-May-01 at 14:15

            I have a DB contain 5 columns, all are integers range from 1~5 e.g. 1,1,2,3,1 5,1,2,3,4 4,2,3,2,1 .... is there a way to count number of occurrence of, say 1 in first row by just SQL ? (in this case, 3 should be return). select count() just deal with number of records return in column manner. Thanks.

            Regds LAM Chi-fung

            ...

            ANSWER

            Answered 2021-May-01 at 12:48

            QUESTION

            Printing a matched pattern and its next string using re in python3
            Asked 2020-Mar-03 at 08:04

            I am trying to read a pdf file which is sample invoice and I am trying to fetch some sample details from the pdf like Company Name, Invoice no, GST no, Quantity of Materials etc. For this, first of all I am using PyPDF2 to get the data in the text format and then I have used NLTK toolkit to tokenize the text and remove special characters. The problem is I am not able to print 'Invoice No' and its next string containing the Invoice num. Here is the code below. Any help would be highly appreciated.

            ...

            ANSWER

            Answered 2020-Mar-02 at 12:24

            I propose the following solution starting from the string you got after extracting text from the PDF:

            Source https://stackoverflow.com/questions/60488472

            QUESTION

            Dynamodb ondemand cost and scaling during hot partition(adaptive scaling)
            Asked 2020-Feb-20 at 08:16

            I can understand the provisioned DB cost but there are few questions regd on-demand nodes.

            does OnDemand pricing only considers the sum of WRU used by each partition or the overall WRU for the table based on the usage pattern which will be shared by each partition.

            when there is a hot partition, does OnDemand increase WRU only for that partition or increases the overall WRU of the table.

            does adaptive capacity work with OnDemand DB

            ex: OnDemand DB with 10 partitions and current peak at 1000WRU. if 2 hot partitions require more than 300WRU will it use from adaptive capacity or increase the overall WRU to 3000WRU resulting in high cost?

            ...

            ANSWER

            Answered 2020-Feb-20 at 08:16

            I'm not a DynamoDB insider, so I can only answer from what I understand from their documentation.

            In on-demand pricing (see https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.OnDemand) you pay exactly by the number and size of your requests. If you make one million requests, you will pay the same whether these requests were to a million different partitions, or they all went to the same partition.

            You might wonder, then, why there was such an issue of load imbalance pricing in provisioned-capacity pricing - or at least why is the Web full of stories of such an issue. There should never have been such an issue, but in the past there was. But since recently, this isn't an issue any more. Here is the story:

            In the provisioned pricing page, Amazon claims that if you reserve 1000 WCU, you should be able to use this number of write units that you paid for, per second, and if you try to use more, you'll be throttled. There is no mention or warning of imbalanced loads or hot partitions... But people discovered that this wasn't quite true - Amazon had a bug in their throttling code: The usage counting wasn't done across the entire cluster. Instead, if your data was spread over 10 nodes, your reservation of 1000 was evenly split among them, so each of the 10 nodes would start to throttle you after 100 (1000/10) requests per second. This split worked well for well-balanced loads, but with hot partitions, it didn't work well. People were paying for a reservation of 1000 but when they measured how much they were getting, they saw throttling after just 800 (for example) requests per second. Amazon acknowledge this was a bug, and fixed it with their "adaptive capacity" technique where each of the nodes picks a different throttling limit, modified until the user's total usage approaches what he had paid for. This technique is explained in this excellent official talk https://www.youtube.com/watch?v=yvBR71D0nAQ - see time 19:38. Until very recently this "adaptive capacity" was a very blunt instrument, which only worked well if your workload doesn't change quickly, but since then, this issue was fixed too - as described in
            https://aws.amazon.com/blogs/database/how-amazon-dynamodb-adaptive-capacity-accommodates-uneven-data-access-patterns-or-why-what-you-know-about-dynamodb-might-be-outdated/

            Source https://stackoverflow.com/questions/60314981

            QUESTION

            Python-To Extract Data from Text file using Regex using python script
            Asked 2020-Feb-06 at 10:32

            i want to Extract firm name(Samsung India Electronics Pvt. Ltd.) from my text file that are present in next line after Firm name. i have extract some data by my code but i am not able to extact firm name because i am new in python or python regex

            ...

            ANSWER

            Answered 2020-Feb-06 at 10:32

            QUESTION

            How to update Vuetify to project created using Vue-cli-2
            Asked 2019-Oct-09 at 06:28

            I'm trying to update Vuetify in a vue application created using Vue Cli 2. The current version is 0.17. This is very old version and causing a lot of problems. I need to upgrade this to latest version 1.1.8.

            What I've tried:

            1. remove existing vuetify plugin, updated package.json to the current version and run npm i -S vuetify.
            2. run vue add vuetify
            3. The documentation regd this shows invalid link. which has been notified to vuetify team

            Problem

            All these methods works but the out put is not as desired. The browser reloads endlessly when I run npm run dev. I'm not able to debug or even check the screen changes.

            ...

            ANSWER

            Answered 2019-Oct-09 at 06:28

            To update vuetify you've to remove and install new version of the vuetify using the following commands. npm remove --save vuetify npm install --save vuetify@latest

            Cause of the relaoding problem when updating vuetify

            Vuetify select is emitting on-change event during page load, if data is being fetched in the select. Prior to 1.0.0 it was not like that.

            If someone faces the same issue make sure all the codes in the on-change event run after the page/component is mounted.

            Source https://stackoverflow.com/questions/51538446

            QUESTION

            Printing student records: I want to show every record on a different page
            Asked 2019-Jul-31 at 08:38
            int b = 1;
            
                //Here is my print document event
                private void PrintDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
                {
                    try
                    {
            
                        if (b <= 1)
                        {
                            //Here im using string connection and fetching data through loop
                            conn = new SqlConnection(Db_Path.path);
                            conn.Open();
                            query = "select StudentsRecord.Student_Id,StudentsRecord.GR_No,StudentsRecord.Section,StudentsRecord.Name,StudentsRecord.Father_Name,Classes.Monthly_Fee,StudentsRecord.Tuition_Fee_Discount from StudentsRecord inner join Classes on StudentsRecord.Admission_Class_Id=Classes.Class_Id where Classes.Class_Name='" + cbclass.SelectedItem + "'";
                            cmd = new SqlCommand(query, conn);
                            SqlDataReader dr = cmd.ExecuteReader();
                            while (dr.Read())
                            {
            
                                int a = Convert.ToInt32(dr[5].ToString()) - Convert.ToInt32(dr[6].ToString());
                                int c = a + Convert.ToInt32(txtlatefee.Text);
            
            
                                e.Graphics.DrawString("BABA FOUNDATION PUBLIC", new Font("Arial", 15, FontStyle.Bold), Brushes.Black, new Point(20, 10));
                                e.Graphics.DrawString("HIGH SCHOOL (REGD)", new Font("Arial", 15, FontStyle.Bold), Brushes.Black, new Point(50, 35));
                                e.Graphics.DrawString("Domonwah Road Hyderabad.", new Font("Arial", 8, FontStyle.Bold), Brushes.Black, new Point(80, 60));
                                e.Graphics.DrawString("School's Copy", new Font("Arial", 15, FontStyle.Regular), Brushes.Black, new Point(20, 90));
                                e.Graphics.DrawString("Issue Date", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(40, 140));
                                e.Graphics.DrawString("" + txtissuedate.Text, new Font("Arial", 10, FontStyle.Regular), Brushes.Black, new Point(120, 140));
                                e.Graphics.DrawString("Due Date", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(40, 155));
                                e.Graphics.DrawString("" + txtduedate.Text, new Font("Arial", 10, FontStyle.Regular), Brushes.Black, new Point(120, 155));
                                e.Graphics.DrawString("V. No.", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(20, 205));
                                e.Graphics.DrawString("SID.", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(215, 205));
                                e.Graphics.DrawString("" + dr[0].ToString(), new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(245, 205));
                                e.Graphics.DrawString("Fee for the month of:", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(20, 225));
                                e.Graphics.DrawString("" + txtfeemonth.Text, new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(170, 225));
                                e.Graphics.DrawString("Roll No:", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(20, 245));
                                e.Graphics.DrawString("GR#:", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(180, 245));
                                e.Graphics.DrawString("" + dr[1].ToString(), new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(220, 245));
                                e.Graphics.DrawString("Class:", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(20, 265));
                                e.Graphics.DrawString("" + cbclass.SelectedItem, new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(100, 265));
                                e.Graphics.DrawString("Sec:", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(180, 265));
                                e.Graphics.DrawString("" + dr[2].ToString(), new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(220, 265));
                                e.Graphics.DrawString("Name:", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(20, 285));
                                e.Graphics.DrawString("" + dr[3].ToString(), new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(70, 285));
                                e.Graphics.DrawString("F/Name:", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(20, 305));
                                e.Graphics.DrawString("" + dr[4].ToString(), new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(80, 305));
                                e.Graphics.DrawRectangle(new Pen(Color.Black), 20, 340, 300, 350);
                                e.Graphics.DrawString("Particulars", new Font("Arial", 15, FontStyle.Bold), Brushes.Black, new Point(65, 345));
                                e.Graphics.DrawString("Amount", new Font("Arial", 13, FontStyle.Bold), Brushes.Black, new Point(235, 345));
                                e.Graphics.DrawLine(new Pen(Color.Black), 230, 340, 230, 688);
                                e.Graphics.DrawString("Admission Fee", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(30, 388));
                                e.Graphics.DrawString("0.00", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(235, 388));
                                e.Graphics.DrawLine(new Pen(Color.Black), 20, 380, 320, 380);
                                e.Graphics.DrawString("Monthly Tuition Fee", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(30, 418));
                                e.Graphics.DrawString("" + a.ToString(), new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(235, 418));
                                e.Graphics.DrawLine(new Pen(Color.Black), 20, 410, 320, 410);
                                e.Graphics.DrawString("Other Fee", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(30, 443));
                                e.Graphics.DrawString("0.00", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(235, 443));
                                e.Graphics.DrawLine(new Pen(Color.Black), 20, 440, 320, 440);
                                e.Graphics.DrawString("Exam Fee", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(30, 470));
                                e.Graphics.DrawString("0.00", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(235, 470));
                                e.Graphics.DrawLine(new Pen(Color.Black), 20, 465, 320, 465);
                                e.Graphics.DrawString("Stationary Charges", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(30, 494));
                                e.Graphics.DrawString("0.00", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(235, 494));
                                e.Graphics.DrawLine(new Pen(Color.Black), 20, 490, 320, 490);
                                e.Graphics.DrawString("Annual Charges", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(30, 518));
                                e.Graphics.DrawString("0.00", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(235, 518));
                                e.Graphics.DrawLine(new Pen(Color.Black), 20, 515, 320, 515);
                                e.Graphics.DrawString("Course Payment", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(30, 545));
                                e.Graphics.DrawString("0.00", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(235, 545));
                                e.Graphics.DrawLine(new Pen(Color.Black), 20, 540, 320, 540);
                                e.Graphics.DrawString("Library Fee", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(30, 570));
                                e.Graphics.DrawString("0.00", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(235, 570));
                                e.Graphics.DrawLine(new Pen(Color.Black), 20, 565, 320, 565);
                                e.Graphics.DrawString("Others", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(30, 596));
                                e.Graphics.DrawString("0.00", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(235, 596));
                                e.Graphics.DrawLine(new Pen(Color.Black), 20, 590, 320, 590);
                                e.Graphics.DrawString("Arrears", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(30, 621));
                                e.Graphics.DrawString("0.00", new Font("Arial", 10, FontStyle.Bold), Brushes.Black, new Point(235, 621));
                                e.Graphics.DrawLine(new Pen(Color.Black), 20, 615, 320, 615);
                                e.Graphics.DrawString("Payable within due date", new Font("Arial", 11, FontStyle.Bold), Brushes.Black, new Point(30, 643));
                                e.Graphics.DrawString("" + a.ToString(), new Font("Arial", 11, FontStyle.Bold), Brushes.Black, new Point(235, 646));
                                e.Graphics.DrawLine(new Pen(Color.Black), 20, 640, 320, 640);
                                e.Graphics.DrawString("Payable after due date", new Font("Arial", 11, FontStyle.Bold), Brushes.Black, new Point(30, 667));
                                e.Graphics.DrawString("" + c.ToString(), new Font("Arial", 11, FontStyle.Bold), Brushes.Black, new Point(235, 670));
                                e.Graphics.DrawLine(new Pen(Color.Black), 20, 665, 320, 665);
                                e.Graphics.DrawString("Rupees (In Words):", new Font("Arial", 13, FontStyle.Bold), Brushes.Black, new Point(20, 705));
                                e.Graphics.DrawLine(new Pen(Color.Black), 20, 785, 320, 785);
                                e.Graphics.DrawString("Note:", new Font("Arial", 13, FontStyle.Bold), Brushes.Black, new Point(20, 795));
                                e.Graphics.DrawLine(new Pen(Color.Black), 20, 820, 70, 820);
            
                                var r = new Rectangle(20, 825, 300, 100);
            
                                e.Graphics.DrawString(txtnote.Text, new Font("Arial", 10, FontStyle.Bold), Brushes.Black, r);
            
            
                                if (dr[0].ToString() != null)
                                {
                                    MessageBox.Show(dr[0].ToString());
                                    e.HasMorePages = true;
            
                                }
                                else
                                {
                                    e.HasMorePages = false;
            
                                }
            
            
                            }
                            b++;
                        }
            
            
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            
            ...

            ANSWER

            Answered 2019-Jul-31 at 08:38

            You need to change the logic of your reads.

            Place the reader outside of the PrintPage event and in it read and DrawString etc until the page is full or reader is empty. Then return from the event. It will be called again automatically if HasMorePages is true..

            Here is an example of a print logic structure:

            Source https://stackoverflow.com/questions/57284559

            QUESTION

            read in large CSV file performance issue in C++
            Asked 2019-Feb-11 at 07:36

            I need to read in many big CSV file to process in C++ (range from few MB to hundreds MB) At first, I open with fstream, use getline to read each line and use the following function to split each row"

            ...

            ANSWER

            Answered 2018-Apr-24 at 15:32

            Mainly you want to avoid copying.

            If you can afford the memory to load the whole file into an array, then use that array directly, don't convert it back to a stringstream, as that makes another copy, just process the big buffer!

            On the other hand that requires your machine to free up adequate RAM for your allocation, and possibly page some RAM to disk, which will be slow to process. The alternative is to load your file in large chunks, identify the lines in that chunk and only copy down the part-line at the end of the chunk before loading the next portion of file to concatenate to that part-line (a wrap and read).

            Another option is that most operating systems provide a memory-mapped file view which means the OS does the file copying for you. These are more constrained (you have to use fixed block sizes and offsets) but will be faster.

            You can use methods like strtok_r to split your file into lines, and lines into fields, though you need to deal with escaped field markers - you need to do that anyway. It is possible to write a tokeniser that works like strtok but returns string_view-like ranges instead of actually inserting null bytes.

            Finally you may need to convert some of the field strings to numeric forms or otherwise interpret them. Ideally don't use istringstream, as that makes another copy of the string. If you must, perhaps craft your own streambuf that uses the string_view directly, and attach it to an istream?

            So this should significantly reduce the amount of data copying going on, and should see a speed-up.

            Be aware that you can only directly access the fields and lines that you have in your file read window. When you wrap and read any references you have into that data are useless rubbish.

            Source https://stackoverflow.com/questions/50002563

            QUESTION

            Group by on two tables and then append results and remove duplicates
            Asked 2019-Jan-31 at 14:02

            I have 2 tables with multiple columns in each of them. As can be seen below the column headers are not the same name. I would like to do a GROUP BY on the first and second column of EACH table and then in the output, the results should be appended and not have any duplicates. Also the results only needs the first two columns as the output.

            Tablename = STAT

            ...

            ANSWER

            Answered 2019-Jan-31 at 14:02

            I would use UNION ALL to combine both tables in 1 unique. Then, wrap a SELECT * around that query and apply a GROUP BY

            Or, instead of using a GROUP BY I would do the same as above, but using a SELECT DISTINCT *

            Or, as stated @Usagi Miyamoto in comments, using simple a UNION (without ALL)

            Schema (MySQL v5.7)

            Source https://stackoverflow.com/questions/54461731

            Community Discussions, Code Snippets contain sources that include Stack Exchange Network

            Vulnerabilities

            No vulnerabilities reported

            Install regd

            This module is availabe via Python Package Index (PyPI). Installation is possible with pip or easy_install, like. It's also available manual installation from git repository, like.

            Support

            RegD package documentation is available at http://packages.python.org/regd/.
            Find more information at:

            Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from over 650 million Knowledge Items

            Find more libraries
            Install
          • PyPI

            pip install regd

          • CLONE
          • HTTPS

            https://github.com/Mikhus/regd.git

          • CLI

            gh repo clone Mikhus/regd

          • sshUrl

            git@github.com:Mikhus/regd.git

          • Stay Updated

            Subscribe to our newsletter for trending solutions and developer bootcamps

            Agree to Sign up and Terms & Conditions

            Share this Page

            share link