1 | 1 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,51 @@ |
1 |
+======= CHANGELOG ======= |
|
2 |
+ |
|
3 |
+Versions: |
|
4 |
+ |
|
5 |
+== 1.0.0 - 2022-1-27 == |
|
6 |
+* Initial release. |
|
7 |
+ |
|
8 |
+== 1.0.1 - 2022-3-3 == |
|
9 |
+* Added screenshot image and made minor text changes. |
|
10 |
+ |
|
11 |
+== 1.0.2 - 2022-3-4 == |
|
12 |
+* Changed screenshot image. |
|
13 |
+ |
|
14 |
+== 1.0.3 - 2022-3-30 == |
|
15 |
+* Changed presentation text. |
|
16 |
+ |
|
17 |
+== 1.0.4 - 2022-4-19 == |
|
18 |
+* Changed the URL of the pop-up window, to make it work when Nextcloud is served on a subdirectory. |
|
19 |
+* Changed image displayed on initial screen. |
|
20 |
+* Changed presentation text. |
|
21 |
+ |
|
22 |
+== 1.0.5 - 2022-5-9 == |
|
23 |
+* Changed syntax of SQL queries and encryption function. |
|
24 |
+* Modified pop-up window URL. |
|
25 |
+ |
|
26 |
+== 1.0.6 - 2022-8-20 == |
|
27 |
+* Changed presentation text. |
|
28 |
+ |
|
29 |
+== 1.0.7 - 2022-9-22 == |
|
30 |
+* Fixed error when not entering a STUN server on the Settings page. |
|
31 |
+* Changed presentation text. |
|
32 |
+ |
|
33 |
+== 1.0.8 - 2022-10-27 == |
|
34 |
+* Changed CSS settings to match the modifications introduced in Nextcloud 25. |
|
35 |
+* Modified presentation text. |
|
36 |
+ |
|
37 |
+== 1.0.9 - 2022-12-3 == |
|
38 |
+* Minor changes to certain SQL queries and minor css change. |
|
39 |
+ |
|
40 |
+== 1.1.0 - 2023-5-31 == |
|
41 |
+* Made app available for Nextcloud 26. |
|
42 |
+ |
|
43 |
+== 1.1.1 - 2023-10-30 == |
|
44 |
+* Marked the app as compatible with Nextcloud 27. |
|
45 |
+ |
|
46 |
+== 1.1.2 - 2024-1-8 == |
|
47 |
+* Added on settings page: debug logging checkbox, 'Available phone number(s)' |
|
48 |
+ field and 'Default phone number for outgoing calls' field. |
|
49 |
+* Added the 'fonts' directory and stored the 'Open Sans' and 'Inter' fonts inside it. |
|
50 |
+* Made small CSS changes and edited app presentation text. |
|
51 |
+* Marked the app as compatible with Nextcloud 28. |
0 | 52 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,128 @@ |
1 |
+<span style="display:block;height:15px!important"></span> |
|
2 |
+<p align="center"><img src="https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_logo.png" alt="SIP Trip Phone" width="171px" height="119px"/></p> |
|
3 |
+ |
|
4 |
+<span style="display:block;height:20px!important"></span> |
|
5 |
+ |
|
6 |
+**SIP Trip Phone is a browser phone in the form of a Nextcloud application. It can connect to SIP providers via Asterisk or directly.** |
|
7 |
+ |
|
8 |
+It can be used in conjunction with Asterisk, to benefit from the control, autonomy and advanced PBX features offered by Asterisk, or without Asterisk, if it's connected directly to the |
|
9 |
+SIP provider. For calls to and from regular phone numbers, a SIP provider like Telnyx or Localphone is needed and a real phone number acquired from that provider. If Asterisk |
|
10 |
+is used, it's recommended to be Asterisk version 18.0.0 LTS and it has to be installed on a VPS or dedicated server, as explained in the documentation mentioned in the 'Installation' |
|
11 |
+section from below. The web server has to be configured to allow access to a specific directory and to proxy WebSocket traffic to a specific URL, as explained in the documentation. |
|
12 |
+Not all SIP providers allow connections from external Asterisk servers or direct connections from web applications that use SIP over WebSocket, like SIP Trip Phone. Thus, you can |
|
13 |
+connect this application to Telnyx, Localphone, Twilio, Flowroute, Vonage, etc. via an Asterisk server, but if you want to connect it directly to the SIP provider, from the 5 |
|
14 |
+mentioned providers, only Telnyx will work, because the others don't allow direct connections from web applications using SIP over WebSocket. SIP Trip Phone is based on the ctxSip |
|
15 |
+phone. |
|
16 |
+ |
|
17 |
+<span style="display:block;height:20px!important"></span> |
|
18 |
+ |
|
19 |
+## Features |
|
20 |
+<span style="display:block;height:10px!important"></span> |
|
21 |
+ |
|
22 |
+* 📞 SIP Trip Phone allows making and receiving calls to/from any mobile or landline phone at lower rates than with regular phones. It is known that VoIP phone calls are up to 70% cheaper than regular phone calls. International VoIP phone calls can cost even 90% less than regular phone calls. |
|
23 |
+ |
|
24 |
+* 🌐 You can acquire phone numbers in countries of your choice and make cheap international phone calls to receivers in those countries. When calling you back on those numbers, the receivers will pay as for local calls. |
|
25 |
+ |
|
26 |
+* 🆓 You can make free calls over the Internet between extensions configured on the underlying Asterisk server. |
|
27 |
+ |
|
28 |
+* ☎️ SIP Trip Phone logs recent phone calls and their duration and allows holding, muting and transferring phone calls. |
|
29 |
+ |
|
30 |
+* 📑 When using Asterisk, SIP Trip Phone allows choosing any available phone number as the 'From' number for outgoing calls. |
|
31 |
+ |
|
32 |
+* 🚩 Incoming calls are signaled by on-screen notifications. |
|
33 |
+ |
|
34 |
+* 📃 Once you open SIP Trip Phone, you can use it even if you are logged out of Nextcloud. |
|
35 |
+ |
|
36 |
+* 💻 If Asterisk is used, on the underlying Asterisk server you can implement an IVR (Interactive Voice Response or 'voice menu') and many advanced PBX features such as voicemail, queue management, music on hold, number blacklisting, call recording, audio conference calls, etc. |
|
37 |
+ |
|
38 |
+* 💰 The only ongoing cost is about $1 per month (depending on the country) for a phone number. No contracts. |
|
39 |
+ |
|
40 |
+* 💸 Low per minute prices: if Asterisk is used, you can make calls within the US starting from $0.0050 per minute and receive calls with $0.0075 per minute or less (Telnyx), or $0.0060 per minute for outgoing calls and $0 for incoming calls (Localphone). If SIP Trip Phone is connected directly to Telnyx, you can make and receive phone calls with $0.0020 per minute in the US. |
|
41 |
+ |
|
42 |
+Double Bastion is not affiliated with Telnyx, Localphone, Twilio, Flowroute or Vonage. |
|
43 |
+ |
|
44 |
+### Donations |
|
45 |
+ |
|
46 |
+* 🎁 [Donate](https://www.doublebastion.com/donations/) |
|
47 |
+ |
|
48 |
+<span style="display:block;height:20px!important"></span> |
|
49 |
+ |
|
50 |
+<p align="center">Initial screen</p> |
|
51 |
+<span style="display:block;height:10px!important"></span> |
|
52 |
+<span style="display:block;margin:auto;width:412px;">![Image of SIP Trip Phone Interface](https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_initial_screen.png)</span> |
|
53 |
+<span style="display:block;height:40px!important"></span> |
|
54 |
+<p align="center">Dialpad</p> |
|
55 |
+<span style="display:block;height:10px!important"></span> |
|
56 |
+<span style="display:block;margin:auto;width:412px;">![Image of SIP Trip Phone Interface](https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_dialpad.png)</span> |
|
57 |
+<span style="display:block;height:40px!important"></span> |
|
58 |
+<p align="center">Making calls</p> |
|
59 |
+<span style="display:block;height:10px!important"></span> |
|
60 |
+<span style="display:block;margin:auto;width:412px;">![Image of SIP Trip Phone Interface](https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_calling.png)</span> |
|
61 |
+<span style="display:block;height:40px!important"></span> |
|
62 |
+<p align="center">Transferring calls</p> |
|
63 |
+<span style="display:block;height:10px!important"></span> |
|
64 |
+<span style="display:block;margin:auto;width:412px;">![Image of SIP Trip Phone Interface](https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_hold.png)</span> |
|
65 |
+<span style="display:block;height:40px!important"></span> |
|
66 |
+ |
|
67 |
+## Browsers |
|
68 |
+<span style="display:block;height:10px!important"></span> |
|
69 |
+ |
|
70 |
+SIP Trip Phone works with all the major browsers. |
|
71 |
+ |
|
72 |
+<span style="display:block;height:20px!important"></span> |
|
73 |
+ |
|
74 |
+## Programming Languages |
|
75 |
+<span style="display:block;height:10px!important"></span> |
|
76 |
+ |
|
77 |
+SIP Trip Phone only uses PHP, SQL, jQuery, CSS and HTML. This means it's robust, efficient, light-weight and easy to maintain and debug. |
|
78 |
+ |
|
79 |
+<span style="display:block;height:20px!important"></span> |
|
80 |
+ |
|
81 |
+## Minimum Requirements |
|
82 |
+<span style="display:block;height:10px!important"></span> |
|
83 |
+ |
|
84 |
+- **Nextcloud 22+** has to be installed and properly configured, preferably by following the Install Nextcloud chapter in our guide. |
|
85 |
+ |
|
86 |
+- **A telnyx.com or localphone.com account and a phone number** associated with it. You can use a SIP provider different from Telnyx or Localphone, but they have to allow direct connections from external Asterisk servers and/or from web applications that use SIP over WebSocket. |
|
87 |
+ |
|
88 |
+If you decide to connect SIP Trip Phone to your SIP provider via Asterisk, you will need **Asterisk, preferably version 18.0.0 LTS** (with **chan_pjsip** enabled), installed on a VPS or |
|
89 |
+dedicated server. You can also install Coturn (version 4.5.1.1 or newer) as a STUN server, which facilitates connections when callers are behind routers. |
|
90 |
+ |
|
91 |
+<span style="display:block;height:20px!important"></span> |
|
92 |
+ |
|
93 |
+## Installation |
|
94 |
+<span style="display:block;height:10px!important"></span> |
|
95 |
+ |
|
96 |
+<a href="https://www.doublebastion.com/install-nextcloud/#install-sip-trip-phone" rel="noreferrer noopener" target="_blank">This chapter</a> of our Complete Guide to a Complete Linux Server |
|
97 |
+explains in detail how to install and use this application. It also contains the links to the chapters that describe how to install Asterisk and Coturn. |
|
98 |
+ |
|
99 |
+SIP Trip Phone is a component of RED Scarf Suite. It can be installed and used alone, but if you want to install <a href="https://www.doublebastion.com/red-scarf-suite-components/" rel="noreferrer noopener" target="_blank">all |
|
100 |
+the components</a> of RED Scarf Suite, you can follow our <a href="https://www.doublebastion.com/free-server/complete-guide-to-a-complete-linux-server/" rel="noreferrer noopener" target="_blank">complete guide</a>. |
|
101 |
+ |
|
102 |
+<span style="display:block;height:20px!important"></span> |
|
103 |
+ |
|
104 |
+## Contribute |
|
105 |
+<span style="display:block;height:10px!important"></span> |
|
106 |
+ |
|
107 |
+This is the official git repository of SIP Trip Phone. The <a href="https://github.com/DoubleBastionAdmin/sip-trip-phone" rel="noreferrer noopener" target="_blank">GitHub SIP Trip Phone |
|
108 |
+repository</a> is just a pointer to this repository. We don’t use GitHub for developing SIP Trip Phone because GitHub is owned by one of the companies that proved their disrespect for |
|
109 |
+digital freedom over the years and because centralized services create autonomy and privacy issues, in spite of all the benefits. |
|
110 |
+ |
|
111 |
+If you want to contribute code to this project, please submit <a href="https://git.doublebastion.com/sip-trip-phone/pullrequests/contrib" rel="noreferrer noopener" target="_blank">this form</a>, |
|
112 |
+mentioning your intended changes. We'll send you the credentials needed to push code to the "contrib" branch of this repository. After we review the changes, we can include them in the |
|
113 |
+project. |
|
114 |
+ |
|
115 |
+Please post any bugs that are not security related, or feature requests, on the <a href="https://git.doublebastion.com/sip-trip-phone/issues/develop" rel="noreferrer noopener" target="_blank"> |
|
116 |
+issue tracker</a>. If you notice bugs related to security, don’t post them on the issue tracker; instead, send them to manager [at] doublebastion [dot] com . |
|
117 |
+ |
|
118 |
+<span style="display:block;height:20px!important"></span> |
|
119 |
+ |
|
120 |
+## License |
|
121 |
+<span style="display:block;height:10px!important"></span> |
|
122 |
+ |
|
123 |
+SIP Trip Phone as a whole is licensed under the GNU Affero General Public License Version 3. If you use SIP Trip Phone or distribute it in modified or unmodified form, you will need to comply with |
|
124 |
+the terms of the GNU Affero General Public License Version 3. |
|
125 |
+ |
|
126 |
+This application is based on the ctxSip phone and the original copyright notice is included in the appropriate files. |
|
127 |
+ |
|
128 |
+SIP Trip Phone includes libraries licensed under different free software licenses. These libraries contain their respective original copyright notices. |
0 | 129 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,90 @@ |
1 |
+<?xml version="1.0"?> |
|
2 |
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" |
|
3 |
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd"> |
|
4 |
+ <id>sip_trip_phone</id> |
|
5 |
+ <name>SIP Trip Phone</name> |
|
6 |
+ <summary>Browser softphone</summary> |
|
7 |
+ <description><![CDATA[ |
|
8 |
+A browser phone that can be connected to SIP providers via Asterisk or directly. It can be used in conjunction |
|
9 |
+with Asterisk, to benefit from the control, autonomy and advanced PBX features offered by Asterisk, or without |
|
10 |
+Asterisk, if it's connected directly to the SIP provider. For calls to and from regular phone numbers, a SIP |
|
11 |
+provider like Telnyx or Localphone is needed and a real phone number acquired from that provider. If Asterisk is |
|
12 |
+used, it's recommended to be Asterisk version 18.0.0 LTS and it has to be installed on a VPS or dedicated server, |
|
13 |
+as explained in the 'Admin documentation' linked on this page. The web server has to be configured to allow access |
|
14 |
+to a specific directory and to proxy WebSocket traffic to a specific URL, as explained in the 'Admin documentation'. |
|
15 |
+Not all SIP providers allow connections from external Asterisk servers or direct connections from web applications |
|
16 |
+that use SIP over WebSocket, like SIP Trip Phone. Thus, you can connect this application to Telnyx, Localphone, |
|
17 |
+Twilio, Flowroute, Vonage, etc. via an Asterisk server, but if you want to connect it directly to the SIP provider, |
|
18 |
+from the 5 mentioned providers, only Telnyx will work, because the others don't allow direct connections from web |
|
19 |
+applications using SIP over WebSocket. |
|
20 |
+SIP Trip Phone is based on the ctxSip phone. |
|
21 |
+ |
|
22 |
+### Features: |
|
23 |
+ |
|
24 |
+* 📞 SIP Trip Phone allows making and receiving calls to/from any mobile or landline phone at lower rates than with regular phones. It is known that VoIP phone calls are up to 70% cheaper than regular phone calls. International VoIP phone calls can cost even 90% less than regular phone calls. |
|
25 |
+ |
|
26 |
+* 🌐 You can acquire phone numbers in countries of your choice and make cheap international phone calls to receivers in those countries. When calling you back on those numbers, the receivers will pay as for local calls. |
|
27 |
+ |
|
28 |
+* 🆓 If Asterisk is used, you can make free calls over the Internet between extensions configured on the underlying Asterisk server. |
|
29 |
+ |
|
30 |
+* ☎️ SIP Trip Phone logs recent phone calls and their duration and allows holding, muting and transferring phone calls. |
|
31 |
+ |
|
32 |
+* 📑 When using Asterisk, SIP Trip Phone allows choosing any available phone number as the 'From' number for outgoing calls. |
|
33 |
+ |
|
34 |
+* 🚩 Incoming calls are signaled by on-screen notifications. |
|
35 |
+ |
|
36 |
+* 📃 Once you open SIP Trip Phone, you can use it even if you are logged out of Nextcloud. |
|
37 |
+ |
|
38 |
+* 💻 If Asterisk is used, on the underlying Asterisk server you can implement an IVR (Interactive Voice Response or 'voice menu') and many advanced PBX features such as voicemail, queue management, music on hold, number blacklisting, call recording, audio conference calls, etc. |
|
39 |
+ |
|
40 |
+* 💰 The only ongoing cost is about $1 per month (depending on the country) for a phone number. No contracts. |
|
41 |
+ |
|
42 |
+* 💸 Low per minute prices: if Asterisk is used, you can make calls within the US starting from $0.0050 per minute and receive calls with $0.0075 per minute or less (Telnyx), or $0.0060 per minute for outgoing calls and $0 for incoming calls (Localphone). If SIP Trip Phone is connected directly to Telnyx, you can make and receive phone calls with $0.0020 per minute in the US. |
|
43 |
+ |
|
44 |
+We have no affiliation with Telnyx, Localphone, Twilio, Flowroute or Vonage. |
|
45 |
+ |
|
46 |
+### Documentation |
|
47 |
+ |
|
48 |
+* [Admin documentation](https://www.doublebastion.com/install-nextcloud/#install-sip-trip-phone) |
|
49 |
+ |
|
50 |
+### Donations |
|
51 |
+ |
|
52 |
+* 🎁 [Donate](https://www.doublebastion.com/donations/) |
|
53 |
+ |
|
54 |
+ ]]></description> |
|
55 |
+ <version>1.1.2</version> |
|
56 |
+ <licence>AGPL</licence> |
|
57 |
+ <author homepage="https://www.doublebastion.com">Double Bastion LLC</author> |
|
58 |
+ <namespace>SIPTripPhone</namespace> |
|
59 |
+ <documentation> |
|
60 |
+ <admin>https://www.doublebastion.com/install-nextcloud/#install-sip-trip-phone</admin> |
|
61 |
+ </documentation> |
|
62 |
+ <category>office</category> |
|
63 |
+ <category>organization</category> |
|
64 |
+ |
|
65 |
+ <website>https://www.doublebastion.com/sip-trip-phone/</website> |
|
66 |
+ <bugs>https://git.doublebastion.com/sip-trip-phone/issues/develop</bugs> |
|
67 |
+ <repository>https://git.doublebastion.com/sip-trip-phone/develop/</repository> |
|
68 |
+ |
|
69 |
+ <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_keypad.png</screenshot> |
|
70 |
+ <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_making_calls.png</screenshot> |
|
71 |
+ <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_holding.png</screenshot> |
|
72 |
+ |
|
73 |
+ <dependencies> |
|
74 |
+ <nextcloud min-version="26" max-version="28" /> |
|
75 |
+ </dependencies> |
|
76 |
+ |
|
77 |
+ <navigations> |
|
78 |
+ <navigation> |
|
79 |
+ <name>SIP Trip Phone</name> |
|
80 |
+ <route>sip_trip_phone.page.index</route> |
|
81 |
+ <order>101</order> |
|
82 |
+ <icon>sip_trip_phone.svg</icon> |
|
83 |
+ </navigation> |
|
84 |
+ </navigations> |
|
85 |
+ |
|
86 |
+ <settings> |
|
87 |
+ <personal>OCA\SIPTripPhone\Settings\Personal</personal> |
|
88 |
+ <personal-section>OCA\SIPTripPhone\Settings\PersonalSection</personal-section> |
|
89 |
+ </settings> |
|
90 |
+</info> |
0 | 91 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,418 @@ |
1 |
+{ |
|
2 |
+ "hashes": { |
|
3 |
+ "CHANGELOG.txt": "963ffbf725c1a51de2de2b6788999ac08762c586d6b52078641e8b501cac66cb89743b23dd0780a5ed3d45a5d549cd59180c43efac159e65e76fd56daed2b694", |
|
4 |
+ "COPYING.txt": "a0a86214ea153fb07ff35ceec0848dd1703eae22de036a825efc8394e50f65e3044832f3b49cf7e45a39edc470bdf738abc36a3a78ca7df3a6e73c14eaef94a8", |
|
5 |
+ "Contributors.txt": "8ab4ea9b8c38e4d115af6ca08e8e27592198b763982bd166b67f38ee0b9f2b7e093cd58ce0927ae38ee3bc015b129add2ffeb3967288c804da493241bc67ba9b", |
|
6 |
+ "README.md": "ac1d715d0ea3fb8f65e5eff948cef2e727ca283c03ac7763c143eb898e78b63a6a3bb49f86e95dbc578bf7da6f40030702e62dcd565efe28b81727be3d732abd", |
|
7 |
+ "appinfo\/info.xml": "cd4d57faa7f5fc9dc4b3dec01ae0f17cbff5d1c84f933d14a5e55c47cf9267b399924a37b729b017286f067f7530d856789d0709468c232b3efe4070c5092800", |
|
8 |
+ "appinfo\/routes.php": "8dae8f6d5e152b052b28459a7c33fc31b4a6f4981af58028032630500c9d4d2bd31271de1627cae6f17eee827905ce33e7e2a95ea96b335b2324c838ed1a2286", |
|
9 |
+ "css\/style.css": "ca2da1bd8adc863ed1300e4ef42f9892c5ab795d3c39d751fb1b1d7a4b1c5456b22a8efe53fffda3e6aaba9c5007e1627364003ece75f61e5e9b484b125af20e", |
|
10 |
+ "fonts\/Apache_License_v2.0_Open_Sans.txt": "fdae7ed259455ca9fa45939e7f25cbb4de29831cda16d9151de25a5f6e9d9be43b053f4fd3b896026239fca77abce04f543d591c501ecf4ce18c854bc0a51660", |
|
11 |
+ "fonts\/Inter-Bold.woff": "f34ed611dc0ba6e7c0bf7242bad7c02e09f208bfbdd21d6649ebf9b41bc06696d8856707851944786c80c718df455e619caab170c70bfe97ba2043d651d4532e", |
|
12 |
+ "fonts\/Inter-Bold.woff2": "736b4aaf8a2de0c17fbd5396a338577227326f078ee0646072d851d328b58a8058989af8735ac073f935b05f291d9310797d95c963e5e3ff0ea61a87f21c9da5", |
|
13 |
+ "fonts\/Inter-BoldItalic.woff": "619e398d37249fae96ba0deb06fcf5dab215ba888740024287e2c8f1278b33273124cd5b9ea8f7525a17657566b72a1661b688ca670bc068ca6ddf466b7e7ffe", |
|
14 |
+ "fonts\/Inter-BoldItalic.woff2": "a24bdb558a9b26fbe7631d6cf90b8db8f5f0164c3c814a2971fb7d45e807b0856454893bbd0d5bd0d9f060689f2be5f5bb1b69e4bdea0293d1122e13ad28e96f", |
|
15 |
+ "fonts\/Inter-ExtraBold.woff": "d527e43747abed5a13d49a70c8db7ef39aab35ab0accfe1e3f6e037f685e08d2e5f7552b40c75d4faecc0e7e1227e97c563af093afefb57f2b6be9c783a85b0e", |
|
16 |
+ "fonts\/Inter-ExtraBold.woff2": "20a22b0255b2bdc8f30ca7d59f20b3e2dfcbeaa39f035ccbeff40b57ad77d616dee1c41eebe30e1fab53fbb7ab4cc9f842cd13539ef34a680f6dd43441a3f2f6", |
|
17 |
+ "fonts\/Inter-ExtraBoldItalic.woff": "6fc1da8183d8b131d670ff5a89593967e4666436b37fcf08c4d99d8532654558f281bb8c20c92be8c5e3d6b34e05c7aad182f4c9a413f8bb1c11ef600b3c524b", |
|
18 |
+ "fonts\/Inter-ExtraBoldItalic.woff2": "3a8c4a113a4308ac9a57e7ad75060e0f08a1dd8638c29c1190f86929363b755ed2de66e4c11d3164a0a1fb1e6e35865bf786a295d3e0ad561c4a94cc8cbec6db", |
|
19 |
+ "fonts\/Inter-Italic.woff": "72defeb5040f6375683dba41d4ce43654fdbae4f64aea88b01feb023b3e894c278c8a8c7e5583b6d83d980495ca0d5afa5ec7e1bfcc731be08d3dbe1b8b3f348", |
|
20 |
+ "fonts\/Inter-Italic.woff2": "b128da83c81fe4a28026dc0a2a75c7920f37d4e04d6d6bde4e60b3a9527dbff04ff0ebc8b300874db9bd90036a41a52f4c9d82eb2f78fb8e99a35bb04defa1c2", |
|
21 |
+ "fonts\/Inter-Medium.woff": "1f7c25aeb1ed534a106254fdba6bf59dfa03542f813489dca31fe067e2a22ab9549babb48af4cd465ab3ef0ef2f4b0f46532efcc8aae8942ad2cf98d0a5a4a3f", |
|
22 |
+ "fonts\/Inter-Medium.woff2": "ce94d1a0cea81d42546ebc0247403b02c6fae24d3afba618cf658436734557a8b2b8ebed54319a9f66b233bd224da3685f848470866de63a144c8c28070491d4", |
|
23 |
+ "fonts\/Inter-MediumItalic.woff": "7b7bef9c7a7717c6d52d619059e5ec258b537f538ada38325c2c7bfa4968ff53109bc9ee17a57819ef37d0a145a973f4a7c8e4d8d09e71d3faa4d0fe14cbf487", |
|
24 |
+ "fonts\/Inter-MediumItalic.woff2": "4a2c5dc8c2ece82489e63b16cd8b1536b8f5502cf8f93307b0c71c6d54594a28ec2a80b8e58dfbbcc1d38a51aa8dd6d6fa025aed2cdc1429a462745a2bf2d414", |
|
25 |
+ "fonts\/Inter-Regular.woff": "e37409956d19653617af32af2f99f4038c815a3664f2dcb2fef5e6a1a7345c78aaac3badc2ae499b1423514076ad676ab4bd5d936ef9d159899a6f668d991e4c", |
|
26 |
+ "fonts\/Inter-Regular.woff2": "731924aedf31d6ef8fcd57a3b74182331ec7ba743d64033d8912d350ba98fd5b1942decaa4268f4dc925be2ed711c71a77200b2497bec10cae499b452fb27138", |
|
27 |
+ "fonts\/Inter-SemiBold.woff": "684602b1f45bf7a9ca5ea6b1aca2cc2046e07ac79eb63b920099463f25866f50cca77ca253f16078d3a6e781ca23b964a69c87389621fa101d5cfffdb292d132", |
|
28 |
+ "fonts\/Inter-SemiBold.woff2": "12b7680eccc54f56f800ac3ea4eff0490f515911d0fc83f99f62fa0f72d848155c8a7186918301a372d0fd0238d8093109c7b9b3c05168058e3cb47b1f7216ae", |
|
29 |
+ "fonts\/Inter-SemiBoldItalic.woff": "9623d9c91148b651b7d4a642751e4f9eaeda68b6f4c33355d0173e303252039b3bcd301556a1d8451ffbd36d7996c1e8fc5ca1276884636cf57468e38c9e442a", |
|
30 |
+ "fonts\/Inter-SemiBoldItalic.woff2": "97b7d8ab268ebcbc00876bd69ca9cc7cf2ae9ba5a6a30c13e3412e41a88f1f5ed758a6d9abbab3a14359943a003b14307cbc379bb11505c014b002322fd53c6e", |
|
31 |
+ "fonts\/SIL_Open_Font_License_v1.1_Inter.txt": "073e141d4e45a3adfd2cb569db6a4fd217b1721dd6aeab8159e36940b984df5ebdc345deb0eb6be65367f943e516a12dff41eb1238a322d248ca3478c50ef9b6", |
|
32 |
+ "fonts\/opensans-bold.woff": "d094832745611e047ffa87fdb21bac41befabdb07aecade483d4dc5a5b97bad00f1d4a5dca2a615789cd494791f0ab4209be537eb4b1bc7cbee7c42eb5e201dc", |
|
33 |
+ "fonts\/opensans-bold.woff2": "096abb618c9ce1a534f0198aeea53c6d1138000f98b883131ab49ee48b80b483af635f0196ac40a1c1bde679f63b3c3b907b8f9b0102a752862d623dd22393a5", |
|
34 |
+ "fonts\/opensans-bolditalic.woff": "c80f105a10d37c812f5d1b29445cd21cbc95594f71d9c5fc1b3aeeb9985c5465ba017654f1453baefdc56cc27aa325b586d77323012073eb713ab8f88f08dab4", |
|
35 |
+ "fonts\/opensans-bolditalic.woff2": "38b99ebf320264d74a456fe590fc610580b003bc77a39d97ff42dec41353a8f908d6f680b4777cdb34ed544d9b4ed20dce8c418317de1d721e25ab670f49fc1d", |
|
36 |
+ "fonts\/opensans-extrabold.woff": "6636a395ba345853ada2237b8e1f81c52e54bfb65559cbcb8de143cac00232f20cf34c764c9c4d4b80e82dae79cba3064ebdf22999cce8839df2d5709ee64092", |
|
37 |
+ "fonts\/opensans-extrabold.woff2": "758c90eb07c6db7e78cb703ea285f82b443ca2cfab792328a3f8c14acc1f932ae79ec2987b8b94bf19b3cc16fae31c76f3164c9437a2591283fb1592e40ec33d", |
|
38 |
+ "fonts\/opensans-extrabolditalic.woff": "ab1966f1ab3bb436e489c2d6ee562cf22d05b6b8c9bbca17e903518311aa45659efc329255e08ab597e2b8effe3bda602a7fb56b7d0c1d872b69337537d49dff", |
|
39 |
+ "fonts\/opensans-extrabolditalic.woff2": "2132d6309969f868521f2d788b991bc9bcf3239f1768db9a2b90faf8838c35efea85225b24db256f54c86d0a7915ecd50a7f5348e6ab040e0f172ba7510598cd", |
|
40 |
+ "fonts\/opensans-italic.woff": "a9751e7ac7a3c3d9f739d1fe00730a545b68e4a6473beafee8edf583f175b34fd5e0b60a14ec3707c8691fdbebea17e191c51707f50a21281e76be46f55a1140", |
|
41 |
+ "fonts\/opensans-italic.woff2": "7a80c01d34562e2fe248a71078ffa9413c04c9c320d27acb0bce96cc295101eb9e80a25e97dab3e67c184c40937862be820581441aa4100bd512a26ef2d523cf", |
|
42 |
+ "fonts\/opensans-light.woff": "cca2c5d207e0935c1848e22965972cb6feea39aa93b1b546051cfabe5ab16e909934d007a7ccd174eda1e7671d838f477890dedcb93d68ba722eda39a16d0bb8", |
|
43 |
+ "fonts\/opensans-light.woff2": "cdc332de1b13eb0f05cc9dd1ebc905fa5ce948eab71e2fdb1bc538ad54a0de980bf83352090becd650af9c101ec9a6898d2e4798e4fb777e41c20fae85fd568b", |
|
44 |
+ "fonts\/opensans-lightitalic.woff": "26e7759869088d8abba380f0bb22bbb9fdf0a985c0999519390cbd85099e3f48864d866f4639a8ff1992e7c81c755b0bbf66f525d4d38a929067886e9b54eb88", |
|
45 |
+ "fonts\/opensans-lightitalic.woff2": "b7f80b69abeca9d0369f5d46da192e98a6329cf1f948c897fb7130e0d815f73e293c37f0e6d0047273fe3f13a19e648d1bd06cfa2fac2142ec38ac244e7f0940", |
|
46 |
+ "fonts\/opensans-regular.woff": "3a526ba177f8f16ad95941c185411f350fab7e5202b9f56ea9c5f972c62912781d66da10e278e065cc6748a4bc9ab9182d68b27eaf380131c602195148e4b8b4", |
|
47 |
+ "fonts\/opensans-regular.woff2": "66b3e915b891f7b37b441ee18e40f01274fe19f2515470760e503f428fc1c524ccfbe832191978c2c5f6bc4b7ef46937e4f77f5457b6efbf878c97c054cb45f2", |
|
48 |
+ "fonts\/opensans-semibold.woff": "173f703ab767d0fcff014dac2fa3dcac787ffd0eb39f0c532b6679935c0105daacfa6a32bca97de13e420e10194b701ad2487bfd35d28807563ebf0b16d0ca35", |
|
49 |
+ "fonts\/opensans-semibold.woff2": "75068ba76befc2356fe83b198bf6da70e177e53cc3128af09d0d9f69dfe538013f2828b2363c6f533fcaca4d4b2a5ec5159b5eb6f288504ac73d33ac5d1d2c4d", |
|
50 |
+ "fonts\/opensans-semibolditalic.woff": "9e1e965095991d4a12a0658fa22a116b043ce20fd5f73bb9655d870ae49c46170cec52827510be323332b535002eb96445f79c3d1e4dd0550ff622fda0465f1d", |
|
51 |
+ "fonts\/opensans-semibolditalic.woff2": "d7e43f05802e26f4cb80ab6a492b01c398c5b41168c7f61356ca3ffc5f4fccabae5ba332956f0aecad69ccabb6b7526efbc0395552cc5d68e47bec00bc660ad7", |
|
52 |
+ "img\/app-dark.svg": "e56b38a7738e4a6f8700be79918e732dacbd00a027bb9c4d4dea132731d5a7011951423861486d55b01b4b153d7b72d83028dbd1aef5645091e270d3c6418781", |
|
53 |
+ "img\/app.svg": "b280f77152cd2cbfdb075d0550aeeebb9df34b8fe9e4fa371f7d42bf53fea7afb24da9e5112c7e3b3c9ef868ad361b5456b57979825c332f66434e46acfeebbd", |
|
54 |
+ "img\/sip_trip_phone-dark.svg": "e56b38a7738e4a6f8700be79918e732dacbd00a027bb9c4d4dea132731d5a7011951423861486d55b01b4b153d7b72d83028dbd1aef5645091e270d3c6418781", |
|
55 |
+ "img\/sip_trip_phone.svg": "b280f77152cd2cbfdb075d0550aeeebb9df34b8fe9e4fa371f7d42bf53fea7afb24da9e5112c7e3b3c9ef868ad361b5456b57979825c332f66434e46acfeebbd", |
|
56 |
+ "img\/sip_trip_phone_calling.png": "982286e21f6c8645bf4b2f492509b80b169c1a499b6b45c9d652a70443e4b6d40f622d15df4f119b6583e474c76adb3d3fa5ed582db76c6e4885548e97c72700", |
|
57 |
+ "img\/sip_trip_phone_dialpad.png": "17e342ef7ed3baf181191c4ab8d3eeb76a29d8f107ace3358dfe63d4fa546a042017dcb51ee1eaf220967a1951c4ca19e66b840d9c85b68e49ef55fde4ea6c33", |
|
58 |
+ "img\/sip_trip_phone_grey.svg": "5524c9e00c015d023d7a9d8f3427eddb5d94b88551d140528487eea84c6c62b905ce12b53824397f878d214e6911c7fea8ebbc4bff64ef275d443239e70b2767", |
|
59 |
+ "img\/sip_trip_phone_hold.png": "5da0e2dd8a9e7b3282f1bbbec5d0d922fe266f78bca26a2185430c0db540bbf64a3865bb73b081affcb54f3b8ac1f12ac152c9c824f88cd7327af6ffde5f2d09", |
|
60 |
+ "img\/sip_trip_phone_holding.png": "27814b9ba86f0609ca0d5eb43e40c709ccfe87811dc7848306c2d56a3aef001aca9b36ab50e85f6706961db2b4c339c17a7d526b5004398fac49b98550a8f34c", |
|
61 |
+ "img\/sip_trip_phone_initial_screen.png": "b91d7bbbb049934069603fb5d53332f3e38f3ab10bd104dc2ef4271c07d21d4094fa86c9c0e7732288814e654783fe2bcfb53710707c5073b52a4b5c3aa52733", |
|
62 |
+ "img\/sip_trip_phone_keypad.png": "8dd5ee8c1c15e0f06257e6ae9019c1e260a254f7287b7377ca49909a69c2b06dba87acb10de7f7a487364b59d0aa5a50e67737da90326bd64863546d16d3d3df", |
|
63 |
+ "img\/sip_trip_phone_logo.png": "3309a656543c4fcec77de1356c88f834cc244d423767c5ebe2f8b90b27b738bc426f3cc0e9141220e37c51e4a15791743539b694ce6826b97ee929b8d8e9a098", |
|
64 |
+ "img\/sip_trip_phone_making_calls.png": "c564e4dd1d8e11579081fae42cad3ac0d94d95e8c28c484e04fb4d4c44ec2810ea7fadc403371e8809d7c219343757787a6fcc4bc50892191fa86a1505e9a0ae", |
|
65 |
+ "js\/launchphone.js": "b142f1f86fa0196480b9907f07a3f8b786a3b61293d111bc0d1b6fe6f37abe217fe88b2076326f048915c30cc55293f75cc5ce34ffa55ab6b15690530fdd8ff1", |
|
66 |
+ "js\/settings.js": "263f0b86f8170cb07b0439a9e5a21a562bab81c83cb31572bf92528c113771938aab06c063f5d12cd64105a998d06daa276220510a4a1d6f15ca9971e1f60fe7", |
|
67 |
+ "l10n\/en_GB.js": "928d01c11d7ea9d191e83b4d1797fa6c9076d3e7ea8444c324a7c903b36db3ba132a088519d82dbdb002e8e6f0dabe4c7d0bf02a7a5ce175d95fbf8cc5626f13", |
|
68 |
+ "l10n\/en_GB.json": "a5b2e75415de54aa6da74ef78232bbce9d3027d79e7286ce00596bd22fa8ec25b44b0df12e8e34f68aceb592237e4aea84a81db6cd74df9719f249dfb9534d69", |
|
69 |
+ "l10n\/en_US.js": "928d01c11d7ea9d191e83b4d1797fa6c9076d3e7ea8444c324a7c903b36db3ba132a088519d82dbdb002e8e6f0dabe4c7d0bf02a7a5ce175d95fbf8cc5626f13", |
|
70 |
+ "l10n\/en_US.json": "a5b2e75415de54aa6da74ef78232bbce9d3027d79e7286ce00596bd22fa8ec25b44b0df12e8e34f68aceb592237e4aea84a81db6cd74df9719f249dfb9534d69", |
|
71 |
+ "lib\/AppConfig.php": "e0279b17c389a2ba883c07800f43326efc427d96dd6d4e123e14b0bcd4dd4dcc521af3c2fa1673c7fe68ee915a34222dead68f266ca34db1c864216c24134c39", |
|
72 |
+ "lib\/AppInfo\/Application.php": "a80c8968ac1af43642ca5131a3119be96fc85f222094f8b8ec638f752b5db75296472a71ffba716eabbb9bb2a0054fd984ff1ae53cc72ba0761ecb64eb8f84cf", |
|
73 |
+ "lib\/Controller\/PageController.php": "0d32eed8d4cf98d33a7501a5aa7cb8a5921d3a8a98bed952ed9c18d26b154286de383a6d447d998be985848d9fbdc10fdaecb30dd01e3ecd463e75291a5f9418", |
|
74 |
+ "lib\/Controller\/SphoneController.php": "eba1663a36c493db1abb99084dec80773f907f474ff12f4dc330b2f3374567617d7367c71b6f8b7a2d0f1e8f8d22977cbeb8fe06576a6831ef1a2825d6347776", |
|
75 |
+ "lib\/Migration\/Version100Date20211106173528.php": "2d81e8fd03611db1017c08d90325a680928cfd367701e479d8c765b8967645cf9ae27725f657d655615f5a878307edb87b3d2a0bb460161e14de85d498798ce8", |
|
76 |
+ "lib\/Migration\/Version112Date20240108213517.php": "6a535855e4eeeaa63b62ec1b97d9484f727c0aa08f16a4eb65888f0d133d93498e20adc4d1942572924d553af425a8632a94bbde8d3101a28b07c9301d6b43ba", |
|
77 |
+ "lib\/Service\/SphoneService.php": "872446a48ba6d64c7e85d2bca63ec764691c1cf081b1db0f2741c38ef30975dafb11ede10dcb106fc77e27709b35847ac26bb2defa36a00741826ede1787fe95", |
|
78 |
+ "lib\/Settings\/Personal.php": "d031350a9e5c1b0e78fff57b672304660485b9b307c28eb8a2dc7a3782c6329cb3fc659041d331b97711485a92d10bd99d739a17eaec088f7837d2be786500a6", |
|
79 |
+ "lib\/Settings\/PersonalSection.php": "b2104766a5df419eed6811630c2d2de6b817f4b0ca77b5ca018344901cb8db0cefc8c78d4f45b14f4b5129aa986ae583b69c78d50cd91f8502508dd8724d3edb", |
|
80 |
+ "phone\/css\/bootstrap.min.css": "b82d1fb15e8eec863133d7491103e86bb1cb67442509bd141f2c2730dc237c351d3a10bd4e9633ea208c39a98b6a508769c7c448aed809bee43a83e10361c402", |
|
81 |
+ "phone\/css\/ctxSip.css": "367b363212b878453b6b825f249a9adf9c101a9d4a15a0768f9f50ba9f135d11587239c3615da1649086c395a9a3ce325d8e563b6ed2fb6f1e990bdf4a880820", |
|
82 |
+ "phone\/css\/ctxSip.less": "9b53e079978d5a672827cadd1b1f9ca63c69af22a77e52fb12318cf445a96ac2f537c797f64f4d2bfd673bd4c1b15d22de9e9ee226add5ca443db36a6fc24905", |
|
83 |
+ "phone\/css\/font-awesome-4.7.0\/.gitignore": "c3621f6be50311134e6d7a1d34a9638f747f4074c48527dc7975957d6c87b9cb36b64bf8385fb1a59b52a281f1e72ac3f1c268dba6d09ac951e0f4618bded3d8", |
|
84 |
+ "phone\/css\/font-awesome-4.7.0\/.npmignore": "6de3301556255638c616eab313a3d8ee5c704b1aa5b57a5d85e5723cb3b810a1ebcc148c33dde5c4989a691f18f8a2ace97c40df2e9c4306b840a4823587ee2e", |
|
85 |
+ "phone\/css\/font-awesome-4.7.0\/CONTRIBUTING.md": "4576f4a2b8070a422891412d123025245fc3ae5511de09e153a1924aafa5d8d8de65fc530db79426055e21996ee9ef1bef22a192f46cca3bb94894d0d54d6ecf", |
|
86 |
+ "phone\/css\/font-awesome-4.7.0\/Gemfile": "2add4715a7f520d0bbce11062202f6d1072efe569207c801f9ded213e8d3b2d0f879071c39aa117839e5e3a73780b1081e18dbec2ac79b6b4756deb4a8a4186a", |
|
87 |
+ "phone\/css\/font-awesome-4.7.0\/Gemfile.lock": "1daf45ff9728c007cec63dbafeafc394322273e3620f911769b230de8408b71838429c86f45324885db7029cb4661a5dd6057e3e6961a98ee08d87e7601b85ab", |
|
88 |
+ "phone\/css\/font-awesome-4.7.0\/HELP-US-OUT.txt": "f0ebc1e7ec38a8cd333b34e2deebb416ffab31f3cd707f27e310beff328e5e05962a023da606c62559c8b606f7138b90896ee304fd45e86afdd2910ac8cdda57", |
|
89 |
+ "phone\/css\/font-awesome-4.7.0\/LICENSE": "1a7a0986aaed249087bd3a01cbda0361cddecd4ac0e4da9d7095f6193b4dccc559d570789b0a4ca2606f2ef137f2c4174cef735a8535371ce7e3a55625dfa801", |
|
90 |
+ "phone\/css\/font-awesome-4.7.0\/README.md": "34655fd4be9d98ed1d419c98372cbfa58684382fda11936fbda3f6b39894cbe9fe429b6ec3346315cca309c2d07648064d0554d1e241c6ef9df57e6fcf758ca1", |
|
91 |
+ "phone\/css\/font-awesome-4.7.0\/_config.yml": "883821543b8f3d2ea37e88186afe841c085fedb3b7ccaea49757af224b0dac02ac9eb5b8d7ce1648cb57fff434936313315c308ba624941f5f5c0b1fce083d64", |
|
92 |
+ "phone\/css\/font-awesome-4.7.0\/bower.json": "5407ebc1f339b0ccc665e1fe5edc8c92bce01fcd0f5c3be302f407bec80a315a0612ffb2b71a93bd0e19a1fc1eb34095a02bf0aec659b08411fcffa3d289b7e2", |
|
93 |
+ "phone\/css\/font-awesome-4.7.0\/component.json": "12fcbaa3f72f707f433aaa532774497453d447e3402f4afb1c27e8ea9b3cf98108229292af312aa434722e9b50b2da115b2392b82f41b19144d6dd2ea183d659", |
|
94 |
+ "phone\/css\/font-awesome-4.7.0\/composer.json": "566b0aa11e55c98698c1f23b92bd05cd583c5448a3c4a33582f05a19325e26b91f82138822d0ea2b1397491add3e4b79d2682acc7dad6beab24fd1621c3d27fb", |
|
95 |
+ "phone\/css\/font-awesome-4.7.0\/css\/font-awesome.css": "e40f27c1d30e5ab4b3db47c3b2373381489d50147c9623d853e5b299364fd65998f46e8e73b1e566fd79e97aa7b20354cd3c8c79f15372c147fed9c913ffb106", |
|
96 |
+ "phone\/css\/font-awesome-4.7.0\/css\/font-awesome.css.map": "fc6df90f77e3ab265e3f19c2d6ccc27c49d5ab94cb956a2de3e16edfb3f59a3e1f9df3182474925704412ea056bc0acfd70f8f599c9fabefb48b43355a1e29cc", |
|
97 |
+ "phone\/css\/font-awesome-4.7.0\/css\/font-awesome.min.css": "49f4e24e55fa924faa8ad7debe5ffb2e26d439e25696df6b6f20e7f766b50ea58ec3dbd61b6305a1acacd2c80e6e659accee4140f885b9c9e71008e9001fbf4b", |
|
98 |
+ "phone\/css\/font-awesome-4.7.0\/fonts\/FontAwesome.otf": "a3acaaac3a9861ac7a4ba23e52b9115d39b674cb685b45454fb4b80329a4f7370b5ea7dd8b41d630798f8a54082b62411fd63332752296dbf5f2b3b96abb8874", |
|
99 |
+ "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.eot": "c160d3d77e67eff986043461693b2a831e1175f579490d7f0b411005ea81bd4f5850ff534f6721b727c002973f3f9027ea960fac4317d37db1d4cb53ec9d343a", |
|
100 |
+ "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.svg": "4f575d52331de91a2e32cc3408dd0eaf0cf25b7244d34b226314e3647e85ce284f86e3b7238c6c8b9022dc4e2787bf51620849290cdcd5d4c4bc905f289d2156", |
|
101 |
+ "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.ttf": "9ffb91e68c975172848b4bba25284678cc2c6eb4fb2d42000aa871c36656c4cebc28bf83c94df9afdfbf2407c01fe6b554c660b9b5c11af27c35acadfe6136ac", |
|
102 |
+ "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.woff": "9c776dea55a01fd854ea23b3463d9ac716077d406ecbe8ed0c9b6120ff7e60357f0521ab3e3bf9d4e17ca2c44a5d63ee58a4e7a37a3d3f26415a98d11c99e04f", |
|
103 |
+ "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.woff2": "838fefdbc14901f41edf995a78fdac55764cd4912ccb734b8bea4909194582904d8f2afdf2b6c428667912ce4d65681a1044d045d1bc6de2b14113f0315fc892", |
|
104 |
+ "phone\/css\/font-awesome-4.7.0\/less\/animated.less": "285de8b339ae691c8c95230462b8760949850ecbd1a4f8b98b0f85347f1187ca7727507a50ba7ee362b57b1ccc94efe57fa99bb501bbea93561ca3104f73084c", |
|
105 |
+ "phone\/css\/font-awesome-4.7.0\/less\/bordered-pulled.less": "666a33697b525aa25d773c94360b96dd6ff833dedf99178af931b040aa93239c5814bfdd433a841d77c2a3addcc444d7ec95c83073b9d30e48ed5fff4e82a111", |
|
106 |
+ "phone\/css\/font-awesome-4.7.0\/less\/core.less": "88b310200bdd13129f343e8f9b581e3a376fd5aec4c7a604815101774d31ca3fb469d345321aee80303842309b10273885195545f69fb81ea13215e751ef5187", |
|
107 |
+ "phone\/css\/font-awesome-4.7.0\/less\/fixed-width.less": "b7bf0de65815043012e95e8b1bac895e85c9a07c047c99ba4f5c132a00ace5aeb3e838f2aac26d8451b38d193fde8199c45d58a2a79931e5bdbda47f15c8822d", |
|
108 |
+ "phone\/css\/font-awesome-4.7.0\/less\/font-awesome.less": "f5cf809023468a015234142efd754543054f9fabcf06ecb58db792537b8526c5d73098cb059e6e37ddf295895e92ace9005e9c4e5eaab19d33f06ac478c69acf", |
|
109 |
+ "phone\/css\/font-awesome-4.7.0\/less\/icons.less": "8735bbdc8c7c9d082c2a1f261c74bed575fa096ba8775ad48ada6894f03a8319414db099395e80f16f6e89d802c988c1a2bbf73252c65acb040c35d40b9ed0f5", |
|
110 |
+ "phone\/css\/font-awesome-4.7.0\/less\/larger.less": "5ba01d3b3c917dfcc0bf20a283397e677d420addb83c74d29f81d77658105c8d9e48784d2e8f5214919877141056a74f06d3081fa291269f92c4506ac089a745", |
|
111 |
+ "phone\/css\/font-awesome-4.7.0\/less\/list.less": "a13c48c3ab87469b5e720287f5f1720f0588bb45a0700968879cbba7ba008d070cdcd69b41d374cb504311c0a20bc4e727872855ae5e90fc76b1589104acc07f", |
|
112 |
+ "phone\/css\/font-awesome-4.7.0\/less\/mixins.less": "9fba58dc30953169340a57fcda1b3dcccbe69cb9ee5ad3e29e53719fb185f4b49f9571be248675d5cf5d82f86482086df022283b31b1766090f9954755f7a47f", |
|
113 |
+ "phone\/css\/font-awesome-4.7.0\/less\/path.less": "2214dadd8025d0da912ee4e0366a25b6d521f61ad04cd61c0b13140a9465d7711db8a80e3c83bc5410624eeef8bb2dbd1aba48cc3fa39b75d5eb5e91afbb7ba7", |
|
114 |
+ "phone\/css\/font-awesome-4.7.0\/less\/rotated-flipped.less": "a906cde529bac0abc118201866c6e81ceed53ea5859795ebe87e52e1d04f1c32b0ae1dc2a9297e2d6a2cc44a7bbfcdccd01ead571198027430b98190ce5efa67", |
|
115 |
+ "phone\/css\/font-awesome-4.7.0\/less\/screen-reader.less": "7d5c0d28b78b9c24b6af0181f8bf72d1b7bf20c45edbf1594da8b4c8391dd24920b9d0ad186ada7217755cbbabb9bf6ea52acd8ed39f7c9abf4659339eb70504", |
|
116 |
+ "phone\/css\/font-awesome-4.7.0\/less\/stacked.less": "0f07e1507d430c8ade9cbf2460c8148d69fdce6b5b7c659247953e0e0235c5128cec1cd1a329790b9bfa42967cbafd36776d81f6e4ff80520149f8ff4a6ba629", |
|
117 |
+ "phone\/css\/font-awesome-4.7.0\/less\/variables.less": "1691b468571a87081a892621941b3f0f954a3c5a4c588811b329e092bae28a8946f4e0ed5c440c7bd4248d3aa31c3be26867d28771703cbca41cedf5f3f3fc72", |
|
118 |
+ "phone\/css\/font-awesome-4.7.0\/package.json": "e66e530ac7b2d050bf954b40ea6af7c20296e7613dae6028c76a12dc6e0ddc92cc89dc565ccfac27d529c7c4f2aa938b52cf3c7a5ca04c86ab6c52fcb9d9c2e3", |
|
119 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_animated.scss": "5d8be64ce5136d02dcc2dc38341491c2cafca5633a8bbcf6bc6931da2ec95e2e29ffddd8a058842da4764620824914f7c7c7048a6c9e54d3e97bd7ab995834f5", |
|
120 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_bordered-pulled.scss": "01095953afd37d399f8715168a67a2e60c23623f3ead4eb4360f8800e30cb9572ee5d90b48ab4d0e07271f75b11da2d4a4cc39115a872e2f001000cfb46a8bea", |
|
121 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_core.scss": "78b807ddc8ac17eebfd4f59eb923a7f8bac8e7b76bc83985d593382b1964f1d98539af83c95c4aaf99e3e492304e08d452980879213fc13d9b9f69539f1f74c6", |
|
122 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_fixed-width.scss": "27392694f9bd1a671cd21517721a86c24725c51fcad4acaf09cb75a9e36bea34176af900c82e061eb0ee6b60a1bd0d9e99213119c5175c2f48b6800258ba840d", |
|
123 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_icons.scss": "b7f5aa12eb8cab73fd506d499f9c871b54d5939058b9ac27b858499f051d9af74a6374b2bc32eb2aecc169f9c2332cb2abd6b56b150d864df1d19ae153f16301", |
|
124 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_larger.scss": "ed6e63e7cdc9bae34810146c3dfd52b912f7b20219555994249f6f3dbd528673af58b69deecd9819f28f71713076c6694f6db0e31148e8e726f714312f404a73", |
|
125 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_list.scss": "d8b110a513c41ba8a00620143aa01b2bca59f21306b64e96cb82e4739ea88beddc0d3ba2679f277a34c89fa5cfa3d4b0f8ac5b16d9beccccae36b2f8450ef75b", |
|
126 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_mixins.scss": "da84a310d9322e8a4b5e0c739e93a5c66418930930eed7e4a14351b61aa6073465302552642c75553819fe2ea7903ece21b20494761a94daada05bd6fb2e48fe", |
|
127 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_path.scss": "9eaa7d29bb402c790bf1ad40ee849e26743d198bff3cfce0182c2320afd9d47f4377b2bfb147999a057604dcfed33e408065577a516be0f3623fc0df75120912", |
|
128 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_rotated-flipped.scss": "89a2a4009628540c88c9375c7f04bade6bb9b901575c12fe22d0031c10011f4c5c3b7834d4caf6b1cfb84501a5a77d5c4e6cebc9a8ff92c8bc6c82ec6bfed40f", |
|
129 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_screen-reader.scss": "5e3c8df5f64a9ddd9c7dad6f939156090e832a43c4352f7f470169ba22133267931f53100da2a4f4ec5e5528734c5d60c42ebc64fae6a5ee1dbc2e920dc343c9", |
|
130 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_stacked.scss": "25492b5ff68a6d2c8f9ddcebbea75b1f14a7f47d599bea5d75e1f5fabdb5e3d43147e6df2c435c7ea639c094811872e53941ccb79f204026b6fe2cae172df7ac", |
|
131 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/_variables.scss": "77079c62eb1459ecc6e763e863f02f5faf9289b333cb43b2402bbf822837dba4d6af22d97fcdac68e252cba9758a91386483733ccf690c3d4eb5f1d109794f29", |
|
132 |
+ "phone\/css\/font-awesome-4.7.0\/scss\/font-awesome.scss": "e5cd637954db11cc3e86af92ec127847c7476c22dd1e165c56a2816733368f02edff7fb54679ca77574f8fd86778528b6ff51ae0a39701e09b310a84b877580a", |
|
133 |
+ "phone\/css\/font-awesome-4.7.0\/src\/CNAME": "060fe8853f4156b0fc81b945c6a3c98f0259e9a32adf02967a1c03e76bfd3bbb918364d208a411ab86299fc0719034750956f8fcc98286bcc3cdcb65314474a8", |
|
134 |
+ "phone\/css\/font-awesome-4.7.0\/src\/Makefile": "88682614a1f8b34219819161e3fe03f8ee575afc05d0a883ab78cd8a772a7e6fbdc13ba4e4bb4a9d2f98e32772ddd2958e072b817e9ba195ee66c68087225eba", |
|
135 |
+ "phone\/css\/font-awesome-4.7.0\/src\/README.md-nobuild": "05eade6bc17a7ab940d65e656c1f4d88656e15137ce90a64b3220c1b74cac41d27cd1764c63a6bcd5d8c43a17aced01d782ff4b714f559d18378c78a518182aa", |
|
136 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/accessibility-facdn.html": "feff45586c2e4dec12c1d766b7a8cc815174a56b37567da96d62c04e15c072c902c70713b6f06fce9cc1eb2b4bf0fe44f2dd7b3b630e6cb3006e98e819cd54e2", |
|
137 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/accessibility-manual.html": "c521d6c66a661530f5368c9cd7d191caa9cb791060f678cd44b79201196ce86827babc366e28a5cb311d9ec8929354354da0f3a04d3ac9e370441933bf57615b", |
|
138 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/background.html": "12ef24dab463fd60c8dba5799f069785be108dd5666bccc3ad551af680d7ed3f1ba5c87feb0a10e52efc415ac5cd9fc89bd314f26552e844b2441a61b6ab2de6", |
|
139 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/cta-cdn-ally.html": "d2cb6cec928638e10ad2aa93b7ea55b2184b9504edcca4e87ab20ebdca610a6edc45ee2360abdfb25956df207949cfd94d78206fb5eeba39c2d8fd9d1410952b", |
|
140 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/other.html": "b6ea9fd4eb72fe8b20f18449ca22c65eb72399c8b5c956b598401d95086a37e885883064a06e58a35f2fbb69a296c069f8ab2d3b033e2148e4663cf08542184f", |
|
141 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/ads\/carbon.html": "d6336f7613a75db891904471980c15e3b6d81ad014e13d6317eca29c7b5103166385e8959d3702e747ff83560e97920801d6a246772c617abc7811086a283aa2", |
|
142 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/brand-adblock-warning.html": "5477ecda666bdd618d7e68af4539187ee932dd29418699c0c0e69548b47d20ea98d289a9e3b691696891caa1a9095ab8252ed11425964d8db9df34641d44d62c", |
|
143 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/brand-license.html": "739eb68b48f8d4f555e02f7ef9ab1801aebf6cfad50325d20c63c9068dfca73d0dd27eb6ec4f4e96cb5224da8d8b8fceda4df088411d1022cdbde272e3ae03ff", |
|
144 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/code\/core.less": "4452c88a8b284dd090873896e0b46b86846f2a23dfc90fe69ae561404bc1417e085c6546ae99827196feaec49bfda147f2810359a1b692071ed2db64eb1561c6", |
|
145 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/code\/core.scss": "125638298cf58ddec200c8c58466fb568fcf76e3255f64737b59f9aab1ffc1c64a5f52082d3de4f80e88d25f3e34472107aa66c4bbd55e823df465db7e768ac4", |
|
146 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/code\/license.css": "4a92760c82226b27a683a3860fcddda105d657ed7282221e5008bd8e80b299cbee5387e45e86e18988291870f1ea980ff5733cf36676bf46fd633f92ddf6e638", |
|
147 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/getting-support.html": "fd3d2680d3ad916cedf632dcd2da0addd756fe939dd400c67168090dd6aa97ed067fd3ba4d4ab8919507a45040ff0a93899617542184691b812a899c84123b6a", |
|
148 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/project-milestones.html": "5ba81ec08a037967dbb218e04057f1cc9b03fd79d02b3baae67a07dda595727b8409749340949b4001409543a8fa184603eb788417353b22d8cfb24eb014b01a", |
|
149 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/reporting-bugs.html": "f6582dee7f90225b0047b480dfaa35362477740b29215366227f27d53ed2c43005c4d2b60dabec41b33a482d516f5a23c2b229408fc21b97063db704d96ad098", |
|
150 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/requesting-new-icons.html": "479e29dd3f3dd17083e8ac7320c1a3de111d69cc1db7f618c0003a494b89d0e744c718f70cdd41300a165bc5e0fb6b9758e8fd82564ae47406e6cd104d9b9b04", |
|
151 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/submitting-pull-requests.html": "d62ea8e1f09ef35627c9d4d0498ff514fb1c88ca4215ab72194fcc3a90aa7a4ada5d202399de9aca41f01a20e9dd674c254797f94a6a3b8380b2df1af463d9f5", |
|
152 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/accessible.html": "26fcba6f7236ecb034ed5575f02e7e7872878abee5d51444d06e8d976a80faaf017e9bd4aa43f2bc314759e5564c3030ee655ff8062d8aa551ec57060aae6cff", |
|
153 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/animated.html": "8d8c90d6dea5ac1e869fc1f6234db28f6aefc7b489f774ef8abe64bedd7e82c5ed6efec2d4a85b9ac0152f50273695a2f8688aab3d904a130f001d2ba1704a21", |
|
154 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/basic.html": "f5ab39675edf6375e893509f3cdc6721c50cc721229d2cd0bcb2437eddc644e02b9d1e714dc1c2d34e6675501e3c7b0469e454455d40c5a8e7aa1e83ae54d873", |
|
155 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/bootstrap.html": "611cb46b313ed9d3412cfe9279981937a6695268392a88cca6e4252fb84b7f9c63e244d70b650abc8e73fd4648254e04995a79c9f68a695e7b8373bdd2ea6786", |
|
156 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/bordered-pulled.html": "d97b2d4ca375122587565da7ad6a89cc761c1a01648140f6b003903280af01dd29ef23ea565849a62d892b9dd547a517a8028e2cd63a25fde89417b4476a049f", |
|
157 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/custom.html": "09e01e23c1941ffe88d5c047285621f41452ce960686f00b3415ffff482d41748f6729f734a44639acfb0e1a6f47bf6931e707cde1cbb059de6b9c4c8e0cecda", |
|
158 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/fixed-width.html": "fdc321a99a9570b65f3330f1e743e2a5a24f07d8759f45b811b00d2765aa7626e8c48fc316b5c040a4d847469c13873981d1098a378123632d288c787c9d74f1", |
|
159 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/larger.html": "d9d38540bed78cc038323acd638d96c764cb18765ce328f4fcea4282cf432013e7a15482a56db3be50a9a1150743d078d891fd01cc5945d48952547974338af5", |
|
160 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/list.html": "43ac890e702de4ee53d71a3f4ed18b66b5633e15ed8ece1f4039d1c3377a1d391051fb00b037f2e4a1f1c757d6cf615f069efe615b88aac1be4ee923b8b1d425", |
|
161 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/rotated-flipped.html": "9c4eb8ca3cdb2309f87ee0366a75631a6a311700091f4c8189d74bbc4a33e3003635ebccc8c9aaf0d0960284c088f490e61c2a51e79cfbac4a72cc2609f90880", |
|
162 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/stacked.html": "9bce1d2abd759645aac7c2f0fd54e55a34a2668882e337d89c8ee0bdea14bf790c0c03adc7f6ecc6d8e1cf13deabb8f9c90f0cbe4d44a867fae42f72d5a83711", |
|
163 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/footer.html": "00b38469e9dfbc25d4905c9e71965064f1dd11d868bf0983de1614f870309e2313fea222e4ed4206a71c07924cc45bf28f8c0fd6428d331a58df566cd6988b54", |
|
164 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/accessibility.html": "9b99cab0babf09aa30dd81d6bd675e43b7e8cba79e785d0dca3b7529dae910c2a96eb2c37a97e98610e2d9c5c2bcd84f85cdcf6ec22b72a81fa377edd529ca41", |
|
165 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/brand.html": "fdcf75c126f165963c273c164f14cb933760ed977d1b734e4843d4299ced9dff545bce672409818ab2dc8391fffee391e17d1a56c80d52b39bb92df8679139db", |
|
166 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/chart.html": "5d11f2d8367ee116fd85495a80a918d0bff70f641dfc4d7e6fed17e7e15496c04079bc8753b092fc3b50a19b5eff67c2790f7be8f49228a729bf4eddcfc892a1", |
|
167 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/currency.html": "66b4d159ad39c6c0a96ccddccfec84e1b12f654e5880464042378f3439ce8df3257a33ee1df55252fc214428b52685a425ba91792c52f28984436912bea6ad21", |
|
168 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/directional.html": "281f9c2e899998fee66e3d5aa1481451d23a2c2964e962506b04190cb84acdcf5e12e55d7a02e0a59793fbfdb78a5bd95203ac560441867ea49ae26c971d4060", |
|
169 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/file-type.html": "9db9fd23e94d311b5d6b9258b5efea167037f6fd9ae54c57e8cc6505cd92bb14edded5dfe614dd27327200832268d56084f3060e18f29066bf99c141ef20c109", |
|
170 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/form-control.html": "4a14aa9f08004d97cd7ef070c0e0423734bf71d1607bcd9d27f66f148876a3eeb355966e78207dad0e3da8ac1589df4bc6e1c6da661c2d1ae9c85d34fc77b254", |
|
171 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/gender.html": "76950be4360b1eb448c6a41cf6adf739f74b3c60254b3264356e3b71bcaf791dc048915adf8e1730b819316fdb5cf934446a121d5d5461a743e03b7e54103586", |
|
172 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/hand.html": "2ffce735b462f5b5c117c639f22be1a83de099589ffaf378355c448cb748d9a051280524c30224f7796bd317b74f201451765c5b37125440dc4db6aed420d8c6", |
|
173 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/medical.html": "171a709bfe146dd5ca49647b9acf81ebcf62ef0a27d6e1aa8859c3a00b25f05b867712df7bba53e2e87e33b46dbc0eae107b2e1f3de4eb5b82d7e8fc8443d818", |
|
174 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/new.html": "7d292287112e46c450034b08d51f4c1435782331e6049ec2fb5579ed9c56ccd6ed4c06b9f33b503a1d5e09160bc4c766df53eef6c1c0f90f95f2e7deefc9a628", |
|
175 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/payment.html": "d8169b40692ac8fa117ce16eb7f1f6bb1b6f39eeac5a4f6c1aefad2b5278f1cdaf773907ada1bc87953fac97b9874511eb1d163462491c95eb9dbbb7a27e113d", |
|
176 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/spinner.html": "2049127b24cc76076489d861ebad12207abf87c7b015ddadca72e66ae11a28068bd0d1cc9d28b245f236cbd72e0def6e90486cc1fd14c61442c57052a97cc956", |
|
177 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/text-editor.html": "d4a659a0d14329a5a21c2369c3d3bb3bed12c88b19b18aaaabc61c095245885ecd39db439d454de3b4f15e3ad4764b909e240e38df28ee3eb25fa92240bd8038", |
|
178 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/transportation.html": "4eb63448d28f9f6e13c3bfdadbec3b30f6985b17e3831d48e0ad15b3b1a6c41bb547bdb009b741d149f857cc191dae8f382b550aa6c8b8bad0a3c5088ba2581e", |
|
179 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/video-player.html": "4f3aa37ee53df679d1baaf01d803bbe1346313ff5c6d2932a34993afa0294f23b9b29cb8a3876bd94e7be14469b6f3f04d52393260b32e790ffce2ae38de3a41", |
|
180 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/web-application.html": "c430a80b58d49eefecf12236366f629d3091ba3d558a510d68a7ff7d5e4eb2d55d55c7fd781ec0e14422c7ae16775c6c90ef18f7059991b2285aa94e6630dddd", |
|
181 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/jumbotron-carousel.html": "a9af25e69e6e61a582917c86e34728a8205fce95f94e4ff9fca4a27af05b68750609b2a4e13fa8f728b71bdead30c182055f2a1d329e6cd679d6110fe674e7b3", |
|
182 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/jumbotron.html": "a9663212f87ba8e79d819fb4f896d0a8f53ab8ce57958a7c20e9587d03fdf499878f0121b7125a0bea012d21966bffd8cba3b0dd80ea4872bc590ee8aff9f5a9", |
|
183 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/modals\/download.html": "df2bc4bffe3ee6f3286b7925594b23bee5775cd933b5b102328676b0d9a0e052387aca2d9495f7748bc2a7b626d5e5c08ffa338c2d5766620e0631fd202572a7", |
|
184 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/modals\/fa5.html": "cd55e54afc79886bcc57f7cbaf0f100fcc41c26bb6a8a9c8a072ebec5d0c4c8feec90ea6e0e615e2fc6fc046c3b0dbdbfe66b31d3f9e1e08783e72e81b8c637d", |
|
185 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/navbar.html": "9e8779299c2d4d95380ad8fa355ba826043009d1a4cdb735e376cdf38afb89c553a9c436680b717c312a4cc0e25a6f9cceb9034c6a97495943788ffcba92633a", |
|
186 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/new-features.html": "b4c23f579f8fc506c8f6848a609c1a0c1c06c82deddb2f38b5b9a770e4d8df793d0cbe803b52287f01d3d46c6a143e106ee31cb32b8e985841ca5e4e16b20d5d", |
|
187 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/new-naming.html": "4b0e5128293de9fde103c9a8648b67ef1d261c9eee359fc019083675ee38f66d45756dcd26b41efb034ca819f5c9be532c8b0d2fa1efaa174958c961818030e3", |
|
188 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/new-upgrading.html": "a09270d8ed206b1a3a9b2415190148fbc1bbdda637fa032e7d17e0108c7e4ce4bbde2fc06595866029eac5c4904d6ae7b999b57870d6699a4b7ee2924bda80df", |
|
189 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/newsletter-subscribe.html": "9fb09338a1d452dae32c9cdebb4e8800b26b163b46a88942d526e6965a47e33aa2959ff7855940f47d3f46297d5f2b7d4d7b6d3197928c55e5b17e728af5737a", |
|
190 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/camera-retro-tee.html": "2196b9364ee03668eafd98a2274ec10413c1e80772012636d5ecebfd48888ec5df05dfef642d46d971bf46757473a5fbb876ba457797b6196e33d60b784ebe8a", |
|
191 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/classics-tee.html": "a16ac1e4a87939505a43302b9dd94a1766fb6ed91a67c93efba42e38e264aab1f79c5f9150ad66f7029a6ab1811d60bdaaff6977a9c53148b7e393ab053e6224", |
|
192 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/cta-suggestions.html": "af48d657766f7f6163ce4851571750154337c8471059b200896e79f4ac3ccf2af4955ec4b950f1d8974cc6cde7ae11a29017303ccbd1895f30854adaf94d3730", |
|
193 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/fa-ther-tee.html": "095990235b55e0032b7dedb26ea37a20c3c99d431998d81781e80f409a589205028a0f786cc19dd6b479b2e2738bc0744f41ca7471ea5889f294a137e7100e45", |
|
194 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/green-logo-tee.html": "801e093b284cc4f6ce225877fb0ac5611d35a47360248255b13314e9722c96bbc2abb240b55ef5c7b07f931d392b0dca6f7aca7b68c9d722aedea916b12d0a91", |
|
195 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/old-skool-tee.html": "8a754b53ccf0db827e9d1250744b83e937a820876a2c49c969ef8e403b680d2692777d843c11576435cc6a4b2c2ef08a085497709b87b029a3e0827b68d0e269", |
|
196 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/rock-paper-scissors-lizard-spock-tee.html": "5aab5d331fa8f5a3540d42c901a52cc15345b585ea7b271583f9588949bc282defef5da5349ed795b0628825ce239f11481174bcea5a43aee41169959c0985da", |
|
197 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/space-shuttle-tee.html": "b155fc2184abac985df711df2bf1e3907ff088a9ffb648ff3a0dd8c329598722fb3f100f3230184b73f5a4606936e282fa1281f35f7be2a9e3665fbafedfd0a9", |
|
198 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/white-logo-tee.html": "4394a413fb87a5cd25148f5be1fd7e1ef641f6500f68e607f51e13d5f2718c676b4af28b0669cede49dcfd0784ea0004a23c2f803346c5acc00c1fae38e7015f", |
|
199 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/stripe-ad.html": "046fb057775c05ba14c426912de5d1499ab7ac0069ee6b3920279cdb551e2e4bd7c343008606bdd6cd9231e90d3d821085a7cb43fed8871ce687ef42f26d5a33", |
|
200 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/stripe-social.html": "0e73d4df0440bca1dcd3d32a3ffd1cd566a0a04e021b0c9b777e4503de7a4b90b4132d248e6a317093c276011b171669aad65399503b1e475afe593eed4c65d3", |
|
201 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tell-me-thanks.html": "7b4aac2c3b5b1fb29e48575ddaf771e9769bb4bc7e9de53b1e6f1001c26ac8380609e3697af6a687c144edce9e0c56e6f7ae24c961434d6c6f7f7e5f0a8791c1", |
|
202 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/rotated-flipped-inside-anchor.html": "2f385fbca67c27a5700b81c77c8c568536b2f35ed39e5b4baf9b80b4f50c40fae8b44923a2d48ec7cbc78bb4fb3a570533bb3a8a1635ddd6af3d93a5ba58135e", |
|
203 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/rotated-flipped-inside-btn.html": "94101d52e8831e9655f0100a23ae49d9ba861c55726eb5f5f4e21534224fd3b0faf507adc0f4cfdee449a6713a20f5cfbca2c06e9c580702cf64f8bba2f1f9fa", |
|
204 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/rotated-flipped.html": "e773c3bbe0f72df812bf3edfcdb2fbd7469b9c852c06d235f2012cec2d7dedb804d615de3b004e1ece3cddec1136db0580a8f256197c1b07629468ffda1b1940", |
|
205 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/stacked-inside-anchor.html": "59f6a4cd94a0790767d72b0a4f83d1d749667d43bccd60628e271cfb934ad7adba2d8f913c4f55708080aaea6c781b271b09107b56f276c996b49f60a18e911c", |
|
206 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/stacked-with-text.html": "37054624c8aaabc00921b74100c417d1dc43fe9cc46a92ab6e4c17b496d5c952416936093135637f9f01c41b78b73c727a5d921f036bb0491329a42e3fc8e8bb", |
|
207 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/stacked.html": "644604c9302130434ec413ac9f30532013d3dd3d0ca6f36ab14bdead72ab56386bf3faf46a0993ac2d4ebc46e37b853a3415bfe82dd602b9379e6260574e2323", |
|
208 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/thanks-to.html": "e95ea8282f36803c852620a01d0d8dcd0c8bc217a863db947aedb700f40f2f3e63f3aa64bb32e10cb2c2a4e4e25aa85f65786106555cdd688035be0bf8dfeffd", |
|
209 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_includes\/why.html": "c8bdd398cd372d29a4221d90003e41ea64851afad508ddc07a285e59abeef7fa708db378de329ee5d43d160593c650e6c79a0771448c435b864256437f665da8", |
|
210 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_layouts\/base.html": "55c3ac21d5fcfc6af1af7b534ad3dd540d6fd574d2b6f16b4a1412977f7e4aa52f3fec17e01cbd8707bbdbaae250c5d14fe3bf776ba34c58b31105905001a92c", |
|
211 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_layouts\/icon.html": "d58a89c5f5e459f76b6193976ad8d6fb2790c761344afc1e9714cadcaac4295fa33600060fb719de9ad2d6b4bef445921cbc94e9a7df3163d198cd229b6a673d", |
|
212 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_layouts\/survey.html": "3cad49f4be12b65f99e525424b4a9da671b1c9e103b0d086f60bd9c0321c58048c83b2e2473bf7fe39ce2a8954293c6769ee23a11511e7ad9498b95c2b4d18d7", |
|
213 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_plugins\/flatten_icon_filters.rb": "359a2c2e490019fbd73818b7bba512408baa61cb9e3519eb97ac0d6998148e753ef1b9e6efa71bae9f6450399a325385cc7377db998256726845e50d94814d99", |
|
214 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_plugins\/icon_page_generator.rb": "05e73c7a8787eed87f8d85f6e4c4508d35a853623624fe1addd208172ff8ec5ae7f5e5ee7b546c044f2766843e07d9b9d492f708697f319a3cee839fe6792fcc", |
|
215 |
+ "phone\/css\/font-awesome-4.7.0\/src\/_plugins\/site.rb": "c7e207a821c852b18991122f2397613a8f9ccfaf511b80235a8a17807498f8090df1203c80311b53558fbad4bb3b251267854701521f8b639f7436403e1f21fb", |
|
216 |
+ "phone\/css\/font-awesome-4.7.0\/src\/accessibility.html": "e3189df725f9a93f691530e07404bd5f0572121bc8b4f22f94caa724e783be7e1bf7fef39bca4dfa99c640689d6ccd7f379c7750e12e3f6d0422524554ed80ee", |
|
217 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/css\/prettify.css": "6947c12db54c8c2b0900923b14b3a0aa8c15477d9b767bf6c7d401a3ed1b0393ad6f03b7a44a11bd81289fc350608f0fb1cfaf7df80a67ebf7ab37815df7a453", |
|
218 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/css\/pygments.css": "35cb14cd45b94b0190d26a84549156caa20469918569cf3a382bc3b0ec200206e553218af8508c31ade050241c304faca75509741b9fdac87a78876f06a8dad1", |
|
219 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/HELP-US-OUT.txt": "f0ebc1e7ec38a8cd333b34e2deebb416ffab31f3cd707f27e310beff328e5e05962a023da606c62559c8b606f7138b90896ee304fd45e86afdd2910ac8cdda57", |
|
220 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/FontAwesome.otf": "a3acaaac3a9861ac7a4ba23e52b9115d39b674cb685b45454fb4b80329a4f7370b5ea7dd8b41d630798f8a54082b62411fd63332752296dbf5f2b3b96abb8874", |
|
221 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.eot": "c160d3d77e67eff986043461693b2a831e1175f579490d7f0b411005ea81bd4f5850ff534f6721b727c002973f3f9027ea960fac4317d37db1d4cb53ec9d343a", |
|
222 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.svg": "4f575d52331de91a2e32cc3408dd0eaf0cf25b7244d34b226314e3647e85ce284f86e3b7238c6c8b9022dc4e2787bf51620849290cdcd5d4c4bc905f289d2156", |
|
223 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.ttf": "9ffb91e68c975172848b4bba25284678cc2c6eb4fb2d42000aa871c36656c4cebc28bf83c94df9afdfbf2407c01fe6b554c660b9b5c11af27c35acadfe6136ac", |
|
224 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.woff": "9c776dea55a01fd854ea23b3463d9ac716077d406ecbe8ed0c9b6120ff7e60357f0521ab3e3bf9d4e17ca2c44a5d63ee58a4e7a37a3d3f26415a98d11c99e04f", |
|
225 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.woff2": "838fefdbc14901f41edf995a78fdac55764cd4912ccb734b8bea4909194582904d8f2afdf2b6c428667912ce4d65681a1044d045d1bc6de2b14113f0315fc892", |
|
226 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/animated.less": "871260979d82ccbfaba0da449a8db5fda5149ab93f6cd4c3b7c7258f4b02519010e4b9488402b3bc1483ffe9b1c28e48371827bcb3815d8bf2c2c9fa2c3457db", |
|
227 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/bordered-pulled.less": "fbc272ec15a506c75aa742979053bd53c137e096b9577dc2c2921ae05da4beef051b5c73d523e788009e7473cacfcf2a3f3be3d756f70533fcdd083c28f06283", |
|
228 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/core.less": "7dc7ebd8db2a4a82608ff2bdac7dcfcc25ceaf328ca3dddc24b4d9288dc1cb0fd9666f049a24e84f49de93a9808bf4558a2c9100b60a18eb6ae8ced3ca1e08ac", |
|
229 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/fixed-width.less": "840595e81ca021f4171407c5671024890d8baabe223d4aea8fdbec4af80506e058a02c007b9a8eab3b22b8a1233da5331645f54d458d0cd85e126fe7ecaf0f72", |
|
230 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/font-awesome.less": "16a2f4f83d9c99c04db5f3a2f8b8f912f2615815d46b4248e93085a0d85b26da4602202e7edafea260cb4effb3966a29f35c5718376787df53b463b671a44358", |
|
231 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/icons.less": "fb4ceabdd56efea26de2ca8b1d36eb5bf9449945597d8a885154bb4826beadd742d7ed7bea85d0045b2212bef5271218202ea13a9752162c58f828874c281c12", |
|
232 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/larger.less": "fc61ace85bfb818341e45d7ae4863fdbf772ca3880f056951a8029fd0c0bd2aa64831cd446ab5f8dad19e4b332732eb5cc0d1f82e07ff28284a270545e7c4fc9", |
|
233 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/list.less": "93822d88bcf9a647867411a47721786bb3404a45dd78b1155b1601dea5327f4cb913248014494101d9aaf5ebc53ca8f7b0d279971199c84d0fcba23af42cb3ac", |
|
234 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/mixins.less": "49774e645ddbdb849361cd519f93ac859896040ab6e282c2ca4b7ee5bc3f0ff9ae33febfb03af13f5c3c70c64da49020d6b38aee87c3cb49bdbfd2997e008a39", |
|
235 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/path.less": "2214dadd8025d0da912ee4e0366a25b6d521f61ad04cd61c0b13140a9465d7711db8a80e3c83bc5410624eeef8bb2dbd1aba48cc3fa39b75d5eb5e91afbb7ba7", |
|
236 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/rotated-flipped.less": "0c410031dd5a13e53659de9933ff7cdd1c474d7aa7a92bf3f0acc635099abe6e09eec47385178ad757e604241d8a0a631c4c44c025f588889ce003844263ba03", |
|
237 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/screen-reader.less": "7d5c0d28b78b9c24b6af0181f8bf72d1b7bf20c45edbf1594da8b4c8391dd24920b9d0ad186ada7217755cbbabb9bf6ea52acd8ed39f7c9abf4659339eb70504", |
|
238 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/stacked.less": "02c86ec39dd5c62d633350a7ea40f08179f45d45ee120f980fba55dd9b3268901bd29d83029889982e180c890d8407f9d8902c0a83d65f9eef8cda449dce9b7f", |
|
239 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/variables.less": "20beb08c4fd41e8ea8c5f83402e381f4cdbf5ada68fe4f55a3b7131e15376da55615d9abca6bc4ebe1c5d592f43bcb68099c4fe8291000dbea7aefad87bd0cf8", |
|
240 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_animated.scss": "0e27405ded612c01c0d1fdb3327dd0e311ad92146ba05099bc7ab26486fa2e1b6705f642078027696eb66b07e05a0c4fe743c24f5ed28c99b62a095c96e1f0ce", |
|
241 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_bordered-pulled.scss": "7e4c565381a5bd3de2c6a7d2d706b592ff23b9634e8aee400aa900abe45b34a6c0a0457661d24c39d2688c0d2464f69cb1c6b38460ad09c0ff22cfad1aa572c7", |
|
242 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_core.scss": "a08d491eb1c351847ff35af3220bb18d3f7bf301c56e34f682fbb81f27612aa26ce32cd9cc491f82b23da16cc2d17e4ebf9afebb2d5c040f8639476e247ef912", |
|
243 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_fixed-width.scss": "63ff8f10bd612ecb27b17775471d3fd2156e23f20ad5949b444a9ce5c7f5c4c4e963579e90f868d4bee6cabc30ac24c8b428a5aa448c6329e85a3082e688d228", |
|
244 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_icons.scss": "bb0c2c272dbd75b0da7e1dab2155a7dddf4e4a15db41f6bba899af8fb0ccb6dbfc715806962c52596e8ff54655a62d12892c05e39cf8d94a32c1b0138798c3f7", |
|
245 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_larger.scss": "56e124c9477776ebbf03a9c1abda1216998d58a901bf6ee377c50f7239fc048a2fa72add0f77c8fd01fe38132250a6ecfb17cb37a415b2b2efe38fd0432822ea", |
|
246 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_list.scss": "cb337c087a7753cffd1298f24f3a6fda676afb4116f2a9bc52182cf0be3b2baf916152a146f808da073de76f8015157f6384c8c8cbbf743fa778729c2155e058", |
|
247 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_mixins.scss": "1a5738e10348256551ce5e24ac2c2999cfb471f59e41c6bad9811fe00cff0d5d91fe3941961ddae0ab799022d1efd55bf771e91ef9198389dbca737c4bf5808a", |
|
248 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_path.scss": "9eaa7d29bb402c790bf1ad40ee849e26743d198bff3cfce0182c2320afd9d47f4377b2bfb147999a057604dcfed33e408065577a516be0f3623fc0df75120912", |
|
249 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_rotated-flipped.scss": "214f7a0b8237f34b8c95efa9dc56ec15b61700987b8e240fa1d97c29aa2f615b87913bb28a6db1dc92ffaf3e80984e4b5f0b602b94f39604fd4613fa5a146411", |
|
250 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_screen-reader.scss": "5e3c8df5f64a9ddd9c7dad6f939156090e832a43c4352f7f470169ba22133267931f53100da2a4f4ec5e5528734c5d60c42ebc64fae6a5ee1dbc2e920dc343c9", |
|
251 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_stacked.scss": "10ea316ec6c669b0d07a17eb585f73da0038a9ed622d3e0bb0751ca5ef61159ce6593c3c53e1e0c589f3dd3ddceb2e9c08215475635611fbda9f8e6f7ba5c7a6", |
|
252 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_variables.scss": "f036c1d9b7c98d14708c711ee7752db086211c571af722c0e726541fc1429b1cdd1beb747e5e06547aff18f12f2a931e0e78f42e2ecab8f9b70e3fc2a57b9b04", |
|
253 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/font-awesome.scss": "0f0dfede40b047e2fbaf5090d3f08a06637444c3f9bdcd8cd2242a8d5df7fcec938e073b1f7c91c334646e2a324d6de12f2673424ce7439d45b99eba020361fd", |
|
254 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/ico\/favicon.ico": "8fb75ec6e7d4290d0f342ab1cbbc4d507326fdcae091b08c25a27be56629ab35d96b999cd06c10aea1db67895dd3b3f74c4359c0e4b1f429503bac3764a76992", |
|
255 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/img\/algolia.png": "d2af6d614e206d73dcce611d448befaa4899b09ecbbbf0a0aa6dde1e268958415ea5fd9a2a87b9b1fc7354fbfb1c1161ebfd7170ec3b95fe4be790408f6c89d9", |
|
256 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/img\/logo-themeisle.png": "ed8dc9ff39b794aed38e9f2cf46993d72e027d1f15f662b3f98eb6e08cdb700f0bfb83fccd4e16cec4be2d0f41b4ff0afcc3776f4a2eddf05fa6fa2b639b9445", |
|
257 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/img\/logo-wpbeginner.png": "9c6ed3015a57e44c0538e52080de6033288689387e12cb648500475c42e2fa736cb027e2ce547d63750fc5ceb3831c3473c656ac3e04fa313aecd399f23e6ebe", |
|
258 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/ZeroClipboard-1.1.7.min.js": "99deba8b85b7aa2c092af1b7a2e09757b1b82b6c9509ddf5af0edd48a10a1a7e790158cb473cb86aa133d79d47142f14e8fc15ff4cf3ce9e39268af6593ebcd9", |
|
259 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/ZeroClipboard-1.1.7.swf": "bb635b563a8b0a637d455127a40bf817ed57c4bfdac1cc07858faef1fcc488c3bd9ad057cba83ec38c7a2cbce0522ab402c4d215303103f6f3227db36716ad34", |
|
260 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/html5shiv.js": "d3915b572fce20ce95c1d5a0bb75f424bf3d6f71e726a77afb50e85c457603d60241cb4698227dd3cf071b7133fe444cf2f0e6728913058731173fbbc9ccaac8", |
|
261 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/monetization.js": "7a8e7b8e79aba68f409fc32188905637e798d79de92305c5907c339ff1c9bee5f22f2d58e499e73316f6bb39db580224299d10560e9e29476f819598b19b5076", |
|
262 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/prettify.min.js": "7162bb9b467682742f6d87ea94300000064fc54e15193c3d7e5a4f898f0ad7dd55bad8f01933eb625ab1a0f4a8191d7062e1acbec6512ee610d2c0c413c0b34a", |
|
263 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/respond.min.js": "a133ec6ca8b11553f9e940bd30faddeeb2465bd5cc9b48f3431670140c1f4d1d74b2362729e1e907e50d6a2411ea58b2027996ff0ee3e5f7a420526f8efda5d4", |
|
264 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/search.js": "1a925281a9fc0721c8b290fd8f6048db5bf31057ba7050228e7245d05fb1fbf6742884355254f00ef1bd68a4542bdaea73375f0eac1f40ae21f280d0d08f37cf", |
|
265 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/site.js": "71e19b41cf03a3b0bf05e1bc0c07a0ed3cff51968470b22502d26357a337cff80179d9e2546082851c07ffafe2427919104253f53c97540f90dc2591662ef9d5", |
|
266 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/.csscomb.json": "7d746f81e37b2a55e4eda116b76f688e057fe1e7a7311dedfacfbc2943dac84b2bda9612140cf7f0089015533d9a00efd90fee5e260a2bd94b7fc73737617368", |
|
267 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/.csslintrc": "238adfbeee24fd202885d332d1316c44bf23a37e1899b9c618215715326a3a0a84112ea18f345203e450d096795ddd7b859a055296f8d2f834b2b0eb7f7d5f3c", |
|
268 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/alerts.less": "6ef653823ef237fa019122796e00afeffe3e6f69773b3282e70595946b936a8055865fc1ef115f371be0c81a4b2abf6243de068d8b75b071fd856aec8ba87d91", |
|
269 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/badges.less": "ca5abfb72cce5fcd7958c53fad833af4e8321595538ee76a4c2eeacd79f217f8465c1b86bca32357daf1d7a82edef5560bb9c69c11d137a1aa1fdb8da16d82b1", |
|
270 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/bootstrap.less": "abcad45a2e54b3b501bb5219bc5883702fb9a15e8a23fb9b3a9c78ad705b99ee39c042972ac756409bd85b45db460572949374c0f0b8eb4885ab4d7529b45e93", |
|
271 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/breadcrumbs.less": "66bc7d8baa9d552aa7bb832fead9ffcde5e9ff1ee9aab436c6599566bd3b87849a74e1a888d7d33bb925016a2dc26d0f046ceaff40bdb06464a550a64f27207b", |
|
272 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/button-groups.less": "b99d1ac30a521fb6163effb388a25114b8f849718bc1a2c32bd4c36423e1b51b1d45b6be181ec0ad39d44debb1475e483456c8fb21d86bb2356addfffd488c96", |
|
273 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/buttons.less": "d2795ba4cd91e07fffe5ba49935b36583c324479ef3d3741330e9267430b0f560f24c059dc1e62c5bcab21084790a87d38dbae051dad3a6e50a403abc7b7ccab", |
|
274 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/carousel.less": "e9f601bb603e0a39d1fd7efd07346cac7d094ae1cbf8d8b95dd2836baf7c25757660a532f1a7d8881c9582234f07b64d57e81ee5e863c901b141b6119696e21d", |
|
275 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/close.less": "e2a6a0877df37b1796039939c179b98f2768291a1c8ccd26fe6848590fc865df9f6f0016c6b5b0d0e7367746ea27c8c9103df4bf5efbac063059e4fdc0db3540", |
|
276 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/code.less": "3932fc44533043a4000c26e4fed51f231c2dc054e561c9d4167a5429799b813d4b28654d9ac411e3a425b66217b090ca72ddc3d5963459fef01fc92386ecf525", |
|
277 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/component-animations.less": "bd7517bccb89a397d29bfb1db20bfbacd1b28d4927330168d8984908c1e7d0f647c0cdcd646f8b009344bc967dc751ccedf0efa872691d23f26e2e3debd6b467", |
|
278 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/dropdowns.less": "bd193d3168a7ec1eb89a484c5e79c37a4ba7d6cfbf5b922bb2e7037b88c3b935fc31a9d9c3c52a92c41b03640a6bb12d61917c2f0128c33c64409e0531ae7ec7", |
|
279 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/forms.less": "c8893acca4ceee40dfb2fbbde9720efdfd8fd5f1e74b0202be26aa3746c27c5e836f7268d9b44466086f5eae106571d4be2d4e04011f85ad45d7ededecf4d73d", |
|
280 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/glyphicons.less": "6f909009f4e9f2b6aad0337c650a3e396b63341ee6c4099baf4537a07256f423dcb969f3f452559b0b3790992cdbbe272d52f4898950b50cf386297d5ac693e8", |
|
281 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/grid.less": "9638e08c198425b7e46b2178f022af3c4566adf6e9cc1ce1386b595fdfcf7a07ee51fa60fa9f3c55f02fd9ae1d2e1198e9534171582b0fea5db0d4288854e215", |
|
282 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/input-groups.less": "c8e470633c05493fc778a64600ffad97737f34a94423217849ce01b77054a8c1d0fdd85350595c7c30bfadf159a8d1ca2d04af9f49c08795e9387020a07a4447", |
|
283 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/jumbotron.less": "e3c97f308f50a5a3914eeceeb9a90dd1a7e802492c2c3da657740c997852ee0271a1dc06fd497ab44625544314c4cdef3bb16cb0bdd5067ca9d89b5cd64a3f17", |
|
284 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/labels.less": "640e8861faf662e06fd4ff06a92382a27319fa39761c78b8a19c4b0ab2b2e440b4ee7cdec8a0f7ce67a12f0596ffdbbd19308e2e9a63d164709ee083edceec64", |
|
285 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/list-group.less": "a11b70ab5618e5ea686893fce866074b51254c93d5bcb02fe30306d143b791e76b3672b7f8fe51545ef30d73ab89732bfc45cf2179dcf9ae07ce38d27389f422", |
|
286 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/media.less": "e8d21a5bc99a08d3d04ee371ded649b3cacd1265988efedbba1e8aaead14d346326c14b64dc6aefa744e232ef6ab46d4ba8a1d23e7aa26b276633db92ab94420", |
|
287 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins.less": "f8a8d51bd105a260e9db963e2e7d636bc91c93c51f117574e199f90cb439daaaa32616356b884527ea48b9feece9724952af7ec1452355703df624c8b498e5a4", |
|
288 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/alerts.less": "582d9fbaf2f8b6b737697824af7ba9e47f98dd4a001b60f1668c2f88aed8bdc3e80311618bad7b07605f81876cbfcbc6830b620bef0ee9fa57fb90898988db79", |
|
289 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/background-variant.less": "68709b0c5b5ba52b0f583b7421f79bfcd32c2784620f0ee8077a0d788ddc38a43b11863cec3b1a183451115f257aa7aeb58d077f066e846639fdd881ad069649", |
|
290 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/border-radius.less": "e495c886182327408e6b82511baa49dcbf1e2b05104f844f3a57fcff40a49eaad548e19ce13853c45e74ac52689d9479792cc3de55a020c2229128f595d5288a", |
|
291 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/buttons.less": "fa6f88171ef22558b095a136769533231a9b0ad8954211f85db3a42ab19492e0d456d5feb419f237bef68d1f75ddc42442154a4007a45b76f17608ec907dcfda", |
|
292 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/center-block.less": "3b81464925a61dbb2be2b11d9be3292e9a3d42c65bc05e52f84b91684e0b178021dbd73e6f613c89f39c34ad311d039bb80332cde9bb64ccc51e0af49e63143a", |
|
293 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/clearfix.less": "5989cda9e86899298c7e7c9cf73004d94d6e53f214dbbad93ca7e7e790d1e2043f768481ba9d20e1b7ff5667fbb4902b213560d09e3a7aa7cf977f55a9247614", |
|
294 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/forms.less": "07dabe53df01d5324803837089f67f74b8e890330859fad42fda090f2f9a35280ddf531cbbc6b549e26002d5afba0e1773cd871c63c7f2f580b67a042f18e403", |
|
295 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/gradients.less": "31b17118826eac8be3aad693382b82d99c01983b68ac37c5290d07920f76f61134c69ee12f9f5ed335aa392e69dd3bcb9a512636142e6acc1827f6db673a5a12", |
|
296 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/grid-framework.less": "ab354cc185f82538cf2532bbe7a7df82dd197a6355bfa3c333164294e329742a800f26641fff2857f7269f80a30cb1fc8635fcf6c7575b7b98603db973d4a314", |
|
297 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/grid.less": "4ef011c62ffaf26988e7f30749a58e251f316ccc3093b1c50d5c65cd66065e2af58bcedbf3447a97f5506df294bb2a31ec0d2ed01c70a977135e153991bb6fc6", |
|
298 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/hide-text.less": "770055fd6a76bf5881015e17101bf9079d8e05188ea70e42ad8a2b8d4d141be3e7756039dd7b904786fc79c8f14ecc58d7c9da4122395d6bb5b9f8766c86e3a8", |
|
299 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/image.less": "a0aa831f323ab27f3fe324453e54382b7e4ed8da5fa72e9819df2b3d07705c800ade9f8e5f732eeb36043096479798a812ef712c589164a629dce7fc9b49f75e", |
|
300 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/labels.less": "3923340ff6b2eee8eda3819d42f4c4b7e6291f9edd2b9807c4548e5bfe47eca3076b62de3c5bf257dd7af4711eb1059f0e342984d2e7a606d2229df2b5678865", |
|
301 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/list-group.less": "be85a41f96cf369a90b27fb5b1fe477306fd9687971fe85bfe8aac3a4ee21c775a9b55d2d0062b66a50e71a11368bf6617ab7962c39b978252c20631b4d55db8", |
|
302 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/nav-divider.less": "89478e72ea248cdf80330b4fc356d0901ce5637e98e07419be49ca8dbd563d894af7fa7fb0e8acc8af4255a9c8a929615a19067e83ff554cb7db5a14ce3aad61", |
|
303 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/nav-vertical-align.less": "2b5ad0e0e292a091f90fd02947db3dab499d47c7e44562005a02b4beee1221baf602687aefe63edd30b6ba2959fe2e94ca9088fdb0e7a548d5c722dd3684710c", |
|
304 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/opacity.less": "39f3e7f370cbfe52d61b08688ed4e0070ad396ed7e2e9bc068d3f10d31cd15e1317664cad0cba13b15e4c60076f1fcc353e28e2b2fcb1fe5f3143ed87ae2cdf2", |
|
305 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/pagination.less": "1344d77a2a54bdad0f7c731114e8ead128335bfab274b36f6ba8c02f6362acbfeb3718452d993f945f78af7f439f1240e4205af3b39e2d12883f9ab127a7866e", |
|
306 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/panels.less": "7518af77aea6fa3fc4d2950ed0d7df5d9fb374f7ffc52333b8e4cd6a785b2dc8b1ffb12cda7e5fc3571bbfbcf7e480af1ea8ceefcea09a6af534949d8622e73c", |
|
307 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/progress-bar.less": "b390e21c7a4fc508ea0c8403dfe7e89d0d7c2e6402cd1a7972f1ac3cdfeb354d6890e3d2c8d214575110162326b0a016055a548ca6d6f0fd146a035eb8896a55", |
|
308 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/reset-filter.less": "1cfef8254d9fcd9d3142c9636270bc505cb7ff3d4e74faf7b3f5c90fd5d7eb4465fdf4affeacda7e7ce40800b8756d3ea2a1031f6729eb975acbba71b3a64b37", |
|
309 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/reset-text.less": "e7a4f4abf9fbf88ac5c756798751d7e0b0ce1390607479a522d3044682a19054a1cdebce3a66a4a2bbbdbaeda9db8d14621f12ae7ae67c4ddaaa1c3f43c9ba75", |
|
310 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/resize.less": "653227d4ef865d5ac4e8f844b72019847c1e06e6d9063bb18dfe91b4316957fec4f01063585275b8cec695b602edce11116320972306bd643cecacc6d80fadd4", |
|
311 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/responsive-visibility.less": "4d75a3404f4f5e8e3364a46ddbe9b9a6c0e780825a71ff4e5ce7c712eef99caeeb47c198df6df4d22479a72ff769247548638bf222f492762fbba383028f3318", |
|
312 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/size.less": "5961852fff078e8f3efb4d2584e60d59d5a74ecc325b53c03d80a63339a86757019d34b28435597ba576a7129bd697f7e974e4a374c772cf3d740f4ec27ec720", |
|
313 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/tab-focus.less": "e277a74a513db05ce8c8bef7a2aa56a2e45b0a6f7e49432eb2c07d9e876a950292be339f6d8937eb0339794f632b6eda5fa29b9ba6e1c037b6dca1f720549f8b", |
|
314 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/table-row.less": "60977b7f339f344350b9c904cfabb9209a1121cb26ea41cf516f01ce3e3f9b5f7e262c298d97f33a8a5f201595f3ad0166d800dd625287deb7d3d416a91093a1", |
|
315 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/text-emphasis.less": "644b7f8385aaad90396707bab15dcd319a71f0a72eea7c0721caf98dfe53825b76973dfcb6ad51ae6cc28d181f4f244074a7ac95c29387231697db7de5af42fc", |
|
316 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/text-overflow.less": "a32baf8bc0d47de27e34ffe09a37702a0faa5e541d06803abecd9b82bf59de1bf0a7ea85ea23a68b84726c984ab0caf62e520b1165b80251c031fdf3060f6c20", |
|
317 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/vendor-prefixes.less": "6857da23deb03264fcefc6ca3fefd631571aac71203f23292024f20e0d5bebf4669b5dbcccd36df095460bc9027614396a9f42bcba832e968498d4ac753c76eb", |
|
318 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/modals.less": "4c99c136dbcf3ebe6a95e694ab1bc14a1469f9dca8311390661e5dde3201dcacd855aa9b4400c54d16116a60c98412a06579938fe1c534c7b8643a22d0e6deb4", |
|
319 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/navbar.less": "36d19bb1a44da00094675414d564a1ab382e3fdcfa1eed9e74f5f9ebc0ea5cfbef151996a44de9c9a975d088f409f73fbaaf01887ed0ebb1828810d82fdb3e7b", |
|
320 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/navs.less": "d19df77d08c0bcb9a534533943e2f722a54d26e94cf328849cdd77aed4e1bf067563c0cfd4997f8eaab3dde47fa567025d3283f979d8be5e61c121b784a3d98f", |
|
321 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/normalize.less": "d0a2aafb6b60e57d40747d6b1e36f25011ac250b853eafb50478d4abb1c166aa89edf393a62019081ed19e08b32c6f2fe013edb00090437dd8fa5737379ee718", |
|
322 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/pager.less": "7637659ca2998df19ae2d38304067029b9944db4e70a42c2d0e77ce52cbd0176d765490a890687cbbb24334bf098b4cf54931b35bddc26a85e205b81114dd6a4", |
|
323 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/pagination.less": "365110bafb570d10002748f6d2e743a16a27cadcbe600d64335a1ac09ff690683649872012e3a60bb92a611d87f409b450bc0d9de28d6aa1decae8f70a1a0491", |
|
324 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/panels.less": "d6f37fadce28cf9e90bd1dc47e0bf71b1bd8b67db3e19b0447d2a6a3e13def8cae5d2c52d43aecbfad80fcfcd0b0e24fb5eea205bc6733e10d90b22dde5f275e", |
|
325 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/popovers.less": "084501129f4c74a32eedbd78f6888cd48789e5175987dfcf45385c98a54fbad40654415e6c531a757b1108937ae9c6b9c81404700d754fc54eb925ea4516efac", |
|
326 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/print.less": "9c4f44378fb1cd28535572fd768baf652de2614f31e62753ba79c02a313ab509db28f52c3d0c78665d2384dd7be47edf97e243ef83c6b22e38edec56873aa1ce", |
|
327 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/progress-bars.less": "41c051579d9fb7949b128dda04dedb2ed8adc358b157cf5450d375962323725ee2faa7a4033613471f00544596c8fa400d22d9965c77544aebf6e56b3911cf49", |
|
328 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/responsive-embed.less": "a0288862649916929c2de7a5c982f877847f687422ed205fcb9b6a197ee98a6bf52fd012725f894d951bc6ee4bfdee0a4a8363e652f93b8bb98140aed1995533", |
|
329 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/responsive-utilities.less": "98690e8c90ab2c0c4d9662786b7560f2198a968a4f4ba253b8c87b9402b02c339516c89af569acef3f6f37978ead0a41b234a164f5f16d4828e5bd2b0459f370", |
|
330 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/scaffolding.less": "882fd7d208e76e926ccb9c88ba56741e8baff7b6a46bb17a4c9652778864e63ec04f5113628c6c39c4a94392974293681e560a0e3015226d4c1a66c19e085419", |
|
331 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/tables.less": "8588df750d6291bec4a2359fa6f07658d0a9267b319c47560d61ea909aeef592123fba6aa0ce3cdff19fb92849bc8253f67c98ec5ddeeb782ec73998034c67ec", |
|
332 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/theme.less": "9b0c31e6b9f57bb814edb418813052427ccc97fa23a1ad9c29e1b26f9eb26921948727ed5804cb72d302f53387f4e87aaf8c436e10cdc60c39d3d10a8e89f228", |
|
333 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/thumbnails.less": "000fb95bc0b7210a573f6ae1d336c1baaa78764a9ef5c5054c088b5bd993c4866ee8b5d525c35b0e99d796545389b0a00864c7187222ca23d1d5f395a804a6cf", |
|
334 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/tooltip.less": "76459540fb8f856671ffa6da159ccef956144ec4e38bf73ff2c0f0af40130592d87f7fed1b1b9eda2bfc6e827b4f69dcfbd82a07101b4ec60b8a1e0c3d1c3315", |
|
335 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/type.less": "e2f164468cdf7097e0b3b456bcbae8ba23774c9fa678f2eee698010924f8691a8477de1c259b7e592c5c75f8dc959e7f051a501788b4b7ed4bd73df89a028595", |
|
336 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/utilities.less": "ac3407691078aa6dd779ff6ae1e9cd26abf9913ac18e24188fa31fb3e69b1deb31f7ee8cf8ee7a5fe778d4b0a8a7666faf0d6b30c46257140180a6a6147c2269", |
|
337 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/variables.less": "ae9259421469571038a01a417a1faa001b312ee8a8c16b22022cb169b1ff957a55c0f0d9d31afebb74841f3a23b35c1c41b6c0d66da7a9d16a26e91f7381f0e5", |
|
338 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/wells.less": "58014e2654e7364b1665d22a62edfa71828822547362fd42ffa3580781b4ca5a5ae6d209ce7916063ebe1f619147c9fc64bddd3b94105635afbdfcf9dea71d9c", |
|
339 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/gandy-grid\/grid.less": "b8bd10ea52b0a8ebac7df606b883a3d9c3cd86d11db93494b822f848f6ff712b04f6155cfed3dbfccbd5676e5cb7ee9f1a965806476f771ba805e9433380b83a", |
|
340 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/gandy-grid\/mixins.less": "201801419a28897fc914d74545fb9653cf133957c675f69fcb12fc1d210017d850821eb2b76e8c3e768639d47089ab647469147646c2e49761f143c7c9800b09", |
|
341 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site.less": "2613c3caeb1d7f65290aca49a2dadaf2a82058e915f81fa1e95d19a8cd2a1065e80af28f870c74048848fea4097f3e4630b06b63c54ea2219ca1527e22053dea", |
|
342 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/algolia.less": "3aeb335ed5081bd89f699218f6a94aa1d1d67e9d0f12608b880fe6ded5948f1172f93c4a3604970eb2e0d57bb88f65b192891e2ad77c6b4ed6d9bc4580d64ddb", |
|
343 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/banner-ad.less": "f5617e2a0610c67953cef2f11f14d969f2acc4d6f19155a3b9386e6da7cf938d1d0cc6d2f437348aa03285683bccea3b1e0e61b644ed4a402a38e85c0cf5e9e9", |
|
344 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/alerts.less": "5bf122c528abe73261e3e5fa571cbef01e133e767c7d59bfcaf5ed88d4747c66b26c8c6f543de14349e5c6ce30a0985cd1ab5439d53bad1036ff29fc35d466c5", |
|
345 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/buttons.less": "e770985ec8cd35b9e3226af40ea32b31540baf07189fb8fb80b9dde4bb6485297afce6e4aae54fea3760ed643a576d8da45b4b76f282edef0487d34f4f1c473a", |
|
346 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/jumbotron.less": "8bd6c1a7619f6eb8e89fff5bad824869909c1650d69b7bfbd6a62388644fc906b74de7d4d826c6ef4fd62fe15db80d4a92ca00261ba1f704e30c494842ebb560", |
|
347 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/labels.less": "33cddb047fd6080281598dbb61960c0c882fd55d116103531413dfa228b2da0ba7a1d74e1a0a784027e2bf196839d44a7ccc0d5bc6d6f9723618c5aff1a90e80", |
|
348 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/modals.less": "e7bd46144060a749a799012ddd68eb40cc2c2591163a5a2daa5814bd3eb4ae9bfa6fea8729a1ef9bd26956a88a069c0e3673555d2cceacc2b486bade7578012e", |
|
349 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/navbar.less": "fa7cce0e8647032bf6f84be86cbb21b51fde5ab235d4c9497ae714c450d29a8bbd072a6e0764b1c9b646d5caa1b5386e4b365a08ac725e687a5a02c5db0af717", |
|
350 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/panels.less": "dbe49fa43779ed116880f620472a17cb0df73f5e1b4ac422727a7efa5f7820d24656ab6702a33ecbf418db70eaab3dbb34c6c52c8856d925532db6027819bb7a", |
|
351 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/tooltip.less": "48416fa9b750f9ab909e6ecc641a3227956361d458ccace89d5c784d3fbe9cd58d2d8e4a1876062fd4217538dd361286b73b72d65fb43b9e8480e74d8ed1c7e4", |
|
352 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/type.less": "387eb060b9fae5bb9d75be7fe4243ce95d8331c6bfcd3da567cdb79c750f8bd8a45d36959d0717323b267a081e7c18ace43df84810008256162ce9158bdca09e", |
|
353 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/variables.less": "2c0810ea534208a0bc6c97f87b61d7788b9fc7f16c63dd30a10759495cfab6b603fa5a1b7b80d3d70897f295065589d9d95d660e8edab05627f0a096996e235b", |
|
354 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/wells.less": "b1e85ac1c8f2b0a3b372d9e3666b00592e299004c7624f8fc27458dfe2cffee3093058b4c9867ac589a48727d5065ced497ae6ae6469636689aa2d2c9b8566a4", |
|
355 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bsap-ad.less": "17d85c0b18c3de440cd3ee34fd9f88b20bc00630ddef8e753bf6b0e93933efd8e5e8ff3694ff98df19b422596e374cf28e9193eef073b92e62f3407608c44652", |
|
356 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/carbon-ad.less": "c06e5dcc5d97495dcb4acf6eb0dd9eda68ccf311b808e167ec37cae91af8a8b2f963cdbddb8c489c565323447df2f6fd7d62e6d20b8d1fcfc9849316c4eb2758", |
|
357 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/example-rating.less": "3b62779f2d1e1da0e09614e27e43e369cb6860ea3e3f25bb416321d22355484faa7ef06dcaedb3b0ad62cfe76bbf89b8f5bea97c22d7b883e1d048a705f94486", |
|
358 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/fa5.less": "230d28cd06d28dc7a3698a27b400c643663dd239651c29978bc15d3b86797b43b7530b39730af185c33d6c80f96515ff91e56e3da01a066bb85003d88480082f", |
|
359 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/feature-list.less": "5fd9507d3bd6a2a2f3487163ef9168b5db241055b93013555d74fcb2b81ae7866c5011876831f5ade138242a726c39e327ed7c820c760aad4d4f561b52836d45", |
|
360 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/fontawesome-icon-list.less": "be0af7e5d5a793d5587c79e02ee245e659ea1de4b1bf2d187971f6f51b6976c6d07837c79659e77aa6dc52d0a423f6744cefb537a37245ace430bdda7953c846", |
|
361 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/footer.less": "3195eaff0ecc028109d7a79a1b6d6850d7e619253d4a69c69e7470421617d05cab7a7daa95eff1bb6fea458d6848795fa8f56f4089207442b4cc34fd7f926a96", |
|
362 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/jumbotron-carousel.less": "25fc6b59ec1147d0ceac291147773662201799313a4824ea103f7510ea9b328eb9f27ed9768d1128ba655c493355364ab3f95ab4b58b10d7286f17e3b903a5a3", |
|
363 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/layout.less": "caf18d839d6a84d1cd0e13cfb2a2d9e5884ac802429175b4da914d77f896155d3c5e4925f4392044827a8f87e79c0f97876432f95b7125f0f20692e2a08463a7", |
|
364 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/lazy.less": "e00c9dd4e99db9ec174e6b50dc856637cfb57fdb321b72f95a319b5772c6338f7e1f89d109a6bc18ec890c5d275449f87525dbcc272ae3e89de8f4bf4c6611e8", |
|
365 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/newsletter.less": "1e1baa0263cad5613607142776bee6932e57173cdd77cf5a06f79dc104fb479e30fa8f56f6fbec770fd90e5d456d016747960d0943bc01a4d7128a2b336fefb1", |
|
366 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/print.less": "47ce33620e649fe5f9e899daf9b990ed8ff131146fbb8a21b6816f81bb854025bcce74d146d0bc08e345502fae36ff9d16dd879d72aff48712c1f0d2dfd06964", |
|
367 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-lg.less": "25b983b0a15d3d09e2c2eae2750bef037ea4cf6bf67b275b40fdb615579143dd6245dd9ff53044c67254f9a84efd05813a8d975992b138149fa7e248c26adab8", |
|
368 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-md.less": "4d88734ce346390a74caf1579f78b41908c5b386b38cf4724c84b7c4bbdb1de987520f51ee2e23bbbe8fce2733e220002fcc18cedc790613f0e6c1ea519baaa7", |
|
369 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-sm-up.less": "5a059b3ae6b0d1fb6339b5a031f036f64ee7093271c19c45defe57083205152a57e82e75f6e7cf9d95fc5c7e3e20f9db144616034f90c4ea8803b4846d2da348", |
|
370 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-sm.less": "b988a2ed6bb237b5c25f7556a3e07b375c9ed33716015de07e4f7b7f787d35186539f05b2d4f752c5a59edfd43e3501d84d865530cdeec3a61320690d060af00", |
|
371 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-xs.less": "5266a0dffdf45a7e45efb3fdad70b058f713a4476f7e356096417b139f4d85d36a8cf9c99cbe4840cf5ba4ea438cc9ecc599e39049cc84d853caf7eafe0cc71b", |
|
372 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/search.less": "de316ec445ee08ae2afd58ec4192419daff43fd3be40a77d29eef3e913dd826d633d9eebbb1b82ff38e0b1c62587c04b0ce9725ed1fc89a8cefffbe4a297e44c", |
|
373 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/social-buttons.less": "acd3c69ed3cb1726e4c4707d9ff68bd0bbe928f5ab7a60eff22c7a239214d94ad0d7aeecd7bb1bf3a600ed8e11a44d7631e99c4eea14f3ca986ec38fbbd102ef", |
|
374 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/store.less": "f7b3701892b29f7e84f9e98089f9d902efe6081adeb426a6330ea8bcb646345142b980d2187880f5b88ffce816a92ae990cb72ddc381beee017c4cd386290970", |
|
375 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/stripe-ad.less": "b15f475b64c9f484603631269f41f319251ed78f8d12c0929b77a48c5d427742b56e2ca5d7ae49dfa1e179357535af024c561fe2aea48de23f79ebb6869f84d8", |
|
376 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/sumome.less": "ce6ee2eb2c308a88e56c952e611c726c2cf158109d42918c2e1ef320c45d51269069ba0d50db0d5c443d2d8fa5634f86050794cd2194ff07689b0777a2f63bc7", |
|
377 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/textured-bg.less": "e26572839aef1ebc89da8e1d443c5cda4f52d5e52473af89fdc2d0393b472f16e3e26a705ab8086c730c9215eb9109dcdcd42e6705ac9209989832b559b293fa", |
|
378 |
+ "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/views.less": "36c20e316fa6b35959878f3b4a70f3924a0bfd316f34c697a1a3424039fdeb670f976199a01c0896e9158a042eca193674988a4e91d995be289e78ea2ab2fcbb", |
|
379 |
+ "phone\/css\/font-awesome-4.7.0\/src\/cdn\/error.html": "7e51a097a684678928af7cd5708c2a17222f9cbf81db4a9f85384d28d59031b48ac43315d167ffc0a45097014aea4341416b885d2cf8ccbed6e5bc331767b720", |
|
380 |
+ "phone\/css\/font-awesome-4.7.0\/src\/cdn\/success.html": "47c4fe2b58da41de009380c016e277dd8beaee35055a3328fb9710dc2e24056ff62f6f9698cf531270c7cea3c96eb84336f201e98aa34d2a37c420d8938ff116", |
|
381 |
+ "phone\/css\/font-awesome-4.7.0\/src\/cheatsheet.html": "a36cb07fa872f277fac0510ab5d5d640f8d837572c381041cf8623055328e827933b369922dd1c6dc82b7e4bc89d8bdbd19ebd21439a7b95d9b7b43f47d2fb44", |
|
382 |
+ "phone\/css\/font-awesome-4.7.0\/src\/community.html": "df0bf171b74d07c35d650ed1d786413adae55ec2d74cd779faa2ecfdabf0beaeec77b603a11b9334e31cd74a5458c9100d9336f905b2d50c479fe34c7cf2bcdd", |
|
383 |
+ "phone\/css\/font-awesome-4.7.0\/src\/design.html": "0df2e8909f5138f50322334a3b5bc65bef0b822cdeab29f8bdba4e077ba0f301a56e8724bfb730e8e6165afe3b761db5c6b6cf8ae2b83e74aac0b0e7563dd999", |
|
384 |
+ "phone\/css\/font-awesome-4.7.0\/src\/examples.html": "680fb422b52d80c5503cdae6774f4feb7290a542ae93b294961dd96694f6f72c125b39898e21c00470df65414cf4e3e1ae31cc500097e7c8578fa223aeee33bf", |
|
385 |
+ "phone\/css\/font-awesome-4.7.0\/src\/get-started.html": "f773d4781b5e4817544fdd144005157be79a773d3b1a8a72e30e98354cb6de28887585d4f64f7ea3a8a8ee8faaf242b77c8d4f1b1319c01bc1ed917da7a537b4", |
|
386 |
+ "phone\/css\/font-awesome-4.7.0\/src\/icons.html": "77017e98ef938c868ed33d4c7125cbd6e5bb6bf5426fe9dfbc9548d5224ca102f5b6277ec6d9e26db29fbffe973a8aa8e77d494832ff3ee6918c8e2d0384be83", |
|
387 |
+ "phone\/css\/font-awesome-4.7.0\/src\/icons.yml": "b67111f3a3a99ef19f5f7dcc27ff0ad37a5b7e74e288ead793b50ea319e65f4c24716b1ab412e2e12772408b5c1cebb56884cad02d425104325f39236ea4b3c8", |
|
388 |
+ "phone\/css\/font-awesome-4.7.0\/src\/index.html": "e3c7f7f120a5f0015a7b63d9f84f71aabd6b669cf19e72be01e15374d357171948935ec8b4824f6aafcae82bd9916ccd8768d1d195fccf0b8f281f17c88ac174", |
|
389 |
+ "phone\/css\/font-awesome-4.7.0\/src\/license.html": "a73280c350c239e7e0d8dc4f96dd9ec90e695accf6a86e7a6641ea68145e007b761324aad669fcfc9bd4f43781b71563b2900016b4c78797d392db6985cb7de9", |
|
390 |
+ "phone\/css\/font-awesome-4.7.0\/src\/store.html": "a6de552c4d0099c7a4586a2c27ad1bb016461a35bf3d7ec0647ba93c55146e53dcf51b52daae17330a734279513dbf3e6586983574ed5e28d0707bfdb9a13dc1", |
|
391 |
+ "phone\/css\/font-awesome-4.7.0\/src\/survey.html": "09b3fb7dd39ff303d463da73133ea78ec9a60aa5f7189929ac0a8aea9fe51c09fae1bb8c2c85772001d4e828a42b7e4c4d57419f488f49b5a9584dc010365a10", |
|
392 |
+ "phone\/css\/font-awesome-4.7.0\/src\/test\/2.3.2.html": "70f712d192f8441b7e2a5504b84955e42360c56b3c2b00df15472a69a4c435c74baae6876c4e8f9d00572f7bc7f24dd17726604025f89b12ecbfd1710b8325e3", |
|
393 |
+ "phone\/css\/font-awesome-4.7.0\/src\/test\/all.html": "8056255c377ce11e2a51b001330f29ae81462e4ace4e7e3ff960d4e661cc282eeef4ef168a307a01196a830f2fb8dcf572b39c3cbb5d77e8bde8643f2a64e869", |
|
394 |
+ "phone\/css\/font-awesome-4.7.0\/src\/test\/glyphicons.html": "b21a79668cf8d1a330ea2148e2f1089d41420f7f0e23b2862ea01e1e3c459d325247339aeee5d6dee5149b4f0f143832b819d07138da87eccbfbe130cd9ff650", |
|
395 |
+ "phone\/css\/font-awesome-4.7.0\/src\/test\/height\/4.4.0.html": "435d1525deea3bbdddf21794156acfa355e9fae0ecb37a64b3e7486d4e3ea798c2d95ceadb12fc3b3f9b4017530e00eb0e44f1fc9c5865013520855b2b184685", |
|
396 |
+ "phone\/css\/font-awesome-4.7.0\/src\/test\/height\/4.5.0.html": "f8e27986cc8539878b4247d92ea56a4750d036adabdb0b208d5e2a6c0df1ced6f4a6a9fd4d0f9ed7c0cf695233a16f6bed7ab0981e7bd57423f55dc5b3ae0710", |
|
397 |
+ "phone\/css\/font-awesome-4.7.0\/src\/test\/height\/current.html": "dc9b48458c1841dd7bd085f7753ccbf27203591f68f0278f0b9df1cdaf9beb043a35d9c7b9bb500a2667543582d4c9b40b5c2f144cf88997d8dc84fedd00ee1b", |
|
398 |
+ "phone\/css\/font-awesome-4.7.0\/src\/test\/index.html": "8060c06227dd2096d27afbc55f027214974a38c5f711d3f0c77ef1645441302324102037c7ad57b116d60c8aed2d847655bfddbfe0ba526fb0b5966435b509be", |
|
399 |
+ "phone\/css\/font-awesome-4.7.0\/src\/thanks.html": "cf0b677134a1893d3335991a2a9b9533812447a0817b88c03c6f27c967fe8956cdd17b355b6abe796617d83e0229c945a557345c11580b636b5fd633af273bdb", |
|
400 |
+ "phone\/css\/font-awesome-4.7.0\/src\/whats-new.html": "56607f43fc358a79bce938d9198bb7b091159d9aed52a354b57027810564973ddb9f0cd36b6ed8e573f6e9f09b25b043cdc88a1c22d212367e7794775a0e44f1", |
|
401 |
+ "phone\/images\/sip_trip_phone_logo.svg": "271b9632efc181f514892220a648aa2636ec8a561e297c1a2abfb64a10ffcdbff37913bf8cc82ad362a33b4faf224e74b45bd32a9b1b760a2e0476d56bc02538", |
|
402 |
+ "phone\/images\/sip_trip_phone_logo_large.svg": "b622744c5eff160b77ef7226d8f70eef15311db18d7dea9e334e92b20601a33d812cb0bbc3eef74d6294d1ab43ba3969a7ffde23d8ec2f7f9d1dbf6b6ec18e25", |
|
403 |
+ "phone\/index.html": "620a81a9647ebaeea6a2056381497a5de9d3ed3512689a42cb06d88707e09f6a8ae59bc028ae73d061e5cc74c8cb8c8d659053bef8b8dad2fce853a543769758", |
|
404 |
+ "phone\/scripts\/SIP.js\/sip.min.js": "ac923b5f101160a076034d6dfb2409fe479a4df6aa4cca358b64ef516de77f0c58b8faeac6a7bb9b7f0ac908e5773b0d567dcb3aa01a1a3bb5d133d41113a1c4", |
|
405 |
+ "phone\/scripts\/app.js": "b712de731a51d8cadd03dd05bd5991943fa271333d65f6e3272f4255322b2cff4857efedda31a4be5e85fed65ea6af1482c6bfe6c2b30b23243fc5e73bf04fe8", |
|
406 |
+ "phone\/scripts\/bootstrap.min.js": "de8d6bf69932b479dcfe470e893effa9f88d399314b2fa74c14a1465c7a6f1da78a3764fa35ee05ddd6a3f225588e601ed5978d5ef48e353e279c596f2471071", |
|
407 |
+ "phone\/scripts\/jquery-1.11.3.min.js": "25e4bc43cc350f38cab68b422101b528781bcd271a299cad39aaf64aa331ed0a35b9dfed3938ddccaa08c31161ee2c472acf297aabea334315758e128487b0fb", |
|
408 |
+ "phone\/scripts\/moment.min.js": "8f42e847a067c9f4e803bed887cb458ca2a6973025a6bd7f4a0853eeb24b4c64f8284e9d8fd40066fc71e17a90b36d1a6477939ff7c4160dec09e11e6f90d798", |
|
409 |
+ "phone\/sounds\/dtmf.ogg": "ff7217621c355aaf8eaf290f61a9fb228be899d055fc312de7ebd8a29e0688f82fbb629519db948737837df1e0aefe8b0ed0b304909f6149e97753dd6f50b791", |
|
410 |
+ "phone\/sounds\/incoming.ogg": "666a28d6d6dfa0afa0d1be3d838c9b207b91ac5ef46a787b05b30da622a611b4f734ef7512bff873d3e6025ed1bd1699ccc2970292b3ca21d29a58990ec96a73", |
|
411 |
+ "phone\/sounds\/outgoing.ogg": "b5d17d7a53e42215365176c8ce515bcc71fe682b92d6ee12a484d0b12d7f2a28b81db18b2d6e9073bd774728fe68becfa6c34b8648bca4a20a52622d7eef2fd5", |
|
412 |
+ "templates\/content\/index.php": "44ea4db27e9af9e1c61a2d6c8431b22d17dbec2e9c732201ac8b81d56ae9d85e37f68cd11f9de2f5936e8de3d240ac5ebd28296f5994411ffd35f01d9a4dcfc1", |
|
413 |
+ "templates\/index.php": "e1737e2207375f18a5d1b795f9cca76ac2acc20d569452081aa548c2980e3f1d2389afd483e59a29a600dfc766c764550c322c8de9ede58772b9d25f253674bb", |
|
414 |
+ "templates\/settings.php": "e311bb045304186403743ca156df317e467522cf4a9829a753b94ec792aad38d833ab4f36a5b92a7e3975d73345e8e7289a7ddf4bef145c9fc3a397d2c2a71ef" |
|
415 |
+ }, |
|
416 |
+ "signature": "FSsGLNMDTpqCDClOI1F7cjjnJ3\/y5SDWON\/NMhOasr5nmpTddHZf0w5yf28KuVzTrCd7UzYaRcWSb2Zah2IFhYHev1xy1V+rJA1Q07jSyOfqxNT9BpFXWmz1WOIRAaxNb24LaDGZcNsK3hniIMlhucH49eKytznjJuAJYxaVBv5DbnPTbCf4uRrr7hMm98S\/Pt6IM5PJ1OAFfFPCk\/baGy8iGZUve+xeXoGmxhuQnkyBcr0jlxKMtzcKB6zQduKhB\/7urbnj8lc0fm0ePWO+VyBPoM7K\/YU\/1w0kV6XABlzOyeQQ37io8W3udJcUkSy8KcJaECoaiyExlZGSdDQ5DLKuPGUI0I4vMOWa26Qa8SCDiiJGbqJCLfJfACXIO6tujBWKN1838HgTUCkzH8jIrkikcF5h4lJLxjjGqTeUv6pmJMc0NRx1sXNJHA3E7jQ11nST2Jl4kR1gv9SBv0ddxFCGKzpb7BpLlR11bz2w8JAlD7G6MPZnpouZCLh58EDXxb89rTuBVvBR+lh\/LoNwcIt0y07crClqFAghmkj89OiirhspsoDjOIXGuNJFCuRONW9mCzvLus+2jDcdyYLmikfc2+\/WrUH1xCMmBAfrehgacm8PERdHpXK6y7BCzD4aRDKw62rgB6HH2sIrz6\/KrgviOh3hGE4DPJfKP5cNodg=", |
|
417 |
+ "certificate": "-----BEGIN CERTIFICATE-----\r\nMIIECTCCAvECAhG7MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD\r\nVQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI\r\nMTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB\r\ndXRob3JpdHkwHhcNMjIwMjI1MTU1NzUxWhcNMzIwNjAyMTU1NzUxWjAZMRcwFQYD\r\nVQQDDA5zaXBfdHJpcF9waG9uZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC\r\nggIBALGXGrkLJY9XsqMXKDMLD4+Ub5HVr9HebfC2593+Ed41HVqIca9z3CdeXg87\r\npTjyZQhqsCzVArIJsmnH5pT02NYZDsZeARWpRLYWOIQeOJwS0EdOtWP6\/VXjxfw+\r\nUaDthCcfcj8TC7y+15zqwx9ERSc8ujXadGPqZEZAfGuZSy6b9+oXo17tT9fCbVeJ\r\nYyXibMWutUhIt8FvUQ2PCUYUity1kvn9+G3sOlPYMWDqPG3tt70EJ2m1J9ZX6Pa8\r\npmI8LG8IvFWImbX1\/+8YrtQZ0RQcoP7yX\/H6S8NvsAux\/sgMYNSEVbXzapE2TeMD\r\n1w0aEH3101twV+2cuKf8U+bt0Vha9HFNC06Nmu2lQkXPV\/Cdvx+DIKXhb3AaApgB\r\nT4uzRE4Zfg\/BZkspJ7IFObi2NpTv2T4frH3tZudOR\/OWtsGTpZbH8p12RK7yE19d\r\nMCR3DdVMe\/OXh1GaIc30s4jd6apskC33xZJ3IamyzY6EYLL41E2vmd9Eg6VMTGXJ\r\nHuOdAtJYy4R6040aDXfeNAnTcCVZQYmPvfnalQfcfiQePaWMyMVsBFy\/utq\/R\/qU\r\nTgtp68+jhvRH2YOxUVvuyrWhxY8PqhNHWlp5OYGllBdes5GrKvGIqnO\/q1nC6V5A\r\nHd+1SZSQJE1kQxpXxiDJeYBUQZUyBOiqM+GNfnZi+kVJ75YtAgMBAAEwDQYJKoZI\r\nhvcNAQELBQADggEBAIOJ8yPdp3vsRaOzsQCg8NdQgIDn9PZRtF0GjOPqVCOo\/ytx\r\nwIgdAiTAl1qvQaUjRSZf+qpYFPs\/Ojqd3DHi+ySPcq6PkkTWxkEpRmoaoFNAt0XA\r\nyOjSQhsBxuqFDmK+U6YvB\/QupGOSZipaBjQnaP5xufoiitIdRqd1XFHyBiNEfRt1\r\nQhLzrz\/u4PLaC6653qrl\/Jpd\/tp7LUtglihr4ODkALNQFWgY0n58tawkvTBaOpf2\r\nE3BfgleQKRa73g\/H3pGtUWtdXeTSkNHlxqef7l\/icwEDWqZfV8MIPRgEymG1naYL\r\nFIBUptO7eT+NDScFHKe4rtPK7FHhUjS7x4OcIao=\r\n-----END CERTIFICATE-----" |
|
418 |
+} |
|
0 | 419 |
\ No newline at end of file |
1 | 420 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,285 @@ |
1 |
+/** |
|
2 |
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com> |
|
3 |
+ * |
|
4 |
+ * @author Double Bastion LLC |
|
5 |
+ * |
|
6 |
+ * @license GNU AGPL version 3 or any later version |
|
7 |
+ * |
|
8 |
+ * This program is free software; you can redistribute it and/or |
|
9 |
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
10 |
+ * License as published by the Free Software Foundation; either |
|
11 |
+ * version 3 of the License, or any later version. |
|
12 |
+ * |
|
13 |
+ * This program is distributed in the hope that it will be useful, |
|
14 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
15 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
16 |
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
17 |
+ * |
|
18 |
+ * You should have received a copy of the GNU Affero General Public |
|
19 |
+ * License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
20 |
+ * |
|
21 |
+ */ |
|
22 |
+ |
|
23 |
+@font-face { |
|
24 |
+ font-family: 'Open Sans'; |
|
25 |
+ src: url('../fonts/opensans-light.woff2') format('woff2'), |
|
26 |
+ url('../fonts/opensans-light.woff') format('woff'); |
|
27 |
+ font-weight: 300; |
|
28 |
+ font-style: normal; |
|
29 |
+} |
|
30 |
+@font-face { |
|
31 |
+ font-family: 'Open Sans'; |
|
32 |
+ src: url('../fonts/opensans-lightitalic.woff2') format('woff2'), |
|
33 |
+ url('../fonts/opensans-lightitalic.woff') format('woff'); |
|
34 |
+ font-weight: 300; |
|
35 |
+ font-style: italic; |
|
36 |
+} |
|
37 |
+@font-face { |
|
38 |
+ font-family: 'Open Sans'; |
|
39 |
+ src: url('../fonts/opensans-regular.woff2') format('woff2'), |
|
40 |
+ url('../fonts/opensans-regular.woff') format('woff'); |
|
41 |
+ font-weight: 400; |
|
42 |
+ font-style: normal; |
|
43 |
+} |
|
44 |
+@font-face { |
|
45 |
+ font-family: 'Open Sans'; |
|
46 |
+ src: url('../fonts/opensans-italic.woff2') format('woff2'), |
|
47 |
+ url('../fonts/opensans-italic.woff') format('woff'); |
|
48 |
+ font-weight: 400; |
|
49 |
+ font-style: italic; |
|
50 |
+} |
|
51 |
+@font-face { |
|
52 |
+ font-family: 'Open Sans'; |
|
53 |
+ src: url('../fonts/opensans-semibold.woff2') format('woff2'), |
|
54 |
+ url('../fonts/opensans-semibold.woff') format('woff'); |
|
55 |
+ font-weight: 600; |
|
56 |
+ font-style: normal; |
|
57 |
+} |
|
58 |
+@font-face { |
|
59 |
+ font-family: 'Open Sans'; |
|
60 |
+ src: url('../fonts/opensans-semibolditalic.woff2') format('woff2'), |
|
61 |
+ url('../fonts/opensans-semibolditalic.woff') format('woff'); |
|
62 |
+ font-weight: 600; |
|
63 |
+ font-style: italic; |
|
64 |
+} |
|
65 |
+@font-face { |
|
66 |
+ font-family: 'Open Sans'; |
|
67 |
+ src: url('../fonts/opensans-bold.woff2') format('woff2'), |
|
68 |
+ url('../fonts/opensans-bold.woff') format('woff'); |
|
69 |
+ font-weight: 700; |
|
70 |
+ font-style: normal; |
|
71 |
+} |
|
72 |
+@font-face { |
|
73 |
+ font-family: 'Open Sans'; |
|
74 |
+ src: url('../fonts/opensans-bolditalic.woff2') format('woff2'), |
|
75 |
+ url('../fonts/opensans-bolditalic.woff') format('woff'); |
|
76 |
+ font-weight: 700; |
|
77 |
+ font-style: italic; |
|
78 |
+} |
|
79 |
+@font-face { |
|
80 |
+ font-family: 'Open Sans'; |
|
81 |
+ src: url('../fonts/opensans-extrabold.woff2') format('woff2'), |
|
82 |
+ url('../fonts/opensans-extrabold.woff') format('woff'); |
|
83 |
+ font-weight: 800; |
|
84 |
+ font-style: normal; |
|
85 |
+} |
|
86 |
+@font-face { |
|
87 |
+ font-family: 'Open Sans'; |
|
88 |
+ src: url('../fonts/opensans-extrabolditalic.woff2') format('woff2'), |
|
89 |
+ url('../fonts/opensans-extrabolditalic.woff') format('woff'); |
|
90 |
+ font-weight: 800; |
|
91 |
+ font-style: italic; |
|
92 |
+} |
|
93 |
+ |
|
94 |
+@font-face { |
|
95 |
+ font-family: 'Inter'; |
|
96 |
+ src: url('../fonts/Inter-Regular.woff2') format('woff2'), |
|
97 |
+ url('../fonts/Inter-Regular.woff') format('woff'); |
|
98 |
+ font-weight: 400; |
|
99 |
+ font-style: normal; |
|
100 |
+} |
|
101 |
+@font-face { |
|
102 |
+ font-family: 'Inter'; |
|
103 |
+ src: url('../fonts/Inter-Italic.woff2') format('woff2'), |
|
104 |
+ url('../fonts/Inter-Italic.woff') format('woff'); |
|
105 |
+ font-weight: 400; |
|
106 |
+ font-style: italic; |
|
107 |
+} |
|
108 |
+@font-face { |
|
109 |
+ font-family: 'Inter'; |
|
110 |
+ src: url('../fonts/Inter-Medium.woff2') format('woff2'), |
|
111 |
+ url('../fonts/Inter-Medium.woff') format('woff'); |
|
112 |
+ font-weight: 500; |
|
113 |
+ font-style: normal; |
|
114 |
+} |
|
115 |
+@font-face { |
|
116 |
+ font-family: 'Inter'; |
|
117 |
+ src: url('../fonts/Inter-MediumItalic.woff2') format('woff2'), |
|
118 |
+ url('../fonts/Inter-MediumItalic.woff') format('woff'); |
|
119 |
+ font-weight: 500; |
|
120 |
+ font-style: italic; |
|
121 |
+} |
|
122 |
+@font-face { |
|
123 |
+ font-family: 'Inter'; |
|
124 |
+ src: url('../fonts/Inter-SemiBold.woff2') format('woff2'), |
|
125 |
+ url('../fonts/Inter-SemiBold.woff') format('woff'); |
|
126 |
+ font-weight: 600; |
|
127 |
+ font-style: normal; |
|
128 |
+} |
|
129 |
+@font-face { |
|
130 |
+ font-family: 'Inter'; |
|
131 |
+ src: url('../fonts/Inter-SemiBoldItalic.woff2') format('woff2'), |
|
132 |
+ url('../fonts/Inter-SemiBoldItalic.woff') format('woff'); |
|
133 |
+ font-weight: 600; |
|
134 |
+ font-style: italic; |
|
135 |
+} |
|
136 |
+@font-face { |
|
137 |
+ font-family: 'Inter'; |
|
138 |
+ src: url('../fonts/Inter-Bold.woff2') format('woff2'), |
|
139 |
+ url('../fonts/Inter-Bold.woff') format('woff'); |
|
140 |
+ font-weight: 700; |
|
141 |
+ font-style: normal; |
|
142 |
+} |
|
143 |
+@font-face { |
|
144 |
+ font-family: 'Inter'; |
|
145 |
+ src: url('../fonts/Inter-BoldItalic.woff2') format('woff2'), |
|
146 |
+ url('../fonts/Inter-BoldItalic.woff') format('woff'); |
|
147 |
+ font-weight: 700; |
|
148 |
+ font-style: italic; |
|
149 |
+} |
|
150 |
+@font-face { |
|
151 |
+ font-family: 'Inter'; |
|
152 |
+ src: url('../fonts/Inter-ExtraBold.woff2') format('woff2'), |
|
153 |
+ url('../fonts/Inter-ExtraBold.woff') format('woff'); |
|
154 |
+ font-weight: 800; |
|
155 |
+ font-style: normal; |
|
156 |
+} |
|
157 |
+@font-face { |
|
158 |
+ font-family: 'Inter'; |
|
159 |
+ src: url('../fonts/Inter-ExtraBoldItalic.woff2') format('woff2'), |
|
160 |
+ url('../fonts/Inter-ExtraBoldItalic.woff') format('woff'); |
|
161 |
+ font-weight: 800; |
|
162 |
+ font-style: italic; |
|
163 |
+} |
|
164 |
+ |
|
165 |
+#app { |
|
166 |
+ position: relative; |
|
167 |
+ display: flex; |
|
168 |
+ min-height: 100%; |
|
169 |
+ min-width: 100%; |
|
170 |
+} |
|
171 |
+ |
|
172 |
+#app-content { |
|
173 |
+ position: relative; |
|
174 |
+ z-index: 1000; |
|
175 |
+ flex-basis: 100vw; |
|
176 |
+ min-width: 0; |
|
177 |
+ min-height: 100%; |
|
178 |
+ margin: 0 !important; |
|
179 |
+ overflow-y: scroll; |
|
180 |
+} |
|
181 |
+ |
|
182 |
+#app-content #app-content-wrapper { |
|
183 |
+ height: 100%; |
|
184 |
+} |
|
185 |
+ |
|
186 |
+#sip_trip_phone_adm { |
|
187 |
+ font-family: 'Open Sans'; |
|
188 |
+} |
|
189 |
+ |
|
190 |
+.sip_trip_box { |
|
191 |
+ display: block; |
|
192 |
+ width: 500px; |
|
193 |
+ font-family: 'Open Sans'; |
|
194 |
+} |
|
195 |
+ |
|
196 |
+#settings-dscr { |
|
197 |
+ padding-top: 3px; |
|
198 |
+ font-size: 15.6px; |
|
199 |
+} |
|
200 |
+ |
|
201 |
+#sip_trip_phone_save_msg { |
|
202 |
+ color: #181918; |
|
203 |
+ background-color: #a5e5b3; |
|
204 |
+ font-weight: bold; |
|
205 |
+ border-radius: 3px; |
|
206 |
+} |
|
207 |
+ |
|
208 |
+#STPhoneContent { |
|
209 |
+ display: block; |
|
210 |
+ position: relative; |
|
211 |
+ width: 100%; |
|
212 |
+ height: 100%; |
|
213 |
+} |
|
214 |
+ |
|
215 |
+#STPhoneGreyLogo { |
|
216 |
+ display: block; |
|
217 |
+ margin-top: -40px; |
|
218 |
+ position: relative; |
|
219 |
+ background-image: url('../img/sip_trip_phone_grey.svg'); |
|
220 |
+ background-repeat: no-repeat; |
|
221 |
+ background-position: center center; |
|
222 |
+ width: 100%; |
|
223 |
+ height: 100%; |
|
224 |
+} |
|
225 |
+ |
|
226 |
+#sipuserpassword { |
|
227 |
+ font-size: 12px; |
|
228 |
+} |
|
229 |
+ |
|
230 |
+#labelSipRealm, #stunServer, #debugLogging, #voiceNumbers, #dftVoiceNumber { |
|
231 |
+ width: 500px; |
|
232 |
+} |
|
233 |
+ |
|
234 |
+#voiceNumbers, #dftVoiceNumber { |
|
235 |
+ margin: 12px 0 0 0; |
|
236 |
+} |
|
237 |
+ |
|
238 |
+#tracesipmsg { |
|
239 |
+ cursor: pointer; |
|
240 |
+} |
|
241 |
+ |
|
242 |
+.stpVoicePhNoTip { |
|
243 |
+ position: relative; |
|
244 |
+ display: inline-block; |
|
245 |
+ z-index: 1000; |
|
246 |
+} |
|
247 |
+ |
|
248 |
+.stpdtVoicePhNoTip { |
|
249 |
+ position: relative; |
|
250 |
+ display: inline-block; |
|
251 |
+ z-index: 999; |
|
252 |
+} |
|
253 |
+ |
|
254 |
+#stpVoicePhNoInfo, #stpdtVoicePhNoInfo { |
|
255 |
+ display: inline; |
|
256 |
+ margin: 0px 0px 0px 8px; |
|
257 |
+ color: #5c8cbf; |
|
258 |
+ font-family: 'Inter'; |
|
259 |
+ font-weight: 800; |
|
260 |
+ font-size: 17px; |
|
261 |
+ vertical-align: top; |
|
262 |
+} |
|
263 |
+ |
|
264 |
+.stpVoicePhNoText, .stpdtVoicePhNoText { |
|
265 |
+ display: block; |
|
266 |
+ position: absolute; |
|
267 |
+ visibility: hidden; |
|
268 |
+ top: 16px; |
|
269 |
+ left: -110px; |
|
270 |
+ width: 370px; |
|
271 |
+ height: auto; |
|
272 |
+ padding: 6px 12px; |
|
273 |
+ color: #393939; |
|
274 |
+ font-size: 15px; |
|
275 |
+ font-weight: 600; |
|
276 |
+ border-radius: 6px; |
|
277 |
+ overflow-y: auto; |
|
278 |
+ background-color: #fafafa; |
|
279 |
+ box-shadow: 0 0 23px rgba(0, 0, 0, 0.1); |
|
280 |
+ -webkit-box-shadow: 0 0 23px rgba(0, 0, 0, 0.23); |
|
281 |
+} |
|
282 |
+ |
|
283 |
+.stpVoicePhNoTip:hover .stpVoicePhNoText, .stpdtVoicePhNoTip:hover .stpdtVoicePhNoText { |
|
284 |
+ visibility: visible; |
|
285 |
+} |
0 | 286 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,201 @@ |
1 |
+Apache License |
|
2 |
+ Version 2.0, January 2004 |
|
3 |
+ http://www.apache.org/licenses/ |
|
4 |
+ |
|
5 |
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION |
|
6 |
+ |
|
7 |
+ 1. Definitions. |
|
8 |
+ |
|
9 |
+ "License" shall mean the terms and conditions for use, reproduction, |
|
10 |
+ and distribution as defined by Sections 1 through 9 of this document. |
|
11 |
+ |
|
12 |
+ "Licensor" shall mean the copyright owner or entity authorized by |
|
13 |
+ the copyright owner that is granting the License. |
|
14 |
+ |
|
15 |
+ "Legal Entity" shall mean the union of the acting entity and all |
|
16 |
+ other entities that control, are controlled by, or are under common |
|
17 |
+ control with that entity. For the purposes of this definition, |
|
18 |
+ "control" means (i) the power, direct or indirect, to cause the |
|
19 |
+ direction or management of such entity, whether by contract or |
|
20 |
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the |
|
21 |
+ outstanding shares, or (iii) beneficial ownership of such entity. |
|
22 |
+ |
|
23 |
+ "You" (or "Your") shall mean an individual or Legal Entity |
|
24 |
+ exercising permissions granted by this License. |
|
25 |
+ |
|
26 |
+ "Source" form shall mean the preferred form for making modifications, |
|
27 |
+ including but not limited to software source code, documentation |
|
28 |
+ source, and configuration files. |
|
29 |
+ |
|
30 |
+ "Object" form shall mean any form resulting from mechanical |
|
31 |
+ transformation or translation of a Source form, including but |
|
32 |
+ not limited to compiled object code, generated documentation, |
|
33 |
+ and conversions to other media types. |
|
34 |
+ |
|
35 |
+ "Work" shall mean the work of authorship, whether in Source or |
|
36 |
+ Object form, made available under the License, as indicated by a |
|
37 |
+ copyright notice that is included in or attached to the work |
|
38 |
+ (an example is provided in the Appendix below). |
|
39 |
+ |
|
40 |
+ "Derivative Works" shall mean any work, whether in Source or Object |
|
41 |
+ form, that is based on (or derived from) the Work and for which the |
|
42 |
+ editorial revisions, annotations, elaborations, or other modifications |
|
43 |
+ represent, as a whole, an original work of authorship. For the purposes |
|
44 |
+ of this License, Derivative Works shall not include works that remain |
|
45 |
+ separable from, or merely link (or bind by name) to the interfaces of, |
|
46 |
+ the Work and Derivative Works thereof. |
|
47 |
+ |
|
48 |
+ "Contribution" shall mean any work of authorship, including |
|
49 |
+ the original version of the Work and any modifications or additions |
|
50 |
+ to that Work or Derivative Works thereof, that is intentionally |
|
51 |
+ submitted to Licensor for inclusion in the Work by the copyright owner |
|
52 |
+ or by an individual or Legal Entity authorized to submit on behalf of |
|
53 |
+ the copyright owner. For the purposes of this definition, "submitted" |
|
54 |
+ means any form of electronic, verbal, or written communication sent |
|
55 |
+ to the Licensor or its representatives, including but not limited to |
|
56 |
+ communication on electronic mailing lists, source code control systems, |
|
57 |
+ and issue tracking systems that are managed by, or on behalf of, the |
|
58 |
+ Licensor for the purpose of discussing and improving the Work, but |
|
59 |
+ excluding communication that is conspicuously marked or otherwise |
|
60 |
+ designated in writing by the copyright owner as "Not a Contribution." |
|
61 |
+ |
|
62 |
+ "Contributor" shall mean Licensor and any individual or Legal Entity |
|
63 |
+ on behalf of whom a Contribution has been received by Licensor and |
|
64 |
+ subsequently incorporated within the Work. |
|
65 |
+ |
|
66 |
+ 2. Grant of Copyright License. Subject to the terms and conditions of |
|
67 |
+ this License, each Contributor hereby grants to You a perpetual, |
|
68 |
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
|
69 |
+ copyright license to reproduce, prepare Derivative Works of, |
|
70 |
+ publicly display, publicly perform, sublicense, and distribute the |
|
71 |
+ Work and such Derivative Works in Source or Object form. |
|
72 |
+ |
|
73 |
+ 3. Grant of Patent License. Subject to the terms and conditions of |
|
74 |
+ this License, each Contributor hereby grants to You a perpetual, |
|
75 |
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
|
76 |
+ (except as stated in this section) patent license to make, have made, |
|
77 |
+ use, offer to sell, sell, import, and otherwise transfer the Work, |
|
78 |
+ where such license applies only to those patent claims licensable |
|
79 |
+ by such Contributor that are necessarily infringed by their |
|
80 |
+ Contribution(s) alone or by combination of their Contribution(s) |
|
81 |
+ with the Work to which such Contribution(s) was submitted. If You |
|
82 |
+ institute patent litigation against any entity (including a |
|
83 |
+ cross-claim or counterclaim in a lawsuit) alleging that the Work |
|
84 |
+ or a Contribution incorporated within the Work constitutes direct |
|
85 |
+ or contributory patent infringement, then any patent licenses |
|
86 |
+ granted to You under this License for that Work shall terminate |
|
87 |
+ as of the date such litigation is filed. |
|
88 |
+ |
|
89 |
+ 4. Redistribution. You may reproduce and distribute copies of the |
|
90 |
+ Work or Derivative Works thereof in any medium, with or without |
|
91 |
+ modifications, and in Source or Object form, provided that You |
|
92 |
+ meet the following conditions: |
|
93 |
+ |
|
94 |
+ (a) You must give any other recipients of the Work or |
|
95 |
+ Derivative Works a copy of this License; and |
|
96 |
+ |
|
97 |
+ (b) You must cause any modified files to carry prominent notices |
|
98 |
+ stating that You changed the files; and |
|
99 |
+ |
|
100 |
+ (c) You must retain, in the Source form of any Derivative Works |
|
101 |
+ that You distribute, all copyright, patent, trademark, and |
|
102 |
+ attribution notices from the Source form of the Work, |
|
103 |
+ excluding those notices that do not pertain to any part of |
|
104 |
+ the Derivative Works; and |
|
105 |
+ |
|
106 |
+ (d) If the Work includes a "NOTICE" text file as part of its |
|
107 |
+ distribution, then any Derivative Works that You distribute must |
|
108 |
+ include a readable copy of the attribution notices contained |
|
109 |
+ within such NOTICE file, excluding those notices that do not |
|
110 |
+ pertain to any part of the Derivative Works, in at least one |
|
111 |
+ of the following places: within a NOTICE text file distributed |
|
112 |
+ as part of the Derivative Works; within the Source form or |
|
113 |
+ documentation, if provided along with the Derivative Works; or, |
|
114 |
+ within a display generated by the Derivative Works, if and |
|
115 |
+ wherever such third-party notices normally appear. The contents |
|
116 |
+ of the NOTICE file are for informational purposes only and |
|
117 |
+ do not modify the License. You may add Your own attribution |
|
118 |
+ notices within Derivative Works that You distribute, alongside |
|
119 |
+ or as an addendum to the NOTICE text from the Work, provided |
|
120 |
+ that such additional attribution notices cannot be construed |
|
121 |
+ as modifying the License. |
|
122 |
+ |
|
123 |
+ You may add Your own copyright statement to Your modifications and |
|
124 |
+ may provide additional or different license terms and conditions |
|
125 |
+ for use, reproduction, or distribution of Your modifications, or |
|
126 |
+ for any such Derivative Works as a whole, provided Your use, |
|
127 |
+ reproduction, and distribution of the Work otherwise complies with |
|
128 |
+ the conditions stated in this License. |
|
129 |
+ |
|
130 |
+ 5. Submission of Contributions. Unless You explicitly state otherwise, |
|
131 |
+ any Contribution intentionally submitted for inclusion in the Work |
|
132 |
+ by You to the Licensor shall be under the terms and conditions of |
|
133 |
+ this License, without any additional terms or conditions. |
|
134 |
+ Notwithstanding the above, nothing herein shall supersede or modify |
|
135 |
+ the terms of any separate license agreement you may have executed |
|
136 |
+ with Licensor regarding such Contributions. |
|
137 |
+ |
|
138 |
+ 6. Trademarks. This License does not grant permission to use the trade |
|
139 |
+ names, trademarks, service marks, or product names of the Licensor, |
|
140 |
+ except as required for reasonable and customary use in describing the |
|
141 |
+ origin of the Work and reproducing the content of the NOTICE file. |
|
142 |
+ |
|
143 |
+ 7. Disclaimer of Warranty. Unless required by applicable law or |
|
144 |
+ agreed to in writing, Licensor provides the Work (and each |
|
145 |
+ Contributor provides its Contributions) on an "AS IS" BASIS, |
|
146 |
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
|
147 |
+ implied, including, without limitation, any warranties or conditions |
|
148 |
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A |
|
149 |
+ PARTICULAR PURPOSE. You are solely responsible for determining the |
|
150 |
+ appropriateness of using or redistributing the Work and assume any |
|
151 |
+ risks associated with Your exercise of permissions under this License. |
|
152 |
+ |
|
153 |
+ 8. Limitation of Liability. In no event and under no legal theory, |
|
154 |
+ whether in tort (including negligence), contract, or otherwise, |
|
155 |
+ unless required by applicable law (such as deliberate and grossly |
|
156 |
+ negligent acts) or agreed to in writing, shall any Contributor be |
|
157 |
+ liable to You for damages, including any direct, indirect, special, |
|
158 |
+ incidental, or consequential damages of any character arising as a |
|
159 |
+ result of this License or out of the use or inability to use the |
|
160 |
+ Work (including but not limited to damages for loss of goodwill, |
|
161 |
+ work stoppage, computer failure or malfunction, or any and all |
|
162 |
+ other commercial damages or losses), even if such Contributor |
|
163 |
+ has been advised of the possibility of such damages. |
|
164 |
+ |
|
165 |
+ 9. Accepting Warranty or Additional Liability. While redistributing |
|
166 |
+ the Work or Derivative Works thereof, You may choose to offer, |
|
167 |
+ and charge a fee for, acceptance of support, warranty, indemnity, |
|
168 |
+ or other liability obligations and/or rights consistent with this |
|
169 |
+ License. However, in accepting such obligations, You may act only |
|
170 |
+ on Your own behalf and on Your sole responsibility, not on behalf |
|
171 |
+ of any other Contributor, and only if You agree to indemnify, |
|
172 |
+ defend, and hold each Contributor harmless for any liability |
|
173 |
+ incurred by, or claims asserted against, such Contributor by reason |
|
174 |
+ of your accepting any such warranty or additional liability. |
|
175 |
+ |
|
176 |
+ END OF TERMS AND CONDITIONS |
|
177 |
+ |
|
178 |
+ APPENDIX: How to apply the Apache License to your work. |
|
179 |
+ |
|
180 |
+ To apply the Apache License to your work, attach the following |
|
181 |
+ boilerplate notice, with the fields enclosed by brackets "[]" |
|
182 |
+ replaced with your own identifying information. (Don't include |
|
183 |
+ the brackets!) The text should be enclosed in the appropriate |
|
184 |
+ comment syntax for the file format. We also recommend that a |
|
185 |
+ file or class name and description of purpose be included on the |
|
186 |
+ same "printed page" as the copyright notice for easier |
|
187 |
+ identification within third-party archives. |
|
188 |
+ |
|
189 |
+ Copyright [yyyy] [name of copyright owner] |
|
190 |
+ |
|
191 |
+ Licensed under the Apache License, Version 2.0 (the "License"); |
|
192 |
+ you may not use this file except in compliance with the License. |
|
193 |
+ You may obtain a copy of the License at |
|
194 |
+ |
|
195 |
+ http://www.apache.org/licenses/LICENSE-2.0 |
|
196 |
+ |
|
197 |
+ Unless required by applicable law or agreed to in writing, software |
|
198 |
+ distributed under the License is distributed on an "AS IS" BASIS, |
|
199 |
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
200 |
+ See the License for the specific language governing permissions and |
|
201 |
+ limitations under the License. |
|
0 | 202 |
\ No newline at end of file |
41 | 243 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,43 @@ |
1 |
+Copyright (c) 2016-2018 The Inter UI Project Authors (me@rsms.me) |
|
2 |
+ |
|
3 |
+This Font Software is licensed under the SIL Open Font License, Version 1.1. |
|
4 |
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL |
|
5 |
+ |
|
6 |
+----------------------------------------------------------- |
|
7 |
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 |
|
8 |
+----------------------------------------------------------- |
|
9 |
+ |
|
10 |
+PREAMBLE |
|
11 |
+The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. |
|
12 |
+ |
|
13 |
+The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. |
|
14 |
+ |
|
15 |
+DEFINITIONS |
|
16 |
+"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. |
|
17 |
+ |
|
18 |
+"Reserved Font Name" refers to any names specified as such after the copyright statement(s). |
|
19 |
+ |
|
20 |
+"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). |
|
21 |
+ |
|
22 |
+"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. |
|
23 |
+ |
|
24 |
+"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. |
|
25 |
+ |
|
26 |
+PERMISSION & CONDITIONS |
|
27 |
+Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: |
|
28 |
+ |
|
29 |
+1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. |
|
30 |
+ |
|
31 |
+2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. |
|
32 |
+ |
|
33 |
+3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. |
|
34 |
+ |
|
35 |
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. |
|
36 |
+ |
|
37 |
+5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. |
|
38 |
+ |
|
39 |
+TERMINATION |
|
40 |
+This license becomes null and void if any of the above conditions are not met. |
|
41 |
+ |
|
42 |
+DISCLAIMER |
|
43 |
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. |
|
0 | 44 |
\ No newline at end of file |
41 | 85 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,25 @@ |
1 |
+<svg xmlns="http://www.w3.org/2000/svg" height="32" width="32" viewBox="0 0 651.969 595.275"> |
|
2 |
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#000" d="M113.406,111.906c30.734-4.689,64.131,3.1,92.416,9.475 |
|
3 |
+ c36.794,8.293,45.683,10.828,78.762,26.146c5.057,2.341,9.07,4.507,14.123,7.067l14.185,7.921 |
|
4 |
+ c4.677,2.679,8.854,5.081,13.449,7.983l58.425,40.645c2.532,1.875,3.391,3.207,5.924,5.079 |
|
5 |
+ c19.231,14.213,53.181,46.569,68.746,66.94c19.037,24.916,38.834,59.874,52.98,88.355c20.814,41.903,19.193,83.425-2.061,124.552 |
|
6 |
+ c-6.235,12.065-11.105,21.389-23.638,28.783c-6.164,3.637-41.99,21.729-52.955,14.447c-1.514-1.005-4.607-4.254-6.104-5.772 |
|
7 |
+ l-52.337-66.728c-20.677-22.948-34.313-27.542,3.678-66.896c35.115-36.375,30.772-37.841,7.566-65.573 |
|
8 |
+ c-3.559-4.252-6.62-8.176-10.174-12.433c-9.222-11.049-23.292-25.528-33.632-34.945c-13.942-12.698-34.666-28.233-51.057-37.527 |
|
9 |
+ c-34.676-19.661-39.053-19.117-73.042-33.916c-21.556-9.386-26.274-0.263-36.167,13.015c-1.527,2.051-1.706,2.394-2.989,4.69 |
|
10 |
+ l-8.754,14.916c-28.74,48.771-32.576,35.297-62.255,23.269c-5.175-2.098-10.039-4.145-15.508-6.124l-16.298-5.988 |
|
11 |
+ c-5.572-1.826-10.201-4.045-15.745-5.802c-6.878-2.178-34.841-12.032-39.792-16.264c-9.491-8.112-4.02-44.98-2.186-53.438 |
|
12 |
+ c3.059-14.11,10.662-22.177,20.343-31.883C54.954,136.214,83.03,116.541,113.406,111.906z"/> |
|
13 |
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#000" d="M539.921,111.906c-30.733-4.689-64.131,3.1-92.415,9.475 |
|
14 |
+ c-36.794,8.293-45.683,10.828-78.762,26.146c-5.057,2.341-9.07,4.507-14.123,7.067l-14.185,7.921 |
|
15 |
+ c-4.678,2.679-8.854,5.081-13.449,7.983l-58.425,40.645c-2.533,1.875-3.391,3.207-5.924,5.079 |
|
16 |
+ c-19.232,14.213-53.181,46.569-68.746,66.94c-19.038,24.916-38.834,59.874-52.981,88.355 |
|
17 |
+ c-20.814,41.903-19.193,83.425,2.061,124.552c6.236,12.065,11.106,21.389,23.638,28.783c6.164,3.637,41.991,21.729,52.956,14.447 |
|
18 |
+ c1.514-1.005,4.607-4.254,6.104-5.772l52.337-66.728c20.676-22.948,34.313-27.542-3.679-66.896 |
|
19 |
+ c-35.115-36.375-30.771-37.841-7.566-65.573c3.559-4.252,6.62-8.176,10.174-12.433c9.223-11.049,23.292-25.528,33.632-34.945 |
|
20 |
+ c13.942-12.698,34.666-28.233,51.057-37.527c34.677-19.661,39.053-19.117,73.042-33.916c21.556-9.386,26.274-0.263,36.167,13.015 |
|
21 |
+ c1.527,2.051,1.706,2.394,2.989,4.69l8.754,14.916c28.74,48.771,32.577,35.297,62.255,23.269 |
|
22 |
+ c5.176-2.098,10.039-4.145,15.509-6.124l16.298-5.988c5.572-1.826,10.201-4.045,15.745-5.802 |
|
23 |
+ c6.878-2.178,34.841-12.032,39.792-16.264c9.491-8.112,4.02-44.98,2.187-53.438c-3.06-14.11-10.662-22.177-20.343-31.883 |
|
24 |
+ C598.374,136.214,570.298,116.541,539.921,111.906z"/> |
|
25 |
+</svg> |
0 | 26 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,25 @@ |
1 |
+<svg xmlns="http://www.w3.org/2000/svg" height="32" width="32" viewBox="0 0 651.969 595.275"> |
|
2 |
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#fff" d="M113.406,111.906c30.734-4.689,64.131,3.1,92.416,9.475 |
|
3 |
+ c36.794,8.293,45.683,10.828,78.762,26.146c5.057,2.341,9.07,4.507,14.123,7.067l14.185,7.921 |
|
4 |
+ c4.677,2.679,8.854,5.081,13.449,7.983l58.425,40.645c2.532,1.875,3.391,3.207,5.924,5.079 |
|
5 |
+ c19.231,14.213,53.181,46.569,68.746,66.94c19.037,24.916,38.834,59.874,52.98,88.355c20.814,41.903,19.193,83.425-2.061,124.552 |
|
6 |
+ c-6.235,12.065-11.105,21.389-23.638,28.783c-6.164,3.637-41.99,21.729-52.955,14.447c-1.514-1.005-4.607-4.254-6.104-5.772 |
|
7 |
+ l-52.337-66.728c-20.677-22.948-34.313-27.542,3.678-66.896c35.115-36.375,30.772-37.841,7.566-65.573 |
|
8 |
+ c-3.559-4.252-6.62-8.176-10.174-12.433c-9.222-11.049-23.292-25.528-33.632-34.945c-13.942-12.698-34.666-28.233-51.057-37.527 |
|
9 |
+ c-34.676-19.661-39.053-19.117-73.042-33.916c-21.556-9.386-26.274-0.263-36.167,13.015c-1.527,2.051-1.706,2.394-2.989,4.69 |
|
10 |
+ l-8.754,14.916c-28.74,48.771-32.576,35.297-62.255,23.269c-5.175-2.098-10.039-4.145-15.508-6.124l-16.298-5.988 |
|
11 |
+ c-5.572-1.826-10.201-4.045-15.745-5.802c-6.878-2.178-34.841-12.032-39.792-16.264c-9.491-8.112-4.02-44.98-2.186-53.438 |
|
12 |
+ c3.059-14.11,10.662-22.177,20.343-31.883C54.954,136.214,83.03,116.541,113.406,111.906z"/> |
|
13 |
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#fff" d="M539.921,111.906c-30.733-4.689-64.131,3.1-92.415,9.475 |
|
14 |
+ c-36.794,8.293-45.683,10.828-78.762,26.146c-5.057,2.341-9.07,4.507-14.123,7.067l-14.185,7.921 |
|
15 |
+ c-4.678,2.679-8.854,5.081-13.449,7.983l-58.425,40.645c-2.533,1.875-3.391,3.207-5.924,5.079 |
|
16 |
+ c-19.232,14.213-53.181,46.569-68.746,66.94c-19.038,24.916-38.834,59.874-52.981,88.355 |
|
17 |
+ c-20.814,41.903-19.193,83.425,2.061,124.552c6.236,12.065,11.106,21.389,23.638,28.783c6.164,3.637,41.991,21.729,52.956,14.447 |
|
18 |
+ c1.514-1.005,4.607-4.254,6.104-5.772l52.337-66.728c20.676-22.948,34.313-27.542-3.679-66.896 |
|
19 |
+ c-35.115-36.375-30.771-37.841-7.566-65.573c3.559-4.252,6.62-8.176,10.174-12.433c9.223-11.049,23.292-25.528,33.632-34.945 |
|
20 |
+ c13.942-12.698,34.666-28.233,51.057-37.527c34.677-19.661,39.053-19.117,73.042-33.916c21.556-9.386,26.274-0.263,36.167,13.015 |
|
21 |
+ c1.527,2.051,1.706,2.394,2.989,4.69l8.754,14.916c28.74,48.771,32.577,35.297,62.255,23.269 |
|
22 |
+ c5.176-2.098,10.039-4.145,15.509-6.124l16.298-5.988c5.572-1.826,10.201-4.045,15.745-5.802 |
|
23 |
+ c6.878-2.178,34.841-12.032,39.792-16.264c9.491-8.112,4.02-44.98,2.187-53.438c-3.06-14.11-10.662-22.177-20.343-31.883 |
|
24 |
+ C598.374,136.214,570.298,116.541,539.921,111.906z"/> |
|
25 |
+</svg> |
14 | 40 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,71 @@ |
1 |
+/** |
|
2 |
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com> |
|
3 |
+ * |
|
4 |
+ * @author Double Bastion LLC |
|
5 |
+ * |
|
6 |
+ * @license GNU AGPL version 3 or any later version |
|
7 |
+ * |
|
8 |
+ * This program is free software; you can redistribute it and/or |
|
9 |
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
10 |
+ * License as published by the Free Software Foundation; either |
|
11 |
+ * version 3 of the License, or any later version. |
|
12 |
+ * |
|
13 |
+ * This program is distributed in the hope that it will be useful, |
|
14 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
15 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
16 |
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
17 |
+ * |
|
18 |
+ * You should have received a copy of the GNU Affero General Public |
|
19 |
+ * License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
20 |
+ * |
|
21 |
+ */ |
|
22 |
+ |
|
23 |
+$(document).ready(function() { |
|
24 |
+ |
|
25 |
+ var baseUrl = OC.generateUrl('/apps/sip_trip_phone/user/getsettings'); |
|
26 |
+ var userid = "<?php p($userId); ?>"; |
|
27 |
+ |
|
28 |
+ $.ajax({ |
|
29 |
+ method: 'GET', |
|
30 |
+ url: baseUrl + '/' + userid, |
|
31 |
+ contentType: 'application/json', |
|
32 |
+ success: function(settingsdb) { |
|
33 |
+ |
|
34 |
+ var connectData = { |
|
35 |
+ "User" : settingsdb.sipusername, |
|
36 |
+ "Realm" : settingsdb.siprealm, |
|
37 |
+ "Display" : settingsdb.pdisplayname, |
|
38 |
+ "WSServer" : settingsdb.stphwssurl, |
|
39 |
+ "Stun" : settingsdb.stunserver, |
|
40 |
+ "Tracesipmsg" : settingsdb.tracesipmsg, |
|
41 |
+ "Voicenumbers" : settingsdb.voicenumbers, |
|
42 |
+ "Defaultvoicenumber" : settingsdb.defaultvoicenumber |
|
43 |
+ }; |
|
44 |
+ |
|
45 |
+ localStorage.setItem('SIPCreds', JSON.stringify(connectData)); |
|
46 |
+ |
|
47 |
+ var baseUrl = OC.generateUrl('/apps/sip_trip_phone/user/getsippass'); |
|
48 |
+ |
|
49 |
+ $.ajax({ |
|
50 |
+ method: 'GET', |
|
51 |
+ url: baseUrl + '/' + userid, |
|
52 |
+ contentType: 'text', |
|
53 |
+ success: function(sippassword) { |
|
54 |
+ |
|
55 |
+ var url = OC.generateUrl('/apps/sip_trip_phone/phone/index.html'); |
|
56 |
+ |
|
57 |
+ if (!localStorage.getItem('SipTripPhone')) { |
|
58 |
+ |
|
59 |
+ window.open(url, "SipTripPhone", "width=354,height=572,menubar=no,scrollbars=no,status=no,addressbar=no,resizable=no"); |
|
60 |
+ window.sipUserPasswd = sippassword; |
|
61 |
+ |
|
62 |
+ } else { |
|
63 |
+ window.alert('The phone is already open !'); |
|
64 |
+ } |
|
65 |
+ } |
|
66 |
+ |
|
67 |
+ }); |
|
68 |
+ } |
|
69 |
+ }); |
|
70 |
+}); |
|
71 |
+ |
0 | 72 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,86 @@ |
1 |
+/** |
|
2 |
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com> |
|
3 |
+ * |
|
4 |
+ * @author Double Bastion LLC |
|
5 |
+ * |
|
6 |
+ * @license GNU AGPL version 3 or any later version |
|
7 |
+ * |
|
8 |
+ * This program is free software; you can redistribute it and/or |
|
9 |
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
10 |
+ * License as published by the Free Software Foundation; either |
|
11 |
+ * version 3 of the License, or any later version. |
|
12 |
+ * |
|
13 |
+ * This program is distributed in the hope that it will be useful, |
|
14 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
15 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
16 |
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
17 |
+ * |
|
18 |
+ * You should have received a copy of the GNU Affero General Public |
|
19 |
+ * License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
20 |
+ * |
|
21 |
+ */ |
|
22 |
+ |
|
23 |
+$(document).ready(function() { |
|
24 |
+ |
|
25 |
+ $('#save_sipph_settings').on('click', function(event){ |
|
26 |
+ |
|
27 |
+ event.preventDefault(); |
|
28 |
+ OC.msg.startAction('#sip_trip_phone_save_msg', t('sip_trip_phone', 'Saved')); |
|
29 |
+ |
|
30 |
+ var baseUrl = OC.generateUrl('/apps/sip_trip_phone/user/updatesettings'); |
|
31 |
+ var userid = "<?php p($userId); ?>"; |
|
32 |
+ var checkedornot = 0; |
|
33 |
+ if ($("#tracesipmsg").is(":checked")) { checkedornot = 1; } |
|
34 |
+ |
|
35 |
+ var datatobesaved = { |
|
36 |
+ userId: userid, |
|
37 |
+ pdisplayname: $('#pdisplayname').val(), |
|
38 |
+ sipusername: $('#sipusername').val(), |
|
39 |
+ sipuserpassword: $('#sipuserpassword').val(), |
|
40 |
+ stphwssurl: $('#stphwssurl').val(), |
|
41 |
+ siprealm: $('#siprealm').val(), |
|
42 |
+ stunserver: $('#stunserver').val(), |
|
43 |
+ tracesipmsg: checkedornot, |
|
44 |
+ voicenumbers: $('#voicenumbers').val(), |
|
45 |
+ defaultvoicenumber: $('#defaultvoicenumber').val() |
|
46 |
+ }; |
|
47 |
+ |
|
48 |
+ $.ajax({ |
|
49 |
+ method: 'PUT', |
|
50 |
+ url: baseUrl + '/' + userid, |
|
51 |
+ contentType: 'application/json', |
|
52 |
+ data: JSON.stringify(datatobesaved), |
|
53 |
+ error: function(resp) { |
|
54 |
+ alert('Error ! Please check your settings !'); |
|
55 |
+ } |
|
56 |
+ |
|
57 |
+ }); |
|
58 |
+ |
|
59 |
+ }); |
|
60 |
+ |
|
61 |
+ var baseUrl = OC.generateUrl('/apps/sip_trip_phone/user/getsettings'); |
|
62 |
+ var userid = "<?php p($userId); ?>"; |
|
63 |
+ |
|
64 |
+ $.ajax({ |
|
65 |
+ method: 'GET', |
|
66 |
+ url: baseUrl + '/' + userid, |
|
67 |
+ contentType: 'application/json', |
|
68 |
+ success: function(settingsdb) { |
|
69 |
+ $("#pdisplayname").val(settingsdb.pdisplayname); |
|
70 |
+ $("#sipusername").val(settingsdb.sipusername); |
|
71 |
+ $("#sipuserpassword").val(settingsdb.sipuserpassword); |
|
72 |
+ $("#stphwssurl").val(settingsdb.stphwssurl); |
|
73 |
+ $("#siprealm").val(settingsdb.siprealm); |
|
74 |
+ $("#stunserver").val(settingsdb.stunserver); |
|
75 |
+ $('#voicenumbers').val(settingsdb.voicenumbers); |
|
76 |
+ $('#defaultvoicenumber').val(settingsdb.defaultvoicenumber); |
|
77 |
+ |
|
78 |
+ if (settingsdb.tracesipmsg == 1) { |
|
79 |
+ $('#tracesipmsg').attr('checked', true); |
|
80 |
+ } else { |
|
81 |
+ $('#tracesipmsg').attr('checked', false); |
|
82 |
+ } |
|
83 |
+ } |
|
84 |
+ }); |
|
85 |
+ |
|
86 |
+}); |
0 | 87 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,18 @@ |
1 |
+OC.L10N.register( |
|
2 |
+ "sip_trip_phone", |
|
3 |
+ { |
|
4 |
+ "Settings" : "Settings", |
|
5 |
+ "SIP Trip Phone" : "SIP Trip Phone", |
|
6 |
+ "Enter your credentials in the fields from below:" : "Enter your credentials in the fields from below:", |
|
7 |
+ "Display Name:" : "Display Name:", |
|
8 |
+ "SIP User:" : "SIP User:", |
|
9 |
+ "SIP User Password:" : "SIP User Password:", |
|
10 |
+ "WSS URL:" : "WSS URL:", |
|
11 |
+ "SIP Realm (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):" : "SIP Realm (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):", |
|
12 |
+ "STUN Server's IPv4 address and port number or domain and port number (optional):" : "STUN Server's IPv4 address and port number or domain and port number (optional):", |
|
13 |
+ "Show debug logging in my browser's console:" : "Show debug logging in my browser's console:", |
|
14 |
+ "Available phone number(s):" : "Available phone number(s):", |
|
15 |
+ "Default phone number for outgoing calls (optional):" : "Default phone number for outgoing calls (optional):", |
|
16 |
+ "Save" : "Save" |
|
17 |
+}, |
|
18 |
+"nplurals=2; plural=(n != 1);"); |
0 | 19 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,16 @@ |
1 |
+{ "translations": { |
|
2 |
+ "Settings" : "Settings", |
|
3 |
+ "SIP Trip Phone" : "SIP Trip Phone", |
|
4 |
+ "Enter your credentials in the fields from below:" : "Enter your credentials in the fields from below:", |
|
5 |
+ "Display Name:" : "Display Name:", |
|
6 |
+ "SIP User:" : "SIP User:", |
|
7 |
+ "SIP User Password:" : "SIP User Password:", |
|
8 |
+ "WSS URL:" : "WSS URL:", |
|
9 |
+ "SIP Realm (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):" : "SIP Realm (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):", |
|
10 |
+ "STUN Server's IPv4 address and port number or domain and port number (optional):" : "STUN Server's IPv4 address and port number or domain and port number (optional):", |
|
11 |
+ "Show debug logging in my browser's console:" : "Show debug logging in my browser's console:", |
|
12 |
+ "Available phone number(s):" : "Available phone number(s):", |
|
13 |
+ "Default phone number for outgoing calls (optional):" : "Default phone number for outgoing calls (optional):", |
|
14 |
+ "Save" : "Save" |
|
15 |
+},"pluralForm" :"nplurals=2; plural=(n != 1);" |
|
16 |
+} |
0 | 17 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,18 @@ |
1 |
+OC.L10N.register( |
|
2 |
+ "sip_trip_phone", |
|
3 |
+ { |
|
4 |
+ "Settings" : "Settings", |
|
5 |
+ "SIP Trip Phone" : "SIP Trip Phone", |
|
6 |
+ "Enter your credentials in the fields from below:" : "Enter your credentials in the fields from below:", |
|
7 |
+ "Display Name:" : "Display Name:", |
|
8 |
+ "SIP User:" : "SIP User:", |
|
9 |
+ "SIP User Password:" : "SIP User Password:", |
|
10 |
+ "WSS URL:" : "WSS URL:", |
|
11 |
+ "SIP Realm (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):" : "SIP Realm (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):", |
|
12 |
+ "STUN Server's IPv4 address and port number or domain and port number (optional):" : "STUN Server's IPv4 address and port number or domain and port number (optional):", |
|
13 |
+ "Show debug logging in my browser's console:" : "Show debug logging in my browser's console:", |
|
14 |
+ "Available phone number(s):" : "Available phone number(s):", |
|
15 |
+ "Default phone number for outgoing calls (optional):" : "Default phone number for outgoing calls (optional):", |
|
16 |
+ "Save" : "Save" |
|
17 |
+}, |
|
18 |
+"nplurals=2; plural=(n != 1);"); |
0 | 19 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,16 @@ |
1 |
+{ "translations": { |
|
2 |
+ "Settings" : "Settings", |
|
3 |
+ "SIP Trip Phone" : "SIP Trip Phone", |
|
4 |
+ "Enter your credentials in the fields from below:" : "Enter your credentials in the fields from below:", |
|
5 |
+ "Display Name:" : "Display Name:", |
|
6 |
+ "SIP User:" : "SIP User:", |
|
7 |
+ "SIP User Password:" : "SIP User Password:", |
|
8 |
+ "WSS URL:" : "WSS URL:", |
|
9 |
+ "SIP Realm (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):" : "SIP Realm (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):", |
|
10 |
+ "STUN Server's IPv4 address and port number or domain and port number (optional):" : "STUN Server's IPv4 address and port number or domain and port number (optional):", |
|
11 |
+ "Show debug logging in my browser's console:" : "Show debug logging in my browser's console:", |
|
12 |
+ "Available phone number(s):" : "Available phone number(s):", |
|
13 |
+ "Default phone number for outgoing calls (optional):" : "Default phone number for outgoing calls (optional):", |
|
14 |
+ "Save" : "Save" |
|
15 |
+},"pluralForm" :"nplurals=2; plural=(n != 1);" |
|
16 |
+} |
0 | 17 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,70 @@ |
1 |
+<?php |
|
2 |
+/** |
|
3 |
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com> |
|
4 |
+ * |
|
5 |
+ * @author Double Bastion LLC |
|
6 |
+ * |
|
7 |
+ * @license GNU AGPL version 3 or any later version |
|
8 |
+ * |
|
9 |
+ * This program is free software; you can redistribute it and/or |
|
10 |
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
11 |
+ * License as published by the Free Software Foundation; either |
|
12 |
+ * version 3 of the License, or any later version. |
|
13 |
+ * |
|
14 |
+ * This program is distributed in the hope that it will be useful, |
|
15 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
16 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
17 |
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
18 |
+ * |
|
19 |
+ * You should have received a copy of the GNU Affero General Public |
|
20 |
+ * License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
21 |
+ * |
|
22 |
+ */ |
|
23 |
+ |
|
24 |
+declare(strict_types=1); |
|
25 |
+ |
|
26 |
+namespace OCA\SIPTripPhone\Controller; |
|
27 |
+ |
|
28 |
+use OCP\IRequest; |
|
29 |
+use OCP\AppFramework\Controller; |
|
30 |
+use OCA\SIPTripPhone\Service\SphoneService; |
|
31 |
+ |
|
32 |
+ |
|
33 |
+class SphoneController extends Controller { |
|
34 |
+ |
|
35 |
+ private $service; |
|
36 |
+ private $userId; |
|
37 |
+ |
|
38 |
+ public function __construct($appName, IRequest $request, SphoneService $service, $userId) { |
|
39 |
+ parent::__construct($appName, $request); |
|
40 |
+ $this->service = $service; |
|
41 |
+ $this->userId = $userId; |
|
42 |
+ } |
|
43 |
+ |
|
44 |
+ |
|
45 |
+ /** |
|
46 |
+ * @NoAdminRequired |
|
47 |
+ */ |
|
48 |
+ public function getsettings($userId) { |
|
49 |
+ |
|
50 |
+ return $this->service->getsettings($this->userId); |
|
51 |
+ } |
|
52 |
+ |
|
53 |
+ /** |
|
54 |
+ * @NoAdminRequired |
|
55 |
+ */ |
|
56 |
+ public function getsippass($userId) { |
|
57 |
+ |
|
58 |
+ return $this->service->getsippass($this->userId); |
|
59 |
+ } |
|
60 |
+ |
|
61 |
+ /** |
|
62 |
+ * @NoAdminRequired |
|
63 |
+ */ |
|
64 |
+ public function updatesettings(string $userId, string $pdisplayname, string $sipusername, string $sipuserpassword, string $stphwssurl, string $siprealm, string $stunserver, int $tracesipmsg, string $voicenumbers, string $defaultvoicenumber) { |
|
65 |
+ |
|
66 |
+ return $this->service->updatesettings($this->userId, $pdisplayname, $sipusername, $sipuserpassword, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber); |
|
67 |
+ |
|
68 |
+ } |
|
69 |
+ |
|
70 |
+} |
0 | 71 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,128 @@ |
1 |
+<?php |
|
2 |
+/** |
|
3 |
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com> |
|
4 |
+ * |
|
5 |
+ * @author Double Bastion LLC |
|
6 |
+ * |
|
7 |
+ * @license GNU AGPL version 3 or any later version |
|
8 |
+ * |
|
9 |
+ * This program is free software; you can redistribute it and/or |
|
10 |
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
11 |
+ * License as published by the Free Software Foundation; either |
|
12 |
+ * version 3 of the License, or any later version. |
|
13 |
+ * |
|
14 |
+ * This program is distributed in the hope that it will be useful, |
|
15 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
16 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
17 |
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
18 |
+ * |
|
19 |
+ * You should have received a copy of the GNU Affero General Public |
|
20 |
+ * License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
21 |
+ * |
|
22 |
+ */ |
|
23 |
+ |
|
24 |
+declare(strict_types=1); |
|
25 |
+ |
|
26 |
+namespace OCA\SIPTripPhone\Migration; |
|
27 |
+ |
|
28 |
+use Closure; |
|
29 |
+use OCP\DB\Types; |
|
30 |
+use OCP\DB\ISchemaWrapper; |
|
31 |
+use OCP\Migration\IOutput; |
|
32 |
+use OCP\Migration\SimpleMigrationStep; |
|
33 |
+ |
|
34 |
+ |
|
35 |
+class Version112Date20240108213517 extends SimpleMigrationStep { |
|
36 |
+ /** |
|
37 |
+ * @param IOutput $output |
|
38 |
+ * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` |
|
39 |
+ * @param array $options |
|
40 |
+ * @return null|ISchemaWrapper |
|
41 |
+ */ |
|
42 |
+ public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper { |
|
43 |
+ /** @var ISchemaWrapper $schema */ |
|
44 |
+ $schema = $schemaClosure(); |
|
45 |
+ |
|
46 |
+ if (!$schema->hasTable('sip_trip_phone')) { |
|
47 |
+ $table = $schema->createTable('sip_trip_phone'); |
|
48 |
+ $table->addColumn('id', Types::BIGINT, [ |
|
49 |
+ 'autoincrement' => true, |
|
50 |
+ 'notnull' => true, |
|
51 |
+ 'length' => 11, |
|
52 |
+ 'unsigned' => true, |
|
53 |
+ ]); |
|
54 |
+ $table->addColumn('user_id', Types::STRING, [ |
|
55 |
+ 'notnull' => true, |
|
56 |
+ 'length' => 64, |
|
57 |
+ 'default' => '', |
|
58 |
+ ]); |
|
59 |
+ $table->addColumn('pdisplayname', Types::STRING, [ |
|
60 |
+ 'notnull' => true, |
|
61 |
+ 'length' => 128, |
|
62 |
+ 'default' => '', |
|
63 |
+ ]); |
|
64 |
+ $table->addColumn('sipusername', Types::STRING, [ |
|
65 |
+ 'notnull' => true, |
|
66 |
+ 'length' => 128, |
|
67 |
+ 'default' => '', |
|
68 |
+ ]); |
|
69 |
+ $table->addColumn('sipuserpassword', Types::STRING, [ |
|
70 |
+ 'notnull' => true, |
|
71 |
+ 'length' => 2048, |
|
72 |
+ 'default' => '', |
|
73 |
+ ]); |
|
74 |
+ $table->addColumn('stphwssurl', Types::STRING, [ |
|
75 |
+ 'notnull' => true, |
|
76 |
+ 'length' => 128, |
|
77 |
+ 'default' => '', |
|
78 |
+ ]); |
|
79 |
+ $table->addColumn('siprealm', Types::STRING, [ |
|
80 |
+ 'notnull' => true, |
|
81 |
+ 'length' => 64, |
|
82 |
+ 'default' => '', |
|
83 |
+ ]); |
|
84 |
+ $table->addColumn('stunserver', Types::STRING, [ |
|
85 |
+ 'notnull' => false, |
|
86 |
+ 'length' => 256, |
|
87 |
+ 'default' => '', |
|
88 |
+ ]); |
|
89 |
+ $table->addColumn('tracesipmsg', Types::SMALLINT, [ |
|
90 |
+ 'notnull' => false, |
|
91 |
+ 'length' => 1, |
|
92 |
+ ]); |
|
93 |
+ $table->addColumn('voicenumbers', Types::STRING, [ |
|
94 |
+ 'notnull' => false, |
|
95 |
+ 'length' => 2048, |
|
96 |
+ 'default' => '', |
|
97 |
+ ]); |
|
98 |
+ $table->addColumn('defaultvoicenumber', Types::STRING, [ |
|
99 |
+ 'notnull' => false, |
|
100 |
+ 'length' => 48, |
|
101 |
+ 'default' => '', |
|
102 |
+ ]); |
|
103 |
+ $table->setPrimaryKey(['id']); |
|
104 |
+ $table->addUniqueIndex(['id']); |
|
105 |
+ |
|
106 |
+ } else { |
|
107 |
+ |
|
108 |
+ $table = $schema->getTable('sip_trip_phone'); |
|
109 |
+ |
|
110 |
+ $table->addColumn('tracesipmsg', Types::SMALLINT, [ |
|
111 |
+ 'notnull' => false, |
|
112 |
+ 'length' => 1, |
|
113 |
+ ]); |
|
114 |
+ $table->addColumn('voicenumbers', Types::STRING, [ |
|
115 |
+ 'notnull' => false, |
|
116 |
+ 'length' => 2048, |
|
117 |
+ 'default' => '', |
|
118 |
+ ]); |
|
119 |
+ $table->addColumn('defaultvoicenumber', Types::STRING, [ |
|
120 |
+ 'notnull' => false, |
|
121 |
+ 'length' => 48, |
|
122 |
+ 'default' => '', |
|
123 |
+ ]); |
|
124 |
+ } |
|
125 |
+ |
|
126 |
+ return $schema; |
|
127 |
+ } |
|
128 |
+} |
0 | 129 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,148 @@ |
1 |
+<?php |
|
2 |
+/** |
|
3 |
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com> |
|
4 |
+ * |
|
5 |
+ * @author Double Bastion LLC |
|
6 |
+ * |
|
7 |
+ * @license GNU AGPL version 3 or any later version |
|
8 |
+ * |
|
9 |
+ * This program is free software; you can redistribute it and/or |
|
10 |
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
11 |
+ * License as published by the Free Software Foundation; either |
|
12 |
+ * version 3 of the License, or any later version. |
|
13 |
+ * |
|
14 |
+ * This program is distributed in the hope that it will be useful, |
|
15 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
16 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
17 |
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
18 |
+ * |
|
19 |
+ * You should have received a copy of the GNU Affero General Public |
|
20 |
+ * License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
21 |
+ * |
|
22 |
+ */ |
|
23 |
+ |
|
24 |
+declare(strict_types=1); |
|
25 |
+ |
|
26 |
+namespace OCA\SIPTripPhone\Service; |
|
27 |
+ |
|
28 |
+use OCP\DB\QueryBuilder\IQueryBuilder; |
|
29 |
+use OCP\IDBConnection; |
|
30 |
+use OCP\Security\ICrypto; |
|
31 |
+use function OCP\Log\logger; |
|
32 |
+ |
|
33 |
+class SphoneService { |
|
34 |
+ |
|
35 |
+ private $connection; |
|
36 |
+ private $crypto; |
|
37 |
+ |
|
38 |
+ public function __construct(IDBConnection $connection, ICrypto $crypto) { |
|
39 |
+ $this->connection = $connection; |
|
40 |
+ $this->crypto = $crypto; |
|
41 |
+ } |
|
42 |
+ |
|
43 |
+ /** |
|
44 |
+ * @NoAdminRequired |
|
45 |
+ * |
|
46 |
+ */ |
|
47 |
+ public function getsettings($userId) { |
|
48 |
+ |
|
49 |
+ $sql = $this->connection->prepare(' |
|
50 |
+ SELECT `id`, `user_id`, `pdisplayname`, `sipusername`, `sipuserpassword`, `stphwssurl`, `siprealm`, `stunserver`, `tracesipmsg`, `voicenumbers`, `defaultvoicenumber` |
|
51 |
+ FROM `*PREFIX*sip_trip_phone` |
|
52 |
+ WHERE `user_id` = ?'); |
|
53 |
+ $result = $sql->execute([$userId]); |
|
54 |
+ $settingsdb = $result->fetch(); |
|
55 |
+ $result->closeCursor(); |
|
56 |
+ |
|
57 |
+ if ($settingsdb) { |
|
58 |
+ if ($settingsdb['sipuserpassword'] != '' && $settingsdb['sipuserpassword'] != null && $settingsdb['sipuserpassword'] != 'undefined') { |
|
59 |
+ $settingsdb['sipuserpassword'] = "%20%20%20%20%20%20%20"; |
|
60 |
+ } else { $settingsdb['sipuserpassword'] = ''; } |
|
61 |
+ |
|
62 |
+ return $settingsdb; |
|
63 |
+ } |
|
64 |
+ } |
|
65 |
+ |
|
66 |
+ /** |
|
67 |
+ * @NoAdminRequired |
|
68 |
+ * |
|
69 |
+ */ |
|
70 |
+ public function getsippass($userId) { |
|
71 |
+ |
|
72 |
+ $sqlps = $this->connection->prepare(' |
|
73 |
+ SELECT `id`, `user_id`, `sipuserpassword` |
|
74 |
+ FROM `*PREFIX*sip_trip_phone` |
|
75 |
+ WHERE `user_id` = ?'); |
|
76 |
+ $resultps = $sqlps->execute([$userId]); |
|
77 |
+ $settingsdb = $resultps->fetch(); |
|
78 |
+ $resultps->closeCursor(); |
|
79 |
+ |
|
80 |
+ if ($settingsdb) { |
|
81 |
+ if ($settingsdb['sipuserpassword'] != '' && $settingsdb['sipuserpassword'] != null && $settingsdb['sipuserpassword'] != 'undefined') { |
|
82 |
+ $sipuserpassworddecr = $this->crypto->decrypt($settingsdb['sipuserpassword']); |
|
83 |
+ $sippassword = $sipuserpassworddecr; |
|
84 |
+ } |
|
85 |
+ |
|
86 |
+ return $sippassword; |
|
87 |
+ } |
|
88 |
+ } |
|
89 |
+ |
|
90 |
+ /** |
|
91 |
+ * @NoAdminRequired |
|
92 |
+ * |
|
93 |
+ */ |
|
94 |
+ public function updatesettings($userId, $pdisplayname, $sipusername, $sipuserpassword, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber) { |
|
95 |
+ |
|
96 |
+ // Validate the data entered in the fields on the settings page |
|
97 |
+ if (mb_strlen($pdisplayname) > 128) { logger('sip_trip_phone')->error("The 'Display Name' cannot exceed 128 characters!"); exit(); } |
|
98 |
+ if (!preg_match('/^[a-zA-Z0-9\*\#]+$/', $sipusername)) { logger('sip_trip_phone')->error("The 'SIP User' that you entered is not valid. The 'SIP User' must contain only alphanumeric characters, asterisks (*) and number signs (#).)"); exit(); } |
|
99 |
+ if (mb_strlen($sipuserpassword) > 300) { logger('sip_trip_phone')->error("The 'SIP User Password' cannot exceed 300 characters!"); exit(); } |
|
100 |
+ if (filter_var($stphwssurl, FILTER_VALIDATE_URL) == false) { logger('sip_trip_phone')->error("The 'WSS URL' that you entered is not valid."); exit(); } |
|
101 |
+ if (filter_var($siprealm, FILTER_VALIDATE_IP) == false && filter_var($siprealm, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME) == false) { logger('sip_trip_phone')->error("The 'SIP Realm' that you entered is not valid."); exit(); } |
|
102 |
+ if ($stunserver != '') { |
|
103 |
+ $stunIpDom = explode(":", $stunserver); |
|
104 |
+ if ((filter_var($stunIpDom[0], FILTER_VALIDATE_IP) == false && filter_var($stunIpDom[0], FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME) == false) || !preg_match('/^[0-9]+$/', $stunIpDom[1])) { logger('sip_trip_phone')->error("The 'STUN Server' that you entered is not valid."); exit(); } |
|
105 |
+ } |
|
106 |
+ if (!preg_match('/^[a-zA-Z0-9\040\+\,\:]*$/', $voicenumbers)) { logger('sip_trip_phone')->error("The 'Available phone numbers' that you entered are not valid. The 'Available phone numbers' must contain only alphanumeric characters, colons (:), spaces, plus signs (+), digits (0-9) and commas (,)."); exit(); } |
|
107 |
+ if (!preg_match('/^[a-zA-Z0-9\040\+\:]*$/', $defaultvoicenumber)) { logger('sip_trip_phone')->error("The 'Default phone number for outgoing calls' that you entered is not valid. The 'Default phone number for outgoing calls' must contain only alphanumeric characters, a colon (:), a space, a plus sign (+) and digits (0-9)."); exit(); } |
|
108 |
+ |
|
109 |
+ $sqlup = $this->connection->prepare(' |
|
110 |
+ SELECT `id`, `user_id`, `pdisplayname`, `sipusername`, `sipuserpassword`, `stphwssurl`, `siprealm`, `stunserver`, `tracesipmsg`, `voicenumbers`, `defaultvoicenumber` |
|
111 |
+ FROM `*PREFIX*sip_trip_phone` |
|
112 |
+ WHERE `user_id` = ?'); |
|
113 |
+ $resultup = $sqlup->execute([$userId]); |
|
114 |
+ $row = $resultup->fetch(); |
|
115 |
+ $resultup->closeCursor(); |
|
116 |
+ |
|
117 |
+ if ($resultup && !$row) { |
|
118 |
+ |
|
119 |
+ if ($sipuserpassword != '') { |
|
120 |
+ $sipuserpasswordenc = $this->crypto->encrypt($sipuserpassword); |
|
121 |
+ } else { $sipuserpasswordenc = ''; } |
|
122 |
+ |
|
123 |
+ $sqlins = $this->connection->prepare(' |
|
124 |
+ INSERT INTO `*PREFIX*sip_trip_phone` |
|
125 |
+ (`user_id`, `pdisplayname`, `sipusername`, `sipuserpassword`, `stphwssurl`, `siprealm`, `stunserver`, `tracesipmsg`, `voicenumbers`, `defaultvoicenumber`) |
|
126 |
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'); |
|
127 |
+ $sqlins->execute([$userId, $pdisplayname, $sipusername, $sipuserpasswordenc, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber]); |
|
128 |
+ |
|
129 |
+ } elseif ($resultup && $row) { |
|
130 |
+ |
|
131 |
+ if ($sipuserpassword != '' && $sipuserpassword != "%20%20%20%20%20%20%20") { |
|
132 |
+ $sipuserpasswordenc = $this->crypto->encrypt($sipuserpassword); |
|
133 |
+ } elseif ($sipuserpassword == "%20%20%20%20%20%20%20") { |
|
134 |
+ $sipuserpasswordenc = $row['sipuserpassword']; |
|
135 |
+ } elseif ($sipuserpassword == '') { |
|
136 |
+ $sipuserpasswordenc = ''; |
|
137 |
+ } |
|
138 |
+ |
|
139 |
+ $sqlup = $this->connection->prepare(' |
|
140 |
+ UPDATE `*PREFIX*sip_trip_phone` |
|
141 |
+ SET `pdisplayname` = ?, `sipusername` = ?, `sipuserpassword` = ?, `stphwssurl` = ?, `siprealm` = ?, `stunserver` = ?, `tracesipmsg` = ?, `voicenumbers` = ?, `defaultvoicenumber` = ? |
|
142 |
+ WHERE `user_id` = ?'); |
|
143 |
+ $updateRes = $sqlup->execute([$pdisplayname, $sipusername, $sipuserpasswordenc, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber, $userId]); |
|
144 |
+ $updateRes->closeCursor(); |
|
145 |
+ |
|
146 |
+ } |
|
147 |
+ } |
|
148 |
+} |
0 | 149 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,292 @@ |
1 |
+/* |
|
2 |
+ @copyright 2021 Double Bastion LLC <www.doublebastion.com> |
|
3 |
+ |
|
4 |
+ @author Double Bastion LLC |
|
5 |
+ |
|
6 |
+ @license GNU AGPL version 3 or any later version |
|
7 |
+ |
|
8 |
+ This program is free software; you can redistribute it and/or |
|
9 |
+ modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
10 |
+ License as published by the Free Software Foundation; either |
|
11 |
+ version 3 of the License, or any later version. |
|
12 |
+ |
|
13 |
+ This program is distributed in the hope that it will be useful, |
|
14 |
+ but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
15 |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
16 |
+ GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
17 |
+ |
|
18 |
+ You should have received a copy of the GNU Affero General Public |
|
19 |
+ License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
20 |
+ |
|
21 |
+ |
|
22 |
+ |
|
23 |
+ This is a modified version of the original "ctxSip.css" file. |
|
24 |
+ |
|
25 |
+ Below is the copyright notice of ctxSip phone (https://github.com/collecttix/ctxSip) |
|
26 |
+ which also applies to the original "ctxSip.css" file, which was part of ctxSip phone: |
|
27 |
+ |
|
28 |
+ |
|
29 |
+ The MIT License (MIT) |
|
30 |
+ |
|
31 |
+ Copyright (c) 2014 Collecttix |
|
32 |
+ |
|
33 |
+ Permission is hereby granted, free of charge, to any person obtaining a copy |
|
34 |
+ of this software and associated documentation files (the "Software"), to deal |
|
35 |
+ in the Software without restriction, including without limitation the rights |
|
36 |
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
37 |
+ copies of the Software, and to permit persons to whom the Software is |
|
38 |
+ furnished to do so, subject to the following conditions: |
|
39 |
+ |
|
40 |
+ The above copyright notice and this permission notice shall be included in |
|
41 |
+ all copies or substantial portions of the Software. |
|
42 |
+ |
|
43 |
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
44 |
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
45 |
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
46 |
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
47 |
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
48 |
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|
49 |
+ THE SOFTWARE. |
|
50 |
+*/ |
|
51 |
+ |
|
52 |
+@font-face { |
|
53 |
+ font-family: 'Inter'; |
|
54 |
+ src: url('../../fonts/Inter-Regular.woff2') format('woff2'), |
|
55 |
+ url('../../fonts/Inter-Regular.woff') format('woff'); |
|
56 |
+ font-weight: 400; |
|
57 |
+ font-style: normal; |
|
58 |
+} |
|
59 |
+@font-face { |
|
60 |
+ font-family: 'Inter'; |
|
61 |
+ src: url('../../fonts/Inter-Italic.woff2') format('woff2'), |
|
62 |
+ url('../../fonts/Inter-Italic.woff') format('woff'); |
|
63 |
+ font-weight: 400; |
|
64 |
+ font-style: italic; |
|
65 |
+} |
|
66 |
+@font-face { |
|
67 |
+ font-family: 'Inter'; |
|
68 |
+ src: url('../../fonts/Inter-Medium.woff2') format('woff2'), |
|
69 |
+ url('../../fonts/Inter-Medium.woff') format('woff'); |
|
70 |
+ font-weight: 500; |
|
71 |
+ font-style: normal; |
|
72 |
+} |
|
73 |
+@font-face { |
|
74 |
+ font-family: 'Inter'; |
|
75 |
+ src: url('../../fonts/Inter-MediumItalic.woff2') format('woff2'), |
|
76 |
+ url('../../fonts/Inter-MediumItalic.woff') format('woff'); |
|
77 |
+ font-weight: 500; |
|
78 |
+ font-style: italic; |
|
79 |
+} |
|
80 |
+@font-face { |
|
81 |
+ font-family: 'Inter'; |
|
82 |
+ src: url('../../fonts/Inter-SemiBold.woff2') format('woff2'), |
|
83 |
+ url('../../fonts/Inter-SemiBold.woff') format('woff'); |
|
84 |
+ font-weight: 600; |
|
85 |
+ font-style: normal; |
|
86 |
+} |
|
87 |
+@font-face { |
|
88 |
+ font-family: 'Inter'; |
|
89 |
+ src: url('../../fonts/Inter-SemiBoldItalic.woff2') format('woff2'), |
|
90 |
+ url('../../fonts/Inter-SemiBoldItalic.woff') format('woff'); |
|
91 |
+ font-weight: 600; |
|
92 |
+ font-style: italic; |
|
93 |
+} |
|
94 |
+@font-face { |
|
95 |
+ font-family: 'Inter'; |
|
96 |
+ src: url('../../fonts/Inter-Bold.woff2') format('woff2'), |
|
97 |
+ url('../../fonts/Inter-Bold.woff') format('woff'); |
|
98 |
+ font-weight: 700; |
|
99 |
+ font-style: normal; |
|
100 |
+} |
|
101 |
+@font-face { |
|
102 |
+ font-family: 'Inter'; |
|
103 |
+ src: url('../../fonts/Inter-BoldItalic.woff2') format('woff2'), |
|
104 |
+ url('../../fonts/Inter-BoldItalic.woff') format('woff'); |
|
105 |
+ font-weight: 700; |
|
106 |
+ font-style: italic; |
|
107 |
+} |
|
108 |
+@font-face { |
|
109 |
+ font-family: 'Inter'; |
|
110 |
+ src: url('../../fonts/Inter-ExtraBold.woff2') format('woff2'), |
|
111 |
+ url('../../fonts/Inter-ExtraBold.woff') format('woff'); |
|
112 |
+ font-weight: 800; |
|
113 |
+ font-style: normal; |
|
114 |
+} |
|
115 |
+@font-face { |
|
116 |
+ font-family: 'Inter'; |
|
117 |
+ src: url('../../fonts/Inter-ExtraBoldItalic.woff2') format('woff2'), |
|
118 |
+ url('../../fonts/Inter-ExtraBoldItalic.woff') format('woff'); |
|
119 |
+ font-weight: 800; |
|
120 |
+ font-style: italic; |
|
121 |
+} |
|
122 |
+ |
|
123 |
+#sipClient { |
|
124 |
+ background-color: #30394a; |
|
125 |
+ font-size: 13px; |
|
126 |
+ line-height: 1.42857143; |
|
127 |
+ font-family: 'Inter'; |
|
128 |
+ /* firefox 19+ */ |
|
129 |
+ /* ie */ |
|
130 |
+} |
|
131 |
+#sipClient p { |
|
132 |
+ margin: 0; |
|
133 |
+ padding: 0 0 10px 0; |
|
134 |
+ line-height: 22px; |
|
135 |
+} |
|
136 |
+#sipClient .sipStatus { |
|
137 |
+ margin: 0 -15px 2px -15px; |
|
138 |
+ padding: 1px 16px; |
|
139 |
+// background-color: #111; |
|
140 |
+ background-color: #2c6595; |
|
141 |
+ color: #e4e4e4; |
|
142 |
+ font-weight: 500; |
|
143 |
+} |
|
144 |
+#sipClient #txtCallStatus { |
|
145 |
+ color: #e4e4e4; |
|
146 |
+} |
|
147 |
+#sipClient #sip-dialpad { |
|
148 |
+ margin: 15px 0 0 0; |
|
149 |
+} |
|
150 |
+#sipClient #dialpadWrap { |
|
151 |
+ display: block; |
|
152 |
+ position: relative; |
|
153 |
+ width: 246px; |
|
154 |
+ height: 354px; |
|
155 |
+} |
|
156 |
+ |
|
157 |
+#sipClient #sip-dialpad .col-xs-4 { |
|
158 |
+ text-align: center; |
|
159 |
+} |
|
160 |
+#sipClient .btn-default { |
|
161 |
+ border-color: #ffffff !important; |
|
162 |
+} |
|
163 |
+#sipClient #callButton { |
|
164 |
+ font-weight: 600; |
|
165 |
+ font-size: 15px; |
|
166 |
+ padding: 5px 12px; |
|
167 |
+} |
|
168 |
+#sipClient .digit { |
|
169 |
+ height: 66px; |
|
170 |
+ width: 66px; |
|
171 |
+ margin: 0 8px 14px 8px !important; |
|
172 |
+ background-color: #f7f7f7; |
|
173 |
+ font-weight: 300; |
|
174 |
+ font-size: 24px; |
|
175 |
+ border-radius: 6px; |
|
176 |
+ line-height: 21px; |
|
177 |
+ padding-top: 14px; |
|
178 |
+ float: left; |
|
179 |
+} |
|
180 |
+#sipClient .digit span { |
|
181 |
+ display: block; |
|
182 |
+ color: #999; |
|
183 |
+ font-size: 11px; |
|
184 |
+ font-weight: normal; |
|
185 |
+} |
|
186 |
+#sipClient .sip-panel h3 { |
|
187 |
+ margin-top: 22px; |
|
188 |
+} |
|
189 |
+#sipClient #sip-splash { |
|
190 |
+ height: 371px; |
|
191 |
+} |
|
192 |
+#sipClient #sip-splash .fa { |
|
193 |
+ margin-bottom: 15px; |
|
194 |
+} |
|
195 |
+#sipClient #sip-splash .fa-circle { |
|
196 |
+ color: #5cb85c; |
|
197 |
+} |
|
198 |
+#sipClient #sip-log .panel-heading { |
|
199 |
+ padding: 10px 8px; |
|
200 |
+} |
|
201 |
+#sipClient #sip-logitems { |
|
202 |
+ overflow: scroll; |
|
203 |
+} |
|
204 |
+#sipClient #sldVolume { |
|
205 |
+ width: 140px; |
|
206 |
+ margin: 0 auto; |
|
207 |
+ box-shadow: none; |
|
208 |
+} |
|
209 |
+#sipClient .sip-logitem { |
|
210 |
+ padding: 4px; |
|
211 |
+} |
|
212 |
+#sipClient #numDisplay::-webkit-input-placeholder { |
|
213 |
+ color: #bbb; |
|
214 |
+} |
|
215 |
+#sipClient #numDisplay::-moz-placeholder { |
|
216 |
+ color: #bbb; |
|
217 |
+} |
|
218 |
+#sipClient #numDisplay::-ms-input-placeholder { |
|
219 |
+ color: #bbb; |
|
220 |
+} |
|
221 |
+#sipClient #numDisplay::-moz-placeholder { |
|
222 |
+ color: #bbb; |
|
223 |
+} |
|
224 |
+#sipClient #numDisplay { |
|
225 |
+ height: 30px; |
|
226 |
+ padding: 0px 4px; |
|
227 |
+ font-size: 15px; |
|
228 |
+ font-weight: 500; |
|
229 |
+ overflow: visible; |
|
230 |
+ border-radius: 4px; |
|
231 |
+} |
|
232 |
+.btn .fa { |
|
233 |
+ display: inline-block; |
|
234 |
+ margin: 4px 2px 0px 2px !important; |
|
235 |
+} |
|
236 |
+#audioLocal, #audioRemote { |
|
237 |
+ display: block; |
|
238 |
+ height: 0px !important; |
|
239 |
+ width: 0px !important; |
|
240 |
+ margin: 0px; |
|
241 |
+} |
|
242 |
+.page-header { |
|
243 |
+// margin: 12px 0 20px 0 !important; |
|
244 |
+ margin: 26px 0 20px 0 !important; |
|
245 |
+} |
|
246 |
+ |
|
247 |
+#selectFromNmbr { |
|
248 |
+ display: block; |
|
249 |
+ width: 100%; |
|
250 |
+ height: auto; |
|
251 |
+ text-align: center; |
|
252 |
+ margin: 0 0 4px 0; |
|
253 |
+} |
|
254 |
+ |
|
255 |
+#fromNmbrTitle { |
|
256 |
+ display: inline-block; |
|
257 |
+ width: 100%; |
|
258 |
+ height: 20px; |
|
259 |
+ text-align: center; |
|
260 |
+ color: #e8e8e8; |
|
261 |
+ font-size: 14px; |
|
262 |
+ font-weight: 600; |
|
263 |
+ border-radius: 4px; |
|
264 |
+} |
|
265 |
+ |
|
266 |
+#fromNumber { |
|
267 |
+ display: inline-block; |
|
268 |
+ width: auto; |
|
269 |
+ height: 100%; |
|
270 |
+ font-size: 15px; |
|
271 |
+ padding: 0 4px 0 4px; |
|
272 |
+ text-align: left; |
|
273 |
+} |
|
274 |
+ |
|
275 |
+.input-group-btn { |
|
276 |
+ vertical-align: bottom !important; |
|
277 |
+} |
|
278 |
+ |
|
279 |
+@media (min-width: 768px) { |
|
280 |
+ .lead { |
|
281 |
+ font-size: 19px !important; |
|
282 |
+ } |
|
283 |
+} |
|
284 |
+ |
|
285 |
+.panel-title { |
|
286 |
+ font-size: 15px; |
|
287 |
+} |
|
288 |
+ |
|
289 |
+.small, small { |
|
290 |
+ font-size: 11px; |
|
291 |
+ margin: 0 0 0 22px; |
|
292 |
+} |
|
0 | 293 |
\ No newline at end of file |
1 | 294 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,167 @@ |
1 |
+<!-- |
|
2 |
+ @copyright 2021 Double Bastion LLC <www.doublebastion.com> |
|
3 |
+ |
|
4 |
+ @author Double Bastion LLC |
|
5 |
+ |
|
6 |
+ @license GNU AGPL version 3 or any later version |
|
7 |
+ |
|
8 |
+ This program is free software; you can redistribute it and/or |
|
9 |
+ modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
10 |
+ License as published by the Free Software Foundation; either |
|
11 |
+ version 3 of the License, or any later version. |
|
12 |
+ |
|
13 |
+ This program is distributed in the hope that it will be useful, |
|
14 |
+ but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
15 |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
16 |
+ GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
17 |
+ |
|
18 |
+ You should have received a copy of the GNU Affero General Public |
|
19 |
+ License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
20 |
+ |
|
21 |
+ |
|
22 |
+ |
|
23 |
+ This is a modified version of the original file "index.html". |
|
24 |
+ |
|
25 |
+ Below is the copyright notice of ctxSip phone (https://github.com/collecttix/ctxSip) |
|
26 |
+ which also applies to the original "index.html" file, which was part of ctxSip phone: |
|
27 |
+ |
|
28 |
+ |
|
29 |
+ The MIT License (MIT) |
|
30 |
+ |
|
31 |
+ Copyright (c) 2014 Collecttix |
|
32 |
+ |
|
33 |
+ Permission is hereby granted, free of charge, to any person obtaining a copy |
|
34 |
+ of this software and associated documentation files (the "Software"), to deal |
|
35 |
+ in the Software without restriction, including without limitation the rights |
|
36 |
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
37 |
+ copies of the Software, and to permit persons to whom the Software is |
|
38 |
+ furnished to do so, subject to the following conditions: |
|
39 |
+ |
|
40 |
+ The above copyright notice and this permission notice shall be included in |
|
41 |
+ all copies or substantial portions of the Software. |
|
42 |
+ |
|
43 |
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
44 |
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
45 |
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
46 |
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
47 |
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
48 |
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|
49 |
+ THE SOFTWARE. |
|
50 |
+--> |
|
51 |
+ |
|
52 |
+<!DOCTYPE html> |
|
53 |
+<html lang="en"> |
|
54 |
+ |
|
55 |
+<head> |
|
56 |
+ <meta charset="utf-8" /> |
|
57 |
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> |
|
58 |
+ <title>SIP Trip Phone</title> |
|
59 |
+ <link rel="icon" type="image/gif" href="img/favicon.ico" /> |
|
60 |
+ <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css" /> |
|
61 |
+ <link rel="stylesheet" type="text/css" href="css/font-awesome-4.7.0/css/font-awesome.min.css" /> |
|
62 |
+ <link rel="stylesheet" type="text/css" href="css/ctxSip.css" /> |
|
63 |
+ |
|
64 |
+ <script type="text/javascript" src="scripts/jquery-1.11.3.min.js"></script> |
|
65 |
+ <script type="text/javascript" src="scripts/bootstrap.min.js"></script> |
|
66 |
+ <script type="text/javascript" src="scripts/moment.min.js"></script> |
|
67 |
+ <script type="text/javascript" src="scripts/SIP.js/sip.min.js"></script> |
|
68 |
+ <script type="text/javascript" src="scripts/app.js"></script> |
|
69 |
+ |
|
70 |
+</head> |
|
71 |
+<body id="sipClient"> |
|
72 |
+<div class="container-fluid"> |
|
73 |
+ |
|
74 |
+ <div class="clearfix sipStatus"> |
|
75 |
+ <div id="txtCallStatus" class="pull-right"> </div> |
|
76 |
+ <div id="txtRegStatus"></div> |
|
77 |
+ </div> |
|
78 |
+ |
|
79 |
+ <div class="form-group" id="phoneUI"> |
|
80 |
+ <div class="input-group"> |
|
81 |
+ <div class="input-group-btn"> |
|
82 |
+ <button id="dropDownButton" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" title="Show Keypad"> |
|
83 |
+ <i class="fa fa-th"></i> |
|
84 |
+ </button> |
|
85 |
+ <div id="sip-dialpad" class="dropdown-menu"> |
|
86 |
+ <div id="dialpadWrap"> |
|
87 |
+ <button type="button" class="btn btn-default digit" data-digit="1">1<span> </span></button> |
|
88 |
+ <button type="button" class="btn btn-default digit" data-digit="2,A,B,C">2<span>ABC</span></button> |
|
89 |
+ <button type="button" class="btn btn-default digit" data-digit="3,D,E,F">3<span>DEF</span></button> |
|
90 |
+ <button type="button" class="btn btn-default digit" data-digit="4,G,H,I">4<span>GHI</span></button> |
|
91 |
+ <button type="button" class="btn btn-default digit" data-digit="5,J,K,L">5<span>JKL</span></button> |
|
92 |
+ <button type="button" class="btn btn-default digit" data-digit="6,M,N,O">6<span>MNO</span></button> |
|
93 |
+ <button type="button" class="btn btn-default digit" data-digit="7,P,Q,R,S">7<span>PQRS</span></button> |
|
94 |
+ <button type="button" class="btn btn-default digit" data-digit="8,T,U,V">8<span>TUV</span></button> |
|
95 |
+ <button type="button" class="btn btn-default digit" data-digit="9,W,X,Y,Z">9<span>WXYZ</span></button> |
|
96 |
+ <button type="button" class="btn btn-default digit" data-digit="*">*<span> </span></button> |
|
97 |
+ <button type="button" class="btn btn-default digit" data-digit="0,+">0<span>+</span></button> |
|
98 |
+ <button type="button" class="btn btn-default digit" data-digit="#">#<span> </span></button> |
|
99 |
+ <div class="clearfix"> </div> |
|
100 |
+ <button id="callButton" class="btn btn-success btn-block btnCall" title="Call"> |
|
101 |
+ <i class="fa fa-play"></i> Call |
|
102 |
+ </button> |
|
103 |
+ </div> |
|
104 |
+ </div> |
|
105 |
+ </div> |
|
106 |
+ <div id="selectFromNmbr"><div id="fromNmbrTitle">From</div><select id="fromNumber"></select></div> |
|
107 |
+ <input type="text" name="number" id="numDisplay" class="form-control text-center input-sm" value="" placeholder="Enter recipient's number" autocomplete="false" title="Recipient" /> |
|
108 |
+ <div class="input-group-btn input-group-btn-sm"> |
|
109 |
+ <button class="btn btn-sm btn-primary dropdown-toggle" id="btnVol" data-toggle="dropdown" title="Volume"> |
|
110 |
+ <i class="fa fa-fw fa-volume-up"></i> |
|
111 |
+ </button> |
|
112 |
+ <div class="dropdown-menu dropdown-menu-right"> |
|
113 |
+ <input type="range" min="0" max="100" value="100" step="1" id="sldVolume" /> |
|
114 |
+ </div> |
|
115 |
+ </div> |
|
116 |
+ </div> |
|
117 |
+ </div> |
|
118 |
+ |
|
119 |
+ <div class="well-sip"> |
|
120 |
+ <div id="sip-splash" class="text-muted text-center panel panel-default"> |
|
121 |
+ <div class="panel-body"> |
|
122 |
+ <div class="page-header"> |
|
123 |
+ <span> |
|
124 |
+ <img src="images/sip_trip_phone_logo_large.svg" style="display:block;margin:0px auto;width:80px;height:80px" /> |
|
125 |
+ </span> |
|
126 |
+ <h3>SIP Trip Phone</h3> |
|
127 |
+ </div> |
|
128 |
+ <p class="lead">To make a call click on the button in the upper-left corner, enter a phone number and press 'Call'. |
|
129 |
+ You can also use your keyboard to enter phone numbers and press 'Enter' to make calls.</p> |
|
130 |
+ </div> |
|
131 |
+ </div> |
|
132 |
+ |
|
133 |
+ <div id="sip-log" class="panel panel-default hide"> |
|
134 |
+ <div class="panel-heading"> |
|
135 |
+ <h4 class="text-muted panel-title">Recent Calls <span class="pull-right" style="cursor:pointer;"><i class="fa fa-trash text-muted sipLogClear" title="Clear Log"></i></span></h4> |
|
136 |
+ </div> |
|
137 |
+ <div id="sip-logitems" class="list-group"> |
|
138 |
+ <p class="text-muted text-center">No recent calls from this browser.</p> |
|
139 |
+ </div> |
|
140 |
+ </div> |
|
141 |
+ </div> |
|
142 |
+ |
|
143 |
+ <div class="modal fade" id="mdlError" tabindex="-1" role="dialog" aria-hidden="true" data-backdrop="static" data-keyboard="false"> |
|
144 |
+ <div class="modal-dialog modal-sm"> |
|
145 |
+ <div class="modal-content"> |
|
146 |
+ <div class="modal-header"> |
|
147 |
+ <h4 class="modal-title">Sip Error</h4> |
|
148 |
+ </div> |
|
149 |
+ <div class="modal-body text-center text-danger"> |
|
150 |
+ <h3><i class="fa fa-3x fa-ban"></i></h3> |
|
151 |
+ <p class="lead">Sip registration failed. No calls can be handled.</p> |
|
152 |
+ </div> |
|
153 |
+ </div> |
|
154 |
+ </div> |
|
155 |
+ </div> |
|
156 |
+ |
|
157 |
+</div> |
|
158 |
+ |
|
159 |
+<audio id="ringtone" src="sounds/incoming.ogg" loop></audio> |
|
160 |
+<audio id="ringbacktone" src="sounds/outgoing.ogg" loop></audio> |
|
161 |
+<audio id="dtmfTone" src="sounds/dtmf.ogg"></audio> |
|
162 |
+ |
|
163 |
+<video id="audioRemote"></video> |
|
164 |
+<video id="audioLocal"></video> |
|
165 |
+ |
|
166 |
+</body> |
|
167 |
+</html> |
0 | 168 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,1014 @@ |
1 |
+/** |
|
2 |
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com> |
|
3 |
+ * |
|
4 |
+ * @author Double Bastion LLC |
|
5 |
+ * |
|
6 |
+ * @license GNU AGPL version 3 or any later version |
|
7 |
+ * |
|
8 |
+ * This program is free software; you can redistribute it and/or |
|
9 |
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
10 |
+ * License as published by the Free Software Foundation; either |
|
11 |
+ * version 3 of the License, or any later version. |
|
12 |
+ * |
|
13 |
+ * This program is distributed in the hope that it will be useful, |
|
14 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
15 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
16 |
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
17 |
+ * |
|
18 |
+ * You should have received a copy of the GNU Affero General Public |
|
19 |
+ * License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
20 |
+ * |
|
21 |
+ * |
|
22 |
+ * |
|
23 |
+ * This is a modified version of the original file "app.js". |
|
24 |
+ * |
|
25 |
+ * Below is the copyright notice of ctxSip phone (https://github.com/collecttix/ctxSip) |
|
26 |
+ * which also applies to the original "app.js" file, which was part of ctxSip phone: |
|
27 |
+ * |
|
28 |
+ * |
|
29 |
+ * The MIT License (MIT) |
|
30 |
+ * |
|
31 |
+ * Copyright (c) 2014 Collecttix |
|
32 |
+ * |
|
33 |
+ * Permission is hereby granted, free of charge, to any person obtaining a copy |
|
34 |
+ * of this software and associated documentation files (the "Software"), to deal |
|
35 |
+ * in the Software without restriction, including without limitation the rights |
|
36 |
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
37 |
+ * copies of the Software, and to permit persons to whom the Software is |
|
38 |
+ * furnished to do so, subject to the following conditions: |
|
39 |
+ * |
|
40 |
+ * The above copyright notice and this permission notice shall be included in |
|
41 |
+ * all copies or substantial portions of the Software. |
|
42 |
+ * |
|
43 |
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
44 |
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
45 |
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
46 |
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
47 |
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
48 |
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|
49 |
+ * THE SOFTWARE. |
|
50 |
+ * |
|
51 |
+ */ |
|
52 |
+ |
|
53 |
+ |
|
54 |
+/* globals SIP, user, moment, Stopwatch */ |
|
55 |
+ |
|
56 |
+$(document).ready(function() { |
|
57 |
+ |
|
58 |
+ var ctxSip; |
|
59 |
+ |
|
60 |
+ // Show system notifications on incoming calls |
|
61 |
+ function incomingCallNote() { |
|
62 |
+ var noticeOptions = { body: "New incoming call !!!", icon: "images/sip_trip_phone_logo.svg" } |
|
63 |
+ var inComingCallNotification = new Notification("SIP Trip Phone incoming call", noticeOptions); |
|
64 |
+ inComingCallNotification.onclick = function (event) { |
|
65 |
+ return; |
|
66 |
+ } |
|
67 |
+ |
|
68 |
+ if (document.hasFocus()) { |
|
69 |
+ return; |
|
70 |
+ } else { setTimeout(incomingCallNote, 8000); } |
|
71 |
+ } |
|
72 |
+ |
|
73 |
+ // Change page title on incoming calls |
|
74 |
+ function changePageTitle() { |
|
75 |
+ if ($(document).attr("title") == "SIP Trip Phone") { $(document).prop("title", "New call !!!"); } else { $(document).prop("title", "SIP Trip Phone"); } |
|
76 |
+ if (document.hasFocus()) { |
|
77 |
+ $(document).prop("title", "SIP Trip Phone"); |
|
78 |
+ return; |
|
79 |
+ } else { setTimeout(changePageTitle, 460); } |
|
80 |
+ } |
|
81 |
+ |
|
82 |
+ var userSIPPass = window.opener.sipUserPasswd; |
|
83 |
+ |
|
84 |
+ var user = JSON.parse(localStorage.getItem('SIPCreds')); |
|
85 |
+ |
|
86 |
+ var traceornot = (user.Tracesipmsg == 1)? true : false; |
|
87 |
+ |
|
88 |
+ // Add the 'available phone numbers' drop-down list |
|
89 |
+ var stpVoiceNmbrs = user.Voicenumbers; |
|
90 |
+ var stpVoiceNbOpt = ''; |
|
91 |
+ var stpVoiceNmbrsArr = []; |
|
92 |
+ |
|
93 |
+ if (stpVoiceNmbrs != '') { |
|
94 |
+ |
|
95 |
+ stpVoiceNmbrsArr = stpVoiceNmbrs.split(","); |
|
96 |
+ var stpDefNmbrFdb = user.Defaultvoicenumber; |
|
97 |
+ |
|
98 |
+ for (var v = 0; v < stpVoiceNmbrsArr.length; v++) { |
|
99 |
+ stpVoiceNbOpt += '<option value="'+ stpVoiceNmbrsArr[v] +'" class="stpSlctFrmNmbrs">'+ stpVoiceNmbrsArr[v] +'</option>'; |
|
100 |
+ } |
|
101 |
+ } |
|
102 |
+ stpVoiceNbOpt += '<option value="'+ user.User +'" class="stpSlctFrmNmbrs">'+ user.User +'</option>'; |
|
103 |
+ |
|
104 |
+ $("#fromNumber").append(stpVoiceNbOpt); |
|
105 |
+ |
|
106 |
+ if (stpDefNmbrFdb != '' && stpDefNmbrFdb != null) { |
|
107 |
+ $("#fromNumber").val(stpDefNmbrFdb); |
|
108 |
+ } else { |
|
109 |
+ if (stpVoiceNmbrsArr.length > 0) { |
|
110 |
+ $("#fromNumber").val(stpVoiceNmbrsArr[0]); |
|
111 |
+ } else { $("#fromNumber").val(user.User); } |
|
112 |
+ } |
|
113 |
+ |
|
114 |
+ // Adjust height of text frame and call history list, |
|
115 |
+ // and width of dial pad |
|
116 |
+ $("#sip-splash").css("height", window.innerHeight - 135); |
|
117 |
+ $("#sip-logitems").css("height", window.innerHeight - 175); |
|
118 |
+ |
|
119 |
+ var calcWidth = parseInt(window.innerWidth - 30) + "px"; |
|
120 |
+ var calcHeight = parseInt(window.innerHeight - 136) + "px"; |
|
121 |
+ $("#sip-dialpad").css({ "width" : calcWidth, "height" : calcHeight }); |
|
122 |
+ |
|
123 |
+ var calcMargin = parseInt(($("#sip-dialpad").height() - $("#dialpadWrap").height()) / 2) + "px auto"; |
|
124 |
+ $("#dialpadWrap").css("margin", calcMargin); |
|
125 |
+ |
|
126 |
+ $(window).resize(function() { |
|
127 |
+ $("#sip-logitems").css("height", window.innerHeight - 175); |
|
128 |
+ $("#sip-splash").css("height", window.innerHeight - 135); |
|
129 |
+ }); |
|
130 |
+ |
|
131 |
+ if (user.Stun != '') { |
|
132 |
+ var configComp = { |
|
133 |
+ password : userSIPPass, |
|
134 |
+ displayName : user.Display, |
|
135 |
+ uri : 'sip:'+ user.User +'@'+ user.Realm, |
|
136 |
+ wsServers : user.WSServer, |
|
137 |
+ stunServers : ["stun:"+ user.Stun], |
|
138 |
+ traceSip : traceornot, |
|
139 |
+ log : { level : 3 }, |
|
140 |
+ registerExpires : 9999999 |
|
141 |
+ }; |
|
142 |
+ } else { |
|
143 |
+ var configComp = { |
|
144 |
+ password : userSIPPass, |
|
145 |
+ displayName : user.Display, |
|
146 |
+ uri : 'sip:'+ user.User +'@'+ user.Realm, |
|
147 |
+ wsServers : user.WSServer, |
|
148 |
+ traceSip : traceornot, |
|
149 |
+ log : { level : 3 }, |
|
150 |
+ registerExpires : 9999999 |
|
151 |
+ }; |
|
152 |
+ } |
|
153 |
+ |
|
154 |
+ ctxSip = { |
|
155 |
+ |
|
156 |
+ config : configComp, |
|
157 |
+ ringtone : document.getElementById('ringtone'), |
|
158 |
+ ringbacktone : document.getElementById('ringbacktone'), |
|
159 |
+ dtmfTone : document.getElementById('dtmfTone'), |
|
160 |
+ |
|
161 |
+ Sessions : [], |
|
162 |
+ callTimers : {}, |
|
163 |
+ callActiveID : null, |
|
164 |
+ callVolume : 1, |
|
165 |
+ Stream : null, |
|
166 |
+ |
|
167 |
+ /** |
|
168 |
+ * Parses a SIP uri and returns a formatted phone number. |
|
169 |
+ * |
|
170 |
+ * @param {string} phone number or uri to format |
|
171 |
+ * @return {string} formatted number |
|
172 |
+ */ |
|
173 |
+ formatPhone : function(phone) { |
|
174 |
+ |
|
175 |
+ var num; |
|
176 |
+ |
|
177 |
+ if (phone.indexOf('@')) { |
|
178 |
+ num = phone.split('@')[0]; |
|
179 |
+ } else { |
|
180 |
+ num = phone; |
|
181 |
+ } |
|
182 |
+ |
|
183 |
+ num = num.toString().replace(/[^0-9]/g, ''); |
|
184 |
+ |
|
185 |
+ if (num.length === 10) { |
|
186 |
+ return '(' + num.substr(0, 3) + ') ' + num.substr(3, 3) + '-' + num.substr(6,4); |
|
187 |
+ } else if (num.length === 11) { |
|
188 |
+ return '(' + num.substr(1, 3) + ') ' + num.substr(4, 3) + '-' + num.substr(7,4); |
|
189 |
+ } else { |
|
190 |
+ return num; |
|
191 |
+ } |
|
192 |
+ }, |
|
193 |
+ |
|
194 |
+ // Sound methods |
|
195 |
+ startRingTone : function() { |
|
196 |
+ try { ctxSip.ringtone.play(); } catch (e) { } |
|
197 |
+ }, |
|
198 |
+ |
|
199 |
+ stopRingTone : function() { |
|
200 |
+ try { ctxSip.ringtone.pause(); } catch (e) { } |
|
201 |
+ }, |
|
202 |
+ |
|
203 |
+ startRingbackTone : function() { |
|
204 |
+ try { ctxSip.ringbacktone.play(); } catch (e) { } |
|
205 |
+ }, |
|
206 |
+ |
|
207 |
+ stopRingbackTone : function() { |
|
208 |
+ try { ctxSip.ringbacktone.pause(); } catch (e) { } |
|
209 |
+ }, |
|
210 |
+ |
|
211 |
+ // Genereates a random string to ID a call |
|
212 |
+ getUniqueID : function() { |
|
213 |
+ return Math.random().toString(36).substr(2, 9); |
|
214 |
+ }, |
|
215 |
+ |
|
216 |
+ |
|
217 |
+ newSession : function(newSess) { |
|
218 |
+ |
|
219 |
+ newSess.displayName = newSess.remoteIdentity.displayName || newSess.remoteIdentity.uri.user; |
|
220 |
+ newSess.ctxid = ctxSip.getUniqueID(); |
|
221 |
+ |
|
222 |
+ var status; |
|
223 |
+ |
|
224 |
+ if (newSess.direction === 'incoming') { |
|
225 |
+ status = "Incoming: "+ newSess.displayName; |
|
226 |
+ ctxSip.startRingTone(); |
|
227 |
+ |
|
228 |
+ incomingCallNote(); |
|
229 |
+ changePageTitle(); |
|
230 |
+ |
|
231 |
+ } else { |
|
232 |
+ status = "Trying: "+ newSess.displayName; |
|
233 |
+ ctxSip.startRingbackTone(); |
|
234 |
+ } |
|
235 |
+ |
|
236 |
+ ctxSip.logCall(newSess, 'ringing'); |
|
237 |
+ |
|
238 |
+ ctxSip.setCallSessionStatus(status); |
|
239 |
+ |
|
240 |
+ // EVENT CALLBACKS |
|
241 |
+ |
|
242 |
+ newSess.on('progress',function(e) { |
|
243 |
+ if (e.direction === 'outgoing') { |
|
244 |
+ ctxSip.setCallSessionStatus('Calling...'); |
|
245 |
+ } |
|
246 |
+ }); |
|
247 |
+ |
|
248 |
+ newSess.on('connecting',function(e) { |
|
249 |
+ if (e.direction === 'outgoing') { |
|
250 |
+ ctxSip.setCallSessionStatus('Connecting...'); |
|
251 |
+ } |
|
252 |
+ }); |
|
253 |
+ |
|
254 |
+ |
|
255 |
+ newSess.on('accepted',function(e) { |
|
256 |
+ |
|
257 |
+ // If there is another active call, hold it |
|
258 |
+ if (ctxSip.callActiveID && ctxSip.callActiveID !== newSess.ctxid) { |
|
259 |
+ ctxSip.phoneHoldButtonPressed(ctxSip.callActiveID); |
|
260 |
+ } |
|
261 |
+ |
|
262 |
+ ctxSip.stopRingbackTone(); |
|
263 |
+ ctxSip.stopRingTone(); |
|
264 |
+ ctxSip.setCallSessionStatus('Answered'); |
|
265 |
+ ctxSip.logCall(newSess, 'answered'); |
|
266 |
+ ctxSip.callActiveID = newSess.ctxid; |
|
267 |
+ }); |
|
268 |
+ |
|
269 |
+ newSess.on('hold', function(e) { |
|
270 |
+ ctxSip.callActiveID = null; |
|
271 |
+ ctxSip.logCall(newSess, 'holding'); |
|
272 |
+ }); |
|
273 |
+ |
|
274 |
+ newSess.on('unhold', function(e) { |
|
275 |
+ ctxSip.logCall(newSess, 'resumed'); |
|
276 |
+ ctxSip.callActiveID = newSess.ctxid; |
|
277 |
+ }); |
|
278 |
+ |
|
279 |
+ newSess.on('muted', function(e) { |
|
280 |
+ ctxSip.Sessions[newSess.ctxid].isMuted = true; |
|
281 |
+ ctxSip.setCallSessionStatus("Muted"); |
|
282 |
+ }); |
|
283 |
+ |
|
284 |
+ newSess.on('unmuted', function(e) { |
|
285 |
+ ctxSip.Sessions[newSess.ctxid].isMuted = false; |
|
286 |
+ ctxSip.setCallSessionStatus("Answered"); |
|
287 |
+ }); |
|
288 |
+ |
|
289 |
+ newSess.on('cancel', function(e) { |
|
290 |
+ ctxSip.stopRingTone(); |
|
291 |
+ ctxSip.stopRingbackTone(); |
|
292 |
+ ctxSip.setCallSessionStatus("Canceled"); |
|
293 |
+ if (this.direction === 'outgoing') { |
|
294 |
+ ctxSip.callActiveID = null; |
|
295 |
+ newSess = null; |
|
296 |
+ ctxSip.logCall(this, 'ended'); |
|
297 |
+ } |
|
298 |
+ }); |
|
299 |
+ |
|
300 |
+ newSess.on('bye', function(e) { |
|
301 |
+ ctxSip.stopRingTone(); |
|
302 |
+ ctxSip.stopRingbackTone(); |
|
303 |
+ ctxSip.setCallSessionStatus(""); |
|
304 |
+ ctxSip.logCall(newSess, 'ended'); |
|
305 |
+ ctxSip.callActiveID = null; |
|
306 |
+ newSess = null; |
|
307 |
+ }); |
|
308 |
+ |
|
309 |
+ newSess.on('failed',function(e) { |
|
310 |
+ ctxSip.stopRingTone(); |
|
311 |
+ ctxSip.stopRingbackTone(); |
|
312 |
+ ctxSip.setCallSessionStatus('Terminated'); |
|
313 |
+ }); |
|
314 |
+ |
|
315 |
+ newSess.on('rejected',function(e) { |
|
316 |
+ ctxSip.stopRingTone(); |
|
317 |
+ ctxSip.stopRingbackTone(); |
|
318 |
+ ctxSip.setCallSessionStatus('Rejected'); |
|
319 |
+ ctxSip.callActiveID = null; |
|
320 |
+ ctxSip.logCall(this, 'ended'); |
|
321 |
+ newSess = null; |
|
322 |
+ }); |
|
323 |
+ |
|
324 |
+ ctxSip.Sessions[newSess.ctxid] = newSess; |
|
325 |
+ |
|
326 |
+ }, |
|
327 |
+ |
|
328 |
+ // getUser media request refused or device was not present |
|
329 |
+ getUserMediaFailure : function(e) { |
|
330 |
+ window.console.error('getUserMedia failed:', e); |
|
331 |
+ ctxSip.setError(true, 'Media Error.', 'You must allow access to your microphone. Check the address bar.', true); |
|
332 |
+ }, |
|
333 |
+ |
|
334 |
+ |
|
335 |
+ getUserMediaSuccess : function(stream) { |
|
336 |
+ ctxSip.Stream = stream; |
|
337 |
+ }, |
|
338 |
+ |
|
339 |
+ |
|
340 |
+ /** |
|
341 |
+ * sets the ui call status field |
|
342 |
+ * |
|
343 |
+ * @param {string} status |
|
344 |
+ */ |
|
345 |
+ setCallSessionStatus : function(status) { |
|
346 |
+ $('#txtCallStatus').html(status); |
|
347 |
+ }, |
|
348 |
+ |
|
349 |
+ /** |
|
350 |
+ * sets the ui connection status field |
|
351 |
+ * |
|
352 |
+ * @param {string} status |
|
353 |
+ */ |
|
354 |
+ setStatus : function(status) { |
|
355 |
+ $("#txtRegStatus").html('<i class="fa fa-signal"></i> '+status); |
|
356 |
+ }, |
|
357 |
+ |
|
358 |
+ /** |
|
359 |
+ * logs a call to localstorage |
|
360 |
+ * |
|
361 |
+ * @param {object} session |
|
362 |
+ * @param {string} status Enum 'ringing', 'answered', 'ended', 'holding', 'resumed' |
|
363 |
+ */ |
|
364 |
+ logCall : function(session, status) { |
|
365 |
+ |
|
366 |
+ var log = { |
|
367 |
+ clid : session.displayName, |
|
368 |
+ uri : session.remoteIdentity.uri.toString(), |
|
369 |
+ id : session.ctxid, |
|
370 |
+ time : new Date().getTime() |
|
371 |
+ }, |
|
372 |
+ calllog = JSON.parse(localStorage.getItem('sipCalls')); |
|
373 |
+ |
|
374 |
+ if (!calllog) { calllog = {}; } |
|
375 |
+ |
|
376 |
+ if (!calllog.hasOwnProperty(session.ctxid)) { |
|
377 |
+ calllog[log.id] = { |
|
378 |
+ id : log.id, |
|
379 |
+ clid : log.clid, |
|
380 |
+ uri : log.uri, |
|
381 |
+ start : log.time, |
|
382 |
+ flow : session.direction |
|
383 |
+ }; |
|
384 |
+ } |
|
385 |
+ |
|
386 |
+ if (status === 'ended') { |
|
387 |
+ calllog[log.id].stop = log.time; |
|
388 |
+ } |
|
389 |
+ |
|
390 |
+ if (status === 'ended' && calllog[log.id].status === 'ringing') { |
|
391 |
+ calllog[log.id].status = 'missed'; |
|
392 |
+ } else { |
|
393 |
+ calllog[log.id].status = status; |
|
394 |
+ } |
|
395 |
+ |
|
396 |
+ localStorage.setItem('sipCalls', JSON.stringify(calllog)); |
|
397 |
+ ctxSip.logShow(); |
|
398 |
+ }, |
|
399 |
+ |
|
400 |
+ /** |
|
401 |
+ * adds a ui item to the call log |
|
402 |
+ * |
|
403 |
+ * @param {object} item log item |
|
404 |
+ */ |
|
405 |
+ logItem : function(item) { |
|
406 |
+ |
|
407 |
+ var callActive = (item.status !== 'ended' && item.status !== 'missed'), |
|
408 |
+ callLength = (item.status !== 'ended')? '<span id="'+item.id+'"></span>': moment.duration(item.stop - item.start).humanize(), |
|
409 |
+ callClass = '', |
|
410 |
+ callIcon, |
|
411 |
+ i; |
|
412 |
+ |
|
413 |
+ switch (item.status) { |
|
414 |
+ case 'ringing' : |
|
415 |
+ callClass = 'list-group-item-success'; |
|
416 |
+ callIcon = 'fa-bell'; |
|
417 |
+ break; |
|
418 |
+ |
|
419 |
+ case 'missed' : |
|
420 |
+ callClass = 'list-group-item-danger'; |
|
421 |
+ if (item.flow === "incoming") { callIcon = 'fa-chevron-left'; } |
|
422 |
+ if (item.flow === "outgoing") { callIcon = 'fa-chevron-right'; } |
|
423 |
+ break; |
|
424 |
+ |
|
425 |
+ case 'holding' : |
|
426 |
+ callClass = 'list-group-item-warning'; |
|
427 |
+ callIcon = 'fa-pause'; |
|
428 |
+ break; |
|
429 |
+ |
|
430 |
+ case 'answered' : |
|
431 |
+ case 'resumed' : |
|
432 |
+ callClass = 'list-group-item-info'; |
|
433 |
+ callIcon = 'fa-phone-square'; |
|
434 |
+ break; |
|
435 |
+ |
|
436 |
+ case 'ended' : |
|
437 |
+ if (item.flow === "incoming") { callIcon = 'fa-chevron-left'; } |
|
438 |
+ if (item.flow === "outgoing") { callIcon = 'fa-chevron-right'; } |
|
439 |
+ break; |
|
440 |
+ } |
|
441 |
+ |
|
442 |
+ |
|
443 |
+ i = '<div class="list-group-item sip-logitem clearfix '+callClass+'" data-uri="'+item.uri+'" data-sessionid="'+item.id+'" title="Double Click to Call">'; |
|
444 |
+ i += '<div class="clearfix"><div class="pull-left">'; |
|
445 |
+ i += '<i class="fa fa-fw '+callIcon+' fa-fw"></i> <strong>'+ctxSip.formatPhone(item.uri)+'</strong><br><small>'+moment(item.start).format('MM/DD hh:mm:ss a')+'</small>'; |
|
446 |
+ i += '</div>'; |
|
447 |
+ i += '<div class="pull-right text-right"><em>'+item.clid+'</em><br>' + callLength+'</div></div>'; |
|
448 |
+ |
|
449 |
+ if (callActive) { |
|
450 |
+ i += '<div class="btn-group btn-group-xs pull-right">'; |
|
451 |
+ if (item.status === 'ringing' && item.flow === 'incoming') { |
|
452 |
+ i += '<button class="btn btn-xs btn-success btnCall" title="Call"><i class="fa fa-phone"></i></button>'; |
|
453 |
+ } else { |
|
454 |
+ i += '<button class="btn btn-xs btn-primary btnHoldResume" title="Hold"><i class="fa fa-pause"></i></button>'; |
|
455 |
+ i += '<button class="btn btn-xs btn-info btnTransfer" title="Transfer"><i class="fa fa-random"></i></button>'; |
|
456 |
+ i += '<button class="btn btn-xs btn-warning btnMute" title="Mute"><i class="fa fa-fw fa-microphone"></i></button>'; |
|
457 |
+ } |
|
458 |
+ i += '<button class="btn btn-xs btn-danger btnHangUp" title="Hangup"><i class="fa fa-stop"></i></button>'; |
|
459 |
+ i += '</div>'; |
|
460 |
+ } |
|
461 |
+ i += '</div>'; |
|
462 |
+ |
|
463 |
+ $('#sip-logitems').append(i); |
|
464 |
+ |
|
465 |
+ |
|
466 |
+ // Start call timer on answer |
|
467 |
+ if (item.status === 'answered') { |
|
468 |
+ var tEle = document.getElementById(item.id); |
|
469 |
+ ctxSip.callTimers[item.id] = new Stopwatch(tEle); |
|
470 |
+ ctxSip.callTimers[item.id].start(); |
|
471 |
+ } |
|
472 |
+ |
|
473 |
+ if (callActive && item.status !== 'ringing') { |
|
474 |
+ ctxSip.callTimers[item.id].start({startTime : item.start}); |
|
475 |
+ } |
|
476 |
+ |
|
477 |
+ $('#sip-logitems').scrollTop(0); |
|
478 |
+ }, |
|
479 |
+ |
|
480 |
+ /** |
|
481 |
+ * updates the call log ui |
|
482 |
+ */ |
|
483 |
+ logShow : function() { |
|
484 |
+ |
|
485 |
+ var calllog = JSON.parse(localStorage.getItem('sipCalls')), |
|
486 |
+ x = []; |
|
487 |
+ |
|
488 |
+ if (calllog !== null) { |
|
489 |
+ |
|
490 |
+ $('#sip-splash').addClass('hide'); |
|
491 |
+ $('#sip-log').removeClass('hide'); |
|
492 |
+ |
|
493 |
+ // empty existing logs |
|
494 |
+ $('#sip-logitems').empty(); |
|
495 |
+ |
|
496 |
+ // JS doesn't guarantee property order so |
|
497 |
+ // create an array with the start time as |
|
498 |
+ // the key and sort by that. |
|
499 |
+ |
|
500 |
+ // Add start time to array |
|
501 |
+ $.each(calllog, function(k,v) { |
|
502 |
+ x.push(v); |
|
503 |
+ }); |
|
504 |
+ |
|
505 |
+ // sort descending |
|
506 |
+ x.sort(function(a, b) { |
|
507 |
+ return b.start - a.start; |
|
508 |
+ }); |
|
509 |
+ |
|
510 |
+ $.each(x, function(k, v) { |
|
511 |
+ ctxSip.logItem(v); |
|
512 |
+ }); |
|
513 |
+ |
|
514 |
+ } else { |
|
515 |
+ $('#sip-splash').removeClass('hide'); |
|
516 |
+ $('#sip-log').addClass('hide'); |
|
517 |
+ } |
|
518 |
+ }, |
|
519 |
+ |
|
520 |
+ /** |
|
521 |
+ * removes log items from localstorage and updates the UI |
|
522 |
+ */ |
|
523 |
+ logClear : function() { |
|
524 |
+ |
|
525 |
+ localStorage.removeItem('sipCalls'); |
|
526 |
+ ctxSip.logShow(); |
|
527 |
+ }, |
|
528 |
+ |
|
529 |
+ sipCall : function(target) { |
|
530 |
+ |
|
531 |
+ try { |
|
532 |
+ |
|
533 |
+ // Get the name of the SIP provider to send it to Asterisk, so that Asterisk knows what provider |
|
534 |
+ // to use for outbound calls, in case multiple phone numbers from different providers are used |
|
535 |
+ var callerNumber = $("#fromNumber").val(); |
|
536 |
+ |
|
537 |
+ if (callerNumber.indexOf(":") >= 0) { |
|
538 |
+ var shortProv = callerNumber.split(":"); |
|
539 |
+ var sipProvider = shortProv[0].replace(" ", ""); |
|
540 |
+ var callFromNumber = shortProv[1].replace(" ", ""); |
|
541 |
+ } else { |
|
542 |
+ var sipProvider = 'n/a'; |
|
543 |
+ var callFromNumber = callerNumber; |
|
544 |
+ } |
|
545 |
+ |
|
546 |
+ var s = ctxSip.phone.invite(target, { |
|
547 |
+ media : { |
|
548 |
+ stream : ctxSip.Stream, |
|
549 |
+ constraints : { audio : true, video : false }, |
|
550 |
+ render : { remote: document.getElementById('audioRemote') } |
|
551 |
+ // render: { remote: $('#audioRemote').get()[0] } |
|
552 |
+ // RTCConstraints : { "optional": [{ 'DtlsSrtpKeyAgreement': 'true'} ]} |
|
553 |
+ }, |
|
554 |
+ extraHeaders : [ 'X-SipProvider: '+ sipProvider , 'X-CallFromNumber: '+ callFromNumber ] |
|
555 |
+ }); |
|
556 |
+ s.direction = 'outgoing'; |
|
557 |
+ ctxSip.newSession(s); |
|
558 |
+ |
|
559 |
+ } catch(e) { |
|
560 |
+ throw(e); |
|
561 |
+ } |
|
562 |
+ }, |
|
563 |
+ |
|
564 |
+ sipTransfer : function(sessionid) { |
|
565 |
+ |
|
566 |
+ var s = ctxSip.Sessions[sessionid], |
|
567 |
+ target = window.prompt('Enter destination number', ''); |
|
568 |
+ |
|
569 |
+ if (target) { |
|
570 |
+ ctxSip.setCallSessionStatus('<i>Transfering the call...</i>'); |
|
571 |
+ } |
|
572 |
+ s.refer(target); |
|
573 |
+ }, |
|
574 |
+ |
|
575 |
+ sipHangUp : function(sessionid) { |
|
576 |
+ |
|
577 |
+ var s = ctxSip.Sessions[sessionid]; |
|
578 |
+ // s.terminate(); |
|
579 |
+ if (!s) { |
|
580 |
+ return; |
|
581 |
+ } else if (s.startTime) { |
|
582 |
+ s.bye(); |
|
583 |
+ } else if (s.reject) { |
|
584 |
+ s.reject(); |
|
585 |
+ } else if (s.cancel) { |
|
586 |
+ s.cancel(); |
|
587 |
+ } |
|
588 |
+ |
|
589 |
+ }, |
|
590 |
+ |
|
591 |
+ sipSendDTMF : function(digit) { |
|
592 |
+ |
|
593 |
+ try { ctxSip.dtmfTone.play(); } catch(e) { } |
|
594 |
+ |
|
595 |
+ var a = ctxSip.callActiveID; |
|
596 |
+ if (a) { |
|
597 |
+ var s = ctxSip.Sessions[a]; |
|
598 |
+ s.dtmf(digit); |
|
599 |
+ } |
|
600 |
+ }, |
|
601 |
+ |
|
602 |
+ phoneCallButtonPressed : function(sessionid) { |
|
603 |
+ |
|
604 |
+ var s = ctxSip.Sessions[sessionid]; |
|
605 |
+// target = $("#numDisplay").val(); |
|
606 |
+ var targetinit = $("#numDisplay").val(); |
|
607 |
+ |
|
608 |
+ if (!s) { |
|
609 |
+ |
|
610 |
+ if (targetinit.trim() !== '') { |
|
611 |
+ if (/^[a-zA-Z0-9\+\*\#]+$/.test(targetinit) && targetinit.length < 201) { |
|
612 |
+ |
|
613 |
+ var target = targetinit; |
|
614 |
+// $("#numDisplay").val(""); |
|
615 |
+ ctxSip.sipCall(target); |
|
616 |
+ |
|
617 |
+ } else { |
|
618 |
+ alert("The phone number or extension that you have tried to dial is not valid. You can only enter numbers, uppercase and lowercase letters, plus signs (+), asterisks (*) and number signs (#) in the 'Recipient' field. Also, the total number of characters cannot exceed 200."); |
|
619 |
+ } |
|
620 |
+ } |
|
621 |
+ |
|
622 |
+ } else if (s.accept && !s.startTime) { |
|
623 |
+ |
|
624 |
+ s.accept({ |
|
625 |
+ media: { |
|
626 |
+ stream: ctxSip.Stream, |
|
627 |
+ constraints: { audio: true, video: false }, |
|
628 |
+ render : { remote: document.getElementById('audioRemote') } |
|
629 |
+ // render: { remote: $('#audioRemote').get()[0] } |
|
630 |
+ // RTCConstraints : { "optional": [{ 'DtlsSrtpKeyAgreement': 'true'} ]} |
|
631 |
+ } |
|
632 |
+ }); |
|
633 |
+ } |
|
634 |
+ }, |
|
635 |
+ |
|
636 |
+ phoneMuteButtonPressed : function (sessionid) { |
|
637 |
+ |
|
638 |
+ var s = ctxSip.Sessions[sessionid]; |
|
639 |
+ |
|
640 |
+ if (!s.isMuted) { |
|
641 |
+ s.mute(); |
|
642 |
+ } else { |
|
643 |
+ s.unmute(); |
|
644 |
+ } |
|
645 |
+ }, |
|
646 |
+ |
|
647 |
+ phoneHoldButtonPressed : function(sessionid) { |
|
648 |
+ |
|
649 |
+ var s = ctxSip.Sessions[sessionid]; |
|
650 |
+ |
|
651 |
+ if (s.isOnHold().local === true) { |
|
652 |
+ s.unhold(); |
|
653 |
+ } else { |
|
654 |
+ s.hold(); |
|
655 |
+ } |
|
656 |
+ }, |
|
657 |
+ |
|
658 |
+ |
|
659 |
+ setError : function(err, title, msg, closable) { |
|
660 |
+ |
|
661 |
+ // Show modal if err = true |
|
662 |
+ if (err === true) { |
|
663 |
+ $("#mdlError p").html(msg); |
|
664 |
+ $("#mdlError").modal('show'); |
|
665 |
+ |
|
666 |
+ if (closable) { |
|
667 |
+ var b = '<button type="button" class="close" data-dismiss="modal">×</button>'; |
|
668 |
+ $("#mdlError .modal-header").find('button').remove(); |
|
669 |
+ $("#mdlError .modal-header").prepend(b); |
|
670 |
+ $("#mdlError .modal-title").html(title); |
|
671 |
+ $("#mdlError").modal({ keyboard : true }); |
|
672 |
+ } else { |
|
673 |
+ $("#mdlError .modal-header").find('button').remove(); |
|
674 |
+ $("#mdlError .modal-title").html(title); |
|
675 |
+ $("#mdlError").modal({ keyboard : false }); |
|
676 |
+ } |
|
677 |
+ $('#numDisplay').prop('disabled', 'disabled'); |
|
678 |
+ } else { |
|
679 |
+ $('#numDisplay').removeProp('disabled'); |
|
680 |
+ $("#mdlError").modal('hide'); |
|
681 |
+ } |
|
682 |
+ }, |
|
683 |
+ |
|
684 |
+ /** |
|
685 |
+ * Tests for a capable browser, return bool, and shows an |
|
686 |
+ * error modal on fail. |
|
687 |
+ */ |
|
688 |
+ hasWebRTC : function() { |
|
689 |
+ |
|
690 |
+ if (navigator.webkitGetUserMedia) { |
|
691 |
+ return true; |
|
692 |
+ } else if (navigator.mozGetUserMedia) { |
|
693 |
+ return true; |
|
694 |
+ } else if (navigator.getUserMedia) { |
|
695 |
+ return true; |
|
696 |
+ } else { |
|
697 |
+ ctxSip.setError(true, 'Unsupported Browser.', 'Your browser does not support the features required for this phone.'); |
|
698 |
+ window.console.error("WebRTC support not found"); |
|
699 |
+ return false; |
|
700 |
+ } |
|
701 |
+ } |
|
702 |
+ }; |
|
703 |
+ |
|
704 |
+ userSIPPass = ''; |
|
705 |
+ window.opener.sipUserPasswd = ''; |
|
706 |
+ |
|
707 |
+ // Throw an error if the browser can't hack it. |
|
708 |
+ if (!ctxSip.hasWebRTC()) { |
|
709 |
+ return true; |
|
710 |
+ } |
|
711 |
+ |
|
712 |
+ ctxSip.phone = new SIP.UA(ctxSip.config); |
|
713 |
+ |
|
714 |
+ ctxSip.phone.on('connected', function(e) { |
|
715 |
+ ctxSip.setStatus("Connected"); |
|
716 |
+ }); |
|
717 |
+ |
|
718 |
+ ctxSip.phone.on('disconnected', function(e) { |
|
719 |
+ ctxSip.setStatus("Disconnected"); |
|
720 |
+ |
|
721 |
+ // disable phone |
|
722 |
+ ctxSip.setError(true, 'Websocket Disconnected.', 'An Error occurred connecting to the websocket.'); |
|
723 |
+ |
|
724 |
+ // remove existing sessions |
|
725 |
+ $("#sessions > .session").each(function(i, session) { |
|
726 |
+ ctxSip.removeSession(session, 500); |
|
727 |
+ }); |
|
728 |
+ }); |
|
729 |
+ |
|
730 |
+ ctxSip.phone.on('registered', function(e) { |
|
731 |
+ |
|
732 |
+ var closeEditorWarning = function() { |
|
733 |
+ return 'If you close this window, you will not be able to make or receive calls from your browser.'; |
|
734 |
+ }; |
|
735 |
+ |
|
736 |
+ var closePhone = function() { |
|
737 |
+ // stop the phone on unload |
|
738 |
+ localStorage.removeItem('SipTripPhone'); |
|
739 |
+ ctxSip.phone.stop(); |
|
740 |
+ }; |
|
741 |
+ |
|
742 |
+ window.onbeforeunload = closeEditorWarning; |
|
743 |
+ window.onunload = closePhone; |
|
744 |
+ |
|
745 |
+ // This key is set to prevent multiple windows. |
|
746 |
+ localStorage.setItem('SipTripPhone', 'true'); |
|
747 |
+ |
|
748 |
+ $("#mldError").modal('hide'); |
|
749 |
+ ctxSip.setStatus("Ready"); |
|
750 |
+ |
|
751 |
+ // Get the userMedia and cache the stream |
|
752 |
+ var audio = document.getElementById('audioRemote'); |
|
753 |
+ var mediaStream = new MediaStream(); |
|
754 |
+ let audioTrack = null; |
|
755 |
+ |
|
756 |
+ navigator.mediaDevices.getUserMedia({ audio : true, video : false }, ctxSip.getUserMediaSuccess, ctxSip.getUserMediaFailure).then(function(mediaStream) { |
|
757 |
+ |
|
758 |
+ let audioTracks = mediaStream.getAudioTracks(); |
|
759 |
+ audio.srcObject = mediaStream; |
|
760 |
+ |
|
761 |
+ if (audioTracks.length) { |
|
762 |
+ audioTrack = audioTracks[0]; |
|
763 |
+ } |
|
764 |
+ }).then(function() { |
|
765 |
+ new Promise(function(resolve) { |
|
766 |
+ audio.onloadedmetadata = resolve; |
|
767 |
+ }) |
|
768 |
+ }) |
|
769 |
+ |
|
770 |
+ }); |
|
771 |
+ |
|
772 |
+ ctxSip.phone.on('registrationFailed', function(e) { |
|
773 |
+ ctxSip.setError(true, 'Registration Error.', 'An error occurred while registering your phone. Please check your settings.'); |
|
774 |
+ ctxSip.setStatus("Error: Registration Failed"); |
|
775 |
+ }); |
|
776 |
+ |
|
777 |
+ ctxSip.phone.on('unregistered', function(e) { |
|
778 |
+ ctxSip.setError(true, 'Registration Error.', 'An error occurred while registering your phone. Please check your settings.'); |
|
779 |
+ ctxSip.setStatus("Error: Registration Failed"); |
|
780 |
+ }); |
|
781 |
+ |
|
782 |
+ ctxSip.phone.on('invite', function (incomingSession) { |
|
783 |
+ |
|
784 |
+ var s = incomingSession; |
|
785 |
+ |
|
786 |
+ s.direction = 'incoming'; |
|
787 |
+ ctxSip.newSession(s); |
|
788 |
+ }); |
|
789 |
+ |
|
790 |
+ // Auto-focus number input on backspace. |
|
791 |
+ $('#sipClient').keydown(function(event) { |
|
792 |
+ if (event.which === 8) { |
|
793 |
+ $('#numDisplay').focus(); |
|
794 |
+ } |
|
795 |
+ }); |
|
796 |
+ |
|
797 |
+ $('#numDisplay').keypress(function(e) { |
|
798 |
+ // Enter pressed? so Dial. |
|
799 |
+ if (e.which === 13) { |
|
800 |
+ ctxSip.phoneCallButtonPressed(); |
|
801 |
+ } |
|
802 |
+ }); |
|
803 |
+ |
|
804 |
+ var clck = 0; |
|
805 |
+ |
|
806 |
+ $('.digit').click(function(event) { |
|
807 |
+ |
|
808 |
+ if (event.shiftKey) { |
|
809 |
+ |
|
810 |
+ clck++; |
|
811 |
+ event.preventDefault(); |
|
812 |
+ var num = $('#numDisplay').val(); |
|
813 |
+ var dig; |
|
814 |
+ var diginit = $(this).data('digit').toString().split(','); |
|
815 |
+ var elct = diginit.length; |
|
816 |
+ |
|
817 |
+ dig = diginit[clck%elct]; |
|
818 |
+ var numsec = num.slice(0,-1); |
|
819 |
+ $('#numDisplay').val(numsec+dig); |
|
820 |
+ ctxSip.sipSendDTMF(dig); |
|
821 |
+ |
|
822 |
+ } else { |
|
823 |
+ event.preventDefault(); |
|
824 |
+ var num = $('#numDisplay').val(); |
|
825 |
+ var dig; |
|
826 |
+ var diginit = $(this).data('digit').toString().split(','); |
|
827 |
+ |
|
828 |
+ dig = diginit[0]; |
|
829 |
+ clck = 0; |
|
830 |
+ $('#numDisplay').val(num+dig); |
|
831 |
+ ctxSip.sipSendDTMF(dig); |
|
832 |
+ } |
|
833 |
+ |
|
834 |
+ return false; |
|
835 |
+ |
|
836 |
+ }); |
|
837 |
+ |
|
838 |
+ $('#phoneUI .dropdown-menu').click(function(e) { |
|
839 |
+ e.preventDefault(); |
|
840 |
+ }); |
|
841 |
+ |
|
842 |
+ $('#phoneUI').delegate('.btnCall', 'click', function(event) { |
|
843 |
+ ctxSip.phoneCallButtonPressed(); |
|
844 |
+ // to close the dropdown |
|
845 |
+ return true; |
|
846 |
+ }); |
|
847 |
+ |
|
848 |
+ $('.sipLogClear').click(function(event) { |
|
849 |
+ event.preventDefault(); |
|
850 |
+ ctxSip.logClear(); |
|
851 |
+ }); |
|
852 |
+ |
|
853 |
+ $('#sip-logitems').delegate('.sip-logitem .btnCall', 'click', function(event) { |
|
854 |
+ var sessionid = $(this).closest('.sip-logitem').data('sessionid'); |
|
855 |
+ ctxSip.phoneCallButtonPressed(sessionid); |
|
856 |
+ return false; |
|
857 |
+ }); |
|
858 |
+ |
|
859 |
+ $('#sip-logitems').delegate('.sip-logitem .btnHoldResume', 'click', function(event) { |
|
860 |
+ var sessionid = $(this).closest('.sip-logitem').data('sessionid'); |
|
861 |
+ ctxSip.phoneHoldButtonPressed(sessionid); |
|
862 |
+ return false; |
|
863 |
+ }); |
|
864 |
+ |
|
865 |
+ $('#sip-logitems').delegate('.sip-logitem .btnHangUp', 'click', function(event) { |
|
866 |
+ var sessionid = $(this).closest('.sip-logitem').data('sessionid'); |
|
867 |
+ ctxSip.sipHangUp(sessionid); |
|
868 |
+ return false; |
|
869 |
+ }); |
|
870 |
+ |
|
871 |
+ $('#sip-logitems').delegate('.sip-logitem .btnTransfer', 'click', function(event) { |
|
872 |
+ var sessionid = $(this).closest('.sip-logitem').data('sessionid'); |
|
873 |
+ ctxSip.sipTransfer(sessionid); |
|
874 |
+ return false; |
|
875 |
+ }); |
|
876 |
+ |
|
877 |
+ $('#sip-logitems').delegate('.sip-logitem .btnMute', 'click', function(event) { |
|
878 |
+ var sessionid = $(this).closest('.sip-logitem').data('sessionid'); |
|
879 |
+ ctxSip.phoneMuteButtonPressed(sessionid); |
|
880 |
+ |
|
881 |
+ var crtMuteBtn = $(this).closest('.sip-logitem').find('.btnMute'); |
|
882 |
+ if (crtMuteBtn.css("background-color") != "rgb(145, 103, 43)") { |
|
883 |
+ crtMuteBtn.css("background-color", "rgb(145, 103, 43)"); |
|
884 |
+ crtMuteBtn.prop("title", "Unmute"); |
|
885 |
+ } else { |
|
886 |
+ crtMuteBtn.css("background-color", "rgb(240, 173, 78)"); |
|
887 |
+ crtMuteBtn.prop("title", "Mute"); |
|
888 |
+ } |
|
889 |
+ return false; |
|
890 |
+ }); |
|
891 |
+ |
|
892 |
+ $('#sip-logitems').delegate('.sip-logitem', 'dblclick', function(event) { |
|
893 |
+ event.preventDefault(); |
|
894 |
+ |
|
895 |
+ var uri = $(this).data('uri'); |
|
896 |
+ $('#numDisplay').val(uri); |
|
897 |
+ ctxSip.phoneCallButtonPressed(); |
|
898 |
+ }); |
|
899 |
+ |
|
900 |
+ $('#sldVolume').on('change', function() { |
|
901 |
+ |
|
902 |
+ var v = $(this).val() / 100, |
|
903 |
+ btn = $('#btnVol'), |
|
904 |
+ icon = $('#btnVol').find('i'), |
|
905 |
+ active = ctxSip.callActiveID; |
|
906 |
+ |
|
907 |
+ // Set the object and media stream volumes |
|
908 |
+ if (ctxSip.Sessions[active]) { |
|
909 |
+ ctxSip.Sessions[active].player.volume = v; |
|
910 |
+ ctxSip.callVolume = v; |
|
911 |
+ } |
|
912 |
+ |
|
913 |
+ // Set the others |
|
914 |
+ $('audio').each(function() { |
|
915 |
+ $(this).get()[0].volume = v; |
|
916 |
+ }); |
|
917 |
+ |
|
918 |
+ if (v < 0.1) { |
|
919 |
+ btn.removeClass(function (index, css) { |
|
920 |
+ return (css.match (/(^|\s)btn\S+/g) || []).join(' '); |
|
921 |
+ }) |
|
922 |
+ .addClass('btn btn-sm btn-danger'); |
|
923 |
+ icon.removeClass().addClass('fa fa-fw fa-volume-off'); |
|
924 |
+ } else if (v < 0.8) { |
|
925 |
+ btn.removeClass(function (index, css) { |
|
926 |
+ return (css.match (/(^|\s)btn\S+/g) || []).join(' '); |
|
927 |
+ }).addClass('btn btn-sm btn-info'); |
|
928 |
+ icon.removeClass().addClass('fa fa-fw fa-volume-down'); |
|
929 |
+ } else { |
|
930 |
+ btn.removeClass(function (index, css) { |
|
931 |
+ return (css.match (/(^|\s)btn\S+/g) || []).join(' '); |
|
932 |
+ }).addClass('btn btn-sm btn-primary'); |
|
933 |
+ icon.removeClass().addClass('fa fa-fw fa-volume-up'); |
|
934 |
+ } |
|
935 |
+ return false; |
|
936 |
+ }); |
|
937 |
+ |
|
938 |
+ // Hide the spalsh after 3 secs. |
|
939 |
+ setTimeout(function() { |
|
940 |
+ ctxSip.logShow(); |
|
941 |
+ }, 3000); |
|
942 |
+ |
|
943 |
+ |
|
944 |
+ /** |
|
945 |
+ * Stopwatch object used for call timers |
|
946 |
+ * |
|
947 |
+ * @param {dom element} elem |
|
948 |
+ * @param {[object]} options |
|
949 |
+ */ |
|
950 |
+ var Stopwatch = function(elem, options) { |
|
951 |
+ |
|
952 |
+ // private functions |
|
953 |
+ function createTimer() { |
|
954 |
+ return document.createElement("span"); |
|
955 |
+ } |
|
956 |
+ |
|
957 |
+ var timer = createTimer(), |
|
958 |
+ offset, |
|
959 |
+ clock, |
|
960 |
+ interval; |
|
961 |
+ |
|
962 |
+ // default options |
|
963 |
+ options = options || {}; |
|
964 |
+ options.delay = options.delay || 1000; |
|
965 |
+ options.startTime = options.startTime || Date.now(); |
|
966 |
+ |
|
967 |
+ // append elements |
|
968 |
+ elem.appendChild(timer); |
|
969 |
+ |
|
970 |
+ function start() { |
|
971 |
+ if (!interval) { |
|
972 |
+ offset = options.startTime; |
|
973 |
+ interval = setInterval(update, options.delay); |
|
974 |
+ } |
|
975 |
+ } |
|
976 |
+ |
|
977 |
+ function stop() { |
|
978 |
+ if (interval) { |
|
979 |
+ clearInterval(interval); |
|
980 |
+ interval = null; |
|
981 |
+ } |
|
982 |
+ } |
|
983 |
+ |
|
984 |
+ function reset() { |
|
985 |
+ clock = 0; |
|
986 |
+ render(); |
|
987 |
+ } |
|
988 |
+ |
|
989 |
+ function update() { |
|
990 |
+ clock += delta(); |
|
991 |
+ render(); |
|
992 |
+ } |
|
993 |
+ |
|
994 |
+ function render() { |
|
995 |
+ timer.innerHTML = moment(clock).format('mm:ss'); |
|
996 |
+ } |
|
997 |
+ |
|
998 |
+ function delta() { |
|
999 |
+ var now = Date.now(), |
|
1000 |
+ d = now - offset; |
|
1001 |
+ |
|
1002 |
+ offset = now; |
|
1003 |
+ return d; |
|
1004 |
+ } |
|
1005 |
+ |
|
1006 |
+ // initialize |
|
1007 |
+ reset(); |
|
1008 |
+ |
|
1009 |
+ // public API |
|
1010 |
+ this.start = start; //function() { start; } |
|
1011 |
+ this.stop = stop; //function() { stop; } |
|
1012 |
+ }; |
|
1013 |
+ |
|
1014 |
+}); |
6 | 1021 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,82 @@ |
1 |
+<?php |
|
2 |
+/** |
|
3 |
+ * @copyright 2021 Double Bastion LLC <www.doublebastion.com> |
|
4 |
+ * |
|
5 |
+ * @author Double Bastion LLC |
|
6 |
+ * |
|
7 |
+ * @license GNU AGPL version 3 or any later version |
|
8 |
+ * |
|
9 |
+ * This program is free software; you can redistribute it and/or |
|
10 |
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
11 |
+ * License as published by the Free Software Foundation; either |
|
12 |
+ * version 3 of the License, or any later version. |
|
13 |
+ * |
|
14 |
+ * This program is distributed in the hope that it will be useful, |
|
15 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
16 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
17 |
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details. |
|
18 |
+ * |
|
19 |
+ * You should have received a copy of the GNU Affero General Public |
|
20 |
+ * License along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
21 |
+ * |
|
22 |
+ */ |
|
23 |
+ |
|
24 |
+declare(strict_types=1); |
|
25 |
+ |
|
26 |
+style('sip_trip_phone', 'style'); |
|
27 |
+script('sip_trip_phone', 'settings'); |
|
28 |
+ |
|
29 |
+?> |
|
30 |
+ |
|
31 |
+<div id="sip_trip_phone_adm"> |
|
32 |
+ <div class="section"> |
|
33 |
+ <h2><?php p($l->t('SIP Trip Phone'));?></h2> |
|
34 |
+ <p id="settings-dscr"><?php p($l->t('Enter your credentials in the fields from below:')); ?></p><br> |
|
35 |
+ |
|
36 |
+ <div class="stp_followupsection"> |
|
37 |
+ |
|
38 |
+ <form id="asterisk_credentials" action="#" > |
|
39 |
+ |
|
40 |
+ <p><label for="pdisplayname"><b><?php p($l->t('Display Name:'));?></b></label></p> |
|
41 |
+ <input type="text" class="sip_trip_box" id="pdisplayname" name="pdisplayname" autocomplete="false" |
|
42 |
+ placeholder="E.g.: Ben Dove or +15012345670" /><br> |
|
43 |
+ |
|
44 |
+ <p><label for="sipusername"><b><?php p($l->t('SIP User:'));?></b></label></p> |
|
45 |
+ <input type="text" class="sip_trip_box" id="sipusername" name="sipusername" autocomplete="false" |
|
46 |
+ placeholder="E.g.: 1610 or john_doe" /><br> |
|
47 |
+ |
|
48 |
+ <p><label for="sipuserpassword"><b><?php p($l->t('SIP User Password:'));?></b></label></p> |
|
49 |
+ <input type="password" class="sip_trip_box" id="sipuserpassword" name="sipuserpassword" autocomplete="false" |
|
50 |
+ placeholder="E.g.: r?2V!s5w9Q&d7W?8" /><br> |
|
51 |
+ |
|
52 |
+ <p><label for="stphwssurl"><b><?php p($l->t('WSS URL:'));?></b></label></p> |
|
53 |
+ <input type="text" class="sip_trip_box" id="stphwssurl" name="stphwssurl" autocomplete="false" |
|
54 |
+ placeholder="E.g.: wss://cloud.example.com:8089/ws" /><br> |
|
55 |
+ |
|
56 |
+ <p id="labelSipRealm"><label for="siprealm"><b><?php p($l->t('SIP Realm (the IPv4 address of your Asterisk server or the domain from the WSS URL offered by the SIP provider):'));?></b></label></p> |
|
57 |
+ <input type="text" class="sip_trip_box" id="siprealm" name="siprealm" autocomplete="false" |
|
58 |
+ placeholder="E.g.: 123.123.123.123 or sip.example.com" /><br> |
|
59 |
+ |
|
60 |
+ <p id="stunServer"><label for="stunserver"><b><?php p($l->t("STUN Server's IPv4 address and port number or domain and port number (optional):"));?></b></label></p> |
|
61 |
+ <input type="text" class="sip_trip_box" id="stunserver" name="stunserver" autocomplete="false" |
|
62 |
+ placeholder="E.g.: 123.123.123.123:8443 or stun.domain.com:3478" /><br> |
|
63 |
+ |
|
64 |
+ <p id="debugLogging"><label for="tracesipmsg"><b><?php p($l->t("Show debug logging in my browser's console:"));?></b></label></p> |
|
65 |
+ <input type="checkbox" id="tracesipmsg" name="tracesipmsg" autocomplete="false" /><br> |
|
66 |
+ |
|
67 |
+ <div id="voiceNumbers"><label for="voicenumbers"><b><?php p($l->t('Available phone number(s):'));?></b><div class="stpVoicePhNoTip"><span id="stpVoicePhNoInfo">i</span><div class="stpVoicePhNoText">Enter all the phone numbers that you have configured in Asterisk and your SIP provider(s), for making voice phone calls. Each number must be preceded by the <a href="https://en.wikipedia.org/wiki/List_of_country_calling_codes#Alphabetical_order" target="_blank" rel="noreferrer noopener" style="color:#1b60ba">country calling code</a>, the plus sign and the 2 letter abbreviation of your SIP provider's name. For example, if you use the US phone number 3076543210 rented from Telnyx, and the UK phone number 7654321012 rented from Localphone, you should enter:<br> Tx: +13076543210,Ln: +447654321012 <br>where Tx stands for Telnyx, 1 is the country calling code for US, Ln stands for Localphone and 44 is the country calling code for UK. There is a space before each plus sign and there is no space before each comma. The 2 letter abbreviation for Telnyx is Tx , for Localphone is Ln , for Flowroute is Fl , for Twilio is Tw and for Vonage is Vn . If you use other providers you can create a different 2 letter abbreviation for each, so as to easily identify it. You have to treat each abbreviation differently in the dial plan, as explained in the <a href="https://www.doublebastion.com/install-asterisk/#testing-asterisk" target="_blank" rel="noreferrer noopener" style="color:#1b60ba">documentation</a>, so that Asterisk knows which SIP provider and phone number to use for each outbound call. <b>This list of phone numbers allows you to set any of them as the 'From' number, when making phone calls.</b> If you are not using Asterisk and you connect SIP Trip Phone directly to the SIP provider, you can leave this field empty.</div></div></label></div> |
|
68 |
+ <input type="text" class="sip_trip_box" id="voicenumbers" name="voicenumbers" autocomplete="false" placeholder="Eg: Tx: +15676543210,Ln: +491234567891,Fl: +347865432101" /><br> |
|
69 |
+ |
|
70 |
+ <div id="dftVoiceNumber"><label for="defaultvoicenumber"><b><?php p($l->t('Default phone number for outgoing calls (optional):'));?></b><div class="stpdtVoicePhNoTip"><span id="stpdtVoicePhNoInfo">i</span><div class="stpdtVoicePhNoText">Enter the phone number configured for voice calls in Asterisk and your SIP provider, that you want to use as the default 'From' number when making phone calls. If you set a number here and you make a phone call without choosing a 'From' number from the drop-down list on the phone window, the number from this field is automatically chosen as the 'From' number and the receiver sees the call as coming from this number. If you leave this field empty, the first phone number from the numbers listed in the 'Available phone number(s)' field from above is used as the 'From' number for outbound phone calls. The phone number must be preceded by the <a href="https://en.wikipedia.org/wiki/List_of_country_calling_codes#Alphabetical_order" target="_blank" rel="noreferrer noopener" style="color:#1b60ba">country calling code</a>, the plus sign and the 2 letter abbreviation of your SIP provider's name. For example, if you want to set as default 'From' number for outbound calls the US number 3076543210 rented from Telnyx, you have to enter Tx: +13076543210 . There is a space before the plus sign. The 2 letter abbreviation for Telnyx is Tx , for Localphone is Ln , for Flowroute is Fl , for Twilio is Tw and for Vonage is Vn . If you use other providers you can create a different 2 letter abbreviation for each, so as to easily identify it. You have to treat each abbreviation differently in the dial plan, as explained in the <a href="https://www.doublebastion.com/install-asterisk/#testing-asterisk" target="_blank" rel="noreferrer noopener" style="color:#1b60ba">documentation</a>, so that Asterisk knows which SIP provider and phone number to use for each outbound call. If you are not using Asterisk and you connect SIP Trip Phone directly to the SIP provider, you can leave this field empty.</div></div></label></div> |
|
71 |
+ <input type="text" class="sip_trip_box" id="defaultvoicenumber" name="defaultvoicenumber" autocomplete="false" placeholder="Eg: Tx: +15676543210" /><br> |
|
72 |
+ |
|
73 |
+ <input type="hidden" id="user_id" name="user_id" /><br> |
|
74 |
+ |
|
75 |
+ <input id="save_sipph_settings" type="submit" value="<?php p($l->t('Save')) ?>" /> |
|
76 |
+ |
|
77 |
+ <span id="sip_trip_phone_save_msg"></span> |
|
78 |
+ |
|
79 |
+ </form> |
|
80 |
+ </div> |
|
81 |
+ </div> |
|
82 |
+</div> |