summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAzul <azul@leap.se>2012-07-20 10:56:36 +0200
committerAzul <azul@leap.se>2012-07-20 10:56:36 +0200
commit50de80c5e817476ac95a096c718a66f5555fcd05 (patch)
treee05a25868a999557e2788a91f41da3a5a8a1a0b0
parent07fe2d8976db0ec267bd57ded90778f0d7695478 (diff)
INCOMPATIBLE: major restructuring of the repository
* removed Django code - we're keeping the tests - so I hope the two can still be used together * removed js packer - everyone has their own packaging strategy these days * cleaned up the repository - we only have js so javascript directory does not make much sense
-rw-r--r--Readme.md5
-rw-r--r--django/srpproject/__init__.py0
-rw-r--r--django/srpproject/manage.py11
-rw-r--r--django/srpproject/settings.py86
-rw-r--r--django/srpproject/srp/__init__.py0
-rw-r--r--django/srpproject/srp/aes.py655
-rw-r--r--django/srpproject/srp/backends.py21
-rw-r--r--django/srpproject/srp/models.py11
-rw-r--r--django/srpproject/srp/util.py67
-rw-r--r--django/srpproject/srp/views.py230
-rw-r--r--django/srpproject/templates/aes.html69
-rw-r--r--django/srpproject/templates/login.html10
-rw-r--r--django/srpproject/templates/register.html46
-rw-r--r--django/srpproject/urls.py29
-rw-r--r--javascript/crypto.min.js1
-rw-r--r--javascript/jsPacker/Pack.pm467
-rw-r--r--javascript/jsPacker/ParseMaster.pm207
-rw-r--r--javascript/jsPacker/build-pack-crypto.sh4
-rw-r--r--javascript/jsPacker/build-pack-register.sh2
-rw-r--r--javascript/jsPacker/build-pack.sh4
-rw-r--r--javascript/jsPacker/crypto.min.js1
-rw-r--r--javascript/jsPacker/hash.min.js1
-rw-r--r--javascript/jsPacker/jsPacker.pl163
-rw-r--r--javascript/jsPacker/srp.min.js1
-rw-r--r--javascript/jsPacker/srp_register.min.js1
-rw-r--r--javascript/srp.min.js1
-rw-r--r--javascript/srp_register.min.js1
-rw-r--r--spec/DjangoSpecRunner.html (renamed from javascript/spec/DjangoSpecRunner.html)14
-rw-r--r--spec/lib/jasmine-sinon.js (renamed from javascript/spec/lib/jasmine-sinon.js)0
-rw-r--r--spec/lib/jasmine/MIT.LICENSE (renamed from javascript/spec/lib/jasmine/MIT.LICENSE)0
-rw-r--r--spec/lib/jasmine/jasmine-html.js (renamed from javascript/spec/lib/jasmine/jasmine-html.js)0
-rw-r--r--spec/lib/jasmine/jasmine.css (renamed from javascript/spec/lib/jasmine/jasmine.css)0
-rw-r--r--spec/lib/jasmine/jasmine.js (renamed from javascript/spec/lib/jasmine/jasmine.js)0
-rw-r--r--spec/lib/jasmine/jasmine_favicon.png (renamed from javascript/spec/lib/jasmine/jasmine_favicon.png)bin905 -> 905 bytes
-rw-r--r--spec/lib/sinon/sinon-1.3.4.js (renamed from javascript/spec/lib/sinon/sinon-1.3.4.js)0
-rw-r--r--spec/login.js (renamed from javascript/spec/login.js)2
-rw-r--r--spec/signup.js (renamed from javascript/spec/signup.js)0
-rw-r--r--spec/specHelper.js (renamed from javascript/spec/specHelper.js)0
-rw-r--r--src/MD5.js (renamed from javascript/MD5.js)0
-rw-r--r--src/SHA1.js (renamed from javascript/SHA1.js)0
-rw-r--r--src/SHA256.js (renamed from javascript/SHA256.js)0
-rw-r--r--src/aes.js (renamed from javascript/aes.js)0
-rw-r--r--src/cryptoHelpers.js (renamed from javascript/cryptoHelpers.js)0
-rw-r--r--src/jsbn.js (renamed from javascript/jsbn.js)0
-rw-r--r--src/jsbn2.js (renamed from javascript/jsbn2.js)0
-rw-r--r--src/prng4.js (renamed from javascript/prng4.js)0
-rw-r--r--src/rng.js (renamed from javascript/rng.js)0
-rw-r--r--src/srp.js (renamed from javascript/srp.js)24
-rw-r--r--src/srp_register.js (renamed from javascript/srp_register.js)4
49 files changed, 21 insertions, 2117 deletions
diff --git a/Readme.md b/Readme.md
index 0d412a0..bc80cd7 100644
--- a/Readme.md
+++ b/Readme.md
@@ -2,6 +2,7 @@ imported to github from: https://code.google.com/p/srp-js/
License: [New BSD License](http://www.opensource.org/licenses/bsd-license.php)
+
Many websites today require some form of authentication to access the site's full functionality. Unfortunately, many of these websites do not use secure authentication protocols.
In some cases, websites will store user passwords in their database. If the database ever becomes compromised, an attacker could authenticate as any user he wanted.
@@ -14,4 +15,6 @@ The Secure Remote Password protocol addresses this problem. First presented by T
This project aims to provide a strong javascript implementation of SRP that will provide some peace of mind when using websites that do not use HTTPS. Due to the nature of HTTP, it is not invulnerable to man-in-the-middle attacks, but it should provide strong security against passive eavesdroppers, which are increasingly common in the age of wireless internet.
-To accompany the Javascript implementation of the client, I plan to create server side implementations in Django, PHP, and ASP.NET. Currently, only the Django implementation has begun.
+To accompany the Javascript implementation of the client, the [original repository](https://code.google.com/p/srp-js/) had a django server.
+
+[ruby-srp](https://github.com/leapcode/ruby-srp) contains client and server implementations in ruby that work with srp-js. It also ships an example using srp-js as the client.
diff --git a/django/srpproject/__init__.py b/django/srpproject/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/django/srpproject/__init__.py
+++ /dev/null
diff --git a/django/srpproject/manage.py b/django/srpproject/manage.py
deleted file mode 100644
index 5e78ea9..0000000
--- a/django/srpproject/manage.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env python
-from django.core.management import execute_manager
-try:
- import settings # Assumed to be in the same directory.
-except ImportError:
- import sys
- sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
- sys.exit(1)
-
-if __name__ == "__main__":
- execute_manager(settings)
diff --git a/django/srpproject/settings.py b/django/srpproject/settings.py
deleted file mode 100644
index 5f6f642..0000000
--- a/django/srpproject/settings.py
+++ /dev/null
@@ -1,86 +0,0 @@
-# Django settings for srpproject project.
-
-DEBUG = True
-TEMPLATE_DEBUG = DEBUG
-
-ADMINS = (
- # ('Your Name', 'your_email@domain.com'),
-)
-
-MANAGERS = ADMINS
-
-DATABASE_ENGINE = 'mysql' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
-DATABASE_NAME = 'srp' # Or path to database file if using sqlite3.
-DATABASE_USER = 'USER' # Not used with sqlite3.
-DATABASE_PASSWORD = 'SECRET_PASSWORD' # Not used with sqlite3.
-DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3.
-DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3.
-
-# Local time zone for this installation. Choices can be found here:
-# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
-# although not all choices may be available on all operating systems.
-# If running in a Windows environment this must be set to the same as your
-# system time zone.
-TIME_ZONE = 'America/Chicago'
-
-# Language code for this installation. All choices can be found here:
-# http://www.i18nguy.com/unicode/language-identifiers.html
-LANGUAGE_CODE = 'en-us'
-
-SITE_ID = 1
-
-# If you set this to False, Django will make some optimizations so as not
-# to load the internationalization machinery.
-USE_I18N = True
-
-# Absolute path to the directory that holds media.
-# Example: "/home/media/media.lawrence.com/"
-MEDIA_ROOT = ''
-
-# URL that handles the media served from MEDIA_ROOT. Make sure to use a
-# trailing slash if there is a path component (optional in other cases).
-# Examples: "http://media.lawrence.com", "http://example.com/media/"
-MEDIA_URL = ''
-
-# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
-# trailing slash.
-# Examples: "http://foo.com/media/", "/media/".
-ADMIN_MEDIA_PREFIX = '/media/'
-
-# Make this unique, and don't share it with anybody.
-SECRET_KEY = 'zr3&lo)n@c%i^2*f3qlax#oembv@yl0%_d@p&gs1w^edqosy^+'
-
-# List of callables that know how to import templates from various sources.
-TEMPLATE_LOADERS = (
- 'django.template.loaders.filesystem.load_template_source',
- 'django.template.loaders.app_directories.load_template_source',
-# 'django.template.loaders.eggs.load_template_source',
-)
-
-MIDDLEWARE_CLASSES = (
- 'django.middleware.common.CommonMiddleware',
- 'django.contrib.sessions.middleware.SessionMiddleware',
- 'django.contrib.auth.middleware.AuthenticationMiddleware',
-)
-
-ROOT_URLCONF = 'srpproject.urls'
-
-AUTHENTICATION_BACKENDS = (
- 'srp.backends.SRPBackend',
- 'django.contrib.auth.backends.ModelBackend',
-)
-
-TEMPLATE_DIRS = (
- # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
- # Always use forward slashes, even on Windows.
- # Don't forget to use absolute paths, not relative paths.
- "/home/austin/Projects/SRP-SVN/srp-js/django/srpproject/templates"
-)
-
-INSTALLED_APPS = (
- 'django.contrib.auth',
- 'django.contrib.contenttypes',
- 'django.contrib.sessions',
- 'django.contrib.sites',
- 'srpproject.srp'
-)
diff --git a/django/srpproject/srp/__init__.py b/django/srpproject/srp/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/django/srpproject/srp/__init__.py
+++ /dev/null
diff --git a/django/srpproject/srp/aes.py b/django/srpproject/srp/aes.py
deleted file mode 100644
index 4c27d41..0000000
--- a/django/srpproject/srp/aes.py
+++ /dev/null
@@ -1,655 +0,0 @@
-#!/usr/bin/python
-#
-# aes.py: implements AES - Advanced Encryption Standard
-# from the SlowAES project, http://code.google.com/p/slowaes/
-#
-# Copyright (c) 2008 Josh Davis ( http://www.josh-davis.org ),
-# Alex Martelli ( http://www.aleax.it )
-#
-# Ported from C code written by Laurent Haan ( http://www.progressive-coding.com )
-#
-# Licensed under the Apache License, Version 2.0
-# http://www.apache.org/licenses/
-#
-import os
-import sys
-import math
-
-def append_PKCS7_padding(s):
- """return s padded to a multiple of 16-bytes by PKCS7 padding"""
- numpads = 16 - (len(s)%16)
- return s + numpads*chr(numpads)
-
-def strip_PKCS7_padding(s):
- """return s stripped of PKCS7 padding"""
- if len(s)%16 or not s:
- raise ValueError("String of len %d can't be PCKS7-padded" % len(s))
- numpads = ord(s[-1])
- if numpads > 16:
- raise ValueError("String ending with %r can't be PCKS7-padded" % s[-1])
- return s[:-numpads]
-
-class AES(object):
- # valid key sizes
- keySize = dict(SIZE_128=16, SIZE_192=24, SIZE_256=32)
-
- # Rijndael S-box
- sbox = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67,
- 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59,
- 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7,
- 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1,
- 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05,
- 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83,
- 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29,
- 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
- 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa,
- 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c,
- 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc,
- 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
- 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19,
- 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee,
- 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49,
- 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
- 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4,
- 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6,
- 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70,
- 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9,
- 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e,
- 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1,
- 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0,
- 0x54, 0xbb, 0x16]
-
- # Rijndael Inverted S-box
- rsbox = [0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3,
- 0x9e, 0x81, 0xf3, 0xd7, 0xfb , 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f,
- 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb , 0x54,
- 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b,
- 0x42, 0xfa, 0xc3, 0x4e , 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24,
- 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25 , 0x72, 0xf8,
- 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d,
- 0x65, 0xb6, 0x92 , 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,
- 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84 , 0x90, 0xd8, 0xab,
- 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3,
- 0x45, 0x06 , 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1,
- 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b , 0x3a, 0x91, 0x11, 0x41,
- 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6,
- 0x73 , 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9,
- 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e , 0x47, 0xf1, 0x1a, 0x71, 0x1d,
- 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b ,
- 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0,
- 0xfe, 0x78, 0xcd, 0x5a, 0xf4 , 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07,
- 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f , 0x60,
- 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f,
- 0x93, 0xc9, 0x9c, 0xef , 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5,
- 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61 , 0x17, 0x2b,
- 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55,
- 0x21, 0x0c, 0x7d]
-
- def getSBoxValue(self,num):
- """Retrieves a given S-Box Value"""
- return self.sbox[num]
-
- def getSBoxInvert(self,num):
- """Retrieves a given Inverted S-Box Value"""
- return self.rsbox[num]
-
- def rotate(self, word):
- """ Rijndael's key schedule rotate operation.
-
- Rotate a word eight bits to the left: eg, rotate(1d2c3a4f) == 2c3a4f1d
- Word is an char list of size 4 (32 bits overall).
- """
- return word[1:] + word[:1]
-
- # Rijndael Rcon
- Rcon = [0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36,
- 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97,
- 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
- 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66,
- 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04,
- 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
- 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3,
- 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61,
- 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
- 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40,
- 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc,
- 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
- 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a,
- 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d,
- 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
- 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35,
- 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4,
- 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
- 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08,
- 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
- 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
- 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2,
- 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74,
- 0xe8, 0xcb ]
-
- def getRconValue(self, num):
- """Retrieves a given Rcon Value"""
- return self.Rcon[num]
-
- def core(self, word, iteration):
- """Key schedule core."""
- # rotate the 32-bit word 8 bits to the left
- word = self.rotate(word)
- # apply S-Box substitution on all 4 parts of the 32-bit word
- for i in range(4):
- word[i] = self.getSBoxValue(word[i])
- # XOR the output of the rcon operation with i to the first part
- # (leftmost) only
- word[0] = word[0] ^ self.getRconValue(iteration)
- return word
-
- def expandKey(self, key, size, expandedKeySize):
- """Rijndael's key expansion.
-
- Expands an 128,192,256 key into an 176,208,240 bytes key
-
- expandedKey is a char list of large enough size,
- key is the non-expanded key.
- """
- # current expanded keySize, in bytes
- currentSize = 0
- rconIteration = 1
- expandedKey = [0] * expandedKeySize
-
- # set the 16, 24, 32 bytes of the expanded key to the input key
- for j in range(size):
- expandedKey[j] = key[j]
- currentSize += size
-
- while currentSize < expandedKeySize:
- # assign the previous 4 bytes to the temporary value t
- t = expandedKey[currentSize-4:currentSize]
-
- # every 16,24,32 bytes we apply the core schedule to t
- # and increment rconIteration afterwards
- if currentSize % size == 0:
- t = self.core(t, rconIteration)
- rconIteration += 1
- # For 256-bit keys, we add an extra sbox to the calculation
- if size == self.keySize["SIZE_256"] and ((currentSize % size) == 16):
- for l in range(4): t[l] = self.getSBoxValue(t[l])
-
- # We XOR t with the four-byte block 16,24,32 bytes before the new
- # expanded key. This becomes the next four bytes in the expanded
- # key.
- for m in range(4):
- expandedKey[currentSize] = expandedKey[currentSize - size] ^ \
- t[m]
- currentSize += 1
-
- return expandedKey
-
- def addRoundKey(self, state, roundKey):
- """Adds (XORs) the round key to the state."""
- for i in range(16):
- state[i] ^= roundKey[i]
- return state
-
- def createRoundKey(self, expandedKey, roundKeyPointer):
- """Create a round key.
- Creates a round key from the given expanded key and the
- position within the expanded key.
- """
- roundKey = [0] * 16
- for i in range(4):
- for j in range(4):
- roundKey[j*4+i] = expandedKey[roundKeyPointer + i*4 + j]
- return roundKey
-
- def galois_multiplication(self, a, b):
- """Galois multiplication of 8 bit characters a and b."""
- p = 0
- for counter in range(8):
- if b & 1: p ^= a
- hi_bit_set = a & 0x80
- a <<= 1
- # keep a 8 bit
- a &= 0xFF
- if hi_bit_set:
- a ^= 0x1b
- b >>= 1
- return p
-
- #
- # substitute all the values from the state with the value in the SBox
- # using the state value as index for the SBox
- #
- def subBytes(self, state, isInv):
- if isInv: getter = self.getSBoxInvert
- else: getter = self.getSBoxValue
- for i in range(16): state[i] = getter(state[i])
- return state
-
- # iterate over the 4 rows and call shiftRow() with that row
- def shiftRows(self, state, isInv):
- for i in range(4):
- state = self.shiftRow(state, i*4, i, isInv)
- return state
-
- # each iteration shifts the row to the left by 1
- def shiftRow(self, state, statePointer, nbr, isInv):
- for i in range(nbr):
- if isInv:
- state[statePointer:statePointer+4] = \
- state[statePointer+3:statePointer+4] + \
- state[statePointer:statePointer+3]
- else:
- state[statePointer:statePointer+4] = \
- state[statePointer+1:statePointer+4] + \
- state[statePointer:statePointer+1]
- return state
-
- # galois multiplication of the 4x4 matrix
- def mixColumns(self, state, isInv):
- # iterate over the 4 columns
- for i in range(4):
- # construct one column by slicing over the 4 rows
- column = state[i:i+16:4]
- # apply the mixColumn on one column
- column = self.mixColumn(column, isInv)
- # put the values back into the state
- state[i:i+16:4] = column
-
- return state
-
- # galois multiplication of 1 column of the 4x4 matrix
- def mixColumn(self, column, isInv):
- if isInv: mult = [14, 9, 13, 11]
- else: mult = [2, 1, 1, 3]
- cpy = list(column)
- g = self.galois_multiplication
-
- column[0] = g(cpy[0], mult[0]) ^ g(cpy[3], mult[1]) ^ \
- g(cpy[2], mult[2]) ^ g(cpy[1], mult[3])
- column[1] = g(cpy[1], mult[0]) ^ g(cpy[0], mult[1]) ^ \
- g(cpy[3], mult[2]) ^ g(cpy[2], mult[3])
- column[2] = g(cpy[2], mult[0]) ^ g(cpy[1], mult[1]) ^ \
- g(cpy[0], mult[2]) ^ g(cpy[3], mult[3])
- column[3] = g(cpy[3], mult[0]) ^ g(cpy[2], mult[1]) ^ \
- g(cpy[1], mult[2]) ^ g(cpy[0], mult[3])
- return column
-
- # applies the 4 operations of the forward round in sequence
- def aes_round(self, state, roundKey):
- state = self.subBytes(state, False)
- state = self.shiftRows(state, False)
- state = self.mixColumns(state, False)
- state = self.addRoundKey(state, roundKey)
- return state
-
- # applies the 4 operations of the inverse round in sequence
- def aes_invRound(self, state, roundKey):
- state = self.shiftRows(state, True)
- state = self.subBytes(state, True)
- state = self.addRoundKey(state, roundKey)
- state = self.mixColumns(state, True)
- return state
-
- # Perform the initial operations, the standard round, and the final
- # operations of the forward aes, creating a round key for each round
- def aes_main(self, state, expandedKey, nbrRounds):
- state = self.addRoundKey(state, self.createRoundKey(expandedKey, 0))
- i = 1
- while i < nbrRounds:
- state = self.aes_round(state,
- self.createRoundKey(expandedKey, 16*i))
- i += 1
- state = self.subBytes(state, False)
- state = self.shiftRows(state, False)
- state = self.addRoundKey(state,
- self.createRoundKey(expandedKey, 16*nbrRounds))
- return state
-
- # Perform the initial operations, the standard round, and the final
- # operations of the inverse aes, creating a round key for each round
- def aes_invMain(self, state, expandedKey, nbrRounds):
- state = self.addRoundKey(state,
- self.createRoundKey(expandedKey, 16*nbrRounds))
- i = nbrRounds - 1
- while i > 0:
- state = self.aes_invRound(state,
- self.createRoundKey(expandedKey, 16*i))
- i -= 1
- state = self.shiftRows(state, True)
- state = self.subBytes(state, True)
- state = self.addRoundKey(state, self.createRoundKey(expandedKey, 0))
- return state
-
- # encrypts a 128 bit input block against the given key of size specified
- def encrypt(self, iput, key, size):
- output = [0] * 16
- # the number of rounds
- nbrRounds = 0
- # the 128 bit block to encode
- block = [0] * 16
- # set the number of rounds
- if size == self.keySize["SIZE_128"]: nbrRounds = 10
- elif size == self.keySize["SIZE_192"]: nbrRounds = 12
- elif size == self.keySize["SIZE_256"]: nbrRounds = 14
- else: return None
-
- # the expanded keySize
- expandedKeySize = 16*(nbrRounds+1)
-
- # Set the block values, for the block:
- # a0,0 a0,1 a0,2 a0,3
- # a1,0 a1,1 a1,2 a1,3
- # a2,0 a2,1 a2,2 a2,3
- # a3,0 a3,1 a3,2 a3,3
- # the mapping order is a0,0 a1,0 a2,0 a3,0 a0,1 a1,1 ... a2,3 a3,3
- #
- # iterate over the columns
- for i in range(4):
- # iterate over the rows
- for j in range(4):
- block[(i+(j*4))] = iput[(i*4)+j]
-
- # expand the key into an 176, 208, 240 bytes key
- # the expanded key
- expandedKey = self.expandKey(key, size, expandedKeySize)
-
- # encrypt the block using the expandedKey
- block = self.aes_main(block, expandedKey, nbrRounds)
-
- # unmap the block again into the output
- for k in range(4):
- # iterate over the rows
- for l in range(4):
- output[(k*4)+l] = block[(k+(l*4))]
- return output
-
- # decrypts a 128 bit input block against the given key of size specified
- def decrypt(self, iput, key, size):
- output = [0] * 16
- # the number of rounds
- nbrRounds = 0
- # the 128 bit block to decode
- block = [0] * 16
- # set the number of rounds
- if size == self.keySize["SIZE_128"]: nbrRounds = 10
- elif size == self.keySize["SIZE_192"]: nbrRounds = 12
- elif size == self.keySize["SIZE_256"]: nbrRounds = 14
- else: return None
-
- # the expanded keySize
- expandedKeySize = 16*(nbrRounds+1)
-
- # Set the block values, for the block:
- # a0,0 a0,1 a0,2 a0,3
- # a1,0 a1,1 a1,2 a1,3
- # a2,0 a2,1 a2,2 a2,3
- # a3,0 a3,1 a3,2 a3,3
- # the mapping order is a0,0 a1,0 a2,0 a3,0 a0,1 a1,1 ... a2,3 a3,3
-
- # iterate over the columns
- for i in range(4):
- # iterate over the rows
- for j in range(4):
- block[(i+(j*4))] = iput[(i*4)+j]
- # expand the key into an 176, 208, 240 bytes key
- expandedKey = self.expandKey(key, size, expandedKeySize)
- # decrypt the block using the expandedKey
- block = self.aes_invMain(block, expandedKey, nbrRounds)
- # unmap the block again into the output
- for k in range(4):
- # iterate over the rows
- for l in range(4):
- output[(k*4)+l] = block[(k+(l*4))]
- return output
-
-
-class AESModeOfOperation(object):
-
- aes = AES()
-
- # structure of supported modes of operation
- modeOfOperation = dict(OFB=0, CFB=1, CBC=2)
-
- # converts a 16 character string into a number array
- def convertString(self, string, start, end, mode):
- if end - start > 16: end = start + 16
- if mode == self.modeOfOperation["CBC"]: ar = [0] * 16
- else: ar = []
-
- i = start
- j = 0
- while len(ar) < end - start:
- ar.append(0)
- while i < end:
- ar[j] = ord(string[i])
- j += 1
- i += 1
- return ar
-
- # Mode of Operation Encryption
- # stringIn - Input String
- # mode - mode of type modeOfOperation
- # hexKey - a hex key of the bit length size
- # size - the bit length of the key
- # hexIV - the 128 bit hex Initilization Vector
- def encrypt(self, stringIn, mode, key, size, IV):
- if len(key) % size:
- return None
- if len(IV) % 16:
- return None
- # the AES input/output
- plaintext = []
- iput = [0] * 16
- output = []
- ciphertext = [0] * 16
- # the output cipher string
- cipherOut = []
- # char firstRound
- firstRound = True
- if stringIn != None:
- for j in range(int(math.ceil(float(len(stringIn))/16))):
- start = j*16
- end = j*16+16
- if end > len(stringIn):
- end = len(stringIn)
- plaintext = self.convertString(stringIn, start, end, mode)
- # print 'PT@%s:%s' % (j, plaintext)
- if mode == self.modeOfOperation["CFB"]:
- if firstRound:
- output = self.aes.encrypt(IV, key, size)
- firstRound = False
- else:
- output = self.aes.encrypt(iput, key, size)
- for i in range(16):
- if len(plaintext)-1 < i:
- ciphertext[i] = 0 ^ output[i]
- elif len(output)-1 < i:
- ciphertext[i] = plaintext[i] ^ 0
- elif len(plaintext)-1 < i and len(output) < i:
- ciphertext[i] = 0 ^ 0
- else:
- ciphertext[i] = plaintext[i] ^ output[i]
- for k in range(end-start):
- cipherOut.append(ciphertext[k])
- iput = ciphertext
- elif mode == self.modeOfOperation["OFB"]:
- if firstRound:
- output = self.aes.encrypt(IV, key, size)
- firstRound = False
- else:
- output = self.aes.encrypt(iput, key, size)
- for i in range(16):
- if len(plaintext)-1 < i:
- ciphertext[i] = 0 ^ output[i]
- elif len(output)-1 < i:
- ciphertext[i] = plaintext[i] ^ 0
- elif len(plaintext)-1 < i and len(output) < i:
- ciphertext[i] = 0 ^ 0
- else:
- ciphertext[i] = plaintext[i] ^ output[i]
- for k in range(end-start):
- cipherOut.append(ciphertext[k])
- iput = output
- elif mode == self.modeOfOperation["CBC"]:
- for i in range(16):
- if firstRound:
- iput[i] = plaintext[i] ^ IV[i]
- else:
- iput[i] = plaintext[i] ^ ciphertext[i]
- # print 'IP@%s:%s' % (j, iput)
- firstRound = False
- ciphertext = self.aes.encrypt(iput, key, size)
- # always 16 bytes because of the padding for CBC
- for k in range(16):
- cipherOut.append(ciphertext[k])
- return mode, len(stringIn), cipherOut
-
- # Mode of Operation Decryption
- # cipherIn - Encrypted String
- # originalsize - The unencrypted string length - required for CBC
- # mode - mode of type modeOfOperation
- # key - a number array of the bit length size
- # size - the bit length of the key
- # IV - the 128 bit number array Initilization Vector
- def decrypt(self, cipherIn, originalsize, mode, key, size, IV):
- # cipherIn = unescCtrlChars(cipherIn)
- if len(key) % size:
- return None
- if len(IV) % 16:
- return None
- # the AES input/output
- ciphertext = []
- iput = []
- output = []
- plaintext = [0] * 16
- # the output plain text string
- stringOut = ''
- # char firstRound
- firstRound = True
- if cipherIn != None:
- for j in range(int(math.ceil(float(len(cipherIn))/16))):
- start = j*16
- end = j*16+16
- if j*16+16 > len(cipherIn):
- end = len(cipherIn)
- ciphertext = cipherIn[start:end]
- if mode == self.modeOfOperation["CFB"]:
- if firstRound:
- output = self.aes.encrypt(IV, key, size)
- firstRound = False
- else:
- output = self.aes.encrypt(iput, key, size)
- for i in range(16):
- if len(output)-1 < i:
- plaintext[i] = 0 ^ ciphertext[i]
- elif len(ciphertext)-1 < i:
- plaintext[i] = output[i] ^ 0
- elif len(output)-1 < i and len(ciphertext) < i:
- plaintext[i] = 0 ^ 0
- else:
- plaintext[i] = output[i] ^ ciphertext[i]
- for k in range(end-start):
- stringOut += chr(plaintext[k])
- iput = ciphertext
- elif mode == self.modeOfOperation["OFB"]:
- if firstRound:
- output = self.aes.encrypt(IV, key, size)
- firstRound = False
- else:
- output = self.aes.encrypt(iput, key, size)
- for i in range(16):
- if len(output)-1 < i:
- plaintext[i] = 0 ^ ciphertext[i]
- elif len(ciphertext)-1 < i:
- plaintext[i] = output[i] ^ 0
- elif len(output)-1 < i and len(ciphertext) < i:
- plaintext[i] = 0 ^ 0
- else:
- plaintext[i] = output[i] ^ ciphertext[i]
- for k in range(end-start):
- stringOut += chr(plaintext[k])
- iput = output
- elif mode == self.modeOfOperation["CBC"]:
- output = self.aes.decrypt(ciphertext, key, size)
- for i in range(16):
- if firstRound:
- plaintext[i] = IV[i] ^ output[i]
- else:
- plaintext[i] = iput[i] ^ output[i]
- firstRound = False
- if originalsize is not None and originalsize < end:
- for k in range(originalsize-start):
- stringOut += chr(plaintext[k])
- else:
- for k in range(end-start):
- stringOut += chr(plaintext[k])
- iput = ciphertext
- return stringOut
-
-
-def encryptData(key, data, mode=AESModeOfOperation.modeOfOperation["CBC"]):
- """encrypt `data` using `key`
-
- `key` should be a string of bytes.
-
- returned cipher is a string of bytes prepended with the initialization
- vector.
-
- """
- key = map(ord, key)
- data = append_PKCS7_padding(data)
- keysize = len(key)
- assert keysize in AES.keySize.values(), 'invalid key size: %s' % keysize
- # create a new iv using random data
- iv = [ord(i) for i in os.urandom(16)]
- moo = AESModeOfOperation()
- (mode, length, ciph) = moo.encrypt(data, mode, key, keysize, iv)
- # With padding, the original length does not need to be known. It's a bad
- # idea to store the original message length.
- # prepend the iv.
- return ''.join(map(chr, iv)) + ''.join(map(chr, ciph))
-
-def decryptData(key, data, mode=AESModeOfOperation.modeOfOperation["CBC"]):
- """decrypt `data` using `key`
-
- `key` should be a string of bytes.
-
- `data` should have the initialization vector prepended as a string or
- ordinal values.
-
- """
-
- key = map(ord, key)
- keysize = len(key)
- assert keysize in AES.keySize.values(), 'invalid key size: %s' % keysize
- # iv is first 16 bytes
- iv = map(ord, data[:16])
- data = map(ord, data[16:])
- moo = AESModeOfOperation()
- decr = moo.decrypt(data, None, mode, key, keysize, iv)
- decr = strip_PKCS7_padding(decr)
- return decr
-
-def generateRandomKey(keysize):
- """Generates a key from random data of length `keysize`.
-
- The returned key is a string of bytes.
-
- """
- if keysize not in (16, 24, 32):
- emsg = 'Invalid keysize, %s. Should be one of (16, 24, 32).'
- raise ValueError, emsg % keysize
- return os.urandom(keysize)
-
-if __name__ == "__main__":
- moo = AESModeOfOperation()
- cleartext = "This is a test!"
- cypherkey = [143,194,34,208,145,203,230,143,177,246,97,206,145,92,255,84]
- iv = [103,35,148,239,76,213,47,118,255,222,123,176,106,134,98,92]
- mode, orig_len, ciph = moo.encrypt(cleartext, moo.modeOfOperation["CBC"],
- cypherkey, moo.aes.keySize["SIZE_128"], iv)
- print 'm=%s, ol=%s (%s), ciph=%s' % (mode, orig_len, len(cleartext), ciph)
- decr = moo.decrypt(ciph, orig_len, mode, cypherkey,
- moo.aes.keySize["SIZE_128"], iv)
- print decr
-
diff --git a/django/srpproject/srp/backends.py b/django/srpproject/srp/backends.py
deleted file mode 100644
index 8882973..0000000
--- a/django/srpproject/srp/backends.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from srp.models import SRPUser
-
-class SRPBackend:
- """
- Authenticate against srp.models.SRPUser
- """
- # TODO: Model, login attribute name and password attribute name should be
- # configurable.
- def authenticate(self, username=None, M=None):
- try:
- user = SRPUser.objects.get(username=username)
- if user.check_password(M):
- return user
- except SRPUser.DoesNotExist:
- return None
-
- def get_user(self, user_id):
- try:
- return SRPUser.objects.get(pk=user_id)
- except SRPUser.DoesNotExist:
- return None
diff --git a/django/srpproject/srp/models.py b/django/srpproject/srp/models.py
deleted file mode 100644
index ce30c95..0000000
--- a/django/srpproject/srp/models.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from django.db import models
-from django.contrib.auth.models import User
-# Create your models here.
-
-class SRPUser(User):
- salt = models.CharField(max_length=16)
- verifier = models.CharField(max_length=65, null=True)
-
- def check_password(self, M):
- return M[0] == M[1]
-
diff --git a/django/srpproject/srp/util.py b/django/srpproject/srp/util.py
deleted file mode 100644
index 1f82450..0000000
--- a/django/srpproject/srp/util.py
+++ /dev/null
@@ -1,67 +0,0 @@
-# Locally used functions:
-def join(a,b):
- return a+b if a.endswith("/") else "/".join((a,b))
-
-def genHeader(jsDir, flist):
- return "\n".join(["<script src='%s'></script>" % join(jsDir, f) for f in flist])
-
-# Headers:
-def loginHeader(jsDir, compressed=True):
- return genHeader(jsDir, ["srp.min.js"] if compressed else ["SHA256.js", "prng4.js", "rng.js", "jsbn.js", "jsbn2.js", "srp.js"])
-
-def registerHeader(jsDir, compressed=True):
- return genHeader(jsDir, ["srp.min.js", "srp_register.min.js"] if compressed else \
-["SHA256.js", "prng4.js", "rng.js", "jsbn.js", "jsbn2.js", "srp.js", "srp_register.js"])
-
-# Forms:
-def loginForm(srp_url, srp_forward, login_function="login()", no_js=True):
- return """<form action="%s" method="POST" onsubmit="return %s">
-<table>
-<tr><td>Username:</td><td><input type="text" name="srp_username" id="srp_username" /></td></tr>
-<tr><td>Password:</td><td><input type="password" name="srp_password" id="srp_password" /></td></tr>
-<input type="hidden" id="srp_url" value="%s"/>
-<input type="hidden" name="srp_forward" id="srp_forward" value="%s"/>
-<input type="hidden" id="srp_server" value="django"/>
-</table>
-<input type="submit"/>
-</form>""" % (join(srp_url, "noJs/") if no_js else "#", login_function, join(srp_url, ""), srp_forward)
-
-def registerForm(srp_url, srp_forward, login_function="register()"):
- return """<form action="#" method="POST" onsubmit="return %s">
-<table>
-<tr><td>Username:</td><td><input type="text" name="srp_username" id="srp_username" /></td></tr>
-<tr><td>Password:</td><td><input type="password" name="srp_password" id="srp_password" /></td></tr>
-<tr><td>Confirm Password:</td><td><input type="password" id="confirm_password" /></td></tr>
-<input type="hidden" id="srp_url" value="%s"/>
-<input type="hidden" name="srp_forward" id="srp_forward" value="%s"/>
-<input type="hidden" id="srp_server" value="django"/>
-</table>
-<input type="submit"/>
-</form>""" % (login_function, join(srp_url, ""), srp_forward)
-
-
-# Functions:
-def loginFunction():
- return """<script type="text/javascript">
-function login()
-{
- srp = new SRP();
- srp.identify();
- return false;
-}
-</script>"""
-
-def registerFunction():
- return """<script type="text/javascript">function register()
-{
- if(document.getElementById("confirm_password").value != document.getElementById("srp_password").value)
- alert("Passwords do not match");
- else if(document.getElementById("srp_password").value == "")
- alert("Password cannot be blank");
- else
- {
- srp = new SRP();
- srp.register();
- }
- return false;
-};</script>"""
diff --git a/django/srpproject/srp/views.py b/django/srpproject/srp/views.py
deleted file mode 100644
index 74209e5..0000000
--- a/django/srpproject/srp/views.py
+++ /dev/null
@@ -1,230 +0,0 @@
-from django.http import HttpResponse, HttpResponseRedirect
-
-from django.contrib.auth.models import User
-
-###
-### General methods
-###
-
-# We need randomly generated salts. This is about 100 bits of entropy.
-def generate_salt():
- import string, random
- randomgen = random.SystemRandom()
- salt_chars = "./" + string.ascii_letters + string.digits
- return "".join([randomgen.choice(salt_chars) for i in range(0,16)])
-
-# We want to avoid information leakage. For users that don't exist, we need salts to be consistent.
-# These "fake" salts are seeded with the username and the django secret_key. They're not as random
-# as true salts should be, but they should be indistinguishable to a hacker who isn't sure whether
-# or not an account exists.
-def generate_fake_salt(I):
- import string, random, settings, hashlib
- random.seed("%s:%s" % (I, settings.SECRET_KEY))
- salt_chars = "./" + string.ascii_letters + string.digits
- salt = "".join([random.choice(salt_chars) for i in range(0,16)])
- return salt, int(hashlib.sha256("%s:%s" % (salt, settings.SECRET_KEY)).hexdigest(), 16)
-
-# In upgrades, we'll need to decrypt some AES data
-def decrypt(c, key, plen):
- from srp import aes
- import base64
- moo = aes.AESModeOfOperation()
- cypherkey = map(ord, key.decode("hex"))
- ciphertext = base64.b64decode(c.replace("_", "+"))
- iv = map(ord, ciphertext[:16])
- ciphertext= map(ord, ciphertext[16:])
- return moo.decrypt(ciphertext, 0, moo.modeOfOperation["CFB"], cypherkey, len(cypherkey), iv)[:plen]
-
-def generate_verifier(salt, username, password):
- import hashlib
- x = int(hashlib.sha256(salt + hashlib.sha256("%s:%s" % (username, password)).hexdigest()).hexdigest(), 16)
- return hex(pow(2, x, 125617018995153554710546479714086468244499594888726646874671447258204721048803))[2:-1]
-
-def login_page(request):
- from django.shortcuts import render_to_response
- import util
- return render_to_response('login.html', \
- {'error': "Invalid username or password" if "error" in request.GET and request.GET["error"] == '1' and not request.user.is_authenticated() else "",\
- 'jsHeader': util.loginHeader("http://%s/srp-test/javascript" % request.get_host()),\
- 'loginForm': util.loginForm("http://%s/srp/" % request.get_host(), "http://google.com"),\
- 'loginFunction': util.loginFunction() })
-
-def register_page(request):
- from django.shortcuts import render_to_response
- import util
- return render_to_response('login.html', \
- {'error': "Invalid username or password" if "error" in request.GET and request.GET["error"] == '1' and not request.user.is_authenticated() else "",\
- 'jsHeader': util.registerHeader("http://%s/srp-test/javascript" % request.get_host()),\
- 'loginForm': util.registerForm("http://%s/srp/" % request.get_host(), "http://google.com"),\
- 'loginFunction': util.registerFunction() })
-
-###
-### User Registration
-###
-
-# Step 1. A client submits a username. If the username is available, we generate a salt, store it, and return it.
-# Otherwise, we return an error.
-def register_salt(request):
- if User.objects.filter(username=request.POST["I"]).count() > 0:
- return HttpResponse("<error>Username already in use</error>", mimetype="text/xml")
- request.session["srp_name"] = request.POST["I"]
- request.session["srp_salt"] = generate_salt()
- return HttpResponse("<salt>%s</salt>" % request.session["srp_salt"], mimetype="text/xml")
-
-# Step 2. The client creates the password verifier and sends it to the server, along with a username.
-def register_user(request):
- from django.contrib import auth
- from srp.models import SRPUser
- SRPUser(salt=request.session["srp_salt"], username=request.session["srp_name"], verifier=request.POST["v"]).save()
- del request.session["srp_salt"]
- del request.session["srp_name"]
- return HttpResponse("<ok/>", mimetype="text/xml");
-
-# Step 3: The client initiates the login process.
-
-###
-### User Login
-###
-
-# Step 1: The user sends an identifier and public ephemeral key, A
-# The server responds with the salt and public ephemeral key, B
-def handshake(request):
- import random, hashlib
- from srp.models import SRPUser
- randomgen = random.SystemRandom()
- request.session["srp_I"] = request.POST["I"]
- A = int(request.POST["A"], 16)
- request.session["srp_A"] = request.POST["A"]
- g = 2
- N = 125617018995153554710546479714086468244499594888726646874671447258204721048803
- k = 88846390364205216646376352624313659232912717719075174937149043299744712465496
- upgrade = False
- if A % N == 0:
- return HttpResponse("<error>Invalid ephemeral key.</error>", mimetype="text/xml")
- else:
- try:
- user = User.objects.get(username=request.session["srp_I"])
- try:
- user = user.srpuser
- salt = user.salt
- v = int(user.verifier, 16)
- # The auth.User exists, but the SRPUser does not
- # We need to create an SRPUser to correspond to that auth.User
- # Initially, the verifier will be based on the known hash of the password
- except SRPUser.DoesNotExist:
- salt = generate_salt()
- algo, dsalt, hashpass = user.password.split("$")
- upgrade = True
- v = generate_verifier(salt, user.username, hashpass)
-
- # We don't want to leak that the username doesn't exist. Make up a fake salt and verifier.
- except User.DoesNotExist:
- salt, x = generate_fake_salt(request.POST["I"])
- v = pow(g, x, N)
-
- # Ensure that B%N != 0
- while True:
- b = randomgen.getrandbits(32)
- B = k*v + pow(g,b,N)
- u = int(hashlib.sha256("%s%s" % (hex(A)[2:-1],hex(B)[2:-1])).hexdigest(), 16)
- if B % N != 0 and u % N != 0: break
-
- # Ideally, we could return this response and then calculate M concurrently with the user
- # Unfortunately, django isn't designed to do computations after responding.
- # Maybe someone will find a way.
- S = pow(A*pow(v,u,N), b, N)
- request.session["srp_S"] = hex(S)[2:-1]
- Mstr = "%s%s%s" % (hex(A)[2:-1],hex(B)[2:-1],hex(S)[2:-1])
- request.session["srp_M"] = hashlib.sha256(Mstr).hexdigest()
- response = "<r s='%s' B='%s'%s />" % (salt, hex(B)[2:-1], " a='%s' d='%s'" % (algo, dsalt) if upgrade else "")
- return HttpResponse(response, mimetype="text/xml")
-
-# Step 2: The client sends its proof of S. The server confirms, and sends its proof of S.
-def verify(request):
- import hashlib
- from django.contrib.auth import login, authenticate
- user = authenticate(username=request.session["srp_I"], M=(request.POST["M"], request.session["srp_M"]))
- if user:
- response = "<M>%s</M>" % hashlib.sha256("%s%s%s" % (request.session["srp_A"], request.session["srp_M"], request.session["srp_S"])).hexdigest()
- login(request, user)
- else:
- response = "<error>Invalid username or password.</error>"
-
- try:
- del request.session["srp_I"]
- del request.session["srp_M"]
- del request.session["srp_S"]
- del request.session["srp_A"]
- except KeyError:
- pass
- return HttpResponse(response, mimetype="text/xml")
-
-# Check that the user has generated the correct M
-def upgrade_auth(request):
- import hashlib
- if request.POST["M"] == request.session["srp_M"]:
- response = "<M>%s</M>" % hashlib.sha256("%s%s%s" % (request.session["srp_A"], request.session["srp_M"], request.session["srp_S"])).hexdigest()
- request.session["srp_preauth"] = True
- else:
- response = "<error>Invalid username or password.</error>"
- return HttpResponse(response, mimetype="text/xml")
-
-# Receive the encrypted password, create the verifier, save the user, and notify the client
-def upgrade_add_verifier(request):
- from srp.models import SRPUser
- from django.contrib.auth.models import User
- import hashlib
- salt = generate_salt()
- key = hashlib.sha256(request.session["srp_S"]).hexdigest()
- user = User.objects.get(username=request.session["srp_I"])
- srpuser = SRPUser()
- srpuser.__dict__.update(user.__dict__)
- srpuser.verifier = generate_verifier(salt, request.session["srp_I"], decrypt(request.POST["p"], key, int(request.POST["l"])))
- srpuser.salt = salt
- srpuser.password = ""
- srpuser.save()
- return HttpResponse("<ok/>", mimetype="text/xml")
-
-# If a user has posted their username and password, we'll go ahead and authenticate them
-def no_javascript(request):
- from django.contrib.auth.models import User
- from srp.models import SRPUser
- from django.contrib.auth import login, authenticate
- try:
- user = User.objects.get(username=request.POST["srp_username"])
- try:
- # Create a verifier for the user, and check that it matches the user's verifier
- # Since we're doing it all on one side, we can skip the rest of the protocol
- v = generate_verifier(user.srpuser.salt, request.POST["srp_username"], request.POST["srp_password"])
- user = authenticate(username=request.POST["srp_username"], M=(user.srpuser.verifier, v))
- if user:
- login(request, user)
- if not request.POST["srp_forward"].startswith("#"):
- return HttpResponseRedirect(request.POST["srp_forward"])
- else:
- return HttpResponseRedirect("%s%s" % (request.META["HTTP_REFERER"], request.POST["srp_forward"]))
- except SRPUser.DoesNotExist:
- # The user exists in the auth table, but not the SRP table
- # Create an SRP version of the user
- if user.check_password(request.POST["srp_password"]):
- srpuser = SRPUser()
- srpuser.__dict__.update(user.__dict__)
- srpuser.salt = generate_salt()
- srpuser.verifier = generate_verifier(srpuser.salt, request.POST["srp_username"], request.POST["srp_password"])
- srpuser.password = ""
- srpuser.save()
- if not request.POST["srp_forward"].startswith("#"):
- return HttpResponseRedirect(request.POST["srp_forward"])
- else:
- return HttpResponseRedirect("%s%s" % (request.META["HTTP_REFERER"], request.POST["srp_forward"]))
- except User.DoesNotExist:
- # The user does not exist in the auth tables
- # Send the client back to the login page with an error
- pass
- if "?" in request.META["HTTP_REFERER"]:
- if "error=1" in request.META["HTTP_REFERER"]:
- return HttpResponseRedirect("%s" % request.META["HTTP_REFERER"])
- else:
- return HttpResponseRedirect("%s&error=1" % request.META["HTTP_REFERER"])
- else:
- return HttpResponseRedirect("%s?error=1" % request.META["HTTP_REFERER"])
diff --git a/django/srpproject/templates/aes.html b/django/srpproject/templates/aes.html
deleted file mode 100644
index dbdd4ac..0000000
--- a/django/srpproject/templates/aes.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<html>
- <head>
- <script src="{{ static_files }}/prng4.js"></script>
- <script src="{{ static_files }}/rng.js"></script>
- <script src="{{ static_files }}/jsPacker/hash.min.js"></script>
- <script type="text/javascript">
- var key = cryptoHelpers.toNumbers("6754c921b8dcbd1f8b58748cd87ac60ce857314687a65df05c470a46f438842c");
- var rng = new SecureRandom();
- innerxml = function(node)
- {
- return node.firstChild.nodeValue;
- };
- ajaxRequest = function(full_url, params, callback)
- {
- if( window.XMLHttpRequest)
- xhr = new XMLHttpRequest();
- else if (window.ActiveXObject){
- try{
- xhr = new ActiveXObject("Microsoft.XMLHTTP");
- }catch (e){}
- }
- else
- {
- that.error_message("Ajax not supported.");
- return;
- }
- if(xhr){
- xhr.onreadystatechange = callback;
- xhr.open("POST", full_url, true);
- xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
- xhr.setRequestHeader("Content-length", params.length);
- xhr.setRequestHeader("Connection", "close");
- xhr.send(params);
- }
- else
- {
- that.error_message("Ajax failed.");
- }
- };
- function encryptDecrypt()
- {
- var byteMessage = cryptoHelpers.convertStringToByteArray(document.getElementById("plaintext").value);
- var iv = new Array(16);
- rng.nextBytes(iv);
- var paddedByteMessage = slowAES.getPaddedBlock(byteMessage, 0, byteMessage.length, slowAES.modeOfOperation.OFB);
- var ciphertext = slowAES.encrypt(paddedByteMessage, slowAES.modeOfOperation.OFB, key, key.length, iv).cipher;
- var sendstring = cryptoHelpers.base64.encode(iv.concat(ciphertext));
- while(sendstring.indexOf("+",0) > -1)
- sendstring = sendstring.replace("+", "_");
- ajaxRequest("http://home.ausiv.com:85/srp/aes/post/", "c="+sendstring+"&l="+byteMessage.length, displayText);
-
- };
- function displayText()
- {
- if(xhr.readyState == 4 && xhr.status == 200) {
- if(xhr.responseXML.getElementsByTagName("P").length > 0)
- document.getElementById("output").value = innerxml(xhr.responseXML.getElementsByTagName("P")[0]);
- else if(xhr.responseXML.getElementsByTagName("error").length > 0)
- alert(innerxml(xhr.responseXML.getElementsByTagName("error")[0]));
- }
- };
- </script>
- </head>
- <body>
- <input type="text" id="plaintext"/>
- <input type="button" value="Send Encrypted Text" onclick="javascript:encryptDecrypt();"/>
- <input type="text" id="output"/>
- </body>
-</html>
diff --git a/django/srpproject/templates/login.html b/django/srpproject/templates/login.html
deleted file mode 100644
index c1d6238..0000000
--- a/django/srpproject/templates/login.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<html>
- <head>
- {{ jsHeader|safe }}
- {{ loginFunction|safe }}
- </head>
- <body>
- {{ error }}<p/>
- {{ loginForm|safe }}
- </body>
-</html>
diff --git a/django/srpproject/templates/register.html b/django/srpproject/templates/register.html
deleted file mode 100644
index 6e6d44a..0000000
--- a/django/srpproject/templates/register.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<html>
- <head>
- {% comment %}
- <script src="{{ static_files }}/SHA256.js"></script>
- <script src="{{ static_files }}/prng4.js"></script>
- <script src="{{ static_files }}/rng.js"></script>
- <script src="{{ static_files }}/jsbn.js"></script>
- <script src="{{ static_files }}/jsbn2.js"></script>
- <script src="{{ static_files }}/srp.js"></script>
- {% endcomment %}
- <script src="{{ static_files }}/jsPacker/srp.min.js"></script>
- <script src="{{ static_files }}/jsPacker/srp_register.min.js"></script>
- <script type="text/javascript">
- function register()
- {
- if(document.getElementById("confirm_password").value != document.getElementById("srp_password").value)
- alert("Passwords do not match");
- else if(document.getElementById("srp_password").value == "")
- alert("Password cannot be blank");
- else
- {
- srp = new SRP();
- srp.success = function()
- {
- alert("We win");
- };
- srp.register();
- }
- return false;
- };
- </script>
- </head>
- <body>
- <form action="." onsubmit="return register()">
- <table>
- <tr><td>Username:</td><td><input type="text" id="srp_username" /></td></tr>
- <tr><td>Password:</td><td><input type="password" id="srp_password" /></td></tr>
- <tr><td>Confirm:</td><td><input type="password" id="confirm_password" /></td></tr>
- <input type="hidden" id="srp_url" value="{{ srp_url }}"/>
- <input type="hidden" id="srp_forward" value="{{ srp_url }}login/"/>
- <input type="hidden" id="srp_server" value="django"/>
- </table>
- <input type="submit"/>
- </form>
- </body>
-</html>
diff --git a/django/srpproject/urls.py b/django/srpproject/urls.py
deleted file mode 100644
index c50fd72..0000000
--- a/django/srpproject/urls.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from django.conf.urls.defaults import *
-
-# Uncomment the next two lines to enable the admin:
-# from django.contrib import admin
-# admin.autodiscover()
-import srp.views
-
-urlpatterns = patterns('',
-
- # Login and regiser pages. These are mainly for testing.
- (r'^srp/register/$', srp.views.register_page),
- (r'^srp/login/$', srp.views.login_page),
-
- # These pages are necessary for users to register
- (r'^srp/register/salt/$', srp.views.register_salt),
- (r'^srp/register/user/$', srp.views.register_user),
-
- # These pages are necessary for users to log in
- (r'^srp/handshake/$', srp.views.handshake),
- (r'^srp/authenticate/$', srp.views.verify),
-
- # This page allows users to login without javascript,
- # but the browser posts their username and password in plaintext.
- (r'^srp/noJs/$', srp.views.no_javascript),
-
- # Only include these if you are upgrading an existing installation to SRP
- (r'^srp/upgrade/authenticate/$', srp.views.upgrade_auth),
- (r'^srp/upgrade/verifier/$', srp.views.upgrade_add_verifier),
-)
diff --git a/javascript/crypto.min.js b/javascript/crypto.min.js
deleted file mode 100644
index d8dbba6..0000000
--- a/javascript/crypto.min.js
+++ /dev/null
@@ -1 +0,0 @@
-eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('18 aI={2O:{7j:{8L:16,8K:24,86:32},7K:[1W,3z,4D,5g,6g,4B,5A,1U,4W,1Y,5e,3s,3O,3j,2E,56,6d,69,5Y,2C,2r,5C,3q,3P,5z,2d,4e,4s,3L,3I,27,44,5S,3f,5Q,3A,2H,4z,5l,2p,3C,5T,5o,5U,3l,2F,4A,4u,2f,5Z,4x,4l,3V,4T,5b,2l,4v,6u,1x,3Q,5n,5L,4N,5h,4w,1Q,4U,4Z,1J,3x,6k,4O,52,5M,6f,2n,5K,5X,2x,4Q,4F,4o,6x,5W,2e,6h,5x,3o,2w,1V,4c,25,26,3Z,3v,5p,4J,1T,3H,4h,5k,2z,2y,4q,5E,5m,2b,3m,3Y,3T,1S,68,5j,5y,2v,5O,3K,5P,6t,4i,2t,3F,3N,5c,2a,5V,3g,47,4m,3E,3r,3R,5i,2m,3w,57,6e,3e,6p,5d,54,4G,58,5B,3y,5N,4H,46,4V,6r,6c,4f,6m,6i,3G,4Y,4K,2g,5a,62,6j,3U,28,3X,3p,50,6s,51,2q,2A,4d,6o,1R,5v,2j,4E,4j,3M,3t,3k,1P,61,53,3d,2G,3u,4L,4a,4C,43,4P,2u,65,55,1Z,3S,6v,67,66,2c,2s,5r,2i,5H,5F,2o,4p,4R,6q,4X,3b,2h,6n,5J,49,6w,2B,2D,5D,5R,4g,5q,1X,6b,3h,48,4S,5G,5f,3i,3J,2k,5u,3D,5s,4k,45,3n,3B,4n,6a,4t,5t,5I,5w,4M,41,42,4I,4r,4y,2L,4b,6l,3c,3W],8S:[52,4w,2w,61,4W,2H,5T,6t,5w,2v,5y,6b,5N,3g,3j,4h,3z,5X,25,69,5u,2x,5V,5s,3C,3J,5k,3w,6e,4K,4k,1V,6l,5g,2k,3U,67,2q,4x,5d,6i,3Z,5v,5a,41,2r,4l,53,2u,3S,4t,2h,3B,3i,6s,4N,56,3o,4e,3p,3k,4p,4o,1Z,27,48,49,54,4g,42,4S,3W,2d,3I,51,2p,4G,4C,3F,3K,2G,6q,6n,3Y,3f,5W,5R,3N,2g,4u,6m,5D,3e,1P,5P,4Q,6c,2F,2E,6x,6a,2t,2A,3X,5l,2j,3v,5b,3G,2n,5E,50,4J,4U,3D,5O,6d,4z,2L,2b,5q,4s,2o,5J,1Y,3r,4R,4B,28,1R,5G,4I,4H,5e,46,4a,2m,6g,5p,45,3P,66,4M,5B,4T,4d,2i,4V,4j,5z,2D,4q,3Q,5m,3t,2s,6v,5h,4n,3x,3q,5U,4Z,3l,1X,5K,1U,5t,5A,5S,6o,6w,3H,3V,4c,1J,6h,3u,4X,5F,2c,47,4E,2e,2l,62,44,3O,55,4m,6k,4L,5H,5r,68,2y,4f,4v,5Z,4A,5x,6u,2a,5C,5L,1x,3R,5i,3y,5j,3m,3d,58,3b,26,5I,4y,5o,43,1S,5Q,5Y,3L,1T,4O,6j,5M,2z,4P,6r,4i,4b,3M,5n,3c,3T,1Q,4F,4r,2B,57,3s,2f,6p,65,4D,6f,3A,3h,5f,4Y,1W,3n,5c,3E,2C],8Y:1e(1K){18 c=1K[0];1c(18 i=0;i<3;i++)1K[i]=1K[i+1];1K[3]=c;1d 1K},8X:[1P,1Y,2b,2f,2u,2a,2e,2v,1x,1J,2H,2G,2F,2E,2z,2l,2x,2g,2t,1W,2c,2m,2D,2w,2d,2n,2C,2r,1T,1U,1R,25,27,2j,2A,2o,2B,2q,1S,1Z,26,2k,2y,2h,2p,1Q,1X,28,2i,2s,1V,1P,1Y,2b,2f,2u,2a,2e,2v,1x,1J,2H,2G,2F,2E,2z,2l,2x,2g,2t,1W,2c,2m,2D,2w,2d,2n,2C,2r,1T,1U,1R,25,27,2j,2A,2o,2B,2q,1S,1Z,26,2k,2y,2h,2p,1Q,1X,28,2i,2s,1V,1P,1Y,2b,2f,2u,2a,2e,2v,1x,1J,2H,2G,2F,2E,2z,2l,2x,2g,2t,1W,2c,2m,2D,2w,2d,2n,2C,2r,1T,1U,1R,25,27,2j,2A,2o,2B,2q,1S,1Z,26,2k,2y,2h,2p,1Q,1X,28,2i,2s,1V,1P,1Y,2b,2f,2u,2a,2e,2v,1x,1J,2H,2G,2F,2E,2z,2l,2x,2g,2t,1W,2c,2m,2D,2w,2d,2n,2C,2r,1T,1U,1R,25,27,2j,2A,2o,2B,2q,1S,1Z,26,2k,2y,2h,2p,1Q,1X,28,2i,2s,1V,1P,1Y,2b,2f,2u,2a,2e,2v,1x,1J,2H,2G,2F,2E,2z,2l,2x,2g,2t,1W,2c,2m,2D,2w,2d,2n,2C,2r,1T,1U,1R,25,27,2j,2A,2o,2B,2q,1S,1Z,26,2k,2y,2h,2p,1Q,1X,28,2i,2s,1V],aH:[6x,2b,2f,50,2u,3X,3E,6w,2a,6u,4Y,3W,3V,4Z,6v,3D,2e,4V,6s,3A,3B,6r,4U,3S,4W,3U,3C,2H,6t,28,3T,4X,2v,41,3w,6m,6n,26,3Z,53,3Y,52,6l,3u,3v,6k,51,2g,3y,6o,54,2h,42,2w,2G,3x,6q,27,2i,56,55,43,3z,6p,1x,69,4Q,4g,4f,4R,6a,3J,6c,3K,2k,4T,4S,2l,3L,6b,4O,4e,3I,67,68,3H,4d,4P,4b,4N,66,3F,3G,65,2t,4c,44,2q,6e,2c,3M,6d,2p,45,4J,47,2d,6f,2F,3N,46,4K,6j,3Q,2j,4M,2s,4a,3R,6i,3P,6g,4L,49,48,2r,6h,3O,1J,58,5H,1X,3r,5G,57,4u,5a,4w,2L,5I,5J,1Y,4v,5b,5M,25,4z,5d,2y,4A,3t,2D,3s,5K,2x,4y,4x,5c,5L,1Z,3o,5C,5i,4G,4F,5j,5D,3n,5F,3p,4H,2z,5k,4I,3q,5E,5g,4E,3m,2C,5B,3l,4D,5h,4B,5f,5A,3k,1W,2B,5e,4C,5u,4r,1S,5P,5Q,1R,2m,5v,4p,5t,5O,1P,1Q,5N,5s,4q,3c,5R,5w,2o,2n,5x,5S,3b,2E,3d,4s,5z,5y,4t,3e,5T,62,3i,4n,5r,2A,4o,3j,61,1V,5Y,5p,4m,4l,5q,5Z,1U,4h,5m,5V,3f,3g,5U,5l,4i,5n,4k,1T,5W,5X,3h,4j,5o],aG:[6x,5J,50,5b,3E,2L,3X,4w,3V,1J,3D,1X,4Y,57,6u,5G,4W,2y,2H,2D,3T,4z,28,25,3B,3s,3S,4y,6s,5L,4V,5c,3y,1W,2h,4C,2G,5A,2w,5f,55,5g,6p,2C,2i,4D,27,3l,3Y,4F,3u,3n,51,5i,6k,5C,6n,5F,53,2z,3w,3q,41,4I,44,4l,2c,1U,2p,5p,6d,5Y,2F,62,4K,5r,2d,3j,47,4o,3P,3g,49,4i,6h,5V,2r,5m,2s,5n,6i,5W,2j,4j,3Q,3h,4O,5y,67,5T,4d,4s,3H,3d,3G,3c,4c,2o,66,5S,4N,5x,6c,5Q,4T,5v,3L,1S,2l,4r,4f,4p,3J,1P,4Q,5s,69,5N,5u,4S,5P,6b,2m,2k,1R,3K,1Q,1x,4q,4g,5O,6a,5t,4R,2E,68,5z,4P,3e,3I,4t,4e,2n,4b,3b,3F,5w,2t,5R,65,4h,48,3f,3O,5l,4L,5U,6g,5X,6j,5o,4M,1T,3R,4k,4a,1V,3M,4m,45,5Z,6e,5q,2q,2A,4J,61,6f,4n,46,3i,3N,3o,3v,4G,2g,5D,6l,5j,52,5k,2v,5E,6m,4H,3Z,3p,26,4B,42,3k,3x,5e,54,2B,6o,5B,6q,5h,56,3m,3z,4E,43,5M,6t,5d,4X,3t,3C,4A,3U,4x,2e,1Z,3A,2x,4U,5K,6r,5a,2u,5I,6w,4v,2f,1Y,2b,3r,2a,4u,3W,5H,6v,58,4Z],aF:[6x,4w,6u,1J,6s,4y,2H,4z,6n,4I,6k,4F,2G,4C,6p,4D,6c,4r,69,4p,66,2o,67,4s,2F,4o,6d,4l,6h,4i,6i,4j,5M,3U,5K,2e,5H,3W,5I,2f,5B,43,2B,42,5D,2g,5E,3Z,2E,4e,5R,4b,5O,4g,5P,2k,5X,4a,5U,48,5Z,45,61,46,56,3m,54,3k,52,3o,2v,3p,4X,3t,4U,1Z,4Z,3r,2u,1Y,4M,1T,4L,3f,2q,1V,4J,3i,4P,3e,2t,3b,4R,1Q,4S,1R,2z,3w,5i,3u,5f,3y,5g,27,5b,3E,57,3D,5c,3B,2y,28,5r,2d,5p,2c,5m,3P,5n,3Q,5v,3L,5s,3J,5x,3G,5y,3H,3R,5o,3O,5l,3M,5q,3N,2A,3I,5z,3F,5w,1x,5t,3K,5u,3z,5h,3x,5e,3v,5j,26,5k,3C,5d,3A,2x,2a,58,2b,5a,3j,4K,1U,2p,3g,2r,3h,2s,1S,4T,1P,4Q,3c,4N,3d,4O,3q,53,3n,51,1W,2w,3l,55,2L,50,1X,4Y,3s,4V,25,4W,2l,5Q,4f,5N,4c,5S,4d,5T,47,62,44,5Y,49,5V,2j,5W,3X,5J,3V,5G,3S,5L,3T,2D,41,5F,3Y,5C,2h,5A,2i,2C,4t,68,2n,65,4q,6a,2m,6b,4k,6j,4h,6g,4m,6e,4n,6f,4A,6t,4x,6r,4u,6v,4v,6w,4E,6q,4B,6o,4G,6l,4H,6m],aE:[6x,5a,3W,1X,4U,5L,28,4A,3v,4F,53,5E,2i,3m,6o,5f,4b,3c,67,5z,3L,2m,4R,5N,2s,5X,3O,4i,6e,5p,47,3i,5g,6q,3k,2h,5D,51,4I,26,4x,3B,2D,4X,2L,2f,58,6u,1V,44,5r,6f,4j,3R,5U,2r,5Q,4S,4q,3J,5w,66,3d,4e,49,3f,6j,5n,3N,4o,2p,5Z,4P,5T,3G,2n,69,5t,2k,1S,6m,2z,3Y,3o,2w,2B,3z,4D,3D,4u,2u,5J,3U,25,6s,2x,1P,4g,5u,6c,4t,3H,5S,2t,61,4K,4l,3M,5m,6g,1T,2j,5d,2H,3s,2e,5G,4Z,4v,3E,4C,3x,5B,55,3p,41,5i,6l,5l,6h,3h,4a,62,4J,4m,2c,4s,3I,5R,4N,1Q,4f,5v,6b,3q,3Z,5j,6k,4B,3y,2C,56,5H,4Y,4w,2b,2y,6t,1Z,3S,6a,5s,2l,1R,4O,2E,3F,2o,2d,4n,2q,5Y,48,3g,6i,5o,3T,3t,6r,5c,2a,1J,50,5I,54,5A,27,4E,6n,5k,2g,3n,1Y,3X,57,6v,4y,3A,5M,4W,5C,52,4H,3w,5h,6p,1W,42,5x,65,3e,4d,5P,4T,4p,1x,4k,3Q,5V,4L,1U,45,2A,2F,43,3l,2G,5e,3u,4G,2v,5F,4V,5K,3C,4z,6w,5b,3V,3r,6d,5q,46,3j,4M,5W,3P,4h,3K,4r,4Q,5O,4c,3b,68,5y],aD:[6x,5I,4Z,57,3C,25,3S,4x,42,4C,27,3m,51,5j,6m,5F,4J,5r,6d,5Z,2j,4k,3O,3g,3G,3b,4e,4s,6a,5N,4T,5u,3c,3F,4t,4d,5O,69,5v,4S,2A,4K,5Y,6e,4j,4a,3f,3P,4B,2h,3l,3z,5i,52,5E,6n,5J,6w,58,4Y,3t,28,4y,2e,3k,3y,4D,43,5C,6l,5k,53,5b,2u,5H,6u,4A,3T,3s,3A,2o,4b,3e,3H,5t,4Q,5Q,6b,61,2F,5p,2q,3h,3R,4h,49,6f,62,2p,5q,3Q,1T,48,4i,4c,2n,3I,3d,4R,5s,6c,5P,50,5a,6v,5G,3U,4z,3B,1Z,3x,1W,2i,4E,6k,5D,2v,2z,3N,3j,44,4m,6i,5X,4L,5m,4N,5w,68,5T,4g,4p,3L,1R,3X,4v,2a,1X,4X,2y,6s,5K,6o,5A,55,5h,3u,3o,3Z,4I,2B,2G,5g,56,3n,3v,4H,41,4w,2f,3r,3D,5d,4W,5L,6r,5x,2t,2E,67,4q,4f,1S,3K,3i,2d,4l,45,5W,6j,5l,2r,5S,65,5z,4O,1Q,3J,4r,2k,4n,47,1U,3M,5n,4M,5U,6h,5e,2w,2C,6q,4F,2g,3p,3w,2L,2b,4u,3V,5M,2H,5c,4U,3E,1Y,3W,1J,6t,2D,4V,2x,54,5f,6p,5B,3Y,4G,26,3q,46,4o,2c,1V,2s,5o,6g,5V,66,5R,4P,5y,1x,1P,2l,2m],aC:[6x,6w,6v,6u,6t,2H,6s,6r,6q,6p,2G,6o,6n,6m,6l,6k,6j,6i,6h,6g,2F,6f,6e,6d,6c,6b,6a,69,68,67,66,65,62,61,5Z,5Y,5X,5W,5V,5U,2E,5T,5S,5R,5Q,5P,5O,5N,5M,2D,5L,5K,5J,5I,5H,5G,5F,5E,5D,5C,5B,2C,5A,2B,5z,5y,5x,5w,5v,5u,5t,5s,5r,2A,5q,5p,5o,5n,5m,5l,2z,5k,5j,5i,5h,5g,5f,5e,5d,2y,5c,2x,5b,5a,58,57,56,55,2w,54,53,2v,52,51,50,2u,4Z,4Y,4X,4W,4V,4U,4T,4S,4R,4Q,4P,4O,4N,2t,4M,2s,2r,4L,4K,4J,2q,2p,4I,4H,4G,4F,4E,4D,4C,4B,4A,4z,4y,4x,4w,4v,4u,1J,4t,4s,2o,2n,4r,2m,4q,4p,4o,4n,4m,4l,4k,4j,4i,4h,2l,2k,4g,4f,4e,4d,4c,4b,4a,2j,49,48,47,46,45,44,43,2i,2h,42,41,3Z,2g,3Y,3X,2f,3W,3V,3U,3T,3S,2e,3R,3Q,3P,3O,2d,3N,3M,2c,3L,3K,1x,3J,3I,3H,3G,3F,3E,2b,2a,3D,3C,28,3B,3A,3z,27,3y,3x,3w,26,3v,3u,3t,25,3s,1Z,2L,1Y,3r,1X,3q,3p,3o,3n,3m,3l,1W,3k,3j,3i,1V,1U,1T,3h,3g,3f,3e,3d,3c,3b,1S,1R,1Q,1P],8V:1e(1K,8W){1K=1a.8Y(1K);1c(18 i=0;i<4;++i)1K[i]=1a.7K[1K[i]];1K[0]=1K[0]^1a.8X[8W];1d 1K},85:1e(1k,1g){18 89=(16*(1a.7I(1g)+1));18 34=0;18 8U=1;18 t=[];18 1m=[];1c(18 i=0;i<89;i++)1m[i]=0;1c(18 j=0;j<1g;j++)1m[j]=1k[j];34+=1g;7r(34<89){1c(18 k=0;k<4;k++)t[k]=1m[(34-4)+k];1f(34%1g==0)t=1a.8V(t,8U++);1f(1g==1a.7j.86&&((34%1g)==16))1c(18 l=0;l<4;l++)t[l]=1a.7K[t[l]];1c(18 m=0;m<4;m++){1m[34]=1m[34-1g]^t[m];34++}}1d 1m},6D:1e(1b,31){1c(18 i=0;i<16;i++)1b[i]^=31[i];1d 1b},6C:1e(1m,8T){18 31=[];1c(18 i=0;i<4;i++)1c(18 j=0;j<4;j++)31[j*4+i]=1m[8T+i*4+j];1d 31},7k:1e(1b,2V){1c(18 i=0;i<16;i++)1b[i]=2V?1a.8S[1b[i]]:1a.7K[1b[i]];1d 1b},7l:1e(1b,2V){1c(18 i=0;i<4;i++)1b=1a.8R(1b,i*4,i,2V);1d 1b},8R:1e(1b,33,8Q,2V){1c(18 i=0;i<8Q;i++){1f(2V){18 7J=1b[33+3];1c(18 j=3;j>0;j--)1b[33+j]=1b[33+j-1];1b[33]=7J}1n{18 7J=1b[33];1c(18 j=0;j<3;j++)1b[33+j]=1b[33+j+1];1b[33+3]=7J}}1d 1b},1z:1e(a,b){18 p=0;1c(18 88=0;88<8;88++){1f((b&1)==1)p^=a;1f(p>3a)p^=3a;18 8P=(a&1x);a<<=1;1f(a>3a)a^=3a;1f(8P==1x)a^=1J;1f(a>3a)a^=3a;b>>=1;1f(b>3a)b^=3a;}1d p},87:1e(1b,2V){18 2J=[];1c(18 i=0;i<4;i++){1c(18 j=0;j<4;j++)2J[j]=1b[(j*4)+i];2J=1a.8O(2J,2V);1c(18 k=0;k<4;k++)1b[(k*4)+i]=2J[k]}1d 1b},8O:1e(2J,2V){18 1q=[];1f(2V)1q=[14,9,13,11];1n 1q=[2,1,1,3];18 1s=[];1c(18 i=0;i<4;i++)1s[i]=2J[i];2J[0]=1a.1z(1s[0],1q[0])^1a.1z(1s[3],1q[1])^1a.1z(1s[2],1q[2])^1a.1z(1s[1],1q[3]);2J[1]=1a.1z(1s[1],1q[0])^1a.1z(1s[0],1q[1])^1a.1z(1s[3],1q[2])^1a.1z(1s[2],1q[3]);2J[2]=1a.1z(1s[2],1q[0])^1a.1z(1s[1],1q[1])^1a.1z(1s[0],1q[2])^1a.1z(1s[3],1q[3]);2J[3]=1a.1z(1s[3],1q[0])^1a.1z(1s[2],1q[1])^1a.1z(1s[1],1q[2])^1a.1z(1s[0],1q[3]);1d 2J},8N:1e(1b,31){1b=1a.7k(1b,2N);1b=1a.7l(1b,2N);1b=1a.87(1b,2N);1b=1a.6D(1b,31);1d 1b},8M:1e(1b,31){1b=1a.7l(1b,37);1b=1a.7k(1b,37);1b=1a.6D(1b,31);1b=1a.87(1b,37);1d 1b},8J:1e(1b,1m,1D){1b=1a.6D(1b,1a.6C(1m,0));1c(18 i=1;i<1D;i++)1b=1a.8N(1b,1a.6C(1m,16*i));1b=1a.7k(1b,2N);1b=1a.7l(1b,2N);1b=1a.6D(1b,1a.6C(1m,16*1D));1d 1b},8I:1e(1b,1m,1D){1b=1a.6D(1b,1a.6C(1m,16*1D));1c(18 i=1D-1;i>0;i--)1b=1a.8M(1b,1a.6C(1m,16*i));1b=1a.7l(1b,37);1b=1a.7k(1b,37);1b=1a.6D(1b,1a.6C(1m,0));1d 1b},7I:1e(1g){18 1D;8m(1g){6A 1a.7j.8L:1D=10;36;6A 1a.7j.8K:1D=12;36;6A 1a.7j.86:1D=14;36;aB:1d 2Y;36}1d 1D},2P:1e(1r,1k,1g){18 1j=[];18 2U=[];18 1D=1a.7I(1g);1c(18 i=0;i<4;i++)1c(18 j=0;j<4;j++)2U[(i+(j*4))]=1r[(i*4)+j];18 1m=1a.85(1k,1g);2U=1a.8J(2U,1m,1D);1c(18 k=0;k<4;k++)1c(18 l=0;l<4;l++)1j[(k*4)+l]=2U[(k+(l*4))];1d 1j},81:1e(1r,1k,1g){18 1j=[];18 2U=[];18 1D=1a.7I(1g);1c(18 i=0;i<4;i++)1c(18 j=0;j<4;j++)2U[(i+(j*4))]=1r[(i*4)+j];18 1m=1a.85(1k,1g);2U=1a.8I(2U,1m,1D);1c(18 k=0;k<4;k++)1c(18 l=0;l<4;l++)1j[(k*4)+l]=2U[(k+(l*4))];1d 1j}},38:{82:0,83:1,7H:2},84:1e(2Z,1G,1C,1I){1f(1C-1G>16)1C=1G+16;18 2M=2Z.7B(1G,1C);1f(1I==1a.38.7H){18 8H=16-2M.1h;7r(2M.1h<16){2M.1o(8H)}}1d 2M},2P:1e(2Z,1I,1k,1g,2I){1f(1k.1h%1g){6B\'8G 1h 8F 8E 8D 8C 1g.\'}1f(2I.1h%16){6B\'2I 1h 8B 8A 2Q 8z.\'}18 1p=[];18 1r=[];18 1j=[];18 1B=[];18 7i=[];18 1H=37;1f(2Z!==2Y){1c(18 j=0;j<6I.7A(2Z.1h/16);j++){18 1G=j*16;18 1C=j*16+16;1f(j*16+16>2Z.1h)1C=2Z.1h;1p=1a.84(2Z,1G,1C,1I);1f(1I==1a.38.83){1f(1H){1j=1a.2O.2P(2I,1k,1g);1H=2N}1n 1j=1a.2O.2P(1r,1k,1g);1c(18 i=0;i<16;i++)1B[i]=1p[i]^1j[i];1c(18 k=0;k<1C-1G;k++)7i.1o(1B[k]);1r=1B}1n 1f(1I==1a.38.82){1f(1H){1j=1a.2O.2P(2I,1k,1g);1H=2N}1n 1j=1a.2O.2P(1r,1k,1g);1c(18 i=0;i<16;i++)1B[i]=1p[i]^1j[i];1c(18 k=0;k<1C-1G;k++)7i.1o(1B[k]);1r=1j}1n 1f(1I==1a.38.7H){1c(18 i=0;i<16;i++)1r[i]=1p[i]^((1H)?2I[i]:1B[i]);1H=2N;1B=1a.2O.2P(1r,1k,1g);1c(18 k=0;k<16;k++)7i.1o(1B[k])}}}1d{1I:1I,7G:2Z.1h,aA:7i}},81:1e(6L,7G,1I,1k,1g,2I){1f(1k.1h%1g){6B\'8G 1h 8F 8E 8D 8C 1g.\';1d 2Y}1f(2I.1h%16){6B\'2I 1h 8B 8A 2Q 8z.\'}18 1B=[];18 1r=[];18 1j=[];18 1p=[];18 6K=[];18 1H=37;1f(6L!==2Y){1c(18 j=0;j<6I.7A(6L.1h/16);j++){18 1G=j*16;18 1C=j*16+16;1f(j*16+16>6L.1h)1C=6L.1h;1B=1a.84(6L,1G,1C,1I);1f(1I==1a.38.83){1f(1H){1j=1a.2O.2P(2I,1k,1g);1H=2N}1n 1j=1a.2O.2P(1r,1k,1g);1c(i=0;i<16;i++)1p[i]=1j[i]^1B[i];1c(18 k=0;k<1C-1G;k++)6K.1o(1p[k]);1r=1B}1n 1f(1I==1a.38.82){1f(1H){1j=1a.2O.2P(2I,1k,1g);1H=2N}1n 1j=1a.2O.2P(1r,1k,1g);1c(i=0;i<16;i++)1p[i]=1j[i]^1B[i];1c(18 k=0;k<1C-1G;k++)6K.1o(1p[k]);1r=1j}1n 1f(1I==1a.38.7H){1j=1a.2O.81(1B,1k,1g);1c(i=0;i<16;i++)1p[i]=((1H)?2I[i]:1r[i])^1j[i];1H=2N;1f(7G<1C)1c(18 k=0;k<7G-1G;k++)6K.1o(1p[k]);1n 1c(18 k=0;k<1C-1G;k++)6K.1o(1p[k]);1r=1B}}}1d 6K}};18 7x={8y:1e(s){8x{1d az(ay(s))}8w(e){6B\'7Y 7X 8v ax: 7x.8y.\'}},8u:1e(s){8x{1d aw(av(s))}8w(e){6B(\'7Y 7X 8v 8q: 7x.8u.\')}},au:1e(){18 2M=[];1f(7F.1h==1&&7F[0].as==73)2M=7F[0];1n 2M=7F;18 6J=\'\';1c(18 i=0;i<2M.1h;i++)6J+=(2M[i]<16?\'0\':\'\')+2M[i].74(16);1d 6J.7L()},ar:1e(s){18 6J=[];s.7n(/(..)/g,1e(s){6J.1o(aq(s,16))});1d 6J},8t:1e(7D,7E){1f(7D===2Y)7D=0;1f(7E===2Y)7E=1;1d 6I.ap(6I.ao()*(7E+1))+7D},an:1e(7C){1f(7C===2Y)7C=16;18 1k=[];1c(18 i=0;i<7C*2;i++)1k.1o(1a.8t(0,8j));1d 1k},am:1e(s,1g){18 8s=al.ak.aj(s);1d 8s.7B(0,1g)},ai:1e(s){18 1p=[];1c(18 i=0;i<s.1h;i++){1p.1o(s.1E(i))}1d 1p},ah:1e(1p){18 s=\'\';1c(18 i=0;i<1p.1h;i++){s+=1N.1M(1p[i])}1d s},7W:{2X:[\'A\',\'B\',\'C\',\'D\',\'E\',\'F\',\'G\',\'H\',\'I\',\'J\',\'K\',\'L\',\'M\',\'N\',\'O\',\'P\',\'Q\',\'R\',\'S\',\'T\',\'U\',\'V\',\'W\',\'X\',\'Y\',\'Z\',\'a\',\'b\',\'c\',\'d\',\'e\',\'f\',\'g\',\'h\',\'i\',\'j\',\'k\',\'l\',\'m\',\'n\',\'o\',\'p\',\'q\',\'r\',\'s\',\'t\',\'u\',\'v\',\'w\',\'x\',\'y\',\'z\',\'0\',\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\'+\',\'/\',\'=\'],8r:1e(1y){18 1O=\'\';1c(18 i=0;i<1y.1h;i+=3){1O+=1a.2X[1y[i]>>2];1O+=1a.2X[((1y[i]&3)<<4)|(1y[i+1]>>4)];1f(!(1y[i+1]===2Y)){1O+=1a.2X[((1y[i+1]&15)<<2)|(1y[i+2]>>6)]}1n{1O+=\'=\'}1f(!(1y[i+2]===2Y)){1O+=1a.2X[1y[i+2]&63]}1n{1O+=\'=\'}}1d 1O},ag:1e(1y){18 1O=1a.8r(1y);18 7Z=1O.7B(0,64)+\'\\n\';1c(18 i=1;i<(6I.7A(1O.1h/64));i++){7Z+=1O.7B(i*64,i*64+64)+(6I.7A(1O.1h/64)==i+1?\'\':\'\\n\')}1d 7Z},8p:1e(1i){1i=1i.7n(/[\\r\\n\\t ]+/g,\'\')+\'====\';18 1y=[];18 c=[];1c(18 i=0;37;i=i+4){c[0]=1a.2X.7z(1i.7y(i));1f(c[0]==64){1d 1y}c[1]=1a.2X.7z(1i.7y(i+1));c[2]=1a.2X.7z(1i.7y(i+2));c[3]=1a.2X.7z(1i.7y(i+3));1f((c[0]<0)||(c[1]<0)||(c[1]==64)||(c[2]<0)||(c[3]<0)){6B\'7Y 7X 7W 8q at af \'+i+\': 7x.7W.8p.\'}1y.1o((c[0]<<2)|(c[1]>>4));1f(c[2]>=0&&c[2]<64){1y.1o(((c[1]&15)<<4)|(c[2]>>2));1f(c[3]>=0&&c[2]<64){1y.1o(((c[2]&3)<<6)|c[3])}}}}}};1e ae(1F){1e 2T(n,s){18 8o=(n<<s)|(n>>>(32-s));1d 8o};1e ad(7h){18 6H="";18 i;18 7V;18 7U;1c(i=0;i<=6;i+=2){7V=(7h>>>(i*4+4))&2L;7U=(7h>>>(i*4))&2L;6H+=7V.74(16)+7U.74(16)}1d 6H};1e 6G(7h){18 6H="";18 i;18 v;1c(i=7;i>=0;i--){v=(7h>>>(i*4))&2L;6H+=v.74(16)}1d 6H};1e 7m(1i){1i=1i.7n(/\\r\\n/g,"\\n");18 1A="";1c(18 n=0;n<1i.1h;n++){18 c=1i.1E(n);1f(c<2Q){1A+=1N.1M(c)}1n 1f((c>8i)&&(c<8h)){1A+=1N.1M((c>>6)|8g);1A+=1N.1M((c&63)|2Q)}1n{1A+=1N.1M((c>>12)|8f);1A+=1N.1M(((c>>6)&63)|2Q);1A+=1N.1M((c&63)|2Q)}}1d 1A};18 7g;18 i,j;18 W=8n 73(80);18 7f=8d;18 7e=8c;18 7d=8b;18 7c=8a;18 7b=ab;18 A,B,C,D,E;18 1L;1F=7m(1F);18 2K=1F.1h;18 2W=8n 73();1c(i=0;i<2K-3;i+=4){j=1F.1E(i)<<24|1F.1E(i+1)<<16|1F.1E(i+2)<<8|1F.1E(i+3);2W.1o(j)}8m(2K%4){6A 0:i=aa;36;6A 1:i=1F.1E(2K-1)<<24|a9;36;6A 2:i=1F.1E(2K-2)<<24|1F.1E(2K-1)<<16|a8;36;6A 3:i=1F.1E(2K-3)<<24|1F.1E(2K-2)<<16|1F.1E(2K-1)<<8|1x;36}2W.1o(i);7r((2W.1h%16)!=14)2W.1o(0);2W.1o(2K>>>29);2W.1o((2K<<3)&2S);1c(7g=0;7g<2W.1h;7g+=16){1c(i=0;i<16;i++)W[i]=2W[7g+i];1c(i=16;i<=79;i++)W[i]=2T(W[i-3]^W[i-8]^W[i-14]^W[i-16],1);A=7f;B=7e;C=7d;D=7c;E=7b;1c(i=0;i<=19;i++){1L=(2T(A,5)+((B&C)|(~B&D))+E+W[i]+a7)&2S;E=D;D=C;C=2T(B,30);B=A;A=1L}1c(i=20;i<=39;i++){1L=(2T(A,5)+(B^C^D)+E+W[i]+a6)&2S;E=D;D=C;C=2T(B,30);B=A;A=1L}1c(i=40;i<=59;i++){1L=(2T(A,5)+((B&C)|(B&D)|(C&D))+E+W[i]+a5)&2S;E=D;D=C;C=2T(B,30);B=A;A=1L}1c(i=60;i<=79;i++){1L=(2T(A,5)+(B^C^D)+E+W[i]+a4)&2S;E=D;D=C;C=2T(B,30);B=A;A=1L}7f=(7f+A)&2S;7e=(7e+B)&2S;7d=(7d+C)&2S;7c=(7c+D)&2S;7b=(7b+E)&2S}18 1L=6G(7f)+6G(7e)+6G(7d)+6G(7c)+6G(7b);1d 1L.7L()}18 a3=1e(1i){1e 7a(76,7T){1d(76<<7T)|(76>>>(32-7T))}1e 1l(7w,7v){18 7u,7t,6F,6E,6z;6F=(7w&7S);6E=(7v&7S);7u=(7w&7s);7t=(7v&7s);6z=(7w&8l)+(7v&8l);1f(7u&7t){1d(6z^7S^6F^6E)}1f(7u|7t){1f(6z&7s){1d(6z^a2^6F^6E)}1n{1d(6z^7s^6F^6E)}}1n{1d(6z^6F^6E)}}1e F(x,y,z){1d(x&y)|((~x)&z)}1e G(x,y,z){1d(x&z)|(y&(~z))}1e H(x,y,z){1d(x^y^z)}1e I(x,y,z){1d(y^(x|(~z)))}1e 1w(a,b,c,d,x,s,ac){a=1l(a,1l(1l(F(b,c,d),x),ac));1d 1l(7a(a,s),b)};1e 1v(a,b,c,d,x,s,ac){a=1l(a,1l(1l(G(b,c,d),x),ac));1d 1l(7a(a,s),b)};1e 1u(a,b,c,d,x,s,ac){a=1l(a,1l(1l(H(b,c,d),x),ac));1d 1l(7a(a,s),b)};1e 1t(a,b,c,d,x,s,ac){a=1l(a,1l(1l(I(b,c,d),x),ac));1d 1l(7a(a,s),b)};1e 8e(1i){18 6y;18 77=1i.1h;18 7R=77+8;18 8k=(7R-(7R%64))/64;18 7q=(8k+1)*16;18 35=73(7q-1);18 78=0;18 2R=0;7r(2R<77){6y=(2R-(2R%4))/4;78=(2R%4)*8;35[6y]=(35[6y]|(1i.1E(2R)<<78));2R++}6y=(2R-(2R%4))/4;78=(2R%4)*8;35[6y]=35[6y]|(1x<<78);35[7q-2]=77<<3;35[7q-1]=77>>>29;1d 35};1e 6M(76){18 7o="",7p="",7Q,75;1c(75=0;75<=3;75++){7Q=(76>>>(75*8))&8j;7p="0"+7Q.74(16);7o=7o+7p.a1(7p.1h-2,2)}1d 7o};1e 7m(1i){1i=1i.7n(/\\r\\n/g,"\\n");18 1A="";1c(18 n=0;n<1i.1h;n++){18 c=1i.1E(n);1f(c<2Q){1A+=1N.1M(c)}1n 1f((c>8i)&&(c<8h)){1A+=1N.1M((c>>6)|8g);1A+=1N.1M((c&63)|2Q)}1n{1A+=1N.1M((c>>12)|8f);1A+=1N.1M(((c>>6)&63)|2Q);1A+=1N.1M((c&63)|2Q)}}1d 1A};18 x=73();18 k,7P,7O,7N,7M,a,b,c,d;18 72=7,71=12,70=17,6Z=22;18 6Y=5,6X=9,6W=14,6V=20;18 6U=4,6T=11,6S=16,6R=23;18 6Q=6,6P=10,6O=15,6N=21;1i=7m(1i);x=8e(1i);a=8d;b=8c;c=8b;d=8a;1c(k=0;k<x.1h;k+=16){7P=a;7O=b;7N=c;7M=d;a=1w(a,b,c,d,x[k+0],72,a0);d=1w(d,a,b,c,x[k+1],71,9Z);c=1w(c,d,a,b,x[k+2],70,9Y);b=1w(b,c,d,a,x[k+3],6Z,9X);a=1w(a,b,c,d,x[k+4],72,9W);d=1w(d,a,b,c,x[k+5],71,9V);c=1w(c,d,a,b,x[k+6],70,9U);b=1w(b,c,d,a,x[k+7],6Z,9T);a=1w(a,b,c,d,x[k+8],72,9S);d=1w(d,a,b,c,x[k+9],71,9R);c=1w(c,d,a,b,x[k+10],70,9Q);b=1w(b,c,d,a,x[k+11],6Z,9P);a=1w(a,b,c,d,x[k+12],72,9O);d=1w(d,a,b,c,x[k+13],71,9N);c=1w(c,d,a,b,x[k+14],70,9M);b=1w(b,c,d,a,x[k+15],6Z,9L);a=1v(a,b,c,d,x[k+1],6Y,9K);d=1v(d,a,b,c,x[k+6],6X,9J);c=1v(c,d,a,b,x[k+11],6W,9I);b=1v(b,c,d,a,x[k+0],6V,9H);a=1v(a,b,c,d,x[k+5],6Y,9G);d=1v(d,a,b,c,x[k+10],6X,9F);c=1v(c,d,a,b,x[k+15],6W,9E);b=1v(b,c,d,a,x[k+4],6V,9D);a=1v(a,b,c,d,x[k+9],6Y,9C);d=1v(d,a,b,c,x[k+14],6X,9B);c=1v(c,d,a,b,x[k+3],6W,9A);b=1v(b,c,d,a,x[k+8],6V,9z);a=1v(a,b,c,d,x[k+13],6Y,9y);d=1v(d,a,b,c,x[k+2],6X,9x);c=1v(c,d,a,b,x[k+7],6W,9w);b=1v(b,c,d,a,x[k+12],6V,9v);a=1u(a,b,c,d,x[k+5],6U,9u);d=1u(d,a,b,c,x[k+8],6T,9t);c=1u(c,d,a,b,x[k+11],6S,9s);b=1u(b,c,d,a,x[k+14],6R,9r);a=1u(a,b,c,d,x[k+1],6U,9q);d=1u(d,a,b,c,x[k+4],6T,9p);c=1u(c,d,a,b,x[k+7],6S,9o);b=1u(b,c,d,a,x[k+10],6R,9n);a=1u(a,b,c,d,x[k+13],6U,9m);d=1u(d,a,b,c,x[k+0],6T,9l);c=1u(c,d,a,b,x[k+3],6S,9k);b=1u(b,c,d,a,x[k+6],6R,9j);a=1u(a,b,c,d,x[k+9],6U,9i);d=1u(d,a,b,c,x[k+12],6T,9h);c=1u(c,d,a,b,x[k+15],6S,9g);b=1u(b,c,d,a,x[k+2],6R,9f);a=1t(a,b,c,d,x[k+0],6Q,9e);d=1t(d,a,b,c,x[k+7],6P,9d);c=1t(c,d,a,b,x[k+14],6O,9c);b=1t(b,c,d,a,x[k+5],6N,9b);a=1t(a,b,c,d,x[k+12],6Q,9a);d=1t(d,a,b,c,x[k+3],6P,99);c=1t(c,d,a,b,x[k+10],6O,98);b=1t(b,c,d,a,x[k+1],6N,97);a=1t(a,b,c,d,x[k+8],6Q,96);d=1t(d,a,b,c,x[k+15],6P,95);c=1t(c,d,a,b,x[k+6],6O,94);b=1t(b,c,d,a,x[k+13],6N,93);a=1t(a,b,c,d,x[k+4],6Q,92);d=1t(d,a,b,c,x[k+11],6P,91);c=1t(c,d,a,b,x[k+2],6O,90);b=1t(b,c,d,a,x[k+9],6N,8Z);a=1l(a,7P);b=1l(b,7O);c=1l(c,7N);d=1l(d,7M)}18 1L=6M(a)+6M(b)+6M(c)+6M(d);1d 1L.7L()}',62,665,'||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||var||this|state|for|return|function|if|size|length|string|output|key|AddUnsigned|expandedKey|else|push|byteArray|mult|input|cpy|II|HH|GG|FF|0x80|flatArr|galois_multiplication|utftext|ciphertext|end|nbrRounds|charCodeAt|msg|start|firstRound|mode|0x1b|word|temp|fromCharCode|String|b64|0x8d|0x83|0x91|0x9f|0xef|0xc5|0xcb|0x63|0x1d|0x01|0x25||||||0x39|0x4a|0x72|0x3a||0x10|0x02|0xc6|0xd4|0x20|0x04|0x5e|0x66|0x74|0xe4|0x94|0x9a|0x97|0xb3|0xbd|0xcc|0xc2|0xfa|0xe8|0xbc|0x08|0x40|0x6a|0x2f|0x33|0x4d|0xd3|0x61|0x7d|0x35|0xab|0xd8|0x6c|0x36|iv|column|msg_len|0x0f|array|false|aes|encrypt|128|lByteCount|0x0ffffffff|rotate_left|block|isInv|word_array|chars|null|bytesIn||roundKey||statePointer|currentSize|lWordArray|break|true|modeOfOperation||0x100|0xb5|0xbb|0xa9|0xa7|0xfd|0xf3|0xe1|0xd9|0xd7|0x6d|0x71|0x7f|0x55|0x5b|0x49|0x47|0x13|0x2b|0x37|0x56|0x58|0x44|0x6e|0x60|0x7c|0x26|0x28|0x34|0x1e|0x0c|0xb6|0xb8|0xaa|0xa4|0x8e|0x92|0x9c|0xc8|0xda|0xfe|0xf0|0xe2|0xec|0x2e|0x3c|0x32|0x18|0x16|0x0a|0x50|0x4c||0x42|0x68|0x7a|0xc0|0xce|0xdc|0xd2|0xf8|0xf6|0xea|0xb0|0xbe|0xac|0xa2|0x88|0x86|0xfb|0xf5|0xe7|0xe9|0xc3|0xcd|0xdf|0xd1|0x8b|0x85|0x99|0xaf|0xa1|0x15|0x07|0x09|0x23|0x2d|0x3f|0x31|0x6b|0x65|0x77|0x79|0x53|0x5d|0x4f|0x41|0xd0|0xde|0xf4|0xe6|0xb2|0xa0|0xae|0x84|0x8a|0x98|0x96|0x2c|0x22|0x30|0x3e|0x14|0x1a|0x06|0x5c|0x52|0x4e|0x64|0x78|0x76|0x17|0x19||0x0b|0x05|0x21|0x3d|0x67|0x69|0x7b|0x75|0x5f|0x51|0x43|0xf7|0xf9|0xeb|0xe5|0xcf|0xc1|0xdd|0x87|0x89|0x9b|0x95|0xbf|0xb1|0xa3|0xad|0x6f|0x73|0x59|0x57|0x45|0x4b|0x11|0x1f|0x0d|0x03|0x29|0x27|0x3b|0x81|0x8f|0x9d|0x93|0xb9|0xb7|0xa5|0xf1|0xff|0xed|0xe3|0xc9|0xc7||0xd5|0xdb|||0xba|0xb4|0xa6|0xa8|0x82|0x8c|0x9e|0x90|0xca|0xc4|0xd6|0xf2|0xfc|0xee|0xe0|0x5a|0x54|0x46|0x48|0x62|0x7e|0x70|0x2a|0x24|0x38|0x12|0x1c|0x0e|0x00|lWordCount|lResult|case|throw|createRoundKey|addRoundKey|lY8|lX8|cvt_hex|str|Math|ret|bytesOut|cipherIn|WordToHex|S44|S43|S42|S41|S34|S33|S32|S31|S24|S23|S22|S21|S14|S13|S12|S11|Array|toString|lCount|lValue|lMessageLength|lBytePosition||RotateLeft|H4|H3|H2|H1|H0|blockstart|val|cipherOut|keySize|subBytes|shiftRows|Utf8Encode|replace|WordToHexValue|WordToHexValue_temp|lNumberOfWords|while|0x40000000|lY4|lX4|lY|lX|cryptoHelpers|charAt|indexOf|ceil|slice|len|min|max|arguments|originalsize|CBC|numberOfRounds|tmp|sbox|toLowerCase|DD|CC|BB|AA|lByte|lNumberOfWords_temp1|0x80000000|iShiftBits|vl|vh|base64|during|error|broken_b64||decrypt|OFB|CFB|getPaddedBlock|expandKey|SIZE_256|mixColumns|counter|expandedKeySize|0x10325476|0x98BADCFE|0xEFCDAB89|0x67452301|ConvertToWordArray|224|192|2048|127|255|lNumberOfWords_temp2|0x3FFFFFFF|switch|new|t4|decode|decoding|encode_line|sha|getRandom|decode_utf8|utf8|catch|try|encode_utf8|bits|be|must|specified|match|not|does|Key|cpad|invMain|main|SIZE_192|SIZE_128|invRound|round|mixColumn|hi_bit_set|nbr|shiftRow|rsbox|roundKeyPointer|rconIteration|core|iteration|Rcon|rotate|0xEB86D391|0x2AD7D2BB|0xBD3AF235|0xF7537E82|0x4E0811A1|0xA3014314|0xFE2CE6E0|0x6FA87E4F|0x85845DD1|0xFFEFF47D|0x8F0CCC92|0x655B59C3|0xFC93A039|0xAB9423A7|0x432AFF97|0xF4292244|0xC4AC5665|0x1FA27CF8|0xE6DB99E5|0xD9D4D039|0x4881D05|0xD4EF3085|0xEAA127FA|0x289B7EC6|0xBEBFBC70|0xF6BB4B60|0x4BDECFA9|0xA4BEEA44|0xFDE5380C|0x6D9D6122|0x8771F681|0xFFFA3942|0x8D2A4C8A|0x676F02D9|0xFCEFA3F8|0xA9E3E905|0x455A14ED|0xF4D50D87|0xC33707D6|0x21E1CDE6|0xE7D3FBC8|0xD8A1E681|0x2441453|0xD62F105D|0xE9B6C7AA|0x265E5A51|0xC040B340|0xF61E2562|0x49B40821|0xA679438E|0xFD987193|0x6B901122|0x895CD7BE|0xFFFF5BB1|0x8B44F7AF|0x698098D8|0xFD469501|0xA8304613|0x4787C62A|0xF57C0FAF|0xC1BDCEEE|0x242070DB|0xE8C7B756|0xD76AA478|substr|0xC0000000|MD5|0xCA62C1D6|0x8F1BBCDC|0x6ED9EBA1|0x5A827999|0x08000|0x0800000|0x080000000|0xC3D2E1F0||lsb_hex|SHA1|pos|encode|convertByteArrayToString|convertStringToByteArray|arr_sha256|sha2|jsHash|generatePrivateKey|generateSharedKey|random|floor|parseInt|toNumbers|constructor||toHex|escape|decodeURIComponent|encoding|encodeURIComponent|unescape|cipher|default|GEX|GDX|GBX|G9X|G3X|G2X|slowAES'.split('|'),0,{}))
diff --git a/javascript/jsPacker/Pack.pm b/javascript/jsPacker/Pack.pm
deleted file mode 100644
index fbd2292..0000000
--- a/javascript/jsPacker/Pack.pm
+++ /dev/null
@@ -1,467 +0,0 @@
-#Pack (July 2005)
-# Based on "Pack.js" by Dean Edwards <http://dean.edwards.name/>
-# Ported to Perl by Rob Seiler, ELR Software Pty Ltd <http://www.elr.com.au>
-# Copyright 2005. License <http://creativecommons.org/licenses/LGPL/2.1/>
-
-package Pack;
-use strict;
-use Data::Dumper;
-
-use ParseMaster;
-
-# Package wide variable declarations
-use vars qw/$VERSION $PM_VERSION
- $_X_encodePrivate $_JSunpack $_JSdecode %baseLookup
- $_X_encode10 $_X_encode36 $_X_encode62 $_X_encode95
- $_JSencode10 $_JSencode36 $_JSencode62 $_JSencode95
- @_X_parsers
- $_X_script $_X_encoding $_X_fastDecode $_X_specialChars
- /;
-$VERSION = '024';
-$PM_VERSION = $ParseMaster::VERSION;
-
-# Package wide constants
-my $X_IGNORE = q{$1};
-my $X_ENCODE = q/\x24encode\(\x24count\)/; # NB: requires g modifier
-my $PERL = 'perl'; # Flag to indicate whether we need to use one of our "internal" Perl encoding functions
-my $JSCRIPT = 'jscript'; # or embed a pre-build JScript encoding function
-########################################
-
-##################
-sub pack($$$$) { # require 4 arguments
-##################
-#print Dumper(@_);
- ($_X_script, $_X_encoding, $_X_fastDecode, $_X_specialChars) = @_;
- # validate parameters (sort of!)
- $_X_script .= "\n";
- $_X_encoding = ($_X_encoding > 95) ? 95 : $_X_encoding;
-
- @_X_parsers = (); # Reset parsers
-
-####################
- sub _X_pack($) { # require 1 argument
-####################
- # apply all parsing routines
- my $X_script = shift;
- for (my $i = 0; $i<scalar(@_X_parsers); $i++) {
- my $X_parse = $_X_parsers[$i];
- $X_script = &$X_parse($X_script);
- }
- return $X_script;
- };
-
-######################
- sub _X_addParser { #
-######################
- # keep a list of parsing functions, they'll be executed all at once
- my $X_parser = shift;
- push (@_X_parsers,$X_parser);
- }
-
-#############################
- sub _X_basicCompression { #
-#############################
- # zero encoding - just removal of white space and comments
- my $X_script = shift;
- my $parser = ParseMaster->new();
- # make safe
- $parser->escapeChar("\\");
- # protect strings
- $parser->add(q/'[^'\n\r]*'/, $X_IGNORE);
- $parser->add(q/"[^"\n\r]*"/, $X_IGNORE);
- # remove comments
- $parser->add(q/\/\/[^\n\r]*[\n\r]/);
- $parser->add(q/\/\*[^*]*\*+([^\/][^*]*\*+)*\//);
- # protect regular expressions
- $parser->add(q/\s+(\/[^\/\n\r\*][^\/\n\r]*\/g?i?)/, q{$2}); # IGNORE
- $parser->add(q/[^\w\x24\/'"*)\?:]\/[^\/\n\r\*][^\/\n\r]*\/g?i?/, $X_IGNORE);
- # remove: ;;; doSomething();
- $parser->add(q/;;[^\n\r]+[\n\r]/) if ($_X_specialChars);
- # remove redundant semi-colons
- $parser->add(q/;+\s*([};])/, q{$2});
- # remove white-space
- $parser->add(q/(\b|\x24)\s+(\b|\x24)/, q{$2 $3});
- $parser->add(q/([+\-])\s+([+\-])/, q{$2 $3});
- $parser->add(q/\s+/, '');
- # done
- return $parser->exec($X_script);
- }
-
-###############################
- sub _X_encodeSpecialChars { #
-###############################
- my $X_script = shift;
- my $parser = ParseMaster->new();
- # replace: $name -> n, $$name -> $$na
- $parser->add(q/((\x24+)([a-zA-Z\x24_]+))(\d*)/,
- sub {
- my $X_offset = pop;
- my @X_match = @_;
- my $X_length = length($X_match[$X_offset+2]);
- my $lengthnext = length($X_match[$X_offset+3]);
- my $X_start = $X_length - ((($X_length - $lengthnext) > 0) ? ($X_length - $lengthnext) : 0);
- my $str = $X_match[$X_offset+1];
- $str = substr($str,$X_start,$X_length) . $X_match[$X_offset+4];
- return "$str";
- });
- # replace: _name -> _0, double-underscore (__name) is ignored
- my $X_regexp = q/\b_[A-Za-z\d]\w*/;
- # build the word list
- my %X_keywords = &_X_analyze($X_script, $X_regexp, $_X_encodePrivate);
-#print Dumper(%X_keywords);
- # quick ref
- my $X_encoded = \$X_keywords{X_encoded}; # eg _private1 => '_0',_private2 => '_1';
-#print Dumper($X_encoded);
- $parser->add($X_regexp, sub {my $X_offset = pop; my @X_match = @_; return ${$X_encoded}->{$X_match[$X_offset]};});
-
- return $parser->exec($X_script);
- };
-
-###########################
- sub _X_encodeKeywords { #
-###########################
- my $X_script = shift;
- # escape high-ascii values already in the script (i.e. in strings)
- if ($_X_encoding > 62) {$X_script = &_X_escape95($X_script)};
- # create the parser
- my $parser = ParseMaster->new();
- my $X_encode = &_X_getEncoder($_X_encoding,$PERL);
- # for high-ascii, don't encode single character low-ascii
- my $X_regexp = ($_X_encoding > 62) ? q/\w\w+/ : q/\w+/;
- # build the word list
- my %X_keywords = &_X_analyze($X_script, $X_regexp, $X_encode);
-#print Dumper(%X_keywords);
- my $X_encoded = \$X_keywords{X_encoded}; # eg alert => 2, function => 10 etc
- # encode
- $parser->add($X_regexp, sub {my $X_offset = pop; my @X_match = @_; return ${$X_encoded}->{$X_match[$X_offset]};});
- # if encoded, wrap the script in a decoding function
-
- return $X_script && _X_bootStrap(\$parser->exec($X_script), \%X_keywords);
- }
-
-####################
- sub _X_analyze { #
-####################
-#print Dumper(@_);
- my ($X_script, $X_regexp, $X_encode) = @_;
- # analyse
- # retreive all words in the script
- my @X_all = $X_script =~ m/$X_regexp/g; # Save all captures in a list context
- my %XX_sorted = (); # list of words sorted by frequency
- my %XX_encoded = (); # dictionary of word->encoding
- my %XX_protected = (); # instances of "protected" words
- if (@X_all) {
- my @X_unsorted = (); # same list, not sorted
- my %X_protected = (); # "protected" words (dictionary of word->"word")
- my %X_values = (); # dictionary of charCode->encoding (eg. 256->ff)
- my %X_count = (); # word->count
- my $i = scalar(@X_all); my $j = 0; my $X_word = '';
- # count the occurrences - used for sorting later
- do {
- $X_word = '$' . $X_all[--$i];
- if (!exists($X_count{$X_word})) {
- $X_count{$X_word} = [0,$i]; # Store both the usage count and original array position (ie a secondary sort key)
- $X_unsorted[$j] = $X_word;
- # make a dictionary of all of the protected words in this script
- # these are words that might be mistaken for encoding
- $X_values{$j} = &$X_encode($j);
- my $v = '$'.$X_values{$j};
- $X_protected{$v} = $j++;
- }
- # increment the word counter
- $X_count{$X_word}[0]++;
- } while ($i);
-#print Dumper (%X_values);
-#print Dumper (@X_unsorted);
-#print Dumper (%X_protected);
- # prepare to sort the word list, first we must protect
- # words that are also used as codes. we assign them a code
- # equivalent to the word itself.
- # e.g. if "do" falls within our encoding range
- # then we store keywords["do"] = "do";
- # this avoids problems when decoding
- $i = scalar(@X_unsorted);
- do {
- $X_word = $X_unsorted[--$i];
- if (exists($X_protected{$X_word})) {
- $XX_sorted{$X_protected{$X_word}} = substr($X_word,1);
- $XX_protected{$X_protected{$X_word}} = 1; # true
- $X_count{$X_word}[0] = 0;
- }
- } while ($i);
-#print Dumper (%XX_protected);
-#print Dumper (%XX_sorted);
-#print Dumper (%X_count);
- # sort the words by frequency
- # Sort with count a primary key and original array order as secondary key - which is apparently the default in javascript!
- @X_unsorted = sort ({($X_count{$b}[0] - $X_count{$a}[0]) or ($X_count{$b}[1] <=> $X_count{$a}[1])} @X_unsorted);
-#print Dumper (@X_unsorted) . "\n";
-
- $j = 0;
- # because there are "protected" words in the list
- # we must add the sorted words around them
- do {
- if (!exists($XX_sorted{$i})) {$XX_sorted{$i} = substr($X_unsorted[$j++],1)}
- $XX_encoded{$XX_sorted{$i}} = $X_values{$i};
- } while (++$i < scalar(@X_unsorted));
- }
-#print Dumper(X_sorted => \%XX_sorted, X_encoded => \%XX_encoded, X_protected => \%XX_protected);
- return (X_sorted => \%XX_sorted, X_encoded => \%XX_encoded, X_protected => \%XX_protected);
- }
-
-######################
- sub _X_bootStrap { #
-######################
- # build the boot function used for loading and decoding
- my ($X_packed, $X_keywords) = @_; # Reference arguments!
-#print Dumper ($X_keywords) . "\n";
-
- # $packed: the packed script - dereference and escape
- $X_packed = "'" . &_X_escape($$X_packed) ."'";
-
- my %sorted = %{$$X_keywords{X_sorted}}; # Dereference to local variables
- my %protected = %{$$X_keywords{X_protected}}; # for simplicity
-
- my @sorted = ();
- foreach my $key (keys %sorted) {$sorted[$key] = $sorted{$key}}; # Convert hash to a standard list
-
- # ascii: base for encoding
- my $X_ascii = ((scalar(@sorted) > $_X_encoding) ? $_X_encoding : scalar(@sorted)) || 1;
-
- # count: number of (unique {RS}) words contained in the script
- my $X_count = scalar(@sorted); # Use $X_count for assigning $X_ascii
-
- # keywords: list of words contained in the script
- foreach my $i (keys %protected) {$sorted[$i] = ''}; # Blank out protected words
-#print Dumper(@sorted) . "\n";
-
- # convert from a string to an array - prepare keywords as a JScript string->array {RS}
- $X_keywords = "'" . join('|',@sorted) . "'.split('|')";
-
- # encode: encoding function (used for decoding the script)
- my $X_encode = $_X_encoding > 62 ? $_JSencode95 : &_X_getEncoder($X_ascii,$JSCRIPT); # This is a JScript function (as a string)
- $X_encode =~ s/_encoding/\x24ascii/g; $X_encode =~ s/arguments\.callee/\x24encode/g;
- my $X_inline = '$count' . ($X_ascii > 10 ? '.toString($ascii)' : '');
-
- # decode: code snippet to speed up decoding
- my $X_decode = '';
- if ($_X_fastDecode) {
- # create the decoder
- $X_decode = &_X_getFunctionBody($_JSdecode); # ie from the Javascript literal function
- if ($_X_encoding > 62) {$X_decode =~ s/\\\\w/[\\xa1-\\xff]/g}
- # perform the encoding inline for lower ascii values
- elsif ($X_ascii < 36) {$X_decode =~ s/$X_ENCODE/$X_inline/g}
- # special case: when $X_count==0 there ar no keywords. i want to keep
- # the basic shape of the unpacking funcion so i'll frig the code...
- if (!$X_count) {$X_decode =~ s/(\x24count)\s*=\s*1/$1=0/}
- }
-
- # boot function
- my $X_unpack = $_JSunpack;
- if ($_X_fastDecode) {
- # insert the decoder
- $X_unpack =~ s/\{/\{$X_decode;/;
- }
- $X_unpack =~ s/"/'/g;
- if ($_X_encoding > 62) { # high-ascii
- # get rid of the word-boundaries for regexp matches
- $X_unpack =~ s/'\\\\b'\s*\+|\+\s*'\\\\b'//g; # Not checked! {RS}
- }
- if ($X_ascii > 36 || $_X_encoding > 62 || $_X_fastDecode) {
- # insert the encode function
- $X_unpack =~ s/\{/\{\$encode=$X_encode;/;
- } else {
- # perform the encoding inline
- $X_unpack =~ s/$X_ENCODE/$X_inline/;
- }
-
- # arguments {RS} Do this before using &pack because &pack changes the pack parameters (eg $fastDecode) in Perl!!
- my $X_params = "$X_packed,$X_ascii,$X_count,$X_keywords"; # Interpolate to comma separated string
- if ($_X_fastDecode) {
- # insert placeholders for the decoder
- $X_params .= ',0,{}';
- }
-
- # pack the boot function too
- $X_unpack = &pack($X_unpack,0,0,1);
-
- # the whole thing
- return "eval(" . $X_unpack . "(" . $X_params . "))\n";
- };
-
-#######################
- sub _X_getEncoder { #
-#######################
- # mmm.. ..which one do i need ?? ({RS} Perl or JScript ??)
- my ($X_ascii,$language) = @_;
- my $perl_encoder = ($X_ascii > 10) ? ($X_ascii > 36) ? ($X_ascii > 62) ? $_X_encode95 : $_X_encode62 : $_X_encode36 : $_X_encode10;
- my $jscript_encoder = ($X_ascii > 10) ? ($X_ascii > 36) ? ($X_ascii > 62) ? $_JSencode95 : $_JSencode62 : $_JSencode36 : $_JSencode10;
- return ($language eq $JSCRIPT) ? $jscript_encoder : $perl_encoder;
- };
-
-#############################
-# Perl versions of encoders #
-#############################
- # base10 zero encoding - characters: 0123456789
- $_X_encode10 = sub {return &_encodeBase(shift,10)};
- # base36 - characters: 0123456789abcdefghijklmnopqrstuvwxyz
- $_X_encode36 = sub {return &_encodeBase(shift,36)};
- # base62 - characters: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
- $_X_encode62 = sub {return &_encodeBase(shift,62)};
- # high-ascii values - characters: ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ
- $_X_encode95 = sub {return &_encodeBase(shift,95)};
- # Lookup character sets for baseN encoding
- $baseLookup{10} = [(0..9)[0..9]]; # base 10
- $baseLookup{36} = [(0..9,'a'..'z')[0..35]]; # base 36
- $baseLookup{62} = [(0..9,'a'..'z','A'..'Z')[0..61]]; # base 62
- $baseLookup{95} = (); for (my $i=0; $i<95; $i++) {$baseLookup{95}[$i] = chr($i+161)}; # base95 (high ascii)
-#print Dumper(%baseLookup);
-#####################
- sub _encodeBase { #
-#####################
- # Generic base conversion function using defined lookup arrays (perl version only)
- my ($X_charCode, $base) = @_;
- my $X_encoded = '';
- # Do we know this encoding?
- if (exists ($baseLookup{$base})) {
- if ($X_charCode == 0) {$X_encoded = $baseLookup{$base}[0]}
- while($X_charCode > 0) {
- $X_encoded = $baseLookup{$base}[$X_charCode % $base] . $X_encoded;
- $X_charCode = int($X_charCode / $base);
- }
- }
- else {$X_encoded = "$X_charCode"} # default is to return unchanged (ie as for base 10) if no baselookup is available
- return $X_encoded;
- };
-
-#############################
- $_X_encodePrivate = sub { #
-#############################
- # special _chars
- my $X_charCode = shift;
- return '_' . $X_charCode;
- };
-
-############################
- sub _X_escape($script) { #
-############################
- # protect characters used by the parser
- my $X_script = shift;
- $X_script =~ s/([\\'])/\\$1/g;
- return $X_script;
- };
-
-#####################
- sub _X_escape95 { #
-#####################
- # protect high-ascii characters already in the script
- my $X_script = shift;
- $X_script =~ s/([\xa1-\xff])/sprintf("\\x%1x",ord($1))/eg;
- return $X_script;
- };
-
-############################
- sub _X_getFunctionBody { #
-############################
- # extract the body of a function (ie between opening/closing {}) - consistent with Dean Edwards approach
- my $X_function = shift;
- $X_function =~ m/^.*\{(.*)\}*$/sg; # Multiline, global (greedy)
- my $start = index($X_function,'{');
- my $end = rindex($X_function,'}');
- $X_function = substr($X_function,($start+1),($end-1-$start));
- return $X_function;
- };
-
-######################
- sub _X_globalize { #
-######################
- # set the global flag on a RegExp (you have to create a new one) !!! Unused in perl version
- # my $X_regexp = shift;
- };
-
- # build the parsing routine
- &_X_addParser(\&_X_basicCompression);
- &_X_addParser(\&_X_encodeSpecialChars) if ($_X_specialChars);
- &_X_addParser(\&_X_encodeKeywords) if ($_X_encoding);
-
- # go!
- return &_X_pack($_X_script);
-}
-
-########################
-# Javascript Literals #
-########################
-
-# JScript function "_unpack" - from DeanEdwards pack.js (NB: No ";" after final "}")
-($_JSunpack) = <<'END_JSCRIPT_UNPACK';
-/* unpacking function - this is the boot strap function */
-/* data extracted from this packing routine is passed to */
-/* this function when decoded in the target */
-function($packed, $ascii, $count, $keywords, $encode, $decode) {
- while ($count--)
- if ($keywords[$count])
- $packed = $packed.replace(new RegExp('\\b' + $encode($count) + '\\b', 'g'), $keywords[$count]);
- /* RS_Debug = $packed; */ /* {RS} !!!!!!!!! */
- return $packed;
-}
-END_JSCRIPT_UNPACK
-
-# JScript function "_decode" - from DeanEdwards pack.js
-($_JSdecode) = <<'END_JSCRIPT_DECODE';
- /* code-snippet inserted into the unpacker to speed up decoding */
- function() {
- /* does the browser support String.replace where the */
- /* replacement value is a function? */
- if (!''.replace(/^/, String)) {
- /* decode all the values we need */
- while ($count--) $decode[$encode($count)] = $keywords[$count] || $encode($count);
- /* global replacement function */
- $keywords = [function($encoded){return $decode[$encoded]}];
- /* generic match */
- $encode = function(){return'\\w+'};
- /* reset the loop counter - we are now doing a global replace */
- $count = 1;
- }
- };
-END_JSCRIPT_DECODE
-
-# JScript versions of encoders
-($_JSencode10) = <<'END_JSCRIPT_ENCODE10';
- /* zero encoding */
- /* characters: 0123456789 */
- function($charCode) {
- return $charCode;
- };
-END_JSCRIPT_ENCODE10
-
-($_JSencode36) = <<'END_JSCRIPT_ENCODE36';
- /* inherent base36 support */
- /* characters: 0123456789abcdefghijklmnopqrstuvwxyz */
- function($charCode) {
- return $charCode.toString(36);
- };
-END_JSCRIPT_ENCODE36
-
-($_JSencode62) = <<'END_JSCRIPT_ENCODE62';
- /* hitch a ride on base36 and add the upper case alpha characters */
- /* characters: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ */
- function($charCode) {
- return ($charCode < _encoding ? '' : arguments.callee(parseInt($charCode / _encoding))) +
- (($charCode = $charCode % _encoding) > 35 ? String.fromCharCode($charCode + 29) : $charCode.toString(36));
- };
-END_JSCRIPT_ENCODE62
-
-($_JSencode95) = <<'END_JSCRIPT_ENCODE95';
- /* use high-ascii values */
- /* characters: ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ */
- function($charCode) {
- return ($charCode < _encoding ? '' : arguments.callee($charCode / _encoding)) +
- String.fromCharCode($charCode % _encoding + 161);
- };
-END_JSCRIPT_ENCODE95
-
-###########
-# END #
-###########
-1; # Pack #
-###########
diff --git a/javascript/jsPacker/ParseMaster.pm b/javascript/jsPacker/ParseMaster.pm
deleted file mode 100644
index f07ba68..0000000
--- a/javascript/jsPacker/ParseMaster.pm
+++ /dev/null
@@ -1,207 +0,0 @@
-#ParseMaster (July 25 2005)
-# Based on "ParseMaster.js" by Dean Edwards <http://dean.edwards.name/>
-# Ported to Perl by Rob Seiler, ELR Software Pty Ltd <http://www.elr.com.au>
-# Copyright 2005. License <http://creativecommons.org/licenses/LGPL/2.1/>
-
-package ParseMaster;
-use strict;
-use Data::Dumper;
-
-# Package wide variable declarations
-use vars qw/$VERSION
- @_X_escaped @_X_patterns
- /;
-
-$VERSION = '017';
-
-# constants
-my $X_EXPRESSION = 0;
-my $X_REPLACEMENT = 1;
-my $X_LENGTH = 2;
-
-# re's used to determine nesting levels
-my $X_GROUPS = qr/\(/o; # NB: Requires g modifier!
-my $X_SUB_REPLACE = qr/\$\d/o;
-my $X_INDEXED = qr/^\$\d+$/o;
-my $XX_ESCAPE = qr/\\./o; # NB: Requires g modifier!
-my $XX_DELETED = qr/\001[^\001]*\001/o; # NB: Requires g modifier!
-my $DIGIT = qr/[^\D]/o; # Yep - this is a digit - contains no non-digits
-
-# Constructor
-sub new {
- my $class = shift;
- my $self = {};
- @_X_escaped = (); # Re-initialize global for each instance
- @_X_patterns = (); # Re-initialize global for each instance
- # Instance variables - access by similarly named set/get functions
- $self->{_ignoreCase_} = 0;
- $self->{_escapeChar_} = '';
- bless ($self, $class);
- return $self;
-}
-
-sub ignoreCase {
- my ($self, $value) = @_;
- if (defined($value)) {
- $self->{_ignoreCase_} = $value;
- }
- return $self->{_ignoreCase_};
-}
-
-sub escapeChar{
- my ($self, $value) = @_;
- if (defined($value)) {
- $self->{_escapeChar_} = $value;
- }
- return $self->{_escapeChar_};
-}
-
-#######################
-# Public Parsemaster functions
-
-my $X_DELETE = sub(@$) {
- my $X_offset = pop;
- my @X_match = @_;
- return (chr(001) . $X_match[$X_offset] . chr(001));
-}; # NB semicolon required for closure!
-
-# create and add a new pattern to the patterns collection
-sub add {
- my ($self, $expression, $X_replacement) = @_;
- if (!$X_replacement) {$X_replacement = $X_DELETE};
-
- # count the number of sub-expressions
- my $temp = &_X_internalEscape($expression);
- my $length = 1; # Always at least one because each pattern is itself a sub-expression
- $length += $temp =~ s/$X_GROUPS//g; # One way to count the left capturing parentheses in the regexp string
-
- # does the pattern deal with sub-expressions?
- if ((ref($X_replacement) ne "CODE") && ($X_replacement =~ m/$X_SUB_REPLACE/)) {
- if ($X_replacement =~ m/$X_INDEXED/) { # a simple lookup? (eg "$2")
- # store the index (used for fast retrieval of matched strings)
- $X_replacement = substr($X_replacement,1) - 1;
- }
- else { # a complicated lookup (eg "Hello $2 $1")
- my $i = $length;
- while ($i) { # Had difficulty getting Perl to do Dean's splitting and joining of strings containing $'s
- my $str = '$a[$o+' . ($i-1) . ']'; # eg $a[$o+1]
- $X_replacement =~ s/\$$i/$str/; # eg $2 $3 -> $a[$o+1] $a[$o+2]
- $i--;
- }
- # build a function to do the lookup - returns interpolated string of array lookups
- $X_replacement = eval('sub {my $o=pop; my @a=@_; return "' . $X_replacement . '"};');
- }
- }
- else {}
- # pass the modified arguments
- &_X_add($expression || q/^$/, $X_replacement, $length);
-}
-
-# execute the global replacement
-sub exec {
-#print Dumper(@_X_patterns);
- my ($self, $X_string) = @_;
- my $escChar = $self->escapeChar();
- my $ignoreCase = $self->ignoreCase();
- my ($regexp,$captures) = &_getPatterns(); # Concatenated and parenthesized regexp eg '(regex1)|(regex2)|(regex3)' etc
- $X_string = &_X_escape($X_string, $escChar);
- if ($ignoreCase) {$X_string =~ s/$regexp/{&_X_replacement(&_matchVars($captures,\$X_string))}/gie} # Pass $X_String as a
- else {$X_string =~ s/$regexp/{&_X_replacement(&_matchVars($captures,\$X_string))}/ge} # reference for speed
-
- $X_string = &_X_unescape($X_string, $escChar);
- $X_string =~ s/$XX_DELETED//g;
- return $X_string;
-}
-
-sub _X_add {
- push (@_X_patterns, [@_]); # Save each argument set as is into an array of arrays
-}
-
-# this is the global replace function (it's quite complicated)
-sub _X_replacement {
- my (@arguments) = @_;
-#print Dumper (@arguments);
- if ($arguments[0] le '') {return ''}
- # Dereference last index (source String) here - faster than in _matchVars (maybe not needed at all?)
- $arguments[$#arguments] = ${$arguments[$#arguments]};
- my $i = 1;
- # loop through the patterns
- for (my $j=0; $j<scalar(@_X_patterns); $j++) { # Loop through global all @_X_patterns
- my @X_pattern = @{$_X_patterns[$j]};
- # do we have a result? NB: "if ($arguments[$i])" as in Dean's Javascript is false for the value 0!!!
- if ((defined $arguments[$i]) && ($arguments[$i] gt '')) {
- my $X_replacement = $X_pattern[$X_REPLACEMENT];
- # switch on type of $replacement
- if (ref($X_replacement) eq "CODE") { # function
- return &$X_replacement(@arguments,$i);
- }
- elsif ($X_replacement =~ m/$DIGIT/) { # number (contains no non-digits)
- return $arguments[$X_replacement + $i];
- }
- else { # default
- return $X_replacement; # default
- }
- } # skip over references to sub-expressions
- else {$i += $X_pattern[$X_LENGTH]}
- }
-}
-
-#######################
-# Private functions
-#######################
-
-# encode escaped characters
-sub _X_escape {
- my ($X_string, $X_escapeChar) = @_;
- if ($X_escapeChar) {
- my $re = '\\'.$X_escapeChar.'(.)';
- $X_string =~ s/$re/{push(@_X_escaped,$1); $X_escapeChar}/ge;
- }
- return $X_string;
-}
-
-# decode escaped characters
-sub _X_unescape {
- my ($X_string, $X_escapeChar) = @_;
- if ($X_escapeChar) { # We'll only do this if there is an $X_escapeChar!
- my $re = '\\'.$X_escapeChar;
- $X_string =~ s/$re/{$X_escapeChar . (shift(@_X_escaped))}/ge; # Don't use Dean Edwards as below 'or' here - because zero will return ''!
- # $X_string =~ s/$re/{$X_escapeChar . (shift(@_X_escaped) || '')}/ge;
- }
- return $X_string;
-}
-
-sub _X_internalEscape {
- my ($string) = shift;
- $string =~ s/$XX_ESCAPE//g;
- return $string;
-}
-
-# Builds an array of match variables to (approximately) emulate that available in Javascript String.replace()
-sub _matchVars {
- my ($m,$sref) = @_;
- my @args = (1..$m); # establish the number potential memory variables
- my @mv = map {eval("\$$_")} @args; # matchvarv[1..m] = the memory variables $1 .. $m
- unshift (@mv, $&); # matchvar[0] = the substring that matched
- push (@mv, length($`)); # matchvar[m+1] = offset within the source string where the match occurred (= length of prematch string)
- push (@mv, $sref); # matchvar[m+2] = reference to full source string (dereference in caller if/when needed)
-#print Dumper (@mv);
- return @mv;
-}
-
-sub _getPatterns {
- my @Patterns = ();
- my $lcp = 0;
- for (my $i=0; $i<scalar(@_X_patterns); $i++) { # Loop through global all @_patterns
- push (@Patterns, $_X_patterns[$i][$X_EXPRESSION]); # accumulate the expressions
- $lcp += $_X_patterns[$i][$X_LENGTH]; # sum the left capturing parenthesis counts
- }
- my $str = "(" . join(')|(',@Patterns). ")"; # enclose each pattern in () separated by "|"
- return ($str, $lcp);
-}
-
-##################
-# END #
-##################
-1; # ParseMaster #
-##################
diff --git a/javascript/jsPacker/build-pack-crypto.sh b/javascript/jsPacker/build-pack-crypto.sh
deleted file mode 100644
index bf902f9..0000000
--- a/javascript/jsPacker/build-pack-crypto.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-cat ../aes.js ../cryptoHelpers.js ../SHA1.js ../MD5.js > crypto.js
-perl jsPacker.pl -fsq -e62 -i crypto.js -o crypto.min.js
-rm crypto.js
diff --git a/javascript/jsPacker/build-pack-register.sh b/javascript/jsPacker/build-pack-register.sh
deleted file mode 100644
index c0d7656..0000000
--- a/javascript/jsPacker/build-pack-register.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-perl jsPacker.pl -fsq -e62 -i ../srp_register.js -o ../srp_register.min.js
diff --git a/javascript/jsPacker/build-pack.sh b/javascript/jsPacker/build-pack.sh
deleted file mode 100644
index efef148..0000000
--- a/javascript/jsPacker/build-pack.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-cat ../SHA256.js ../prng4.js ../rng.js ../jsbn.js ../jsbn2.js ../srp.js > utils.js
-perl jsPacker.pl -fsq -e62 -i utils.js -o ../srp.min.js
-rm utils.js
diff --git a/javascript/jsPacker/crypto.min.js b/javascript/jsPacker/crypto.min.js
deleted file mode 100644
index d8dbba6..0000000
--- a/javascript/jsPacker/crypto.min.js
+++ /dev/null
@@ -1 +0,0 @@
-eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('18 aI={2O:{7j:{8L:16,8K:24,86:32},7K:[1W,3z,4D,5g,6g,4B,5A,1U,4W,1Y,5e,3s,3O,3j,2E,56,6d,69,5Y,2C,2r,5C,3q,3P,5z,2d,4e,4s,3L,3I,27,44,5S,3f,5Q,3A,2H,4z,5l,2p,3C,5T,5o,5U,3l,2F,4A,4u,2f,5Z,4x,4l,3V,4T,5b,2l,4v,6u,1x,3Q,5n,5L,4N,5h,4w,1Q,4U,4Z,1J,3x,6k,4O,52,5M,6f,2n,5K,5X,2x,4Q,4F,4o,6x,5W,2e,6h,5x,3o,2w,1V,4c,25,26,3Z,3v,5p,4J,1T,3H,4h,5k,2z,2y,4q,5E,5m,2b,3m,3Y,3T,1S,68,5j,5y,2v,5O,3K,5P,6t,4i,2t,3F,3N,5c,2a,5V,3g,47,4m,3E,3r,3R,5i,2m,3w,57,6e,3e,6p,5d,54,4G,58,5B,3y,5N,4H,46,4V,6r,6c,4f,6m,6i,3G,4Y,4K,2g,5a,62,6j,3U,28,3X,3p,50,6s,51,2q,2A,4d,6o,1R,5v,2j,4E,4j,3M,3t,3k,1P,61,53,3d,2G,3u,4L,4a,4C,43,4P,2u,65,55,1Z,3S,6v,67,66,2c,2s,5r,2i,5H,5F,2o,4p,4R,6q,4X,3b,2h,6n,5J,49,6w,2B,2D,5D,5R,4g,5q,1X,6b,3h,48,4S,5G,5f,3i,3J,2k,5u,3D,5s,4k,45,3n,3B,4n,6a,4t,5t,5I,5w,4M,41,42,4I,4r,4y,2L,4b,6l,3c,3W],8S:[52,4w,2w,61,4W,2H,5T,6t,5w,2v,5y,6b,5N,3g,3j,4h,3z,5X,25,69,5u,2x,5V,5s,3C,3J,5k,3w,6e,4K,4k,1V,6l,5g,2k,3U,67,2q,4x,5d,6i,3Z,5v,5a,41,2r,4l,53,2u,3S,4t,2h,3B,3i,6s,4N,56,3o,4e,3p,3k,4p,4o,1Z,27,48,49,54,4g,42,4S,3W,2d,3I,51,2p,4G,4C,3F,3K,2G,6q,6n,3Y,3f,5W,5R,3N,2g,4u,6m,5D,3e,1P,5P,4Q,6c,2F,2E,6x,6a,2t,2A,3X,5l,2j,3v,5b,3G,2n,5E,50,4J,4U,3D,5O,6d,4z,2L,2b,5q,4s,2o,5J,1Y,3r,4R,4B,28,1R,5G,4I,4H,5e,46,4a,2m,6g,5p,45,3P,66,4M,5B,4T,4d,2i,4V,4j,5z,2D,4q,3Q,5m,3t,2s,6v,5h,4n,3x,3q,5U,4Z,3l,1X,5K,1U,5t,5A,5S,6o,6w,3H,3V,4c,1J,6h,3u,4X,5F,2c,47,4E,2e,2l,62,44,3O,55,4m,6k,4L,5H,5r,68,2y,4f,4v,5Z,4A,5x,6u,2a,5C,5L,1x,3R,5i,3y,5j,3m,3d,58,3b,26,5I,4y,5o,43,1S,5Q,5Y,3L,1T,4O,6j,5M,2z,4P,6r,4i,4b,3M,5n,3c,3T,1Q,4F,4r,2B,57,3s,2f,6p,65,4D,6f,3A,3h,5f,4Y,1W,3n,5c,3E,2C],8Y:1e(1K){18 c=1K[0];1c(18 i=0;i<3;i++)1K[i]=1K[i+1];1K[3]=c;1d 1K},8X:[1P,1Y,2b,2f,2u,2a,2e,2v,1x,1J,2H,2G,2F,2E,2z,2l,2x,2g,2t,1W,2c,2m,2D,2w,2d,2n,2C,2r,1T,1U,1R,25,27,2j,2A,2o,2B,2q,1S,1Z,26,2k,2y,2h,2p,1Q,1X,28,2i,2s,1V,1P,1Y,2b,2f,2u,2a,2e,2v,1x,1J,2H,2G,2F,2E,2z,2l,2x,2g,2t,1W,2c,2m,2D,2w,2d,2n,2C,2r,1T,1U,1R,25,27,2j,2A,2o,2B,2q,1S,1Z,26,2k,2y,2h,2p,1Q,1X,28,2i,2s,1V,1P,1Y,2b,2f,2u,2a,2e,2v,1x,1J,2H,2G,2F,2E,2z,2l,2x,2g,2t,1W,2c,2m,2D,2w,2d,2n,2C,2r,1T,1U,1R,25,27,2j,2A,2o,2B,2q,1S,1Z,26,2k,2y,2h,2p,1Q,1X,28,2i,2s,1V,1P,1Y,2b,2f,2u,2a,2e,2v,1x,1J,2H,2G,2F,2E,2z,2l,2x,2g,2t,1W,2c,2m,2D,2w,2d,2n,2C,2r,1T,1U,1R,25,27,2j,2A,2o,2B,2q,1S,1Z,26,2k,2y,2h,2p,1Q,1X,28,2i,2s,1V,1P,1Y,2b,2f,2u,2a,2e,2v,1x,1J,2H,2G,2F,2E,2z,2l,2x,2g,2t,1W,2c,2m,2D,2w,2d,2n,2C,2r,1T,1U,1R,25,27,2j,2A,2o,2B,2q,1S,1Z,26,2k,2y,2h,2p,1Q,1X,28,2i,2s,1V],aH:[6x,2b,2f,50,2u,3X,3E,6w,2a,6u,4Y,3W,3V,4Z,6v,3D,2e,4V,6s,3A,3B,6r,4U,3S,4W,3U,3C,2H,6t,28,3T,4X,2v,41,3w,6m,6n,26,3Z,53,3Y,52,6l,3u,3v,6k,51,2g,3y,6o,54,2h,42,2w,2G,3x,6q,27,2i,56,55,43,3z,6p,1x,69,4Q,4g,4f,4R,6a,3J,6c,3K,2k,4T,4S,2l,3L,6b,4O,4e,3I,67,68,3H,4d,4P,4b,4N,66,3F,3G,65,2t,4c,44,2q,6e,2c,3M,6d,2p,45,4J,47,2d,6f,2F,3N,46,4K,6j,3Q,2j,4M,2s,4a,3R,6i,3P,6g,4L,49,48,2r,6h,3O,1J,58,5H,1X,3r,5G,57,4u,5a,4w,2L,5I,5J,1Y,4v,5b,5M,25,4z,5d,2y,4A,3t,2D,3s,5K,2x,4y,4x,5c,5L,1Z,3o,5C,5i,4G,4F,5j,5D,3n,5F,3p,4H,2z,5k,4I,3q,5E,5g,4E,3m,2C,5B,3l,4D,5h,4B,5f,5A,3k,1W,2B,5e,4C,5u,4r,1S,5P,5Q,1R,2m,5v,4p,5t,5O,1P,1Q,5N,5s,4q,3c,5R,5w,2o,2n,5x,5S,3b,2E,3d,4s,5z,5y,4t,3e,5T,62,3i,4n,5r,2A,4o,3j,61,1V,5Y,5p,4m,4l,5q,5Z,1U,4h,5m,5V,3f,3g,5U,5l,4i,5n,4k,1T,5W,5X,3h,4j,5o],aG:[6x,5J,50,5b,3E,2L,3X,4w,3V,1J,3D,1X,4Y,57,6u,5G,4W,2y,2H,2D,3T,4z,28,25,3B,3s,3S,4y,6s,5L,4V,5c,3y,1W,2h,4C,2G,5A,2w,5f,55,5g,6p,2C,2i,4D,27,3l,3Y,4F,3u,3n,51,5i,6k,5C,6n,5F,53,2z,3w,3q,41,4I,44,4l,2c,1U,2p,5p,6d,5Y,2F,62,4K,5r,2d,3j,47,4o,3P,3g,49,4i,6h,5V,2r,5m,2s,5n,6i,5W,2j,4j,3Q,3h,4O,5y,67,5T,4d,4s,3H,3d,3G,3c,4c,2o,66,5S,4N,5x,6c,5Q,4T,5v,3L,1S,2l,4r,4f,4p,3J,1P,4Q,5s,69,5N,5u,4S,5P,6b,2m,2k,1R,3K,1Q,1x,4q,4g,5O,6a,5t,4R,2E,68,5z,4P,3e,3I,4t,4e,2n,4b,3b,3F,5w,2t,5R,65,4h,48,3f,3O,5l,4L,5U,6g,5X,6j,5o,4M,1T,3R,4k,4a,1V,3M,4m,45,5Z,6e,5q,2q,2A,4J,61,6f,4n,46,3i,3N,3o,3v,4G,2g,5D,6l,5j,52,5k,2v,5E,6m,4H,3Z,3p,26,4B,42,3k,3x,5e,54,2B,6o,5B,6q,5h,56,3m,3z,4E,43,5M,6t,5d,4X,3t,3C,4A,3U,4x,2e,1Z,3A,2x,4U,5K,6r,5a,2u,5I,6w,4v,2f,1Y,2b,3r,2a,4u,3W,5H,6v,58,4Z],aF:[6x,4w,6u,1J,6s,4y,2H,4z,6n,4I,6k,4F,2G,4C,6p,4D,6c,4r,69,4p,66,2o,67,4s,2F,4o,6d,4l,6h,4i,6i,4j,5M,3U,5K,2e,5H,3W,5I,2f,5B,43,2B,42,5D,2g,5E,3Z,2E,4e,5R,4b,5O,4g,5P,2k,5X,4a,5U,48,5Z,45,61,46,56,3m,54,3k,52,3o,2v,3p,4X,3t,4U,1Z,4Z,3r,2u,1Y,4M,1T,4L,3f,2q,1V,4J,3i,4P,3e,2t,3b,4R,1Q,4S,1R,2z,3w,5i,3u,5f,3y,5g,27,5b,3E,57,3D,5c,3B,2y,28,5r,2d,5p,2c,5m,3P,5n,3Q,5v,3L,5s,3J,5x,3G,5y,3H,3R,5o,3O,5l,3M,5q,3N,2A,3I,5z,3F,5w,1x,5t,3K,5u,3z,5h,3x,5e,3v,5j,26,5k,3C,5d,3A,2x,2a,58,2b,5a,3j,4K,1U,2p,3g,2r,3h,2s,1S,4T,1P,4Q,3c,4N,3d,4O,3q,53,3n,51,1W,2w,3l,55,2L,50,1X,4Y,3s,4V,25,4W,2l,5Q,4f,5N,4c,5S,4d,5T,47,62,44,5Y,49,5V,2j,5W,3X,5J,3V,5G,3S,5L,3T,2D,41,5F,3Y,5C,2h,5A,2i,2C,4t,68,2n,65,4q,6a,2m,6b,4k,6j,4h,6g,4m,6e,4n,6f,4A,6t,4x,6r,4u,6v,4v,6w,4E,6q,4B,6o,4G,6l,4H,6m],aE:[6x,5a,3W,1X,4U,5L,28,4A,3v,4F,53,5E,2i,3m,6o,5f,4b,3c,67,5z,3L,2m,4R,5N,2s,5X,3O,4i,6e,5p,47,3i,5g,6q,3k,2h,5D,51,4I,26,4x,3B,2D,4X,2L,2f,58,6u,1V,44,5r,6f,4j,3R,5U,2r,5Q,4S,4q,3J,5w,66,3d,4e,49,3f,6j,5n,3N,4o,2p,5Z,4P,5T,3G,2n,69,5t,2k,1S,6m,2z,3Y,3o,2w,2B,3z,4D,3D,4u,2u,5J,3U,25,6s,2x,1P,4g,5u,6c,4t,3H,5S,2t,61,4K,4l,3M,5m,6g,1T,2j,5d,2H,3s,2e,5G,4Z,4v,3E,4C,3x,5B,55,3p,41,5i,6l,5l,6h,3h,4a,62,4J,4m,2c,4s,3I,5R,4N,1Q,4f,5v,6b,3q,3Z,5j,6k,4B,3y,2C,56,5H,4Y,4w,2b,2y,6t,1Z,3S,6a,5s,2l,1R,4O,2E,3F,2o,2d,4n,2q,5Y,48,3g,6i,5o,3T,3t,6r,5c,2a,1J,50,5I,54,5A,27,4E,6n,5k,2g,3n,1Y,3X,57,6v,4y,3A,5M,4W,5C,52,4H,3w,5h,6p,1W,42,5x,65,3e,4d,5P,4T,4p,1x,4k,3Q,5V,4L,1U,45,2A,2F,43,3l,2G,5e,3u,4G,2v,5F,4V,5K,3C,4z,6w,5b,3V,3r,6d,5q,46,3j,4M,5W,3P,4h,3K,4r,4Q,5O,4c,3b,68,5y],aD:[6x,5I,4Z,57,3C,25,3S,4x,42,4C,27,3m,51,5j,6m,5F,4J,5r,6d,5Z,2j,4k,3O,3g,3G,3b,4e,4s,6a,5N,4T,5u,3c,3F,4t,4d,5O,69,5v,4S,2A,4K,5Y,6e,4j,4a,3f,3P,4B,2h,3l,3z,5i,52,5E,6n,5J,6w,58,4Y,3t,28,4y,2e,3k,3y,4D,43,5C,6l,5k,53,5b,2u,5H,6u,4A,3T,3s,3A,2o,4b,3e,3H,5t,4Q,5Q,6b,61,2F,5p,2q,3h,3R,4h,49,6f,62,2p,5q,3Q,1T,48,4i,4c,2n,3I,3d,4R,5s,6c,5P,50,5a,6v,5G,3U,4z,3B,1Z,3x,1W,2i,4E,6k,5D,2v,2z,3N,3j,44,4m,6i,5X,4L,5m,4N,5w,68,5T,4g,4p,3L,1R,3X,4v,2a,1X,4X,2y,6s,5K,6o,5A,55,5h,3u,3o,3Z,4I,2B,2G,5g,56,3n,3v,4H,41,4w,2f,3r,3D,5d,4W,5L,6r,5x,2t,2E,67,4q,4f,1S,3K,3i,2d,4l,45,5W,6j,5l,2r,5S,65,5z,4O,1Q,3J,4r,2k,4n,47,1U,3M,5n,4M,5U,6h,5e,2w,2C,6q,4F,2g,3p,3w,2L,2b,4u,3V,5M,2H,5c,4U,3E,1Y,3W,1J,6t,2D,4V,2x,54,5f,6p,5B,3Y,4G,26,3q,46,4o,2c,1V,2s,5o,6g,5V,66,5R,4P,5y,1x,1P,2l,2m],aC:[6x,6w,6v,6u,6t,2H,6s,6r,6q,6p,2G,6o,6n,6m,6l,6k,6j,6i,6h,6g,2F,6f,6e,6d,6c,6b,6a,69,68,67,66,65,62,61,5Z,5Y,5X,5W,5V,5U,2E,5T,5S,5R,5Q,5P,5O,5N,5M,2D,5L,5K,5J,5I,5H,5G,5F,5E,5D,5C,5B,2C,5A,2B,5z,5y,5x,5w,5v,5u,5t,5s,5r,2A,5q,5p,5o,5n,5m,5l,2z,5k,5j,5i,5h,5g,5f,5e,5d,2y,5c,2x,5b,5a,58,57,56,55,2w,54,53,2v,52,51,50,2u,4Z,4Y,4X,4W,4V,4U,4T,4S,4R,4Q,4P,4O,4N,2t,4M,2s,2r,4L,4K,4J,2q,2p,4I,4H,4G,4F,4E,4D,4C,4B,4A,4z,4y,4x,4w,4v,4u,1J,4t,4s,2o,2n,4r,2m,4q,4p,4o,4n,4m,4l,4k,4j,4i,4h,2l,2k,4g,4f,4e,4d,4c,4b,4a,2j,49,48,47,46,45,44,43,2i,2h,42,41,3Z,2g,3Y,3X,2f,3W,3V,3U,3T,3S,2e,3R,3Q,3P,3O,2d,3N,3M,2c,3L,3K,1x,3J,3I,3H,3G,3F,3E,2b,2a,3D,3C,28,3B,3A,3z,27,3y,3x,3w,26,3v,3u,3t,25,3s,1Z,2L,1Y,3r,1X,3q,3p,3o,3n,3m,3l,1W,3k,3j,3i,1V,1U,1T,3h,3g,3f,3e,3d,3c,3b,1S,1R,1Q,1P],8V:1e(1K,8W){1K=1a.8Y(1K);1c(18 i=0;i<4;++i)1K[i]=1a.7K[1K[i]];1K[0]=1K[0]^1a.8X[8W];1d 1K},85:1e(1k,1g){18 89=(16*(1a.7I(1g)+1));18 34=0;18 8U=1;18 t=[];18 1m=[];1c(18 i=0;i<89;i++)1m[i]=0;1c(18 j=0;j<1g;j++)1m[j]=1k[j];34+=1g;7r(34<89){1c(18 k=0;k<4;k++)t[k]=1m[(34-4)+k];1f(34%1g==0)t=1a.8V(t,8U++);1f(1g==1a.7j.86&&((34%1g)==16))1c(18 l=0;l<4;l++)t[l]=1a.7K[t[l]];1c(18 m=0;m<4;m++){1m[34]=1m[34-1g]^t[m];34++}}1d 1m},6D:1e(1b,31){1c(18 i=0;i<16;i++)1b[i]^=31[i];1d 1b},6C:1e(1m,8T){18 31=[];1c(18 i=0;i<4;i++)1c(18 j=0;j<4;j++)31[j*4+i]=1m[8T+i*4+j];1d 31},7k:1e(1b,2V){1c(18 i=0;i<16;i++)1b[i]=2V?1a.8S[1b[i]]:1a.7K[1b[i]];1d 1b},7l:1e(1b,2V){1c(18 i=0;i<4;i++)1b=1a.8R(1b,i*4,i,2V);1d 1b},8R:1e(1b,33,8Q,2V){1c(18 i=0;i<8Q;i++){1f(2V){18 7J=1b[33+3];1c(18 j=3;j>0;j--)1b[33+j]=1b[33+j-1];1b[33]=7J}1n{18 7J=1b[33];1c(18 j=0;j<3;j++)1b[33+j]=1b[33+j+1];1b[33+3]=7J}}1d 1b},1z:1e(a,b){18 p=0;1c(18 88=0;88<8;88++){1f((b&1)==1)p^=a;1f(p>3a)p^=3a;18 8P=(a&1x);a<<=1;1f(a>3a)a^=3a;1f(8P==1x)a^=1J;1f(a>3a)a^=3a;b>>=1;1f(b>3a)b^=3a;}1d p},87:1e(1b,2V){18 2J=[];1c(18 i=0;i<4;i++){1c(18 j=0;j<4;j++)2J[j]=1b[(j*4)+i];2J=1a.8O(2J,2V);1c(18 k=0;k<4;k++)1b[(k*4)+i]=2J[k]}1d 1b},8O:1e(2J,2V){18 1q=[];1f(2V)1q=[14,9,13,11];1n 1q=[2,1,1,3];18 1s=[];1c(18 i=0;i<4;i++)1s[i]=2J[i];2J[0]=1a.1z(1s[0],1q[0])^1a.1z(1s[3],1q[1])^1a.1z(1s[2],1q[2])^1a.1z(1s[1],1q[3]);2J[1]=1a.1z(1s[1],1q[0])^1a.1z(1s[0],1q[1])^1a.1z(1s[3],1q[2])^1a.1z(1s[2],1q[3]);2J[2]=1a.1z(1s[2],1q[0])^1a.1z(1s[1],1q[1])^1a.1z(1s[0],1q[2])^1a.1z(1s[3],1q[3]);2J[3]=1a.1z(1s[3],1q[0])^1a.1z(1s[2],1q[1])^1a.1z(1s[1],1q[2])^1a.1z(1s[0],1q[3]);1d 2J},8N:1e(1b,31){1b=1a.7k(1b,2N);1b=1a.7l(1b,2N);1b=1a.87(1b,2N);1b=1a.6D(1b,31);1d 1b},8M:1e(1b,31){1b=1a.7l(1b,37);1b=1a.7k(1b,37);1b=1a.6D(1b,31);1b=1a.87(1b,37);1d 1b},8J:1e(1b,1m,1D){1b=1a.6D(1b,1a.6C(1m,0));1c(18 i=1;i<1D;i++)1b=1a.8N(1b,1a.6C(1m,16*i));1b=1a.7k(1b,2N);1b=1a.7l(1b,2N);1b=1a.6D(1b,1a.6C(1m,16*1D));1d 1b},8I:1e(1b,1m,1D){1b=1a.6D(1b,1a.6C(1m,16*1D));1c(18 i=1D-1;i>0;i--)1b=1a.8M(1b,1a.6C(1m,16*i));1b=1a.7l(1b,37);1b=1a.7k(1b,37);1b=1a.6D(1b,1a.6C(1m,0));1d 1b},7I:1e(1g){18 1D;8m(1g){6A 1a.7j.8L:1D=10;36;6A 1a.7j.8K:1D=12;36;6A 1a.7j.86:1D=14;36;aB:1d 2Y;36}1d 1D},2P:1e(1r,1k,1g){18 1j=[];18 2U=[];18 1D=1a.7I(1g);1c(18 i=0;i<4;i++)1c(18 j=0;j<4;j++)2U[(i+(j*4))]=1r[(i*4)+j];18 1m=1a.85(1k,1g);2U=1a.8J(2U,1m,1D);1c(18 k=0;k<4;k++)1c(18 l=0;l<4;l++)1j[(k*4)+l]=2U[(k+(l*4))];1d 1j},81:1e(1r,1k,1g){18 1j=[];18 2U=[];18 1D=1a.7I(1g);1c(18 i=0;i<4;i++)1c(18 j=0;j<4;j++)2U[(i+(j*4))]=1r[(i*4)+j];18 1m=1a.85(1k,1g);2U=1a.8I(2U,1m,1D);1c(18 k=0;k<4;k++)1c(18 l=0;l<4;l++)1j[(k*4)+l]=2U[(k+(l*4))];1d 1j}},38:{82:0,83:1,7H:2},84:1e(2Z,1G,1C,1I){1f(1C-1G>16)1C=1G+16;18 2M=2Z.7B(1G,1C);1f(1I==1a.38.7H){18 8H=16-2M.1h;7r(2M.1h<16){2M.1o(8H)}}1d 2M},2P:1e(2Z,1I,1k,1g,2I){1f(1k.1h%1g){6B\'8G 1h 8F 8E 8D 8C 1g.\'}1f(2I.1h%16){6B\'2I 1h 8B 8A 2Q 8z.\'}18 1p=[];18 1r=[];18 1j=[];18 1B=[];18 7i=[];18 1H=37;1f(2Z!==2Y){1c(18 j=0;j<6I.7A(2Z.1h/16);j++){18 1G=j*16;18 1C=j*16+16;1f(j*16+16>2Z.1h)1C=2Z.1h;1p=1a.84(2Z,1G,1C,1I);1f(1I==1a.38.83){1f(1H){1j=1a.2O.2P(2I,1k,1g);1H=2N}1n 1j=1a.2O.2P(1r,1k,1g);1c(18 i=0;i<16;i++)1B[i]=1p[i]^1j[i];1c(18 k=0;k<1C-1G;k++)7i.1o(1B[k]);1r=1B}1n 1f(1I==1a.38.82){1f(1H){1j=1a.2O.2P(2I,1k,1g);1H=2N}1n 1j=1a.2O.2P(1r,1k,1g);1c(18 i=0;i<16;i++)1B[i]=1p[i]^1j[i];1c(18 k=0;k<1C-1G;k++)7i.1o(1B[k]);1r=1j}1n 1f(1I==1a.38.7H){1c(18 i=0;i<16;i++)1r[i]=1p[i]^((1H)?2I[i]:1B[i]);1H=2N;1B=1a.2O.2P(1r,1k,1g);1c(18 k=0;k<16;k++)7i.1o(1B[k])}}}1d{1I:1I,7G:2Z.1h,aA:7i}},81:1e(6L,7G,1I,1k,1g,2I){1f(1k.1h%1g){6B\'8G 1h 8F 8E 8D 8C 1g.\';1d 2Y}1f(2I.1h%16){6B\'2I 1h 8B 8A 2Q 8z.\'}18 1B=[];18 1r=[];18 1j=[];18 1p=[];18 6K=[];18 1H=37;1f(6L!==2Y){1c(18 j=0;j<6I.7A(6L.1h/16);j++){18 1G=j*16;18 1C=j*16+16;1f(j*16+16>6L.1h)1C=6L.1h;1B=1a.84(6L,1G,1C,1I);1f(1I==1a.38.83){1f(1H){1j=1a.2O.2P(2I,1k,1g);1H=2N}1n 1j=1a.2O.2P(1r,1k,1g);1c(i=0;i<16;i++)1p[i]=1j[i]^1B[i];1c(18 k=0;k<1C-1G;k++)6K.1o(1p[k]);1r=1B}1n 1f(1I==1a.38.82){1f(1H){1j=1a.2O.2P(2I,1k,1g);1H=2N}1n 1j=1a.2O.2P(1r,1k,1g);1c(i=0;i<16;i++)1p[i]=1j[i]^1B[i];1c(18 k=0;k<1C-1G;k++)6K.1o(1p[k]);1r=1j}1n 1f(1I==1a.38.7H){1j=1a.2O.81(1B,1k,1g);1c(i=0;i<16;i++)1p[i]=((1H)?2I[i]:1r[i])^1j[i];1H=2N;1f(7G<1C)1c(18 k=0;k<7G-1G;k++)6K.1o(1p[k]);1n 1c(18 k=0;k<1C-1G;k++)6K.1o(1p[k]);1r=1B}}}1d 6K}};18 7x={8y:1e(s){8x{1d az(ay(s))}8w(e){6B\'7Y 7X 8v ax: 7x.8y.\'}},8u:1e(s){8x{1d aw(av(s))}8w(e){6B(\'7Y 7X 8v 8q: 7x.8u.\')}},au:1e(){18 2M=[];1f(7F.1h==1&&7F[0].as==73)2M=7F[0];1n 2M=7F;18 6J=\'\';1c(18 i=0;i<2M.1h;i++)6J+=(2M[i]<16?\'0\':\'\')+2M[i].74(16);1d 6J.7L()},ar:1e(s){18 6J=[];s.7n(/(..)/g,1e(s){6J.1o(aq(s,16))});1d 6J},8t:1e(7D,7E){1f(7D===2Y)7D=0;1f(7E===2Y)7E=1;1d 6I.ap(6I.ao()*(7E+1))+7D},an:1e(7C){1f(7C===2Y)7C=16;18 1k=[];1c(18 i=0;i<7C*2;i++)1k.1o(1a.8t(0,8j));1d 1k},am:1e(s,1g){18 8s=al.ak.aj(s);1d 8s.7B(0,1g)},ai:1e(s){18 1p=[];1c(18 i=0;i<s.1h;i++){1p.1o(s.1E(i))}1d 1p},ah:1e(1p){18 s=\'\';1c(18 i=0;i<1p.1h;i++){s+=1N.1M(1p[i])}1d s},7W:{2X:[\'A\',\'B\',\'C\',\'D\',\'E\',\'F\',\'G\',\'H\',\'I\',\'J\',\'K\',\'L\',\'M\',\'N\',\'O\',\'P\',\'Q\',\'R\',\'S\',\'T\',\'U\',\'V\',\'W\',\'X\',\'Y\',\'Z\',\'a\',\'b\',\'c\',\'d\',\'e\',\'f\',\'g\',\'h\',\'i\',\'j\',\'k\',\'l\',\'m\',\'n\',\'o\',\'p\',\'q\',\'r\',\'s\',\'t\',\'u\',\'v\',\'w\',\'x\',\'y\',\'z\',\'0\',\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\'+\',\'/\',\'=\'],8r:1e(1y){18 1O=\'\';1c(18 i=0;i<1y.1h;i+=3){1O+=1a.2X[1y[i]>>2];1O+=1a.2X[((1y[i]&3)<<4)|(1y[i+1]>>4)];1f(!(1y[i+1]===2Y)){1O+=1a.2X[((1y[i+1]&15)<<2)|(1y[i+2]>>6)]}1n{1O+=\'=\'}1f(!(1y[i+2]===2Y)){1O+=1a.2X[1y[i+2]&63]}1n{1O+=\'=\'}}1d 1O},ag:1e(1y){18 1O=1a.8r(1y);18 7Z=1O.7B(0,64)+\'\\n\';1c(18 i=1;i<(6I.7A(1O.1h/64));i++){7Z+=1O.7B(i*64,i*64+64)+(6I.7A(1O.1h/64)==i+1?\'\':\'\\n\')}1d 7Z},8p:1e(1i){1i=1i.7n(/[\\r\\n\\t ]+/g,\'\')+\'====\';18 1y=[];18 c=[];1c(18 i=0;37;i=i+4){c[0]=1a.2X.7z(1i.7y(i));1f(c[0]==64){1d 1y}c[1]=1a.2X.7z(1i.7y(i+1));c[2]=1a.2X.7z(1i.7y(i+2));c[3]=1a.2X.7z(1i.7y(i+3));1f((c[0]<0)||(c[1]<0)||(c[1]==64)||(c[2]<0)||(c[3]<0)){6B\'7Y 7X 7W 8q at af \'+i+\': 7x.7W.8p.\'}1y.1o((c[0]<<2)|(c[1]>>4));1f(c[2]>=0&&c[2]<64){1y.1o(((c[1]&15)<<4)|(c[2]>>2));1f(c[3]>=0&&c[2]<64){1y.1o(((c[2]&3)<<6)|c[3])}}}}}};1e ae(1F){1e 2T(n,s){18 8o=(n<<s)|(n>>>(32-s));1d 8o};1e ad(7h){18 6H="";18 i;18 7V;18 7U;1c(i=0;i<=6;i+=2){7V=(7h>>>(i*4+4))&2L;7U=(7h>>>(i*4))&2L;6H+=7V.74(16)+7U.74(16)}1d 6H};1e 6G(7h){18 6H="";18 i;18 v;1c(i=7;i>=0;i--){v=(7h>>>(i*4))&2L;6H+=v.74(16)}1d 6H};1e 7m(1i){1i=1i.7n(/\\r\\n/g,"\\n");18 1A="";1c(18 n=0;n<1i.1h;n++){18 c=1i.1E(n);1f(c<2Q){1A+=1N.1M(c)}1n 1f((c>8i)&&(c<8h)){1A+=1N.1M((c>>6)|8g);1A+=1N.1M((c&63)|2Q)}1n{1A+=1N.1M((c>>12)|8f);1A+=1N.1M(((c>>6)&63)|2Q);1A+=1N.1M((c&63)|2Q)}}1d 1A};18 7g;18 i,j;18 W=8n 73(80);18 7f=8d;18 7e=8c;18 7d=8b;18 7c=8a;18 7b=ab;18 A,B,C,D,E;18 1L;1F=7m(1F);18 2K=1F.1h;18 2W=8n 73();1c(i=0;i<2K-3;i+=4){j=1F.1E(i)<<24|1F.1E(i+1)<<16|1F.1E(i+2)<<8|1F.1E(i+3);2W.1o(j)}8m(2K%4){6A 0:i=aa;36;6A 1:i=1F.1E(2K-1)<<24|a9;36;6A 2:i=1F.1E(2K-2)<<24|1F.1E(2K-1)<<16|a8;36;6A 3:i=1F.1E(2K-3)<<24|1F.1E(2K-2)<<16|1F.1E(2K-1)<<8|1x;36}2W.1o(i);7r((2W.1h%16)!=14)2W.1o(0);2W.1o(2K>>>29);2W.1o((2K<<3)&2S);1c(7g=0;7g<2W.1h;7g+=16){1c(i=0;i<16;i++)W[i]=2W[7g+i];1c(i=16;i<=79;i++)W[i]=2T(W[i-3]^W[i-8]^W[i-14]^W[i-16],1);A=7f;B=7e;C=7d;D=7c;E=7b;1c(i=0;i<=19;i++){1L=(2T(A,5)+((B&C)|(~B&D))+E+W[i]+a7)&2S;E=D;D=C;C=2T(B,30);B=A;A=1L}1c(i=20;i<=39;i++){1L=(2T(A,5)+(B^C^D)+E+W[i]+a6)&2S;E=D;D=C;C=2T(B,30);B=A;A=1L}1c(i=40;i<=59;i++){1L=(2T(A,5)+((B&C)|(B&D)|(C&D))+E+W[i]+a5)&2S;E=D;D=C;C=2T(B,30);B=A;A=1L}1c(i=60;i<=79;i++){1L=(2T(A,5)+(B^C^D)+E+W[i]+a4)&2S;E=D;D=C;C=2T(B,30);B=A;A=1L}7f=(7f+A)&2S;7e=(7e+B)&2S;7d=(7d+C)&2S;7c=(7c+D)&2S;7b=(7b+E)&2S}18 1L=6G(7f)+6G(7e)+6G(7d)+6G(7c)+6G(7b);1d 1L.7L()}18 a3=1e(1i){1e 7a(76,7T){1d(76<<7T)|(76>>>(32-7T))}1e 1l(7w,7v){18 7u,7t,6F,6E,6z;6F=(7w&7S);6E=(7v&7S);7u=(7w&7s);7t=(7v&7s);6z=(7w&8l)+(7v&8l);1f(7u&7t){1d(6z^7S^6F^6E)}1f(7u|7t){1f(6z&7s){1d(6z^a2^6F^6E)}1n{1d(6z^7s^6F^6E)}}1n{1d(6z^6F^6E)}}1e F(x,y,z){1d(x&y)|((~x)&z)}1e G(x,y,z){1d(x&z)|(y&(~z))}1e H(x,y,z){1d(x^y^z)}1e I(x,y,z){1d(y^(x|(~z)))}1e 1w(a,b,c,d,x,s,ac){a=1l(a,1l(1l(F(b,c,d),x),ac));1d 1l(7a(a,s),b)};1e 1v(a,b,c,d,x,s,ac){a=1l(a,1l(1l(G(b,c,d),x),ac));1d 1l(7a(a,s),b)};1e 1u(a,b,c,d,x,s,ac){a=1l(a,1l(1l(H(b,c,d),x),ac));1d 1l(7a(a,s),b)};1e 1t(a,b,c,d,x,s,ac){a=1l(a,1l(1l(I(b,c,d),x),ac));1d 1l(7a(a,s),b)};1e 8e(1i){18 6y;18 77=1i.1h;18 7R=77+8;18 8k=(7R-(7R%64))/64;18 7q=(8k+1)*16;18 35=73(7q-1);18 78=0;18 2R=0;7r(2R<77){6y=(2R-(2R%4))/4;78=(2R%4)*8;35[6y]=(35[6y]|(1i.1E(2R)<<78));2R++}6y=(2R-(2R%4))/4;78=(2R%4)*8;35[6y]=35[6y]|(1x<<78);35[7q-2]=77<<3;35[7q-1]=77>>>29;1d 35};1e 6M(76){18 7o="",7p="",7Q,75;1c(75=0;75<=3;75++){7Q=(76>>>(75*8))&8j;7p="0"+7Q.74(16);7o=7o+7p.a1(7p.1h-2,2)}1d 7o};1e 7m(1i){1i=1i.7n(/\\r\\n/g,"\\n");18 1A="";1c(18 n=0;n<1i.1h;n++){18 c=1i.1E(n);1f(c<2Q){1A+=1N.1M(c)}1n 1f((c>8i)&&(c<8h)){1A+=1N.1M((c>>6)|8g);1A+=1N.1M((c&63)|2Q)}1n{1A+=1N.1M((c>>12)|8f);1A+=1N.1M(((c>>6)&63)|2Q);1A+=1N.1M((c&63)|2Q)}}1d 1A};18 x=73();18 k,7P,7O,7N,7M,a,b,c,d;18 72=7,71=12,70=17,6Z=22;18 6Y=5,6X=9,6W=14,6V=20;18 6U=4,6T=11,6S=16,6R=23;18 6Q=6,6P=10,6O=15,6N=21;1i=7m(1i);x=8e(1i);a=8d;b=8c;c=8b;d=8a;1c(k=0;k<x.1h;k+=16){7P=a;7O=b;7N=c;7M=d;a=1w(a,b,c,d,x[k+0],72,a0);d=1w(d,a,b,c,x[k+1],71,9Z);c=1w(c,d,a,b,x[k+2],70,9Y);b=1w(b,c,d,a,x[k+3],6Z,9X);a=1w(a,b,c,d,x[k+4],72,9W);d=1w(d,a,b,c,x[k+5],71,9V);c=1w(c,d,a,b,x[k+6],70,9U);b=1w(b,c,d,a,x[k+7],6Z,9T);a=1w(a,b,c,d,x[k+8],72,9S);d=1w(d,a,b,c,x[k+9],71,9R);c=1w(c,d,a,b,x[k+10],70,9Q);b=1w(b,c,d,a,x[k+11],6Z,9P);a=1w(a,b,c,d,x[k+12],72,9O);d=1w(d,a,b,c,x[k+13],71,9N);c=1w(c,d,a,b,x[k+14],70,9M);b=1w(b,c,d,a,x[k+15],6Z,9L);a=1v(a,b,c,d,x[k+1],6Y,9K);d=1v(d,a,b,c,x[k+6],6X,9J);c=1v(c,d,a,b,x[k+11],6W,9I);b=1v(b,c,d,a,x[k+0],6V,9H);a=1v(a,b,c,d,x[k+5],6Y,9G);d=1v(d,a,b,c,x[k+10],6X,9F);c=1v(c,d,a,b,x[k+15],6W,9E);b=1v(b,c,d,a,x[k+4],6V,9D);a=1v(a,b,c,d,x[k+9],6Y,9C);d=1v(d,a,b,c,x[k+14],6X,9B);c=1v(c,d,a,b,x[k+3],6W,9A);b=1v(b,c,d,a,x[k+8],6V,9z);a=1v(a,b,c,d,x[k+13],6Y,9y);d=1v(d,a,b,c,x[k+2],6X,9x);c=1v(c,d,a,b,x[k+7],6W,9w);b=1v(b,c,d,a,x[k+12],6V,9v);a=1u(a,b,c,d,x[k+5],6U,9u);d=1u(d,a,b,c,x[k+8],6T,9t);c=1u(c,d,a,b,x[k+11],6S,9s);b=1u(b,c,d,a,x[k+14],6R,9r);a=1u(a,b,c,d,x[k+1],6U,9q);d=1u(d,a,b,c,x[k+4],6T,9p);c=1u(c,d,a,b,x[k+7],6S,9o);b=1u(b,c,d,a,x[k+10],6R,9n);a=1u(a,b,c,d,x[k+13],6U,9m);d=1u(d,a,b,c,x[k+0],6T,9l);c=1u(c,d,a,b,x[k+3],6S,9k);b=1u(b,c,d,a,x[k+6],6R,9j);a=1u(a,b,c,d,x[k+9],6U,9i);d=1u(d,a,b,c,x[k+12],6T,9h);c=1u(c,d,a,b,x[k+15],6S,9g);b=1u(b,c,d,a,x[k+2],6R,9f);a=1t(a,b,c,d,x[k+0],6Q,9e);d=1t(d,a,b,c,x[k+7],6P,9d);c=1t(c,d,a,b,x[k+14],6O,9c);b=1t(b,c,d,a,x[k+5],6N,9b);a=1t(a,b,c,d,x[k+12],6Q,9a);d=1t(d,a,b,c,x[k+3],6P,99);c=1t(c,d,a,b,x[k+10],6O,98);b=1t(b,c,d,a,x[k+1],6N,97);a=1t(a,b,c,d,x[k+8],6Q,96);d=1t(d,a,b,c,x[k+15],6P,95);c=1t(c,d,a,b,x[k+6],6O,94);b=1t(b,c,d,a,x[k+13],6N,93);a=1t(a,b,c,d,x[k+4],6Q,92);d=1t(d,a,b,c,x[k+11],6P,91);c=1t(c,d,a,b,x[k+2],6O,90);b=1t(b,c,d,a,x[k+9],6N,8Z);a=1l(a,7P);b=1l(b,7O);c=1l(c,7N);d=1l(d,7M)}18 1L=6M(a)+6M(b)+6M(c)+6M(d);1d 1L.7L()}',62,665,'||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||var||this|state|for|return|function|if|size|length|string|output|key|AddUnsigned|expandedKey|else|push|byteArray|mult|input|cpy|II|HH|GG|FF|0x80|flatArr|galois_multiplication|utftext|ciphertext|end|nbrRounds|charCodeAt|msg|start|firstRound|mode|0x1b|word|temp|fromCharCode|String|b64|0x8d|0x83|0x91|0x9f|0xef|0xc5|0xcb|0x63|0x1d|0x01|0x25||||||0x39|0x4a|0x72|0x3a||0x10|0x02|0xc6|0xd4|0x20|0x04|0x5e|0x66|0x74|0xe4|0x94|0x9a|0x97|0xb3|0xbd|0xcc|0xc2|0xfa|0xe8|0xbc|0x08|0x40|0x6a|0x2f|0x33|0x4d|0xd3|0x61|0x7d|0x35|0xab|0xd8|0x6c|0x36|iv|column|msg_len|0x0f|array|false|aes|encrypt|128|lByteCount|0x0ffffffff|rotate_left|block|isInv|word_array|chars|null|bytesIn||roundKey||statePointer|currentSize|lWordArray|break|true|modeOfOperation||0x100|0xb5|0xbb|0xa9|0xa7|0xfd|0xf3|0xe1|0xd9|0xd7|0x6d|0x71|0x7f|0x55|0x5b|0x49|0x47|0x13|0x2b|0x37|0x56|0x58|0x44|0x6e|0x60|0x7c|0x26|0x28|0x34|0x1e|0x0c|0xb6|0xb8|0xaa|0xa4|0x8e|0x92|0x9c|0xc8|0xda|0xfe|0xf0|0xe2|0xec|0x2e|0x3c|0x32|0x18|0x16|0x0a|0x50|0x4c||0x42|0x68|0x7a|0xc0|0xce|0xdc|0xd2|0xf8|0xf6|0xea|0xb0|0xbe|0xac|0xa2|0x88|0x86|0xfb|0xf5|0xe7|0xe9|0xc3|0xcd|0xdf|0xd1|0x8b|0x85|0x99|0xaf|0xa1|0x15|0x07|0x09|0x23|0x2d|0x3f|0x31|0x6b|0x65|0x77|0x79|0x53|0x5d|0x4f|0x41|0xd0|0xde|0xf4|0xe6|0xb2|0xa0|0xae|0x84|0x8a|0x98|0x96|0x2c|0x22|0x30|0x3e|0x14|0x1a|0x06|0x5c|0x52|0x4e|0x64|0x78|0x76|0x17|0x19||0x0b|0x05|0x21|0x3d|0x67|0x69|0x7b|0x75|0x5f|0x51|0x43|0xf7|0xf9|0xeb|0xe5|0xcf|0xc1|0xdd|0x87|0x89|0x9b|0x95|0xbf|0xb1|0xa3|0xad|0x6f|0x73|0x59|0x57|0x45|0x4b|0x11|0x1f|0x0d|0x03|0x29|0x27|0x3b|0x81|0x8f|0x9d|0x93|0xb9|0xb7|0xa5|0xf1|0xff|0xed|0xe3|0xc9|0xc7||0xd5|0xdb|||0xba|0xb4|0xa6|0xa8|0x82|0x8c|0x9e|0x90|0xca|0xc4|0xd6|0xf2|0xfc|0xee|0xe0|0x5a|0x54|0x46|0x48|0x62|0x7e|0x70|0x2a|0x24|0x38|0x12|0x1c|0x0e|0x00|lWordCount|lResult|case|throw|createRoundKey|addRoundKey|lY8|lX8|cvt_hex|str|Math|ret|bytesOut|cipherIn|WordToHex|S44|S43|S42|S41|S34|S33|S32|S31|S24|S23|S22|S21|S14|S13|S12|S11|Array|toString|lCount|lValue|lMessageLength|lBytePosition||RotateLeft|H4|H3|H2|H1|H0|blockstart|val|cipherOut|keySize|subBytes|shiftRows|Utf8Encode|replace|WordToHexValue|WordToHexValue_temp|lNumberOfWords|while|0x40000000|lY4|lX4|lY|lX|cryptoHelpers|charAt|indexOf|ceil|slice|len|min|max|arguments|originalsize|CBC|numberOfRounds|tmp|sbox|toLowerCase|DD|CC|BB|AA|lByte|lNumberOfWords_temp1|0x80000000|iShiftBits|vl|vh|base64|during|error|broken_b64||decrypt|OFB|CFB|getPaddedBlock|expandKey|SIZE_256|mixColumns|counter|expandedKeySize|0x10325476|0x98BADCFE|0xEFCDAB89|0x67452301|ConvertToWordArray|224|192|2048|127|255|lNumberOfWords_temp2|0x3FFFFFFF|switch|new|t4|decode|decoding|encode_line|sha|getRandom|decode_utf8|utf8|catch|try|encode_utf8|bits|be|must|specified|match|not|does|Key|cpad|invMain|main|SIZE_192|SIZE_128|invRound|round|mixColumn|hi_bit_set|nbr|shiftRow|rsbox|roundKeyPointer|rconIteration|core|iteration|Rcon|rotate|0xEB86D391|0x2AD7D2BB|0xBD3AF235|0xF7537E82|0x4E0811A1|0xA3014314|0xFE2CE6E0|0x6FA87E4F|0x85845DD1|0xFFEFF47D|0x8F0CCC92|0x655B59C3|0xFC93A039|0xAB9423A7|0x432AFF97|0xF4292244|0xC4AC5665|0x1FA27CF8|0xE6DB99E5|0xD9D4D039|0x4881D05|0xD4EF3085|0xEAA127FA|0x289B7EC6|0xBEBFBC70|0xF6BB4B60|0x4BDECFA9|0xA4BEEA44|0xFDE5380C|0x6D9D6122|0x8771F681|0xFFFA3942|0x8D2A4C8A|0x676F02D9|0xFCEFA3F8|0xA9E3E905|0x455A14ED|0xF4D50D87|0xC33707D6|0x21E1CDE6|0xE7D3FBC8|0xD8A1E681|0x2441453|0xD62F105D|0xE9B6C7AA|0x265E5A51|0xC040B340|0xF61E2562|0x49B40821|0xA679438E|0xFD987193|0x6B901122|0x895CD7BE|0xFFFF5BB1|0x8B44F7AF|0x698098D8|0xFD469501|0xA8304613|0x4787C62A|0xF57C0FAF|0xC1BDCEEE|0x242070DB|0xE8C7B756|0xD76AA478|substr|0xC0000000|MD5|0xCA62C1D6|0x8F1BBCDC|0x6ED9EBA1|0x5A827999|0x08000|0x0800000|0x080000000|0xC3D2E1F0||lsb_hex|SHA1|pos|encode|convertByteArrayToString|convertStringToByteArray|arr_sha256|sha2|jsHash|generatePrivateKey|generateSharedKey|random|floor|parseInt|toNumbers|constructor||toHex|escape|decodeURIComponent|encoding|encodeURIComponent|unescape|cipher|default|GEX|GDX|GBX|G9X|G3X|G2X|slowAES'.split('|'),0,{}))
diff --git a/javascript/jsPacker/hash.min.js b/javascript/jsPacker/hash.min.js
deleted file mode 100644
index d8dbba6..0000000
--- a/javascript/jsPacker/hash.min.js
+++ /dev/null
@@ -1 +0,0 @@
-eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('18 aI={2O:{7j:{8L:16,8K:24,86:32},7K:[1W,3z,4D,5g,6g,4B,5A,1U,4W,1Y,5e,3s,3O,3j,2E,56,6d,69,5Y,2C,2r,5C,3q,3P,5z,2d,4e,4s,3L,3I,27,44,5S,3f,5Q,3A,2H,4z,5l,2p,3C,5T,5o,5U,3l,2F,4A,4u,2f,5Z,4x,4l,3V,4T,5b,2l,4v,6u,1x,3Q,5n,5L,4N,5h,4w,1Q,4U,4Z,1J,3x,6k,4O,52,5M,6f,2n,5K,5X,2x,4Q,4F,4o,6x,5W,2e,6h,5x,3o,2w,1V,4c,25,26,3Z,3v,5p,4J,1T,3H,4h,5k,2z,2y,4q,5E,5m,2b,3m,3Y,3T,1S,68,5j,5y,2v,5O,3K,5P,6t,4i,2t,3F,3N,5c,2a,5V,3g,47,4m,3E,3r,3R,5i,2m,3w,57,6e,3e,6p,5d,54,4G,58,5B,3y,5N,4H,46,4V,6r,6c,4f,6m,6i,3G,4Y,4K,2g,5a,62,6j,3U,28,3X,3p,50,6s,51,2q,2A,4d,6o,1R,5v,2j,4E,4j,3M,3t,3k,1P,61,53,3d,2G,3u,4L,4a,4C,43,4P,2u,65,55,1Z,3S,6v,67,66,2c,2s,5r,2i,5H,5F,2o,4p,4R,6q,4X,3b,2h,6n,5J,49,6w,2B,2D,5D,5R,4g,5q,1X,6b,3h,48,4S,5G,5f,3i,3J,2k,5u,3D,5s,4k,45,3n,3B,4n,6a,4t,5t,5I,5w,4M,41,42,4I,4r,4y,2L,4b,6l,3c,3W],8S:[52,4w,2w,61,4W,2H,5T,6t,5w,2v,5y,6b,5N,3g,3j,4h,3z,5X,25,69,5u,2x,5V,5s,3C,3J,5k,3w,6e,4K,4k,1V,6l,5g,2k,3U,67,2q,4x,5d,6i,3Z,5v,5a,41,2r,4l,53,2u,3S,4t,2h,3B,3i,6s,4N,56,3o,4e,3p,3k,4p,4o,1Z,27,48,49,54,4g,42,4S,3W,2d,3I,51,2p,4G,4C,3F,3K,2G,6q,6n,3Y,3f,5W,5R,3N,2g,4u,6m,5D,3e,1P,5P,4Q,6c,2F,2E,6x,6a,2t,2A,3X,5l,2j,3v,5b,3G,2n,5E,50,4J,4U,3D,5O,6d,4z,2L,2b,5q,4s,2o,5J,1Y,3r,4R,4B,28,1R,5G,4I,4H,5e,46,4a,2m,6g,5p,45,3P,66,4M,5B,4T,4d,2i,4V,4j,5z,2D,4q,3Q,5m,3t,2s,6v,5h,4n,3x,3q,5U,4Z,3l,1X,5K,1U,5t,5A,5S,6o,6w,3H,3V,4c,1J,6h,3u,4X,5F,2c,47,4E,2e,2l,62,44,3O,55,4m,6k,4L,5H,5r,68,2y,4f,4v,5Z,4A,5x,6u,2a,5C,5L,1x,3R,5i,3y,5j,3m,3d,58,3b,26,5I,4y,5o,43,1S,5Q,5Y,3L,1T,4O,6j,5M,2z,4P,6r,4i,4b,3M,5n,3c,3T,1Q,4F,4r,2B,57,3s,2f,6p,65,4D,6f,3A,3h,5f,4Y,1W,3n,5c,3E,2C],8Y:1e(1K){18 c=1K[0];1c(18 i=0;i<3;i++)1K[i]=1K[i+1];1K[3]=c;1d 1K},8X:[1P,1Y,2b,2f,2u,2a,2e,2v,1x,1J,2H,2G,2F,2E,2z,2l,2x,2g,2t,1W,2c,2m,2D,2w,2d,2n,2C,2r,1T,1U,1R,25,27,2j,2A,2o,2B,2q,1S,1Z,26,2k,2y,2h,2p,1Q,1X,28,2i,2s,1V,1P,1Y,2b,2f,2u,2a,2e,2v,1x,1J,2H,2G,2F,2E,2z,2l,2x,2g,2t,1W,2c,2m,2D,2w,2d,2n,2C,2r,1T,1U,1R,25,27,2j,2A,2o,2B,2q,1S,1Z,26,2k,2y,2h,2p,1Q,1X,28,2i,2s,1V,1P,1Y,2b,2f,2u,2a,2e,2v,1x,1J,2H,2G,2F,2E,2z,2l,2x,2g,2t,1W,2c,2m,2D,2w,2d,2n,2C,2r,1T,1U,1R,25,27,2j,2A,2o,2B,2q,1S,1Z,26,2k,2y,2h,2p,1Q,1X,28,2i,2s,1V,1P,1Y,2b,2f,2u,2a,2e,2v,1x,1J,2H,2G,2F,2E,2z,2l,2x,2g,2t,1W,2c,2m,2D,2w,2d,2n,2C,2r,1T,1U,1R,25,27,2j,2A,2o,2B,2q,1S,1Z,26,2k,2y,2h,2p,1Q,1X,28,2i,2s,1V,1P,1Y,2b,2f,2u,2a,2e,2v,1x,1J,2H,2G,2F,2E,2z,2l,2x,2g,2t,1W,2c,2m,2D,2w,2d,2n,2C,2r,1T,1U,1R,25,27,2j,2A,2o,2B,2q,1S,1Z,26,2k,2y,2h,2p,1Q,1X,28,2i,2s,1V],aH:[6x,2b,2f,50,2u,3X,3E,6w,2a,6u,4Y,3W,3V,4Z,6v,3D,2e,4V,6s,3A,3B,6r,4U,3S,4W,3U,3C,2H,6t,28,3T,4X,2v,41,3w,6m,6n,26,3Z,53,3Y,52,6l,3u,3v,6k,51,2g,3y,6o,54,2h,42,2w,2G,3x,6q,27,2i,56,55,43,3z,6p,1x,69,4Q,4g,4f,4R,6a,3J,6c,3K,2k,4T,4S,2l,3L,6b,4O,4e,3I,67,68,3H,4d,4P,4b,4N,66,3F,3G,65,2t,4c,44,2q,6e,2c,3M,6d,2p,45,4J,47,2d,6f,2F,3N,46,4K,6j,3Q,2j,4M,2s,4a,3R,6i,3P,6g,4L,49,48,2r,6h,3O,1J,58,5H,1X,3r,5G,57,4u,5a,4w,2L,5I,5J,1Y,4v,5b,5M,25,4z,5d,2y,4A,3t,2D,3s,5K,2x,4y,4x,5c,5L,1Z,3o,5C,5i,4G,4F,5j,5D,3n,5F,3p,4H,2z,5k,4I,3q,5E,5g,4E,3m,2C,5B,3l,4D,5h,4B,5f,5A,3k,1W,2B,5e,4C,5u,4r,1S,5P,5Q,1R,2m,5v,4p,5t,5O,1P,1Q,5N,5s,4q,3c,5R,5w,2o,2n,5x,5S,3b,2E,3d,4s,5z,5y,4t,3e,5T,62,3i,4n,5r,2A,4o,3j,61,1V,5Y,5p,4m,4l,5q,5Z,1U,4h,5m,5V,3f,3g,5U,5l,4i,5n,4k,1T,5W,5X,3h,4j,5o],aG:[6x,5J,50,5b,3E,2L,3X,4w,3V,1J,3D,1X,4Y,57,6u,5G,4W,2y,2H,2D,3T,4z,28,25,3B,3s,3S,4y,6s,5L,4V,5c,3y,1W,2h,4C,2G,5A,2w,5f,55,5g,6p,2C,2i,4D,27,3l,3Y,4F,3u,3n,51,5i,6k,5C,6n,5F,53,2z,3w,3q,41,4I,44,4l,2c,1U,2p,5p,6d,5Y,2F,62,4K,5r,2d,3j,47,4o,3P,3g,49,4i,6h,5V,2r,5m,2s,5n,6i,5W,2j,4j,3Q,3h,4O,5y,67,5T,4d,4s,3H,3d,3G,3c,4c,2o,66,5S,4N,5x,6c,5Q,4T,5v,3L,1S,2l,4r,4f,4p,3J,1P,4Q,5s,69,5N,5u,4S,5P,6b,2m,2k,1R,3K,1Q,1x,4q,4g,5O,6a,5t,4R,2E,68,5z,4P,3e,3I,4t,4e,2n,4b,3b,3F,5w,2t,5R,65,4h,48,3f,3O,5l,4L,5U,6g,5X,6j,5o,4M,1T,3R,4k,4a,1V,3M,4m,45,5Z,6e,5q,2q,2A,4J,61,6f,4n,46,3i,3N,3o,3v,4G,2g,5D,6l,5j,52,5k,2v,5E,6m,4H,3Z,3p,26,4B,42,3k,3x,5e,54,2B,6o,5B,6q,5h,56,3m,3z,4E,43,5M,6t,5d,4X,3t,3C,4A,3U,4x,2e,1Z,3A,2x,4U,5K,6r,5a,2u,5I,6w,4v,2f,1Y,2b,3r,2a,4u,3W,5H,6v,58,4Z],aF:[6x,4w,6u,1J,6s,4y,2H,4z,6n,4I,6k,4F,2G,4C,6p,4D,6c,4r,69,4p,66,2o,67,4s,2F,4o,6d,4l,6h,4i,6i,4j,5M,3U,5K,2e,5H,3W,5I,2f,5B,43,2B,42,5D,2g,5E,3Z,2E,4e,5R,4b,5O,4g,5P,2k,5X,4a,5U,48,5Z,45,61,46,56,3m,54,3k,52,3o,2v,3p,4X,3t,4U,1Z,4Z,3r,2u,1Y,4M,1T,4L,3f,2q,1V,4J,3i,4P,3e,2t,3b,4R,1Q,4S,1R,2z,3w,5i,3u,5f,3y,5g,27,5b,3E,57,3D,5c,3B,2y,28,5r,2d,5p,2c,5m,3P,5n,3Q,5v,3L,5s,3J,5x,3G,5y,3H,3R,5o,3O,5l,3M,5q,3N,2A,3I,5z,3F,5w,1x,5t,3K,5u,3z,5h,3x,5e,3v,5j,26,5k,3C,5d,3A,2x,2a,58,2b,5a,3j,4K,1U,2p,3g,2r,3h,2s,1S,4T,1P,4Q,3c,4N,3d,4O,3q,53,3n,51,1W,2w,3l,55,2L,50,1X,4Y,3s,4V,25,4W,2l,5Q,4f,5N,4c,5S,4d,5T,47,62,44,5Y,49,5V,2j,5W,3X,5J,3V,5G,3S,5L,3T,2D,41,5F,3Y,5C,2h,5A,2i,2C,4t,68,2n,65,4q,6a,2m,6b,4k,6j,4h,6g,4m,6e,4n,6f,4A,6t,4x,6r,4u,6v,4v,6w,4E,6q,4B,6o,4G,6l,4H,6m],aE:[6x,5a,3W,1X,4U,5L,28,4A,3v,4F,53,5E,2i,3m,6o,5f,4b,3c,67,5z,3L,2m,4R,5N,2s,5X,3O,4i,6e,5p,47,3i,5g,6q,3k,2h,5D,51,4I,26,4x,3B,2D,4X,2L,2f,58,6u,1V,44,5r,6f,4j,3R,5U,2r,5Q,4S,4q,3J,5w,66,3d,4e,49,3f,6j,5n,3N,4o,2p,5Z,4P,5T,3G,2n,69,5t,2k,1S,6m,2z,3Y,3o,2w,2B,3z,4D,3D,4u,2u,5J,3U,25,6s,2x,1P,4g,5u,6c,4t,3H,5S,2t,61,4K,4l,3M,5m,6g,1T,2j,5d,2H,3s,2e,5G,4Z,4v,3E,4C,3x,5B,55,3p,41,5i,6l,5l,6h,3h,4a,62,4J,4m,2c,4s,3I,5R,4N,1Q,4f,5v,6b,3q,3Z,5j,6k,4B,3y,2C,56,5H,4Y,4w,2b,2y,6t,1Z,3S,6a,5s,2l,1R,4O,2E,3F,2o,2d,4n,2q,5Y,48,3g,6i,5o,3T,3t,6r,5c,2a,1J,50,5I,54,5A,27,4E,6n,5k,2g,3n,1Y,3X,57,6v,4y,3A,5M,4W,5C,52,4H,3w,5h,6p,1W,42,5x,65,3e,4d,5P,4T,4p,1x,4k,3Q,5V,4L,1U,45,2A,2F,43,3l,2G,5e,3u,4G,2v,5F,4V,5K,3C,4z,6w,5b,3V,3r,6d,5q,46,3j,4M,5W,3P,4h,3K,4r,4Q,5O,4c,3b,68,5y],aD:[6x,5I,4Z,57,3C,25,3S,4x,42,4C,27,3m,51,5j,6m,5F,4J,5r,6d,5Z,2j,4k,3O,3g,3G,3b,4e,4s,6a,5N,4T,5u,3c,3F,4t,4d,5O,69,5v,4S,2A,4K,5Y,6e,4j,4a,3f,3P,4B,2h,3l,3z,5i,52,5E,6n,5J,6w,58,4Y,3t,28,4y,2e,3k,3y,4D,43,5C,6l,5k,53,5b,2u,5H,6u,4A,3T,3s,3A,2o,4b,3e,3H,5t,4Q,5Q,6b,61,2F,5p,2q,3h,3R,4h,49,6f,62,2p,5q,3Q,1T,48,4i,4c,2n,3I,3d,4R,5s,6c,5P,50,5a,6v,5G,3U,4z,3B,1Z,3x,1W,2i,4E,6k,5D,2v,2z,3N,3j,44,4m,6i,5X,4L,5m,4N,5w,68,5T,4g,4p,3L,1R,3X,4v,2a,1X,4X,2y,6s,5K,6o,5A,55,5h,3u,3o,3Z,4I,2B,2G,5g,56,3n,3v,4H,41,4w,2f,3r,3D,5d,4W,5L,6r,5x,2t,2E,67,4q,4f,1S,3K,3i,2d,4l,45,5W,6j,5l,2r,5S,65,5z,4O,1Q,3J,4r,2k,4n,47,1U,3M,5n,4M,5U,6h,5e,2w,2C,6q,4F,2g,3p,3w,2L,2b,4u,3V,5M,2H,5c,4U,3E,1Y,3W,1J,6t,2D,4V,2x,54,5f,6p,5B,3Y,4G,26,3q,46,4o,2c,1V,2s,5o,6g,5V,66,5R,4P,5y,1x,1P,2l,2m],aC:[6x,6w,6v,6u,6t,2H,6s,6r,6q,6p,2G,6o,6n,6m,6l,6k,6j,6i,6h,6g,2F,6f,6e,6d,6c,6b,6a,69,68,67,66,65,62,61,5Z,5Y,5X,5W,5V,5U,2E,5T,5S,5R,5Q,5P,5O,5N,5M,2D,5L,5K,5J,5I,5H,5G,5F,5E,5D,5C,5B,2C,5A,2B,5z,5y,5x,5w,5v,5u,5t,5s,5r,2A,5q,5p,5o,5n,5m,5l,2z,5k,5j,5i,5h,5g,5f,5e,5d,2y,5c,2x,5b,5a,58,57,56,55,2w,54,53,2v,52,51,50,2u,4Z,4Y,4X,4W,4V,4U,4T,4S,4R,4Q,4P,4O,4N,2t,4M,2s,2r,4L,4K,4J,2q,2p,4I,4H,4G,4F,4E,4D,4C,4B,4A,4z,4y,4x,4w,4v,4u,1J,4t,4s,2o,2n,4r,2m,4q,4p,4o,4n,4m,4l,4k,4j,4i,4h,2l,2k,4g,4f,4e,4d,4c,4b,4a,2j,49,48,47,46,45,44,43,2i,2h,42,41,3Z,2g,3Y,3X,2f,3W,3V,3U,3T,3S,2e,3R,3Q,3P,3O,2d,3N,3M,2c,3L,3K,1x,3J,3I,3H,3G,3F,3E,2b,2a,3D,3C,28,3B,3A,3z,27,3y,3x,3w,26,3v,3u,3t,25,3s,1Z,2L,1Y,3r,1X,3q,3p,3o,3n,3m,3l,1W,3k,3j,3i,1V,1U,1T,3h,3g,3f,3e,3d,3c,3b,1S,1R,1Q,1P],8V:1e(1K,8W){1K=1a.8Y(1K);1c(18 i=0;i<4;++i)1K[i]=1a.7K[1K[i]];1K[0]=1K[0]^1a.8X[8W];1d 1K},85:1e(1k,1g){18 89=(16*(1a.7I(1g)+1));18 34=0;18 8U=1;18 t=[];18 1m=[];1c(18 i=0;i<89;i++)1m[i]=0;1c(18 j=0;j<1g;j++)1m[j]=1k[j];34+=1g;7r(34<89){1c(18 k=0;k<4;k++)t[k]=1m[(34-4)+k];1f(34%1g==0)t=1a.8V(t,8U++);1f(1g==1a.7j.86&&((34%1g)==16))1c(18 l=0;l<4;l++)t[l]=1a.7K[t[l]];1c(18 m=0;m<4;m++){1m[34]=1m[34-1g]^t[m];34++}}1d 1m},6D:1e(1b,31){1c(18 i=0;i<16;i++)1b[i]^=31[i];1d 1b},6C:1e(1m,8T){18 31=[];1c(18 i=0;i<4;i++)1c(18 j=0;j<4;j++)31[j*4+i]=1m[8T+i*4+j];1d 31},7k:1e(1b,2V){1c(18 i=0;i<16;i++)1b[i]=2V?1a.8S[1b[i]]:1a.7K[1b[i]];1d 1b},7l:1e(1b,2V){1c(18 i=0;i<4;i++)1b=1a.8R(1b,i*4,i,2V);1d 1b},8R:1e(1b,33,8Q,2V){1c(18 i=0;i<8Q;i++){1f(2V){18 7J=1b[33+3];1c(18 j=3;j>0;j--)1b[33+j]=1b[33+j-1];1b[33]=7J}1n{18 7J=1b[33];1c(18 j=0;j<3;j++)1b[33+j]=1b[33+j+1];1b[33+3]=7J}}1d 1b},1z:1e(a,b){18 p=0;1c(18 88=0;88<8;88++){1f((b&1)==1)p^=a;1f(p>3a)p^=3a;18 8P=(a&1x);a<<=1;1f(a>3a)a^=3a;1f(8P==1x)a^=1J;1f(a>3a)a^=3a;b>>=1;1f(b>3a)b^=3a;}1d p},87:1e(1b,2V){18 2J=[];1c(18 i=0;i<4;i++){1c(18 j=0;j<4;j++)2J[j]=1b[(j*4)+i];2J=1a.8O(2J,2V);1c(18 k=0;k<4;k++)1b[(k*4)+i]=2J[k]}1d 1b},8O:1e(2J,2V){18 1q=[];1f(2V)1q=[14,9,13,11];1n 1q=[2,1,1,3];18 1s=[];1c(18 i=0;i<4;i++)1s[i]=2J[i];2J[0]=1a.1z(1s[0],1q[0])^1a.1z(1s[3],1q[1])^1a.1z(1s[2],1q[2])^1a.1z(1s[1],1q[3]);2J[1]=1a.1z(1s[1],1q[0])^1a.1z(1s[0],1q[1])^1a.1z(1s[3],1q[2])^1a.1z(1s[2],1q[3]);2J[2]=1a.1z(1s[2],1q[0])^1a.1z(1s[1],1q[1])^1a.1z(1s[0],1q[2])^1a.1z(1s[3],1q[3]);2J[3]=1a.1z(1s[3],1q[0])^1a.1z(1s[2],1q[1])^1a.1z(1s[1],1q[2])^1a.1z(1s[0],1q[3]);1d 2J},8N:1e(1b,31){1b=1a.7k(1b,2N);1b=1a.7l(1b,2N);1b=1a.87(1b,2N);1b=1a.6D(1b,31);1d 1b},8M:1e(1b,31){1b=1a.7l(1b,37);1b=1a.7k(1b,37);1b=1a.6D(1b,31);1b=1a.87(1b,37);1d 1b},8J:1e(1b,1m,1D){1b=1a.6D(1b,1a.6C(1m,0));1c(18 i=1;i<1D;i++)1b=1a.8N(1b,1a.6C(1m,16*i));1b=1a.7k(1b,2N);1b=1a.7l(1b,2N);1b=1a.6D(1b,1a.6C(1m,16*1D));1d 1b},8I:1e(1b,1m,1D){1b=1a.6D(1b,1a.6C(1m,16*1D));1c(18 i=1D-1;i>0;i--)1b=1a.8M(1b,1a.6C(1m,16*i));1b=1a.7l(1b,37);1b=1a.7k(1b,37);1b=1a.6D(1b,1a.6C(1m,0));1d 1b},7I:1e(1g){18 1D;8m(1g){6A 1a.7j.8L:1D=10;36;6A 1a.7j.8K:1D=12;36;6A 1a.7j.86:1D=14;36;aB:1d 2Y;36}1d 1D},2P:1e(1r,1k,1g){18 1j=[];18 2U=[];18 1D=1a.7I(1g);1c(18 i=0;i<4;i++)1c(18 j=0;j<4;j++)2U[(i+(j*4))]=1r[(i*4)+j];18 1m=1a.85(1k,1g);2U=1a.8J(2U,1m,1D);1c(18 k=0;k<4;k++)1c(18 l=0;l<4;l++)1j[(k*4)+l]=2U[(k+(l*4))];1d 1j},81:1e(1r,1k,1g){18 1j=[];18 2U=[];18 1D=1a.7I(1g);1c(18 i=0;i<4;i++)1c(18 j=0;j<4;j++)2U[(i+(j*4))]=1r[(i*4)+j];18 1m=1a.85(1k,1g);2U=1a.8I(2U,1m,1D);1c(18 k=0;k<4;k++)1c(18 l=0;l<4;l++)1j[(k*4)+l]=2U[(k+(l*4))];1d 1j}},38:{82:0,83:1,7H:2},84:1e(2Z,1G,1C,1I){1f(1C-1G>16)1C=1G+16;18 2M=2Z.7B(1G,1C);1f(1I==1a.38.7H){18 8H=16-2M.1h;7r(2M.1h<16){2M.1o(8H)}}1d 2M},2P:1e(2Z,1I,1k,1g,2I){1f(1k.1h%1g){6B\'8G 1h 8F 8E 8D 8C 1g.\'}1f(2I.1h%16){6B\'2I 1h 8B 8A 2Q 8z.\'}18 1p=[];18 1r=[];18 1j=[];18 1B=[];18 7i=[];18 1H=37;1f(2Z!==2Y){1c(18 j=0;j<6I.7A(2Z.1h/16);j++){18 1G=j*16;18 1C=j*16+16;1f(j*16+16>2Z.1h)1C=2Z.1h;1p=1a.84(2Z,1G,1C,1I);1f(1I==1a.38.83){1f(1H){1j=1a.2O.2P(2I,1k,1g);1H=2N}1n 1j=1a.2O.2P(1r,1k,1g);1c(18 i=0;i<16;i++)1B[i]=1p[i]^1j[i];1c(18 k=0;k<1C-1G;k++)7i.1o(1B[k]);1r=1B}1n 1f(1I==1a.38.82){1f(1H){1j=1a.2O.2P(2I,1k,1g);1H=2N}1n 1j=1a.2O.2P(1r,1k,1g);1c(18 i=0;i<16;i++)1B[i]=1p[i]^1j[i];1c(18 k=0;k<1C-1G;k++)7i.1o(1B[k]);1r=1j}1n 1f(1I==1a.38.7H){1c(18 i=0;i<16;i++)1r[i]=1p[i]^((1H)?2I[i]:1B[i]);1H=2N;1B=1a.2O.2P(1r,1k,1g);1c(18 k=0;k<16;k++)7i.1o(1B[k])}}}1d{1I:1I,7G:2Z.1h,aA:7i}},81:1e(6L,7G,1I,1k,1g,2I){1f(1k.1h%1g){6B\'8G 1h 8F 8E 8D 8C 1g.\';1d 2Y}1f(2I.1h%16){6B\'2I 1h 8B 8A 2Q 8z.\'}18 1B=[];18 1r=[];18 1j=[];18 1p=[];18 6K=[];18 1H=37;1f(6L!==2Y){1c(18 j=0;j<6I.7A(6L.1h/16);j++){18 1G=j*16;18 1C=j*16+16;1f(j*16+16>6L.1h)1C=6L.1h;1B=1a.84(6L,1G,1C,1I);1f(1I==1a.38.83){1f(1H){1j=1a.2O.2P(2I,1k,1g);1H=2N}1n 1j=1a.2O.2P(1r,1k,1g);1c(i=0;i<16;i++)1p[i]=1j[i]^1B[i];1c(18 k=0;k<1C-1G;k++)6K.1o(1p[k]);1r=1B}1n 1f(1I==1a.38.82){1f(1H){1j=1a.2O.2P(2I,1k,1g);1H=2N}1n 1j=1a.2O.2P(1r,1k,1g);1c(i=0;i<16;i++)1p[i]=1j[i]^1B[i];1c(18 k=0;k<1C-1G;k++)6K.1o(1p[k]);1r=1j}1n 1f(1I==1a.38.7H){1j=1a.2O.81(1B,1k,1g);1c(i=0;i<16;i++)1p[i]=((1H)?2I[i]:1r[i])^1j[i];1H=2N;1f(7G<1C)1c(18 k=0;k<7G-1G;k++)6K.1o(1p[k]);1n 1c(18 k=0;k<1C-1G;k++)6K.1o(1p[k]);1r=1B}}}1d 6K}};18 7x={8y:1e(s){8x{1d az(ay(s))}8w(e){6B\'7Y 7X 8v ax: 7x.8y.\'}},8u:1e(s){8x{1d aw(av(s))}8w(e){6B(\'7Y 7X 8v 8q: 7x.8u.\')}},au:1e(){18 2M=[];1f(7F.1h==1&&7F[0].as==73)2M=7F[0];1n 2M=7F;18 6J=\'\';1c(18 i=0;i<2M.1h;i++)6J+=(2M[i]<16?\'0\':\'\')+2M[i].74(16);1d 6J.7L()},ar:1e(s){18 6J=[];s.7n(/(..)/g,1e(s){6J.1o(aq(s,16))});1d 6J},8t:1e(7D,7E){1f(7D===2Y)7D=0;1f(7E===2Y)7E=1;1d 6I.ap(6I.ao()*(7E+1))+7D},an:1e(7C){1f(7C===2Y)7C=16;18 1k=[];1c(18 i=0;i<7C*2;i++)1k.1o(1a.8t(0,8j));1d 1k},am:1e(s,1g){18 8s=al.ak.aj(s);1d 8s.7B(0,1g)},ai:1e(s){18 1p=[];1c(18 i=0;i<s.1h;i++){1p.1o(s.1E(i))}1d 1p},ah:1e(1p){18 s=\'\';1c(18 i=0;i<1p.1h;i++){s+=1N.1M(1p[i])}1d s},7W:{2X:[\'A\',\'B\',\'C\',\'D\',\'E\',\'F\',\'G\',\'H\',\'I\',\'J\',\'K\',\'L\',\'M\',\'N\',\'O\',\'P\',\'Q\',\'R\',\'S\',\'T\',\'U\',\'V\',\'W\',\'X\',\'Y\',\'Z\',\'a\',\'b\',\'c\',\'d\',\'e\',\'f\',\'g\',\'h\',\'i\',\'j\',\'k\',\'l\',\'m\',\'n\',\'o\',\'p\',\'q\',\'r\',\'s\',\'t\',\'u\',\'v\',\'w\',\'x\',\'y\',\'z\',\'0\',\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\'+\',\'/\',\'=\'],8r:1e(1y){18 1O=\'\';1c(18 i=0;i<1y.1h;i+=3){1O+=1a.2X[1y[i]>>2];1O+=1a.2X[((1y[i]&3)<<4)|(1y[i+1]>>4)];1f(!(1y[i+1]===2Y)){1O+=1a.2X[((1y[i+1]&15)<<2)|(1y[i+2]>>6)]}1n{1O+=\'=\'}1f(!(1y[i+2]===2Y)){1O+=1a.2X[1y[i+2]&63]}1n{1O+=\'=\'}}1d 1O},ag:1e(1y){18 1O=1a.8r(1y);18 7Z=1O.7B(0,64)+\'\\n\';1c(18 i=1;i<(6I.7A(1O.1h/64));i++){7Z+=1O.7B(i*64,i*64+64)+(6I.7A(1O.1h/64)==i+1?\'\':\'\\n\')}1d 7Z},8p:1e(1i){1i=1i.7n(/[\\r\\n\\t ]+/g,\'\')+\'====\';18 1y=[];18 c=[];1c(18 i=0;37;i=i+4){c[0]=1a.2X.7z(1i.7y(i));1f(c[0]==64){1d 1y}c[1]=1a.2X.7z(1i.7y(i+1));c[2]=1a.2X.7z(1i.7y(i+2));c[3]=1a.2X.7z(1i.7y(i+3));1f((c[0]<0)||(c[1]<0)||(c[1]==64)||(c[2]<0)||(c[3]<0)){6B\'7Y 7X 7W 8q at af \'+i+\': 7x.7W.8p.\'}1y.1o((c[0]<<2)|(c[1]>>4));1f(c[2]>=0&&c[2]<64){1y.1o(((c[1]&15)<<4)|(c[2]>>2));1f(c[3]>=0&&c[2]<64){1y.1o(((c[2]&3)<<6)|c[3])}}}}}};1e ae(1F){1e 2T(n,s){18 8o=(n<<s)|(n>>>(32-s));1d 8o};1e ad(7h){18 6H="";18 i;18 7V;18 7U;1c(i=0;i<=6;i+=2){7V=(7h>>>(i*4+4))&2L;7U=(7h>>>(i*4))&2L;6H+=7V.74(16)+7U.74(16)}1d 6H};1e 6G(7h){18 6H="";18 i;18 v;1c(i=7;i>=0;i--){v=(7h>>>(i*4))&2L;6H+=v.74(16)}1d 6H};1e 7m(1i){1i=1i.7n(/\\r\\n/g,"\\n");18 1A="";1c(18 n=0;n<1i.1h;n++){18 c=1i.1E(n);1f(c<2Q){1A+=1N.1M(c)}1n 1f((c>8i)&&(c<8h)){1A+=1N.1M((c>>6)|8g);1A+=1N.1M((c&63)|2Q)}1n{1A+=1N.1M((c>>12)|8f);1A+=1N.1M(((c>>6)&63)|2Q);1A+=1N.1M((c&63)|2Q)}}1d 1A};18 7g;18 i,j;18 W=8n 73(80);18 7f=8d;18 7e=8c;18 7d=8b;18 7c=8a;18 7b=ab;18 A,B,C,D,E;18 1L;1F=7m(1F);18 2K=1F.1h;18 2W=8n 73();1c(i=0;i<2K-3;i+=4){j=1F.1E(i)<<24|1F.1E(i+1)<<16|1F.1E(i+2)<<8|1F.1E(i+3);2W.1o(j)}8m(2K%4){6A 0:i=aa;36;6A 1:i=1F.1E(2K-1)<<24|a9;36;6A 2:i=1F.1E(2K-2)<<24|1F.1E(2K-1)<<16|a8;36;6A 3:i=1F.1E(2K-3)<<24|1F.1E(2K-2)<<16|1F.1E(2K-1)<<8|1x;36}2W.1o(i);7r((2W.1h%16)!=14)2W.1o(0);2W.1o(2K>>>29);2W.1o((2K<<3)&2S);1c(7g=0;7g<2W.1h;7g+=16){1c(i=0;i<16;i++)W[i]=2W[7g+i];1c(i=16;i<=79;i++)W[i]=2T(W[i-3]^W[i-8]^W[i-14]^W[i-16],1);A=7f;B=7e;C=7d;D=7c;E=7b;1c(i=0;i<=19;i++){1L=(2T(A,5)+((B&C)|(~B&D))+E+W[i]+a7)&2S;E=D;D=C;C=2T(B,30);B=A;A=1L}1c(i=20;i<=39;i++){1L=(2T(A,5)+(B^C^D)+E+W[i]+a6)&2S;E=D;D=C;C=2T(B,30);B=A;A=1L}1c(i=40;i<=59;i++){1L=(2T(A,5)+((B&C)|(B&D)|(C&D))+E+W[i]+a5)&2S;E=D;D=C;C=2T(B,30);B=A;A=1L}1c(i=60;i<=79;i++){1L=(2T(A,5)+(B^C^D)+E+W[i]+a4)&2S;E=D;D=C;C=2T(B,30);B=A;A=1L}7f=(7f+A)&2S;7e=(7e+B)&2S;7d=(7d+C)&2S;7c=(7c+D)&2S;7b=(7b+E)&2S}18 1L=6G(7f)+6G(7e)+6G(7d)+6G(7c)+6G(7b);1d 1L.7L()}18 a3=1e(1i){1e 7a(76,7T){1d(76<<7T)|(76>>>(32-7T))}1e 1l(7w,7v){18 7u,7t,6F,6E,6z;6F=(7w&7S);6E=(7v&7S);7u=(7w&7s);7t=(7v&7s);6z=(7w&8l)+(7v&8l);1f(7u&7t){1d(6z^7S^6F^6E)}1f(7u|7t){1f(6z&7s){1d(6z^a2^6F^6E)}1n{1d(6z^7s^6F^6E)}}1n{1d(6z^6F^6E)}}1e F(x,y,z){1d(x&y)|((~x)&z)}1e G(x,y,z){1d(x&z)|(y&(~z))}1e H(x,y,z){1d(x^y^z)}1e I(x,y,z){1d(y^(x|(~z)))}1e 1w(a,b,c,d,x,s,ac){a=1l(a,1l(1l(F(b,c,d),x),ac));1d 1l(7a(a,s),b)};1e 1v(a,b,c,d,x,s,ac){a=1l(a,1l(1l(G(b,c,d),x),ac));1d 1l(7a(a,s),b)};1e 1u(a,b,c,d,x,s,ac){a=1l(a,1l(1l(H(b,c,d),x),ac));1d 1l(7a(a,s),b)};1e 1t(a,b,c,d,x,s,ac){a=1l(a,1l(1l(I(b,c,d),x),ac));1d 1l(7a(a,s),b)};1e 8e(1i){18 6y;18 77=1i.1h;18 7R=77+8;18 8k=(7R-(7R%64))/64;18 7q=(8k+1)*16;18 35=73(7q-1);18 78=0;18 2R=0;7r(2R<77){6y=(2R-(2R%4))/4;78=(2R%4)*8;35[6y]=(35[6y]|(1i.1E(2R)<<78));2R++}6y=(2R-(2R%4))/4;78=(2R%4)*8;35[6y]=35[6y]|(1x<<78);35[7q-2]=77<<3;35[7q-1]=77>>>29;1d 35};1e 6M(76){18 7o="",7p="",7Q,75;1c(75=0;75<=3;75++){7Q=(76>>>(75*8))&8j;7p="0"+7Q.74(16);7o=7o+7p.a1(7p.1h-2,2)}1d 7o};1e 7m(1i){1i=1i.7n(/\\r\\n/g,"\\n");18 1A="";1c(18 n=0;n<1i.1h;n++){18 c=1i.1E(n);1f(c<2Q){1A+=1N.1M(c)}1n 1f((c>8i)&&(c<8h)){1A+=1N.1M((c>>6)|8g);1A+=1N.1M((c&63)|2Q)}1n{1A+=1N.1M((c>>12)|8f);1A+=1N.1M(((c>>6)&63)|2Q);1A+=1N.1M((c&63)|2Q)}}1d 1A};18 x=73();18 k,7P,7O,7N,7M,a,b,c,d;18 72=7,71=12,70=17,6Z=22;18 6Y=5,6X=9,6W=14,6V=20;18 6U=4,6T=11,6S=16,6R=23;18 6Q=6,6P=10,6O=15,6N=21;1i=7m(1i);x=8e(1i);a=8d;b=8c;c=8b;d=8a;1c(k=0;k<x.1h;k+=16){7P=a;7O=b;7N=c;7M=d;a=1w(a,b,c,d,x[k+0],72,a0);d=1w(d,a,b,c,x[k+1],71,9Z);c=1w(c,d,a,b,x[k+2],70,9Y);b=1w(b,c,d,a,x[k+3],6Z,9X);a=1w(a,b,c,d,x[k+4],72,9W);d=1w(d,a,b,c,x[k+5],71,9V);c=1w(c,d,a,b,x[k+6],70,9U);b=1w(b,c,d,a,x[k+7],6Z,9T);a=1w(a,b,c,d,x[k+8],72,9S);d=1w(d,a,b,c,x[k+9],71,9R);c=1w(c,d,a,b,x[k+10],70,9Q);b=1w(b,c,d,a,x[k+11],6Z,9P);a=1w(a,b,c,d,x[k+12],72,9O);d=1w(d,a,b,c,x[k+13],71,9N);c=1w(c,d,a,b,x[k+14],70,9M);b=1w(b,c,d,a,x[k+15],6Z,9L);a=1v(a,b,c,d,x[k+1],6Y,9K);d=1v(d,a,b,c,x[k+6],6X,9J);c=1v(c,d,a,b,x[k+11],6W,9I);b=1v(b,c,d,a,x[k+0],6V,9H);a=1v(a,b,c,d,x[k+5],6Y,9G);d=1v(d,a,b,c,x[k+10],6X,9F);c=1v(c,d,a,b,x[k+15],6W,9E);b=1v(b,c,d,a,x[k+4],6V,9D);a=1v(a,b,c,d,x[k+9],6Y,9C);d=1v(d,a,b,c,x[k+14],6X,9B);c=1v(c,d,a,b,x[k+3],6W,9A);b=1v(b,c,d,a,x[k+8],6V,9z);a=1v(a,b,c,d,x[k+13],6Y,9y);d=1v(d,a,b,c,x[k+2],6X,9x);c=1v(c,d,a,b,x[k+7],6W,9w);b=1v(b,c,d,a,x[k+12],6V,9v);a=1u(a,b,c,d,x[k+5],6U,9u);d=1u(d,a,b,c,x[k+8],6T,9t);c=1u(c,d,a,b,x[k+11],6S,9s);b=1u(b,c,d,a,x[k+14],6R,9r);a=1u(a,b,c,d,x[k+1],6U,9q);d=1u(d,a,b,c,x[k+4],6T,9p);c=1u(c,d,a,b,x[k+7],6S,9o);b=1u(b,c,d,a,x[k+10],6R,9n);a=1u(a,b,c,d,x[k+13],6U,9m);d=1u(d,a,b,c,x[k+0],6T,9l);c=1u(c,d,a,b,x[k+3],6S,9k);b=1u(b,c,d,a,x[k+6],6R,9j);a=1u(a,b,c,d,x[k+9],6U,9i);d=1u(d,a,b,c,x[k+12],6T,9h);c=1u(c,d,a,b,x[k+15],6S,9g);b=1u(b,c,d,a,x[k+2],6R,9f);a=1t(a,b,c,d,x[k+0],6Q,9e);d=1t(d,a,b,c,x[k+7],6P,9d);c=1t(c,d,a,b,x[k+14],6O,9c);b=1t(b,c,d,a,x[k+5],6N,9b);a=1t(a,b,c,d,x[k+12],6Q,9a);d=1t(d,a,b,c,x[k+3],6P,99);c=1t(c,d,a,b,x[k+10],6O,98);b=1t(b,c,d,a,x[k+1],6N,97);a=1t(a,b,c,d,x[k+8],6Q,96);d=1t(d,a,b,c,x[k+15],6P,95);c=1t(c,d,a,b,x[k+6],6O,94);b=1t(b,c,d,a,x[k+13],6N,93);a=1t(a,b,c,d,x[k+4],6Q,92);d=1t(d,a,b,c,x[k+11],6P,91);c=1t(c,d,a,b,x[k+2],6O,90);b=1t(b,c,d,a,x[k+9],6N,8Z);a=1l(a,7P);b=1l(b,7O);c=1l(c,7N);d=1l(d,7M)}18 1L=6M(a)+6M(b)+6M(c)+6M(d);1d 1L.7L()}',62,665,'||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||var||this|state|for|return|function|if|size|length|string|output|key|AddUnsigned|expandedKey|else|push|byteArray|mult|input|cpy|II|HH|GG|FF|0x80|flatArr|galois_multiplication|utftext|ciphertext|end|nbrRounds|charCodeAt|msg|start|firstRound|mode|0x1b|word|temp|fromCharCode|String|b64|0x8d|0x83|0x91|0x9f|0xef|0xc5|0xcb|0x63|0x1d|0x01|0x25||||||0x39|0x4a|0x72|0x3a||0x10|0x02|0xc6|0xd4|0x20|0x04|0x5e|0x66|0x74|0xe4|0x94|0x9a|0x97|0xb3|0xbd|0xcc|0xc2|0xfa|0xe8|0xbc|0x08|0x40|0x6a|0x2f|0x33|0x4d|0xd3|0x61|0x7d|0x35|0xab|0xd8|0x6c|0x36|iv|column|msg_len|0x0f|array|false|aes|encrypt|128|lByteCount|0x0ffffffff|rotate_left|block|isInv|word_array|chars|null|bytesIn||roundKey||statePointer|currentSize|lWordArray|break|true|modeOfOperation||0x100|0xb5|0xbb|0xa9|0xa7|0xfd|0xf3|0xe1|0xd9|0xd7|0x6d|0x71|0x7f|0x55|0x5b|0x49|0x47|0x13|0x2b|0x37|0x56|0x58|0x44|0x6e|0x60|0x7c|0x26|0x28|0x34|0x1e|0x0c|0xb6|0xb8|0xaa|0xa4|0x8e|0x92|0x9c|0xc8|0xda|0xfe|0xf0|0xe2|0xec|0x2e|0x3c|0x32|0x18|0x16|0x0a|0x50|0x4c||0x42|0x68|0x7a|0xc0|0xce|0xdc|0xd2|0xf8|0xf6|0xea|0xb0|0xbe|0xac|0xa2|0x88|0x86|0xfb|0xf5|0xe7|0xe9|0xc3|0xcd|0xdf|0xd1|0x8b|0x85|0x99|0xaf|0xa1|0x15|0x07|0x09|0x23|0x2d|0x3f|0x31|0x6b|0x65|0x77|0x79|0x53|0x5d|0x4f|0x41|0xd0|0xde|0xf4|0xe6|0xb2|0xa0|0xae|0x84|0x8a|0x98|0x96|0x2c|0x22|0x30|0x3e|0x14|0x1a|0x06|0x5c|0x52|0x4e|0x64|0x78|0x76|0x17|0x19||0x0b|0x05|0x21|0x3d|0x67|0x69|0x7b|0x75|0x5f|0x51|0x43|0xf7|0xf9|0xeb|0xe5|0xcf|0xc1|0xdd|0x87|0x89|0x9b|0x95|0xbf|0xb1|0xa3|0xad|0x6f|0x73|0x59|0x57|0x45|0x4b|0x11|0x1f|0x0d|0x03|0x29|0x27|0x3b|0x81|0x8f|0x9d|0x93|0xb9|0xb7|0xa5|0xf1|0xff|0xed|0xe3|0xc9|0xc7||0xd5|0xdb|||0xba|0xb4|0xa6|0xa8|0x82|0x8c|0x9e|0x90|0xca|0xc4|0xd6|0xf2|0xfc|0xee|0xe0|0x5a|0x54|0x46|0x48|0x62|0x7e|0x70|0x2a|0x24|0x38|0x12|0x1c|0x0e|0x00|lWordCount|lResult|case|throw|createRoundKey|addRoundKey|lY8|lX8|cvt_hex|str|Math|ret|bytesOut|cipherIn|WordToHex|S44|S43|S42|S41|S34|S33|S32|S31|S24|S23|S22|S21|S14|S13|S12|S11|Array|toString|lCount|lValue|lMessageLength|lBytePosition||RotateLeft|H4|H3|H2|H1|H0|blockstart|val|cipherOut|keySize|subBytes|shiftRows|Utf8Encode|replace|WordToHexValue|WordToHexValue_temp|lNumberOfWords|while|0x40000000|lY4|lX4|lY|lX|cryptoHelpers|charAt|indexOf|ceil|slice|len|min|max|arguments|originalsize|CBC|numberOfRounds|tmp|sbox|toLowerCase|DD|CC|BB|AA|lByte|lNumberOfWords_temp1|0x80000000|iShiftBits|vl|vh|base64|during|error|broken_b64||decrypt|OFB|CFB|getPaddedBlock|expandKey|SIZE_256|mixColumns|counter|expandedKeySize|0x10325476|0x98BADCFE|0xEFCDAB89|0x67452301|ConvertToWordArray|224|192|2048|127|255|lNumberOfWords_temp2|0x3FFFFFFF|switch|new|t4|decode|decoding|encode_line|sha|getRandom|decode_utf8|utf8|catch|try|encode_utf8|bits|be|must|specified|match|not|does|Key|cpad|invMain|main|SIZE_192|SIZE_128|invRound|round|mixColumn|hi_bit_set|nbr|shiftRow|rsbox|roundKeyPointer|rconIteration|core|iteration|Rcon|rotate|0xEB86D391|0x2AD7D2BB|0xBD3AF235|0xF7537E82|0x4E0811A1|0xA3014314|0xFE2CE6E0|0x6FA87E4F|0x85845DD1|0xFFEFF47D|0x8F0CCC92|0x655B59C3|0xFC93A039|0xAB9423A7|0x432AFF97|0xF4292244|0xC4AC5665|0x1FA27CF8|0xE6DB99E5|0xD9D4D039|0x4881D05|0xD4EF3085|0xEAA127FA|0x289B7EC6|0xBEBFBC70|0xF6BB4B60|0x4BDECFA9|0xA4BEEA44|0xFDE5380C|0x6D9D6122|0x8771F681|0xFFFA3942|0x8D2A4C8A|0x676F02D9|0xFCEFA3F8|0xA9E3E905|0x455A14ED|0xF4D50D87|0xC33707D6|0x21E1CDE6|0xE7D3FBC8|0xD8A1E681|0x2441453|0xD62F105D|0xE9B6C7AA|0x265E5A51|0xC040B340|0xF61E2562|0x49B40821|0xA679438E|0xFD987193|0x6B901122|0x895CD7BE|0xFFFF5BB1|0x8B44F7AF|0x698098D8|0xFD469501|0xA8304613|0x4787C62A|0xF57C0FAF|0xC1BDCEEE|0x242070DB|0xE8C7B756|0xD76AA478|substr|0xC0000000|MD5|0xCA62C1D6|0x8F1BBCDC|0x6ED9EBA1|0x5A827999|0x08000|0x0800000|0x080000000|0xC3D2E1F0||lsb_hex|SHA1|pos|encode|convertByteArrayToString|convertStringToByteArray|arr_sha256|sha2|jsHash|generatePrivateKey|generateSharedKey|random|floor|parseInt|toNumbers|constructor||toHex|escape|decodeURIComponent|encoding|encodeURIComponent|unescape|cipher|default|GEX|GDX|GBX|G9X|G3X|G2X|slowAES'.split('|'),0,{}))
diff --git a/javascript/jsPacker/jsPacker.pl b/javascript/jsPacker/jsPacker.pl
deleted file mode 100644
index 80f7236..0000000
--- a/javascript/jsPacker/jsPacker.pl
+++ /dev/null
@@ -1,163 +0,0 @@
-#!perl
-#jsPacker (July 2005)
-#
-use strict;
-use Pack;
-use vars qw($PROGNAME $VERSION
- $opt_h $opt_q $opt_v $opt_i $opt_o $opt_e $opt_f $opt_s);
-use Getopt::Std;
-
-$PROGNAME = $0;
-$VERSION = '1.00b';
-
-my $Description = 'A JavaScript Compressor/Obfuscator';
-my $Version = "v$VERSION\[p$Pack::VERSION-pm$Pack::PM_VERSION\]";
-
-# "English" versions of settings
-my %ENCODINGS = (0=>'None', 10=>'Decimal', 36=>'Normal', 62=>'Normal', 95=>'High-ascii');
-my %SETTINGS = (0=>'No', 1=>'Yes');
-
-exit(0) if &main();
-exit(1);
-
-################
-# Sub-routines #
-################
-# Main program
-sub main {
- # Get command line options
- &getopts('hqvfsi:o:e:');
- $opt_h ||= 0; # $opt_h shows usage and exits
- $opt_q ||= 0; # $opt_q sets quiet mode (no stdout output)
- $opt_v ||= 0; # $opt_v shows version and exits
- $opt_i ||= ''; # $opt_i is input file. Required!
- $opt_o ||= ''; # $opt_o is output file. If not set, use standard output
- $opt_e ||= 0; # $opt_e encoding level (0,10,36,62,95)
- $opt_f ||= 0; # $opt_f use fast decoding
- $opt_s ||= 0; # $opt_x use special characters
-
- # Display help or version if requested
- if ($opt_h) {&usage("help")}
- if ($opt_v) {&usage("version")}
-
- # Constrain encoding level, fastdecoding and specialcharacters to allowed limits
- $opt_e = ($opt_e > 0) ? ($opt_e > 10) ? ($opt_e > 36) ? ($opt_e > 62) ? 95 : 62 : 36 : 10 : 0;
- $opt_f = ($opt_f) ? 1 : 0;
- $opt_s = ($opt_s) ? 1 : 0;
-
- # Do the job if an input file is specified
- if ($opt_i) {
- # Read the source script
- my $script = &readInputFile($opt_i);
- # Pack the source script
- my $packedscript = &Pack::pack($script,$opt_e, $opt_f, $opt_s);
- # Show what happened (if not in quiet mode)
- if (!$opt_q) {showJobDetails($opt_i, $opt_o, $opt_e, $opt_f,$opt_s,\$script,\$packedscript)}
- # Output the packed script
- if ($opt_o) {&writeOutputFile($opt_o,\$packedscript)} # to output file if specifed
- else {print "$packedscript"} # otherwise to STDOUT
- }
- else { # If no input file is specified, display help
- &usage();
- }
- return(1);
-}
-
-######################
-sub showJobDetails { #
-######################
-# Show details of input/output files, settings and compression ratio
- my ($inputfile, $outputfile,
- $encoding, $fastdecode, $specialchars,
- $instringref, $outstringref) = @_;
- print "$PROGNAME $Version\n";
- print "\tSource file : ";
- print "\"$inputfile\"\n";
- print (($outputfile) ? ("\tOutput file : \"$outputfile\"\n") : ''); # Print only if output is going to a file
- print "\tSettings : encoding=$ENCODINGS{$encoding} fastdecode=$SETTINGS{$fastdecode} specialchars=$SETTINGS{$specialchars}\n";
- print "\tCompression : " . &compressionRatio($instringref, $outstringref). "\n\n";
-
-}
-
-#####################
-sub readInputFile { #
-#####################
-# Read content (source script) from input file
- my $filename = shift;
- open(FH, $filename) || die "Error!!! Problem opening input file \"$filename\"!\n";
- my @content = <FH>;
- close(FH);
- return join('',@content);
-}
-
-#######################
-sub writeOutputFile { #
-#######################
-# Write content (packed script) to output file
- my ($filename,$refcontent) = @_;
- open(FH, ">$filename") || die "Error!!! Problem opening output file \"$filename\"\n";
- print(FH $$refcontent);
- close(FH);
-}
-
-########################
-sub compressionRatio { #
-########################
-# Calculate the ratio of output string to input string
- my ($sref1,$sref2) = @_;
- my $ratio = (length($$sref2) / (length($$sref1)||1));
- $ratio = sprintf "%.2f", $ratio;
- return $ratio;
-}
-
-#############
-sub usage { #
-#############
-# Inform user about usage, version and exit
- my $showusage = 0;
- my $showversion = 0;
- my $params = shift;
- if (defined $params) {
- if ($params eq "help") {$showusage = 1;}
- elsif ($params eq "version") {$showversion = 1;}
- else {$showusage = 1;}
- }
- else {$showversion = 1;}
- if ($showversion) {
- print<<EOT;
-
-$PROGNAME $Version
- $Description
-\tBased on "Packer.js" by Dean Edwards <http://dean.edwards.name/>
-\tPorted to Perl by Rob Seiler, ELR Software Pty Ltd <http://www.elr.com.au>
-\tCopyright 2005. License <http://creativecommons.org/licenses/LGPL/2.1/>
- Use "$PROGNAME -h" for options
-EOT
- exit(1);
- }
- if ($showusage) {
- print<<EOT;
-
-$PROGNAME $Version
- $Description
- Usage:
-\t$PROGNAME -i inputfile [-o outputfile] [-eX] [-f] [-s] [-qvh]\n
-\t-i <inputfile> (eg -i myscript.js)
-\t-o <outputfile> (eg -o myscript-p.js)
-\t-eN <encoding> [0=None 10=Numeric 62=Normal(alphanumeric) 95=High-ascii]
-\t-f <fast decode>
-\t-s <special characters>
-\t-q quiet mode
-\t-v version
-\t-h help
-
- Examples:
-\t$PROGNAME -i myscript.js
-\t$PROGNAME -i myscript.js -o packed.js
-\t$PROGNAME -i myscript.js -o packed.js -e10 -f -s
-\t$PROGNAME -i myscript.js -e95 -fsq > packed.js
-
-EOT
- exit(1);
- }
-}
diff --git a/javascript/jsPacker/srp.min.js b/javascript/jsPacker/srp.min.js
deleted file mode 100644
index 77f4f20..0000000
--- a/javascript/jsPacker/srp.min.js
+++ /dev/null
@@ -1 +0,0 @@
-eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('E 1A(s){D 2z=8;D 7r=0;E 1f(x,y){D 4o=(x&4n)+(y&4n);D 7z=(x>>16)+(y>>16)+(4o>>16);F(7z<<16)|(4o&4n)}E S(X,n){F(X>>>n)|(X<<(32-n))}E R(X,n){F(X>>>n)}E 7v(x,y,z){F((x&y)^((~x)&z))}E 7t(x,y,z){F((x&y)^(x&z)^(y&z))}E 7u(x){F(S(x,2)^S(x,13)^S(x,22))}E 7w(x){F(S(x,6)^S(x,11)^S(x,25))}E 7x(x){F(S(x,7)^S(x,18)^R(x,3))}E 7y(x){F(S(x,17)^S(x,19)^R(x,10))}E 7n(m,l){D K=V 1u(bI,bH,bG,bF,bE,bD,bC,bB,bA,bz,by,bx,bw,bv,bu,bt,br,bq,bp,bo,bn,bl,bk,bj,bi,bh,bg,bf,bd,bc,bb,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0,aZ,aY,aX,aW,aV,aU,aT,aS,aR,aQ,aP,aO,aN,aM,aL,aK,aJ,aI,aH,aG,aF,aE,aD);D 1a=V 1u(aC,aB,aA,az,ay,ax,aw,av);D W=V 1u(64);D a,b,c,d,e,f,g,h,i,j;D 3C,4m;m[l>>5]|=2W<<(24-l%32);m[((l+64>>9)<<4)+15]=l;P(D i=0;i<m.T;i+=16){a=1a[0];b=1a[1];c=1a[2];d=1a[3];e=1a[4];f=1a[5];g=1a[6];h=1a[7];P(D j=0;j<64;j++){C(j<16)W[j]=m[j+i];J W[j]=1f(1f(1f(7y(W[j-2]),W[j-7]),7x(W[j-15])),W[j-16]);3C=1f(1f(1f(1f(h,7w(e)),7v(e,f,g)),K[j]),W[j]);4m=1f(7u(a),7t(a,b,c));h=g;g=f;f=e;e=1f(d,3C);d=c;c=b;b=a;a=1f(3C,4m)}1a[0]=1f(a,1a[0]);1a[1]=1f(b,1a[1]);1a[2]=1f(c,1a[2]);1a[3]=1f(d,1a[3]);1a[4]=1f(e,1a[4]);1a[5]=1f(f,1a[5]);1a[6]=1f(g,1a[6]);1a[7]=1f(h,1a[7])}F 1a}E 7m(1R){D 4l=1u();D 7s=(1<<2z)-1;P(D i=0;i<1R.T*2z;i+=2z){4l[i>>5]|=(1R.2a(i/2z)&7s)<<(24-i%32)}F 4l}E 7p(2y){2y=2y.4E(/\\r\\n/g,"\\n");D 1V="";P(D n=0;n<2y.T;n++){D c=2y.2a(n);C(c<3B){1V+=2B.2A(c)}J C((c>69)&&(c<au)){1V+=2B.2A((c>>6)|at);1V+=2B.2A((c&63)|3B)}J{1V+=2B.2A((c>>12)|as);1V+=2B.2A(((c>>6)&63)|3B);1V+=2B.2A((c&63)|3B)}}F 1V}E 7o(3A){D 4k=7r?"ar":"aq";D 1R="";P(D i=0;i<3A.T*4;i++){1R+=4k.2d((3A[i>>2]>>((3-i%4)*8+4))&7q)+4k.2d((3A[i>>2]>>((3-i%4)*8))&7q)}F 1R}s=7p(s);F 7o(7n(7m(s),s.T*2z))}E 3z(){o.i=0;o.j=0;o.S=V 1u()}E 7l(1B){D i,j,t;P(i=0;i<1U;++i)o.S[i]=i;j=0;P(i=0;i<1U;++i){j=(j+o.S[i]+1B[i%1B.T])&1E;t=o.S[i];o.S[i]=o.S[j];o.S[j]=t}o.i=0;o.j=0}E 7k(){D t;o.i=(o.i+1)&1E;o.j=(o.j+o.S[o.i])&1E;t=o.S[o.i];o.S[o.i]=o.S[o.j];o.S[o.j]=t;F o.S[(t+o.S[o.i])&1E]}3z.H.7f=7l;3z.H.7e=7k;E 7g(){F V 3z()}D 3y=1U;D 33;D 1s;D 1g;E 7j(x){1s[1g++]^=x&1E;1s[1g++]^=(x>>8)&1E;1s[1g++]^=(x>>16)&1E;1s[1g++]^=(x>>24)&1E;C(1g>=3y)1g-=3y}E 4j(){7j(V ap().ao())}C(1s==1b){1s=V 1u();1g=0;D t;C(3x.4g=="77"&&3x.an<"5"&&1G.7i){D z=1G.7i.7h(32);P(t=0;t<z.T;++t)1s[1g++]=z.2a(t)&1E}L(1g<3y){t=1e.20(al*1e.7h());1s[1g++]=t>>>8;1s[1g++]=t&1E}1g=0;4j();}E 7d(){C(33==1b){4j();33=7g();33.7f(1s);P(1g=0;1g<1s.T;++1g)1s[1g]=0;1g=0;}F 33.7e()}E 7c(ba){D i;P(i=0;i<ba.T;++i)ba[i]=7d()}E 3P(){}3P.H.3G=7c;D 1N;D 7b=ak;D 4h=((7b&aj)==ai);E G(a,b,c){C(a!=1b)C("6l"==3m a)o.3T(a,b,c);J C(b==1b&&"2y"!=3m a)o.3s(a,1U);J o.3s(a,b)}E Q(){F V G(1b)}E 76(i,x,w,j,c,n){L(--n>=0){D v=x*o[i++]+w[j]+c;c=1e.20(v/ah);w[j++]=v&ag}F c}E 78(i,x,w,j,c,n){D 2x=x&2Y,2w=x>>15;L(--n>=0){D l=o[i]&2Y;D h=o[i++]>>15;D m=2w*l+h*2x;l=2x*l+((m&2Y)<<15)+w[j]+(c&7a);c=(l>>>30)+(m>>>15)+2w*h+(c>>>30);w[j++]=l&7a}F c}E 75(i,x,w,j,c,n){D 2x=x&4i,2w=x>>14;L(--n>=0){D l=o[i]&4i;D h=o[i++]>>14;D m=2w*l+h*2x;l=2x*l+((m&4i)<<14)+w[j]+c;c=(l>>28)+(m>>14)+2w*h;w[j++]=l&af}F c}C(4h&&(3x.4g=="4Z ae ad")){G.H.am=78;1N=30}J C(4h&&(3x.4g!="77")){G.H.am=76;1N=26}J{G.H.am=75;1N=28}G.H.O=1N;G.H.1h=((1<<1N)-1);G.H.1m=(1<<1N);D 3w=52;G.H.72=1e.2M(2,3w);G.H.4e=3w-1N;G.H.4c=2*1N-3w;D 74="ab";D 2Z=V 1u();D 2b,1r;2b="0".2a(0);P(1r=0;1r<=9;++1r)2Z[2b++]=1r;2b="a".2a(0);P(1r=10;1r<36;++1r)2Z[2b++]=1r;2b="A".2a(0);P(1r=10;1r<36;++1r)2Z[2b++]=1r;E 4f(n){F 74.2d(n)}E 46(s,i){D c=2Z[s.2a(i)];F(c==1b)?-1:c}E 6J(r){P(D i=o.t-1;i>=0;--i)r[i]=o[i];r.t=o.t;r.s=o.s}E 6I(x){o.t=1;o.s=(x<0)?-1:0;C(x>0)o[0]=x;J C(x<-1)o[0]=x+1m;J o.t=0}E 1K(i){D r=Q();r.2n(i);F r}E 6H(s,b){D k;C(b==16)k=4;J C(b==8)k=3;J C(b==1U)k=8;J C(b==2)k=1;J C(b==32)k=5;J C(b==4)k=2;J{o.5Z(s,b);F}o.t=0;o.s=0;D i=s.T,21=1v,1q=0;L(--i>=0){D x=(k==8)?s[i]&2V:46(s,i);C(x<0){C(s.2d(i)=="-")21=1H;6m}21=1v;C(1q==0)o[o.t++]=x;J C(1q+k>o.O){o[o.t-1]|=(x&((1<<(o.O-1q))-1))<<1q;o[o.t++]=(x>>(o.O-1q))}J o[o.t-1]|=x<<1q;1q+=k;C(1q>=o.O)1q-=o.O}C(k==8&&(s[0]&2W)!=0){o.s=-1;C(1q>0)o[o.t-1]|=((1<<(o.O-1q))-1)<<1q}o.1n();C(21)G.1x.Y(o,o)}E 6G(){D c=o.s&o.1h;L(o.t>0&&o[o.t-1]==c)--o.t}E 6t(b){C(o.s<0)F"-"+o.2P().1t(b);D k;C(b==16)k=4;J C(b==8)k=3;J C(b==2)k=1;J C(b==32)k=5;J C(b==4)k=2;J F o.62(b);D 2R=(1<<k)-1,d,m=1v,r="",i=o.t;D p=o.O-(i*o.O)%k;C(i-->0){C(p<o.O&&(d=o[i]>>p)>0){m=1H;r=4f(d)}L(i>=0){C(p<k){d=(o[i]&((1<<p)-1))<<(k-p);d|=o[--i]>>(p+=o.O-k)}J{d=(o[i]>>(p-=k))&2R;C(p<=0){p+=o.O;--i}}C(d>0)m=1H;C(m)r+=4f(d)}}F m?r:"0"}E 6s(){D r=Q();G.1x.Y(o,r);F r}E 6r(){F(o.s<0)?o.2P():o}E 6q(a){D r=o.s-a.s;C(r!=0)F r;D i=o.t;r=i-a.t;C(r!=0)F r;L(--i>=0)C((r=o[i]-a[i])!=0)F r;F 0}E 2S(x){D r=1,t;C((t=x>>>16)!=0){x=t;r+=16}C((t=x>>8)!=0){x=t;r+=8}C((t=x>>4)!=0){x=t;r+=4}C((t=x>>2)!=0){x=t;r+=2}C((t=x>>1)!=0){x=t;r+=1}F r}E 6p(){C(o.t<=0)F 0;F o.O*(o.t-1)+2S(o[o.t-1]^(o.s&o.1h))}E 6F(n,r){D i;P(i=o.t-1;i>=0;--i)r[i+n]=o[i];P(i=n-1;i>=0;--i)r[i]=0;r.t=o.t+n;r.s=o.s}E 6E(n,r){P(D i=n;i<o.t;++i)r[i-n]=o[i];r.t=1e.3Q(o.t-n,0);r.s=o.s}E 6D(n,r){D bs=n%o.O;D 2v=o.O-bs;D bm=(1<<2v)-1;D 1p=1e.20(n/o.O),c=(o.s<<bs)&o.1h,i;P(i=o.t-1;i>=0;--i){r[i+1p+1]=(o[i]>>2v)|c;c=(o[i]&bm)<<bs}P(i=1p-1;i>=0;--i)r[i]=0;r[1p]=c;r.t=o.t+1p+1;r.s=o.s;r.1n()}E 6C(n,r){r.s=o.s;D 1p=1e.20(n/o.O);C(1p>=o.t){r.t=0;F}D bs=n%o.O;D 2v=o.O-bs;D bm=(1<<bs)-1;r[0]=o[1p]>>bs;P(D i=1p+1;i<o.t;++i){r[i-1p-1]|=(o[i]&bm)<<2v;r[i-1p]=o[i]>>bs}C(bs>0)r[o.t-1p-1]|=(o.s&bm)<<2v;r.t=o.t-1p;r.1n()}E 6B(a,r){D i=0,c=0,m=1e.1P(a.t,o.t);L(i<m){c+=o[i]-a[i];r[i++]=c&o.1h;c>>=o.O}C(a.t<o.t){c-=a.s;L(i<o.t){c+=o[i];r[i++]=c&o.1h;c>>=o.O}c+=o.s}J{c+=o.s;L(i<a.t){c-=a[i];r[i++]=c&o.1h;c>>=o.O}c-=a.s}r.s=(c<0)?-1:0;C(c<-1)r[i++]=o.1m+c;J C(c>0)r[i++]=c;r.t=i;r.1n()}E 6A(a,r){D x=o.1J(),y=a.1J();D i=x.t;r.t=i+y.t;L(--i>=0)r[i]=0;P(i=0;i<y.t;++i)r[i+x.t]=x.am(0,y[i],r,i,0,x.t);r.s=0;r.1n();C(o.s!=a.s)G.1x.Y(r,r)}E 6z(r){D x=o.1J();D i=r.t=2*x.t;L(--i>=0)r[i]=0;P(i=0;i<x.t-1;++i){D c=x.am(i,x[i],r,2*i,0,1);C((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1))>=x.1m){r[i+x.t]-=x.1m;r[i+x.t+1]=1}}C(r.t>0)r[r.t-1]+=x.am(i,x[i],r,2*i,0,1);r.s=0;r.1n()}E 6y(m,q,r){D 27=m.1J();C(27.t<=0)F;D 3v=o.1J();C(3v.t<27.t){C(q!=1b)q.2n(0);C(r!=1b)o.1L(r);F}C(r==1b)r=Q();D y=Q(),4b=o.s,6Y=m.s;D 2u=o.O-2S(27[27.t-1]);C(2u>0){27.2o(2u,y);3v.2o(2u,r)}J{27.1L(y);3v.1L(r)}D 1D=y.t;D 3u=y[1D-1];C(3u==0)F;D 4d=3u*(1<<o.4e)+((1D>1)?y[1D-2]>>o.4c:0);D 70=o.72/4d,6Z=(1<<o.4e)/4d,e=1<<o.4c;D i=r.t,j=i-1D,t=(q==1b)?Q():q;y.2s(j,t);C(r.1d(t)>=0){r[r.t++]=1;r.Y(t,r)}G.1w.2s(1D,t);t.Y(y,y);L(y.t<1D)y[y.t++]=0;L(--j>=0){D 3t=(r[--i]==3u)?o.1h:1e.20(r[i]*70+(r[i-1]+e)*6Z);C((r[i]+=y.am(0,3t,r,j,0,1D))<3t){y.2s(j,t);r.Y(t,r);L(r[i]<--3t)r.Y(t,r)}}C(q!=1b){r.2U(1D,q);C(4b!=6Y)G.1x.Y(q,q)}r.t=1D;r.1n();C(2u>0)r.1j(2u,r);C(4b<0)G.1x.Y(r,r)}E 6o(a){D r=Q();o.1J().1M(a,1b,r);C(o.s<0&&r.1d(G.1x)>0)a.Y(r,r);F r}E 1T(m){o.m=m}E 6X(x){C(x.s<0||x.1d(o.m)>=0)F x.3n(o.m);J F x}E 6W(x){F x}E 6V(x){x.1M(o.m,1b,x)}E 6U(x,y,r){x.2r(y,r);o.1y(r)}E 6T(x,r){x.2T(r);o.1y(r)}1T.H.2q=6X;1T.H.2p=6W;1T.H.1y=6V;1T.H.1X=6U;1T.H.1C=6T;E 6w(){C(o.t<1)F 0;D x=o[0];C((x&1)==0)F 0;D y=x&3;y=(y*(2-(x&45)*y))&45;y=(y*(2-(x&2V)*y))&2V;y=(y*(2-(((x&3r)*y)&3r)))&3r;y=(y*(2-x*y%o.1m))%o.1m;F(y>0)?o.1m-y:-y}E 1S(m){o.m=m;o.4a=m.6x();o.49=o.4a&2Y;o.6R=o.4a>>15;o.6Q=(1<<(m.O-15))-1;o.6S=2*m.t}E 6O(x){D r=Q();x.1J().2s(o.m.t,r);r.1M(o.m,1b,r);C(x.s<0&&r.1d(G.1x)>0)o.m.Y(r,r);F r}E 6N(x){D r=Q();x.1L(r);o.1y(r);F r}E 6M(x){L(x.t<=o.6S)x[x.t++]=0;P(D i=0;i<o.m.t;++i){D j=x[i]&2Y;D 6P=(j*o.49+(((j*o.6R+(x[i]>>15)*o.49)&o.6Q)<<15))&x.1h;j=i+o.m.t;x[j]+=o.m.am(0,6P,x,i,0,o.m.t);L(x[j]>=x.1m){x[j]-=x.1m;x[++j]++}}x.1n();x.2U(o.m.t,x);C(x.1d(o.m)>=0)x.Y(o.m,x)}E 6K(x,r){x.2T(r);o.1y(r)}E 6L(x,y,r){x.2r(y,r);o.1y(r)}1S.H.2q=6O;1S.H.2p=6N;1S.H.1y=6M;1S.H.1X=6L;1S.H.1C=6K;E 6v(){F((o.t>0)?(o[0]&1):o.s)==0}E 6u(e,z){C(e>aa||e<1)F G.1w;D r=Q(),1c=Q(),g=z.2q(o),i=2S(e)-1;g.1L(r);L(--i>=0){z.1C(r,1c);C((e&(1<<i))>0)z.1X(1c,g,r);J{D t=r;r=1c;1c=t}}F z.2p(r)}E 6n(e,m){D z;C(e<1U||m.1l())z=V 1T(m);J z=V 1S(m);F o.3Z(e,z)}G.H.1L=6J;G.H.2n=6I;G.H.3s=6H;G.H.1n=6G;G.H.2s=6F;G.H.2U=6E;G.H.2o=6D;G.H.1j=6C;G.H.Y=6B;G.H.2r=6A;G.H.2T=6z;G.H.1M=6y;G.H.6x=6w;G.H.1l=6v;G.H.3Z=6u;G.H.1t=6t;G.H.2P=6s;G.H.1J=6r;G.H.1d=6q;G.H.3X=6p;G.H.3n=6o;G.H.66=6n;G.1x=1K(0);G.1w=1K(1);E 5J(){D r=Q();o.1L(r);F r}E 5I(){C(o.s<0){C(o.t==1)F o[0]-o.1m;J C(o.t==0)F-1}J C(o.t==1)F o[0];J C(o.t==0)F 0;F((o[1]&((1<<(32-o.O))-1))<<o.O)|o[0]}E 5H(){F(o.t==0)?o.s:(o[0]<<24)>>24}E 5G(){F(o.t==0)?o.s:(o[0]<<16)>>16}E 65(r){F 1e.20(1e.a9*o.O/1e.a8(r))}E 5F(){C(o.s<0)F-1;J C(o.t<=0||(o.t==1&&o[0]<=0))F 0;J F 1}E 60(b){C(b==1b)b=10;C(o.1I()==0||b<2||b>36)F"0";D 2X=o.3U(b);D a=1e.2M(b,2X);D d=1K(a),y=Q(),z=Q(),r="";o.1M(d,y,z);L(y.1I()>0){r=(a+z.3R()).1t(b).a7(1)+r;y.1M(d,y,z)}F z.3R().1t(b)+r}E 5Y(s,b){o.2n(0);C(b==1b)b=10;D 2X=o.3U(b);D d=1e.2M(b,2X),21=1v,j=0,w=0;P(D i=0;i<s.T;++i){D x=46(s,i);C(x<0){C(s.2d(i)=="-"&&o.1I()==0)21=1H;6m}w=b*w+x;C(++j>=2X){o.3S(d);o.2l(w,0);j=0;w=0}}C(j>0){o.3S(1e.2M(b,j));o.2l(w,0)}C(21)G.1x.Y(o,o)}E 5X(a,b,c){C("6l"==3m b){C(a<2)o.2n(1);J{o.3T(a,c);C(!o.5q(a-1))o.1W(G.1w.3o(a-1),3q,o);C(o.1l())o.2l(1,0);L(!o.5a(b)){o.2l(2,0);C(o.3X()>a)o.Y(G.1w.3o(a-1),o)}}}J{D x=V 1u(),t=a&7;x.T=(a>>3)+1;b.3G(x);C(t>0)x[0]&=((1<<t)-1);J x[0]=0;o.3s(x,1U)}}E 5E(){D i=o.t,r=V 1u();r[0]=o.s;D p=o.O-(i*o.O)%8,d,k=0;C(i-->0){C(p<o.O&&(d=o[i]>>p)!=(o.s&o.1h)>>p)r[k++]=d|(o.s<<(o.O-p));L(i>=0){C(p<8){d=(o[i]&((1<<p)-1))<<(8-p);d|=o[--i]>>(p+=o.O-8)}J{d=(o[i]>>(p-=8))&2V;C(p<=0){p+=o.O;--i}}C((d&2W)!=0)d|=-1U;C(k==0&&(o.s&2W)!=(d&2W))++k;C(k>0||d!=o.s)r[k++]=d}}F r}E 5D(a){F(o.1d(a)==0)}E 5C(a){F(o.1d(a)<0)?o:a}E 5B(a){F(o.1d(a)>0)?o:a}E 5W(a,1Z,r){D i,f,m=1e.1P(a.t,o.t);P(i=0;i<m;++i)r[i]=1Z(o[i],a[i]);C(a.t<o.t){f=a.s&o.1h;P(i=m;i<o.t;++i)r[i]=1Z(o[i],f);r.t=o.t}J{f=o.s&o.1h;P(i=m;i<a.t;++i)r[i]=1Z(f,a[i]);r.t=a.t}r.s=1Z(o.s,a.s);r.1n()}E 6k(x,y){F x&y}E 5A(a){D r=Q();o.1W(a,6k,r);F r}E 3q(x,y){F x|y}E 5z(a){D r=Q();o.1W(a,3q,r);F r}E 42(x,y){F x^y}E 5y(a){D r=Q();o.1W(a,42,r);F r}E 44(x,y){F x&~y}E 5x(a){D r=Q();o.1W(a,44,r);F r}E 5w(){D r=Q();P(D i=0;i<o.t;++i)r[i]=o.1h&~o[i];r.t=o.t;r.s=~o.s;F r}E 5v(n){D r=Q();C(n<0)o.1j(-n,r);J o.2o(n,r);F r}E 5t(n){D r=Q();C(n<0)o.2o(-n,r);J o.1j(n,r);F r}E 6j(x){C(x==0)F-1;D r=0;C((x&3r)==0){x>>=16;r+=16}C((x&2V)==0){x>>=8;r+=8}C((x&45)==0){x>>=4;r+=4}C((x&3)==0){x>>=2;r+=2}C((x&1)==0)++r;F r}E 5s(){P(D i=0;i<o.t;++i)C(o[i]!=0)F i*o.O+6j(o[i]);C(o.s<0)F o.t*o.O;F-1}E 6i(x){D r=0;L(x!=0){x&=x-1;++r}F r}E 5r(){D r=0,x=o.s&o.1h;P(D i=0;i<o.t;++i)r+=6i(o[i]^x);F r}E 5p(n){D j=1e.20(n/o.O);C(j>=o.t)F(o.s!=0);F((o[j]&(1<<(n%o.O)))!=0)}E 5V(n,1Z){D r=G.1w.3o(n);o.1W(r,1Z,r);F r}E 5o(n){F o.3p(n,3q)}E 5n(n){F o.3p(n,44)}E 5m(n){F o.3p(n,42)}E 5U(a,r){D i=0,c=0,m=1e.1P(a.t,o.t);L(i<m){c+=o[i]+a[i];r[i++]=c&o.1h;c>>=o.O}C(a.t<o.t){c+=a.s;L(i<o.t){c+=o[i];r[i++]=c&o.1h;c>>=o.O}c+=o.s}J{c+=o.s;L(i<a.t){c+=a[i];r[i++]=c&o.1h;c>>=o.O}c+=a.s}r.s=(c<0)?-1:0;C(c>0)r[i++]=c;J C(c<-1)r[i++]=o.1m+c;r.t=i;r.1n()}E 5l(a){D r=Q();o.2O(a,r);F r}E 5k(a){D r=Q();o.Y(a,r);F r}E 5j(a){D r=Q();o.2r(a,r);F r}E 5h(a){D r=Q();o.1M(a,r,1b);F r}E 5g(a){D r=Q();o.1M(a,1b,r);F r}E 5f(a){D q=Q(),r=Q();o.1M(a,q,r);F V 1u(q,r)}E 5T(n){o[o.t]=o.am(0,n-1,o,0,0,o.t);++o.t;o.1n()}E 5S(n,w){L(o.t<=w)o[o.t++]=0;o[w]+=n;L(o[w]>=o.1m){o[w]-=o.1m;C(++w>=o.t)o[o.t++]=0;++o[w]}}E 2t(){}E 40(x){F x}E 6h(x,y,r){x.2r(y,r)}E 6g(x,r){x.2T(r)}2t.H.2q=40;2t.H.2p=40;2t.H.1X=6h;2t.H.1C=6g;E 5c(e){F o.3Z(e,V 2t())}E 5Q(a,n,r){D i=1e.1P(o.t+a.t,n);r.s=0;r.t=i;L(i>0)r[--i]=0;D j;P(j=r.t-o.t;i<j;++i)r[i+o.t]=o.am(0,a[i],r,i,0,o.t);P(j=1e.1P(a.t,n);i<j;++i)o.am(0,a[i],r,i,0,n-i);r.1n()}E 5O(a,n,r){--n;D i=r.t=o.t+a.t-n;r.s=0;L(--i>=0)r[i]=0;P(i=1e.3Q(n-o.t,0);i<a.t;++i)r[o.t+i-n]=o.am(n-i,a[i],r,0,0,o.t+i-n);r.1n();r.2U(1,r)}E 1Y(m){o.1c=Q();o.3Y=Q();G.1w.2s(2*m.t,o.1c);o.6f=o.1c.5i(m);o.m=m}E 6e(x){C(x.s<0||x.t>2*o.m.t)F x.3n(o.m);J C(x.1d(o.m)<0)F x;J{D r=Q();x.1L(r);o.1y(r);F r}}E 6d(x){F x}E 6c(x){x.2U(o.m.t-1,o.1c);C(x.t>o.m.t+1){x.t=o.m.t+1;x.1n()}o.6f.5P(o.1c,o.m.t+1,o.3Y);o.m.5R(o.3Y,o.m.t+1,o.1c);L(x.1d(o.1c)<0)x.2l(1,o.m.t+1);x.Y(o.1c,x);L(x.1d(o.m)>=0)x.Y(o.m,x)}E 6a(x,r){x.2T(r);o.1y(r)}E 6b(x,y,r){x.2r(y,r);o.1y(r)}1Y.H.2q=6e;1Y.H.2p=6d;1Y.H.1y=6c;1Y.H.1X=6b;1Y.H.1C=6a;E 5e(e,m){D i=e.3X(),k,r=1K(1),z;C(i<=0)F r;J C(i<18)k=1;J C(i<48)k=3;J C(i<a6)k=4;J C(i<a5)k=5;J k=6;C(i<8)z=V 1T(m);J C(m.1l())z=V 1Y(m);J z=V 1S(m);D g=V 1u(),n=3,2Q=k-1,2R=(1<<k)-1;g[1]=z.2q(o);C(k>1){D 3W=Q();z.1C(g[1],3W);L(n<=2R){g[n]=Q();z.1X(3W,g[n-2],g[n]);n+=2}}D j=e.t-1,w,3V=1H,1c=Q(),t;i=2S(e[j])-1;L(j>=0){C(i>=2Q)w=(e[j]>>(i-2Q))&2R;J{w=(e[j]&((1<<(i+1))-1))<<(2Q-i);C(j>0)w|=e[j-1]>>(o.O+i-2Q)}n=k;L((w&1)==0){w>>=1;--n}C((i-=n)<0){i+=o.O;--j}C(3V){g[w].1L(r);3V=1v}J{L(n>1){z.1C(r,1c);z.1C(1c,r);n-=2}C(n>0)z.1C(r,1c);J{t=r;r=1c;1c=t}z.1X(1c,g[w],r)}L(j>=0&&(e[j]&(1<<i))==0){z.1C(r,1c);t=r;r=1c;1c=t;C(--i<0){i=o.O-1;--j}}}F z.2p(r)}E 5b(a){D x=(o.s<0)?o.2P():o.2N();D y=(a.s<0)?a.2P():a.2N();C(x.1d(y)<0){D t=x;x=y;y=t}D i=x.2k(),g=y.2k();C(g<0)F x;C(i<g)g=i;C(g>0){x.1j(g,x);y.1j(g,y)}L(x.1I()>0){C((i=x.2k())>0)x.1j(i,x);C((i=y.2k())>0)y.1j(i,y);C(x.1d(y)>=0){x.Y(y,x);x.1j(1,x)}J{y.Y(x,y);y.1j(1,y)}}C(g>0)y.2o(g,y);F y}E 5M(n){C(n<=0)F 0;D d=o.1m%n,r=(o.s<0)?n-1:0;C(o.t>0)C(d==0)r=o[0]%n;J P(D i=o.t-1;i>=0;--i)r=(d*r+o[i])%n;F r}E 5d(m){D ac=m.1l();C((o.1l()&&ac)||m.1I()==0)F G.1x;D u=m.2N(),v=o.2N();D a=1K(1),b=1K(0),c=1K(0),d=1K(1);L(u.1I()!=0){L(u.1l()){u.1j(1,u);C(ac){C(!a.1l()||!b.1l()){a.2O(o,a);b.Y(m,b)}a.1j(1,a)}J C(!b.1l())b.Y(m,b);b.1j(1,b)}L(v.1l()){v.1j(1,v);C(ac){C(!c.1l()||!d.1l()){c.2O(o,c);d.Y(m,d)}c.1j(1,c)}J C(!d.1l())d.Y(m,d);d.1j(1,d)}C(u.1d(v)>=0){u.Y(v,u);C(ac)a.Y(c,a);b.Y(d,b)}J{v.Y(u,v);C(ac)c.Y(a,c);d.Y(b,d)}}C(v.1d(G.1w)!=0)F G.1x;C(d.1d(m)>=0)F d.3l(m);C(d.1I()<0)d.2O(m,d);J F d;C(d.1I()<0)F d.3M(m);J F d}D 1k=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,a4,a3,a2,a1,a0,69,9Z,9Y,9X,9W,9V,9U,9T,9S,9R,9Q,9P,9O,9N,9M,9L,9K,9J,9I,9H,9G,9F,9E,9D,9C,9B,9A,9z,9y,9x,9w,9v,9u,9t,9s,9r,9q,9p,9o,9n,9m,9l,9k,9j,9i,9h,9g,9f,9e,9d,9c,9b,9a,99,98,96,95,94,93,92,91,90,8Z,8Y,8X,8W,8V];D 68=(1<<26)/1k[1k.T-1];E 58(t){D i,x=o.1J();C(x.t==1&&x[0]<=1k[1k.T-1]){P(i=0;i<1k.T;++i)C(x[0]==1k[i])F 1H;F 1v}C(x.1l())F 1v;i=1;L(i<1k.T){D m=1k[i],j=i+1;L(j<1k.T&&m<68)m*=1k[j++];m=x.5N(m);L(i<j)C(m%1k[i++]==0)F 1v}F x.5L(t)}E 5K(t){D 2m=o.3l(G.1w);D k=2m.2k();C(k<=0)F 1v;D r=2m.5u(k);t=(t+1)>>1;C(t>1k.T)t=1k.T;D a=Q();P(D i=0;i<t;++i){a.2n(1k[i]);D y=a.2j(r,o);C(y.1d(G.1w)!=0&&y.1d(2m)!=0){D j=1;L(j++<k&&y.1d(2m)!=0){y=y.66(2,o);C(y.1d(G.1w)==0)F 1v}C(y.1d(2m)!=0)F 1v}}F 1H}G.H.3U=65;G.H.62=60;G.H.5Z=5Y;G.H.3T=5X;G.H.1W=5W;G.H.3p=5V;G.H.2O=5U;G.H.3S=5T;G.H.2l=5S;G.H.5R=5Q;G.H.5P=5O;G.H.5N=5M;G.H.5L=5K;G.H.2N=5J;G.H.3R=5I;G.H.8U=5H;G.H.8T=5G;G.H.1I=5F;G.H.8S=5E;G.H.8R=5D;G.H.1P=5C;G.H.3Q=5B;G.H.8Q=5A;G.H.8P=5z;G.H.8O=5y;G.H.8N=5x;G.H.2c=5w;G.H.3o=5v;G.H.5u=5t;G.H.2k=5s;G.H.8M=5r;G.H.5q=5p;G.H.8L=5o;G.H.8K=5n;G.H.8J=5m;G.H.3M=5l;G.H.3l=5k;G.H.3L=5j;G.H.5i=5h;G.H.8I=5g;G.H.8H=5f;G.H.2j=5e;G.H.8G=5d;G.H.2M=5c;G.H.8F=5b;G.H.5a=58;E 4r(){D 57="8E";D N=V G(57,16);D g=V G("2");D k=V G("8D",16);D 3k=V 3P();D a=V G(32,3k);D A=g.2j(a,N);L(A.3n(N)==0){a=V G(32,3k);A=g.2j(a,N)}D 3N=A.1t(16);D S=1b;D K=1b;D M=1b;D 3h=1b;D 2i=1F.2D("8C").2C;D 56=1F.2D("8B").2C;D Z=o;D 34=1v;D I=1F.2D("8A").2C;D p=1F.2D("8z").2C;D U=1b;o.8y=E(){F I};o.8x=E(){F U};o.8w=E(){F 2i};o.8v=E(){F g};o.8u=E(){F N};o.8t=E(s){F V G(1A(s+1A(I+":"+p)),16)};o.2I=E(1R){C(56=="8s"){F 1R}};o.2G=E(55){F 55.8r.8q};E 2F(54){F(3m(1G[54])!="8p")};o.2H=E(4X,2L,4Y){C(1G.51)U=V 51();J C(1G.50){8o{U=V 50("4Z.8n")}8m(e){}}J{Z.1z("4V 2c 8l.");F}C(U){U.8k=4Y;U.8j("8i",4X,1H);U.3O("4W-4w","8h/x-8g-8f-8e");U.3O("4W-T",2L.T);U.3O("8d","8c");U.8b(2L)}J{Z.1z("4V 8a.")}};o.4x=E(){D 4U=2i+Z.2I("88/");D 2L="I="+I+"&A="+3N;Z.2H(4U,2L,4T)};E 4T(){C(U.3f==4&&U.3e==3d){C(U.1o.1i("r").T>0){D 1Q=U.1o.1i("r")[0];C(!1Q.1O("a")){3J(1Q.1O("s"),1Q.1O("B"),p);Z.2H(2i+Z.2I("4L/"),"M="+M,4N)}J 3g(1Q.1O("s"),1Q.1O("B"),1Q.1O("a"),1Q.1O("d"))}J C(U.1o.1i("2h").T>0)Z.1z(U.1o.1i("2h")[0])}};E 3J(s,2K,4R){D B=V G(2K,16);D 4S=2K;D u=V G(1A(3N+4S),16);D x=V G(1A(s+1A(I+":"+4R)),16);D 4Q=k.3L(g.2j(x,N));D 4P=a.3M(u.3L(x));S=B.3l(4Q).2j(4P,N);D 4O=A.1t(16)+B.1t(16)+S.1t(16);M=1A(4O);3h=1A(A.1t(16)+M+S.1t(16));};E 4N(){C(U.3f==4&&U.3e==3d){C(U.1o.1i("M").T>0){C(Z.2G(U.1o.1i("M")[0])==3h){34=1H;35()}J Z.1z("4B 1B 4A 2c 4z")}J C(U.1o.1i("2h").T>0)Z.1z(Z.2G(U.1o.1i("2h")[0]))}};E 3g(s,2K,3K,4M){4u();E 3H(){C(!2F("3a")||!2F("3b")){1G.4K(3H,10);F}C(3K=="87")3I=3a;J C(3K=="86")3I=3b;3J(s,2K,3I(4M+p));Z.2H(2i+Z.2I("3g/4L/"),"M="+M,4D)};1G.4K(3H,10)};E 3E(4J){D 1B=39.85(Z.1B());D 3F=39.84(4J);D 3i=V 1u(16);3k.3G(3i);D 4I=3j.82(3F,0,3F.T,3j.4H.4G);D 4F=3j.3E(4I,3j.4H.4G,1B,1B.T,3i).81;D 2J=39.80.7Z(3i.7Y(4F));L(2J.7X("+",0)>-1)2J=2J.4E("+","7W");F 2J};E 4D(){C(U.3f==4&&U.3e==3d){C(U.1o.1i("M").T>0){C(Z.2G(U.1o.1i("M")[0])==3h){K=1A(S.1t(16));D 4C=2i+Z.2I("3g/7V/");Z.2H(4C,"p="+3E(p)+"&l="+p.T,4y)}J Z.1z("4B 1B 4A 2c 4z")}J C(U.1o.1i("2h").T>0){Z.1z(Z.2G(U.1o.1i("2h")[0]))}}};E 4y(){C(U.3f==4&&U.3e==3d){K=1b;C(U.1o.1i("7U").T>0)Z.4x();J Z.1z("7T 7S 2c be 7R")}};E 2g(4v){D 3c=1F.7Q(\'3D\');3c.4w=\'7P/7O\';3c.4p=4v;1F.1i(\'7N\')[0].7M(3c)};E 4u(){C(2F("3a")&&2F("3b"))F;D 2E=Z.4q.7L("/");D 2f=2E.7K(0,2E.T-1).7J("/");C(2E[2E.T-1]=="7I.1P.2e")2g(2f+"/7H.1P.2e");J{2g(2f+"/3b.2e");2g(2f+"/3a.2e");2g(2f+"/39.2e");2g(2f+"/7G.2e")}}E 35(){D 38=1F.2D("7F").2C;C(38.2d(0)!="#")1G.4t=38;J{1G.4t=38;Z.35()}};o.35=E(){4s("7E 7D.")};o.1B=E(){C(K==1b)C(34){K=1A(S.1t(16));F K}J Z.1z("7C 7B 2c 7A 34.");J F K};o.1z=E(t){4s(t)}};4r.H.4q=1F.1i(\'3D\')[1F.1i(\'3D\').T-1].1O("4p");',62,727,'||||||||||||||||||||||||this||||||||||||||if|var|function|return|BigInteger|prototype||else||while|||DB|for|nbi|||length|xhr|new|||subTo|that|||||||||||HASH|null|r2|compareTo|Math|safe_add|rng_pptr|DM|getElementsByTagName|rShiftTo|lowprimes|isEven|DV|clamp|responseXML|ds|sh|vv|rng_pool|toString|Array|false|ONE|ZERO|reduce|error_message|SHA256|key|sqrTo|ys|255|document|window|true|signum|abs|nbv|copyTo|divRemTo|dbits|getAttribute|min|response|str|Montgomery|Classic|256|utftext|bitwiseTo|mulTo|Barrett|op|floor|mi||||||pm|||charCodeAt|rr|not|charAt|js|path|import_file|error|url|modPow|getLowestSetBit|dAddOffset|n1|fromInt|lShiftTo|revert|convert|multiplyTo|dlShiftTo|NullExp|nsh|cbs|xh|xl|string|chrsz|fromCharCode|String|value|getElementById|arr|isdefined|innerxml|ajaxRequest|paths|retstring|ephemeral|params|pow|clone|addTo|negate|k1|km|nbits|squareTo|drShiftTo|0xff|0x80|cs|0x7fff|BI_RC||||rng_state|authenticated|success|||forward_url|cryptoHelpers|SHA1|MD5|scriptElt|200|status|readyState|upgrade|M2|iv|slowAES|rng|subtract|typeof|mod|shiftLeft|changeBit|op_or|0xffff|fromString|qd|y0|pt|BI_FP|navigator|rng_psize|Arcfour|binarray|128|T1|script|encrypt|byteMessage|nextBytes|do_upgrade|hashfun|calculations|algo|multiply|add|Astr|setRequestHeader|SecureRandom|max|intValue|dMultiply|fromNumber|chunkSize|is1|g2|bitLength|q3|exp|nNop||op_xor||op_andnot|0xf|intAt|||mpl|mp|ts|F2|yt|F1|int2char|appName|j_lm|0x3fff|rng_seed_time|hex_tab|bin|T2|0xFFFF|lsw|src|srpPath|SRP|alert|location|import_hashes|fname|type|identify|confirm_verifier|match|does|Server|auth_url|confirm_upgrade|replace|ciphertext|CFB|modeOfOperation|paddedByteMessage|plaintext|setTimeout|authenticate|dsalt|confirm_authentication|Mstr|aux|kgx|pass|Bstr|receive_salts|handshake_url|Ajax|Content|full_url|callback|Microsoft|ActiveXObject|XMLHttpRequest|||variable|node|server|Nstr|bnIsProbablePrime||isProbablePrime|bnGCD|bnPow|bnModInverse|bnModPow|bnDivideAndRemainder|bnRemainder|bnDivide|divide|bnMultiply|bnSubtract|bnAdd|bnFlipBit|bnClearBit|bnSetBit|bnTestBit|testBit|bnBitCount|bnGetLowestSetBit|bnShiftRight|shiftRight|bnShiftLeft|bnNot|bnAndNot|bnXor|bnOr|bnAnd|bnMax|bnMin|bnEquals|bnToByteArray|bnSigNum|bnShortValue|bnByteValue|bnIntValue|bnClone|bnpMillerRabin|millerRabin|bnpModInt|modInt|bnpMultiplyUpperTo|multiplyUpperTo|bnpMultiplyLowerTo|multiplyLowerTo|bnpDAddOffset|bnpDMultiply|bnpAddTo|bnpChangeBit|bnpBitwiseTo|bnpFromNumber|bnpFromRadix|fromRadix|bnpToRadix||toRadix|||bnpChunkSize|modPowInt||lplim|127|barrettSqrTo|barrettMulTo|barrettReduce|barrettRevert|barrettConvert|mu|nSqrTo|nMulTo|cbit|lbit|op_and|number|continue|bnModPowInt|bnMod|bnBitLength|bnCompareTo|bnAbs|bnNegate|bnToString|bnpExp|bnpIsEven|bnpInvDigit|invDigit|bnpDivRemTo|bnpSquareTo|bnpMultiplyTo|bnpSubTo|bnpRShiftTo|bnpLShiftTo|bnpDRShiftTo|bnpDLShiftTo|bnpClamp|bnpFromString|bnpFromInt|bnpCopyTo|montSqrTo|montMulTo|montReduce|montRevert|montConvert|u0|um|mph|mt2|cSqrTo|cMulTo|cReduce|cRevert|cConvert|ms|d2|d1||FV||BI_RM|am3|am1|Netscape|am2||0x3fffffff|canary|rng_get_bytes|rng_get_byte|next|init|prng_newstate|random|crypto|rng_seed_int|ARC4next|ARC4init|str2binb|core_sha256|binb2hex|Utf8Encode|0xF|hexcase|mask|Maj|Sigma0256|Ch|Sigma1256|Gamma0256|Gamma1256|msw|been|has|User|successful|Login|srp_forward|aes|hash|srp|join|slice|split|appendChild|head|javascript|text|createElement|confirmed|could|Verifier|ok|verifier|_|indexOf|concat|encode|base64|cipher|getPaddedBlock||convertStringToByteArray|toNumbers|md5|sha1|handshake||failed|send|close|Connection|urlencoded|form|www|application|POST|open|onreadystatechange|supported|catch|XMLHTTP|try|undefined|nodeValue|firstChild|django|calcX|getN|getg|geturl|getxhr|getI|srp_password|srp_username|srp_server|srp_url|c46d46600d87fef149bd79b81119842f3c20241fda67d06ef412d8f6d9479c58|115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3|gcd|modInverse|divideAndRemainder|remainder|flipBit|clearBit|setBit|bitCount|andNot|xor|or|and|equals|toByteArray|shortValue|byteValue|509|503|499|491|487|479|467|463|461|457|449|443||439|433|431|421|419|409|401|397|389|383|379|373|367|359|353|349|347|337|331|317|313|311|307|293|283|281|277|271|269|263|257|251|241|239|233|229|227|223|211|199|197|193|191|181|179|173|167|163|157|151|149|139|137|131|113|109|107|103|101|768|144|substr|log|LN2|0xffffffff|0123456789abcdefghijklmnopqrstuvwxyz||Explorer|Internet|0xfffffff|0x3ffffff|0x4000000|0xefcafe|0xffffff|0xdeadbeefcafe|65536||appVersion|getTime|Date|0123456789abcdef|0123456789ABCDEF|224|192|2048|0x5BE0CD19|0x1F83D9AB|0x9B05688C|0x510E527F|0xA54FF53A|0x3C6EF372|0xBB67AE85|0x6A09E667|0xC67178F2|0xBEF9A3F7|0xA4506CEB|0x90BEFFFA|0x8CC70208|0x84C87814|0x78A5636F|0x748F82EE|0x682E6FF3|0x5B9CCA4F|0x4ED8AA4A|0x391C0CB3|0x34B0BCB5|0x2748774C|0x1E376C08|0x19A4C116|0x106AA070|0xF40E3585|0xD6990624|0xD192E819|0xC76C51A3|0xC24B8B70|0xA81A664B|0xA2BFE8A1|0x92722C85|0x81C2C92E|0x766A0ABB|0x650A7354|0x53380D13|0x4D2C6DFC|0x2E1B2138|0x27B70A85|0x14292967||0x6CA6351|0xD5A79147|0xC6E00BF3||0xBF597FC7|0xB00327C8|0xA831C66D|0x983E5152|0x76F988DA|0x5CB0A9DC|0x4A7484AA||0x2DE92C6F|0x240CA1CC|0xFC19DC6|0xEFBE4786|0xE49B69C1||0xC19BF174|0x9BDC06A7|0x80DEB1FE|0x72BE5D74|0x550C7DC3|0x243185BE|0x12835B01|0xD807AA98|0xAB1C5ED5|0x923F82A4|0x59F111F1|0x3956C25B|0xE9B5DBA5|0xB5C0FBCF|0x71374491|0x428A2F98'.split('|'),0,{}))
diff --git a/javascript/jsPacker/srp_register.min.js b/javascript/jsPacker/srp_register.min.js
deleted file mode 100644
index 6c5a1d5..0000000
--- a/javascript/jsPacker/srp_register.min.js
+++ /dev/null
@@ -1 +0,0 @@
-eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('9 g(){3 1;b.a.e=9(){1=5;3 w=5.p()+5.o("e/f/");3 c="I="+5.K();5.n(w,c,5.u)};b.a.u=9(){3 2=1.k();8(2.j==4&&2.i==h){8(2.7.6("f").d>0){3 s=1.t(2.7.6("f")[0]);3 x=1.J(s);3 v=1.H().G(x,1.F());1.q(v.E(D))}C 8(2.7.6("r").d>0){1.B(1.t(2.7.6("r")[0]))}}};b.a.q=9(v){3 c="v="+v;3 m=1.p()+1.o("e/A/");1.n(m,c,1.l)};b.a.l=9(){3 2=1.k();8(2.j==4&&2.i==h){8(2.7.6("z").d>0){1.y()}}}};g();',47,47,'|that|xhr|var||this|getElementsByTagName|responseXML|if|function|prototype|SRP|params|length|register|salt|SRP_REGISTER|200|status|readyState|getxhr|register_user|auth_url|ajaxRequest|paths|geturl|register_send_verifier|error||innerxml|register_receive_salt||handshake_url||identify|ok|user|error_message|else|16|toString|getN|modPow|getg||calcX|getI'.split('|'),0,{}))
diff --git a/javascript/srp.min.js b/javascript/srp.min.js
deleted file mode 100644
index 77f4f20..0000000
--- a/javascript/srp.min.js
+++ /dev/null
@@ -1 +0,0 @@
-eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('E 1A(s){D 2z=8;D 7r=0;E 1f(x,y){D 4o=(x&4n)+(y&4n);D 7z=(x>>16)+(y>>16)+(4o>>16);F(7z<<16)|(4o&4n)}E S(X,n){F(X>>>n)|(X<<(32-n))}E R(X,n){F(X>>>n)}E 7v(x,y,z){F((x&y)^((~x)&z))}E 7t(x,y,z){F((x&y)^(x&z)^(y&z))}E 7u(x){F(S(x,2)^S(x,13)^S(x,22))}E 7w(x){F(S(x,6)^S(x,11)^S(x,25))}E 7x(x){F(S(x,7)^S(x,18)^R(x,3))}E 7y(x){F(S(x,17)^S(x,19)^R(x,10))}E 7n(m,l){D K=V 1u(bI,bH,bG,bF,bE,bD,bC,bB,bA,bz,by,bx,bw,bv,bu,bt,br,bq,bp,bo,bn,bl,bk,bj,bi,bh,bg,bf,bd,bc,bb,b9,b8,b7,b6,b5,b4,b3,b2,b1,b0,aZ,aY,aX,aW,aV,aU,aT,aS,aR,aQ,aP,aO,aN,aM,aL,aK,aJ,aI,aH,aG,aF,aE,aD);D 1a=V 1u(aC,aB,aA,az,ay,ax,aw,av);D W=V 1u(64);D a,b,c,d,e,f,g,h,i,j;D 3C,4m;m[l>>5]|=2W<<(24-l%32);m[((l+64>>9)<<4)+15]=l;P(D i=0;i<m.T;i+=16){a=1a[0];b=1a[1];c=1a[2];d=1a[3];e=1a[4];f=1a[5];g=1a[6];h=1a[7];P(D j=0;j<64;j++){C(j<16)W[j]=m[j+i];J W[j]=1f(1f(1f(7y(W[j-2]),W[j-7]),7x(W[j-15])),W[j-16]);3C=1f(1f(1f(1f(h,7w(e)),7v(e,f,g)),K[j]),W[j]);4m=1f(7u(a),7t(a,b,c));h=g;g=f;f=e;e=1f(d,3C);d=c;c=b;b=a;a=1f(3C,4m)}1a[0]=1f(a,1a[0]);1a[1]=1f(b,1a[1]);1a[2]=1f(c,1a[2]);1a[3]=1f(d,1a[3]);1a[4]=1f(e,1a[4]);1a[5]=1f(f,1a[5]);1a[6]=1f(g,1a[6]);1a[7]=1f(h,1a[7])}F 1a}E 7m(1R){D 4l=1u();D 7s=(1<<2z)-1;P(D i=0;i<1R.T*2z;i+=2z){4l[i>>5]|=(1R.2a(i/2z)&7s)<<(24-i%32)}F 4l}E 7p(2y){2y=2y.4E(/\\r\\n/g,"\\n");D 1V="";P(D n=0;n<2y.T;n++){D c=2y.2a(n);C(c<3B){1V+=2B.2A(c)}J C((c>69)&&(c<au)){1V+=2B.2A((c>>6)|at);1V+=2B.2A((c&63)|3B)}J{1V+=2B.2A((c>>12)|as);1V+=2B.2A(((c>>6)&63)|3B);1V+=2B.2A((c&63)|3B)}}F 1V}E 7o(3A){D 4k=7r?"ar":"aq";D 1R="";P(D i=0;i<3A.T*4;i++){1R+=4k.2d((3A[i>>2]>>((3-i%4)*8+4))&7q)+4k.2d((3A[i>>2]>>((3-i%4)*8))&7q)}F 1R}s=7p(s);F 7o(7n(7m(s),s.T*2z))}E 3z(){o.i=0;o.j=0;o.S=V 1u()}E 7l(1B){D i,j,t;P(i=0;i<1U;++i)o.S[i]=i;j=0;P(i=0;i<1U;++i){j=(j+o.S[i]+1B[i%1B.T])&1E;t=o.S[i];o.S[i]=o.S[j];o.S[j]=t}o.i=0;o.j=0}E 7k(){D t;o.i=(o.i+1)&1E;o.j=(o.j+o.S[o.i])&1E;t=o.S[o.i];o.S[o.i]=o.S[o.j];o.S[o.j]=t;F o.S[(t+o.S[o.i])&1E]}3z.H.7f=7l;3z.H.7e=7k;E 7g(){F V 3z()}D 3y=1U;D 33;D 1s;D 1g;E 7j(x){1s[1g++]^=x&1E;1s[1g++]^=(x>>8)&1E;1s[1g++]^=(x>>16)&1E;1s[1g++]^=(x>>24)&1E;C(1g>=3y)1g-=3y}E 4j(){7j(V ap().ao())}C(1s==1b){1s=V 1u();1g=0;D t;C(3x.4g=="77"&&3x.an<"5"&&1G.7i){D z=1G.7i.7h(32);P(t=0;t<z.T;++t)1s[1g++]=z.2a(t)&1E}L(1g<3y){t=1e.20(al*1e.7h());1s[1g++]=t>>>8;1s[1g++]=t&1E}1g=0;4j();}E 7d(){C(33==1b){4j();33=7g();33.7f(1s);P(1g=0;1g<1s.T;++1g)1s[1g]=0;1g=0;}F 33.7e()}E 7c(ba){D i;P(i=0;i<ba.T;++i)ba[i]=7d()}E 3P(){}3P.H.3G=7c;D 1N;D 7b=ak;D 4h=((7b&aj)==ai);E G(a,b,c){C(a!=1b)C("6l"==3m a)o.3T(a,b,c);J C(b==1b&&"2y"!=3m a)o.3s(a,1U);J o.3s(a,b)}E Q(){F V G(1b)}E 76(i,x,w,j,c,n){L(--n>=0){D v=x*o[i++]+w[j]+c;c=1e.20(v/ah);w[j++]=v&ag}F c}E 78(i,x,w,j,c,n){D 2x=x&2Y,2w=x>>15;L(--n>=0){D l=o[i]&2Y;D h=o[i++]>>15;D m=2w*l+h*2x;l=2x*l+((m&2Y)<<15)+w[j]+(c&7a);c=(l>>>30)+(m>>>15)+2w*h+(c>>>30);w[j++]=l&7a}F c}E 75(i,x,w,j,c,n){D 2x=x&4i,2w=x>>14;L(--n>=0){D l=o[i]&4i;D h=o[i++]>>14;D m=2w*l+h*2x;l=2x*l+((m&4i)<<14)+w[j]+c;c=(l>>28)+(m>>14)+2w*h;w[j++]=l&af}F c}C(4h&&(3x.4g=="4Z ae ad")){G.H.am=78;1N=30}J C(4h&&(3x.4g!="77")){G.H.am=76;1N=26}J{G.H.am=75;1N=28}G.H.O=1N;G.H.1h=((1<<1N)-1);G.H.1m=(1<<1N);D 3w=52;G.H.72=1e.2M(2,3w);G.H.4e=3w-1N;G.H.4c=2*1N-3w;D 74="ab";D 2Z=V 1u();D 2b,1r;2b="0".2a(0);P(1r=0;1r<=9;++1r)2Z[2b++]=1r;2b="a".2a(0);P(1r=10;1r<36;++1r)2Z[2b++]=1r;2b="A".2a(0);P(1r=10;1r<36;++1r)2Z[2b++]=1r;E 4f(n){F 74.2d(n)}E 46(s,i){D c=2Z[s.2a(i)];F(c==1b)?-1:c}E 6J(r){P(D i=o.t-1;i>=0;--i)r[i]=o[i];r.t=o.t;r.s=o.s}E 6I(x){o.t=1;o.s=(x<0)?-1:0;C(x>0)o[0]=x;J C(x<-1)o[0]=x+1m;J o.t=0}E 1K(i){D r=Q();r.2n(i);F r}E 6H(s,b){D k;C(b==16)k=4;J C(b==8)k=3;J C(b==1U)k=8;J C(b==2)k=1;J C(b==32)k=5;J C(b==4)k=2;J{o.5Z(s,b);F}o.t=0;o.s=0;D i=s.T,21=1v,1q=0;L(--i>=0){D x=(k==8)?s[i]&2V:46(s,i);C(x<0){C(s.2d(i)=="-")21=1H;6m}21=1v;C(1q==0)o[o.t++]=x;J C(1q+k>o.O){o[o.t-1]|=(x&((1<<(o.O-1q))-1))<<1q;o[o.t++]=(x>>(o.O-1q))}J o[o.t-1]|=x<<1q;1q+=k;C(1q>=o.O)1q-=o.O}C(k==8&&(s[0]&2W)!=0){o.s=-1;C(1q>0)o[o.t-1]|=((1<<(o.O-1q))-1)<<1q}o.1n();C(21)G.1x.Y(o,o)}E 6G(){D c=o.s&o.1h;L(o.t>0&&o[o.t-1]==c)--o.t}E 6t(b){C(o.s<0)F"-"+o.2P().1t(b);D k;C(b==16)k=4;J C(b==8)k=3;J C(b==2)k=1;J C(b==32)k=5;J C(b==4)k=2;J F o.62(b);D 2R=(1<<k)-1,d,m=1v,r="",i=o.t;D p=o.O-(i*o.O)%k;C(i-->0){C(p<o.O&&(d=o[i]>>p)>0){m=1H;r=4f(d)}L(i>=0){C(p<k){d=(o[i]&((1<<p)-1))<<(k-p);d|=o[--i]>>(p+=o.O-k)}J{d=(o[i]>>(p-=k))&2R;C(p<=0){p+=o.O;--i}}C(d>0)m=1H;C(m)r+=4f(d)}}F m?r:"0"}E 6s(){D r=Q();G.1x.Y(o,r);F r}E 6r(){F(o.s<0)?o.2P():o}E 6q(a){D r=o.s-a.s;C(r!=0)F r;D i=o.t;r=i-a.t;C(r!=0)F r;L(--i>=0)C((r=o[i]-a[i])!=0)F r;F 0}E 2S(x){D r=1,t;C((t=x>>>16)!=0){x=t;r+=16}C((t=x>>8)!=0){x=t;r+=8}C((t=x>>4)!=0){x=t;r+=4}C((t=x>>2)!=0){x=t;r+=2}C((t=x>>1)!=0){x=t;r+=1}F r}E 6p(){C(o.t<=0)F 0;F o.O*(o.t-1)+2S(o[o.t-1]^(o.s&o.1h))}E 6F(n,r){D i;P(i=o.t-1;i>=0;--i)r[i+n]=o[i];P(i=n-1;i>=0;--i)r[i]=0;r.t=o.t+n;r.s=o.s}E 6E(n,r){P(D i=n;i<o.t;++i)r[i-n]=o[i];r.t=1e.3Q(o.t-n,0);r.s=o.s}E 6D(n,r){D bs=n%o.O;D 2v=o.O-bs;D bm=(1<<2v)-1;D 1p=1e.20(n/o.O),c=(o.s<<bs)&o.1h,i;P(i=o.t-1;i>=0;--i){r[i+1p+1]=(o[i]>>2v)|c;c=(o[i]&bm)<<bs}P(i=1p-1;i>=0;--i)r[i]=0;r[1p]=c;r.t=o.t+1p+1;r.s=o.s;r.1n()}E 6C(n,r){r.s=o.s;D 1p=1e.20(n/o.O);C(1p>=o.t){r.t=0;F}D bs=n%o.O;D 2v=o.O-bs;D bm=(1<<bs)-1;r[0]=o[1p]>>bs;P(D i=1p+1;i<o.t;++i){r[i-1p-1]|=(o[i]&bm)<<2v;r[i-1p]=o[i]>>bs}C(bs>0)r[o.t-1p-1]|=(o.s&bm)<<2v;r.t=o.t-1p;r.1n()}E 6B(a,r){D i=0,c=0,m=1e.1P(a.t,o.t);L(i<m){c+=o[i]-a[i];r[i++]=c&o.1h;c>>=o.O}C(a.t<o.t){c-=a.s;L(i<o.t){c+=o[i];r[i++]=c&o.1h;c>>=o.O}c+=o.s}J{c+=o.s;L(i<a.t){c-=a[i];r[i++]=c&o.1h;c>>=o.O}c-=a.s}r.s=(c<0)?-1:0;C(c<-1)r[i++]=o.1m+c;J C(c>0)r[i++]=c;r.t=i;r.1n()}E 6A(a,r){D x=o.1J(),y=a.1J();D i=x.t;r.t=i+y.t;L(--i>=0)r[i]=0;P(i=0;i<y.t;++i)r[i+x.t]=x.am(0,y[i],r,i,0,x.t);r.s=0;r.1n();C(o.s!=a.s)G.1x.Y(r,r)}E 6z(r){D x=o.1J();D i=r.t=2*x.t;L(--i>=0)r[i]=0;P(i=0;i<x.t-1;++i){D c=x.am(i,x[i],r,2*i,0,1);C((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1))>=x.1m){r[i+x.t]-=x.1m;r[i+x.t+1]=1}}C(r.t>0)r[r.t-1]+=x.am(i,x[i],r,2*i,0,1);r.s=0;r.1n()}E 6y(m,q,r){D 27=m.1J();C(27.t<=0)F;D 3v=o.1J();C(3v.t<27.t){C(q!=1b)q.2n(0);C(r!=1b)o.1L(r);F}C(r==1b)r=Q();D y=Q(),4b=o.s,6Y=m.s;D 2u=o.O-2S(27[27.t-1]);C(2u>0){27.2o(2u,y);3v.2o(2u,r)}J{27.1L(y);3v.1L(r)}D 1D=y.t;D 3u=y[1D-1];C(3u==0)F;D 4d=3u*(1<<o.4e)+((1D>1)?y[1D-2]>>o.4c:0);D 70=o.72/4d,6Z=(1<<o.4e)/4d,e=1<<o.4c;D i=r.t,j=i-1D,t=(q==1b)?Q():q;y.2s(j,t);C(r.1d(t)>=0){r[r.t++]=1;r.Y(t,r)}G.1w.2s(1D,t);t.Y(y,y);L(y.t<1D)y[y.t++]=0;L(--j>=0){D 3t=(r[--i]==3u)?o.1h:1e.20(r[i]*70+(r[i-1]+e)*6Z);C((r[i]+=y.am(0,3t,r,j,0,1D))<3t){y.2s(j,t);r.Y(t,r);L(r[i]<--3t)r.Y(t,r)}}C(q!=1b){r.2U(1D,q);C(4b!=6Y)G.1x.Y(q,q)}r.t=1D;r.1n();C(2u>0)r.1j(2u,r);C(4b<0)G.1x.Y(r,r)}E 6o(a){D r=Q();o.1J().1M(a,1b,r);C(o.s<0&&r.1d(G.1x)>0)a.Y(r,r);F r}E 1T(m){o.m=m}E 6X(x){C(x.s<0||x.1d(o.m)>=0)F x.3n(o.m);J F x}E 6W(x){F x}E 6V(x){x.1M(o.m,1b,x)}E 6U(x,y,r){x.2r(y,r);o.1y(r)}E 6T(x,r){x.2T(r);o.1y(r)}1T.H.2q=6X;1T.H.2p=6W;1T.H.1y=6V;1T.H.1X=6U;1T.H.1C=6T;E 6w(){C(o.t<1)F 0;D x=o[0];C((x&1)==0)F 0;D y=x&3;y=(y*(2-(x&45)*y))&45;y=(y*(2-(x&2V)*y))&2V;y=(y*(2-(((x&3r)*y)&3r)))&3r;y=(y*(2-x*y%o.1m))%o.1m;F(y>0)?o.1m-y:-y}E 1S(m){o.m=m;o.4a=m.6x();o.49=o.4a&2Y;o.6R=o.4a>>15;o.6Q=(1<<(m.O-15))-1;o.6S=2*m.t}E 6O(x){D r=Q();x.1J().2s(o.m.t,r);r.1M(o.m,1b,r);C(x.s<0&&r.1d(G.1x)>0)o.m.Y(r,r);F r}E 6N(x){D r=Q();x.1L(r);o.1y(r);F r}E 6M(x){L(x.t<=o.6S)x[x.t++]=0;P(D i=0;i<o.m.t;++i){D j=x[i]&2Y;D 6P=(j*o.49+(((j*o.6R+(x[i]>>15)*o.49)&o.6Q)<<15))&x.1h;j=i+o.m.t;x[j]+=o.m.am(0,6P,x,i,0,o.m.t);L(x[j]>=x.1m){x[j]-=x.1m;x[++j]++}}x.1n();x.2U(o.m.t,x);C(x.1d(o.m)>=0)x.Y(o.m,x)}E 6K(x,r){x.2T(r);o.1y(r)}E 6L(x,y,r){x.2r(y,r);o.1y(r)}1S.H.2q=6O;1S.H.2p=6N;1S.H.1y=6M;1S.H.1X=6L;1S.H.1C=6K;E 6v(){F((o.t>0)?(o[0]&1):o.s)==0}E 6u(e,z){C(e>aa||e<1)F G.1w;D r=Q(),1c=Q(),g=z.2q(o),i=2S(e)-1;g.1L(r);L(--i>=0){z.1C(r,1c);C((e&(1<<i))>0)z.1X(1c,g,r);J{D t=r;r=1c;1c=t}}F z.2p(r)}E 6n(e,m){D z;C(e<1U||m.1l())z=V 1T(m);J z=V 1S(m);F o.3Z(e,z)}G.H.1L=6J;G.H.2n=6I;G.H.3s=6H;G.H.1n=6G;G.H.2s=6F;G.H.2U=6E;G.H.2o=6D;G.H.1j=6C;G.H.Y=6B;G.H.2r=6A;G.H.2T=6z;G.H.1M=6y;G.H.6x=6w;G.H.1l=6v;G.H.3Z=6u;G.H.1t=6t;G.H.2P=6s;G.H.1J=6r;G.H.1d=6q;G.H.3X=6p;G.H.3n=6o;G.H.66=6n;G.1x=1K(0);G.1w=1K(1);E 5J(){D r=Q();o.1L(r);F r}E 5I(){C(o.s<0){C(o.t==1)F o[0]-o.1m;J C(o.t==0)F-1}J C(o.t==1)F o[0];J C(o.t==0)F 0;F((o[1]&((1<<(32-o.O))-1))<<o.O)|o[0]}E 5H(){F(o.t==0)?o.s:(o[0]<<24)>>24}E 5G(){F(o.t==0)?o.s:(o[0]<<16)>>16}E 65(r){F 1e.20(1e.a9*o.O/1e.a8(r))}E 5F(){C(o.s<0)F-1;J C(o.t<=0||(o.t==1&&o[0]<=0))F 0;J F 1}E 60(b){C(b==1b)b=10;C(o.1I()==0||b<2||b>36)F"0";D 2X=o.3U(b);D a=1e.2M(b,2X);D d=1K(a),y=Q(),z=Q(),r="";o.1M(d,y,z);L(y.1I()>0){r=(a+z.3R()).1t(b).a7(1)+r;y.1M(d,y,z)}F z.3R().1t(b)+r}E 5Y(s,b){o.2n(0);C(b==1b)b=10;D 2X=o.3U(b);D d=1e.2M(b,2X),21=1v,j=0,w=0;P(D i=0;i<s.T;++i){D x=46(s,i);C(x<0){C(s.2d(i)=="-"&&o.1I()==0)21=1H;6m}w=b*w+x;C(++j>=2X){o.3S(d);o.2l(w,0);j=0;w=0}}C(j>0){o.3S(1e.2M(b,j));o.2l(w,0)}C(21)G.1x.Y(o,o)}E 5X(a,b,c){C("6l"==3m b){C(a<2)o.2n(1);J{o.3T(a,c);C(!o.5q(a-1))o.1W(G.1w.3o(a-1),3q,o);C(o.1l())o.2l(1,0);L(!o.5a(b)){o.2l(2,0);C(o.3X()>a)o.Y(G.1w.3o(a-1),o)}}}J{D x=V 1u(),t=a&7;x.T=(a>>3)+1;b.3G(x);C(t>0)x[0]&=((1<<t)-1);J x[0]=0;o.3s(x,1U)}}E 5E(){D i=o.t,r=V 1u();r[0]=o.s;D p=o.O-(i*o.O)%8,d,k=0;C(i-->0){C(p<o.O&&(d=o[i]>>p)!=(o.s&o.1h)>>p)r[k++]=d|(o.s<<(o.O-p));L(i>=0){C(p<8){d=(o[i]&((1<<p)-1))<<(8-p);d|=o[--i]>>(p+=o.O-8)}J{d=(o[i]>>(p-=8))&2V;C(p<=0){p+=o.O;--i}}C((d&2W)!=0)d|=-1U;C(k==0&&(o.s&2W)!=(d&2W))++k;C(k>0||d!=o.s)r[k++]=d}}F r}E 5D(a){F(o.1d(a)==0)}E 5C(a){F(o.1d(a)<0)?o:a}E 5B(a){F(o.1d(a)>0)?o:a}E 5W(a,1Z,r){D i,f,m=1e.1P(a.t,o.t);P(i=0;i<m;++i)r[i]=1Z(o[i],a[i]);C(a.t<o.t){f=a.s&o.1h;P(i=m;i<o.t;++i)r[i]=1Z(o[i],f);r.t=o.t}J{f=o.s&o.1h;P(i=m;i<a.t;++i)r[i]=1Z(f,a[i]);r.t=a.t}r.s=1Z(o.s,a.s);r.1n()}E 6k(x,y){F x&y}E 5A(a){D r=Q();o.1W(a,6k,r);F r}E 3q(x,y){F x|y}E 5z(a){D r=Q();o.1W(a,3q,r);F r}E 42(x,y){F x^y}E 5y(a){D r=Q();o.1W(a,42,r);F r}E 44(x,y){F x&~y}E 5x(a){D r=Q();o.1W(a,44,r);F r}E 5w(){D r=Q();P(D i=0;i<o.t;++i)r[i]=o.1h&~o[i];r.t=o.t;r.s=~o.s;F r}E 5v(n){D r=Q();C(n<0)o.1j(-n,r);J o.2o(n,r);F r}E 5t(n){D r=Q();C(n<0)o.2o(-n,r);J o.1j(n,r);F r}E 6j(x){C(x==0)F-1;D r=0;C((x&3r)==0){x>>=16;r+=16}C((x&2V)==0){x>>=8;r+=8}C((x&45)==0){x>>=4;r+=4}C((x&3)==0){x>>=2;r+=2}C((x&1)==0)++r;F r}E 5s(){P(D i=0;i<o.t;++i)C(o[i]!=0)F i*o.O+6j(o[i]);C(o.s<0)F o.t*o.O;F-1}E 6i(x){D r=0;L(x!=0){x&=x-1;++r}F r}E 5r(){D r=0,x=o.s&o.1h;P(D i=0;i<o.t;++i)r+=6i(o[i]^x);F r}E 5p(n){D j=1e.20(n/o.O);C(j>=o.t)F(o.s!=0);F((o[j]&(1<<(n%o.O)))!=0)}E 5V(n,1Z){D r=G.1w.3o(n);o.1W(r,1Z,r);F r}E 5o(n){F o.3p(n,3q)}E 5n(n){F o.3p(n,44)}E 5m(n){F o.3p(n,42)}E 5U(a,r){D i=0,c=0,m=1e.1P(a.t,o.t);L(i<m){c+=o[i]+a[i];r[i++]=c&o.1h;c>>=o.O}C(a.t<o.t){c+=a.s;L(i<o.t){c+=o[i];r[i++]=c&o.1h;c>>=o.O}c+=o.s}J{c+=o.s;L(i<a.t){c+=a[i];r[i++]=c&o.1h;c>>=o.O}c+=a.s}r.s=(c<0)?-1:0;C(c>0)r[i++]=c;J C(c<-1)r[i++]=o.1m+c;r.t=i;r.1n()}E 5l(a){D r=Q();o.2O(a,r);F r}E 5k(a){D r=Q();o.Y(a,r);F r}E 5j(a){D r=Q();o.2r(a,r);F r}E 5h(a){D r=Q();o.1M(a,r,1b);F r}E 5g(a){D r=Q();o.1M(a,1b,r);F r}E 5f(a){D q=Q(),r=Q();o.1M(a,q,r);F V 1u(q,r)}E 5T(n){o[o.t]=o.am(0,n-1,o,0,0,o.t);++o.t;o.1n()}E 5S(n,w){L(o.t<=w)o[o.t++]=0;o[w]+=n;L(o[w]>=o.1m){o[w]-=o.1m;C(++w>=o.t)o[o.t++]=0;++o[w]}}E 2t(){}E 40(x){F x}E 6h(x,y,r){x.2r(y,r)}E 6g(x,r){x.2T(r)}2t.H.2q=40;2t.H.2p=40;2t.H.1X=6h;2t.H.1C=6g;E 5c(e){F o.3Z(e,V 2t())}E 5Q(a,n,r){D i=1e.1P(o.t+a.t,n);r.s=0;r.t=i;L(i>0)r[--i]=0;D j;P(j=r.t-o.t;i<j;++i)r[i+o.t]=o.am(0,a[i],r,i,0,o.t);P(j=1e.1P(a.t,n);i<j;++i)o.am(0,a[i],r,i,0,n-i);r.1n()}E 5O(a,n,r){--n;D i=r.t=o.t+a.t-n;r.s=0;L(--i>=0)r[i]=0;P(i=1e.3Q(n-o.t,0);i<a.t;++i)r[o.t+i-n]=o.am(n-i,a[i],r,0,0,o.t+i-n);r.1n();r.2U(1,r)}E 1Y(m){o.1c=Q();o.3Y=Q();G.1w.2s(2*m.t,o.1c);o.6f=o.1c.5i(m);o.m=m}E 6e(x){C(x.s<0||x.t>2*o.m.t)F x.3n(o.m);J C(x.1d(o.m)<0)F x;J{D r=Q();x.1L(r);o.1y(r);F r}}E 6d(x){F x}E 6c(x){x.2U(o.m.t-1,o.1c);C(x.t>o.m.t+1){x.t=o.m.t+1;x.1n()}o.6f.5P(o.1c,o.m.t+1,o.3Y);o.m.5R(o.3Y,o.m.t+1,o.1c);L(x.1d(o.1c)<0)x.2l(1,o.m.t+1);x.Y(o.1c,x);L(x.1d(o.m)>=0)x.Y(o.m,x)}E 6a(x,r){x.2T(r);o.1y(r)}E 6b(x,y,r){x.2r(y,r);o.1y(r)}1Y.H.2q=6e;1Y.H.2p=6d;1Y.H.1y=6c;1Y.H.1X=6b;1Y.H.1C=6a;E 5e(e,m){D i=e.3X(),k,r=1K(1),z;C(i<=0)F r;J C(i<18)k=1;J C(i<48)k=3;J C(i<a6)k=4;J C(i<a5)k=5;J k=6;C(i<8)z=V 1T(m);J C(m.1l())z=V 1Y(m);J z=V 1S(m);D g=V 1u(),n=3,2Q=k-1,2R=(1<<k)-1;g[1]=z.2q(o);C(k>1){D 3W=Q();z.1C(g[1],3W);L(n<=2R){g[n]=Q();z.1X(3W,g[n-2],g[n]);n+=2}}D j=e.t-1,w,3V=1H,1c=Q(),t;i=2S(e[j])-1;L(j>=0){C(i>=2Q)w=(e[j]>>(i-2Q))&2R;J{w=(e[j]&((1<<(i+1))-1))<<(2Q-i);C(j>0)w|=e[j-1]>>(o.O+i-2Q)}n=k;L((w&1)==0){w>>=1;--n}C((i-=n)<0){i+=o.O;--j}C(3V){g[w].1L(r);3V=1v}J{L(n>1){z.1C(r,1c);z.1C(1c,r);n-=2}C(n>0)z.1C(r,1c);J{t=r;r=1c;1c=t}z.1X(1c,g[w],r)}L(j>=0&&(e[j]&(1<<i))==0){z.1C(r,1c);t=r;r=1c;1c=t;C(--i<0){i=o.O-1;--j}}}F z.2p(r)}E 5b(a){D x=(o.s<0)?o.2P():o.2N();D y=(a.s<0)?a.2P():a.2N();C(x.1d(y)<0){D t=x;x=y;y=t}D i=x.2k(),g=y.2k();C(g<0)F x;C(i<g)g=i;C(g>0){x.1j(g,x);y.1j(g,y)}L(x.1I()>0){C((i=x.2k())>0)x.1j(i,x);C((i=y.2k())>0)y.1j(i,y);C(x.1d(y)>=0){x.Y(y,x);x.1j(1,x)}J{y.Y(x,y);y.1j(1,y)}}C(g>0)y.2o(g,y);F y}E 5M(n){C(n<=0)F 0;D d=o.1m%n,r=(o.s<0)?n-1:0;C(o.t>0)C(d==0)r=o[0]%n;J P(D i=o.t-1;i>=0;--i)r=(d*r+o[i])%n;F r}E 5d(m){D ac=m.1l();C((o.1l()&&ac)||m.1I()==0)F G.1x;D u=m.2N(),v=o.2N();D a=1K(1),b=1K(0),c=1K(0),d=1K(1);L(u.1I()!=0){L(u.1l()){u.1j(1,u);C(ac){C(!a.1l()||!b.1l()){a.2O(o,a);b.Y(m,b)}a.1j(1,a)}J C(!b.1l())b.Y(m,b);b.1j(1,b)}L(v.1l()){v.1j(1,v);C(ac){C(!c.1l()||!d.1l()){c.2O(o,c);d.Y(m,d)}c.1j(1,c)}J C(!d.1l())d.Y(m,d);d.1j(1,d)}C(u.1d(v)>=0){u.Y(v,u);C(ac)a.Y(c,a);b.Y(d,b)}J{v.Y(u,v);C(ac)c.Y(a,c);d.Y(b,d)}}C(v.1d(G.1w)!=0)F G.1x;C(d.1d(m)>=0)F d.3l(m);C(d.1I()<0)d.2O(m,d);J F d;C(d.1I()<0)F d.3M(m);J F d}D 1k=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,a4,a3,a2,a1,a0,69,9Z,9Y,9X,9W,9V,9U,9T,9S,9R,9Q,9P,9O,9N,9M,9L,9K,9J,9I,9H,9G,9F,9E,9D,9C,9B,9A,9z,9y,9x,9w,9v,9u,9t,9s,9r,9q,9p,9o,9n,9m,9l,9k,9j,9i,9h,9g,9f,9e,9d,9c,9b,9a,99,98,96,95,94,93,92,91,90,8Z,8Y,8X,8W,8V];D 68=(1<<26)/1k[1k.T-1];E 58(t){D i,x=o.1J();C(x.t==1&&x[0]<=1k[1k.T-1]){P(i=0;i<1k.T;++i)C(x[0]==1k[i])F 1H;F 1v}C(x.1l())F 1v;i=1;L(i<1k.T){D m=1k[i],j=i+1;L(j<1k.T&&m<68)m*=1k[j++];m=x.5N(m);L(i<j)C(m%1k[i++]==0)F 1v}F x.5L(t)}E 5K(t){D 2m=o.3l(G.1w);D k=2m.2k();C(k<=0)F 1v;D r=2m.5u(k);t=(t+1)>>1;C(t>1k.T)t=1k.T;D a=Q();P(D i=0;i<t;++i){a.2n(1k[i]);D y=a.2j(r,o);C(y.1d(G.1w)!=0&&y.1d(2m)!=0){D j=1;L(j++<k&&y.1d(2m)!=0){y=y.66(2,o);C(y.1d(G.1w)==0)F 1v}C(y.1d(2m)!=0)F 1v}}F 1H}G.H.3U=65;G.H.62=60;G.H.5Z=5Y;G.H.3T=5X;G.H.1W=5W;G.H.3p=5V;G.H.2O=5U;G.H.3S=5T;G.H.2l=5S;G.H.5R=5Q;G.H.5P=5O;G.H.5N=5M;G.H.5L=5K;G.H.2N=5J;G.H.3R=5I;G.H.8U=5H;G.H.8T=5G;G.H.1I=5F;G.H.8S=5E;G.H.8R=5D;G.H.1P=5C;G.H.3Q=5B;G.H.8Q=5A;G.H.8P=5z;G.H.8O=5y;G.H.8N=5x;G.H.2c=5w;G.H.3o=5v;G.H.5u=5t;G.H.2k=5s;G.H.8M=5r;G.H.5q=5p;G.H.8L=5o;G.H.8K=5n;G.H.8J=5m;G.H.3M=5l;G.H.3l=5k;G.H.3L=5j;G.H.5i=5h;G.H.8I=5g;G.H.8H=5f;G.H.2j=5e;G.H.8G=5d;G.H.2M=5c;G.H.8F=5b;G.H.5a=58;E 4r(){D 57="8E";D N=V G(57,16);D g=V G("2");D k=V G("8D",16);D 3k=V 3P();D a=V G(32,3k);D A=g.2j(a,N);L(A.3n(N)==0){a=V G(32,3k);A=g.2j(a,N)}D 3N=A.1t(16);D S=1b;D K=1b;D M=1b;D 3h=1b;D 2i=1F.2D("8C").2C;D 56=1F.2D("8B").2C;D Z=o;D 34=1v;D I=1F.2D("8A").2C;D p=1F.2D("8z").2C;D U=1b;o.8y=E(){F I};o.8x=E(){F U};o.8w=E(){F 2i};o.8v=E(){F g};o.8u=E(){F N};o.8t=E(s){F V G(1A(s+1A(I+":"+p)),16)};o.2I=E(1R){C(56=="8s"){F 1R}};o.2G=E(55){F 55.8r.8q};E 2F(54){F(3m(1G[54])!="8p")};o.2H=E(4X,2L,4Y){C(1G.51)U=V 51();J C(1G.50){8o{U=V 50("4Z.8n")}8m(e){}}J{Z.1z("4V 2c 8l.");F}C(U){U.8k=4Y;U.8j("8i",4X,1H);U.3O("4W-4w","8h/x-8g-8f-8e");U.3O("4W-T",2L.T);U.3O("8d","8c");U.8b(2L)}J{Z.1z("4V 8a.")}};o.4x=E(){D 4U=2i+Z.2I("88/");D 2L="I="+I+"&A="+3N;Z.2H(4U,2L,4T)};E 4T(){C(U.3f==4&&U.3e==3d){C(U.1o.1i("r").T>0){D 1Q=U.1o.1i("r")[0];C(!1Q.1O("a")){3J(1Q.1O("s"),1Q.1O("B"),p);Z.2H(2i+Z.2I("4L/"),"M="+M,4N)}J 3g(1Q.1O("s"),1Q.1O("B"),1Q.1O("a"),1Q.1O("d"))}J C(U.1o.1i("2h").T>0)Z.1z(U.1o.1i("2h")[0])}};E 3J(s,2K,4R){D B=V G(2K,16);D 4S=2K;D u=V G(1A(3N+4S),16);D x=V G(1A(s+1A(I+":"+4R)),16);D 4Q=k.3L(g.2j(x,N));D 4P=a.3M(u.3L(x));S=B.3l(4Q).2j(4P,N);D 4O=A.1t(16)+B.1t(16)+S.1t(16);M=1A(4O);3h=1A(A.1t(16)+M+S.1t(16));};E 4N(){C(U.3f==4&&U.3e==3d){C(U.1o.1i("M").T>0){C(Z.2G(U.1o.1i("M")[0])==3h){34=1H;35()}J Z.1z("4B 1B 4A 2c 4z")}J C(U.1o.1i("2h").T>0)Z.1z(Z.2G(U.1o.1i("2h")[0]))}};E 3g(s,2K,3K,4M){4u();E 3H(){C(!2F("3a")||!2F("3b")){1G.4K(3H,10);F}C(3K=="87")3I=3a;J C(3K=="86")3I=3b;3J(s,2K,3I(4M+p));Z.2H(2i+Z.2I("3g/4L/"),"M="+M,4D)};1G.4K(3H,10)};E 3E(4J){D 1B=39.85(Z.1B());D 3F=39.84(4J);D 3i=V 1u(16);3k.3G(3i);D 4I=3j.82(3F,0,3F.T,3j.4H.4G);D 4F=3j.3E(4I,3j.4H.4G,1B,1B.T,3i).81;D 2J=39.80.7Z(3i.7Y(4F));L(2J.7X("+",0)>-1)2J=2J.4E("+","7W");F 2J};E 4D(){C(U.3f==4&&U.3e==3d){C(U.1o.1i("M").T>0){C(Z.2G(U.1o.1i("M")[0])==3h){K=1A(S.1t(16));D 4C=2i+Z.2I("3g/7V/");Z.2H(4C,"p="+3E(p)+"&l="+p.T,4y)}J Z.1z("4B 1B 4A 2c 4z")}J C(U.1o.1i("2h").T>0){Z.1z(Z.2G(U.1o.1i("2h")[0]))}}};E 4y(){C(U.3f==4&&U.3e==3d){K=1b;C(U.1o.1i("7U").T>0)Z.4x();J Z.1z("7T 7S 2c be 7R")}};E 2g(4v){D 3c=1F.7Q(\'3D\');3c.4w=\'7P/7O\';3c.4p=4v;1F.1i(\'7N\')[0].7M(3c)};E 4u(){C(2F("3a")&&2F("3b"))F;D 2E=Z.4q.7L("/");D 2f=2E.7K(0,2E.T-1).7J("/");C(2E[2E.T-1]=="7I.1P.2e")2g(2f+"/7H.1P.2e");J{2g(2f+"/3b.2e");2g(2f+"/3a.2e");2g(2f+"/39.2e");2g(2f+"/7G.2e")}}E 35(){D 38=1F.2D("7F").2C;C(38.2d(0)!="#")1G.4t=38;J{1G.4t=38;Z.35()}};o.35=E(){4s("7E 7D.")};o.1B=E(){C(K==1b)C(34){K=1A(S.1t(16));F K}J Z.1z("7C 7B 2c 7A 34.");J F K};o.1z=E(t){4s(t)}};4r.H.4q=1F.1i(\'3D\')[1F.1i(\'3D\').T-1].1O("4p");',62,727,'||||||||||||||||||||||||this||||||||||||||if|var|function|return|BigInteger|prototype||else||while|||DB|for|nbi|||length|xhr|new|||subTo|that|||||||||||HASH|null|r2|compareTo|Math|safe_add|rng_pptr|DM|getElementsByTagName|rShiftTo|lowprimes|isEven|DV|clamp|responseXML|ds|sh|vv|rng_pool|toString|Array|false|ONE|ZERO|reduce|error_message|SHA256|key|sqrTo|ys|255|document|window|true|signum|abs|nbv|copyTo|divRemTo|dbits|getAttribute|min|response|str|Montgomery|Classic|256|utftext|bitwiseTo|mulTo|Barrett|op|floor|mi||||||pm|||charCodeAt|rr|not|charAt|js|path|import_file|error|url|modPow|getLowestSetBit|dAddOffset|n1|fromInt|lShiftTo|revert|convert|multiplyTo|dlShiftTo|NullExp|nsh|cbs|xh|xl|string|chrsz|fromCharCode|String|value|getElementById|arr|isdefined|innerxml|ajaxRequest|paths|retstring|ephemeral|params|pow|clone|addTo|negate|k1|km|nbits|squareTo|drShiftTo|0xff|0x80|cs|0x7fff|BI_RC||||rng_state|authenticated|success|||forward_url|cryptoHelpers|SHA1|MD5|scriptElt|200|status|readyState|upgrade|M2|iv|slowAES|rng|subtract|typeof|mod|shiftLeft|changeBit|op_or|0xffff|fromString|qd|y0|pt|BI_FP|navigator|rng_psize|Arcfour|binarray|128|T1|script|encrypt|byteMessage|nextBytes|do_upgrade|hashfun|calculations|algo|multiply|add|Astr|setRequestHeader|SecureRandom|max|intValue|dMultiply|fromNumber|chunkSize|is1|g2|bitLength|q3|exp|nNop||op_xor||op_andnot|0xf|intAt|||mpl|mp|ts|F2|yt|F1|int2char|appName|j_lm|0x3fff|rng_seed_time|hex_tab|bin|T2|0xFFFF|lsw|src|srpPath|SRP|alert|location|import_hashes|fname|type|identify|confirm_verifier|match|does|Server|auth_url|confirm_upgrade|replace|ciphertext|CFB|modeOfOperation|paddedByteMessage|plaintext|setTimeout|authenticate|dsalt|confirm_authentication|Mstr|aux|kgx|pass|Bstr|receive_salts|handshake_url|Ajax|Content|full_url|callback|Microsoft|ActiveXObject|XMLHttpRequest|||variable|node|server|Nstr|bnIsProbablePrime||isProbablePrime|bnGCD|bnPow|bnModInverse|bnModPow|bnDivideAndRemainder|bnRemainder|bnDivide|divide|bnMultiply|bnSubtract|bnAdd|bnFlipBit|bnClearBit|bnSetBit|bnTestBit|testBit|bnBitCount|bnGetLowestSetBit|bnShiftRight|shiftRight|bnShiftLeft|bnNot|bnAndNot|bnXor|bnOr|bnAnd|bnMax|bnMin|bnEquals|bnToByteArray|bnSigNum|bnShortValue|bnByteValue|bnIntValue|bnClone|bnpMillerRabin|millerRabin|bnpModInt|modInt|bnpMultiplyUpperTo|multiplyUpperTo|bnpMultiplyLowerTo|multiplyLowerTo|bnpDAddOffset|bnpDMultiply|bnpAddTo|bnpChangeBit|bnpBitwiseTo|bnpFromNumber|bnpFromRadix|fromRadix|bnpToRadix||toRadix|||bnpChunkSize|modPowInt||lplim|127|barrettSqrTo|barrettMulTo|barrettReduce|barrettRevert|barrettConvert|mu|nSqrTo|nMulTo|cbit|lbit|op_and|number|continue|bnModPowInt|bnMod|bnBitLength|bnCompareTo|bnAbs|bnNegate|bnToString|bnpExp|bnpIsEven|bnpInvDigit|invDigit|bnpDivRemTo|bnpSquareTo|bnpMultiplyTo|bnpSubTo|bnpRShiftTo|bnpLShiftTo|bnpDRShiftTo|bnpDLShiftTo|bnpClamp|bnpFromString|bnpFromInt|bnpCopyTo|montSqrTo|montMulTo|montReduce|montRevert|montConvert|u0|um|mph|mt2|cSqrTo|cMulTo|cReduce|cRevert|cConvert|ms|d2|d1||FV||BI_RM|am3|am1|Netscape|am2||0x3fffffff|canary|rng_get_bytes|rng_get_byte|next|init|prng_newstate|random|crypto|rng_seed_int|ARC4next|ARC4init|str2binb|core_sha256|binb2hex|Utf8Encode|0xF|hexcase|mask|Maj|Sigma0256|Ch|Sigma1256|Gamma0256|Gamma1256|msw|been|has|User|successful|Login|srp_forward|aes|hash|srp|join|slice|split|appendChild|head|javascript|text|createElement|confirmed|could|Verifier|ok|verifier|_|indexOf|concat|encode|base64|cipher|getPaddedBlock||convertStringToByteArray|toNumbers|md5|sha1|handshake||failed|send|close|Connection|urlencoded|form|www|application|POST|open|onreadystatechange|supported|catch|XMLHTTP|try|undefined|nodeValue|firstChild|django|calcX|getN|getg|geturl|getxhr|getI|srp_password|srp_username|srp_server|srp_url|c46d46600d87fef149bd79b81119842f3c20241fda67d06ef412d8f6d9479c58|115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3|gcd|modInverse|divideAndRemainder|remainder|flipBit|clearBit|setBit|bitCount|andNot|xor|or|and|equals|toByteArray|shortValue|byteValue|509|503|499|491|487|479|467|463|461|457|449|443||439|433|431|421|419|409|401|397|389|383|379|373|367|359|353|349|347|337|331|317|313|311|307|293|283|281|277|271|269|263|257|251|241|239|233|229|227|223|211|199|197|193|191|181|179|173|167|163|157|151|149|139|137|131|113|109|107|103|101|768|144|substr|log|LN2|0xffffffff|0123456789abcdefghijklmnopqrstuvwxyz||Explorer|Internet|0xfffffff|0x3ffffff|0x4000000|0xefcafe|0xffffff|0xdeadbeefcafe|65536||appVersion|getTime|Date|0123456789abcdef|0123456789ABCDEF|224|192|2048|0x5BE0CD19|0x1F83D9AB|0x9B05688C|0x510E527F|0xA54FF53A|0x3C6EF372|0xBB67AE85|0x6A09E667|0xC67178F2|0xBEF9A3F7|0xA4506CEB|0x90BEFFFA|0x8CC70208|0x84C87814|0x78A5636F|0x748F82EE|0x682E6FF3|0x5B9CCA4F|0x4ED8AA4A|0x391C0CB3|0x34B0BCB5|0x2748774C|0x1E376C08|0x19A4C116|0x106AA070|0xF40E3585|0xD6990624|0xD192E819|0xC76C51A3|0xC24B8B70|0xA81A664B|0xA2BFE8A1|0x92722C85|0x81C2C92E|0x766A0ABB|0x650A7354|0x53380D13|0x4D2C6DFC|0x2E1B2138|0x27B70A85|0x14292967||0x6CA6351|0xD5A79147|0xC6E00BF3||0xBF597FC7|0xB00327C8|0xA831C66D|0x983E5152|0x76F988DA|0x5CB0A9DC|0x4A7484AA||0x2DE92C6F|0x240CA1CC|0xFC19DC6|0xEFBE4786|0xE49B69C1||0xC19BF174|0x9BDC06A7|0x80DEB1FE|0x72BE5D74|0x550C7DC3|0x243185BE|0x12835B01|0xD807AA98|0xAB1C5ED5|0x923F82A4|0x59F111F1|0x3956C25B|0xE9B5DBA5|0xB5C0FBCF|0x71374491|0x428A2F98'.split('|'),0,{}))
diff --git a/javascript/srp_register.min.js b/javascript/srp_register.min.js
deleted file mode 100644
index 6c5a1d5..0000000
--- a/javascript/srp_register.min.js
+++ /dev/null
@@ -1 +0,0 @@
-eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('9 g(){3 1;b.a.e=9(){1=5;3 w=5.p()+5.o("e/f/");3 c="I="+5.K();5.n(w,c,5.u)};b.a.u=9(){3 2=1.k();8(2.j==4&&2.i==h){8(2.7.6("f").d>0){3 s=1.t(2.7.6("f")[0]);3 x=1.J(s);3 v=1.H().G(x,1.F());1.q(v.E(D))}C 8(2.7.6("r").d>0){1.B(1.t(2.7.6("r")[0]))}}};b.a.q=9(v){3 c="v="+v;3 m=1.p()+1.o("e/A/");1.n(m,c,1.l)};b.a.l=9(){3 2=1.k();8(2.j==4&&2.i==h){8(2.7.6("z").d>0){1.y()}}}};g();',47,47,'|that|xhr|var||this|getElementsByTagName|responseXML|if|function|prototype|SRP|params|length|register|salt|SRP_REGISTER|200|status|readyState|getxhr|register_user|auth_url|ajaxRequest|paths|geturl|register_send_verifier|error||innerxml|register_receive_salt||handshake_url||identify|ok|user|error_message|else|16|toString|getN|modPow|getg||calcX|getI'.split('|'),0,{}))
diff --git a/javascript/spec/DjangoSpecRunner.html b/spec/DjangoSpecRunner.html
index dfa0b8c..1c5e005 100644
--- a/javascript/spec/DjangoSpecRunner.html
+++ b/spec/DjangoSpecRunner.html
@@ -14,13 +14,13 @@
<script type="text/javascript" src="lib/jasmine-sinon.js"></script>
<!-- the files we are testing... -->
- <script type="text/javascript" src="../SHA256.js"></script>
- <script type="text/javascript" src="../prng4.js"></script>
- <script type="text/javascript" src="../rng.js"></script>
- <script type="text/javascript" src="../jsbn.js"></script>
- <script type="text/javascript" src="../jsbn2.js"></script>
- <script type="text/javascript" src="../srp.js"></script>
- <script type="text/javascript" src="../srp_register.js"></script>
+ <script type="text/javascript" src="../src/SHA256.js"></script>
+ <script type="text/javascript" src="../src/prng4.js"></script>
+ <script type="text/javascript" src="../src/rng.js"></script>
+ <script type="text/javascript" src="../src/jsbn.js"></script>
+ <script type="text/javascript" src="../src/jsbn2.js"></script>
+ <script type="text/javascript" src="../src/srp.js"></script>
+ <script type="text/javascript" src="../src/srp_register.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="specHelper.js"></script>
diff --git a/javascript/spec/lib/jasmine-sinon.js b/spec/lib/jasmine-sinon.js
index 2b7a9e0..2b7a9e0 100644
--- a/javascript/spec/lib/jasmine-sinon.js
+++ b/spec/lib/jasmine-sinon.js
diff --git a/javascript/spec/lib/jasmine/MIT.LICENSE b/spec/lib/jasmine/MIT.LICENSE
index 7c435ba..7c435ba 100644
--- a/javascript/spec/lib/jasmine/MIT.LICENSE
+++ b/spec/lib/jasmine/MIT.LICENSE
diff --git a/javascript/spec/lib/jasmine/jasmine-html.js b/spec/lib/jasmine/jasmine-html.js
index a0b0639..a0b0639 100644
--- a/javascript/spec/lib/jasmine/jasmine-html.js
+++ b/spec/lib/jasmine/jasmine-html.js
diff --git a/javascript/spec/lib/jasmine/jasmine.css b/spec/lib/jasmine/jasmine.css
index 826e575..826e575 100644
--- a/javascript/spec/lib/jasmine/jasmine.css
+++ b/spec/lib/jasmine/jasmine.css
diff --git a/javascript/spec/lib/jasmine/jasmine.js b/spec/lib/jasmine/jasmine.js
index 03bf89a..03bf89a 100644
--- a/javascript/spec/lib/jasmine/jasmine.js
+++ b/spec/lib/jasmine/jasmine.js
diff --git a/javascript/spec/lib/jasmine/jasmine_favicon.png b/spec/lib/jasmine/jasmine_favicon.png
index 218f3b4..218f3b4 100644
--- a/javascript/spec/lib/jasmine/jasmine_favicon.png
+++ b/spec/lib/jasmine/jasmine_favicon.png
Binary files differ
diff --git a/javascript/spec/lib/sinon/sinon-1.3.4.js b/spec/lib/sinon/sinon-1.3.4.js
index 365781b..365781b 100644
--- a/javascript/spec/lib/sinon/sinon-1.3.4.js
+++ b/spec/lib/sinon/sinon-1.3.4.js
diff --git a/javascript/spec/login.js b/spec/login.js
index ea86584..eea6062 100644
--- a/javascript/spec/login.js
+++ b/spec/login.js
@@ -37,7 +37,6 @@ describe("Login", function() {
this.respondXML("<M>"+M2+"</M>");
expect(this.srp.success).toHaveBeenCalled();
- expect(window.location.hash).toBe("#logged_in")
});
it("works with JSON responses", function(){
@@ -49,7 +48,6 @@ describe("Login", function() {
this.respondJSON({M: M2});
expect(this.srp.success).toHaveBeenCalled();
- expect(window.location.hash).toBe("#logged_in")
});
it("rejects B = 0", function(){
diff --git a/javascript/spec/signup.js b/spec/signup.js
index b5099b8..b5099b8 100644
--- a/javascript/spec/signup.js
+++ b/spec/signup.js
diff --git a/javascript/spec/specHelper.js b/spec/specHelper.js
index 21a0cb7..21a0cb7 100644
--- a/javascript/spec/specHelper.js
+++ b/spec/specHelper.js
diff --git a/javascript/MD5.js b/src/MD5.js
index 55cb8cc..55cb8cc 100644
--- a/javascript/MD5.js
+++ b/src/MD5.js
diff --git a/javascript/SHA1.js b/src/SHA1.js
index e772cbe..e772cbe 100644
--- a/javascript/SHA1.js
+++ b/src/SHA1.js
diff --git a/javascript/SHA256.js b/src/SHA256.js
index 1a852c0..1a852c0 100644
--- a/javascript/SHA256.js
+++ b/src/SHA256.js
diff --git a/javascript/aes.js b/src/aes.js
index 5682618..5682618 100644
--- a/javascript/aes.js
+++ b/src/aes.js
diff --git a/javascript/cryptoHelpers.js b/src/cryptoHelpers.js
index a77ee42..a77ee42 100644
--- a/javascript/cryptoHelpers.js
+++ b/src/cryptoHelpers.js
diff --git a/javascript/jsbn.js b/src/jsbn.js
index f557d12..f557d12 100644
--- a/javascript/jsbn.js
+++ b/src/jsbn.js
diff --git a/javascript/jsbn2.js b/src/jsbn2.js
index b135844..b135844 100644
--- a/javascript/jsbn2.js
+++ b/src/jsbn2.js
diff --git a/javascript/prng4.js b/src/prng4.js
index ca3026d..ca3026d 100644
--- a/javascript/prng4.js
+++ b/src/prng4.js
diff --git a/javascript/rng.js b/src/rng.js
index 8d8de48..8d8de48 100644
--- a/javascript/rng.js
+++ b/src/rng.js
diff --git a/javascript/srp.js b/src/srp.js
index b04a350..6af54ea 100644
--- a/javascript/srp.js
+++ b/src/srp.js
@@ -135,12 +135,12 @@ function SRP()
function responseIsXML() {
return (xhr.responseType == 'document') ||
- (xhr.responseHeaders["Content-Type"].indexOf('application/xml') >= 0)
+ (xhr.getResponseHeader("Content-Type").indexOf('application/xml') >= 0)
}
function responseIsJSON() {
return (xhr.responseType == 'json') ||
- (xhr.responseHeaders["Content-Type"].indexOf('application/json') >= 0)
+ (xhr.getResponseHeader("Content-Type").indexOf('application/json') >= 0)
}
function parseXML(xml) {
@@ -231,7 +231,7 @@ function SRP()
if(response.M == M2)
{
authenticated = true;
- success();
+ that.success();
}
else
that.error_message("Server key does not match");
@@ -343,7 +343,10 @@ function SRP()
}
}
- function success()
+ // This function is called when authentication is successful.
+ // Developers can set this to other functions in specific implementations
+ // and change the functionality.
+ this.success = function()
{
var forward_url = document.getElementById("srp_forward").value;
if(forward_url.charAt(0) != "#")
@@ -351,13 +354,9 @@ function SRP()
else
{
window.location = forward_url;
- that.success();
+ alert("Login successful.");
}
};
- this.success = function()
- {
- alert("Login successful.");
- };
// If someone wants to use the session key for encrypting traffic, they can
// access the key with this function.
this.key = function()
@@ -374,13 +373,6 @@ function SRP()
return K;
};
- // This function is called when authentication is successful.
- // Developers can set this to other functions in specific implementations
- // and change the functionality.
- /*this.success = function()
- {
- alert("Authentication successful.");
- };*/
// If an error occurs, raise it as an alert.
// Developers can set this to an alternative function to handle erros differently.
this.error_message = function(t)
diff --git a/javascript/srp_register.js b/src/srp_register.js
index 053c4e4..3966d79 100644
--- a/javascript/srp_register.js
+++ b/src/srp_register.js
@@ -31,11 +31,11 @@ function SRP_REGISTER()
{
var params = "v="+v;
var auth_url = that.geturl() + that.paths("register/user/");
- that.ajaxRequest(auth_url, params, that.register_user);
+ that.ajaxRequest(auth_url, params, that.registered_user);
};
// The user has been registered successfully, now login
- SRP.prototype.register_user = function(response)
+ SRP.prototype.registered_user = function(response)
{
if(response.ok)
{