Browse code

removed appinfo/info.xml appinfo/signature.json appinfo/routes.php CHANGELOG.txt lib/AppInfo/Application.php lib/Controller/SphoneController.php lib/Service/SphoneService.php js/settings.js js/launchphone.js phone/scripts/app.js

DoubleBastionAdmin authored on 10/03/2025 10:43:29
Showing 10 changed files
1 1
deleted file mode 100644
... ...
@@ -1,77 +0,0 @@
1
-======= CHANGELOG =======
2
-
3
-Versions:
4
-
5
-== 1.0.0 - 2022-01-27 ==
6
-* Initial release.
7
-
8
-== 1.0.1 - 2022-03-03 ==
9
-* Added screenshot image and made minor text changes.
10
-
11
-== 1.0.2 - 2022-03-04 ==
12
-* Changed screenshot image.
13
-
14
-== 1.0.3 - 2022-03-30 ==
15
-* Changed presentation text.
16
-
17
-== 1.0.4 - 2022-04-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-05-09 ==
23
-* Changed syntax of SQL queries and encryption function.
24
-* Modified pop-up window URL.
25
-
26
-== 1.0.6 - 2022-08-20 ==
27
-* Changed presentation text.
28
-
29
-== 1.0.7 - 2022-09-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-03 ==
38
-* Minor changes to certain SQL queries and minor css change.
39
-
40
-== 1.1.0 - 2023-05-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-01-08 ==
47
-* Added the debug logging checkbox, the 'Available phone number(s)' 
48
-  field and the 'Default phone number for outgoing calls' field, on the settings page.
49
-* Added the 'From' drop-down list on the phone window, to allow the user to choose
50
-  the phone number to call from.
51
-* Added the 'fonts' directory and stored the 'Open Sans' and 'Inter' fonts inside it.
52
-* Made small CSS changes and edited app presentation text.
53
-* Marked the app as compatible with Nextcloud 28.
54
-
55
-== 1.1.3 - 2024-01-10 ==
56
-* Fixed 'Double click to call' bug.
57
-* Made minor CSS changes.
58
-
59
-== 1.1.4 - 2024-05-20 ==
60
-* Added the 'Record' button to allow users to record phone conversations.
61
-* Added the list of contacts and Nextcloud users with available phone numbers,
62
-  so that the users can call them with one click.
63
-* Upgraded the SIP.js library to version 0.15.6.
64
-* Changed the look of the main window.
65
-* Made changes so that it can be installed into a custom apps directory,
66
-  like 'my_apps' or 'custom_apps', instead of 'apps'.
67
-* Marked the app as compatible with Nextcloud 29.
68
-
69
-== 1.1.5 - 2024-05-21 ==
70
-* Fixed issue related to non-null database columns.
71
-
72
-== 1.1.6 - 2024-10-08 ==
73
-* Made minor CSS changes and marked the app as compatible with Nextcloud 30.
74
-
75
-== 1.1.7 - 2024-12-07 ==
76
-* Fixed bug related to reading contacts data.
77
-* Fixed start up issue in Chrome.
78 0
deleted file mode 100644
... ...
@@ -1,98 +0,0 @@
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
-* 📋 SIP Trip Phone lists all the contacts and Nextcloud users with available phone numbers, so that you can call them with one click.
35
-
36
-* 📥 Phone conversations can be easily recorded and saved as webm/ogx files. An audio warning can be played before each recording.
37
-
38
-* 🚩 Incoming calls are signaled by on-screen notifications.
39
-
40
-* 📃 Once you open SIP Trip Phone, you can use it even if you are logged out of Nextcloud.
41
-
42
-* 💻 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.
43
-
44
-* 💰 The only ongoing cost is about $1 per month (depending on the country) for a phone number. No contracts.
45
-
46
-* 💸 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).
47
-
48
-We have no affiliation with Telnyx, Localphone, Twilio, Flowroute or Vonage.
49
-
50
-### Documentation
51
-
52
-* [Admin documentation](https://www.doublebastion.com/install-nextcloud/#install-sip-trip-phone)
53
-
54
-### Donations
55
-
56
-* 🎁 [Donate](https://www.doublebastion.com/donations/)
57
-
58
-    ]]></description>
59
-    <version>1.1.7</version>
60
-    <licence>AGPL</licence>
61
-    <author homepage="https://www.doublebastion.com">Double Bastion LLC</author>
62
-    <namespace>SIPTripPhone</namespace>
63
-	<documentation>
64
-		<admin>https://www.doublebastion.com/install-nextcloud/#install-sip-trip-phone</admin>
65
-	</documentation>
66
-    <category>office</category>
67
-    <category>organization</category>
68
-
69
-    <website>https://www.doublebastion.com/sip-trip-phone/</website>
70
-    <bugs>https://git.doublebastion.com/sip-trip-phone/issues/develop</bugs>
71
-    <repository>https://git.doublebastion.com/sip-trip-phone/develop/</repository>
72
-
73
-    <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_keypad.png</screenshot>
74
-    <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_making_calls.png</screenshot>
75
-    <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_holding.png</screenshot>
76
-    <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_contacts_list.png</screenshot>
77
-    <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_mobile_receive_calls.png</screenshot>    
78
-    <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_mobile_answered_call.png</screenshot>
79
-    <screenshot>https://git.doublebastion.com/sip-trip-phone/raw/develop/img/sip_trip_phone_mobile_contacts_list.png</screenshot>
80
-        
81
-    <dependencies>
82
-            <nextcloud min-version="26" max-version="30" />
83
-    </dependencies>
84
-
85
-    <navigations>
86
-        <navigation>
87
-            <name>SIP Trip Phone</name>
88
-            <route>sip_trip_phone.page.index</route>
89
-            <order>101</order>
90
-            <icon>sip_trip_phone.svg</icon>
91
-        </navigation>
92
-    </navigations>
93
-
94
-    <settings>
95
-            <personal>OCA\SIPTripPhone\Settings\Personal</personal>
96
-            <personal-section>OCA\SIPTripPhone\Settings\PersonalSection</personal-section>
97
-    </settings>
98
-</info>
99 0
deleted file mode 100644
... ...
@@ -1,38 +0,0 @@
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
-return [
27
-  'routes' => [
28
-     // User views
29
-     ['name' => 'page#index', 'url' => '/', 'verb' => 'GET'],
30
-     ['name' => 'sphone#getappdirectory', 'url' => '/user/getappdirectory/{userId}', 'verb' => 'GET'],
31
-     // Settings
32
-     ['name' => 'sphone#getsettings', 'url' => '/user/getsettings/{userId}', 'verb' => 'GET'],
33
-     ['name' => 'sphone#getsippass', 'url' => '/user/getsippass/{userId}', 'verb' => 'GET'],
34
-     ['name' => 'sphone#updatesettings', 'url' => '/user/updatesettings/{userId}', 'verb' => 'PUT'],
35
-     ['name' => 'sphone#getcontactsnmbrs', 'url' => '/user/getcontactsnmbrs/{userId}', 'verb' => 'GET']
36
-  ]
37
-];
38
-
39 0
deleted file mode 100644
... ...
@@ -1,441 +0,0 @@
1
-{
2
-    "hashes": {
3
-        "CHANGELOG.txt": "70819344890f1df70fcf3f3ffc3a5a8e6257947c043c9d3d26be4e170ebb5dc4e949ddfea29b16ce51ce19d1ebb3666c990a8f0701eed9e324dac9a04743c223",
4
-        "COPYING.txt": "a0a86214ea153fb07ff35ceec0848dd1703eae22de036a825efc8394e50f65e3044832f3b49cf7e45a39edc470bdf738abc36a3a78ca7df3a6e73c14eaef94a8",
5
-        "Contributors.txt": "8ab4ea9b8c38e4d115af6ca08e8e27592198b763982bd166b67f38ee0b9f2b7e093cd58ce0927ae38ee3bc015b129add2ffeb3967288c804da493241bc67ba9b",
6
-        "README.md": "1dd270a0335705e9e3682a9c6a1a6b989120a71e3738db875d9a16af1f399e0f9fa0078493c8e0bf4f2d614a268ee4e3e0b4d66fb36333fc91502f4c38d8aadd",
7
-        "appinfo\/info.xml": "7359cc28d48f4835014d16596a201895f8ea5ccc03d3679e9f3c3ea44c3faa5d2b4bc17476c227f582ddfe1bcd8ec0301e71e9e8878957a0867d6f7c8b98af90",
8
-        "appinfo\/routes.php": "98f345f568eafe60667647000e29c6ead3d1762d42fe93a91e21724c986fe7ad160291efc1807c499446eab677f69c641e7fea91661921eaf97f09651910d99b",
9
-        "css\/style.css": "790bf3c5eaf74d8663bfadd8996dc4b7d79b8e8e07e51150a86461e385563944dbab67771f176c20c612280fbed809ac3be4601b9c538760fecb6917234de48f",
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": "a9bcf8fa25fee4f4cbc3015fc72b04acbb5dc9d1a1b478e98ee08900b7c7d467aefc7133fc0322731e5df5f6c175a4377f9330e24c2688ca348d5123e6e17619",
57
-        "img\/sip_trip_phone_contacts.png": "dbc03d0298ff3c6667182da0266c05cd78bfb974178bde9d91800f91d4092a8ea242146ac1d0cff6d1d3e939f70401c02e59f81ff7300c5105f1913ac6317d96",
58
-        "img\/sip_trip_phone_contacts_list.png": "a19ecea51a3ea3aebfbb3a7b50847b4bd070483f194939756a35537eb0b13c7b9a2ccb7aa811f1349ee97539c01786b7051d0e1344aae1f7b5eee01ecb8fa5ce",
59
-        "img\/sip_trip_phone_dialpad.png": "464242d474862849705fa56efb85f6ea245202d37ce03c9160610fcff4b252f379ab11cf1fac9710e07de88c9207e0d3b0e0929e39832242d77b659aced38aa8",
60
-        "img\/sip_trip_phone_grey.svg": "5524c9e00c015d023d7a9d8f3427eddb5d94b88551d140528487eea84c6c62b905ce12b53824397f878d214e6911c7fea8ebbc4bff64ef275d443239e70b2767",
61
-        "img\/sip_trip_phone_hold.png": "1b8570c5c7328a637a0406c7241b93e4e0b2630a2aab06ace039af16b9a73520501cf4c82f4492328889026d2c2efffc79ef71f48a913433ed556a4045970697",
62
-        "img\/sip_trip_phone_holding.png": "01572f2685384fc194ff18f911b84fec410f84946eb9939d95c1e07e87326751f635479373607bff508c4b03160f7e2d5aa77053fdf6b7ea8379a8adfd759e50",
63
-        "img\/sip_trip_phone_initial_screen.png": "8bbecd364fdc5f3d7297433a3aaea6f872efa40f58626d5dddc9b3620f712ab8e8a8d3310efd109815575acb49ef3e143f937472ceeba4137dbe442775aace01",
64
-        "img\/sip_trip_phone_keypad.png": "17f8533b3f8c8f9a138b69ee6da96e3e5277f8184d4c210fdda92ea6c411c6d2d21ed111a2a22a1348d532ad3d58c3625c8f6ed14923180499952b30c8368a60",
65
-        "img\/sip_trip_phone_logo.png": "3309a656543c4fcec77de1356c88f834cc244d423767c5ebe2f8b90b27b738bc426f3cc0e9141220e37c51e4a15791743539b694ce6826b97ee929b8d8e9a098",
66
-        "img\/sip_trip_phone_making_calls.png": "cdb811527acb8655b15480fe21975ebd35082b4bef5c0d21c3544bb2488b2a7343cc252edda55fd1c8b9f320be4fa812b5c4a6719e246fb87efa424bdde1070c",
67
-        "img\/sip_trip_phone_mobile_answered_call.png": "027582716c06a0140ea6d2dd520dd97c39043fce03042609846e2b563c182d736ab1dbad7e41c77c8afda14f555d290ff53357c93bce988adda106ee2e326856",
68
-        "img\/sip_trip_phone_mobile_call_answered.png": "2e515106dc15b43c1a3ea979e99777123900f33c1ca2f188f31233ff57cdfd710ee98acf0165ec35dab4bf86cb9001af1ac11ed13d564e5d322b98ae62193405",
69
-        "img\/sip_trip_phone_mobile_contacts.png": "726665449b0c4dbf50cec35736759ccb30414cd4bb59f60f786eaa4ba403e6f1cf9eface3f9feba0ba3e8cc64415b4d77fb0b3e9c915162ae0f8b4b4a0d8ddde",
70
-        "img\/sip_trip_phone_mobile_contacts_list.png": "3f9882ba70c85dfb9e4549d421a8899dffd4f62ebb64e3d3ceef0cd7ed495f74e8631a0034fb4757af4a6c0f2ac5c7f9c9ad04643be3cc4a137ccf73fddc008d",
71
-        "img\/sip_trip_phone_mobile_receive_calls.png": "04254763e2cf75eef3001d68a2f439f79cad2e4a31a5cfb3deee844ac770797e0c2b0e6e56f2e13c21c4ca1eaabaa99f76941a096dffc78e2f8e3fdb8b8336a6",
72
-        "img\/sip_trip_phone_mobile_receiving_calls.png": "6daba96c534872e45fef6cecce49ec799eff19c5951a403ce8a73b3a87f584874ccea1dc44609c2b349ef2ffb9a84a76af3c5bcd9ed6406de4e7b2f6e0e8dad0",
73
-        "js\/crypto-js-4.1.1.js": "60f2a01ad255c25e44bb07ed0221feb99c1d61debb7bc4f8a85c96e5aeb2b9705b89ae17218125b30e5a700cc5b9a0da9f94b5b9ec1732efe26ee46c6c953d4f",
74
-        "js\/crypto-js-4.1.1.min.js": "13c412bd66747822c6938926de1c52b0d98659b2ed48249471ec0340f416645ea9114f06953f1ae5f177db03a5d62f1fb5d321b2c4eb17f3a1c865b0a274dc5c",
75
-        "js\/launchphone.js": "0689fbd6ffc3dec78982bedd40a2c1fa9a557c9e1aff38cec33c5ff00e3f2921695ed17d7986b96b78ef635dd8c133afb3cc33b188cd8555f28d643db6f53b80",
76
-        "js\/settings.js": "263f0b86f8170cb07b0439a9e5a21a562bab81c83cb31572bf92528c113771938aab06c063f5d12cd64105a998d06daa276220510a4a1d6f15ca9971e1f60fe7",
77
-        "l10n\/en_GB.js": "3e93734bdf5873913caa37a855692d78d0e51aebfe00abacc2ebd22baee1a53645fa4f6d71fbd5dcc1c90a685556613ac61668a97fd1bd5b8395420110330c24",
78
-        "l10n\/en_GB.json": "64b04f6fd98838588173aa8e53e1161ff9c7f6c05a342056a86838a369977ddec7bee8edcccbe457a8526560233483059e70c5c0917d1c6fa8dd07a49949003b",
79
-        "l10n\/en_US.js": "3e93734bdf5873913caa37a855692d78d0e51aebfe00abacc2ebd22baee1a53645fa4f6d71fbd5dcc1c90a685556613ac61668a97fd1bd5b8395420110330c24",
80
-        "l10n\/en_US.json": "64b04f6fd98838588173aa8e53e1161ff9c7f6c05a342056a86838a369977ddec7bee8edcccbe457a8526560233483059e70c5c0917d1c6fa8dd07a49949003b",
81
-        "lib\/AppConfig.php": "e0279b17c389a2ba883c07800f43326efc427d96dd6d4e123e14b0bcd4dd4dcc521af3c2fa1673c7fe68ee915a34222dead68f266ca34db1c864216c24134c39",
82
-        "lib\/AppInfo\/Application.php": "a80c8968ac1af43642ca5131a3119be96fc85f222094f8b8ec638f752b5db75296472a71ffba716eabbb9bb2a0054fd984ff1ae53cc72ba0761ecb64eb8f84cf",
83
-        "lib\/Controller\/PageController.php": "d4cbab17fe2620e15bd06d2beabe849e9518f198a48e6dbe7ea213e9b07b2aca15b37f15ec7e6a94d26e173461c7ec31ca5630cf2391df6d7d3c097c1f47d478",
84
-        "lib\/Controller\/SphoneController.php": "fb0ab1f2a13632883eab2ddfd9580f53cf9588eaa9d9860fd6a51e2f48c58ec201ba8af39d079179d98fbc32f3b9db1532763aff7c90ef564cc6f31ccaa144cc",
85
-        "lib\/Migration\/Version100Date20211106173528.php": "2d81e8fd03611db1017c08d90325a680928cfd367701e479d8c765b8967645cf9ae27725f657d655615f5a878307edb87b3d2a0bb460161e14de85d498798ce8",
86
-        "lib\/Migration\/Version112Date20240108213517.php": "6a535855e4eeeaa63b62ec1b97d9484f727c0aa08f16a4eb65888f0d133d93498e20adc4d1942572924d553af425a8632a94bbde8d3101a28b07c9301d6b43ba",
87
-        "lib\/Migration\/Version114Date20240520042641.php": "f6693866d02f6b1d23195e27a79ed3622928b468b48c6c43f4050370200d2cefcff53d6cf11a1ee110d40f59741ab5b780576db47e2df70ab11a4e872700bcd3",
88
-        "lib\/Migration\/Version115Date20240521091835.php": "59dcd466195938b7503cd1c9ae319d88c8e344ee3da88271d680905ec719744bde3cd733aebe034415a81329cedd79a851f0b97cb77b6f4193232c643e727303",
89
-        "lib\/Service\/SphoneService.php": "e7820ac27242bad31448503a2ab6a38324ac35cb56dc533972cd58e0b3aefd4f76c7f7111738d92d11bbbee75b642359a4f3fe159630e04675b6bbcb63f923d0",
90
-        "lib\/Settings\/Personal.php": "d031350a9e5c1b0e78fff57b672304660485b9b307c28eb8a2dc7a3782c6329cb3fc659041d331b97711485a92d10bd99d739a17eaec088f7837d2be786500a6",
91
-        "lib\/Settings\/PersonalSection.php": "b2104766a5df419eed6811630c2d2de6b817f4b0ca77b5ca018344901cb8db0cefc8c78d4f45b14f4b5129aa986ae583b69c78d50cd91f8502508dd8724d3edb",
92
-        "phone\/css\/bootstrap.min.css": "b82d1fb15e8eec863133d7491103e86bb1cb67442509bd141f2c2730dc237c351d3a10bd4e9633ea208c39a98b6a508769c7c448aed809bee43a83e10361c402",
93
-        "phone\/css\/ctxSip.css": "5b57b803ed4c39659d64031008ec111dfd484e58e1d4df975cf3ca896d978d67646ab19396f2d3b6062e20b365254d664c47bc4e9894c8dbfd7400c2e699560a",
94
-        "phone\/css\/ctxSip.less": "9b53e079978d5a672827cadd1b1f9ca63c69af22a77e52fb12318cf445a96ac2f537c797f64f4d2bfd673bd4c1b15d22de9e9ee226add5ca443db36a6fc24905",
95
-        "phone\/css\/font-awesome-4.7.0\/.gitignore": "c3621f6be50311134e6d7a1d34a9638f747f4074c48527dc7975957d6c87b9cb36b64bf8385fb1a59b52a281f1e72ac3f1c268dba6d09ac951e0f4618bded3d8",
96
-        "phone\/css\/font-awesome-4.7.0\/.npmignore": "6de3301556255638c616eab313a3d8ee5c704b1aa5b57a5d85e5723cb3b810a1ebcc148c33dde5c4989a691f18f8a2ace97c40df2e9c4306b840a4823587ee2e",
97
-        "phone\/css\/font-awesome-4.7.0\/CONTRIBUTING.md": "4576f4a2b8070a422891412d123025245fc3ae5511de09e153a1924aafa5d8d8de65fc530db79426055e21996ee9ef1bef22a192f46cca3bb94894d0d54d6ecf",
98
-        "phone\/css\/font-awesome-4.7.0\/Gemfile": "2add4715a7f520d0bbce11062202f6d1072efe569207c801f9ded213e8d3b2d0f879071c39aa117839e5e3a73780b1081e18dbec2ac79b6b4756deb4a8a4186a",
99
-        "phone\/css\/font-awesome-4.7.0\/Gemfile.lock": "1daf45ff9728c007cec63dbafeafc394322273e3620f911769b230de8408b71838429c86f45324885db7029cb4661a5dd6057e3e6961a98ee08d87e7601b85ab",
100
-        "phone\/css\/font-awesome-4.7.0\/HELP-US-OUT.txt": "f0ebc1e7ec38a8cd333b34e2deebb416ffab31f3cd707f27e310beff328e5e05962a023da606c62559c8b606f7138b90896ee304fd45e86afdd2910ac8cdda57",
101
-        "phone\/css\/font-awesome-4.7.0\/LICENSE": "1a7a0986aaed249087bd3a01cbda0361cddecd4ac0e4da9d7095f6193b4dccc559d570789b0a4ca2606f2ef137f2c4174cef735a8535371ce7e3a55625dfa801",
102
-        "phone\/css\/font-awesome-4.7.0\/README.md": "34655fd4be9d98ed1d419c98372cbfa58684382fda11936fbda3f6b39894cbe9fe429b6ec3346315cca309c2d07648064d0554d1e241c6ef9df57e6fcf758ca1",
103
-        "phone\/css\/font-awesome-4.7.0\/_config.yml": "883821543b8f3d2ea37e88186afe841c085fedb3b7ccaea49757af224b0dac02ac9eb5b8d7ce1648cb57fff434936313315c308ba624941f5f5c0b1fce083d64",
104
-        "phone\/css\/font-awesome-4.7.0\/bower.json": "5407ebc1f339b0ccc665e1fe5edc8c92bce01fcd0f5c3be302f407bec80a315a0612ffb2b71a93bd0e19a1fc1eb34095a02bf0aec659b08411fcffa3d289b7e2",
105
-        "phone\/css\/font-awesome-4.7.0\/component.json": "12fcbaa3f72f707f433aaa532774497453d447e3402f4afb1c27e8ea9b3cf98108229292af312aa434722e9b50b2da115b2392b82f41b19144d6dd2ea183d659",
106
-        "phone\/css\/font-awesome-4.7.0\/composer.json": "566b0aa11e55c98698c1f23b92bd05cd583c5448a3c4a33582f05a19325e26b91f82138822d0ea2b1397491add3e4b79d2682acc7dad6beab24fd1621c3d27fb",
107
-        "phone\/css\/font-awesome-4.7.0\/css\/font-awesome.css": "e40f27c1d30e5ab4b3db47c3b2373381489d50147c9623d853e5b299364fd65998f46e8e73b1e566fd79e97aa7b20354cd3c8c79f15372c147fed9c913ffb106",
108
-        "phone\/css\/font-awesome-4.7.0\/css\/font-awesome.css.map": "fc6df90f77e3ab265e3f19c2d6ccc27c49d5ab94cb956a2de3e16edfb3f59a3e1f9df3182474925704412ea056bc0acfd70f8f599c9fabefb48b43355a1e29cc",
109
-        "phone\/css\/font-awesome-4.7.0\/css\/font-awesome.min.css": "49f4e24e55fa924faa8ad7debe5ffb2e26d439e25696df6b6f20e7f766b50ea58ec3dbd61b6305a1acacd2c80e6e659accee4140f885b9c9e71008e9001fbf4b",
110
-        "phone\/css\/font-awesome-4.7.0\/fonts\/FontAwesome.otf": "a3acaaac3a9861ac7a4ba23e52b9115d39b674cb685b45454fb4b80329a4f7370b5ea7dd8b41d630798f8a54082b62411fd63332752296dbf5f2b3b96abb8874",
111
-        "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.eot": "c160d3d77e67eff986043461693b2a831e1175f579490d7f0b411005ea81bd4f5850ff534f6721b727c002973f3f9027ea960fac4317d37db1d4cb53ec9d343a",
112
-        "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.svg": "4f575d52331de91a2e32cc3408dd0eaf0cf25b7244d34b226314e3647e85ce284f86e3b7238c6c8b9022dc4e2787bf51620849290cdcd5d4c4bc905f289d2156",
113
-        "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.ttf": "9ffb91e68c975172848b4bba25284678cc2c6eb4fb2d42000aa871c36656c4cebc28bf83c94df9afdfbf2407c01fe6b554c660b9b5c11af27c35acadfe6136ac",
114
-        "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.woff": "9c776dea55a01fd854ea23b3463d9ac716077d406ecbe8ed0c9b6120ff7e60357f0521ab3e3bf9d4e17ca2c44a5d63ee58a4e7a37a3d3f26415a98d11c99e04f",
115
-        "phone\/css\/font-awesome-4.7.0\/fonts\/fontawesome-webfont.woff2": "838fefdbc14901f41edf995a78fdac55764cd4912ccb734b8bea4909194582904d8f2afdf2b6c428667912ce4d65681a1044d045d1bc6de2b14113f0315fc892",
116
-        "phone\/css\/font-awesome-4.7.0\/less\/animated.less": "285de8b339ae691c8c95230462b8760949850ecbd1a4f8b98b0f85347f1187ca7727507a50ba7ee362b57b1ccc94efe57fa99bb501bbea93561ca3104f73084c",
117
-        "phone\/css\/font-awesome-4.7.0\/less\/bordered-pulled.less": "666a33697b525aa25d773c94360b96dd6ff833dedf99178af931b040aa93239c5814bfdd433a841d77c2a3addcc444d7ec95c83073b9d30e48ed5fff4e82a111",
118
-        "phone\/css\/font-awesome-4.7.0\/less\/core.less": "88b310200bdd13129f343e8f9b581e3a376fd5aec4c7a604815101774d31ca3fb469d345321aee80303842309b10273885195545f69fb81ea13215e751ef5187",
119
-        "phone\/css\/font-awesome-4.7.0\/less\/fixed-width.less": "b7bf0de65815043012e95e8b1bac895e85c9a07c047c99ba4f5c132a00ace5aeb3e838f2aac26d8451b38d193fde8199c45d58a2a79931e5bdbda47f15c8822d",
120
-        "phone\/css\/font-awesome-4.7.0\/less\/font-awesome.less": "f5cf809023468a015234142efd754543054f9fabcf06ecb58db792537b8526c5d73098cb059e6e37ddf295895e92ace9005e9c4e5eaab19d33f06ac478c69acf",
121
-        "phone\/css\/font-awesome-4.7.0\/less\/icons.less": "8735bbdc8c7c9d082c2a1f261c74bed575fa096ba8775ad48ada6894f03a8319414db099395e80f16f6e89d802c988c1a2bbf73252c65acb040c35d40b9ed0f5",
122
-        "phone\/css\/font-awesome-4.7.0\/less\/larger.less": "5ba01d3b3c917dfcc0bf20a283397e677d420addb83c74d29f81d77658105c8d9e48784d2e8f5214919877141056a74f06d3081fa291269f92c4506ac089a745",
123
-        "phone\/css\/font-awesome-4.7.0\/less\/list.less": "a13c48c3ab87469b5e720287f5f1720f0588bb45a0700968879cbba7ba008d070cdcd69b41d374cb504311c0a20bc4e727872855ae5e90fc76b1589104acc07f",
124
-        "phone\/css\/font-awesome-4.7.0\/less\/mixins.less": "9fba58dc30953169340a57fcda1b3dcccbe69cb9ee5ad3e29e53719fb185f4b49f9571be248675d5cf5d82f86482086df022283b31b1766090f9954755f7a47f",
125
-        "phone\/css\/font-awesome-4.7.0\/less\/path.less": "2214dadd8025d0da912ee4e0366a25b6d521f61ad04cd61c0b13140a9465d7711db8a80e3c83bc5410624eeef8bb2dbd1aba48cc3fa39b75d5eb5e91afbb7ba7",
126
-        "phone\/css\/font-awesome-4.7.0\/less\/rotated-flipped.less": "a906cde529bac0abc118201866c6e81ceed53ea5859795ebe87e52e1d04f1c32b0ae1dc2a9297e2d6a2cc44a7bbfcdccd01ead571198027430b98190ce5efa67",
127
-        "phone\/css\/font-awesome-4.7.0\/less\/screen-reader.less": "7d5c0d28b78b9c24b6af0181f8bf72d1b7bf20c45edbf1594da8b4c8391dd24920b9d0ad186ada7217755cbbabb9bf6ea52acd8ed39f7c9abf4659339eb70504",
128
-        "phone\/css\/font-awesome-4.7.0\/less\/stacked.less": "0f07e1507d430c8ade9cbf2460c8148d69fdce6b5b7c659247953e0e0235c5128cec1cd1a329790b9bfa42967cbafd36776d81f6e4ff80520149f8ff4a6ba629",
129
-        "phone\/css\/font-awesome-4.7.0\/less\/variables.less": "1691b468571a87081a892621941b3f0f954a3c5a4c588811b329e092bae28a8946f4e0ed5c440c7bd4248d3aa31c3be26867d28771703cbca41cedf5f3f3fc72",
130
-        "phone\/css\/font-awesome-4.7.0\/package.json": "e66e530ac7b2d050bf954b40ea6af7c20296e7613dae6028c76a12dc6e0ddc92cc89dc565ccfac27d529c7c4f2aa938b52cf3c7a5ca04c86ab6c52fcb9d9c2e3",
131
-        "phone\/css\/font-awesome-4.7.0\/scss\/_animated.scss": "5d8be64ce5136d02dcc2dc38341491c2cafca5633a8bbcf6bc6931da2ec95e2e29ffddd8a058842da4764620824914f7c7c7048a6c9e54d3e97bd7ab995834f5",
132
-        "phone\/css\/font-awesome-4.7.0\/scss\/_bordered-pulled.scss": "01095953afd37d399f8715168a67a2e60c23623f3ead4eb4360f8800e30cb9572ee5d90b48ab4d0e07271f75b11da2d4a4cc39115a872e2f001000cfb46a8bea",
133
-        "phone\/css\/font-awesome-4.7.0\/scss\/_core.scss": "78b807ddc8ac17eebfd4f59eb923a7f8bac8e7b76bc83985d593382b1964f1d98539af83c95c4aaf99e3e492304e08d452980879213fc13d9b9f69539f1f74c6",
134
-        "phone\/css\/font-awesome-4.7.0\/scss\/_fixed-width.scss": "27392694f9bd1a671cd21517721a86c24725c51fcad4acaf09cb75a9e36bea34176af900c82e061eb0ee6b60a1bd0d9e99213119c5175c2f48b6800258ba840d",
135
-        "phone\/css\/font-awesome-4.7.0\/scss\/_icons.scss": "b7f5aa12eb8cab73fd506d499f9c871b54d5939058b9ac27b858499f051d9af74a6374b2bc32eb2aecc169f9c2332cb2abd6b56b150d864df1d19ae153f16301",
136
-        "phone\/css\/font-awesome-4.7.0\/scss\/_larger.scss": "ed6e63e7cdc9bae34810146c3dfd52b912f7b20219555994249f6f3dbd528673af58b69deecd9819f28f71713076c6694f6db0e31148e8e726f714312f404a73",
137
-        "phone\/css\/font-awesome-4.7.0\/scss\/_list.scss": "d8b110a513c41ba8a00620143aa01b2bca59f21306b64e96cb82e4739ea88beddc0d3ba2679f277a34c89fa5cfa3d4b0f8ac5b16d9beccccae36b2f8450ef75b",
138
-        "phone\/css\/font-awesome-4.7.0\/scss\/_mixins.scss": "da84a310d9322e8a4b5e0c739e93a5c66418930930eed7e4a14351b61aa6073465302552642c75553819fe2ea7903ece21b20494761a94daada05bd6fb2e48fe",
139
-        "phone\/css\/font-awesome-4.7.0\/scss\/_path.scss": "9eaa7d29bb402c790bf1ad40ee849e26743d198bff3cfce0182c2320afd9d47f4377b2bfb147999a057604dcfed33e408065577a516be0f3623fc0df75120912",
140
-        "phone\/css\/font-awesome-4.7.0\/scss\/_rotated-flipped.scss": "89a2a4009628540c88c9375c7f04bade6bb9b901575c12fe22d0031c10011f4c5c3b7834d4caf6b1cfb84501a5a77d5c4e6cebc9a8ff92c8bc6c82ec6bfed40f",
141
-        "phone\/css\/font-awesome-4.7.0\/scss\/_screen-reader.scss": "5e3c8df5f64a9ddd9c7dad6f939156090e832a43c4352f7f470169ba22133267931f53100da2a4f4ec5e5528734c5d60c42ebc64fae6a5ee1dbc2e920dc343c9",
142
-        "phone\/css\/font-awesome-4.7.0\/scss\/_stacked.scss": "25492b5ff68a6d2c8f9ddcebbea75b1f14a7f47d599bea5d75e1f5fabdb5e3d43147e6df2c435c7ea639c094811872e53941ccb79f204026b6fe2cae172df7ac",
143
-        "phone\/css\/font-awesome-4.7.0\/scss\/_variables.scss": "77079c62eb1459ecc6e763e863f02f5faf9289b333cb43b2402bbf822837dba4d6af22d97fcdac68e252cba9758a91386483733ccf690c3d4eb5f1d109794f29",
144
-        "phone\/css\/font-awesome-4.7.0\/scss\/font-awesome.scss": "e5cd637954db11cc3e86af92ec127847c7476c22dd1e165c56a2816733368f02edff7fb54679ca77574f8fd86778528b6ff51ae0a39701e09b310a84b877580a",
145
-        "phone\/css\/font-awesome-4.7.0\/src\/CNAME": "060fe8853f4156b0fc81b945c6a3c98f0259e9a32adf02967a1c03e76bfd3bbb918364d208a411ab86299fc0719034750956f8fcc98286bcc3cdcb65314474a8",
146
-        "phone\/css\/font-awesome-4.7.0\/src\/Makefile": "88682614a1f8b34219819161e3fe03f8ee575afc05d0a883ab78cd8a772a7e6fbdc13ba4e4bb4a9d2f98e32772ddd2958e072b817e9ba195ee66c68087225eba",
147
-        "phone\/css\/font-awesome-4.7.0\/src\/README.md-nobuild": "05eade6bc17a7ab940d65e656c1f4d88656e15137ce90a64b3220c1b74cac41d27cd1764c63a6bcd5d8c43a17aced01d782ff4b714f559d18378c78a518182aa",
148
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/accessibility-facdn.html": "feff45586c2e4dec12c1d766b7a8cc815174a56b37567da96d62c04e15c072c902c70713b6f06fce9cc1eb2b4bf0fe44f2dd7b3b630e6cb3006e98e819cd54e2",
149
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/accessibility-manual.html": "c521d6c66a661530f5368c9cd7d191caa9cb791060f678cd44b79201196ce86827babc366e28a5cb311d9ec8929354354da0f3a04d3ac9e370441933bf57615b",
150
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/background.html": "12ef24dab463fd60c8dba5799f069785be108dd5666bccc3ad551af680d7ed3f1ba5c87feb0a10e52efc415ac5cd9fc89bd314f26552e844b2441a61b6ab2de6",
151
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/cta-cdn-ally.html": "d2cb6cec928638e10ad2aa93b7ea55b2184b9504edcca4e87ab20ebdca610a6edc45ee2360abdfb25956df207949cfd94d78206fb5eeba39c2d8fd9d1410952b",
152
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/accessibility\/other.html": "b6ea9fd4eb72fe8b20f18449ca22c65eb72399c8b5c956b598401d95086a37e885883064a06e58a35f2fbb69a296c069f8ab2d3b033e2148e4663cf08542184f",
153
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/ads\/carbon.html": "d6336f7613a75db891904471980c15e3b6d81ad014e13d6317eca29c7b5103166385e8959d3702e747ff83560e97920801d6a246772c617abc7811086a283aa2",
154
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/brand-adblock-warning.html": "5477ecda666bdd618d7e68af4539187ee932dd29418699c0c0e69548b47d20ea98d289a9e3b691696891caa1a9095ab8252ed11425964d8db9df34641d44d62c",
155
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/brand-license.html": "739eb68b48f8d4f555e02f7ef9ab1801aebf6cfad50325d20c63c9068dfca73d0dd27eb6ec4f4e96cb5224da8d8b8fceda4df088411d1022cdbde272e3ae03ff",
156
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/code\/core.less": "4452c88a8b284dd090873896e0b46b86846f2a23dfc90fe69ae561404bc1417e085c6546ae99827196feaec49bfda147f2810359a1b692071ed2db64eb1561c6",
157
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/code\/core.scss": "125638298cf58ddec200c8c58466fb568fcf76e3255f64737b59f9aab1ffc1c64a5f52082d3de4f80e88d25f3e34472107aa66c4bbd55e823df465db7e768ac4",
158
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/code\/license.css": "4a92760c82226b27a683a3860fcddda105d657ed7282221e5008bd8e80b299cbee5387e45e86e18988291870f1ea980ff5733cf36676bf46fd633f92ddf6e638",
159
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/getting-support.html": "fd3d2680d3ad916cedf632dcd2da0addd756fe939dd400c67168090dd6aa97ed067fd3ba4d4ab8919507a45040ff0a93899617542184691b812a899c84123b6a",
160
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/project-milestones.html": "5ba81ec08a037967dbb218e04057f1cc9b03fd79d02b3baae67a07dda595727b8409749340949b4001409543a8fa184603eb788417353b22d8cfb24eb014b01a",
161
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/reporting-bugs.html": "f6582dee7f90225b0047b480dfaa35362477740b29215366227f27d53ed2c43005c4d2b60dabec41b33a482d516f5a23c2b229408fc21b97063db704d96ad098",
162
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/requesting-new-icons.html": "479e29dd3f3dd17083e8ac7320c1a3de111d69cc1db7f618c0003a494b89d0e744c718f70cdd41300a165bc5e0fb6b9758e8fd82564ae47406e6cd104d9b9b04",
163
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/community\/submitting-pull-requests.html": "d62ea8e1f09ef35627c9d4d0498ff514fb1c88ca4215ab72194fcc3a90aa7a4ada5d202399de9aca41f01a20e9dd674c254797f94a6a3b8380b2df1af463d9f5",
164
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/accessible.html": "26fcba6f7236ecb034ed5575f02e7e7872878abee5d51444d06e8d976a80faaf017e9bd4aa43f2bc314759e5564c3030ee655ff8062d8aa551ec57060aae6cff",
165
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/animated.html": "8d8c90d6dea5ac1e869fc1f6234db28f6aefc7b489f774ef8abe64bedd7e82c5ed6efec2d4a85b9ac0152f50273695a2f8688aab3d904a130f001d2ba1704a21",
166
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/basic.html": "f5ab39675edf6375e893509f3cdc6721c50cc721229d2cd0bcb2437eddc644e02b9d1e714dc1c2d34e6675501e3c7b0469e454455d40c5a8e7aa1e83ae54d873",
167
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/bootstrap.html": "611cb46b313ed9d3412cfe9279981937a6695268392a88cca6e4252fb84b7f9c63e244d70b650abc8e73fd4648254e04995a79c9f68a695e7b8373bdd2ea6786",
168
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/bordered-pulled.html": "d97b2d4ca375122587565da7ad6a89cc761c1a01648140f6b003903280af01dd29ef23ea565849a62d892b9dd547a517a8028e2cd63a25fde89417b4476a049f",
169
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/custom.html": "09e01e23c1941ffe88d5c047285621f41452ce960686f00b3415ffff482d41748f6729f734a44639acfb0e1a6f47bf6931e707cde1cbb059de6b9c4c8e0cecda",
170
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/fixed-width.html": "fdc321a99a9570b65f3330f1e743e2a5a24f07d8759f45b811b00d2765aa7626e8c48fc316b5c040a4d847469c13873981d1098a378123632d288c787c9d74f1",
171
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/larger.html": "d9d38540bed78cc038323acd638d96c764cb18765ce328f4fcea4282cf432013e7a15482a56db3be50a9a1150743d078d891fd01cc5945d48952547974338af5",
172
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/list.html": "43ac890e702de4ee53d71a3f4ed18b66b5633e15ed8ece1f4039d1c3377a1d391051fb00b037f2e4a1f1c757d6cf615f069efe615b88aac1be4ee923b8b1d425",
173
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/rotated-flipped.html": "9c4eb8ca3cdb2309f87ee0366a75631a6a311700091f4c8189d74bbc4a33e3003635ebccc8c9aaf0d0960284c088f490e61c2a51e79cfbac4a72cc2609f90880",
174
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/examples\/stacked.html": "9bce1d2abd759645aac7c2f0fd54e55a34a2668882e337d89c8ee0bdea14bf790c0c03adc7f6ecc6d8e1cf13deabb8f9c90f0cbe4d44a867fae42f72d5a83711",
175
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/footer.html": "00b38469e9dfbc25d4905c9e71965064f1dd11d868bf0983de1614f870309e2313fea222e4ed4206a71c07924cc45bf28f8c0fd6428d331a58df566cd6988b54",
176
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/accessibility.html": "9b99cab0babf09aa30dd81d6bd675e43b7e8cba79e785d0dca3b7529dae910c2a96eb2c37a97e98610e2d9c5c2bcd84f85cdcf6ec22b72a81fa377edd529ca41",
177
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/brand.html": "fdcf75c126f165963c273c164f14cb933760ed977d1b734e4843d4299ced9dff545bce672409818ab2dc8391fffee391e17d1a56c80d52b39bb92df8679139db",
178
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/chart.html": "5d11f2d8367ee116fd85495a80a918d0bff70f641dfc4d7e6fed17e7e15496c04079bc8753b092fc3b50a19b5eff67c2790f7be8f49228a729bf4eddcfc892a1",
179
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/currency.html": "66b4d159ad39c6c0a96ccddccfec84e1b12f654e5880464042378f3439ce8df3257a33ee1df55252fc214428b52685a425ba91792c52f28984436912bea6ad21",
180
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/directional.html": "281f9c2e899998fee66e3d5aa1481451d23a2c2964e962506b04190cb84acdcf5e12e55d7a02e0a59793fbfdb78a5bd95203ac560441867ea49ae26c971d4060",
181
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/file-type.html": "9db9fd23e94d311b5d6b9258b5efea167037f6fd9ae54c57e8cc6505cd92bb14edded5dfe614dd27327200832268d56084f3060e18f29066bf99c141ef20c109",
182
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/form-control.html": "4a14aa9f08004d97cd7ef070c0e0423734bf71d1607bcd9d27f66f148876a3eeb355966e78207dad0e3da8ac1589df4bc6e1c6da661c2d1ae9c85d34fc77b254",
183
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/gender.html": "76950be4360b1eb448c6a41cf6adf739f74b3c60254b3264356e3b71bcaf791dc048915adf8e1730b819316fdb5cf934446a121d5d5461a743e03b7e54103586",
184
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/hand.html": "2ffce735b462f5b5c117c639f22be1a83de099589ffaf378355c448cb748d9a051280524c30224f7796bd317b74f201451765c5b37125440dc4db6aed420d8c6",
185
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/medical.html": "171a709bfe146dd5ca49647b9acf81ebcf62ef0a27d6e1aa8859c3a00b25f05b867712df7bba53e2e87e33b46dbc0eae107b2e1f3de4eb5b82d7e8fc8443d818",
186
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/new.html": "7d292287112e46c450034b08d51f4c1435782331e6049ec2fb5579ed9c56ccd6ed4c06b9f33b503a1d5e09160bc4c766df53eef6c1c0f90f95f2e7deefc9a628",
187
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/payment.html": "d8169b40692ac8fa117ce16eb7f1f6bb1b6f39eeac5a4f6c1aefad2b5278f1cdaf773907ada1bc87953fac97b9874511eb1d163462491c95eb9dbbb7a27e113d",
188
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/spinner.html": "2049127b24cc76076489d861ebad12207abf87c7b015ddadca72e66ae11a28068bd0d1cc9d28b245f236cbd72e0def6e90486cc1fd14c61442c57052a97cc956",
189
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/text-editor.html": "d4a659a0d14329a5a21c2369c3d3bb3bed12c88b19b18aaaabc61c095245885ecd39db439d454de3b4f15e3ad4764b909e240e38df28ee3eb25fa92240bd8038",
190
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/transportation.html": "4eb63448d28f9f6e13c3bfdadbec3b30f6985b17e3831d48e0ad15b3b1a6c41bb547bdb009b741d149f857cc191dae8f382b550aa6c8b8bad0a3c5088ba2581e",
191
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/video-player.html": "4f3aa37ee53df679d1baaf01d803bbe1346313ff5c6d2932a34993afa0294f23b9b29cb8a3876bd94e7be14469b6f3f04d52393260b32e790ffce2ae38de3a41",
192
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/icons\/web-application.html": "c430a80b58d49eefecf12236366f629d3091ba3d558a510d68a7ff7d5e4eb2d55d55c7fd781ec0e14422c7ae16775c6c90ef18f7059991b2285aa94e6630dddd",
193
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/jumbotron-carousel.html": "a9af25e69e6e61a582917c86e34728a8205fce95f94e4ff9fca4a27af05b68750609b2a4e13fa8f728b71bdead30c182055f2a1d329e6cd679d6110fe674e7b3",
194
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/jumbotron.html": "a9663212f87ba8e79d819fb4f896d0a8f53ab8ce57958a7c20e9587d03fdf499878f0121b7125a0bea012d21966bffd8cba3b0dd80ea4872bc590ee8aff9f5a9",
195
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/modals\/download.html": "df2bc4bffe3ee6f3286b7925594b23bee5775cd933b5b102328676b0d9a0e052387aca2d9495f7748bc2a7b626d5e5c08ffa338c2d5766620e0631fd202572a7",
196
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/modals\/fa5.html": "cd55e54afc79886bcc57f7cbaf0f100fcc41c26bb6a8a9c8a072ebec5d0c4c8feec90ea6e0e615e2fc6fc046c3b0dbdbfe66b31d3f9e1e08783e72e81b8c637d",
197
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/navbar.html": "9e8779299c2d4d95380ad8fa355ba826043009d1a4cdb735e376cdf38afb89c553a9c436680b717c312a4cc0e25a6f9cceb9034c6a97495943788ffcba92633a",
198
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/new-features.html": "b4c23f579f8fc506c8f6848a609c1a0c1c06c82deddb2f38b5b9a770e4d8df793d0cbe803b52287f01d3d46c6a143e106ee31cb32b8e985841ca5e4e16b20d5d",
199
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/new-naming.html": "4b0e5128293de9fde103c9a8648b67ef1d261c9eee359fc019083675ee38f66d45756dcd26b41efb034ca819f5c9be532c8b0d2fa1efaa174958c961818030e3",
200
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/new-upgrading.html": "a09270d8ed206b1a3a9b2415190148fbc1bbdda637fa032e7d17e0108c7e4ce4bbde2fc06595866029eac5c4904d6ae7b999b57870d6699a4b7ee2924bda80df",
201
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/newsletter-subscribe.html": "9fb09338a1d452dae32c9cdebb4e8800b26b163b46a88942d526e6965a47e33aa2959ff7855940f47d3f46297d5f2b7d4d7b6d3197928c55e5b17e728af5737a",
202
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/camera-retro-tee.html": "2196b9364ee03668eafd98a2274ec10413c1e80772012636d5ecebfd48888ec5df05dfef642d46d971bf46757473a5fbb876ba457797b6196e33d60b784ebe8a",
203
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/classics-tee.html": "a16ac1e4a87939505a43302b9dd94a1766fb6ed91a67c93efba42e38e264aab1f79c5f9150ad66f7029a6ab1811d60bdaaff6977a9c53148b7e393ab053e6224",
204
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/cta-suggestions.html": "af48d657766f7f6163ce4851571750154337c8471059b200896e79f4ac3ccf2af4955ec4b950f1d8974cc6cde7ae11a29017303ccbd1895f30854adaf94d3730",
205
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/fa-ther-tee.html": "095990235b55e0032b7dedb26ea37a20c3c99d431998d81781e80f409a589205028a0f786cc19dd6b479b2e2738bc0744f41ca7471ea5889f294a137e7100e45",
206
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/green-logo-tee.html": "801e093b284cc4f6ce225877fb0ac5611d35a47360248255b13314e9722c96bbc2abb240b55ef5c7b07f931d392b0dca6f7aca7b68c9d722aedea916b12d0a91",
207
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/old-skool-tee.html": "8a754b53ccf0db827e9d1250744b83e937a820876a2c49c969ef8e403b680d2692777d843c11576435cc6a4b2c2ef08a085497709b87b029a3e0827b68d0e269",
208
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/rock-paper-scissors-lizard-spock-tee.html": "5aab5d331fa8f5a3540d42c901a52cc15345b585ea7b271583f9588949bc282defef5da5349ed795b0628825ce239f11481174bcea5a43aee41169959c0985da",
209
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/space-shuttle-tee.html": "b155fc2184abac985df711df2bf1e3907ff088a9ffb648ff3a0dd8c329598722fb3f100f3230184b73f5a4606936e282fa1281f35f7be2a9e3665fbafedfd0a9",
210
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/products\/white-logo-tee.html": "4394a413fb87a5cd25148f5be1fd7e1ef641f6500f68e607f51e13d5f2718c676b4af28b0669cede49dcfd0784ea0004a23c2f803346c5acc00c1fae38e7015f",
211
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/stripe-ad.html": "046fb057775c05ba14c426912de5d1499ab7ac0069ee6b3920279cdb551e2e4bd7c343008606bdd6cd9231e90d3d821085a7cb43fed8871ce687ef42f26d5a33",
212
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/stripe-social.html": "0e73d4df0440bca1dcd3d32a3ffd1cd566a0a04e021b0c9b777e4503de7a4b90b4132d248e6a317093c276011b171669aad65399503b1e475afe593eed4c65d3",
213
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tell-me-thanks.html": "7b4aac2c3b5b1fb29e48575ddaf771e9769bb4bc7e9de53b1e6f1001c26ac8380609e3697af6a687c144edce9e0c56e6f7ae24c961434d6c6f7f7e5f0a8791c1",
214
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/rotated-flipped-inside-anchor.html": "2f385fbca67c27a5700b81c77c8c568536b2f35ed39e5b4baf9b80b4f50c40fae8b44923a2d48ec7cbc78bb4fb3a570533bb3a8a1635ddd6af3d93a5ba58135e",
215
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/rotated-flipped-inside-btn.html": "94101d52e8831e9655f0100a23ae49d9ba861c55726eb5f5f4e21534224fd3b0faf507adc0f4cfdee449a6713a20f5cfbca2c06e9c580702cf64f8bba2f1f9fa",
216
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/rotated-flipped.html": "e773c3bbe0f72df812bf3edfcdb2fbd7469b9c852c06d235f2012cec2d7dedb804d615de3b004e1ece3cddec1136db0580a8f256197c1b07629468ffda1b1940",
217
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/stacked-inside-anchor.html": "59f6a4cd94a0790767d72b0a4f83d1d749667d43bccd60628e271cfb934ad7adba2d8f913c4f55708080aaea6c781b271b09107b56f276c996b49f60a18e911c",
218
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/stacked-with-text.html": "37054624c8aaabc00921b74100c417d1dc43fe9cc46a92ab6e4c17b496d5c952416936093135637f9f01c41b78b73c727a5d921f036bb0491329a42e3fc8e8bb",
219
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/tests\/stacked.html": "644604c9302130434ec413ac9f30532013d3dd3d0ca6f36ab14bdead72ab56386bf3faf46a0993ac2d4ebc46e37b853a3415bfe82dd602b9379e6260574e2323",
220
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/thanks-to.html": "e95ea8282f36803c852620a01d0d8dcd0c8bc217a863db947aedb700f40f2f3e63f3aa64bb32e10cb2c2a4e4e25aa85f65786106555cdd688035be0bf8dfeffd",
221
-        "phone\/css\/font-awesome-4.7.0\/src\/_includes\/why.html": "c8bdd398cd372d29a4221d90003e41ea64851afad508ddc07a285e59abeef7fa708db378de329ee5d43d160593c650e6c79a0771448c435b864256437f665da8",
222
-        "phone\/css\/font-awesome-4.7.0\/src\/_layouts\/base.html": "55c3ac21d5fcfc6af1af7b534ad3dd540d6fd574d2b6f16b4a1412977f7e4aa52f3fec17e01cbd8707bbdbaae250c5d14fe3bf776ba34c58b31105905001a92c",
223
-        "phone\/css\/font-awesome-4.7.0\/src\/_layouts\/icon.html": "d58a89c5f5e459f76b6193976ad8d6fb2790c761344afc1e9714cadcaac4295fa33600060fb719de9ad2d6b4bef445921cbc94e9a7df3163d198cd229b6a673d",
224
-        "phone\/css\/font-awesome-4.7.0\/src\/_layouts\/survey.html": "3cad49f4be12b65f99e525424b4a9da671b1c9e103b0d086f60bd9c0321c58048c83b2e2473bf7fe39ce2a8954293c6769ee23a11511e7ad9498b95c2b4d18d7",
225
-        "phone\/css\/font-awesome-4.7.0\/src\/_plugins\/flatten_icon_filters.rb": "359a2c2e490019fbd73818b7bba512408baa61cb9e3519eb97ac0d6998148e753ef1b9e6efa71bae9f6450399a325385cc7377db998256726845e50d94814d99",
226
-        "phone\/css\/font-awesome-4.7.0\/src\/_plugins\/icon_page_generator.rb": "05e73c7a8787eed87f8d85f6e4c4508d35a853623624fe1addd208172ff8ec5ae7f5e5ee7b546c044f2766843e07d9b9d492f708697f319a3cee839fe6792fcc",
227
-        "phone\/css\/font-awesome-4.7.0\/src\/_plugins\/site.rb": "c7e207a821c852b18991122f2397613a8f9ccfaf511b80235a8a17807498f8090df1203c80311b53558fbad4bb3b251267854701521f8b639f7436403e1f21fb",
228
-        "phone\/css\/font-awesome-4.7.0\/src\/accessibility.html": "e3189df725f9a93f691530e07404bd5f0572121bc8b4f22f94caa724e783be7e1bf7fef39bca4dfa99c640689d6ccd7f379c7750e12e3f6d0422524554ed80ee",
229
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/css\/prettify.css": "6947c12db54c8c2b0900923b14b3a0aa8c15477d9b767bf6c7d401a3ed1b0393ad6f03b7a44a11bd81289fc350608f0fb1cfaf7df80a67ebf7ab37815df7a453",
230
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/css\/pygments.css": "35cb14cd45b94b0190d26a84549156caa20469918569cf3a382bc3b0ec200206e553218af8508c31ade050241c304faca75509741b9fdac87a78876f06a8dad1",
231
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/HELP-US-OUT.txt": "f0ebc1e7ec38a8cd333b34e2deebb416ffab31f3cd707f27e310beff328e5e05962a023da606c62559c8b606f7138b90896ee304fd45e86afdd2910ac8cdda57",
232
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/FontAwesome.otf": "a3acaaac3a9861ac7a4ba23e52b9115d39b674cb685b45454fb4b80329a4f7370b5ea7dd8b41d630798f8a54082b62411fd63332752296dbf5f2b3b96abb8874",
233
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.eot": "c160d3d77e67eff986043461693b2a831e1175f579490d7f0b411005ea81bd4f5850ff534f6721b727c002973f3f9027ea960fac4317d37db1d4cb53ec9d343a",
234
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.svg": "4f575d52331de91a2e32cc3408dd0eaf0cf25b7244d34b226314e3647e85ce284f86e3b7238c6c8b9022dc4e2787bf51620849290cdcd5d4c4bc905f289d2156",
235
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.ttf": "9ffb91e68c975172848b4bba25284678cc2c6eb4fb2d42000aa871c36656c4cebc28bf83c94df9afdfbf2407c01fe6b554c660b9b5c11af27c35acadfe6136ac",
236
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.woff": "9c776dea55a01fd854ea23b3463d9ac716077d406ecbe8ed0c9b6120ff7e60357f0521ab3e3bf9d4e17ca2c44a5d63ee58a4e7a37a3d3f26415a98d11c99e04f",
237
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/fonts\/fontawesome-webfont.woff2": "838fefdbc14901f41edf995a78fdac55764cd4912ccb734b8bea4909194582904d8f2afdf2b6c428667912ce4d65681a1044d045d1bc6de2b14113f0315fc892",
238
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/animated.less": "871260979d82ccbfaba0da449a8db5fda5149ab93f6cd4c3b7c7258f4b02519010e4b9488402b3bc1483ffe9b1c28e48371827bcb3815d8bf2c2c9fa2c3457db",
239
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/bordered-pulled.less": "fbc272ec15a506c75aa742979053bd53c137e096b9577dc2c2921ae05da4beef051b5c73d523e788009e7473cacfcf2a3f3be3d756f70533fcdd083c28f06283",
240
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/core.less": "7dc7ebd8db2a4a82608ff2bdac7dcfcc25ceaf328ca3dddc24b4d9288dc1cb0fd9666f049a24e84f49de93a9808bf4558a2c9100b60a18eb6ae8ced3ca1e08ac",
241
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/fixed-width.less": "840595e81ca021f4171407c5671024890d8baabe223d4aea8fdbec4af80506e058a02c007b9a8eab3b22b8a1233da5331645f54d458d0cd85e126fe7ecaf0f72",
242
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/font-awesome.less": "16a2f4f83d9c99c04db5f3a2f8b8f912f2615815d46b4248e93085a0d85b26da4602202e7edafea260cb4effb3966a29f35c5718376787df53b463b671a44358",
243
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/icons.less": "fb4ceabdd56efea26de2ca8b1d36eb5bf9449945597d8a885154bb4826beadd742d7ed7bea85d0045b2212bef5271218202ea13a9752162c58f828874c281c12",
244
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/larger.less": "fc61ace85bfb818341e45d7ae4863fdbf772ca3880f056951a8029fd0c0bd2aa64831cd446ab5f8dad19e4b332732eb5cc0d1f82e07ff28284a270545e7c4fc9",
245
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/list.less": "93822d88bcf9a647867411a47721786bb3404a45dd78b1155b1601dea5327f4cb913248014494101d9aaf5ebc53ca8f7b0d279971199c84d0fcba23af42cb3ac",
246
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/mixins.less": "49774e645ddbdb849361cd519f93ac859896040ab6e282c2ca4b7ee5bc3f0ff9ae33febfb03af13f5c3c70c64da49020d6b38aee87c3cb49bdbfd2997e008a39",
247
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/path.less": "2214dadd8025d0da912ee4e0366a25b6d521f61ad04cd61c0b13140a9465d7711db8a80e3c83bc5410624eeef8bb2dbd1aba48cc3fa39b75d5eb5e91afbb7ba7",
248
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/rotated-flipped.less": "0c410031dd5a13e53659de9933ff7cdd1c474d7aa7a92bf3f0acc635099abe6e09eec47385178ad757e604241d8a0a631c4c44c025f588889ce003844263ba03",
249
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/screen-reader.less": "7d5c0d28b78b9c24b6af0181f8bf72d1b7bf20c45edbf1594da8b4c8391dd24920b9d0ad186ada7217755cbbabb9bf6ea52acd8ed39f7c9abf4659339eb70504",
250
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/stacked.less": "02c86ec39dd5c62d633350a7ea40f08179f45d45ee120f980fba55dd9b3268901bd29d83029889982e180c890d8407f9d8902c0a83d65f9eef8cda449dce9b7f",
251
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/less\/variables.less": "20beb08c4fd41e8ea8c5f83402e381f4cdbf5ada68fe4f55a3b7131e15376da55615d9abca6bc4ebe1c5d592f43bcb68099c4fe8291000dbea7aefad87bd0cf8",
252
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_animated.scss": "0e27405ded612c01c0d1fdb3327dd0e311ad92146ba05099bc7ab26486fa2e1b6705f642078027696eb66b07e05a0c4fe743c24f5ed28c99b62a095c96e1f0ce",
253
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_bordered-pulled.scss": "7e4c565381a5bd3de2c6a7d2d706b592ff23b9634e8aee400aa900abe45b34a6c0a0457661d24c39d2688c0d2464f69cb1c6b38460ad09c0ff22cfad1aa572c7",
254
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_core.scss": "a08d491eb1c351847ff35af3220bb18d3f7bf301c56e34f682fbb81f27612aa26ce32cd9cc491f82b23da16cc2d17e4ebf9afebb2d5c040f8639476e247ef912",
255
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_fixed-width.scss": "63ff8f10bd612ecb27b17775471d3fd2156e23f20ad5949b444a9ce5c7f5c4c4e963579e90f868d4bee6cabc30ac24c8b428a5aa448c6329e85a3082e688d228",
256
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_icons.scss": "bb0c2c272dbd75b0da7e1dab2155a7dddf4e4a15db41f6bba899af8fb0ccb6dbfc715806962c52596e8ff54655a62d12892c05e39cf8d94a32c1b0138798c3f7",
257
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_larger.scss": "56e124c9477776ebbf03a9c1abda1216998d58a901bf6ee377c50f7239fc048a2fa72add0f77c8fd01fe38132250a6ecfb17cb37a415b2b2efe38fd0432822ea",
258
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_list.scss": "cb337c087a7753cffd1298f24f3a6fda676afb4116f2a9bc52182cf0be3b2baf916152a146f808da073de76f8015157f6384c8c8cbbf743fa778729c2155e058",
259
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_mixins.scss": "1a5738e10348256551ce5e24ac2c2999cfb471f59e41c6bad9811fe00cff0d5d91fe3941961ddae0ab799022d1efd55bf771e91ef9198389dbca737c4bf5808a",
260
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_path.scss": "9eaa7d29bb402c790bf1ad40ee849e26743d198bff3cfce0182c2320afd9d47f4377b2bfb147999a057604dcfed33e408065577a516be0f3623fc0df75120912",
261
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_rotated-flipped.scss": "214f7a0b8237f34b8c95efa9dc56ec15b61700987b8e240fa1d97c29aa2f615b87913bb28a6db1dc92ffaf3e80984e4b5f0b602b94f39604fd4613fa5a146411",
262
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_screen-reader.scss": "5e3c8df5f64a9ddd9c7dad6f939156090e832a43c4352f7f470169ba22133267931f53100da2a4f4ec5e5528734c5d60c42ebc64fae6a5ee1dbc2e920dc343c9",
263
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_stacked.scss": "10ea316ec6c669b0d07a17eb585f73da0038a9ed622d3e0bb0751ca5ef61159ce6593c3c53e1e0c589f3dd3ddceb2e9c08215475635611fbda9f8e6f7ba5c7a6",
264
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/_variables.scss": "f036c1d9b7c98d14708c711ee7752db086211c571af722c0e726541fc1429b1cdd1beb747e5e06547aff18f12f2a931e0e78f42e2ecab8f9b70e3fc2a57b9b04",
265
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/font-awesome\/scss\/font-awesome.scss": "0f0dfede40b047e2fbaf5090d3f08a06637444c3f9bdcd8cd2242a8d5df7fcec938e073b1f7c91c334646e2a324d6de12f2673424ce7439d45b99eba020361fd",
266
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/ico\/favicon.ico": "8fb75ec6e7d4290d0f342ab1cbbc4d507326fdcae091b08c25a27be56629ab35d96b999cd06c10aea1db67895dd3b3f74c4359c0e4b1f429503bac3764a76992",
267
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/img\/algolia.png": "d2af6d614e206d73dcce611d448befaa4899b09ecbbbf0a0aa6dde1e268958415ea5fd9a2a87b9b1fc7354fbfb1c1161ebfd7170ec3b95fe4be790408f6c89d9",
268
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/img\/logo-themeisle.png": "ed8dc9ff39b794aed38e9f2cf46993d72e027d1f15f662b3f98eb6e08cdb700f0bfb83fccd4e16cec4be2d0f41b4ff0afcc3776f4a2eddf05fa6fa2b639b9445",
269
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/img\/logo-wpbeginner.png": "9c6ed3015a57e44c0538e52080de6033288689387e12cb648500475c42e2fa736cb027e2ce547d63750fc5ceb3831c3473c656ac3e04fa313aecd399f23e6ebe",
270
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/ZeroClipboard-1.1.7.min.js": "99deba8b85b7aa2c092af1b7a2e09757b1b82b6c9509ddf5af0edd48a10a1a7e790158cb473cb86aa133d79d47142f14e8fc15ff4cf3ce9e39268af6593ebcd9",
271
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/ZeroClipboard-1.1.7.swf": "bb635b563a8b0a637d455127a40bf817ed57c4bfdac1cc07858faef1fcc488c3bd9ad057cba83ec38c7a2cbce0522ab402c4d215303103f6f3227db36716ad34",
272
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/html5shiv.js": "d3915b572fce20ce95c1d5a0bb75f424bf3d6f71e726a77afb50e85c457603d60241cb4698227dd3cf071b7133fe444cf2f0e6728913058731173fbbc9ccaac8",
273
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/monetization.js": "7a8e7b8e79aba68f409fc32188905637e798d79de92305c5907c339ff1c9bee5f22f2d58e499e73316f6bb39db580224299d10560e9e29476f819598b19b5076",
274
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/prettify.min.js": "7162bb9b467682742f6d87ea94300000064fc54e15193c3d7e5a4f898f0ad7dd55bad8f01933eb625ab1a0f4a8191d7062e1acbec6512ee610d2c0c413c0b34a",
275
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/respond.min.js": "a133ec6ca8b11553f9e940bd30faddeeb2465bd5cc9b48f3431670140c1f4d1d74b2362729e1e907e50d6a2411ea58b2027996ff0ee3e5f7a420526f8efda5d4",
276
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/search.js": "1a925281a9fc0721c8b290fd8f6048db5bf31057ba7050228e7245d05fb1fbf6742884355254f00ef1bd68a4542bdaea73375f0eac1f40ae21f280d0d08f37cf",
277
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/js\/site.js": "71e19b41cf03a3b0bf05e1bc0c07a0ed3cff51968470b22502d26357a337cff80179d9e2546082851c07ffafe2427919104253f53c97540f90dc2591662ef9d5",
278
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/.csscomb.json": "7d746f81e37b2a55e4eda116b76f688e057fe1e7a7311dedfacfbc2943dac84b2bda9612140cf7f0089015533d9a00efd90fee5e260a2bd94b7fc73737617368",
279
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/.csslintrc": "238adfbeee24fd202885d332d1316c44bf23a37e1899b9c618215715326a3a0a84112ea18f345203e450d096795ddd7b859a055296f8d2f834b2b0eb7f7d5f3c",
280
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/alerts.less": "6ef653823ef237fa019122796e00afeffe3e6f69773b3282e70595946b936a8055865fc1ef115f371be0c81a4b2abf6243de068d8b75b071fd856aec8ba87d91",
281
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/badges.less": "ca5abfb72cce5fcd7958c53fad833af4e8321595538ee76a4c2eeacd79f217f8465c1b86bca32357daf1d7a82edef5560bb9c69c11d137a1aa1fdb8da16d82b1",
282
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/bootstrap.less": "abcad45a2e54b3b501bb5219bc5883702fb9a15e8a23fb9b3a9c78ad705b99ee39c042972ac756409bd85b45db460572949374c0f0b8eb4885ab4d7529b45e93",
283
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/breadcrumbs.less": "66bc7d8baa9d552aa7bb832fead9ffcde5e9ff1ee9aab436c6599566bd3b87849a74e1a888d7d33bb925016a2dc26d0f046ceaff40bdb06464a550a64f27207b",
284
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/button-groups.less": "b99d1ac30a521fb6163effb388a25114b8f849718bc1a2c32bd4c36423e1b51b1d45b6be181ec0ad39d44debb1475e483456c8fb21d86bb2356addfffd488c96",
285
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/buttons.less": "d2795ba4cd91e07fffe5ba49935b36583c324479ef3d3741330e9267430b0f560f24c059dc1e62c5bcab21084790a87d38dbae051dad3a6e50a403abc7b7ccab",
286
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/carousel.less": "e9f601bb603e0a39d1fd7efd07346cac7d094ae1cbf8d8b95dd2836baf7c25757660a532f1a7d8881c9582234f07b64d57e81ee5e863c901b141b6119696e21d",
287
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/close.less": "e2a6a0877df37b1796039939c179b98f2768291a1c8ccd26fe6848590fc865df9f6f0016c6b5b0d0e7367746ea27c8c9103df4bf5efbac063059e4fdc0db3540",
288
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/code.less": "3932fc44533043a4000c26e4fed51f231c2dc054e561c9d4167a5429799b813d4b28654d9ac411e3a425b66217b090ca72ddc3d5963459fef01fc92386ecf525",
289
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/component-animations.less": "bd7517bccb89a397d29bfb1db20bfbacd1b28d4927330168d8984908c1e7d0f647c0cdcd646f8b009344bc967dc751ccedf0efa872691d23f26e2e3debd6b467",
290
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/dropdowns.less": "bd193d3168a7ec1eb89a484c5e79c37a4ba7d6cfbf5b922bb2e7037b88c3b935fc31a9d9c3c52a92c41b03640a6bb12d61917c2f0128c33c64409e0531ae7ec7",
291
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/forms.less": "c8893acca4ceee40dfb2fbbde9720efdfd8fd5f1e74b0202be26aa3746c27c5e836f7268d9b44466086f5eae106571d4be2d4e04011f85ad45d7ededecf4d73d",
292
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/glyphicons.less": "6f909009f4e9f2b6aad0337c650a3e396b63341ee6c4099baf4537a07256f423dcb969f3f452559b0b3790992cdbbe272d52f4898950b50cf386297d5ac693e8",
293
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/grid.less": "9638e08c198425b7e46b2178f022af3c4566adf6e9cc1ce1386b595fdfcf7a07ee51fa60fa9f3c55f02fd9ae1d2e1198e9534171582b0fea5db0d4288854e215",
294
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/input-groups.less": "c8e470633c05493fc778a64600ffad97737f34a94423217849ce01b77054a8c1d0fdd85350595c7c30bfadf159a8d1ca2d04af9f49c08795e9387020a07a4447",
295
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/jumbotron.less": "e3c97f308f50a5a3914eeceeb9a90dd1a7e802492c2c3da657740c997852ee0271a1dc06fd497ab44625544314c4cdef3bb16cb0bdd5067ca9d89b5cd64a3f17",
296
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/labels.less": "640e8861faf662e06fd4ff06a92382a27319fa39761c78b8a19c4b0ab2b2e440b4ee7cdec8a0f7ce67a12f0596ffdbbd19308e2e9a63d164709ee083edceec64",
297
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/list-group.less": "a11b70ab5618e5ea686893fce866074b51254c93d5bcb02fe30306d143b791e76b3672b7f8fe51545ef30d73ab89732bfc45cf2179dcf9ae07ce38d27389f422",
298
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/media.less": "e8d21a5bc99a08d3d04ee371ded649b3cacd1265988efedbba1e8aaead14d346326c14b64dc6aefa744e232ef6ab46d4ba8a1d23e7aa26b276633db92ab94420",
299
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins.less": "f8a8d51bd105a260e9db963e2e7d636bc91c93c51f117574e199f90cb439daaaa32616356b884527ea48b9feece9724952af7ec1452355703df624c8b498e5a4",
300
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/alerts.less": "582d9fbaf2f8b6b737697824af7ba9e47f98dd4a001b60f1668c2f88aed8bdc3e80311618bad7b07605f81876cbfcbc6830b620bef0ee9fa57fb90898988db79",
301
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/background-variant.less": "68709b0c5b5ba52b0f583b7421f79bfcd32c2784620f0ee8077a0d788ddc38a43b11863cec3b1a183451115f257aa7aeb58d077f066e846639fdd881ad069649",
302
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/border-radius.less": "e495c886182327408e6b82511baa49dcbf1e2b05104f844f3a57fcff40a49eaad548e19ce13853c45e74ac52689d9479792cc3de55a020c2229128f595d5288a",
303
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/buttons.less": "fa6f88171ef22558b095a136769533231a9b0ad8954211f85db3a42ab19492e0d456d5feb419f237bef68d1f75ddc42442154a4007a45b76f17608ec907dcfda",
304
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/center-block.less": "3b81464925a61dbb2be2b11d9be3292e9a3d42c65bc05e52f84b91684e0b178021dbd73e6f613c89f39c34ad311d039bb80332cde9bb64ccc51e0af49e63143a",
305
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/clearfix.less": "5989cda9e86899298c7e7c9cf73004d94d6e53f214dbbad93ca7e7e790d1e2043f768481ba9d20e1b7ff5667fbb4902b213560d09e3a7aa7cf977f55a9247614",
306
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/forms.less": "07dabe53df01d5324803837089f67f74b8e890330859fad42fda090f2f9a35280ddf531cbbc6b549e26002d5afba0e1773cd871c63c7f2f580b67a042f18e403",
307
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/gradients.less": "31b17118826eac8be3aad693382b82d99c01983b68ac37c5290d07920f76f61134c69ee12f9f5ed335aa392e69dd3bcb9a512636142e6acc1827f6db673a5a12",
308
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/grid-framework.less": "ab354cc185f82538cf2532bbe7a7df82dd197a6355bfa3c333164294e329742a800f26641fff2857f7269f80a30cb1fc8635fcf6c7575b7b98603db973d4a314",
309
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/grid.less": "4ef011c62ffaf26988e7f30749a58e251f316ccc3093b1c50d5c65cd66065e2af58bcedbf3447a97f5506df294bb2a31ec0d2ed01c70a977135e153991bb6fc6",
310
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/hide-text.less": "770055fd6a76bf5881015e17101bf9079d8e05188ea70e42ad8a2b8d4d141be3e7756039dd7b904786fc79c8f14ecc58d7c9da4122395d6bb5b9f8766c86e3a8",
311
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/image.less": "a0aa831f323ab27f3fe324453e54382b7e4ed8da5fa72e9819df2b3d07705c800ade9f8e5f732eeb36043096479798a812ef712c589164a629dce7fc9b49f75e",
312
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/labels.less": "3923340ff6b2eee8eda3819d42f4c4b7e6291f9edd2b9807c4548e5bfe47eca3076b62de3c5bf257dd7af4711eb1059f0e342984d2e7a606d2229df2b5678865",
313
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/list-group.less": "be85a41f96cf369a90b27fb5b1fe477306fd9687971fe85bfe8aac3a4ee21c775a9b55d2d0062b66a50e71a11368bf6617ab7962c39b978252c20631b4d55db8",
314
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/nav-divider.less": "89478e72ea248cdf80330b4fc356d0901ce5637e98e07419be49ca8dbd563d894af7fa7fb0e8acc8af4255a9c8a929615a19067e83ff554cb7db5a14ce3aad61",
315
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/nav-vertical-align.less": "2b5ad0e0e292a091f90fd02947db3dab499d47c7e44562005a02b4beee1221baf602687aefe63edd30b6ba2959fe2e94ca9088fdb0e7a548d5c722dd3684710c",
316
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/opacity.less": "39f3e7f370cbfe52d61b08688ed4e0070ad396ed7e2e9bc068d3f10d31cd15e1317664cad0cba13b15e4c60076f1fcc353e28e2b2fcb1fe5f3143ed87ae2cdf2",
317
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/pagination.less": "1344d77a2a54bdad0f7c731114e8ead128335bfab274b36f6ba8c02f6362acbfeb3718452d993f945f78af7f439f1240e4205af3b39e2d12883f9ab127a7866e",
318
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/panels.less": "7518af77aea6fa3fc4d2950ed0d7df5d9fb374f7ffc52333b8e4cd6a785b2dc8b1ffb12cda7e5fc3571bbfbcf7e480af1ea8ceefcea09a6af534949d8622e73c",
319
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/progress-bar.less": "b390e21c7a4fc508ea0c8403dfe7e89d0d7c2e6402cd1a7972f1ac3cdfeb354d6890e3d2c8d214575110162326b0a016055a548ca6d6f0fd146a035eb8896a55",
320
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/reset-filter.less": "1cfef8254d9fcd9d3142c9636270bc505cb7ff3d4e74faf7b3f5c90fd5d7eb4465fdf4affeacda7e7ce40800b8756d3ea2a1031f6729eb975acbba71b3a64b37",
321
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/reset-text.less": "e7a4f4abf9fbf88ac5c756798751d7e0b0ce1390607479a522d3044682a19054a1cdebce3a66a4a2bbbdbaeda9db8d14621f12ae7ae67c4ddaaa1c3f43c9ba75",
322
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/resize.less": "653227d4ef865d5ac4e8f844b72019847c1e06e6d9063bb18dfe91b4316957fec4f01063585275b8cec695b602edce11116320972306bd643cecacc6d80fadd4",
323
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/responsive-visibility.less": "4d75a3404f4f5e8e3364a46ddbe9b9a6c0e780825a71ff4e5ce7c712eef99caeeb47c198df6df4d22479a72ff769247548638bf222f492762fbba383028f3318",
324
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/size.less": "5961852fff078e8f3efb4d2584e60d59d5a74ecc325b53c03d80a63339a86757019d34b28435597ba576a7129bd697f7e974e4a374c772cf3d740f4ec27ec720",
325
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/tab-focus.less": "e277a74a513db05ce8c8bef7a2aa56a2e45b0a6f7e49432eb2c07d9e876a950292be339f6d8937eb0339794f632b6eda5fa29b9ba6e1c037b6dca1f720549f8b",
326
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/table-row.less": "60977b7f339f344350b9c904cfabb9209a1121cb26ea41cf516f01ce3e3f9b5f7e262c298d97f33a8a5f201595f3ad0166d800dd625287deb7d3d416a91093a1",
327
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/text-emphasis.less": "644b7f8385aaad90396707bab15dcd319a71f0a72eea7c0721caf98dfe53825b76973dfcb6ad51ae6cc28d181f4f244074a7ac95c29387231697db7de5af42fc",
328
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/text-overflow.less": "a32baf8bc0d47de27e34ffe09a37702a0faa5e541d06803abecd9b82bf59de1bf0a7ea85ea23a68b84726c984ab0caf62e520b1165b80251c031fdf3060f6c20",
329
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/mixins\/vendor-prefixes.less": "6857da23deb03264fcefc6ca3fefd631571aac71203f23292024f20e0d5bebf4669b5dbcccd36df095460bc9027614396a9f42bcba832e968498d4ac753c76eb",
330
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/modals.less": "4c99c136dbcf3ebe6a95e694ab1bc14a1469f9dca8311390661e5dde3201dcacd855aa9b4400c54d16116a60c98412a06579938fe1c534c7b8643a22d0e6deb4",
331
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/navbar.less": "36d19bb1a44da00094675414d564a1ab382e3fdcfa1eed9e74f5f9ebc0ea5cfbef151996a44de9c9a975d088f409f73fbaaf01887ed0ebb1828810d82fdb3e7b",
332
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/navs.less": "d19df77d08c0bcb9a534533943e2f722a54d26e94cf328849cdd77aed4e1bf067563c0cfd4997f8eaab3dde47fa567025d3283f979d8be5e61c121b784a3d98f",
333
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/normalize.less": "d0a2aafb6b60e57d40747d6b1e36f25011ac250b853eafb50478d4abb1c166aa89edf393a62019081ed19e08b32c6f2fe013edb00090437dd8fa5737379ee718",
334
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/pager.less": "7637659ca2998df19ae2d38304067029b9944db4e70a42c2d0e77ce52cbd0176d765490a890687cbbb24334bf098b4cf54931b35bddc26a85e205b81114dd6a4",
335
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/pagination.less": "365110bafb570d10002748f6d2e743a16a27cadcbe600d64335a1ac09ff690683649872012e3a60bb92a611d87f409b450bc0d9de28d6aa1decae8f70a1a0491",
336
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/panels.less": "d6f37fadce28cf9e90bd1dc47e0bf71b1bd8b67db3e19b0447d2a6a3e13def8cae5d2c52d43aecbfad80fcfcd0b0e24fb5eea205bc6733e10d90b22dde5f275e",
337
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/popovers.less": "084501129f4c74a32eedbd78f6888cd48789e5175987dfcf45385c98a54fbad40654415e6c531a757b1108937ae9c6b9c81404700d754fc54eb925ea4516efac",
338
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/print.less": "9c4f44378fb1cd28535572fd768baf652de2614f31e62753ba79c02a313ab509db28f52c3d0c78665d2384dd7be47edf97e243ef83c6b22e38edec56873aa1ce",
339
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/progress-bars.less": "41c051579d9fb7949b128dda04dedb2ed8adc358b157cf5450d375962323725ee2faa7a4033613471f00544596c8fa400d22d9965c77544aebf6e56b3911cf49",
340
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/responsive-embed.less": "a0288862649916929c2de7a5c982f877847f687422ed205fcb9b6a197ee98a6bf52fd012725f894d951bc6ee4bfdee0a4a8363e652f93b8bb98140aed1995533",
341
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/responsive-utilities.less": "98690e8c90ab2c0c4d9662786b7560f2198a968a4f4ba253b8c87b9402b02c339516c89af569acef3f6f37978ead0a41b234a164f5f16d4828e5bd2b0459f370",
342
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/scaffolding.less": "882fd7d208e76e926ccb9c88ba56741e8baff7b6a46bb17a4c9652778864e63ec04f5113628c6c39c4a94392974293681e560a0e3015226d4c1a66c19e085419",
343
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/tables.less": "8588df750d6291bec4a2359fa6f07658d0a9267b319c47560d61ea909aeef592123fba6aa0ce3cdff19fb92849bc8253f67c98ec5ddeeb782ec73998034c67ec",
344
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/theme.less": "9b0c31e6b9f57bb814edb418813052427ccc97fa23a1ad9c29e1b26f9eb26921948727ed5804cb72d302f53387f4e87aaf8c436e10cdc60c39d3d10a8e89f228",
345
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/thumbnails.less": "000fb95bc0b7210a573f6ae1d336c1baaa78764a9ef5c5054c088b5bd993c4866ee8b5d525c35b0e99d796545389b0a00864c7187222ca23d1d5f395a804a6cf",
346
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/tooltip.less": "76459540fb8f856671ffa6da159ccef956144ec4e38bf73ff2c0f0af40130592d87f7fed1b1b9eda2bfc6e827b4f69dcfbd82a07101b4ec60b8a1e0c3d1c3315",
347
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/type.less": "e2f164468cdf7097e0b3b456bcbae8ba23774c9fa678f2eee698010924f8691a8477de1c259b7e592c5c75f8dc959e7f051a501788b4b7ed4bd73df89a028595",
348
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/utilities.less": "ac3407691078aa6dd779ff6ae1e9cd26abf9913ac18e24188fa31fb3e69b1deb31f7ee8cf8ee7a5fe778d4b0a8a7666faf0d6b30c46257140180a6a6147c2269",
349
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/variables.less": "ae9259421469571038a01a417a1faa001b312ee8a8c16b22022cb169b1ff957a55c0f0d9d31afebb74841f3a23b35c1c41b6c0d66da7a9d16a26e91f7381f0e5",
350
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/bootstrap-3.3.5\/wells.less": "58014e2654e7364b1665d22a62edfa71828822547362fd42ffa3580781b4ca5a5ae6d209ce7916063ebe1f619147c9fc64bddd3b94105635afbdfcf9dea71d9c",
351
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/gandy-grid\/grid.less": "b8bd10ea52b0a8ebac7df606b883a3d9c3cd86d11db93494b822f848f6ff712b04f6155cfed3dbfccbd5676e5cb7ee9f1a965806476f771ba805e9433380b83a",
352
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/gandy-grid\/mixins.less": "201801419a28897fc914d74545fb9653cf133957c675f69fcb12fc1d210017d850821eb2b76e8c3e768639d47089ab647469147646c2e49761f143c7c9800b09",
353
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site.less": "2613c3caeb1d7f65290aca49a2dadaf2a82058e915f81fa1e95d19a8cd2a1065e80af28f870c74048848fea4097f3e4630b06b63c54ea2219ca1527e22053dea",
354
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/algolia.less": "3aeb335ed5081bd89f699218f6a94aa1d1d67e9d0f12608b880fe6ded5948f1172f93c4a3604970eb2e0d57bb88f65b192891e2ad77c6b4ed6d9bc4580d64ddb",
355
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/banner-ad.less": "f5617e2a0610c67953cef2f11f14d969f2acc4d6f19155a3b9386e6da7cf938d1d0cc6d2f437348aa03285683bccea3b1e0e61b644ed4a402a38e85c0cf5e9e9",
356
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/alerts.less": "5bf122c528abe73261e3e5fa571cbef01e133e767c7d59bfcaf5ed88d4747c66b26c8c6f543de14349e5c6ce30a0985cd1ab5439d53bad1036ff29fc35d466c5",
357
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/buttons.less": "e770985ec8cd35b9e3226af40ea32b31540baf07189fb8fb80b9dde4bb6485297afce6e4aae54fea3760ed643a576d8da45b4b76f282edef0487d34f4f1c473a",
358
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/jumbotron.less": "8bd6c1a7619f6eb8e89fff5bad824869909c1650d69b7bfbd6a62388644fc906b74de7d4d826c6ef4fd62fe15db80d4a92ca00261ba1f704e30c494842ebb560",
359
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/labels.less": "33cddb047fd6080281598dbb61960c0c882fd55d116103531413dfa228b2da0ba7a1d74e1a0a784027e2bf196839d44a7ccc0d5bc6d6f9723618c5aff1a90e80",
360
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/modals.less": "e7bd46144060a749a799012ddd68eb40cc2c2591163a5a2daa5814bd3eb4ae9bfa6fea8729a1ef9bd26956a88a069c0e3673555d2cceacc2b486bade7578012e",
361
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/navbar.less": "fa7cce0e8647032bf6f84be86cbb21b51fde5ab235d4c9497ae714c450d29a8bbd072a6e0764b1c9b646d5caa1b5386e4b365a08ac725e687a5a02c5db0af717",
362
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/panels.less": "dbe49fa43779ed116880f620472a17cb0df73f5e1b4ac422727a7efa5f7820d24656ab6702a33ecbf418db70eaab3dbb34c6c52c8856d925532db6027819bb7a",
363
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/tooltip.less": "48416fa9b750f9ab909e6ecc641a3227956361d458ccace89d5c784d3fbe9cd58d2d8e4a1876062fd4217538dd361286b73b72d65fb43b9e8480e74d8ed1c7e4",
364
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/type.less": "387eb060b9fae5bb9d75be7fe4243ce95d8331c6bfcd3da567cdb79c750f8bd8a45d36959d0717323b267a081e7c18ace43df84810008256162ce9158bdca09e",
365
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/variables.less": "2c0810ea534208a0bc6c97f87b61d7788b9fc7f16c63dd30a10759495cfab6b603fa5a1b7b80d3d70897f295065589d9d95d660e8edab05627f0a096996e235b",
366
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bootstrap\/wells.less": "b1e85ac1c8f2b0a3b372d9e3666b00592e299004c7624f8fc27458dfe2cffee3093058b4c9867ac589a48727d5065ced497ae6ae6469636689aa2d2c9b8566a4",
367
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/bsap-ad.less": "17d85c0b18c3de440cd3ee34fd9f88b20bc00630ddef8e753bf6b0e93933efd8e5e8ff3694ff98df19b422596e374cf28e9193eef073b92e62f3407608c44652",
368
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/carbon-ad.less": "c06e5dcc5d97495dcb4acf6eb0dd9eda68ccf311b808e167ec37cae91af8a8b2f963cdbddb8c489c565323447df2f6fd7d62e6d20b8d1fcfc9849316c4eb2758",
369
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/example-rating.less": "3b62779f2d1e1da0e09614e27e43e369cb6860ea3e3f25bb416321d22355484faa7ef06dcaedb3b0ad62cfe76bbf89b8f5bea97c22d7b883e1d048a705f94486",
370
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/fa5.less": "230d28cd06d28dc7a3698a27b400c643663dd239651c29978bc15d3b86797b43b7530b39730af185c33d6c80f96515ff91e56e3da01a066bb85003d88480082f",
371
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/feature-list.less": "5fd9507d3bd6a2a2f3487163ef9168b5db241055b93013555d74fcb2b81ae7866c5011876831f5ade138242a726c39e327ed7c820c760aad4d4f561b52836d45",
372
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/fontawesome-icon-list.less": "be0af7e5d5a793d5587c79e02ee245e659ea1de4b1bf2d187971f6f51b6976c6d07837c79659e77aa6dc52d0a423f6744cefb537a37245ace430bdda7953c846",
373
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/footer.less": "3195eaff0ecc028109d7a79a1b6d6850d7e619253d4a69c69e7470421617d05cab7a7daa95eff1bb6fea458d6848795fa8f56f4089207442b4cc34fd7f926a96",
374
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/jumbotron-carousel.less": "25fc6b59ec1147d0ceac291147773662201799313a4824ea103f7510ea9b328eb9f27ed9768d1128ba655c493355364ab3f95ab4b58b10d7286f17e3b903a5a3",
375
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/layout.less": "caf18d839d6a84d1cd0e13cfb2a2d9e5884ac802429175b4da914d77f896155d3c5e4925f4392044827a8f87e79c0f97876432f95b7125f0f20692e2a08463a7",
376
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/lazy.less": "e00c9dd4e99db9ec174e6b50dc856637cfb57fdb321b72f95a319b5772c6338f7e1f89d109a6bc18ec890c5d275449f87525dbcc272ae3e89de8f4bf4c6611e8",
377
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/newsletter.less": "1e1baa0263cad5613607142776bee6932e57173cdd77cf5a06f79dc104fb479e30fa8f56f6fbec770fd90e5d456d016747960d0943bc01a4d7128a2b336fefb1",
378
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/print.less": "47ce33620e649fe5f9e899daf9b990ed8ff131146fbb8a21b6816f81bb854025bcce74d146d0bc08e345502fae36ff9d16dd879d72aff48712c1f0d2dfd06964",
379
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-lg.less": "25b983b0a15d3d09e2c2eae2750bef037ea4cf6bf67b275b40fdb615579143dd6245dd9ff53044c67254f9a84efd05813a8d975992b138149fa7e248c26adab8",
380
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-md.less": "4d88734ce346390a74caf1579f78b41908c5b386b38cf4724c84b7c4bbdb1de987520f51ee2e23bbbe8fce2733e220002fcc18cedc790613f0e6c1ea519baaa7",
381
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-sm-up.less": "5a059b3ae6b0d1fb6339b5a031f036f64ee7093271c19c45defe57083205152a57e82e75f6e7cf9d95fc5c7e3e20f9db144616034f90c4ea8803b4846d2da348",
382
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-sm.less": "b988a2ed6bb237b5c25f7556a3e07b375c9ed33716015de07e4f7b7f787d35186539f05b2d4f752c5a59edfd43e3501d84d865530cdeec3a61320690d060af00",
383
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/responsive\/screen-xs.less": "5266a0dffdf45a7e45efb3fdad70b058f713a4476f7e356096417b139f4d85d36a8cf9c99cbe4840cf5ba4ea438cc9ecc599e39049cc84d853caf7eafe0cc71b",
384
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/search.less": "de316ec445ee08ae2afd58ec4192419daff43fd3be40a77d29eef3e913dd826d633d9eebbb1b82ff38e0b1c62587c04b0ce9725ed1fc89a8cefffbe4a297e44c",
385
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/social-buttons.less": "acd3c69ed3cb1726e4c4707d9ff68bd0bbe928f5ab7a60eff22c7a239214d94ad0d7aeecd7bb1bf3a600ed8e11a44d7631e99c4eea14f3ca986ec38fbbd102ef",
386
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/store.less": "f7b3701892b29f7e84f9e98089f9d902efe6081adeb426a6330ea8bcb646345142b980d2187880f5b88ffce816a92ae990cb72ddc381beee017c4cd386290970",
387
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/stripe-ad.less": "b15f475b64c9f484603631269f41f319251ed78f8d12c0929b77a48c5d427742b56e2ca5d7ae49dfa1e179357535af024c561fe2aea48de23f79ebb6869f84d8",
388
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/sumome.less": "ce6ee2eb2c308a88e56c952e611c726c2cf158109d42918c2e1ef320c45d51269069ba0d50db0d5c443d2d8fa5634f86050794cd2194ff07689b0777a2f63bc7",
389
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/textured-bg.less": "e26572839aef1ebc89da8e1d443c5cda4f52d5e52473af89fdc2d0393b472f16e3e26a705ab8086c730c9215eb9109dcdcd42e6705ac9209989832b559b293fa",
390
-        "phone\/css\/font-awesome-4.7.0\/src\/assets\/less\/site\/views.less": "36c20e316fa6b35959878f3b4a70f3924a0bfd316f34c697a1a3424039fdeb670f976199a01c0896e9158a042eca193674988a4e91d995be289e78ea2ab2fcbb",
391
-        "phone\/css\/font-awesome-4.7.0\/src\/cdn\/error.html": "7e51a097a684678928af7cd5708c2a17222f9cbf81db4a9f85384d28d59031b48ac43315d167ffc0a45097014aea4341416b885d2cf8ccbed6e5bc331767b720",
392
-        "phone\/css\/font-awesome-4.7.0\/src\/cdn\/success.html": "47c4fe2b58da41de009380c016e277dd8beaee35055a3328fb9710dc2e24056ff62f6f9698cf531270c7cea3c96eb84336f201e98aa34d2a37c420d8938ff116",
393
-        "phone\/css\/font-awesome-4.7.0\/src\/cheatsheet.html": "a36cb07fa872f277fac0510ab5d5d640f8d837572c381041cf8623055328e827933b369922dd1c6dc82b7e4bc89d8bdbd19ebd21439a7b95d9b7b43f47d2fb44",
394
-        "phone\/css\/font-awesome-4.7.0\/src\/community.html": "df0bf171b74d07c35d650ed1d786413adae55ec2d74cd779faa2ecfdabf0beaeec77b603a11b9334e31cd74a5458c9100d9336f905b2d50c479fe34c7cf2bcdd",
395
-        "phone\/css\/font-awesome-4.7.0\/src\/design.html": "0df2e8909f5138f50322334a3b5bc65bef0b822cdeab29f8bdba4e077ba0f301a56e8724bfb730e8e6165afe3b761db5c6b6cf8ae2b83e74aac0b0e7563dd999",
396
-        "phone\/css\/font-awesome-4.7.0\/src\/examples.html": "680fb422b52d80c5503cdae6774f4feb7290a542ae93b294961dd96694f6f72c125b39898e21c00470df65414cf4e3e1ae31cc500097e7c8578fa223aeee33bf",
397
-        "phone\/css\/font-awesome-4.7.0\/src\/get-started.html": "f773d4781b5e4817544fdd144005157be79a773d3b1a8a72e30e98354cb6de28887585d4f64f7ea3a8a8ee8faaf242b77c8d4f1b1319c01bc1ed917da7a537b4",
398
-        "phone\/css\/font-awesome-4.7.0\/src\/icons.html": "77017e98ef938c868ed33d4c7125cbd6e5bb6bf5426fe9dfbc9548d5224ca102f5b6277ec6d9e26db29fbffe973a8aa8e77d494832ff3ee6918c8e2d0384be83",
399
-        "phone\/css\/font-awesome-4.7.0\/src\/icons.yml": "b67111f3a3a99ef19f5f7dcc27ff0ad37a5b7e74e288ead793b50ea319e65f4c24716b1ab412e2e12772408b5c1cebb56884cad02d425104325f39236ea4b3c8",
400
-        "phone\/css\/font-awesome-4.7.0\/src\/index.html": "e3c7f7f120a5f0015a7b63d9f84f71aabd6b669cf19e72be01e15374d357171948935ec8b4824f6aafcae82bd9916ccd8768d1d195fccf0b8f281f17c88ac174",
401
-        "phone\/css\/font-awesome-4.7.0\/src\/license.html": "a73280c350c239e7e0d8dc4f96dd9ec90e695accf6a86e7a6641ea68145e007b761324aad669fcfc9bd4f43781b71563b2900016b4c78797d392db6985cb7de9",
402
-        "phone\/css\/font-awesome-4.7.0\/src\/store.html": "a6de552c4d0099c7a4586a2c27ad1bb016461a35bf3d7ec0647ba93c55146e53dcf51b52daae17330a734279513dbf3e6586983574ed5e28d0707bfdb9a13dc1",
403
-        "phone\/css\/font-awesome-4.7.0\/src\/survey.html": "09b3fb7dd39ff303d463da73133ea78ec9a60aa5f7189929ac0a8aea9fe51c09fae1bb8c2c85772001d4e828a42b7e4c4d57419f488f49b5a9584dc010365a10",
404
-        "phone\/css\/font-awesome-4.7.0\/src\/test\/2.3.2.html": "70f712d192f8441b7e2a5504b84955e42360c56b3c2b00df15472a69a4c435c74baae6876c4e8f9d00572f7bc7f24dd17726604025f89b12ecbfd1710b8325e3",
405
-        "phone\/css\/font-awesome-4.7.0\/src\/test\/all.html": "8056255c377ce11e2a51b001330f29ae81462e4ace4e7e3ff960d4e661cc282eeef4ef168a307a01196a830f2fb8dcf572b39c3cbb5d77e8bde8643f2a64e869",
406
-        "phone\/css\/font-awesome-4.7.0\/src\/test\/glyphicons.html": "b21a79668cf8d1a330ea2148e2f1089d41420f7f0e23b2862ea01e1e3c459d325247339aeee5d6dee5149b4f0f143832b819d07138da87eccbfbe130cd9ff650",
407
-        "phone\/css\/font-awesome-4.7.0\/src\/test\/height\/4.4.0.html": "435d1525deea3bbdddf21794156acfa355e9fae0ecb37a64b3e7486d4e3ea798c2d95ceadb12fc3b3f9b4017530e00eb0e44f1fc9c5865013520855b2b184685",
408
-        "phone\/css\/font-awesome-4.7.0\/src\/test\/height\/4.5.0.html": "f8e27986cc8539878b4247d92ea56a4750d036adabdb0b208d5e2a6c0df1ced6f4a6a9fd4d0f9ed7c0cf695233a16f6bed7ab0981e7bd57423f55dc5b3ae0710",
409
-        "phone\/css\/font-awesome-4.7.0\/src\/test\/height\/current.html": "dc9b48458c1841dd7bd085f7753ccbf27203591f68f0278f0b9df1cdaf9beb043a35d9c7b9bb500a2667543582d4c9b40b5c2f144cf88997d8dc84fedd00ee1b",
410
-        "phone\/css\/font-awesome-4.7.0\/src\/test\/index.html": "8060c06227dd2096d27afbc55f027214974a38c5f711d3f0c77ef1645441302324102037c7ad57b116d60c8aed2d847655bfddbfe0ba526fb0b5966435b509be",
411
-        "phone\/css\/font-awesome-4.7.0\/src\/thanks.html": "cf0b677134a1893d3335991a2a9b9533812447a0817b88c03c6f27c967fe8956cdd17b355b6abe796617d83e0229c945a557345c11580b636b5fd633af273bdb",
412
-        "phone\/css\/font-awesome-4.7.0\/src\/whats-new.html": "56607f43fc358a79bce938d9198bb7b091159d9aed52a354b57027810564973ddb9f0cd36b6ed8e573f6e9f09b25b043cdc88a1c22d212367e7794775a0e44f1",
413
-        "phone\/images\/backspace.svg": "3478af3fd81fe1258c242aa8db2b11a44b361a133eafc26fb503d0176f73c3b420683d14eb3bfcf916a88cd7e71807ed961bf34f653051b29d814fcf91d25d3c",
414
-        "phone\/images\/closewnd.svg": "38f6ba89d70905ab3d2c7d524fee42ce08f007622bb1256d04556cccdf40f549d39ab2fc455c878e6c318c03a8680d042c8e7d0dff9360a921e397e38567bf9a",
415
-        "phone\/images\/contacts.svg": "53c55a25bb8c76984d3420c5931b001af3528217881ed7ca7975df44234a701015789bf9667de91305a37fc55e0fb23759833ab8d51cefcbc1694ffa729e0238",
416
-        "phone\/images\/contacts_green.svg": "14dcdde8ea95adcbfbe07f7afad907cf57cef61f208326be5632f11661ed0ec811e1c89ad60ba97448476da87b4597dba7efbfa5e5b455d9153b2003e48e5c0f",
417
-        "phone\/images\/contacts_red.svg": "75a0a546b7f1adfdbb502e846f56074d1a9bcf7e82c8cba3ba6670cfcfebadb70304bc22cd407d00b635dbd3e42741b947088f3dab5ff6d1ec06f2d849fb5670",
418
-        "phone\/images\/incoming_blue.svg": "0908604830b1b263749c9f453539925e7e35e74de36b0206d80f3a8d22a23985c02c6b0189672e1a78a3fae4c8462066630ba96818b7a541920ac55219266b94",
419
-        "phone\/images\/nextcloud_logo_small.svg": "73674d807e80a99f7c441028285f49699b6b6e76a557d1501df0d59c46baca23bbe1fa88c0483956bc3a6404eabc0c3b142ade2f5d7ea3985fb45d1592fceef0",
420
-        "phone\/images\/outgoing_blue.svg": "8cd86a47310cf6a38df8023c9ff57df2968c8e61cb356ce13d4c3369f09ed5a880d4c63f5bea9fbabaf119eedc773248513401efdc013e2aa76c8126cb1b9408",
421
-        "phone\/images\/sip_trip_phone_logo.svg": "271b9632efc181f514892220a648aa2636ec8a561e297c1a2abfb64a10ffcdbff37913bf8cc82ad362a33b4faf224e74b45bd32a9b1b760a2e0476d56bc02538",
422
-        "phone\/images\/sip_trip_phone_logo_large.svg": "b622744c5eff160b77ef7226d8f70eef15311db18d7dea9e334e92b20601a33d812cb0bbc3eef74d6294d1ab43ba3969a7ffde23d8ec2f7f9d1dbf6b6ec18e25",
423
-        "phone\/index.php": "76fbcca0671da8ad534b99373ea85135e5ead02fd5c9187827cca643515629e06332f7711738150d45178baa4f1499ea9fed686b7a1941fc27eb7a9e8d36adf0",
424
-        "phone\/scripts\/SIP.js": "372509f1c0e53f3ecbfa2db99b5f6484f2401ddaf3824e70ecd763a405e77f3456c1157ea6af6c9d716da4dfa9227a30995361267baf97541f531dbd6260ffe2",
425
-        "phone\/scripts\/app.js": "c7ea63551ed9c4f25dcf4b19d5eac7c00cdd016c2c592d165c4c3eb292e315a190c6ac64a040a7cf8b7f2bab05707fa62e332b21aedfc35fd03263214f08e13a",
426
-        "phone\/scripts\/bootstrap.min.js": "de8d6bf69932b479dcfe470e893effa9f88d399314b2fa74c14a1465c7a6f1da78a3764fa35ee05ddd6a3f225588e601ed5978d5ef48e353e279c596f2471071",
427
-        "phone\/scripts\/fix-webm-duration.js": "20b024a1264e2ee67a5a67d85cb57770bee8231bda1bdd1418690021b40984efa7b94aabe00fb750e3ee192c744b80730c2b6c34b55dea245a191e84cb7868d5",
428
-        "phone\/scripts\/jquery-1.11.3.min.js": "25e4bc43cc350f38cab68b422101b528781bcd271a299cad39aaf64aa331ed0a35b9dfed3938ddccaa08c31161ee2c472acf297aabea334315758e128487b0fb",
429
-        "phone\/scripts\/moment.min.js": "8f42e847a067c9f4e803bed887cb458ca2a6973025a6bd7f4a0853eeb24b4c64f8284e9d8fd40066fc71e17a90b36d1a6477939ff7c4160dec09e11e6f90d798",
430
-        "phone\/scripts\/sip.min.js": "b2e041cab891b277735031a270b29b8849fa9ce5e07da94fd9bcf9edefd3402397930b612d48603bee0480b5b739a1adf145ec57b78e3e26a259d26e198c13a3",
431
-        "phone\/sounds\/dtmf.ogg": "ff7217621c355aaf8eaf290f61a9fb228be899d055fc312de7ebd8a29e0688f82fbb629519db948737837df1e0aefe8b0ed0b304909f6149e97753dd6f50b791",
432
-        "phone\/sounds\/incoming.ogg": "666a28d6d6dfa0afa0d1be3d838c9b207b91ac5ef46a787b05b30da622a611b4f734ef7512bff873d3e6025ed1bd1699ccc2970292b3ca21d29a58990ec96a73",
433
-        "phone\/sounds\/outgoing.ogg": "b5d17d7a53e42215365176c8ce515bcc71fe682b92d6ee12a484d0b12d7f2a28b81db18b2d6e9073bd774728fe68becfa6c34b8648bca4a20a52622d7eef2fd5",
434
-        "phone\/sounds\/warnrec.ogg": "6a8b029e01c021c2a9255ecdc179ba2e27b29d53516a331cdf9c2365809df083774e605c78dcf8318243856d7e0ae6f4894e49789ab9ece1f3a69dc0390bd309",
435
-        "templates\/content\/index.php": "44ea4db27e9af9e1c61a2d6c8431b22d17dbec2e9c732201ac8b81d56ae9d85e37f68cd11f9de2f5936e8de3d240ac5ebd28296f5994411ffd35f01d9a4dcfc1",
436
-        "templates\/index.php": "5db81d53604174b8e8907f693ae37eaed4eff3427ff8a02b50631b952ae468750cca8f010d64183fc6ef7869ea7447112d2678effb6571fae622e1fa0141c940",
437
-        "templates\/settings.php": "58e6e4e638414842bfee0f087f5df2b6f3290e9eda3c0bb13ad8797c508d572291b434d1e1f171beb26a74233809bcd4cd9e483a77092498467149a2dff0a17c"
438
-    },
439
-    "signature": "EJDEqAegzUX4FPKTtmU5qk\/J5B17hR9HhyMmuT7S1YpbhVW7qQ1R07JwlP5Pf77ad5jkOEGuvH02zMdw+KMVSfdxeWsTNW+ePeScZE0RryGeXrFjkHWeW4UC4BfthMixbXz7BMOJTEpsM7E3aJRdRIvrtrPcMqhYb\/3J02CyQSg6+HUoTkVH3ont5wrZl1RKbF06VO\/a4aJfTKV5JL\/IikGdNNd324vCiXIM9dG92qdZSlmx\/5lzVTEcl2CWG3pnY2JXIMrUot0BjPmtzDBT+dOBwt8BHKIBxgUS0WyQUbAPBSZlwb7\/rgHVq33yZt+45NtJHEtvYGZDK20aYFBjicRBi3h3qKpIE5wYlOqu\/eQYyeLt9Pj3FkU6qK50\/SDkxOZHFCkxP\/6hebKOoKeN9x6uvQbtIu4vyDfcqL+iurWoVmkpDcZIZW8LRudR++AfZbn9zqVkTfyTR9uNBQj0SgRApJPRoRn84Kesy4DpI2sqkDbCDA7SvMKeR9CwtOeVUBZDRjRVHIi6VVswUlahLsDIgbDd2mXDQZHpQmaxxOvB4R28CFQ65m+nldCS\/zAtPfCDw+kAHITXRbh+rgf7tMKTbrIygss93L1E6OpVBXON5cvBDh2dOILHxTnEYpV5T6ixfU3VULZEdvoayrywzGogtFTAE2Aa\/4d83hPGKpU=",
440
-    "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-----"
441
-}
442 0
\ No newline at end of file
443 1
deleted file mode 100644
... ...
@@ -1,107 +0,0 @@
1
-/**
2
- * @copyright 2021, 2024 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 userid = "<?php p($userId); ?>";
26
-   var stpappdir = 'apps';
27
-
28
-   // Get app directory
29
-   var getstpurl = OC.generateUrl('/apps/sip_trip_phone/user/getappdirectory');
30
-
31
-   $.ajax({
32
-     method: 'GET',
33
-     url: getstpurl + '/' + userid,
34
-     contentType: 'application/json',
35
-     success: function(stpappdirfdb) {
36
-                   stpappdir = stpappdirfdb;
37
-
38
-                   // Get the app's settings
39
-                   var getsetUrl = OC.generateUrl('/apps/sip_trip_phone/user/getsettings');
40
-
41
-		   $.ajax({
42
-		      method: 'GET',
43
-		      url: getsetUrl + '/' + userid,
44
-		      contentType: 'application/json',
45
-		      success: function(settingsdb) {
46
-
47
-			 var connectData = {
48
-			      "User" : settingsdb.sipusername,
49
-			      "Realm" : settingsdb.siprealm,
50
-			      "Display" : settingsdb.pdisplayname,
51
-			      "WSServer" : settingsdb.stphwssurl,
52
-			      "Stun" : settingsdb.stunserver,
53
-			      "Tracesipmsg" : settingsdb.tracesipmsg,
54
-			      "Voicenumbers" : settingsdb.voicenumbers,
55
-			      "Defaultvoicenumber" : settingsdb.defaultvoicenumber
56
-			 };
57
-
58
-			 localStorage.setItem('SIPCreds', JSON.stringify(connectData));
59
-
60
-		         // Get the (voice call capable) phone numbers of the current user's contacts and of all the Nextcloud users who didn't hide their phone numbers
61
-                         var getctpnUrl = OC.generateUrl('/apps/sip_trip_phone/user/getcontactsnmbrs');
62
-
63
-			 $.ajax({
64
-			      method: 'GET',
65
-			      url: getctpnUrl + '/' + userid,
66
-			      contentType: 'application/json',
67
-			      success: function(contactspndb) {
68
-
69
-                                                 localStorage.setItem('NCContacts', JSON.stringify(contactspndb));
70
-
71
-
72
-						 var getspswdUrl = OC.generateUrl('/apps/sip_trip_phone/user/getsippass');
73
-
74
-						 $.ajax({
75
-						      method: 'GET',
76
-						      url: getspswdUrl + '/' + userid,
77
-						      contentType: 'text',
78
-						      success: function(sippassword) {
79
-
80
-							 if (!localStorage.getItem('SipTripPhone')) {
81
-
82
-							     localStorage.setItem('sipUserToken', sippassword);
83
-
84
-							     // Open the phone window
85
-                                                             var url = OC.generateUrl('/'+ stpappdir +'/sip_trip_phone/phone/index.php');
86
-							     window.open(url, "SipTripPhone", "width=354,height=572,menubar=no,scrollbars=no,status=no,addressbar=no,resizable=no");
87
-
88
-							 } else {
89
-							     window.alert('The phone is already open!');
90
-							 }
91
-						      },
92
-						      error: function() {}
93
-						 });
94
-
95
-		              },
96
-		              error: function() { alert("An error occurred while getting the contacts. You can check the Nextcloud log to find more details about this issue."); }
97
-		         });
98
-
99
-		      },
100
-                      error: function() { alert("An error occurred while getting the app's settings. You can check the Nextcloud log to find more details about this issue."); }
101
-		   });
102
-
103
-     },
104
-     error: function() { alert("An error occurred while getting the app's directory. You can check the Nextcloud log to find more details about this issue."); }
105
-   });
106
-
107
-});
108 0
deleted file mode 100644
... ...
@@ -1,86 +0,0 @@
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
-});
87 0
deleted file mode 100644
... ...
@@ -1,57 +0,0 @@
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\AppInfo;
27
-
28
-use OCP\AppFramework\App;
29
-use OCP\IServerContainer;
30
-use OCA\SIPTripPhone\Controller\PageController;
31
-
32
-
33
-class Application extends App {
34
-
35
-	public function __construct(array $urlParams=array()) {
36
-		parent::__construct('sip_trip_phone', $urlParams);
37
-
38
-        $container = $this->getContainer();
39
-
40
-          // Controllers
41
-          $container->registerService('PageController', function($c) {
42
-              return new PageController(
43
-                  $c->query('AppName'),
44
-                  $c->query('Request')
45
-              );
46
-          });
47
-
48
-	}
49
-
50
-	public function register() {
51
-		$server = $this->getContainer()->getServer();
52
-
53
-                $app = new \OCA\SIPTripPhone\AppInfo\Application();
54
-                $app->register();
55
-
56
-        }
57
-}
58 0
deleted file mode 100644
... ...
@@ -1,89 +0,0 @@
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
-use OC\URLGenerator;
32
-
33
-
34
-class SphoneController extends Controller {
35
-
36
-    private $service;
37
-    private $userId;
38
-    private $urlGenerator;
39
-
40
-    public function __construct($appName, IRequest $request, SphoneService $service, $userId, URLGenerator $urlGenerator) {
41
-        parent::__construct($appName, $request);
42
-        $this->service = $service;
43
-        $this->userId = $userId;
44
-        $this->urlGenerator = $urlGenerator;
45
-    }
46
-
47
-    /**
48
-     * @NoAdminRequired
49
-     */
50
-    public function getappdirectory($userId) {
51
-        $apprelpath = $this->urlGenerator->linkTo('sip_trip_phone', 'COPYING.txt');
52
-        $apprelpatharr = explode("/", $apprelpath);
53
-        $stpappdir = $apprelpatharr[1];
54
-        return $stpappdir;
55
-    }
56
-
57
-    /**
58
-     * @NoAdminRequired
59
-     */
60
-    public function getsettings($userId) {
61
-
62
-           return $this->service->getsettings($this->userId);
63
-    }
64
-
65
-    /**
66
-     * @NoAdminRequired
67
-     */
68
-    public function getsippass($userId) {
69
-
70
-           return $this->service->getsippass($this->userId);
71
-    }
72
-
73
-   /**
74
-    * @NoAdminRequired
75
-    */
76
-    public function updatesettings(string $userId, string $pdisplayname, string $sipusername, string $sipuserpassword, string $stphwssurl, string $siprealm, string $stunserver, int $tracesipmsg, string $voicenumbers, string $defaultvoicenumber) {
77
-
78
-           return $this->service->updatesettings($this->userId, $pdisplayname, $sipusername, $sipuserpassword, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber);
79
-
80
-    }
81
-
82
-    /**
83
-     * @NoAdminRequired
84
-     */
85
-    public function getcontactsnmbrs($userId) {
86
-
87
-           return $this->service->getcontactsnmbrs($this->userId);
88
-    }
89
-}
90 0
deleted file mode 100644
... ...
@@ -1,240 +0,0 @@
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
-    public function getcontactsnmbrs($userId) {
94
-
95
-        // Get the phone numbers of regular contacts
96
-
97
-        $cardadd = "card_add_self";
98
-        $cntctsusr = $this->connection->prepare('
99
-                    SELECT `user`, `subject`, `subjectparams`
100
-		    FROM  `*PREFIX*activity`
101
-		    WHERE `user` = ? AND `subject` = ?');
102
-        $rescntcts = $cntctsusr->execute([$userId, $cardadd]);
103
-        $cnctsforuserinit = [];
104
-        while ($ctrow = $rescntcts->fetch()) {
105
-               $ctsperuserarr = json_decode($ctrow['subjectparams'], true);
106
-               $cnctsforuserinit[] = $ctsperuserarr['card']['id'];
107
-        }
108
-        $rescntcts->closeCursor();
109
-        $cnctsforuser = array_unique($cnctsforuserinit);
110
-
111
-        $contactData = [];
112
-        if ($cnctsforuser) {
113
-
114
-            foreach ($cnctsforuser as $ctkey => $ctid) {
115
-                 $ctdata = $this->connection->prepare('
116
-                           SELECT `carddata`, `uid`
117
-		           FROM  `*PREFIX*cards`
118
-		           WHERE `uid` = ?');
119
-                 $ctdatares = $ctdata->execute([$ctid]);
120
-                 $ctdatarow = $ctdatares->fetch();
121
-                 $ctdatares->closeCursor();
122
-                 $ctdatarr = preg_split('/\r\n|\r|\n/', $ctdatarow['carddata']);
123
-                 $contactNumbers = [];
124
-                 $contactRole = '';
125
-                 foreach ($ctdatarr as $cdkey => $cdata) {
126
-                          $telcheck = false;
127
-                          if (str_contains($cdata, "FN:")) {
128
-                              $cdnamearr = explode("FN:", $cdata);
129
-                              $contactName = $cdnamearr[1];
130
-                          } elseif (str_contains($cdata, "FN;")) {
131
-                              $cdnamearr = explode(":", $cdata);
132
-                              $contactName = $cdnamearr[1];
133
-                          } elseif (str_contains($cdata, "TITLE:")) {
134
-                              $cdtitlearr = explode("TITLE:", $cdata);
135
-                              $contactRole = $cdtitlearr[1];
136
-                          } elseif (str_contains($cdata, "TEL;")) {
137
-                              $cdtelarr = explode("TYPE=", $cdata);
138
-                              $cdteldatarr = explode(":", $cdtelarr[1]);
139
-                                  if (str_contains($cdteldatarr[0], 'CELL') || str_contains($cdteldatarr[0], 'VOICE') || str_contains($cdteldatarr[0], 'CAR')) {
140
-                                      $ctNumberType = $cdteldatarr[0];
141
-                                      $ctNumber = $cdteldatarr[1];
142
-                                      if ($ctNumber) { $telcheck = true; }
143
-                                  }
144
-                          }
145
-                          if ($telcheck) { $contactNumbers[] = [$ctNumberType, $ctNumber]; }
146
-                 }
147
-                 if ($contactNumbers) {
148
-                     $contactData[] = ['contact_name' => $contactName, 'contact_role' => $contactRole, 'contact_type' => 'regular_contact', 'contact_numbers' => $contactNumbers];
149
-                 }
150
-            }
151
-        }
152
-
153
-        // Get the (non-private) phone numbers of Nextcloud users
154
-
155
-        $ncusers = $this->connection->prepare('
156
-                    SELECT `uid`, `data`
157
-		    FROM  `*PREFIX*accounts`');
158
-        $ncusersres = $ncusers->execute();
159
-        $ncUserData = [];
160
-        while ($ncrow = $ncusersres->fetch()) {
161
-               $ncperuserarr = json_decode($ncrow['data'], true);
162
-               if ($ncperuserarr['phone']['value'] && ($ncperuserarr['phone']['scope'] == 'v2-local' || $ncperuserarr['phone']['scope'] == 'v2-federated' || $ncperuserarr['phone']['scope'] == 'v2-published')) {
163
-
164
-                   $ncdisplayname = $ncperuserarr['displayname']['value'];
165
-
166
-                   $nctelnumber = [['VOICE/CELL', $ncperuserarr['phone']['value']]];
167
-
168
-                   if ($ncperuserarr['role']['scope'] == 'v2-local' || $ncperuserarr['role']['scope'] == 'v2-federated' || $ncperuserarr['role']['scope'] == 'v2-published') {
169
-                       $ncuserrole = $ncperuserarr['role']['value'];
170
-                   } else { $ncuserrole = ''; }
171
-
172
-                   $ncUserData[] = ['contact_name' => $ncdisplayname, 'contact_role' => $ncuserrole, 'contact_type' => 'ncuser_contact', 'contact_numbers' => $nctelnumber];
173
-               }
174
-        }
175
-        $ncusersres->closeCursor();
176
-
177
-        $usersAndContacts = array_merge($contactData, $ncUserData);
178
-
179
-        return $usersAndContacts;
180
-    }
181
-
182
-    /**
183
-     * @NoAdminRequired
184
-     *
185
-     */
186
-    public function updatesettings($userId, $pdisplayname, $sipusername, $sipuserpassword, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber) {
187
-
188
-        // Validate the data entered in the fields on the settings page
189
-        if (mb_strlen($pdisplayname) > 128) { logger('sip_trip_phone')->error("The 'Display Name' cannot exceed 128 characters!"); exit(); }
190
-        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(); }        
191
-        if (mb_strlen($sipuserpassword) > 300) { logger('sip_trip_phone')->error("The 'SIP User Password' cannot exceed 300 characters!"); exit(); }      
192
-        if (filter_var($stphwssurl, FILTER_VALIDATE_URL) == false) { logger('sip_trip_phone')->error("The 'WSS URL' that you entered is not valid."); exit(); }
193
-        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(); }
194
-        if ($stunserver != '') {
195
-            $stunIpDom = explode(":", $stunserver);
196
-            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(); }
197
-        }
198
-        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(); }
199
-        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(); }
200
-
201
-        $sqlup = $this->connection->prepare('
202
-                    SELECT `id`, `user_id`, `pdisplayname`, `sipusername`, `sipuserpassword`, `stphwssurl`, `siprealm`, `stunserver`, `tracesipmsg`, `voicenumbers`, `defaultvoicenumber`
203
-		    FROM  `*PREFIX*sip_trip_phone`
204
-		    WHERE `user_id` = ?');
205
-        $resultup = $sqlup->execute([$userId]);
206
-        $row = $resultup->fetch();
207
-        $resultup->closeCursor();
208
-
209
-        if ($resultup && !$row) {
210
-
211
-            if ($sipuserpassword != '') {
212
-                $sipuserpasswordenc = $this->crypto->encrypt($sipuserpassword);
213
-            } else { $sipuserpasswordenc = ''; }
214
-
215
-            $sqlins = $this->connection->prepare('
216
-				INSERT INTO `*PREFIX*sip_trip_phone`
217
-					(`user_id`, `pdisplayname`, `sipusername`, `sipuserpassword`, `stphwssurl`, `siprealm`, `stunserver`, `tracesipmsg`, `voicenumbers`, `defaultvoicenumber`)
218
-				VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
219
-	    $sqlins->execute([$userId, $pdisplayname, $sipusername, $sipuserpasswordenc, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber]);
220
-
221
-        } elseif ($resultup && $row) {
222
-
223
-            if ($sipuserpassword != '' && $sipuserpassword != "%20%20%20%20%20%20%20") {
224
-                $sipuserpasswordenc = $this->crypto->encrypt($sipuserpassword);
225
-            } elseif ($sipuserpassword == "%20%20%20%20%20%20%20") {
226
-                $sipuserpasswordenc = $row['sipuserpassword'];
227
-            } elseif ($sipuserpassword == '') {
228
-                $sipuserpasswordenc = '';
229
-            }
230
-
231
-	    $sqlup = $this->connection->prepare('
232
-			UPDATE `*PREFIX*sip_trip_phone`
233
-			SET `pdisplayname` = ?, `sipusername` = ?, `sipuserpassword` = ?, `stphwssurl` = ?, `siprealm` = ?, `stunserver` = ?, `tracesipmsg` = ?, `voicenumbers` = ?, `defaultvoicenumber` = ?
234
-                        WHERE `user_id` = ?');
235
-	    $updateRes = $sqlup->execute([$pdisplayname, $sipusername, $sipuserpasswordenc, $stphwssurl, $siprealm, $stunserver, $tracesipmsg, $voicenumbers, $defaultvoicenumber, $userId]);
236
-	    $updateRes->closeCursor();
237
-
238
-        }
239
-    }
240
-}
241 0
deleted file mode 100644
... ...
@@ -1,1363 +0,0 @@
1
-/**
2
- * @copyright 2021, 2024 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, as 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
-    // Show system notifications on incoming calls
59
-    function incomingCallNote() {
60
-       var noticeOptions = { body : "New incoming call !!!", icon : "images/sip_trip_phone_logo.svg" }
61
-       var callNotification = new Notification("SIP Trip Phone incoming call", noticeOptions);
62
-       callNotification.onclick = function (event) { callNotification.close(); return; }
63
-
64
-       if (document.visibilityState == "visible") {
65
-           return;
66
-       } else { setTimeout(incomingCallNote, 8000); }
67
-    }
68
-
69
-    // Change page title on incoming calls
70
-    function changePageTitle() {
71
-        if ($(document).attr("title") == "SIP Trip Phone") { $(document).prop("title", "New call !!!"); } else { $(document).prop("title", "SIP Trip Phone"); }
72
-        if (document.hasFocus()) {
73
-            $(document).prop("title", "SIP Trip Phone");
74
-            return;
75
-        } else { setTimeout(changePageTitle, 460); }
76
-    }
77
-
78
-    var mediaRecorder = null;
79
-    var userSIPToken = localStorage.getItem('sipUserToken');
80
-    localStorage.removeItem('sipUserToken');
81
-
82
-    var user = JSON.parse(localStorage.getItem('SIPCreds'));
83
-    var traceornot = (user.Tracesipmsg == 1)? true : false;
84
-
85
-    // Add the 'available phone numbers' drop-down list
86
-    var stpVoiceNmbrs = user.Voicenumbers;
87
-    var stpVoiceNbOpt = '';
88
-    var stpVoiceNmbrsArr = [];
89
-
90
-    if (stpVoiceNmbrs != '') {
91
-
92
-	stpVoiceNmbrsArr = stpVoiceNmbrs.split(",");
93
-	var stpDefNmbrFdb = user.Defaultvoicenumber;
94
-
95
-	for (var v = 0; v < stpVoiceNmbrsArr.length; v++) {
96
-             stpVoiceNbOpt += '<option value="'+ stpVoiceNmbrsArr[v] +'" class="stpSlctFrmNmbrs">'+ stpVoiceNmbrsArr[v] +'</option>';
97
-	}
98
-    }
99
-    stpVoiceNbOpt += '<option value="'+ user.User +'" class="stpSlctFrmNmbrs">'+ user.User +'</option>';
100
-
101
-    $("#fromNumber").append(stpVoiceNbOpt);
102
-
103
-    if (stpDefNmbrFdb != '' && stpDefNmbrFdb != null) {
104
-        $("#fromNumber").val(stpDefNmbrFdb);
105
-    } else {
106
-        if (stpVoiceNmbrsArr.length > 0) {
107
-            $("#fromNumber").val(stpVoiceNmbrsArr[0]);
108
-        } else { $("#fromNumber").val(user.User); }
109
-    }
110
-
111
-    // Adjust height of initial screen, call history list and width of dial pad
112
-    $("#sip-splash").css({ "height" : window.innerHeight - 111 });
113
-    $("#sip-logitems").css({ "height" : window.innerHeight - 141 });
114
-
115
-    $(window).resize(function() {
116
-      $("#sip-splash").css({ "height" : window.innerHeight - 111 });
117
-      $("#sip-logitems").css({ "height" : window.innerHeight - 141 });
118
-    });
119
-
120
-    var calcWidth = parseInt(window.innerWidth - 30) + "px";
121
-    var calcHeight = parseInt(window.innerHeight - 111) + "px";
122
-    $("#sip-dialpad").css({ "width" : calcWidth, "height" : calcHeight });
123
-
124
-    var calcMargin =  parseInt(($("#sip-dialpad").height() - $("#dialpadWrap").height()) / 2)  + "px auto";
125
-    $("#dialpadWrap").css("margin", calcMargin);
126
-
127
-    // Get the contacts with phone numbers and the Nextcloud users with phone numbers (that were not set up as private)
128
-    var contactsData = JSON.parse(localStorage.getItem('NCContacts'));
129
-
130
-    // Sort contacts alphabetically by first name
131
-    contactsData.sort(function(a, b) {
132
-        if (a.contact_name < b.contact_name) return -1;
133
-        if (a.contact_name > b.contact_name) return 1;
134
-        return 0;
135
-    });
136
-
137
-    // First list regular contacts, then Nextcloud users
138
-    contactsData.sort(function(c, d) {
139
-        if (c.contact_type == "regular_contact" && d.contact_type == "ncuser_contact") return -1;
140
-        if (c.contact_type == "ncuser_contact" && d.contact_type == "regular_contact") return 1;
141
-        return 0;
142
-    });
143
-
144
-    // Create the drop-down list containing the contacts with phone numbers and the Nextcloud users with phone numbers (that were not set up as private)
145
-    var contactsTbl = "<div id='contactsTable'><table id='cntctsTbl'>";
146
-    contactsTbl += "<tr id='searchCntct'><td colspan='3'><div id='searchSpace'><i class='fa fa-search'></i><input type='text' id='txtFindContact' autocomplete='none' placeholder='Search contact by name or role' title='Search contact by name or by role within the organization'></div></td></tr>";
147
-
148
-    if (contactsData.length > 0) {
149
-
150
-        var regContactNb = 0;
151
-        var ncUserNb = 0;
152
-
153
-        for (var c = 0; c < contactsData.length; c++) {
154
-
155
-             var ctctsNmbr = '';
156
-             for (var p = 0; p < contactsData[c]['contact_numbers'].length; p++) {
157
-                  if (contactsData[c]['contact_numbers'][p][0].indexOf("VOICE/CELL") > -1) {
158
-                      var ctPhType = "<i class='fa fa-phone phnmbrtype' title='"+ contactsData[c]['contact_numbers'][p][0] +"' style='font-size:16px'></i>";
159
-                  } else if (contactsData[c]['contact_numbers'][p][0].indexOf("VOICE") > -1) {
160
-                      var ctPhType = "<i class='fa fa-volume-control-phone phnmbrtype' title='"+ contactsData[c]['contact_numbers'][p][0] +"' style='font-size:17px'></i>";
161
-                  } else if (contactsData[c]['contact_numbers'][p][0].indexOf("CELL") > -1) {
162
-                      var ctPhType = "<i class='fa fa-mobile phnmbrtype' title='"+ contactsData[c]['contact_numbers'][p][0] +"' style='font-size:18px'></i>";
163
-                  } else if (contactsData[c]['contact_numbers'][p][0].indexOf("CAR") > -1) {
164
-                      var ctPhType = "<i class='fa fa-car phnmbrtype' title='"+ contactsData[c]['contact_numbers'][p][0] +"' style='font-size:15px'></i>";
165
-                  }
166
-                  ctctsNmbr += "<div class='phnmbrRow'><div class='phnbType'>"+ ctPhType +"</div><div id='indPhnmbr-"+ c +"-"+ p +"' class='phnbNumber' title='Click to call'>"+ contactsData[c]['contact_numbers'][p][1] +"</div></div>";
167
-             }
168
-             if (contactsData[c].contact_type == "regular_contact") {
169
-                 var cntctTypeInd = "<div class='typeContact' data-tpcontact='regular_contact'><img src='images/contacts_green.svg' class='regularContact' title='Regular contact'></div>";
170
-                 regContactNb++;
171
-             } else if (contactsData[c].contact_type == "ncuser_contact") {
172
-                 var cntctTypeInd = "<div class='typeContact' data-tpcontact='ncuser_contact'><img src='images/nextcloud_logo_small.svg' class='ncuserContact' title='Nextcloud user'></div>";
173
-                 ncUserNb++;
174
-             }
175
-             if (c % 2 == 1) { var backgroundClr = "darkBackground" } else { var backgroundClr = ""; }
176
-
177
-             contactsTbl += "<tr id='ctRowNb-"+ c +"' class='contactRow "+ backgroundClr +"'><td id='contactName'><div class='cntctName'>"+ contactsData[c].contact_name +"</div><div class='cntctRole'>"+ contactsData[c].contact_role +"</div></td><td class='contactType'>"+ cntctTypeInd +"</td><td class='contactNumber'>"+ ctctsNmbr +"</td></tr>";
178
-        }
179
-
180
-        var totalCntctNb = regContactNb + ncUserNb;
181
-        contactsTbl += "<tr id='totCtDisp'><td colspan='3'><div id='totalDisplayed'><img src='images/contacts_green.svg' id='regCntctsTot' title='Regular contacts'><span id='totDspRegCts'>"+ regContactNb +"</span><img src='images/nextcloud_logo_small.svg' id='ncUsersTot' title='Nextcloud users'><span id='totDspNcUsr'>"+ ncUserNb +"</span><span style='display:inline-block;margin-left:12px;'>Total:<span id='totDspCntcts'>"+ totalCntctNb +"</span></span></div></td></tr>";
182
-    } else {
183
-        contactsTbl += "<tr><td colspan='3' class='noPhoneNmbrs'>Here you will see all the contacts with phone numbers from your Contacts app and all the Nextcloud users with phone numbers that were not set up as 'Private'.<br><br>For the moment there are no Nextcloud contacts and Nextcloud users with available phone numbers to display.</td></tr>";
184
-    }
185
-
186
-    contactsTbl += "</table></div>";
187
-
188
-    $("#wndSpace").append(contactsTbl);
189
-
190
-    var nameWidth = parseInt(window.innerWidth * 0.40) + "px";
191
-    $("#contactName").width(nameWidth);
192
-
193
-    // Show/hide the contacts' phone numbers
194
-    function showContactsNmbrs() {
195
-
196
-            $("#contactsUsersList").unbind("click");
197
-	    $("#contactsUsersList").click(function() {
198
-
199
-	       if ($("#contactsTable").is(":visible")) {
200
-		   $("#contactsTable").css("display", "none");
201
-
202
-		   $("#ctctsUsrsLst").removeClass("contUsrsLstRed");
203
-		   $("#ctctsUsrsLst").addClass("contUsrsLst");
204
-		   if (localStorage.getItem('sipCalls')) {
205
-		       $('#sip-splash').css("display", "none");
206
-		       $('#sip-log').css("display", "block");
207
-		   } else {
208
-		       $('#sip-splash').css("display", "block");
209
-		       $('#sip-log').css("display", "none");
210
-		   }
211
-		   $("#contactsUsersList").prop("title", "Show list of contacts and Nextcloud users with available phone numbers");
212
-
213
-	       } else {
214
-		   $("#contactsTable").css("display", "block");
215
-
216
-		   $("#ctctsUsrsLst").removeClass("contUsrsLst");
217
-		   $("#ctctsUsrsLst").addClass("contUsrsLstRed");
218
-		   $('#sip-splash').css("display", "none");
219
-		   $('#sip-log').css("display", "none");
220
-		   $("#contactsUsersList").prop("title", "Hide list of contacts and Nextcloud users with available phone numbers");
221
-	       }
222
-               $("#dropDownButton").prop("title", "Show keypad");
223
-	    });
224
-    }
225
-
226
-    // Call a phone number on the contacts list when clicking on it
227
-    $('[id^="indPhnmbr-"]').click(function() {
228
-       var targetNmbr = $(this).text();
229
-       $("#numDisplay").val(targetNmbr);
230
-       ctxSip.sipCall(targetNmbr);
231
-    });
232
-
233
-    // Search contact by name and role
234
-    $("#txtFindContact").on('keyup', function() {
235
-
236
-       var srchd = $("#txtFindContact").val();
237
-       for (var b = 0; b < contactsData.length; b++) {
238
-            if (srchd && srchd.length > 0) {
239
-                if (($("#ctRowNb-"+ b +" .cntctName").text().toLowerCase().indexOf(srchd.toLowerCase()) == -1) && 
240
-                    ($("#ctRowNb-"+ b +" .cntctRole").text().toLowerCase().indexOf(srchd.toLowerCase()) == -1)) {
241
-
242
-                     $("#ctRowNb-"+ b +"").hide();
243
-
244
-                } else { $("#ctRowNb-"+ b +"").show(); }
245
-
246
-            } else { $(".contactRow").each(function() { $(this).show(); }); }
247
-       }
248
-
249
-       // Update the totals row
250
-       var totDspReg = 0;
251
-       var totDspNcusr = 0;
252
-       for (var t = 0; t < contactsData.length; t++) {
253
-            if ($("#ctRowNb-"+ t +"").is(":visible") && ($("#ctRowNb-"+ t +" .typeContact").data("tpcontact") == "regular_contact")) { totDspReg++; } else if 
254
-               ($("#ctRowNb-"+ t +"").is(":visible") && ($("#ctRowNb-"+ t +" .typeContact").data("tpcontact") == "ncuser_contact")){ totDspNcusr++; }
255
-       }
256
-       $("#totDspRegCts").text(totDspReg);
257
-       $("#totDspNcUsr").text(totDspNcusr);
258
-       $("#totDspCntcts").text(parseInt(totDspReg + totDspNcusr));
259
-    });
260
-
261
-    // Format call duration
262
-    function formatDuration(millsec) {
263
-
264
-	    var secs = Math.round(millsec/1000);
265
-	    var hours = Math.floor(secs / 3600);
266
-
267
-	    var divisor_for_minutes = secs % 3600;
268
-	    var minutes = Math.floor(divisor_for_minutes / 60);
269
-
270
-	    var divisor_for_seconds = divisor_for_minutes % 60;
271
-	    var seconds = Math.ceil(divisor_for_seconds);
272
-
273
-	    var finduration = (hours > 0)? hours +" hr " : "";
274
-	    finduration += (minutes > 0)? minutes +" min " : "";
275
-	    finduration += seconds +" sec";
276
-
277
-	    return finduration;
278
-    }
279
-
280
-
281
-    if (user.Stun) {
282
-
283
-        var configComp = {
284
-            media : {
285
-                remote : {
286
-                    video : document.getElementById('outputVideo'),
287
-                    audio : document.getElementById('outputAudio')
288
-                }
289
-            },
290
-            peerConnectionOptions : { 
291
-                rtcConfiguration : {
292
-                    iceServers : [{ urls : "stun:"+ user.Stun }]
293
-                } 
294
-            },
295
-            password : userSIPToken,
296
-            authorizationUser : user.User,
297
-            displayName : user.Display,
298
-            uri : user.User +'@'+ user.Realm,
299
-            transportOptions : {
300
-                wsServers : user.WSServer,
301
-                traceSip : traceornot,
302
-                log : { level : 3 }
303
-            },
304
-            registerExpires : 9999999
305
-        };
306
-
307
-    } else {
308
-
309
-        var configComp = {
310
-            media : {
311
-                remote : {
312
-                    video : document.getElementById('outputVideo'),
313
-                    audio : document.getElementById('outputAudio')
314
-                }
315
-            },
316
-            password : userSIPToken,
317
-            authorizationUser : user.User,
318
-            displayName : user.Display,
319
-            uri : user.User +'@'+ user.Realm,
320
-            transportOptions : {
321
-                wsServers : user.WSServer,
322
-                traceSip : traceornot,
323
-                log : { level : 3 }
324
-            },
325
-            registerExpires : 9999999
326
-        };
327
-    }
328
-
329
-    var ctxSip = {
330
-
331
-        config : configComp, 
332
-        ringtone : document.getElementById('ringtone'),
333
-        ringbacktone : document.getElementById('ringbacktone'),
334
-        recordingwarn : document.getElementById('warnUser'),
335
-        Sessions : [],
336
-        callTimers : {},
337
-        callActiveID : null,
338
-        callVolume : 1,
339
-        Stream : null,
340
-
341
-        /**
342
-         * Parses a SIP uri and returns a formatted US phone number.
343
-         *
344
-         * @param  {string} phone number or uri to format
345
-         * @return {string} formatted number
346
-         */
347
-        formatPhone : function(phone) {
348
-
349
-            var num;
350
-
351
-            if (phone.indexOf('@')) {
352
-                num = phone.split('@')[0];
353
-            } else {
354
-                num = phone;
355
-            }
356
-
357
-            num = num.toString().replace(/[^0-9\+]/g, '');
358
-
359
-            return num;
360
-        },
361
-
362
-        // Sound methods
363
-        startRingTone : function() {
364
-            try { ctxSip.ringtone.play(); } catch (e) { }
365
-        },
366
-
367
-        stopRingTone : function() {
368
-            try { ctxSip.ringtone.pause(); } catch (e) { }
369
-        },
370
-
371
-        startRingbackTone : function() {
372
-            try { ctxSip.ringbacktone.play(); } catch (e) { }
373
-        },
374
-
375
-        stopRingbackTone : function() {
376
-            try { ctxSip.ringbacktone.pause(); } catch (e) { }
377
-        },
378
-
379
-        // Generate a random string to set an ID for a call
380
-        getUniqueID : function() {
381
-            return Math.random().toString(36).substr(2, 9);
382
-        },
383
-
384
-        newSession : function(newSess) {
385
-
386
-            var remoteUsr = newSess.remoteIdentity.uri.user;
387
-
388
-            if (remoteUsr.length < 6) {
389
-                var remoteUriUser = remoteUsr; 
390
-            } else { 
391
-                if (remoteUsr.slice(0,1) != "+") { 
392
-                    var remoteUriUser = "+"+ remoteUsr;
393
-                } else {
394
-                    var remoteUriUser = remoteUsr;
395
-                }
396
-            }
397
-            newSess.displayName = newSess.remoteIdentity.displayName || remoteUriUser;
398
-            newSess.ctxid = ctxSip.getUniqueID();
399
-
400
-            var status;
401
-
402
-            if (newSess.direction === 'incoming') {
403
-
404
-                status = "Incoming: "+ newSess.displayName;
405
-                ctxSip.startRingTone();
406
-                incomingCallNote();
407
-                changePageTitle();
408
-            } else {
409
-                status = "Trying: "+ newSess.displayName;
410
-                ctxSip.startRingbackTone();
411
-            }
412
-
413
-            ctxSip.logCall(newSess, 'ringing');
414
-
415
-            ctxSip.setCallSessionStatus(status);
416
-
417
-            // Event callbacks
418
-         
419
-	    newSess.on('trackAdded', function() {
420
-
421
-		var pc = newSess.sessionDescriptionHandler.peerConnection;
422
-
423
-		// Get remote audio track (local audio is set up via initial GUM)
424
-		var remoteStream = new MediaStream();
425
-
426
-		pc.getReceivers().forEach(function (receiver) {
427
-		    if (receiver.track && receiver.track.kind == "audio") {
428
-		       remoteStream.addTrack(receiver.track);
429
-		    } 
430
-		});
431
-		var remoteAudio = document.getElementById('outputAudio');
432
-		remoteAudio.srcObject = remoteStream;
433
-		remoteAudio.onloadedmetadata = function(e) {
434
-		    remoteAudio.play();
435
-		}
436
-                ctxSip.Sessions[newSess.ctxid].isMuted = false;
437
-	    });
438
-
439
-            newSess.on('progress',function(e) {
440
-                if (e.direction === 'outgoing') {
441
-                    ctxSip.setCallSessionStatus('Calling...');
442
-                }
443
-            });
444
-
445
-            newSess.on('connecting',function(e) {
446
-                if (e.direction === 'outgoing') {
447
-                    ctxSip.setCallSessionStatus('Connecting...');
448
-                }
449
-            });
450
-
451
-            newSess.on('accepted',function(e) {
452
-                if (ctxSip.callActiveID && ctxSip.callActiveID !== newSess.ctxid) {
453
-                    ctxSip.phoneHoldButtonPressed(ctxSip.callActiveID);
454
-                }
455
-
456
-                ctxSip.stopRingbackTone();
457
-                ctxSip.stopRingTone();
458
-                ctxSip.setCallSessionStatus('Answered');
459
-                ctxSip.logCall(newSess, 'answered');
460
-                ctxSip.callActiveID = newSess.ctxid;
461
-            });
462
-
463
-            newSess.on('hold', function(e) {
464
-                ctxSip.callActiveID = null;
465
-                ctxSip.logCall(newSess, 'holding');
466
-                ctxSip.setCallSessionStatus("Holding");
467
-            });
468
-
469
-            newSess.on('unhold', function(e) {
470
-                ctxSip.logCall(newSess, 'resumed');
471
-                ctxSip.callActiveID = newSess.ctxid;
472
-                ctxSip.setCallSessionStatus("Answered");
473
-            });
474
-
475
-            newSess.on('cancel', function(e) {
476
-                ctxSip.stopRingTone();
477
-                ctxSip.stopRingbackTone();
478
-                ctxSip.setCallSessionStatus("Canceled");
479
-                if (this.direction === 'outgoing') {
480
-                    ctxSip.callActiveID = null;
481
-                    newSess = null;
482
-                    ctxSip.logCall(this, 'ended');
483
-                }
484
-            });
485
-
486
-            newSess.on('bye', function(e) {
487
-                ctxSip.stopRingTone();
488
-                ctxSip.stopRingbackTone();
489
-                ctxSip.setCallSessionStatus("");
490
-                ctxSip.logCall(newSess, 'ended');
491
-                ctxSip.callActiveID = null;
492
-                newSess = null;
493
-            });
494
-
495
-            newSess.on('failed',function(e) {
496
-                ctxSip.stopRingTone();
497
-                ctxSip.stopRingbackTone();
498
-                ctxSip.setCallSessionStatus('Terminated');
499
-            });
500
-
501
-            newSess.on('rejected',function(e) {
502
-                ctxSip.stopRingTone();
503
-                ctxSip.stopRingbackTone();
504
-                ctxSip.setCallSessionStatus('Rejected');
505
-                ctxSip.callActiveID = null;
506
-                ctxSip.logCall(this, 'ended');
507
-                newSess = null;
508
-            });
509
-            
510
-            ctxSip.Sessions[newSess.ctxid] = newSess;
511
-
512
-            // Hide contacts list
513
-            $("#contactsTable").css("display", "none");
514
-            $("#ctctsUsrsLst").removeClass("contUsrsLstRed");
515
-            $("#ctctsUsrsLst").addClass("contUsrsLst");
516
-        },
517
-
518
-        // getUserMedia failed or device wasn't present
519
-        getUserMediaFailure : function(e) {
520
-            window.console.error('getUserMedia failed: ', e);
521
-            ctxSip.setError(true, 'Media Error.', 'You must allow access to your microphone. Check the address bar.', true);
522
-        },
523
-
524
-        getUserMediaSuccess : function(stream) {
525
-             ctxSip.Stream = stream;
526
-        },
527
-
528
-        /**
529
-         * Sets the UI call status field
530
-         *
531
-         * @param {string} status
532
-         */
533
-        setCallSessionStatus : function(status) {
534
-            $('#txtCallStatus').html(status);
535
-        },
536
-
537
-        /**
538
-         * Sets the UI connection status field
539
-         *
540
-         * @param {string} status
541
-         */
542
-        setStatus : function(status) {
543
-            $("#txtRegStatus").html('<i class="fa fa-signal"></i> '+ status);
544
-        },
545
-
546
-        /**
547
-         * Logs a call to localStorage
548
-         *
549
-         * @param  {object} session
550
-         * @param  {string} status Enum 'ringing', 'answered', 'ended', 'holding', 'resumed'
551
-         */
552
-        logCall : function(session, status) {
553
-
554
-            var log = {
555
-                    clid : session.displayName,
556
-                    uri : session.remoteIdentity.uri.toString(),
557
-                    id : session.ctxid,
558
-                    time : new Date().getTime()
559
-            };
560
-            var calllog = JSON.parse(localStorage.getItem('sipCalls'));
561
-
562
-            if (!calllog) { calllog = {}; }
563
-
564
-            if (!calllog.hasOwnProperty(session.ctxid)) {
565
-                calllog[log.id] = {
566
-                    id : log.id,
567
-                    clid : log.clid,
568
-                    uri : log.uri,
569
-                    start : log.time,
570
-                    flow : session.direction
571
-                };
572
-            }
573
-
574
-            if (status === 'answered') {
575
-                calllog[log.id].start = log.time;
576
-            }
577
-
578
-            if (status === 'ended') {
579
-                calllog[log.id].stop = log.time;
580
-            }
581
-
582
-            if (status === 'ended' && calllog[log.id].status === 'ringing') {
583
-                calllog[log.id].status = 'missed';
584
-            } else {
585
-                calllog[log.id].status = status;
586
-            }
587
-
588
-            localStorage.setItem('sipCalls', JSON.stringify(calllog));
589
-            ctxSip.logShow();
590
-        },
591
-
592
-        /**
593
-         * Adds a UI item to the call log
594
-         *
595
-         * @param  {object} item log item
596
-         */
597
-        logItem : function(item) {
598
-
599
-            var callActive = (item.status !== 'ended' && item.status !== 'missed');
600
-            var callLength = (item.status !== 'ended')? '<span id="'+ item.id +'"></span>' : formatDuration(moment.duration(item.stop - item.start));
601
-
602
-            var callClass = '';
603
-            var callIcon = '';
604
-            var callTitle = '';
605
-
606
-            switch (item.status) {
607
-                case 'ringing':
608
-                    callClass = 'list-group-item-success';
609
-                    callIcon = 'fa-bell';
610
-                    break;
611
-
612
-                case 'missed':
613
-                    callClass = 'list-group-item-danger';
614
-                    if (item.flow === "incoming") { callIcon = 'incomingCall'; callTitle = 'Incoming call'; }
615
-                    if (item.flow === "outgoing") { callIcon = 'outgoingCall'; callTitle = 'Outgoing call'; }
616
-                    break;
617
-
618
-                case 'holding':
619
-                    callClass = 'list-group-item-warning';
620
-                    callIcon = 'fa-pause';
621
-                    break;
622
-
623
-                case 'answered': ;
624
-                case 'resumed':
625
-                    callClass = 'list-group-item-info';
626
-                    callIcon = 'fa-phone-square';
627
-                    break;
628
-
629
-                case 'ended':
630
-                    if (item.flow === "incoming") { callIcon = 'incomingCall'; callTitle = 'Incoming call'; }
631
-                    if (item.flow === "outgoing") { callIcon = 'outgoingCall'; callTitle = 'Outgoing call'; }
632
-                    break;
633
-            }
634
-
635
-            var i = '<div class="list-group-item sip-logitem clearfix '+ callClass +'" data-sessionid="'+ item.id +'">';
636
-            i += '<div class="clearfix"><div class="pull-left">';
637
-            i += '<i class="fa fa-fw '+ callIcon +'" title="'+ callTitle +'"></i><div class="listPhNb" data-uri="'+ item.uri +'" title="Double click to call">'+ ctxSip.formatPhone(item.uri) +'</div><div class="callTimeMmt" title="Call time">'+ moment(item.start).format('YYYY/MM/DD HH:mm:ss') +'</div></div>';
638
-            i += '<div class="pull-right text-right" title="Target number/Caller"><em>'+ item.clid +'</em><div class="callDuration" title="Call duration">'+ callLength +'</div></div></div>';
639
-
640
-            if (callActive) {
641
-                i += '<div class="btn-group btn-group-xs pull-right">';
642
-                if (item.status === 'ringing' && item.flow === 'incoming') {
643
-                    i += '<button class="btn btn-xs btn-success btnCall" title="Call"><i class="fa fa-phone"></i></button>';
644
-                } else {
645
-                    i += '<button id="hold-'+ item.id +'" class="btn btn-xs btn-primary btnHoldResume" title="Hold"><i class="fa fa-pause"></i></button>';
646
-                    i += '<button class="btn btn-xs btn-info btnTransfer" title="Transfer"><i class="fa fa-random"></i></button>';
647
-                    i += '<button id="mute-'+ item.id +'" class="btn btn-xs btn-warning btnMute" title="Mute"><i class="fa fa-fw fa-microphone"></i></button>';
648
-                    i += '<button id="rec-'+ item.id +'" class="btn btn-xs btnRecord" title="Start recording"><i class="fa fa-fw fa-dot-circle-o"></i></button>';
649
-                }
650
-                i += '<button class="btn btn-xs btn-danger btnHangUp" title="Hangup"><i class="fa fa-stop"></i></button>';
651
-                i += '</div>';
652
-            }
653
-            i += '</div>';
654
-
655
-            $('#sip-logitems').append(i);
656
-
657
-            // Start call timer on answer
658
-            if (item.status === 'answered') {
659
-                var tEle = document.getElementById(item.id);
660
-                ctxSip.callTimers[item.id] = new Stopwatch(tEle);
661
-                ctxSip.callTimers[item.id].start();
662
-            }
663
-
664
-            if (callActive && item.status !== 'ringing') {
665
-                ctxSip.callTimers[item.id].start({ startTime : item.start });
666
-            }
667
-
668
-            $('#sip-logitems').scrollTop(0);
669
-        },
670
-
671
-        /**
672
-         * Updates the call log UI
673
-         */
674
-        logShow : function() {
675
-
676
-            var calllog = JSON.parse(localStorage.getItem('sipCalls'));
677
-            var x = [];
678
-
679
-            if (calllog !== null) {
680
-
681
-                $('#sip-splash').css("display", "none");
682
-                $('#sip-log').css("display", "block");
683
-
684
-                // Empty existing logs
685
-                $('#sip-logitems').empty();
686
-
687
-                // JS doesn't guarantee property order so, create an array with the start time as the key and sort by that
688
-
689
-                // Add start time to array
690
-                $.each(calllog, function(k,v) {
691
-                    x.push(v);
692
-                });
693
-
694
-                // Sort descending
695
-                x.sort(function(a, b) {
696
-                    return b.start - a.start;
697
-                });
698
-
699
-                $.each(x, function(k, v) {
700
-                    ctxSip.logItem(v);
701
-                });
702
-
703
-            } else {
704
-                $('#sip-splash').css("display", "block");
705
-                $('#sip-log').css("display", "none");
706
-            }
707
-
708
-            showContactsNmbrs();
709
-        },
710
-
711
-        /**
712
-         * Remove log items from localStorage and update the UI
713
-         */
714
-        logClear : function() {
715
-
716
-            localStorage.removeItem('sipCalls');
717
-            ctxSip.logShow();
718
-        },
719
-
720
-        sipCall : function(target) {
721
-
722
-            try {
723
-
724
-	        // Get the name of the SIP provider and send it to Asterisk, so that it knows what provider to use for outbound calls
725
-	        var callerNumber = $("#fromNumber").val();
726
-
727
-                if (callerNumber.indexOf(":") >= 0) {
728
-	            var shortProv = callerNumber.split(":");
729
-	            var sipProvider = shortProv[0].replace(" ", "");
730
-                    var callFromNumber = shortProv[1].replace(" ", "");
731
-                } else {
732
-	            var sipProvider = 'n/a';
733
-                    var callFromNumber = callerNumber;
734
-                }
735
-
736
-                var s = ctxSip.phone.invite(target, {
737
-                    media : {
738
-                        remote : {
739
-                            video : document.getElementById('outputVideo'),
740
-                            audio : document.getElementById('outputAudio')
741
-                        }
742
-                    },
743
-                    extraHeaders : [ 'X-SipProvider: '+ sipProvider , 'X-CallFromNumber: '+ callFromNumber ],
744
-                    sessionDescriptionHandlerOptions : {
745
-                        constraints : { audio : true, video : false },
746
-                        rtcConfiguration : { RTCConstraints : { "optional" : [{ 'DtlsSrtpKeyAgreement' : 'true'} ]}, stream : ctxSip.Stream }
747
-                       
748
-                    }
749
-                });
750
-                s.direction = 'outgoing';
751
-                ctxSip.newSession(s);
752
-
753
-                s.on('trackAdded', function() {
754
-
755
-			var pc = s.sessionDescriptionHandler.peerConnection;
756
-
757
-			// Get remote audio track (local audio is set up via initial GUM)
758
-			var remoteStream = new MediaStream();
759
-
760
-			pc.getReceivers().forEach(function (receiver) {
761
-			    if (receiver.track && receiver.track.kind == "audio") {
762
-			       remoteStream.addTrack(receiver.track);
763
-			    } 
764
-			});
765
-			var remoteAudio = document.getElementById('outputAudio');
766
-			remoteAudio.srcObject = remoteStream;
767
-			remoteAudio.onloadedmetadata = function(e) {
768
-			    remoteAudio.play();
769
-			}
770
-	        });
771
-
772
-            } catch(e) {
773
-                throw(e);
774
-            }
775
-        },
776
-
777
-        sipTransfer : function(sessionid) {
778
-
779
-            var s = ctxSip.Sessions[sessionid],
780
-            target = window.prompt('Enter destination number', '');
781
-            if (target) {
782
-                ctxSip.setCallSessionStatus('<i>Transfering the call...</i>');
783
-            }
784
-            s.refer(target);
785
-            showContactsNmbrs();
786
-        },
787
-
788
-        sipHangUp : function(sessionid) {
789
-
790
-            var s = ctxSip.Sessions[sessionid];
791
-
792
-            if (!s) {
793
-                return;
794
-            } else if (s.startTime) {
795
-                s.bye();
796
-            } else if (s.reject) {
797
-                s.reject();
798
-            } else if (s.cancel) {
799
-                s.cancel();
800
-            }
801
-
802
-            $("#numDisplay").val("");
803
-            showContactsNmbrs();
804
-        },
805
-
806
-        sipSendDTMF : function(digit) {
807
-
808
-            var a = ctxSip.callActiveID;
809
-            if (a) {
810
-                var s = ctxSip.Sessions[a];
811
-                s.dtmf(digit);
812
-            }
813
-        },
814
-
815
-        phoneCallButtonPressed : function(sessionid) {
816
-
817
-            var s = ctxSip.Sessions[sessionid],
818
-            target = $("#numDisplay").val();
819
-
820
-            if (!s) {
821
-
822
-                $("#numDisplay").val("");
823
-                ctxSip.sipCall(target);
824
-
825
-            } else if (s.accept && !s.startTime) {
826
-
827
-                s.accept({
828
-                    media : {
829
-                        remote : {
830
-                            video : document.getElementById('outputVideo'),
831
-                            audio : document.getElementById('outputAudio')
832
-                        }
833
-                    },
834
-                    sessionDescriptionHandlerOptions : {
835
-                        constraints : { audio : true, video : false },
836
-                        rtcConfiguration : { RTCConstraints : { "optional" : [{ 'DtlsSrtpKeyAgreement' : 'true'} ]}, stream : ctxSip.Stream }
837
-                       
838
-                    }
839
-                });
840
-            }
841
-
842
-            // Hide contacts list
843
-            $("#contactsTable").css("display", "none");
844
-            $("#ctctsUsrsLst").removeClass("contUsrsLstRed");
845
-            $("#ctctsUsrsLst").addClass("contUsrsLst");
846
-        },
847
-
848
-        // Record audio call
849
-        phoneRecordButtonPressed : function (recbtnid) {
850
-
851
-            var recBtn = document.getElementById(recbtnid);
852
-
853
-            if (mediaRecorder === null) {
854
-
855
-                var sessionid = recbtnid.replace("rec-", "");
856
-                var crtsess = ctxSip.Sessions[sessionid];
857
-                var pc = crtsess.sessionDescriptionHandler.peerConnection;
858
-                var audioTracks = [];
859
-
860
-		pc.getSenders().forEach(function (rtpSender) {
861
-		    if (rtpSender.track && rtpSender.track.kind == "audio") {
862
-			console.log("Adding sender audio track to record: ", rtpSender.track.label);
863
-                        audioTracks.push(rtpSender.track);
864
-		    }
865
-	        });
866
-
867
-		pc.getReceivers().forEach(function (rtpReceiver) {
868
-		    if (rtpReceiver.track && rtpReceiver.track.kind == "audio") {
869
-			console.log("Adding receiver audio track to record: ", rtpReceiver.track.label);
870
-                        audioTracks.push(rtpReceiver.track);
871
-		    }
872
-	        });
873
-
874
-                // Combine the audio tracks into one track
875
-	        const ac = new AudioContext();
876
-	        const sources = audioTracks.map(function(t) { return ac.createMediaStreamSource(new MediaStream([t])); });
877
-	        const dest = ac.createMediaStreamDestination();
878
-                sources.forEach(function(s) { s.connect(dest); });
879
-
880
-                var mediaStream = new MediaStream(dest.stream);
881
-	        mediaRecorder = new MediaRecorder(mediaStream);
882
-                var recordedChunks = [];
883
-
884
-                mediaRecorder.addEventListener("dataavailable", function (event) {
885
-                    recordedChunks.push(event.data);
886
-                });
887
-
888
-                mediaRecorder.addEventListener("stop", function() {
889
-
890
-		    const rawblob = new Blob(recordedChunks, { type: 'audio/webm' });
891
-		    let duration = recordedChunks.length * 200;
892
-
893
-		    // Add duration to the media blob, so that the final webm/ogx file becomes seekable
894
-		    ysFixWebmDuration(rawblob, duration, function(fixedBlob) {
895
-
896
-			let filename = window.prompt('Enter the name of the audio file:');
897
-			let downloadLink = document.createElement('a');
898
-			downloadLink.href = URL.createObjectURL(fixedBlob);
899
-			downloadLink.download = `${filename}.webm`;
900
-
901
-			document.body.appendChild(downloadLink);
902
-			downloadLink.click();
903
-			URL.revokeObjectURL(fixedBlob);
904
-			document.body.removeChild(downloadLink);
905
-
906
-		    });
907
-                });
908
-
909
-                confirmAlert("In some countries it is a legal requirement to warn the interlocutor before recording a conversation. Do you want to play a short audio warning at the beginning of the recording, to inform the interlocutor that (s)he will be recorded ?");
910
-
911
-	        $("#confirmOk").click(function() {
912
-
913
-                   // Start recording in chunks of 200 milliseconds
914
-                   mediaRecorder.start(200);
915
-
916
-                   // Warn the interlocutor about the recording
917
-                   ctxSip.recordingwarn.play();
918
-		   $("#alertMsgOverlay").remove();
919
-		   $("#alertConfMessage").remove();
920
-                });
921
-                $("#confirmCancel").click(function() {
922
-                   mediaRecorder.start(200);
923
-		   $("#alertMsgOverlay").remove();
924
-		   $("#alertConfMessage").remove();
925
-                });
926
-                recBtn.title = "Stop recording";
927
-                recBtn.classList.add("changeRecBtn");
928
-
929
-            } else {
930
-
931
-                recBtn.classList.remove("changeRecBtn");
932
-                recBtn.title = "Start recording";
933
-
934
-                // Stop recording
935
-                mediaRecorder.stop();
936
-                mediaRecorder = null;
937
-	    }
938
-        },
939
-
940
-	phoneMuteButtonPressed : function (sessionid) {
941
-
942
-            var sess = ctxSip.Sessions[sessionid];
943
-            var pc = sess.sessionDescriptionHandler.peerConnection;
944
-
945
-            if (sess.isMuted) {
946
-                sess.isMuted = false;
947
-		pc.getSenders().forEach(function(rtpSender) {
948
-                   if (rtpSender.track && rtpSender.track.kind == "audio") {
949
-                       rtpSender.track.enabled = true;
950
-                   }
951
-		});
952
-		$("#txtCallStatus").text("Answered");
953
-		$("#mute-"+ sessionid +"").prop("title", "Mute").css("background-color", "#f0ad4e");
954
-            } else {
955
-                sess.isMuted = true;
956
-		pc.getSenders().forEach(function(rtpSender) {
957
-                   if (rtpSender.track && rtpSender.track.kind == "audio") {
958
-                       rtpSender.track.enabled = false;
959
-                   }
960
-		});
961
-		$("#txtCallStatus").text("Muted");
962
-		$("#mute-"+ sessionid +"").prop("title", "Unmute").css("background-color", "#c47e1a");
963
-            }
964
-        },
965
-
966
-        phoneHoldButtonPressed : function(sessionid) {
967
-
968
-		var ses = ctxSip.Sessions[sessionid];
969
-		var direction = ses.sessionDescriptionHandler.getDirection();
970
-
971
-		if (direction === 'sendrecv') {
972
-			console.log('Call is on hold');
973
-			ses.hold();
974
-			ctxSip.logCall(ses, 'holding');
975
-			$("#txtCallStatus").text("Holding");
976
-			$("#hold-"+ sessionid +"").prop("title", "Unhold").css("background-color", "#20496c");
977
-
978
-		} else {
979
-			console.log('Call is not on hold');
980
-			ses.unhold();
981
-			ctxSip.logCall(ses, 'resumed');
982
-			$("#txtCallStatus").text("Answered");
983
-			$("#hold-"+ sessionid +"").prop("title", "Hold").css("background-color", "#337ab7");
984
-		}
985
-        },
986
-
987
-        setError : function(err, title, msg, closable) {
988
-
989
-            // Show modal if err === true
990
-            if (err === true) {
991
-                $("#mdlError p").html(msg);
992
-                $("#mdlError").modal('show');
993
-
994
-                if (closable) {
995
-                    var b = '<button type="button" class="close" data-dismiss="modal">&times;</button>';
996
-                    $("#mdlError .modal-header").find('button').remove();
997
-                    $("#mdlError .modal-header").prepend(b);
998
-                    $("#mdlError .modal-title").html(title);
999
-                    $("#mdlError").modal({ keyboard : true });
1000
-                } else {
1001
-                    $("#mdlError .modal-header").find('button').remove();
1002
-                    $("#mdlError .modal-title").html(title);
1003
-                    $("#mdlError").modal({ keyboard : false });
1004
-                }
1005
-            } else {
1006
-                $('#numDisplay').removeProp('disabled');
1007
-                $("#mdlError").modal('hide');
1008
-            }
1009
-        },
1010
-
1011
-        /**
1012
-         * Test for an audio call capable browser and return an error on failure
1013
-         */
1014
-        hasWebRTC : function() {
1015
-
1016
-            if (navigator.mediaDevices.getUserMedia) {
1017
-                return true;
1018
-            } else if (navigator.webkitGetUserMedia) {
1019
-                return true;
1020
-            } else if (navigator.mozGetUserMedia) {
1021
-                return true;
1022
-            } else {
1023
-                ctxSip.setError(true, 'Unsupported Browser.', 'Your browser does not support the features required for this phone.');
1024
-                window.console.error("WebRTC support not found");
1025
-                return false;
1026
-            }
1027
-        }
1028
-    };
1029
-
1030
-    ctxSip.hasWebRTC();
1031
-
1032
-    ctxSip.phone = new SIP.UA(ctxSip.config);
1033
-
1034
-    ctxSip.phone.on('connected', function(e) {
1035
-        ctxSip.setStatus("Connected");
1036
-        ctxSip.setError(false);
1037
-        userSIPToken = '';
1038
-    });
1039
-
1040
-    ctxSip.phone.on('disconnected', function(e) {
1041
-        ctxSip.setStatus("Disconnected");
1042
-
1043
-        // Disable phone
1044
-        ctxSip.setError(true, 'Websocket Disconnected.', 'An Error occurred connecting to the websocket.');
1045
-
1046
-        userSIPToken = '';
1047
-    });
1048
-
1049
-    ctxSip.phone.on('registered', function(e) {
1050
-
1051
-        navigator.mediaDevices.getUserMedia({ audio : true, video : false }).then(function(stream) {
1052
-		ctxSip.setError(false);
1053
-		var closeEditorWarning = function() {
1054
-		    return 'If you close this window, you will not be able to make or receive calls from your browser.';
1055
-		};
1056
-
1057
-		var closePhone = function() {
1058
-		    // Stop the phone on unload
1059
-		    localStorage.removeItem('ctxPhone');
1060
-		    ctxSip.phone.stop();
1061
-		};
1062
-
1063
-		window.onbeforeunload = closeEditorWarning;
1064
-		window.onunload = closePhone;
1065
-
1066
-		// This key is set to prevent multiple windows
1067
-		localStorage.setItem('ctxPhone', 'true');
1068
-
1069
-		$("#mldError").modal('hide');
1070
-		ctxSip.setStatus("Ready");
1071
-        });
1072
-
1073
-        userSIPToken = '';
1074
-    });
1075
-
1076
-    ctxSip.phone.on('registrationFailed', function(e) {
1077
-        console.log(e)
1078
-        ctxSip.setError(true, 'Registration Error.', 'An Error occurred registering your phone. Check your settings.');
1079
-        ctxSip.setStatus("Error: Registration Failed");
1080
-        userSIPToken = '';
1081
-    });
1082
-
1083
-    ctxSip.phone.on('unregistered', function(e) {
1084
-        ctxSip.setError(true, 'Registration Error.', 'An Error occurred registering your phone. Please wait while we try to connect it again.');
1085
-        ctxSip.setStatus("Error: Registration Failed");
1086
-        userSIPToken = '';
1087
-    });
1088
-
1089
-    ctxSip.phone.on('invite', function (incomingSession) {
1090
-        var s = incomingSession;
1091
-        s.direction = 'incoming';
1092
-        ctxSip.newSession(s);
1093
-        showContactsNmbrs();
1094
-    });
1095
-
1096
-    $('#numDisplay').keypress(function(e) {
1097
-        // If 'Enter' is pressed, dial
1098
-        if (e.which === 13) {
1099
-            ctxSip.phoneCallButtonPressed();
1100
-        }
1101
-    });
1102
-
1103
-    $('#phoneIcon').click(function(event) {
1104
-        // If 'Enter' is pressed, dial
1105
-        event.preventDefault();
1106
-        ctxSip.phoneCallButtonPressed();
1107
-    });
1108
-
1109
-    $(".digit").click(function(event) {
1110
-
1111
-       if (event.shiftKey) {
1112
-
1113
-           clck++;
1114
-           event.preventDefault();
1115
-           var num = $('#numDisplay').val();
1116
-           var dig;
1117
-           var diginit = $(this).data('digit').toString().split(',');
1118
-           var elct = diginit.length;
1119
-
1120
-           dig = diginit[clck%elct];
1121
-           var numsec = num.slice(0,-1);
1122
-           $('#numDisplay').val(numsec+dig);
1123
-           ctxSip.sipSendDTMF(dig);
1124
-
1125
-       } else {
1126
-           event.preventDefault();
1127
-           var num = $('#numDisplay').val();
1128
-           var dig;
1129
-           var diginit = $(this).data('digit').toString().split(',');
1130
-
1131
-           dig = diginit[0];
1132
-           clck = 0;
1133
-           $('#numDisplay').val(num+dig);
1134
-           ctxSip.sipSendDTMF(dig);
1135
-       }
1136
-
1137
-       $("#deleteInput").css("display", "block");
1138
-       return false;
1139
-    });
1140
-
1141
-    // Show the backspace icon
1142
-    $("#numDisplay").on("focus", function() { $("#deleteInput").css("display", "block"); });
1143
-
1144
-    $("#deleteInput").click(function() {
1145
-       var entNmbr = $('#numDisplay').val().slice(0, -1);
1146
-       $('#numDisplay').val(entNmbr);
1147
-    });
1148
-
1149
-    // Hide the backspace icon
1150
-    $("#sip-splash,#sip-log,#selectFromNmbr,#contactsTable").click(function() { $("#deleteInput").css("display", "none"); });
1151
-
1152
-    // Change keypad title
1153
-    $("#dropDownButton").click(function() {
1154
-       $("#deleteInput").css("display", "none");
1155
-       if ($("#sip-dialpad").is(":visible")) { $("#dropDownButton").prop("title", "Show keypad"); } else { $("#dropDownButton").prop("title", "Hide keypad"); }
1156
-    });
1157
-    $("#sip-dialpad").click(function() { $("#dropDownButton").prop("title", "Show keypad"); });
1158
-
1159
-    $('#phoneUI .dropdown-menu').click(function(e) {
1160
-        e.preventDefault();
1161
-    });
1162
-
1163
-    $('#phoneUI').delegate('.btnCall', 'click', function(event) {
1164
-        ctxSip.phoneCallButtonPressed();
1165
-        // Close the dropdown
1166
-        return true;
1167
-    });
1168
-
1169
-    $('.sipLogClear').click(function(event) {
1170
-        event.preventDefault();
1171
-        ctxSip.logClear();
1172
-        showContactsNmbrs();
1173
-    });
1174
-
1175
-    $('#sip-logitems').delegate('.sip-logitem .btnCall', 'click', function(event) {
1176
-        var sessionid = $(this).closest('.sip-logitem').data('sessionid');
1177
-        ctxSip.phoneCallButtonPressed(sessionid);
1178
-        return false;
1179
-    });
1180
-
1181
-    $('#sip-logitems').delegate('.sip-logitem .btnHoldResume', 'click', function(event) {
1182
-        var sessionid = $(this).closest('.sip-logitem').data('sessionid');
1183
-        ctxSip.phoneHoldButtonPressed(sessionid);
1184
-        return false;
1185
-    });
1186
-
1187
-    $('#sip-logitems').delegate('.sip-logitem .btnHangUp', 'click', function(event) {
1188
-        var sessionid = $(this).closest('.sip-logitem').data('sessionid');
1189
-        ctxSip.sipHangUp(sessionid);
1190
-        return false;
1191
-    });
1192
-
1193
-    $('#sip-logitems').delegate('.sip-logitem .btnTransfer', 'click', function(event) {
1194
-        var sessionid = $(this).closest('.sip-logitem').data('sessionid');
1195
-        ctxSip.sipTransfer(sessionid);
1196
-        return false;
1197
-    });
1198
-
1199
-    $('#sip-logitems').delegate('.sip-logitem .btnMute', 'click', function(event) {
1200
-        var sessionid = $(this).closest('.sip-logitem').data('sessionid');
1201
-        ctxSip.phoneMuteButtonPressed(sessionid);
1202
-        return false;
1203
-    });
1204
-
1205
-    $('#sip-logitems').delegate('.sip-logitem .btnRecord', 'click', function(event) {
1206
-        ctxSip.phoneRecordButtonPressed(this.id);
1207
-        return false;
1208
-    });
1209
-
1210
-    $('#sip-logitems').delegate('.listPhNb', 'dblclick', function(event) {
1211
-        event.preventDefault();
1212
-
1213
-        var uricalled = $(this).data('uri');
1214
-        var uriproc = uricalled.split(":");
1215
-        var uripronb = uriproc[1].split("@");
1216
-        var uri = uripronb[0];
1217
-        $('#numDisplay').val(uri);
1218
-        ctxSip.phoneCallButtonPressed();
1219
-    });
1220
-
1221
-    $('#sldVolume').on('change', function() {
1222
-
1223
-            var v = $(this).val() / 100,
1224
-            btn = $('#btnVol'),
1225
-            icon = $('#btnVol').find('i'),
1226
-            active = ctxSip.callActiveID;
1227
-
1228
-        // Set the object and media stream volumes
1229
-        if (ctxSip.Sessions[active]) {
1230
-            ctxSip.Sessions[active].player.volume = v;
1231
-            ctxSip.callVolume = v;
1232
-        }
1233
-
1234
-        // Set the others
1235
-        $('audio').each(function() {
1236
-            $(this).get()[0].volume = v;
1237
-        });
1238
-
1239
-        if (v < 0.1) {
1240
-            btn.removeClass(function (index, css) {
1241
-                   return (css.match (/(^|\s)btn\S+/g) || []).join(' ');
1242
-                })
1243
-                .addClass('btn btn-sm btn-danger');
1244
-            icon.removeClass().addClass('fa fa-fw fa-volume-off');
1245
-        } else if (v < 0.8) {
1246
-            btn.removeClass(function (index, css) {
1247
-                   return (css.match (/(^|\s)btn\S+/g) || []).join(' ');
1248
-               }).addClass('btn btn-sm btn-info');
1249
-            icon.removeClass().addClass('fa fa-fw fa-volume-down');
1250
-        } else {
1251
-            btn.removeClass(function (index, css) {
1252
-                   return (css.match (/(^|\s)btn\S+/g) || []).join(' ');
1253
-               }).addClass('btn btn-sm btn-primary');
1254
-            icon.removeClass().addClass('fa fa-fw fa-volume-up');
1255
-        }
1256
-        return false;
1257
-    });
1258
-
1259
-    // Hide the splash and show the call log after 1 second
1260
-    setTimeout(function() {
1261
-        ctxSip.logShow();
1262
-    }, 1000);
1263
-
1264
-
1265
-    /**
1266
-     * Stopwatch object used for call timers
1267
-     *
1268
-     * @param {dom element} elem
1269
-     * @param {[object]} options
1270
-     */
1271
-    var Stopwatch = function(elem, options) {
1272
-
1273
-        // Private functions
1274
-        function createTimer() {
1275
-            return document.createElement("span");
1276
-        }
1277
-
1278
-        var timer = createTimer(),
1279
-            offset,
1280
-            clock,
1281
-            interval;
1282
-
1283
-        // Default options
1284
-        options = options || {};
1285
-        options.delay = options.delay || 1000;
1286
-        options.startTime = options.startTime || Date.now();
1287
-
1288
-        // Append elements
1289
-        elem.appendChild(timer);
1290
-
1291
-        function start() {
1292
-            if (!interval) {
1293
-                offset = options.startTime;
1294
-                interval = setInterval(update, options.delay);
1295
-            }
1296
-        }
1297
-
1298
-        function stop() {
1299
-            if (interval) {
1300
-                clearInterval(interval);
1301
-                interval = null;
1302
-            }
1303
-        }
1304
-
1305
-        function reset() {
1306
-            clock = 0;
1307
-            render();
1308
-        }
1309
-
1310
-        function update() {
1311
-            clock += delta();
1312
-            render();
1313
-        }
1314
-
1315
-        function render() {
1316
-            timer.innerHTML = moment(clock).format('mm:ss');
1317
-        }
1318
-
1319
-        function delta() {
1320
-            var now = Date.now();
1321
-            var d = now - offset;
1322
-
1323
-            offset = now;
1324
-            return d;
1325
-        }
1326
-
1327
-        // Initialize
1328
-        reset();
1329
-
1330
-        // Public API
1331
-        this.start = start;
1332
-        this.stop  = stop;
1333
-    };
1334
-
1335
-
1336
-    function confirmAlert(alertText) {
1337
-
1338
-        $("#alertMsgOverlay").remove();
1339
-        $("#alertConfMessage").remove();
1340
-
1341
-        let alertwndcf = "<div id='alertConfMessage'>";
1342
-        alertwndcf += "<a id='closeAlertWndcf' title='Close this window'></a>";
1343
-        alertwndcf += "<div id='alertTextWrap'>"+ alertText +"</div>";
1344
-        alertwndcf += "<div id='cancelOkWrap'><input type='submit' id='confirmCancel' value='Record without warning'>";
1345
-        alertwndcf += "<input type='submit' id='confirmOk' value='Record with warning'></div>";
1346
-        alertwndcf += "</div>";
1347
-
1348
-        $("#flContainer").append("<div id='alertMsgOverlay'></div>");
1349
-        $("#flContainer").append(alertwndcf);
1350
-
1351
-        let topDist = parseInt((window.innerHeight / 2).toFixed(2) - 152) +"px";
1352
-        let leftDist = parseInt((window.innerWidth / 2).toFixed(2) - 150) +"px";
1353
-        $("#alertConfMessage").css({ "top" : topDist, "left" : leftDist });
1354
-
1355
-        $("#closeAlertWndcf").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
1356
-        $("#alertMsgOverlay").click(function() { $("#alertMsgOverlay").remove(); $("#alertConfMessage").remove(); });
1357
-    }
1358
-
1359
-    $(window).on('beforeunload', function() {
1360
-        localStorage.removeItem('SIPCreds');
1361
-        localStorage.removeItem('NCContacts');
1362
-    });
1363
-});