123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686 |
- (function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
- typeof define === 'function' && define.amd ? define(['exports'], factory) :
- (global = global || self, factory(global.sift = {}));
- }(this, (function (exports) { 'use strict';
- /*! *****************************************************************************
- Copyright (c) Microsoft Corporation.
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
- /* global Reflect, Promise */
- var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- function __extends(d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
- var typeChecker = function (type) {
- var typeString = "[object " + type + "]";
- return function (value) {
- return getClassName(value) === typeString;
- };
- };
- var getClassName = function (value) { return Object.prototype.toString.call(value); };
- var comparable = function (value) {
- if (value instanceof Date) {
- return value.getTime();
- }
- else if (isArray(value)) {
- return value.map(comparable);
- }
- else if (value && typeof value.toJSON === "function") {
- return value.toJSON();
- }
- return value;
- };
- var isArray = typeChecker("Array");
- var isObject = typeChecker("Object");
- var isFunction = typeChecker("Function");
- var isVanillaObject = function (value) {
- return (value &&
- (value.constructor === Object ||
- value.constructor === Array ||
- value.constructor.toString() === "function Object() { [native code] }" ||
- value.constructor.toString() === "function Array() { [native code] }") &&
- !value.toJSON);
- };
- var equals = function (a, b) {
- if (a == null && a == b) {
- return true;
- }
- if (a === b) {
- return true;
- }
- if (Object.prototype.toString.call(a) !== Object.prototype.toString.call(b)) {
- return false;
- }
- if (isArray(a)) {
- if (a.length !== b.length) {
- return false;
- }
- for (var i = 0, length_1 = a.length; i < length_1; i++) {
- if (!equals(a[i], b[i]))
- return false;
- }
- return true;
- }
- else if (isObject(a)) {
- if (Object.keys(a).length !== Object.keys(b).length) {
- return false;
- }
- for (var key in a) {
- if (!equals(a[key], b[key]))
- return false;
- }
- return true;
- }
- return false;
- };
- /**
- * Walks through each value given the context - used for nested operations. E.g:
- * { "person.address": { $eq: "blarg" }}
- */
- var walkKeyPathValues = function (item, keyPath, next, depth, key, owner) {
- var currentKey = keyPath[depth];
- // if array, then try matching. Might fall through for cases like:
- // { $eq: [1, 2, 3] }, [ 1, 2, 3 ].
- if (isArray(item) && isNaN(Number(currentKey))) {
- for (var i = 0, length_1 = item.length; i < length_1; i++) {
- // if FALSE is returned, then terminate walker. For operations, this simply
- // means that the search critera was met.
- if (!walkKeyPathValues(item[i], keyPath, next, depth, i, item)) {
- return false;
- }
- }
- }
- if (depth === keyPath.length || item == null) {
- return next(item, key, owner);
- }
- return walkKeyPathValues(item[currentKey], keyPath, next, depth + 1, currentKey, item);
- };
- var BaseOperation = /** @class */ (function () {
- function BaseOperation(params, owneryQuery, options) {
- this.params = params;
- this.owneryQuery = owneryQuery;
- this.options = options;
- this.init();
- }
- BaseOperation.prototype.init = function () { };
- BaseOperation.prototype.reset = function () {
- this.done = false;
- this.keep = false;
- };
- return BaseOperation;
- }());
- var NamedBaseOperation = /** @class */ (function (_super) {
- __extends(NamedBaseOperation, _super);
- function NamedBaseOperation(params, owneryQuery, options, name) {
- var _this = _super.call(this, params, owneryQuery, options) || this;
- _this.name = name;
- return _this;
- }
- return NamedBaseOperation;
- }(BaseOperation));
- var GroupOperation = /** @class */ (function (_super) {
- __extends(GroupOperation, _super);
- function GroupOperation(params, owneryQuery, options, children) {
- var _this = _super.call(this, params, owneryQuery, options) || this;
- _this.children = children;
- return _this;
- }
- /**
- */
- GroupOperation.prototype.reset = function () {
- this.keep = false;
- this.done = false;
- for (var i = 0, length_2 = this.children.length; i < length_2; i++) {
- this.children[i].reset();
- }
- };
- /**
- */
- GroupOperation.prototype.childrenNext = function (item, key, owner) {
- var done = true;
- var keep = true;
- for (var i = 0, length_3 = this.children.length; i < length_3; i++) {
- var childOperation = this.children[i];
- childOperation.next(item, key, owner);
- if (!childOperation.keep) {
- keep = false;
- }
- if (childOperation.done) {
- if (!childOperation.keep) {
- break;
- }
- }
- else {
- done = false;
- }
- }
- this.done = done;
- this.keep = keep;
- };
- return GroupOperation;
- }(BaseOperation));
- var NamedGroupOperation = /** @class */ (function (_super) {
- __extends(NamedGroupOperation, _super);
- function NamedGroupOperation(params, owneryQuery, options, children, name) {
- var _this = _super.call(this, params, owneryQuery, options, children) || this;
- _this.name = name;
- return _this;
- }
- return NamedGroupOperation;
- }(GroupOperation));
- var QueryOperation = /** @class */ (function (_super) {
- __extends(QueryOperation, _super);
- function QueryOperation() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- /**
- */
- QueryOperation.prototype.next = function (item, key, parent) {
- this.childrenNext(item, key, parent);
- };
- return QueryOperation;
- }(GroupOperation));
- var NestedOperation = /** @class */ (function (_super) {
- __extends(NestedOperation, _super);
- function NestedOperation(keyPath, params, owneryQuery, options, children) {
- var _this = _super.call(this, params, owneryQuery, options, children) || this;
- _this.keyPath = keyPath;
- /**
- */
- _this._nextNestedValue = function (value, key, owner) {
- _this.childrenNext(value, key, owner);
- return !_this.done;
- };
- return _this;
- }
- /**
- */
- NestedOperation.prototype.next = function (item, key, parent) {
- walkKeyPathValues(item, this.keyPath, this._nextNestedValue, 0, key, parent);
- };
- return NestedOperation;
- }(GroupOperation));
- var createTester = function (a, compare) {
- if (a instanceof Function) {
- return a;
- }
- if (a instanceof RegExp) {
- return function (b) {
- var result = typeof b === "string" && a.test(b);
- a.lastIndex = 0;
- return result;
- };
- }
- var comparableA = comparable(a);
- return function (b) { return compare(comparableA, comparable(b)); };
- };
- var EqualsOperation = /** @class */ (function (_super) {
- __extends(EqualsOperation, _super);
- function EqualsOperation() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- EqualsOperation.prototype.init = function () {
- this._test = createTester(this.params, this.options.compare);
- };
- EqualsOperation.prototype.next = function (item, key, parent) {
- if (!Array.isArray(parent) || parent.hasOwnProperty(key)) {
- if (this._test(item, key, parent)) {
- this.done = true;
- this.keep = true;
- }
- }
- };
- return EqualsOperation;
- }(BaseOperation));
- var createEqualsOperation = function (params, owneryQuery, options) { return new EqualsOperation(params, owneryQuery, options); };
- var NopeOperation = /** @class */ (function (_super) {
- __extends(NopeOperation, _super);
- function NopeOperation() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- NopeOperation.prototype.next = function () {
- this.done = true;
- this.keep = false;
- };
- return NopeOperation;
- }(BaseOperation));
- var numericalOperationCreator = function (createNumericalOperation) { return function (params, owneryQuery, options, name) {
- if (params == null) {
- return new NopeOperation(params, owneryQuery, options);
- }
- return createNumericalOperation(params, owneryQuery, options, name);
- }; };
- var numericalOperation = function (createTester) {
- return numericalOperationCreator(function (params, owneryQuery, options) {
- var typeofParams = typeof comparable(params);
- var test = createTester(params);
- return new EqualsOperation(function (b) {
- return typeof comparable(b) === typeofParams && test(b);
- }, owneryQuery, options);
- });
- };
- var createNamedOperation = function (name, params, parentQuery, options) {
- var operationCreator = options.operations[name];
- if (!operationCreator) {
- throw new Error("Unsupported operation: " + name);
- }
- return operationCreator(params, parentQuery, options, name);
- };
- var containsOperation = function (query) {
- for (var key in query) {
- if (key.charAt(0) === "$")
- return true;
- }
- return false;
- };
- var createNestedOperation = function (keyPath, nestedQuery, owneryQuery, options) {
- if (containsOperation(nestedQuery)) {
- var _a = createQueryOperations(nestedQuery, options), selfOperations = _a[0], nestedOperations = _a[1];
- if (nestedOperations.length) {
- throw new Error("Property queries must contain only operations, or exact objects.");
- }
- return new NestedOperation(keyPath, nestedQuery, owneryQuery, options, selfOperations);
- }
- return new NestedOperation(keyPath, nestedQuery, owneryQuery, options, [
- new EqualsOperation(nestedQuery, owneryQuery, options)
- ]);
- };
- var createQueryOperation = function (query, owneryQuery, _a) {
- if (owneryQuery === void 0) { owneryQuery = null; }
- var _b = _a === void 0 ? {} : _a, compare = _b.compare, operations = _b.operations;
- var options = {
- compare: compare || equals,
- operations: Object.assign({}, operations || {})
- };
- var _c = createQueryOperations(query, options), selfOperations = _c[0], nestedOperations = _c[1];
- var ops = [];
- if (selfOperations.length) {
- ops.push(new NestedOperation([], query, owneryQuery, options, selfOperations));
- }
- ops.push.apply(ops, nestedOperations);
- if (ops.length === 1) {
- return ops[0];
- }
- return new QueryOperation(query, owneryQuery, options, ops);
- };
- var createQueryOperations = function (query, options) {
- var selfOperations = [];
- var nestedOperations = [];
- if (!isVanillaObject(query)) {
- selfOperations.push(new EqualsOperation(query, query, options));
- return [selfOperations, nestedOperations];
- }
- for (var key in query) {
- if (key.charAt(0) === "$") {
- var op = createNamedOperation(key, query[key], query, options);
- // probably just a flag for another operation (like $options)
- if (op != null) {
- selfOperations.push(op);
- }
- }
- else {
- nestedOperations.push(createNestedOperation(key.split("."), query[key], query, options));
- }
- }
- return [selfOperations, nestedOperations];
- };
- var createOperationTester = function (operation) { return function (item, key, owner) {
- operation.reset();
- operation.next(item, key, owner);
- return operation.keep;
- }; };
- var createQueryTester = function (query, options) {
- if (options === void 0) { options = {}; }
- return createOperationTester(createQueryOperation(query, null, options));
- };
- var $Ne = /** @class */ (function (_super) {
- __extends($Ne, _super);
- function $Ne() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- $Ne.prototype.init = function () {
- this._test = createTester(this.params, this.options.compare);
- };
- $Ne.prototype.reset = function () {
- _super.prototype.reset.call(this);
- this.keep = true;
- };
- $Ne.prototype.next = function (item) {
- if (this._test(item)) {
- this.done = true;
- this.keep = false;
- }
- };
- return $Ne;
- }(NamedBaseOperation));
- // https://docs.mongodb.com/manual/reference/operator/query/elemMatch/
- var $ElemMatch = /** @class */ (function (_super) {
- __extends($ElemMatch, _super);
- function $ElemMatch() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- $ElemMatch.prototype.init = function () {
- this._queryOperation = createQueryOperation(this.params, this.owneryQuery, this.options);
- };
- $ElemMatch.prototype.reset = function () {
- _super.prototype.reset.call(this);
- this._queryOperation.reset();
- };
- $ElemMatch.prototype.next = function (item) {
- if (isArray(item)) {
- for (var i = 0, length_1 = item.length; i < length_1; i++) {
- // reset query operation since item being tested needs to pass _all_ query
- // operations for it to be a success
- this._queryOperation.reset();
- // check item
- this._queryOperation.next(item[i], i, item);
- this.keep = this.keep || this._queryOperation.keep;
- }
- this.done = true;
- }
- else {
- this.done = false;
- this.keep = false;
- }
- };
- return $ElemMatch;
- }(NamedBaseOperation));
- var $Not = /** @class */ (function (_super) {
- __extends($Not, _super);
- function $Not() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- $Not.prototype.init = function () {
- this._queryOperation = createQueryOperation(this.params, this.owneryQuery, this.options);
- };
- $Not.prototype.reset = function () {
- this._queryOperation.reset();
- };
- $Not.prototype.next = function (item, key, owner) {
- this._queryOperation.next(item, key, owner);
- this.done = this._queryOperation.done;
- this.keep = !this._queryOperation.keep;
- };
- return $Not;
- }(NamedBaseOperation));
- var $Size = /** @class */ (function (_super) {
- __extends($Size, _super);
- function $Size() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- $Size.prototype.init = function () { };
- $Size.prototype.next = function (item) {
- if (isArray(item) && item.length === this.params) {
- this.done = true;
- this.keep = true;
- }
- // if (parent && parent.length === this.params) {
- // this.done = true;
- // this.keep = true;
- // }
- };
- return $Size;
- }(NamedBaseOperation));
- var $Or = /** @class */ (function (_super) {
- __extends($Or, _super);
- function $Or() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- $Or.prototype.init = function () {
- var _this = this;
- this._ops = this.params.map(function (op) {
- return createQueryOperation(op, null, _this.options);
- });
- };
- $Or.prototype.reset = function () {
- this.done = false;
- this.keep = false;
- for (var i = 0, length_2 = this._ops.length; i < length_2; i++) {
- this._ops[i].reset();
- }
- };
- $Or.prototype.next = function (item, key, owner) {
- var done = false;
- var success = false;
- for (var i = 0, length_3 = this._ops.length; i < length_3; i++) {
- var op = this._ops[i];
- op.next(item, key, owner);
- if (op.keep) {
- done = true;
- success = op.keep;
- break;
- }
- }
- this.keep = success;
- this.done = done;
- };
- return $Or;
- }(NamedBaseOperation));
- var $Nor = /** @class */ (function (_super) {
- __extends($Nor, _super);
- function $Nor() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- $Nor.prototype.next = function (item, key, owner) {
- _super.prototype.next.call(this, item, key, owner);
- this.keep = !this.keep;
- };
- return $Nor;
- }($Or));
- var $In = /** @class */ (function (_super) {
- __extends($In, _super);
- function $In() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- $In.prototype.init = function () {
- var _this = this;
- this._testers = this.params.map(function (value) {
- if (containsOperation(value)) {
- throw new Error("cannot nest $ under " + _this.constructor.name.toLowerCase());
- }
- return createTester(value, _this.options.compare);
- });
- };
- $In.prototype.next = function (item, key, owner) {
- var done = false;
- var success = false;
- for (var i = 0, length_4 = this._testers.length; i < length_4; i++) {
- var test = this._testers[i];
- if (test(item)) {
- done = true;
- success = true;
- break;
- }
- }
- this.keep = success;
- this.done = done;
- };
- return $In;
- }(NamedBaseOperation));
- var $Nin = /** @class */ (function (_super) {
- __extends($Nin, _super);
- function $Nin() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- $Nin.prototype.next = function (item, key, owner) {
- _super.prototype.next.call(this, item, key, owner);
- this.keep = !this.keep;
- };
- return $Nin;
- }($In));
- var $Exists = /** @class */ (function (_super) {
- __extends($Exists, _super);
- function $Exists() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- $Exists.prototype.next = function (item, key, owner) {
- if (owner.hasOwnProperty(key) === this.params) {
- this.done = true;
- this.keep = true;
- }
- };
- return $Exists;
- }(NamedBaseOperation));
- var $And = /** @class */ (function (_super) {
- __extends($And, _super);
- function $And(params, owneryQuery, options, name) {
- return _super.call(this, params, owneryQuery, options, params.map(function (query) { return createQueryOperation(query, owneryQuery, options); }), name) || this;
- }
- $And.prototype.next = function (item, key, owner) {
- this.childrenNext(item, key, owner);
- };
- return $And;
- }(NamedGroupOperation));
- var $eq = function (params, owneryQuery, options) {
- return new EqualsOperation(params, owneryQuery, options);
- };
- var $ne = function (params, owneryQuery, options, name) { return new $Ne(params, owneryQuery, options, name); };
- var $or = function (params, owneryQuery, options, name) { return new $Or(params, owneryQuery, options, name); };
- var $nor = function (params, owneryQuery, options, name) { return new $Nor(params, owneryQuery, options, name); };
- var $elemMatch = function (params, owneryQuery, options, name) { return new $ElemMatch(params, owneryQuery, options, name); };
- var $nin = function (params, owneryQuery, options, name) { return new $Nin(params, owneryQuery, options, name); };
- var $in = function (params, owneryQuery, options, name) { return new $In(params, owneryQuery, options, name); };
- var $lt = numericalOperation(function (params) { return function (b) { return b < params; }; });
- var $lte = numericalOperation(function (params) { return function (b) { return b <= params; }; });
- var $gt = numericalOperation(function (params) { return function (b) { return b > params; }; });
- var $gte = numericalOperation(function (params) { return function (b) { return b >= params; }; });
- var $mod = function (_a, owneryQuery, options) {
- var mod = _a[0], equalsValue = _a[1];
- return new EqualsOperation(function (b) { return comparable(b) % mod === equalsValue; }, owneryQuery, options);
- };
- var $exists = function (params, owneryQuery, options, name) { return new $Exists(params, owneryQuery, options, name); };
- var $regex = function (pattern, owneryQuery, options) {
- return new EqualsOperation(new RegExp(pattern, owneryQuery.$options), owneryQuery, options);
- };
- var $not = function (params, owneryQuery, options, name) { return new $Not(params, owneryQuery, options, name); };
- var typeAliases = {
- number: function (v) { return typeof v === "number"; },
- string: function (v) { return typeof v === "string"; },
- bool: function (v) { return typeof v === "boolean"; },
- array: function (v) { return Array.isArray(v); },
- null: function (v) { return v === null; },
- timestamp: function (v) { return v instanceof Date; }
- };
- var $type = function (clazz, owneryQuery, options) {
- return new EqualsOperation(function (b) {
- if (typeof clazz === "string") {
- if (!typeAliases[clazz]) {
- throw new Error("Type alias does not exist");
- }
- return typeAliases[clazz](b);
- }
- return b != null ? b instanceof clazz || b.constructor === clazz : false;
- }, owneryQuery, options);
- };
- var $and = function (params, ownerQuery, options, name) { return new $And(params, ownerQuery, options, name); };
- var $all = $and;
- var $size = function (params, ownerQuery, options) { return new $Size(params, ownerQuery, options, "$size"); };
- var $options = function () { return null; };
- var $where = function (params, ownerQuery, options) {
- var test;
- if (isFunction(params)) {
- test = params;
- }
- else {
- throw new Error("In CSP mode, sift does not support strings in \"$where\" condition");
- }
- return new EqualsOperation(function (b) { return test.bind(b)(b); }, ownerQuery, options);
- };
- var defaultOperations = /*#__PURE__*/Object.freeze({
- __proto__: null,
- $Size: $Size,
- $eq: $eq,
- $ne: $ne,
- $or: $or,
- $nor: $nor,
- $elemMatch: $elemMatch,
- $nin: $nin,
- $in: $in,
- $lt: $lt,
- $lte: $lte,
- $gt: $gt,
- $gte: $gte,
- $mod: $mod,
- $exists: $exists,
- $regex: $regex,
- $not: $not,
- $type: $type,
- $and: $and,
- $all: $all,
- $size: $size,
- $options: $options,
- $where: $where
- });
- var createDefaultQueryOperation = function (query, ownerQuery, _a) {
- var _b = _a === void 0 ? {} : _a, compare = _b.compare, operations = _b.operations;
- return createQueryOperation(query, ownerQuery, {
- compare: compare,
- operations: Object.assign({}, defaultOperations, operations || {})
- });
- };
- var createDefaultQueryTester = function (query, options) {
- if (options === void 0) { options = {}; }
- var op = createDefaultQueryOperation(query, null, options);
- return createOperationTester(op);
- };
- exports.$Size = $Size;
- exports.$all = $all;
- exports.$and = $and;
- exports.$elemMatch = $elemMatch;
- exports.$eq = $eq;
- exports.$exists = $exists;
- exports.$gt = $gt;
- exports.$gte = $gte;
- exports.$in = $in;
- exports.$lt = $lt;
- exports.$lte = $lte;
- exports.$mod = $mod;
- exports.$ne = $ne;
- exports.$nin = $nin;
- exports.$nor = $nor;
- exports.$not = $not;
- exports.$options = $options;
- exports.$or = $or;
- exports.$regex = $regex;
- exports.$size = $size;
- exports.$type = $type;
- exports.$where = $where;
- exports.EqualsOperation = EqualsOperation;
- exports.createDefaultQueryOperation = createDefaultQueryOperation;
- exports.createEqualsOperation = createEqualsOperation;
- exports.createOperationTester = createOperationTester;
- exports.createQueryOperation = createQueryOperation;
- exports.createQueryTester = createQueryTester;
- exports.default = createDefaultQueryTester;
- Object.defineProperty(exports, '__esModule', { value: true });
- })));
- //# sourceMappingURL=sift.csp.min.js.map
|